dom = (document.getElementById) ? (true) : (false);
ie = (document.all) ? (true) : (false);
ie4 = ie && !dom;
nn4 = (document.layers) ? (true) : (false);
nn6 = (navigator.userAgent.indexOf("Gecko") != -1);

visible = (nn4) ? ('show') : ('visible');
hidden = (nn4) ? ('hide') : ('hidden');

var MENU_STYLE_DROP_RIGHT = 1;
var MENU_STYLE_DROP_LEFT = 2;
var MENU_STYLE_DROP_DOWN = 3;

Menu.prototype.addItem = m_addItem;
Menu.prototype.restoreItem = m_restoreItem;
Menu.prototype.mouseOver = m_mouseOver;
Menu.prototype.mouseOut = m_mouseOut;
Menu.prototype.hideNow = m_hideNow;
Menu.prototype.hideAll = m_hideAll;
Menu.prototype.menuLeft = m_menuLeft;
Menu.prototype.menuTop = m_menuTop;
Menu.prototype.hideElements = m_hideElements;
Menu.prototype.showElements = m_showElements;

function Menu(name) {
	this.name = name;
	this.container_id = new Array();
	this.items = new Array();
	this.elements = new Array();
	this.count = -1;
	this.timer = 0;
}

function getElementById(id)
{
	var element;
	if (!id) return;
	if (dom) element = document.getElementById(id);
	else if (ie4) element = document.all[id];
	else if (nn4) element = document.layers[id];

	return element;
}

function getElementByIdFromParent(id, parent)
{
	var element = null;

	if (parent) {
	    for (var i = 0; i < parent.childNodes.length; i++) {
	        var child = parent.childNodes.item(i);

	        if (child.id) {
	            if (child.id == id) {
	                element = child;
	                break;
	            }
	        }

	        child = getElementByIdFromParent(id, child);

            if (child) {
	            if (child.id) {
	                if (child.id == id) {
	                    element = child;
	                    break;
	                }
	            }
	    	}
		}
	}

	return element;
}

function m_addItem(id, containerId, className, iconId, iconSrc, imageId, imageSrc, backgroundId, backgroundSrc)
{
	this.items[this.items.length] = new Array(id, containerId, className, iconId, iconSrc, imageId, imageSrc, backgroundId, backgroundSrc);
}

function m_restoreItem(i)
{
	var element = getElementById(this.items[i][0]);
	element.className = this.items[i][2];

    if (this.items[i][4] != '') {
	    var icon = getElementById(this.items[i][3]);
	    if (icon) {
		    icon.src = this.items[i][4];
		}
	}
    if (this.items[i][6] != '') {
	    var image = getElementById(this.items[i][5]);
	    if (image) {
		    image.src = this.items[i][6];
		}
	}
    if (this.items[i][8] != '') {
	    var background = getElementById(this.items[i][7]);
	    if (background) {
		    background.style.backgroundImage = 'url(' + this.items[i][8] + ')';
		}
	}
}

function m_mouseOver(id, a, containerId, offset_x, offset_y, style)
{
	if (!style) {
		// Set default style.
		style = MENU_STYLE_DROP_RIGHT;
	}

	if (this.timer) {
		clearTimeout(this.timer);
		this.timer = 0;
	}

	// Close containers till current or till container to open.
	while (this.count > -1) {
		if ((this.container_id[this.count] == id) || (this.container_id[this.count] == containerId)) {
			break;
		}
		this.hideNow(this.container_id[this.count]);
		this.count--;
	}

	// Restore class names and images for all items in same container.
	for (var i = 0; i < this.items.length; i++) {
		if (this.items[i][1] == id || this.items[i][1] == containerId) {
			this.restoreItem(i);
		}
	}

   	// Show SELECTs.
	this.showElements("SELECT");

	// Open new popup.
	var open = getElementById(id);
	if (!open) return;
	if (!nn4) open = open.style;

	if (a) {
		if (containerId == "") {
	        open.left = this.menuLeft(id, a) + offset_x + "px";
	        open.top = this.menuTop(id, a) + offset_y + "px";
	    }
	    else {
	    	var container = getElementById(containerId);
	        if (container) {
	            var left = this.menuLeft(id, a);
	            var top = this.menuTop(id, a);

                if ((style & MENU_STYLE_DROP_RIGHT) == MENU_STYLE_DROP_RIGHT) {
                	left += container.offsetWidth;
                }
                if ((style & MENU_STYLE_DROP_LEFT) == MENU_STYLE_DROP_LEFT) {
                	left -= container.offsetWidth;
                }
                if ((style & MENU_STYLE_DROP_DOWN) == MENU_STYLE_DROP_DOWN) {
                	top += container.offsetHeight;
                }

                open.left = left + "px";
                open.top = top + "px";
	        }
	    }
	}
	open.visibility = visible;

	if (this.container_id[this.count] != id) {
		this.count++;
		this.container_id[this.count] = id;
	}

	// Hide SELECTs.
	this.hideElements("SELECT");
}

