function Menus(pMenuList, pMenuClassName, pOffsetLeft, pDrop, pMenuWidth) {
	this.MenuList = $(pMenuList);
	this.MenuTree = {};
	this.MenuStack = [];
	this.MenuLock = false;
	this.MenuCloseTimeout = null;
	this.Drop = pDrop ? pDrop == 1 || pDrop == 2 ? pDrop : 1 : 1;
	this.MenuWidth = pMenuWidth;
	this.MenuClassName = pMenuClassName || "";
	this.OffsetLeft = pOffsetLeft || 0;
	this.MenuRoots = [];
	
	this.addMenu = function(pElementID, pMenuID) {
		var oElement = $(pElementID);
		oElement.MenuType = "MAIN_MENU";
		oElement.Menus = this;
		oElement.Level = 0;
		oElement.onmouseout = IMMouseOut;
		oElement.href = this.MenuTree[pMenuID].URL;
		
		oElement.onmouseover = bindFunction(function() {
			IMMouseOver(oElement, pMenuID, this.MenuTree[pMenuID], this);
		}, this);
		
		if(this.MenuTree[pMenuID].ClassName && this.MenuTree[pMenuID].ClassName != "") {
			oElement.className += " " + this.MenuTree[pMenuID].ClassName;
		}
	}
	
	function lookForMenus(pElem, pObject, pParents) {
		var oParents = pParents != undefined ? new Array(pParents) : [];
		var oTargetLength = oParents.length + 1;

		var oChildren = pElem.childNodes;
		oChildren = getChildren(pElem);
		//alert($$("*", pElem).length);
		for(var i = 0; i < oChildren.length; i++) {
			if(oChildren[i].tagName != undefined) {
				if("li" == oChildren[i].tagName.toLowerCase()) {
					var oA = $$("a", oChildren[i]);
					if(oA && oA.length > 0) {
						oA = oA[0];
						
						if(oTargetLength > oParents.length) {
							oParents.push(oA.id);
						} else {
							oParents.pop();
							oParents.push(oA.id);
						}
						
						if(oParents.length == 1) {
							pObject[oA.id] = new MenuNode(oA.id, pMenuList.id, oA.innerHTML, null, (oA.className == "external" ? oA.href : null), oA.href, oChildren[i].className);
						} else {
							var oCurrent = pObject[oParents[0]];
							for(var j = 1; j < oParents.length - 1; j++) {
								oCurrent = oCurrent.getChild(oParents[j])
							}
							oCurrent.addChild(new MenuNode(oA.id, pMenuList.id, oA.innerHTML, null, (oA.className == "external" ? oA.href : null), oA.href, oChildren[i].className));
						}
					}
				} else if("ul" == oChildren[i].tagName.toLowerCase()) {
					lookForMenus(oChildren[i], pObject, oParents)
				}
			}
		}
	}
	
	lookForMenus(this.MenuList, this.MenuTree);
	
	this.MenuList.style.display = "none";

	for(var prop in this.MenuTree) {
		var oMenuItem = $c("a");
		oMenuItem.innerHTML = this.MenuTree[prop].Name;
		oMenuItem.href = this.MenuTree[prop].URL; 
		oMenuItem.className = this.MenuClassName;
		oMenuItem.OldClassName = this.MenuClassName;
		
		this.MenuRoots.push(oMenuItem);
		
		this.MenuList.parentNode.appendChild(oMenuItem);
		this.addMenu(oMenuItem, this.MenuTree[prop].Id);
		
		oMenuItem.OldClassNameChanged = oMenuItem.className;
	}
}

