var currentSubMenu ;
var currentSubSubMenu ;
function toggleSubMenu(aTag){
	var subMenuDiv = getSubMenuDiv(aTag) ;
	
	if(subMenuDiv.style.display == "none"){				
		if(currentSubMenu){
			collapseSubMenu(currentSubMenu) ;
			
		}
		if(currentSubSubMenu){
			collapseSubMenu(currentSubSubMenu) ;
		}
		expandSubMenu(aTag) ;
		currentSubMenu = aTag ;
		currentSubSubMenu = "" ;
	}else{
		collapseSubMenu(aTag) ;
		// also collapse current sub sub menu if open
		if(currentSubSubMenu){
			collapseSubMenu(currentSubSubMenu) ;
		}
		currentSubMenu = "" ;
		currentSubSubMenu = "" ;
	}
}

function toggleSubSubMenu(aTag){
	var subMenuDiv = getSubMenuDiv(aTag) ;
	
	if(subMenuDiv.style.display == "none"){				
		if(currentSubSubMenu){
			collapseSubMenu(currentSubSubMenu) ;
		}
		expandSubMenu(aTag) ;
		currentSubSubMenu = aTag ;
	}else{
		collapseSubMenu(aTag) ;
		currentSubSubMenu = "" ;
	}	
}

function expandSubMenu(aTag){
	var subMenuDiv = getSubMenuDiv(aTag) ;
	new Effect.SlideDown(subMenuDiv,{duration:0.4}) ;
	aTag.className = "currentSelection" ;
}

function collapseSubMenu(aTag){
	var subMenuDiv = getSubMenuDiv(aTag) ;
	new Effect.SlideUp(subMenuDiv,{duration:0.4}) ;
	aTag.className = "" ;
}

function getSubMenuDiv(aTag){
	var subMenuDiv = aTag.nextSibling ;
	
	// Traverse siblings of <a> tag until we find the adjacent DIV.
	// This is beacuse nextSibling will return a text node for any whitespace
	// between tags in many browsers.
	while(subMenuDiv.nodeName != "DIV"){
		subMenuDiv = subMenuDiv.nextSibling ;
	}
	return subMenuDiv ;
}

function attachMenuHandlers(){
	if (! document.getElementsByTagName) {
		return;
	}
	
	var links = document.getElementsByTagName("a");
	
	for (i = 0; i < links.length; i++) {
		linkHref = links[i].getAttribute("href") ;
		linkRel  = links[i].getAttribute("rel") ;
		if (linkHref && linkRel) {
			if (linkRel.indexOf("toggleSubMenu") == 0) {
				links[i].onclick = function () { toggleSubMenu(this); return false; };
			}
			
			if (linkRel.indexOf("toggleSubSubMenu") == 0) {
				links[i].onclick = function () { toggleSubSubMenu(this); return false; };
			}
		}
	}
	
	// on pages with tab navigation, attach AJAX loading code
	// to each of the links within div#tabs
	var tabsDiv = document.getElementById('tabs') ;
	if(tabsDiv){
		var tabLinks = tabsDiv.getElementsByTagName("a") ;
		for(i = 0; i < tabLinks.length; i++){
			linkHref = links[i].getAttribute("href") ;
			tabLinks[i].onclick = function() { loadTabContents(this); return false; } ;
		}
	}
		
}

function setMenuState(){
	if (! document.getElementsByTagName) {
		return;
	}
	
	var menuRootNode = document.getElementById('menu') ;
	if(!menuRootNode){
		return 1 ;	
	}
	var links = menuRootNode.getElementsByTagName("a") ;
	var currentLink = "" ;
	
	for (i = 0; i < links.length; i++) {
		linkHref = links[i].getAttribute("href",2) ;
		if(linkHref == location.pathname){
			currentLink = links[i] ;
			break ;
		}
	}
	
	if(currentLink){
		currentLink.className = "currentSelection" ;
		processParentNode(currentLink) ;
	}
}

function setTabState(){
	if (! document.getElementsByTagName) {
		return;
	}
	
	var tabsRootNode = document.getElementById('tabs') ;
	if(!tabsRootNode){
		return 0 ;	
	}
	var links = tabsRootNode.getElementsByTagName("a") ;
	var currentLink = "" ;
	
	for (i = 0; i < links.length; i++) {
		linkHref = links[i].pathname ;
		
		/* make sure pathnames are consistent with leading slashes
		   for proper x-browser compatibility
		*/
		if(linkHref.charAt(0) != "/"){
			linkHref = "/"+linkHref	
		}
		
		if(currentTabURL.charAt(0) != "/"){
			currentTabURL = "/"+currentTabURL	
		}

		if(linkHref == currentTabURL){
			links[i].className = "currentSelection" ;
		}else{
			links[i].className="foo" ;
		}
	}
}

function processParentNode(currentNode){	
	currentParent = currentNode.parentNode ;
	if(currentParent.id == "menu"){
		return ;
	}else if(currentParent.className == "submenuContainer"){
		currentParent.style.display = "block" ;
		linkSibling = getPreviousLinkSibling(currentParent) ;
		
		if(linkSibling){
			linkSibling.className = "currentSelection" ;
		}
	}
	processParentNode(currentParent) ;
}

function getPreviousLinkSibling(divElement){
	currentPrevSib = currentParent.previousSibling ;
	// if we didn't get the <a> tag, keep traversing until we do
	while(currentPrevSib.tagName != "A"){
		currentPrevSib = currentPrevSib.previousSibling ;
		// return with failure if there are no more previous siblings
		if(!currentPrevSib){
			return 0 ;
		}
	}
	
	return currentPrevSib ;
}