function m_mouseOut()
{
	this.timer = setTimeout(this.name + '.hideAll()', 200);
}

function m_hideNow(id)
{
	var hide = getElementById(id);
	if (!hide) return;
	if (!nn4) hide = hide.style;

	hide.visibility = hidden;
}

function m_hideAll()
{
	while (this.count > -1) {
		this.hideNow(this.container_id[this.count]);
		this.count--;
	}
	this.timer = 0;

	// Restore all class names and images.
	for (var i = 0; i < this.items.length; i++) {
		this.restoreItem(i);
	}

	// Show SELECTs.
	this.showElements("SELECT");
}

function m_menuLeft(id, a)
{
	if (nn4) return document.layers['x' + id].pageX;
	else {
		var pos = a.offsetLeft;
		while (a.offsetParent != null) {
			a = a.offsetParent;
			pos += a.offsetLeft;
			if (a.tagName == 'BODY') break;
		}
		return pos;
	}
}

function m_menuTop(id,a)
{
	if (nn4) return document.layers['x' + id].pageY;
	else {
		var pos = a.offsetTop;
		while (a.offsetParent != null) {
			a = a.offsetParent;
			pos += a.offsetTop;
			if (a.tagName == 'BODY') break;
		}
		return pos;
	}
}

function m_hideElements(tagName)
{
	if (nn6) return;
    // For all opened DIVs.
    for (var j = 0; j <= this.count; j++) {
    	var elDiv = getElementById(this.container_id[j]);

	    var divLeft = elDiv.offsetLeft;
	    var divRight = divLeft + elDiv.offsetWidth;
	    var divTop = elDiv.offsetTop;
	    var divBottom = divTop + elDiv.offsetHeight;

		// For all specified elements.
		var els = document.all.tags(tagName);
		for (var i = 0; i < els.length; i++) {
			var el = els.item(i);
			var elParent = el;

	        var left = 0;
	        var top = 0;
	        var width = elParent.offsetWidth;
	        var height = elParent.offsetHeight;
	        while (elParent) {
	            left += elParent.offsetLeft
	            top += elParent.offsetTop
	            elParent = elParent.offsetParent
	        }

	        if ((left < divRight) && (left + width > divLeft) && (top < divBottom) && (top + height > divTop)) {
	        	// Hide element.
	        	el.style.visibility = hidden;

	        	// Find and store hidden element.
	        	var found = false;
	        	var free_index = this.elements.length;
	        	for (var k = 0; k < this.elements.length; k++) {
	        		if (this.elements[k] == 0) {
	        			free_index = k;
	        		}
	        		if (this.elements[k] == el) {
	        			found = true;
	        			break;
	        		}
	        	}
	        	if (!found) {
	        		this.elements[free_index] = el;
	        	}
	        }
	    }
	}
}

function m_showElements(tagName)
{
	if (nn6) return;
	// For all hidden elements.
    for (var i = 0; i < this.elements.length; i++) {
        var el = this.elements[i];
        if (el) {
	        var elParent = el;

	        var left = 0;
	        var top = 0;
	        var width = elParent.offsetWidth;
	        var height = elParent.offsetHeight;
	        while (elParent) {
	            left += elParent.offsetLeft
	            top += elParent.offsetTop
	            elParent = elParent.offsetParent
	        }

	        var show = true;
	        // For all opened DIVs.
	        for (var j = 0; j <= this.count; j++) {
	            var elDiv = getElementById(this.container_id[j]);

	            var divLeft = elDiv.offsetLeft;
	            var divRight = divLeft + elDiv.offsetWidth;
	            var divTop = elDiv.offsetTop;
	            var divBottom = divTop + elDiv.offsetHeight;

	            if ((left < divRight) && (left + width > divLeft) && (top < divBottom) && (top + height > divTop)) {
	                show = false;
	            }
	        }
	        if (show) {
	            // Show element.
	            el.style.visibility = visible;

	            // Find and remove hidden element.
	            for (var k = 0; k < this.elements.length; k++) {
	                if (this.elements[k] == el) {
	                    this.elements[k] = 0;
	                    break;
	                }
	            }
	        }
	    }
    }
}