//	Copyright © Coretomic, 2005

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;
	this.dom = (document.getElementById) ? (true) : (false);
	this.ie = (document.all) ? (true) : (false);
	this.ie4 = this.ie && !this.dom;
	this.nn4 = (document.layers) ? (true) : (false);
	this.nn6 = (navigator.userAgent.indexOf("Gecko") != -1);
	this.visible = 'block';	//(nn4) ? ('show') : ('visible');
	this.hidden = 'none';	//(nn4) ? ('hide') : ('hidden');
}

function getElementById(id) {
	var element;
	if (!id) return;
	if (this.dom) element = document.getElementById(id);
	else if (this.ie4) element = document.all[id];
	else if (this.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;
	var open_style;
	if (!this.nn4) open_style = open.style;

	if (a) {
		var left = this.menuLeft(id, a);
		var top = this.menuTop(id, a);
		if (containerId == "") {
			left += offset_x;
			top += offset_y;
		}
		else {
			var container = getElementById(containerId);
			if (container) {
				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_style.left = left + "px";
		open_style.top = top + "px";
	}
	open_style.display = this.visible;
	// Correct menu position.
	/*alert(left + open.offsetWidth);
	if ((left + open.offsetWidth) > document.body.offsetWidth) {
		left = (document.body.offsetWidth - open.offsetWidth);
		open_style.left = left + "px";
	}*/

	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 (!this.nn4) hide = hide.style;

	hide.display = this.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 (this.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 (this.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 (this.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.display = this.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 (this.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.display = this.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;
					}
				}
			}
		}
	}
}
