function llx3_Menu() {
	var This = this;
	MenuInfos = new Array();
	HoverLink = null;
	this.effect = "";
	this.autoHideSelector = "";

	this.showMenu = function (link, menuElement, position, effect) {
		This.addMenu(link, menuElement, position, effect).showMenu();
	}

	this.addMenu = function (link, menuElement, position, effect) {
		for (var i = 0; i < MenuInfos.length; i++) { if ((MenuInfos[i].link == link) && (MenuInfos[i].menuContainer == menuElement)) return MenuInfos[i]; }
		var m = GetMenu(link);
		if (m != null) return m;
		var mi = new MenuInfo();
		mi.link = link;
		mi.effect = effect;
		mi.menuContainer = menuElement;
		mi.position = position;
		MenuInfos.push(mi);
		link.onmouseout = mi.hideMenu;
		menuElement.onmouseout = mi.hideMenu;
		menuElement.onmouseover = mi.showMenu2;
		menuElement.style.position = "absolute";
		return mi;
	}




	function MenuInfo() {
		var ThisMI = this;
		this.link = null;
		this.menuContainer = null;
		this.isOpen = false;
		this.effect = "";
		var cTimeout = 0;
		this.position = "bottomCenter";
		var effectIntv = 0;
		var effectCount = 0;

		this.showMenu = function () {
			if (This.autoHideSelector != "") {$(This.autoHideSelector).css('visibility', 'hidden');}
			HoverLink = ThisMI.link;
			clearTimeout(cTimeout);
			switch (ThisMI.effect) {
				case "fade":
					$(ThisMI.menuContainer).fadeIn(200);
					break;
				default:
					ThisMI.menuContainer.style.display = "block";
					break;
			}
			var x, y;
			switch (ThisMI.position) {
				case "bottomLeft":
					y = ThisMI.link.offsetHeight + ThisMI.link.offsetTop;
					x = 0;
					if (getPosX(ThisMI.link) + ThisMI.menuContainer.offsetWidth > document.documentElement.offsetWidth) x = (ThisMI.link.offsetWidth - ThisMI.menuContainer.offsetWidth);
					break;
				case "rightTop":
					y = ThisMI.link.offsetTop;
					x = ThisMI.link.offsetWidth;
					break;
				default:
					y = ThisMI.link.offsetHeight + ThisMI.link.offsetTop;
					x = (ThisMI.link.offsetWidth / 2 - ThisMI.menuContainer.offsetWidth / 2);
					if (getPosX(ThisMI.link) + ThisMI.menuContainer.offsetWidth > document.documentElement.offsetWidth) x = (ThisMI.link.offsetWidth - ThisMI.menuContainer.offsetWidth);
			}
			ThisMI.menuContainer.style.top = y + "px";
			ThisMI.menuContainer.style.left = x + "px";

			for (var i = 0; i < MenuInfos.length; i++) {
				if ((MenuInfos[i] != ThisMI) && (IsLinkChild(MenuInfos[i].menuContainer, this.link) == false)) { MenuInfos[i].hideMenuNow(); }
			}

		}
		this.showMenu2 = function () {
			clearTimeout(cTimeout);
		}
		this.hideMenu = function () {
			clearTimeout(cTimeout);
			cTimeout = setTimeout(execHideMenu, 500);
		}
		this.hideMenuNow = function () {
			execHideMenu();
		}
		function execHideMenu() {
			switch (ThisMI.effect) {
				case "fade":
					$(ThisMI.menuContainer).fadeOut(200, function () { if (This.autoHideSelector != "") { $(This.autoHideSelector).css('visibility', 'visible'); } });
					break;
				default:
					ThisMI.menuContainer.style.display = "none";
					if (This.autoHideSelector != "") { $(This.autoHideSelector).css('visibility', 'visible'); }
					break;
			}
		}
	}

	function GetMenu(link) {
		for (var i = 0; i < MenuInfos.length; i++) { if (MenuInfos[i].link == link) return MenuInfos[i]; }
		return null;
	}


	function IsLinkChild(parent, child) {
		var children = parent.getElementsByTagName("A");
		for (var i = 0; i < children.length; i++) { if (children[i] == child) return true; }
		return false;
	}

	function getPosX(elm) {
		var x = 0;
		while (elm) {
			x += elm.offsetLeft;
			elm = elm.offsetParent;
		}
		return x;
	}
	function getPosY(elm) {
		var y = 0;
		while (elm) {
			y += elm.offsetTop;
			elm = elm.offsetParent;
		}
		return y;
	}
}
