var leftNavContainerId = ('hmLeftNav');
var topNavContainerId = ('hmTopNav');
var dbg = null;

if(window.attachEvent){window.attachEvent('onload',processHmLeftNav);}
else if(window.addEventListener){window.addEventListener('load',processHmLeftNav,false);}	
else{window.onload += function(){processHmLeftNav();}}

function processHmLeftNav()
{
	if(location.port!='')dbg = (document.getElementById('dbg') ? document.getElementById('dbg') : false);
	
	//try{
		SetHouseMenuCssClassNames(leftNavContainerId);
		FilterHouseMenuNodes(leftNavContainerId);
		try{document.getElementById('hmLeftNavContainer').style.display='block';}catch(e){if(dbg)dbg.innerHTML+='LN[16]\n'+e+'<br />';}
	//}catch(e){if(dbg)dbg.innerHTML+='LN[17]\n'+e+'<br />';}
}
/*************************************/
CSS = {
	addClass : function(el, className){CSS.removeClass(el, className).className += ' ' + className; return el;}
	, removeClass : function(el, className){el.className = el.className.replace(className, ''); return el;}
	, hasClass : function(el, className){return (el.className.indexOf(className) != -1);}
	, NAV : 
	{
	rootNode : 'rootNode'
	, rootMenu : 'rootMenu'
	, parentNode : 'parentNode'
	, leafNode : 'leafNode'
	, nodeSelected : 'nodeSelected'
	, childSelected : 'childSelected'
	, descendantSelected : 'descendantSelected'
	, parentSelected : 'parentSelected'
	, activeSection : 'activeSection'
	}
}

function SetHouseMenuCssClassNames(hmContainerId)
{
	var container = document.getElementById(hmContainerId);
	var lists = container.getElementsByTagName('ul');
	
	var node = null;
	var menuDepth = 0;
	
	//locate root ul
	node = container.firstChild;
	while(node.nextSibling)
	{
		if (node.tagName == 'UL')
		{
			if (!node.id){node.id = hmContainerId + '_navRoot'}
			document.getElementById(node.id).style.display=('none');
			break;
		}
		node = node.nextSibling;
	}

	for (var n=0; n<lists.length; n++)
	{
		node = lists[n];
		menuDepth = 0;
		
		while(node.parentNode.id != hmContainerId)
		{	if (node.tagName == 'UL'){menuDepth++;}
			node = node.parentNode;
		}
		CSS.addClass(lists[n], 'menuDepth-'+menuDepth);
		
		/* list item iteration : begin */
		if (lists[n].firstChild)
		for(var cn=0; cn<lists[n].childNodes.length; cn++)
		{
			if(lists[n].childNodes[cn].tagName == 'LI')
			{
				node = lists[n].childNodes[cn];

				CSS.addClass(node, 'menuDepth-'+menuDepth);
				
				//parentNode / leafNode determination
				if (node.getElementsByTagName('ul').length > 0)	{CSS.addClass(node, CSS.NAV.parentNode);}
				else{CSS.addClass(node, CSS.NAV.leafNode);}
				
				if (node.firstChild.tagName == 'A')
				{
					CSS.addClass(node.firstChild, 'menuDepth-'+menuDepth);
					if (node.firstChild.innerHTML == 'Admin')
					{
						CSS.addClass(node, 'AdminMenu');
						CSS.addClass(node.firstChild, 'AdminMenu');
						node.firstChild.href='#AdminMenu';
						if (!node.firstChild.id){node.firstChild.id = hmContainerId+'AdminMenuLink'}
					}
					else if (node.firstChild.innerHTML == 'Host')
					{
						CSS.addClass(node, 'HostMenu');
						CSS.addClass(node.firstChild, 'HostMenu');
						node.firstChild.href='#HostMenu';
						if (!node.firstChild.id){node.firstChild.id = hmContainerId+'HostMenuLink'}
					}
					
					/* selectedNode : begin */
					if (location.href == node.firstChild.href)
					{
						CSS.addClass(node.firstChild, CSS.NAV.nodeSelected);
						CSS.addClass(node, CSS.NAV.nodeSelected);
												
						//resolve parentSelected classes :: begin
						for (var cn2=0; cn2<node.childNodes.length; cn2++)
						if(node.childNodes[cn2].tagName == 'UL')
						{
							CSS.addClass(node.childNodes[cn2], CSS.NAV.parentSelected);
							for (var cn3=0; cn3<node.childNodes[cn2].childNodes.length; cn3++)
							{
								if(node.childNodes[cn2].childNodes[cn3].tagName == 'LI')
								{
									CSS.addClass(node.childNodes[cn2].childNodes[cn3], CSS.NAV.parentSelected);
									try { if(node.childNodes[cn2].childNodes[cn3].firstChild.tagName == 'A')
										CSS.addClass(node.childNodes[cn2].childNodes[cn3].firstChild, CSS.NAV.parentSelected);
									} catch(e){if(dbg)dbg.innerHTML+='LN[120]\n'+e+'<br />';}
								}
							}
						}

						//resolve topnav highlight
						if (document.getElementById(topNavContainerId)){setTopNavHighLight(node);}
					
						//resolve parentSelected classes :: end
						//resolve childSelected / descendantSelected  classes :: begin
						while(node.parentNode.id != hmContainerId)
						{
							node = node.parentNode;
							switch(node.tagName)
							{	case 'UL' : case 'LI' : case 'A' : 
									CSS.addClass(node, CSS.NAV.childSelected);
									break;
							}
						}
						//resolve childSelected classes :: end
					}/* selectedNode : end */
				}
			}
		}/* list item iteration : end */
	}	
}

