MenuObj.prototype.createHeading = MenuObjCreateHeading;
MenuObj.prototype.setClass = MenuObjSetClass;
MenuObj.prototype.setStyle = MenuObjSetStyle;
MenuObj.prototype.setItemWidthToHeadingWidth = MenuObjSetItemWidthToHeadingWidth;
MenuObj.prototype.createLevelStart = MenuObjCreateLevelStart;
MenuObj.prototype.createLevelItem = MenuObjCreateLevelItem;
MenuObj.prototype.createLevelEnd = MenuObjCreateLevelEnd;
MenuObj.prototype.showAndHide = MenuObjShowAndHide;
MenuObj.prototype.hideAllObj = MenuObjHideAllObj;
MenuObj.prototype.checkOpenedLevels = MenuObjCheckOpenedLevels;
MenuObj.prototype.selectHeading = MenuObjSelectHeading;
var arrAllMenuObj = new Array();
// ---------------------------
function MenuObj(strObjName, oElmToAppendTo, bAbsolutePos, intPosX, intPosY, intLevelWidth, intLevelHeight, intBorder, intLevelsToShow, strDir, bHideOnDocumentClick){
	this.strObjName = strObjName;
	this.oElmToAppendTo = (oElmToAppendTo)? oElmToAppendTo : document.body;
	this.bAbsolutePos = bAbsolutePos;
	this.intPosX = (this.bAbsolutePos)? intPosX : 0;
	this.intPosY = (this.bAbsolutePos)? intPosY : 0;
	this.intLevelWidth = intLevelWidth;
	this.intLevelHeight = intLevelHeight;
	this.intBorderWidth = (intBorder)? intBorder : 0;
	this.intHeadingBorder = 0;	
	this.intHeadingSpace = 0;
	this.intLevelsToShow = (intLevelsToShow)? intLevelsToShow : 0;
	this.strDir = (strDir)? strDir : "down";
	this.strHeadingID = "";
	this.bSetItemWidthToHeadingWidth = false;
	this.intNoOfLevels = 0;
	this.arrLevels = new Array();
	this.arrCurrLevel = null;
	this.arrPreviousLevel = new Array();
	this.arrLevelItems = new Array();
	this.oTimer = null;
	this.intLevelHasFocus = 0;
	this.arrRefObj = new Array();
	arrAllMenuObj.push(this);
	if(bHideOnDocumentClick){
		document.onclick = function (){
    		MenuObjHideAllObj(true);                   
		}
	}	
}
// ---------------------------
function MenuObjCreateHeading(strText, intHeadingBorder, intHeadingSpace, strLink, strClassName, strClassNameHover){
	var strHeadingID = this.strObjName + "_heading";	
	this.strHeadingID = strHeadingID;
	var oHeading = document.createElement("div");
	oHeading.setAttribute("id", this.strHeadingID);	
	oHeading.setAttribute("objName", this.strObjName);
	if(strClassName){
		oHeading.setAttribute("normalClassName", strClassName);
		oHeading.setAttribute("hoverClassName", strClassNameHover);
	}
	oHeading.className = (strClassName)? strClassName : "menuHeading";
	if(this.bAbsolutePos){
		this.setStyle(oHeading, this.intPosX, this.intPosY);
	}		
	this.intHeadingBorder = (intHeadingBorder || intHeadingBorder == 0)? intHeadingBorder : this.intBorderWidth;
	this.intHeadingSpace = (intHeadingSpace)? intHeadingSpace : this.intLevelHeight;	
	var oTextNode = document.createTextNode(strText);
	if(strLink){
		var oLink = document.createElement("a");
		oLink.setAttribute("href", strLink);
		oLink.className = "headingItemLink";
		oLink.appendChild(oTextNode);
		oElmToAppendTo = oLink;		
		oHeading.appendChild(oLink);
	}
	else{
		var oSpan = document.createElement("span");
		oSpan.className = "headingItemLink";
		oSpan.appendChild(oTextNode);
		oHeading.appendChild(oSpan);
	}
	
	oHeading.onmouseover = function (oNSEvent){
		var strObjName = this.getAttribute("objName");		
		eval(strObjName + ".hideAllObj()");
		eval(strObjName + ".showAndHide(this, 0, 1)");
		eval(strObjName + ".setClass(this, true, true)");
	};
	
	oHeading.onmouseout = function (oNSEvent){
		if(oNSEvent){
			if(oNSEvent.relatedTarget){
				if(this == oNSEvent.relatedTarget || oNSEvent.relatedTarget.nodeType ==3 || String(oNSEvent.relatedTarget.nodeName).search(/a/i) != -1 || String(oNSEvent.relatedTarget.className).search(/levelContainer|levelItem/) != -1){
					return false;
				}
			}		
		}
		else if(is.ie){
			if(event.toElement){
				if(event.toElement.parentNode == this || event.toElement == this || event.toElement.className.search(/levelContainer|levelItem/) != -1){					
					return false;
				}
			}		
		}
		var strObjName = this.getAttribute("objName");
		eval(strObjName + ".intLevelHasFocus=0");
		eval(strObjName + ".checkOpenedLevels()");
		eval(strObjName + ".setClass(this, false, true)");
	};
	this.oElmToAppendTo.appendChild(oHeading);
}
// ---------------------------
function MenuObjSetClass(oElm, bHover, bHeading, intLevel, bOpenLevel){
	var strNormalClassName = (oElm.getAttribute("normalClassName"))? oElm.getAttribute("normalClassName") : false;
	var strHoverClassName = (oElm.getAttribute("hoverClassName"))? oElm.getAttribute("hoverClassName") : false;
	if(bHover){
		if(typeof this.arrRefObj[intLevel] == "object"){
			var oRefObj = this.arrRefObj[intLevel];
			var strRefObjNormalClassName = (oRefObj.getAttribute("normalClassName"))? oRefObj.getAttribute("normalClassName") : false;
			var strRefObjHoverClassName = (oRefObj.getAttribute("hoverClassName"))? oRefObj.getAttribute("hoverClassName") : false;
			var strClassName = (strRefObjNormalClassName)? strRefObjNormalClassName : (bHeading)? "menuHeading" : "levelItem";
			var strClassNameToReplace = new RegExp((strRefObjHoverClassName)? strRefObjHoverClassName : (bHeading)? "menuHeadingHover" : "levelItemHover", "i");
			oRefObj.className = String(oRefObj.className).replace(strClassNameToReplace, strClassName);
		}
		this.arrRefObj[intLevel] = oElm;
		var strClassName = (strHoverClassName)? strHoverClassName : (bHeading)? "menuHeadingHover" : "levelItemHover";
		var strClassNameToReplace = new RegExp((strNormalClassName)? strNormalClassName : (bHeading)? "menuHeading" : "levelItem", "i");
		oElm.className = String(oElm.className).replace(strClassNameToReplace, strClassName);
	}
	else{
		if(!bOpenLevel && !this.arrRefObj[intLevel] == oElm || bHeading){
			var strClassName = (strNormalClassName)? strNormalClassName : (bHeading)? "menuHeading" : "levelItem";
			var strClassNameToReplace = new RegExp((strHoverClassName)? strHoverClassName : (bHeading)? "menuHeadingHover" : "levelItemHover", "i");
			if(String(oElm.className).search(strClassNameToReplace) != -1){
				oElm.className = String(oElm.className).replace(strClassNameToReplace, strClassName);
			}
		}
	}
}
// ---------------------------
function MenuObjSetStyle(oElm, intPosX, intPosY, intWidth, intHeight, strVisibility){
	if(intPosX || intPosX == 0) oElm.style.left = intPosX + "px";
	if(intPosY || intPosY == 0) oElm.style.top = intPosY + "px";
	if(intWidth || intWidth == 0) oElm.style.width = intWidth + "px";
	if(intHeight|| intHeight == 0) oElm.style.height = intHeight + "px";
	if(strVisibility) oElm.style.visibility = strVisibility;
}
// ---------------------------
function MenuObjSetItemWidthToHeadingWidth(){
	if(is.bMac && is.ie && is.intV < 6){
		return false;
	}	
	this.bSetItemWidthToHeadingWidth = true;
   	this.intHeadingWidth = getElm(this.strHeadingID).offsetWidth;
	if(is.safari){
		window.status = this.intHeadingWidth;
		window.status = "";
	}	
}
// ---------------------------
function MenuObjCreateLevelStart(intLevel, strVisibility){
	var intItem = 1;
	if(intLevel > 1){
		var intPrevLevelXPos = 0;
		var intPrevLevelYPos = 0;
		for(var i=0; i<this.arrLevels.length; i++){
			if(this.arrLevels[i][0] == intLevel){				
				intItem = this.arrLevels[i][1] + 1;
			}
		}
	}
	var strLevelID = this.strObjName + "_" + intLevel + "_" + intItem;
	this.arrCurrLevel = [intLevel, intItem, strLevelID];
	this.arrPreviousLevel.push(this.arrCurrLevel);
	this.arrLevels.push([intLevel, intItem, strLevelID]);
	var oLevelStart = document.createElement("div");
	oLevelStart.setAttribute("id", strLevelID);	
	oLevelStart.setAttribute("objName", this.strObjName);
	var strVisibility = (strVisibility)? strVisibility : (intLevel <= this.intLevelsToShow)? "visible" : "hidden";		
	oLevelStart.className = "levelContainer";
	oLevelStart.onmouseout = function (){
		var strObjName = this.getAttribute("objName");
		eval(strObjName + ".checkOpenedLevels()");
	};
	this.oElmToAppendTo.appendChild(oLevelStart);
	if(this.bSetItemWidthToHeadingWidth && intLevel == 1){
		if(oLevelStart.offsetWidth < this.intHeadingWidth){
			oLevelStart.style.width = this.intHeadingWidth + ((is.bWin && is.ie && is.intV < 6)? (this.intBorderWidth * 2) : 0) + "px";
		}
	}
}
// ---------------------------
function MenuObjCreateLevelItem(bLevelItemToOpen, strText, strLink, strImagePath, strClassName, strClassNameHover){
	var oLevelContainer = getElm(this.arrCurrLevel[2]);
	var intLevel = this.arrCurrLevel[0];
	var intLevelItemToOpen = (bLevelItemToOpen)? 1 : false;	
	for(var i=0; i<this.arrLevelItems.length; i++){
		if(this.arrLevelItems[i][0] == intLevel && this.arrLevelItems[i][1] && intLevelItemToOpen){			
			intLevelItemToOpen = this.arrLevelItems[i][1] + 1;			
		}
	}	
	var oLevelItem = document.createElement("div");
	oLevelItem.setAttribute("objName", this.strObjName);
	oLevelItem.setAttribute("level", intLevel);
	oLevelItem.setAttribute("levelToOpen", intLevelItemToOpen);
	if(strClassName){
		oLevelItem.setAttribute("normalClassName", strClassName);
		oLevelItem.setAttribute("hoverClassName", strClassNameHover);
	}
	oLevelItem.className = (strClassName)? strClassName : "levelItem";
	var oTextNode = document.createTextNode(strText);
	if(intLevelItemToOpen){
		var oArrow;
		if(strImagePath){
			oArrow = document.createElement("img");
			oArrow.setAttribute("src", strImagePath);
			oArrow.setAttribute("alt", "");
			oArrow.setAttribute("border", 0);
			/*oArrow.setAttribute("width", 130);
			oArrow.setAttribute("height", 113);*/
		}
		else{
			oArrow = document.createElement("div");
			oArrow.innerHTML = "&raquo;";
		}
		oArrow.className = "levelItemArrow";
		oLevelItem.appendChild(oArrow);
	}
	if(strLink){
		var oLink = document.createElement("a");
		oLink.setAttribute("href", strLink);
		oLink.className = "levelItemLink";
		oLink.appendChild(oTextNode);
		oElmToAppendTo = oLink;		
		oLevelItem.appendChild(oLink);
	}
	else{
		var oSpan = document.createElement("span");
		oSpan.className = "levelItemLink";
		oSpan.appendChild(oTextNode);
		oLevelItem.appendChild(oSpan);
	}		
	if(strLink){
		oLevelItem.onclick = function (oNSEvent){
			location.href = strLink;
		}
	}		
	oLevelItem.onmouseover = function (oNSEvent){
		var oEvent = (oNSEvent)? oNSEvent : event;
		var strObjName = this.getAttribute("objName");
		var intLevel = this.getAttribute("level");
		var intLevelItemToOpen = this.getAttribute("levelToOpen");
		eval(strObjName + ".showAndHide(this, " + intLevel + ", " + intLevelItemToOpen + ", false)");
		eval(strObjName + ".setClass(this, true, false, " + intLevel + ", " + intLevelItemToOpen + ")");
	};
	oLevelItem.onmouseout = function (oNSEvent){
		if(oNSEvent){
			if(oNSEvent.relatedTarget){
				if(this == oNSEvent.relatedTarget || oNSEvent.relatedTarget.nodeType ==3 || String(oNSEvent.relatedTarget.nodeName).search(/a/i) != -1 || String(oNSEvent.relatedTarget.className).search(/levelContainer|levelItem/) != -1){
					return false;
				}
			}		
		}
		else if(is.ie){
			if(event.toElement){
				if(event.toElement.parentNode == this || event.toElement == this || event.toElement.className.search(/levelContainer|levelItem/) != -1){					
					return false;
				}
			}		
		}
		var strObjName = this.getAttribute("objName");
		eval(strObjName + ".intLevelHasFocus=0");
		eval(strObjName + ".checkOpenedLevels()");
		eval(strObjName + ".setClass(this, false, false)");		
	};	
	this.arrLevelItems.push([intLevel, intLevelItemToOpen]);
	this.intNoOfLevels = (intLevel > this.intNoOfLevels)? intLevel : this.intNoOfLevels;
	oLevelContainer.appendChild(oLevelItem);
	if(this.bSetItemWidthToHeadingWidth && intLevel == 1){
		if(oLevelItem.offsetWidth < this.intHeadingWidth){
			if(oArrow){
				oArrow.className = "levelItemAdaptedArrow";
			}	
			oLevelItem.style.width = this.intHeadingWidth + ((is.bWin && is.ie && is.intV < 6)? (this.intBorderWidth * 2) : 0) + "px";
		}
	}
}
// ---------------------------
function MenuObjCreateLevelEnd(){
	this.arrPreviousLevel.pop();
	this.arrCurrLevel = this.arrPreviousLevel.top();
}
// ---------------------------
function MenuObjShowAndHide(oEventTarget, intLevel, intItem, bTroughTimeout, intLevelItem){
	var intLevel = (bTroughTimeout && (this.intLevelHasFocus > intLevel))? this.intLevelHasFocus : intLevel;
	this.intLevelHasFocus = intLevel;	
	if(this.intLevelHasFocus == 0){
		oHeading = getElm(this.strHeadingID);
		var strClassName = (oHeading.getAttribute("normalClassName"))? oHeading.getAttribute("normalClassName") : "menuHeading";
		var strClassNameToReplace = new RegExp((oHeading.getAttribute("hoverClassName"))? oHeading.getAttribute("hoverClassName") : "menuHeadingHover", "i");
		oHeading.className = String(oHeading.className).replace(strClassNameToReplace, strClassName);
	}
	for(var i=0; i<this.arrLevels.length; i++){		
		var oCurrentLevel = this.arrLevels[i][0];
		var bResetColor = ((bTroughTimeout && this.intLevelHasFocus <= this.intLevelsToShow) || (oCurrentLevel > intLevel))? true : false;
		if(oCurrentLevel > intLevel){
			if(is.ie5 && is.bMac){
				getCSSObj(this.arrLevels[i][2]).display = "none";
			}
			getCSSObj(this.arrLevels[i][2]).visibility = "hidden";
		}
		if(bResetColor){
			if(typeof this.arrRefObj[this.arrLevels[i][0]] == "object"){
				var oRefObj = this.arrRefObj[this.arrLevels[i][0]];
				var strClassName = (oRefObj.getAttribute("normalClassName"))? oRefObj.getAttribute("normalClassName") : "levelItem";
				var strClassNameToReplace = new RegExp((oRefObj.getAttribute("hoverClassName"))? oRefObj.getAttribute("hoverClassName") : "levelItemHover", "i");
				oRefObj.className = String(oRefObj.className).replace(strClassNameToReplace, strClassName);
				oRefObj = null;
			}
		}
	}
	if(intItem){
		var strLevelID;
		var oParentNode;
		var intPosX;
		var intPosY;
		var bIESubtract;
		var intAddPos;
		var oLevelContainer;
		var intTotalLevelsWidth = 0;
		for(var j=0; j<this.arrLevels.length; j++){			
			var oCurrentLevel = this.arrLevels[j][0];
			if(oCurrentLevel == (intLevel +1) && this.arrLevels[j][1] == intItem){				
				this.intLevelHasFocus = (intLevel +1);
				strLevelID = this.arrLevels[j][2];
				oParentNode = oEventTarget.parentNode;
				if(intLevel == 0){
					switch(this.strDir){
						case "left":
							intPosX = oEventTarget.offsetLeft - (this.intLevelWidth + this.intHeadingBorder);
							intPosY = oEventTarget.offsetTop;
							break;
						case "up":
							intPosX = oEventTarget.offsetLeft;
							intPosY = oEventTarget.offsetTop + this.intHeadingBorder - getElm(strLevelID).offsetHeight;
							break;
						case "right":
							intPosX = oEventTarget.offsetLeft + this.intLevelWidth + this.intHeadingBorder;
							intPosY = oEventTarget.offsetTop;
							break;
						default:
							intPosX = oEventTarget.offsetLeft;							
							intPosY = oEventTarget.offsetTop + this.intHeadingSpace + this.intHeadingBorder;
							//alert(intPosX + "\n" + intPosY);
							break;
					}
				}
				else{
					if(this.strDir == "left"){
						intPosX = parseInt(oParentNode.style.left, 10) - (this.intLevelWidth + (this.intBorderWidth * 2));
						intPosY = parseInt(oParentNode.style.top, 10) + oEventTarget.offsetTop;
					}
					else{
						//intPosX = parseInt(oParentNode.style.left, 10) + this.intLevelWidth;
						intAddPos = (this.bSetItemWidthToHeadingWidth && intLevel == 1 && this.intHeadingWidth > this.intLevelWidth)? this.intHeadingWidth : this.intLevelWidth;						
						intPosX = parseInt(oParentNode.style.left, 10) + intAddPos;
						intPosY = parseInt(oParentNode.style.top, 10) + oEventTarget.offsetTop;						
						intTotalLevelsWidth = ((this.intHeadingWidth > this.intLevelWidth)? this.intHeadingWidth : this.intLevelWidth) + ((this.intNoOfLevels - 1) * this.intLevelWidth);							
						if((getElm(this.strHeadingID).offsetLeft + intTotalLevelsWidth) > document.body.offsetWidth){								
							intPosX = parseInt(oParentNode.style.left, 10) - (this.intLevelWidth + (this.intBorderWidth * 2));
							intPosX = (intPosX > 0)? intPosX : intPosX = parseInt(oParentNode.style.left, 10) + intAddPos;
						}
					}	
				}					

				if(is.ie && is.bMac && is.intV <= 6 && intLevel == 0){
					intPosX -= this.intBorderWidth;
					intPosY -= this.intHeadingBorder;
				}
				if(is.safari && intLevel > 0){
					intPosY -= this.intBorderWidth;
				}
				oLevelContainer = getCSSObj(strLevelID);				
				oLevelContainer.left = intPosX + ((intLevel == 0)? 0 : this.intBorderWidth) + "px";
				oLevelContainer.top = intPosY + "px";
				if(is.ie5 && is.bMac){
					oLevelContainer.display = "block";
				}
				oLevelContainer.visibility = "visible";
			}
		}
	}
}
// ---------------------------
function MenuObjHideAllObj(bHideAllMenuObj){
	for(var i=0; i<arrAllMenuObj.length; i++){
		if(bHideAllMenuObj || arrAllMenuObj[i] != this){
			arrAllMenuObj[i].setClass(getElm(arrAllMenuObj[i].strHeadingID), false, true);
			arrAllMenuObj[i].showAndHide(arrAllMenuObj[i].intLevelsToShow, null);
		}
	}
}
// ---------------------------
function MenuObjCheckOpenedLevels(){
	clearTimeout(this.oTimer);
	this.oTimer = setTimeout(this.strObjName + ".showAndHide(null, " + this.intLevelsToShow + ", null, true)", 1000);
}
// ---------------------------
function MenuObjSelectHeading(strClassName, strClassNameHover){
	var oHeading = getElm(this.strHeadingID);
	oHeading.setAttribute("isSelected", "true");
	oHeading.setAttribute("normalClassName", ((strClassName)? strClassName : "menuHeadingSelected"));
	oHeading.setAttribute("hoverClassName", ((strClassName)? strClassName : "menuHeadingSelected"));
	oHeading.className = ((strClassName)? strClassName : "menuHeadingSelected");
}
// ---------------------------