function IMMouseOver(pElement, pMenuID, pRoot, pMenus, pDontClean) {
	for(var i = 0; i < pMenus.MenuRoots.length; i++) {
		pMenus.MenuRoots[i].className = pMenus.MenuRoots[i].OldClassName;
	}
	pElement.className = pElement.OldClassName ? pElement.OldClassName + " isactive" : "isactive";
	
	pMenus.MenuLock = true;
	if(!pDontClean) {
		IMCleanMenus(pElement.Level, pMenus.MenuStack);
	}
	var oDiv = document.createElement("div");
	oDiv.className = "menubox";
	if(pMenus.MenuWidth) {
		oDiv.style.width = pMenus.MenuWidth + "px";
	}
	if(pElement.className == "arrow") {
		oDiv.style.top = getY(pElement) + "px";
		oDiv.style.left = getX(pElement) + (pElement.offsetWidth) + "px";
		if(getX(pElement) + (pElement.offsetWidth * 2) > $("container").offsetLeft + $("container").offsetWidth) {
			oDiv.style.left = getX(pElement) - (pElement.offsetWidth) + "px";
		}
	} else {
		oDiv.style.top = getY(pElement) + pElement.offsetHeight + "px";
		oDiv.style.left = (getX(pElement) + (pMenus.OffsetLeft)) + "px";
		if((getX(pElement) + (pMenus.OffsetLeft)) + (pElement.offsetWidth * 2) > $("container").offsetLeft + $("container").offsetWidth) {
			oDiv.style.left = "";
			oDiv.style.right = (document.documentElement.clientWidth - getX(pElement) - pElement.offsetWidth) + "px";
		}
	}
	
	oDiv.MenuType = "SUB_MENU";
	oDiv.Menus = pMenus;
	oDiv.Level = pElement.Level + 1;
	oDiv.onmouseover = bindFunction(function() {this.MenuLock = true;}, pMenus);
	oDiv.onmouseout = IMMouseOut;
	//oDiv.onmouseout = function(e) {if(!e) e = window.event; window.setTimeout(bindFunction(IMMouseOut, this), 500, e.relatedTarget || e.toElement);}
	
	for(var prop in pRoot.Children) {
		var oA = document.createElement("a");
		oA.innerHTML = pRoot.getChild(prop).Name.toLowerCase();
		oA.MenuType = "SUB_MENU_CHILD";
		oA.Level = pElement.Level + 1;
		oA.href = pRoot.getChild(prop).URL;
		if(pRoot.getChild(prop).ExternalURL && pRoot.getChild(prop).URL.indexOf(PAGE_URL) == -1) {
			oA.target = "_blank";
		}
		if(pRoot.getChild(prop).NbChildren > 0) {
			oA.MenuID = pRoot.getChild(prop).Id;
			oA.Menus = pMenus;
			oA.Root = pRoot.getChild(prop);
			oA.className = "arrow";
			oA.onmouseover = bindFunction(function() {
				IMMouseOver(this, this.MenuID, this.Root, this.Menus);
			}, oA);
		}
		oDiv.appendChild(oA);
	}
	document.body.appendChild(oDiv);

	if(pMenus.Drop == 2) {
		oDiv.style.top = (getY(pElement) - oDiv.offsetHeight) + "px";
	}
	
	if(getY(oDiv) + oDiv.offsetHeight > document.documentElement.clientHeight) {
		oDiv.style.top = getY(oDiv) - (getY(oDiv) + oDiv.offsetHeight - document.documentElement.clientHeight) + "px";
	}
	if(getY(oDiv) < 0) {
		oDiv.style.top = "0px";
	}

	pMenus.MenuStack.push(oDiv);
}

function IMMouseOut(e) {
	if(!e) e = window.event;
	var oToElement = e.relatedTarget || e.toElement;
	var oLevel = 0;
	var oMenuType = 'NONE';
	if(oToElement && oToElement.MenuType) {
		oLevel = oToElement.Level;
		oMenuType = oToElement.MenuType;
	}
	if(oMenuType == 'NONE') {
		this.Menus.MenuLock = false;
		if(this.Menus.MenuCloseTimeout) {
			window.clearTimeout(this.Menus.MenuCloseTimeout);
		}
		this.Menus.MenuCloseTimeout = window.setTimeout(bindFunction(function() {
			if(!this.Menus.MenuLock) {
				IMCleanMenus(oLevel, this.Menus.MenuStack);
				for(var i = 0; i < this.Menus.MenuRoots.length; i++) {
					this.Menus.MenuRoots[i].className = this.Menus.MenuRoots[i].OldClassNameChanged;
				}
			}
		}, this), 400);
	} else if(oMenuType == 'MAIN_MENU' || oMenuType == 'SUB_MENU_CHILD') {
		IMCleanMenus(oLevel, this.Menus.MenuStack);
	}
}

function IMCleanMenus(poLevel, poMenuStack, pMenuRoots) {
	while(poMenuStack.length > poLevel) {
		document.body.removeChild(poMenuStack.pop());
	}
}