function FilterHouseMenuNodes(hmContainerId)
{
	var navContainer = document.getElementById(hmContainerId);
	for (var nr=0; nr<navContainer.childNodes.length; nr++)
	{
		if (navContainer.childNodes[nr].tagName == 'UL')
		{
			var rootUl = navContainer.childNodes[nr].cloneNode(true);
			break;
		}
	}
	//find relative root node 
	var reSelected = new RegExp('('+CSS.NAV.childSelected+'|'+CSS.NAV.nodeSelected+')');
	
	for (var n=0; n<rootUl.childNodes.length; n++)
	{
		if(reSelected.test(rootUl.childNodes[n].className))
		{
			/*
				found selectedNode or childSelected node from top (level 0)
				want to begin menu from level 1, following ul becomes top level, if any.
			*/
			for (var N2=0; N2<rootUl.childNodes[n].childNodes.length; N2++)
			{
				if (rootUl.childNodes[n].childNodes[N2].tagName == 'UL')
					{var relativeRootNode = rootUl.childNodes[n].childNodes[N2];}
				if (relativeRootNode) break;
			}
			if (relativeRootNode) break;
		}
	}
	
	if (relativeRootNode)
	{
		//process relative root, apply navigaiton style
		/*
			rules:
			show nodes where childSelected, parentSelected, or nodeSelected
		*/
		var lists = relativeRootNode.getElementsByTagName('ul');
		var listsMarkedForRemoval = [];
		var reIncludeList = new RegExp('('+CSS.NAV.childSelected+'|'+CSS.NAV.nodeSelected+'|'+CSS.NAV.parentSelected+')');
		for (var l=0; l<lists.length; l++)
		{
			if (!reIncludeList.test(lists[l].className))
			{listsMarkedForRemoval.push(lists[l]);}
		}
		for (var l=0; l<listsMarkedForRemoval.length; l++)
		{
			if(listsMarkedForRemoval[l])
				{listsMarkedForRemoval[l].parentNode.removeChild(listsMarkedForRemoval[l])}
		}
		
		//get admin/host menu and process
		for (var l=rootUl.childNodes.length-1; l>=0; l--)
		{
			if(rootUl.childNodes[l].tagName == 'LI')
			{
				if (CSS.hasClass(rootUl.childNodes[l], 'HostMenu'))
				{	var isRoot = true;relativeRootNode.appendChild(rootUl.childNodes[l].cloneNode(true));}
				else if (CSS.hasClass(rootUl.childNodes[l], 'AdminMenu'))
				{	var isAdmin = true;
					if (isRoot){relativeRootNode.insertBefore(rootUl.childNodes[l].cloneNode(true), relativeRootNode.lastChild)}
					else{relativeRootNode.appendChild(rootUl.childNodes[l].cloneNode(true))}
				}
				else {break;}
			}
		}
		navContainer.appendChild(relativeRootNode.cloneNode(true));
		navContainer.removeChild(navContainer.childNodes[nr]);
		
		if((isAdmin || isRoot) && navigator.userAgent.toLowerCase().indexOf('msie')>-1)
		{
			if (isRoot){
				document.getElementById(hmContainerId+'HostMenuLink').onclick=function(){return false;}
				document.getElementById(hmContainerId+'HostMenuLink').parentNode.className += ' IEHostMenu';
				document.getElementById(hmContainerId+'HostMenuLink').parentNode.onmouseover = function(){if(!this.hovering) this.childNodes[2].style.display='block';this.hovering=true;}
				document.getElementById(hmContainerId+'HostMenuLink').parentNode.onmouseout = function(){this.childNodes[2].style.display='none';this.hovering=false;}
			}
			if (isAdmin){
				document.getElementById(hmContainerId+'AdminMenuLink').onclick=function(){return false;}
				document.getElementById(hmContainerId+'AdminMenuLink').parentNode.className += ' IEAdminMenu';
				document.getElementById(hmContainerId+'AdminMenuLink').parentNode.onmouseover = function(){if(!this.hovering) this.childNodes[2].style.display='block';this.hovering=true;}
				document.getElementById(hmContainerId+'AdminMenuLink').parentNode.onmouseout = function(){this.childNodes[2].style.display='none';this.hovering=false;}
			}
		}
	} 
	else{navContainer.removeChild(navContainer.childNodes[nr]);}
}


function setTopNavHighLight(selectedNode)
{
	var node = selectedNode;
	while (node.id != leftNavContainerId)
	{
		if (node.className.indexOf('menuDepth-0') != -1 && node.tagName == 'LI')
		{	try{CSS.addClass(document.getElementById(node.id.replace(leftNavContainerId, topNavContainerId)), CSS.NAV.activeSection)}catch(e){if(dbg)dbg.innerHTML+='LN[240]\n'+e+'<br />'}
			break;
		}
		node=node.parentNode;
	}
}