// initialize onload
window.onload = Navigationlists;

/**
 * navigationlist initializer
 */
function Navigationlists () {
	// scan document for navigationlists
	var i = 0, oList, aLists = document.getElementsByTagName ( "ul" );
	while ( oList = aLists.item ( i++ )) {
		
		if ( oList.id == "topmenu" ) Topmenu ( oList );
		else if ( oList.id == "sitemap" ) Sitemap ( oList );
		else if ( oList.className == "nl" ) Submenu ( oList );
	}
	
	// focus active link [keyboard navigation aid]
	var i = 0, oLink;
	while ( oLink = document.links [ i++ ]) {
		if ( oLink.href == document.location.href ) {
			try { oLink.focus ();}
			catch ( exception ){};
		}
	}
	
	// prevent explorer clicks on dummy links
	if ( document.attachEvent && !window.opera ) {
		document.body.attachEvent ( "onclick", function () {
			if ( window.event.srcElement.href == "javascript:////" ) 
				window.event.returnValue = false;
		});
	}
}

/**
 * Navigationlist topmenu
 * @param oList : HTMLUListElement
 */
function Topmenu ( oList ) {
	// computer ergo sum
	var self = this;
	
	// expanding
	function expand ( e, oA ) {
		if ( !oA ) {
			var e = e ? e : window.event;
			if ( e.keyCode && e.keyCode != 13 ) return;
			var oA = e.target ? e.target : e.srcElement;
			if ( oA.nodeType != 1 ) oA = oA.parentNode;
			if ( !oA.href ) return;
			else oList.onmouseup = listen;
		}
		var oLI = oA.parentNode;
		var oUL = oLI.parentNode;
		reset ( oUL.getElementsByTagName ( "ul" ));
		reset ( oUL.getElementsByTagName ( "a" ));
		try {
			oLI.getElementsByTagName ( "ul" ).item ( 0 ).className = "active";
			if ( oUL.className == "active" ) oUL.className = "on";
			if ( self.oTimeout ) clearTimeout ( self.oTimeout );
			self.oTimeout = setTimeout ( collapse, 12000 );
			oA.className = "on";
		}
		catch ( exception ) {
			oUL.className = "on";
			oA.className = "selected";
			if ( self.oTimeout ) window.clearTimeout ( self.oTimeout );
		}
	}
	// collapsing
	function collapse () {
		if ( aSelects.length ) {
			var i = 0, oSelect;
			while ( oSelect = aSelects [ i++ ]) 						
				expand ( null, oSelect );
		}
		else {
			reset ( oList.getElementsByTagName ( "ul" ));
			reset ( oList.getElementsByTagName ( "a" ));
		}					
	}
	// listening
	function listen () {
		document.body.onmousedown = function ( e ) {
			var e = e ? e : window.event;
			var oNode = e.target ? e.target : e.srcElement;
			var bContains = false;
			while ( oNode.parentNode ) 
				if ( oNode.parentNode == oList ) { bContains = true; break; }
				else oNode = oNode.parentNode;
			if ( !bContains ) collapse ();
			document.body.onmousedown = null;
		}
	}
	// resetting
	function reset ( aNodes ) {
		if ( aNodes.length ) {
			var i = 0, oNode;
			while ( oNode = aNodes.item ( i++ )) {
				if ( oNode.className != "" ) oNode.className = "";
			}
		}
	}
	// initializing
	var i = 0, aSelects = [], oLink, aLinks = oList.getElementsByTagName ( "a" );
	while ( oLink = aLinks.item ( i++ )) {
		if ( !oLink.href ) oLink.href = "javascript:////";
		if ( oLink.className == "on" || oLink.className == "selected" ) 
			aSelects [ aSelects.length ] = oLink;
	}
	oList.onmousedown = expand;
	oList.onkeydown = expand;
}

/**
 * Navigationlist submenu
 * @param oList : HTMLUListElement
 */
function Submenu ( oList ) {
	// mechanics
	function action ( e ) {
		var e = e ? e : window.event;
		if ( e.type == "keydown" && e.keyCode != 13 ) return;
		var oNode = e.target ? e.target : e.srcElement;
		if ( oNode.nodeType == 3 ) oNode = oNode.parentNode;
		var oList = oNode.parentNode.getElementsByTagName ( "ul" ).item ( 0 );
		var bUpdate = true;
		switch ( oNode.className ) {
			case "label" : oNode.className = "on"; oList.className = "on"; break;
			case "on" : oNode.className = "label"; oList.className = ""; break;
			default : bUpdate = false;
		}
	}
	// enable keyboard navigation
	var i = 0, oLink, aLinks = oList.getElementsByTagName ( "a" );
	while ( oLink = aLinks.item ( i++ )) {
		if ( !oLink.href ) oLink.href = "javascript:////";
	}
	oList.onmousedown = action;
	oList.onkeydown = action;
}

/**
 * navigationlist sitemap
 * @param oList : HTMLUListElement
 */
function Sitemap ( oList ) {
	Submenu ( oList );
}