function llxMenu() {
	var This = this;
	MenuInfos = new Array();
	HoverLink = null;
	this.effect = "";


	this.showMenu = function (link, menuElement, position, effect,dropshadow) {
	    This.addMenu(link, menuElement, position, effect, dropshadow).showMenu();
	}

	this.addMenu = function (link, menuElement, position, effect, dropshadow) {
	    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";
	    if (dropshadow) { addShadow(mi); }
	    return mi;
	}

	function addShadow(menuInfo) {
	    var o = menuInfo.menuContainer;
	    if ((GetIeVersion() < 9) && (GetIeVersion() > 0)) {
	        var ds = o.cloneNode(); //document.createElement("div");
	        ds.style.position = "absolute";
	        ds.style.background = 'gray';
	        ds.style.filter = "progid:DXImageTransform.Microsoft.Blur(PixelRadius='6', MakeShadow='true', ShadowOpacity='0.30');";
	        o.appendChild(ds);
	        menuInfo.shadow = ds;
	    } else {
	        o.style.boxShadow = '0px 3px 10px rgba(0,0,0,.3)';
	    }



	}

	this.setShadowPosition = function (menu, shadow) {
	    if (shadow == null) return;
	    shadow.style.display = "block";
	    shadow.style.minWidth = "";
	    shadow.style.minHeight = "";
	    shadow.style.width = menu.offsetWidth-1 + 'px'
	    shadow.style.height = menu.offsetHeight-1 + 'px';
	    shadow.style.top = '-4px';
	    shadow.style.left = '-6px';
	    shadow.style.zIndex =-1
	}

	function GetIeVersion() {
	    if (document.documentMode) return document.documentMode;
	    var i0 = window.navigator.appVersion.indexOf('MSIE');
	    if (i0 < 0) return 0;
	    var i1 = window.navigator.appVersion.indexOf(';', i0);
	    return window.navigator.appVersion.substring(i0 + 4, i1) * 1;
	}

	function MenuInfo() {
		var ThisMI = this;
		this.link = null;
		this.menuContainer = null;
		this.shadow = 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);
		    ThisMI.menuContainer.style.zIndex = 10000;
		    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 "rightTop":
		            y = ThisMI.link.offsetTop;
		            x = ThisMI.link.offsetWidth;
		            break;
		        case "bottomCenter":
		            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);
		            break;
		        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;
		        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.setShadowPosition(ThisMI.menuContainer, ThisMI.shadow);
		}
		this.showMenu2 = function () {
			clearTimeout(cTimeout);
		}
		this.hideMenu = function () {
			clearTimeout(cTimeout);
			cTimeout = setTimeout(execHideMenu, 500);
		}
		this.hideMenuNow = function () {
			execHideMenu();
		}
		function execHideMenu() {
			ThisMI.menuContainer.style.zIndex = 9999;
			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;
	}
}
