/*
YADM - Yet another dynamic menu
written by Chris Heilmann (http://icant.co.uk)
Please refer to the yadm homepage for updates: http://www.onlinetools.org/tools/yadm/
Free for non-commercial use. Changes welcome, but no distribution without the consent of the author.

20080624
Modified by djf so that parent of UL is a DD
*/

function yadm() {

// Variables, change these in case you need to set other class names (mmhide_ for contribute users for example)
	var parentClass			= 'isParent';		//gets applied when the DD has a nested UL
	var activeParentClass	= 'isActive';		//gets applied when the nested UL is visible
	var preventHoverClass	= 'nohover';		//denotes a navigation that should not get any hover effects
	var indicateJSClass		= 'dhtml';			//gets applied to the main navigation when Javascript is available
	var toHideClass			= 'hiddenChild';	//gets applied to hide the nested UL
	var toShowClass			= 'shownChild';		//gets applied to show the nested UL
	var currentClass		= 'current';		//denotes the current active sub element and prevents collapsing
	var d = document.getElementById('nav');		//denotes the navigation element

// if DOM is not available stop right here.
	if (!document.getElementById && !document.createTextNode) { return; }

// if the navigation element is available, apply the class denoting DHTML capabilities
	if(d) {
		d.className += d.className == '' ? indicateJSClass : ' ' + indicateJSClass;
		var lis, i, firstUL, j, apply;

// loop through all DDs and check which ones have a nested UL
		lis = d.getElementsByTagName('dd');
		for( i = 0; i < lis.length ; i++ ) {
			firstUL = lis[i].getElementsByTagName('ul')[0];
// if there is a nested UL, deactivate the first nested link and apply the class to show there is a nested list
			if(firstUL) {
				/* lis[i].childNodes[0].onclick = function() { return false; } */
				/* This is not the behavior we want -- djf */
				lis[i].className += lis[i].className == '' ? parentClass : ' ' + parentClass;
// check if there is a "current" element 
				apply=true;
				if(new RegExp('\\b' + currentClass + '\\b').test(lis[i].className)) { apply = false; }
				if(apply) {
					for( j = 0; j < firstUL.getElementsByTagName('li').length; j++ ) {
						if(new RegExp('\\b' + currentClass + '\\b').test(firstUL.getElementsByTagName('li')[j].className)) { apply = false; break; }
					}
				}
// if there is no current element, apply the class to hide the nested list
				if(apply) {
					firstUL.className += firstUL.className == '' ? toHideClass : ' ' + toHideClass;
// check if there is a class to prevent hover effects and only apply the function
// onclick if that is the case, otherwise apply it onclick and onhover
					if(new RegExp('\\b' + preventHoverClass + '\\b').test(d.className)) {
						lis[i].onclick = function() { doyadm(this); }
					} else {
						lis[i].onclick = function() { doyadm(this); }
						lis[i].onmouseover = function() { doyadm(this); }
						lis[i].onmouseout = function() { doyadm(null); }
					}
// if there is a current element, define the list as being kept open and apply the 
// classes to show the nested list and define the parent LI as an active one
				} else {
					lis[i].keepopen = 1;
					firstUL.className += firstUL.className == '' ? toShowClass : ' ' + toShowClass;
					lis[i].className = lis[i].className.replace(parentClass,activeParentClass);
				}
			}
		}
	}
// function to show and hide the nested lists and add the classes to the parent LIs
	function doyadm(o) {
		var childUL, isobj, swap;
// loop through all DDs of the navigation
		lis = d.getElementsByTagName('dd');
		for( i = 0; i < lis.length; i++ ) {
			isobj = lis[i] == o;
// function to exchange class names in an object
			swap = function(tmpobj, tmporg, tmprep) {
				tmpobj.className = tmpobj.className.replace(tmporg,tmprep)
			}
// if the current DD does not have an indicator to be kept visible
			if(!lis[i].keepopen) {
				childUL = lis[i].getElementsByTagName('ul')[0];
// check if there is a nested UL and if the current LI is not the one clicked on
// and exchange the classes accordingly (ie. hide all other nested lists and 
// make the LIs parent rather than active.
				if(childUL) {
					if(new RegExp('\\b' + preventHoverClass + '\\b').test(d.className)) {
						if(new RegExp('\\b' + activeParentClass + '\\b').test(lis[i].className)) {
							swap(childUL, isobj ? toShowClass : toHideClass, isobj ? toHideClass : toShowClass);
							swap(lis[i], isobj ? activeParentClass : parentClass, isobj ? parentClass : activeParentClass);
						} else {
							swap(childUL , isobj ? toHideClass : toShowClass, isobj ? toShowClass : toHideClass);
							swap(lis[i], isobj ? parentClass : activeParentClass, isobj ? activeParentClass : parentClass);
						}
					} else {
						swap(childUL, isobj ? toHideClass : toShowClass, isobj ? toShowClass : toHideClass);
						swap(lis[i], isobj ? parentClass : activeParentClass, isobj ? activeParentClass : parentClass);
					}
				}
			}
		}
	}
}

window.onload = function() {
	yadm();
	// add other functions to be called onload below
}
