function llx3_Menu() {
	var This = this;
	MenuInfos = new Array();
	HoverLink = null;
	this.effect = "";

	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 = "bottom";
		var fadeInRunning = false;
		var fadeOutRunning = false;

		this.showMenu = function () {
		    HoverLink = ThisMI.link;
		    clearTimeout(cTimeout);
		    switch (ThisMI.effect) {
		        case "fade":
		            if (fadeInRunning) break;
		            fadeInRunning = true;
		            $(ThisMI.menuContainer).fadeIn(200, function () { fadeInRunning = false; });
		            break;
		        default:
		            ThisMI.menuContainer.style.display = "block";
		            break;
		    }
		    var x, y;
		    switch (ThisMI.position) {

		        case "right":
		            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":
			        if (fadeOutRunning) break;
			        fadeOutRunning = true;
			        $(ThisMI.menuContainer).fadeOut(200, function () { fadeOutRunning = false; });
			        break;
				default:
					ThisMI.menuContainer.style.display = "none";
					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;
	}
}
