<!--

/**
 * Foldmenu script (c)2007 Tim Franssen
 * 
 * This script will make nested lists with class "foldmenu" behave
 * like menus with popup submenus. There is no limit to the depth
 * of the menu structure or the number of menu items.
 * 
 * To use it, give your <ul> a class "foldmenu" and hide the sublists
 * in your CSS like so:
 * .foldmenu ul ul { display: none; }
 */

/**
 * Find all elements of a certain class [in a node]
 * Used to find all "foldmenu" class lists
 * Taken from dustindiaz.com
 */

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

/**
 * Find the coordinates of an element
 * Taken from quirksmode.org
 */

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

/**
 * General purpose functions for traversing the menus
 */

function getElements(node,type) {
	var elm = node.firstChild;
	var elms = new Array();
	while ( elm ) {
		if ( elm.nodeType == 1 && elm.nodeName == type ) {
			elms.push(elm);
		}
		elm = elm.nextSibling;
	}
	return elms;
}

function getButtons(menu) {
	return getElements(menu,"LI");
}

function hasSubmenu(button) {
	return getElements(button,"UL").length != 0;
}

function getSubmenu(button) {
	return getElements(button,"UL")[0];
}

/**
 * Adds mouse events to li elements in a given ul that have sublists (recursive)
 */

function addMouseEvents(menu) {
	var buttons = getButtons(menu);
	for ( j in buttons ) {
		if ( hasSubmenu(buttons[j]) ) {
			buttons[j].onmouseover = function() { menuOpen(this); }
			buttons[j].onmouseout  = function() { menuClose(this); }
			var submenu = getSubmenu(buttons[j]);
			addMouseEvents(submenu);
		}
	}
}

/**
 * Put the submenus in place relative to their parents
 */
 
function calculateLocations() {
	var menus = getElementsByClass("foldmenu");
	for ( i in menus ) {
		positionSubmenu(menus[i]);
	}
}

function positionSubmenu(menu) {
	var buttons = getButtons(menu);
	for ( j in buttons ) {
		if ( hasSubmenu(buttons[j]) ) {
			var submenu = getSubmenu(buttons[j]);
			var menupos = findPos(buttons[j]);
			var blockpos = findPos(buttons[j].parentNode);
			submenu.style.position = "absolute";
			var xpos = menupos[0]-blockpos[0]+13;
			var ypos = 22;
			submenu.style.left = xpos+"px";
			submenu.style.top = ypos+"px";
			positionSubSubmenu(submenu);
		}
	}
}

function positionSubSubmenu(menu) {
	var buttons = getButtons(menu);
	for ( j in buttons ) {
		if ( hasSubmenu(buttons[j]) ) {
			var submenu = getSubmenu(buttons[j]);
			var menupos = findPos(buttons[j]);
			if ( buttons[j].offsetWidth )
				var menuwidth = buttons[j].offsetWidth;
			else if ( buttons[j].width )
				var menuwidth = buttons[j].width;
			else
				var menuwidth = 170;
			var xpos = menupos[0] + 10;
			var ypos = menupos[1] + 3;
			submenu.style.position = "absolute";
			submenu.style.left = xpos+"px";
			submenu.style.top = ypos+"px";
			positionSubSubmenu(submenu);
		}
	}
}

/**
 * Initializes all menus with class "foldmenu"
 */

function initMenus() {
	calculateLocations();
	var menus = getElementsByClass("foldmenu");
	for ( i in menus ) {
		addMouseEvents(menus[i]);
	}
}

/**
 * Mouse event handlers
 */

function menuOpen(button) {
	getSubmenu(button).style.display = "block";
}

function menuClose(button) {
	getSubmenu(button).style.display = "none";
}

/**
 * Invokes the initializer on document load
 * and relocates the submenus on document resize
 */

window.onload = initMenus;
window.onresize = calculateLocations;

//-->


