	/*
		Copyright ROTATOR.dk Aps 2006
		
		(DK)
		Alle rettigheder forbeholdes.
		Må ikke kopieres uden forfatterens udtrykkelige samtykke.
		
		(Int)
		All rights reserved.
		Do not copy without the author's written consent.		
	*/
	
	var EXPAND_SUB_WIDTH = true;
	var HOVER_TD = true;
	var MENU_CONTAINER = "MainMenu";
	var MENU_SHADOW_WIDTH = 3;
	var MENU_SHADOW_OPACITY = .4;	
	
	var reClassMatcher = /(^([^ ]*)( [^ ]*)*?)( [^ ]*_hover)?$/gi;
	function patchMenu_Main(iVertexID, bDirectly)
	{
		
		for( var i = 0; i < 10; i++ )
		{
			var oItem = document.getElementById("item_" + iVertexID + "l" + i);
			if( oItem )
			{
				oItem.className += " selected";
				var oMenu = getMenuFromItem(oItem);
				if( oMenu ) {
					patchMenu_Main(1*oMenu.id.substring(5), false);	
				}
				break;
			}		
		}
	}
	
	function getMenuFromItem(oItem)
	{
		var o = oItem;
		while( o ) {			
			if( o.id ) {
				if( o.id.indexOf("menu_") == 0 ) {				 
					return o;
				} else if( o.id == MENU_CONTAINER )
					return null;
			}			
			o = o.parentNode;				
		}
		return null;
	}
	
	function getMenuItemInfo(oEvent) { 
		var o = oEvent.target ? oEvent.target : oEvent.srcElement;
		var oMenuInfo = null; 		
		while( o ) {			
			if( o.id ) {
				if( oMenuInfo == null && o.id.indexOf("item_") == 0 ) {
					var c = o.id.substring(5).split("l"); 					
					oMenuInfo =  {itemID: o.id, menuID: "menu_" + c[0], id: c[0], level: 1*c[1] };					
				} else if( o.id == MENU_CONTAINER ) {
					if( oMenuInfo ) 
						oMenuInfo.horizontal = o.getAttribute("horizontal") == "true";					
					return oMenuInfo;
				}
			}			
			o = o.parentNode;				
		}			
		return null;		
	}
	
	var oMenuStack = [], oItemStack = [];
	function showMenu(oMenuInfo)
	{
		hideMenus(oMenuInfo.level);
		
		var oItem = document.getElementById(oMenuInfo.itemID);						
		var oMenu = document.getElementById(oMenuInfo.menuID);				
		
		if( oMenu ) {				
			oMenu.style.display = "block";
			
			if( oMenuInfo.level == 0 && EXPAND_SUB_WIDTH && oMenu.offsetWidth < oItem.offsetWidth )
				oMenu.style.width = oItem.offsetWidth + "px";
			
			if( !oMenu.style.width ) {
				oMenu.style.width = oMenu.offsetWidth + "px";	
			}
			
			var iTop = findPosY(oItem) - findPosY(document.getElementById(MENU_CONTAINER));
			var iLeft = findPosX(oItem) - findPosX(document.getElementById(MENU_CONTAINER));
			
			oMenuInfo.level == 0 && !oMenuInfo.horizontal ?
				iTop += oItem.offsetHeight : iLeft += oItem.offsetWidth;
			
			oMenu.style.top = iTop + "px";
			oMenu.style.left = iLeft + "px";
						 
			toggleShadow(oMenu, true);
		}
		oMenuStack.push(oMenuInfo);
	}	
	
	function toggleShadow(oMenu, bShow) {
		for( var i = 0; i < MENU_SHADOW_WIDTH; i++ ) {
			var sID = oMenu.id + "__shadow" + i;
			var oShadow = document.getElementById(sID);
			if( bShow ) {
				if( !oShadow ) {
					oShadow = document.createElement("DIV");
					oShadow.id = sID;
					oShadow.style.position = "absolute";
					oShadow.style.backgroundColor = "black";
					oShadow.style.margin = getStyle(oMenu, "margin");
					var fOpacity = MENU_SHADOW_OPACITY / MENU_SHADOW_WIDTH;
					if( document.all ) {
						oShadow.style.filter = "alpha(opacity=" + (100*fOpacity) + ")";
					} else {
						oShadow.style.opacity = fOpacity;						
					}																				
					oMenu.parentNode.insertBefore(oShadow, oMenu);
				}
				oShadow.style.display = "block";			
				oShadow.style.top = (parseInt(oMenu.style.top) + i + 1) + "px";
				oShadow.style.left = (parseInt(oMenu.style.left) + i + 1) + "px";
				oShadow.style.width = oMenu.offsetWidth + "px";
				oShadow.style.height = oMenu.offsetHeight + "px";
			} else if( oShadow ) {
				oShadow.style.display = "none";
			}
		}
	}
	
	var toHideMenu = null, toShowMenu = null;
	function hideMenus(iLevel)
	{
		while( oMenuStack.length > iLevel ) {
			var oMenuInfo = oMenuStack.pop();			
			var oMenu = document.getElementById(oMenuInfo.menuID);			
			if( oMenu ) {
				oMenu.style.display = "none";
				toggleShadow(oMenu, false);
			}
		}
	}
	
	function hiliteMenu(oMenuInfo, bNoRecursion) {
					
		if( !bNoRecursion ) {
			loliteMenus(0);

			for( var i = 0; i < oMenuInfo.level; i++ )  {						
				hiliteMenu(oMenuStack[i], true);					
			}
		}
		
		var oItem = document.getElementById(oMenuInfo.itemID);
		if( oItem && HOVER_TD ) {				
			oItem.className = oItem.className.replace(reClassMatcher, "$1 $2_hover");			 			
		}
		oItemStack.push(oMenuInfo);
		
		
	}
	
	function loliteMenus(iLevel) {		
		while( oItemStack.length > iLevel ) {			
			var oMenuInfo = oItemStack.pop();
			if( HOVER_TD ) {
				var oItem = document.getElementById(oMenuInfo.itemID);				
				oItem.className = oItem.className.replace(reClassMatcher, "$1");								
			}
		}
	}		
		
	
	function menu_onmouseover(e)
	{
		clearTimeout(toHideMenu);		
		var oMenuInfo = getMenuItemInfo(e);
		if( oMenuInfo )	{		
			hiliteMenu(oMenuInfo);
			toShowMenu = setTimeout(function() { showMenu(oMenuInfo);}, oMenuInfo.level == 0 ? 0 : 250);		
		}		
		e.cancelBubble = true;
	}
	
	function menu_onmouseout(e)
	{			
		clearTimeout(toShowMenu);
		toHideMenu = setTimeout("hideMenus(0);loliteMenus(0);", 800);
		e.cancelBubble = true;
	}
	
	
	function findPosX(obj)
	{
		var curleft = 0;
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curleft += obj.offsetLeft
				if( obj.currentstyle && obj.tagName.toLowerCase() == "td" && obj.currentStyle.borderLeftStyle != "none" )
				{
					var iBorderLeftWidth = parseInt(obj.currentStyle.borderLeftWidth);
					if( !isNaN(iBorderLeftWidth) )
						curleft += parseInt(obj.currentStyle.borderLeftWidth);				
				}
			
				obj = obj.offsetParent;
			}
		}
		else if (obj.x)
			curleft += obj.x;
		return curleft;
	}
	
	function findPosY(obj)
	{
		var curtop = 0;	
		if (obj.offsetParent)
		{
			while (obj.offsetParent)
			{
				curtop += obj.offsetTop;
				if( obj.currentstyle && obj.tagName.toLowerCase() == "td" && obj.currentStyle.borderTopStyle != "none" )
				{
					curtop += parseInt(obj.currentStyle.borderTopWidth);				
				}
				obj = obj.offsetParent;
			}
		}
		else if (obj.y)
			curtop += obj.y;
		return curtop;
	}
	
	function getStyle(o, sCssRule){
		var s = "";
		if(document.defaultView && document.defaultView.getComputedStyle){
			s = document.defaultView.getComputedStyle(o, "").getPropertyValue(sCssRule);
		}
		else if(o.currentStyle){
			var c = sCssRule.split("-");
			for( var i = 1; i < c.length; i++ ) {
				c[i] = c[i].substr(0,1).toUpperCase() + c[i].substr(1);
			}
			sCssRule = c.join("-");			
			s = o.currentStyle[sCssRule];
		}
		return s;
	}
