/**
 * Javascript Menu 
 * - supports 2 or 3 levels, even mixed
 * - requires the following html structure:
 *	
 * Level 1:
 *	<ul id="menu-0">
 * 		<li><a onclick="menuActivate(0,1);">Item 1</a></li>		// or "menuActivate(1,-1);" if only 2 levels (see below)
 *			...
 *		<li><a onclick="menuActivate(0,m);">Item m</a></li>		// or "menuActivate(m,-1);" if only 2 levels (see below)
 *		<li id="more-0"><a onclick="menuActivate(0);">more</a></li>
 *	</ul>
 *	<hr id="hr-0" />
 *
 * Level 2:
 *	<ul id="menu-1">
 *		<li><a onclick="menuActivate(1,1);">Item 1</a></li>
 *			...
 *		<li><a onclick="menuActivate(1,n);">Item n</a></li>
 *		<li id="more-1"><a onclick="menuActivate(1);">more</a></li>
 *	</ul>
 *	<hr id="hr-1" />
 *	...
 *	<ul id="menu-m">
 *		...
 *	</ul>
 *	<hr id="hr-m" />
 *
 * Level 2 - when only 2 levels (level 2 is dummy, level 3 acts as second level in that case):
 *	<div style="display:none;">
 *		<ul id="menu-1">
 *			<li id="more-1"></li>
 *		</ul>
 *		<hr id="hr-1" />
 *	</div>
 *
 * Level 3:
 *	<ul id="menu-1-1">
 *	 	<li>Item 1</li>
 *			...
 *		<li>Item p</li>
 *	</ul>
 *	...
 *	<ul id="menu-1-n">
 *		...
 *	</ul>
 *	...
 *	<ul id="menu-m-1">
 *		...
 *	</ul>
 *	...
 *	<ul id="menu-m-q">
 *		...
 *	</ul>
 * 
 * CSS: Level 2 and 3 <ul>s, all "more"-<li>s and all <hr>s must be set to display:none
 *
*/

/**
 * Collapses the given menu of level 1 or 2, so only active menu item, more button and hr are shown
 * This method is just called internally by menuActivate()
 *
 * @param	integer		menu to collapse (0 for level 1 menu or 1...m for level 2 menu)
 * @param	integer		active menu item of collapsed menu
 * 
 * @return	void
 */
function menuCollapse(level,nr) {
	// walk through all menu items of given menu (level)
	for (i=0;listitems[level].length>i;i++) {
		// remove act class if set
		if (listitems[level][i].className.indexOf("act")>-1) 
			listitems[level][i].className = listitems[level][i].className.substring(0,listitems[level][i].className.indexOf("act"));
		// set act class for active menu item
		if (i==(nr-1)) listitems[level][i].className += "act";
		// hide all items excepting the active menu item and the more button
		if (listitems[level][i].className.indexOf("act")==-1) listitems[level][i].style.display = "none";
		if (listitems[level][i].className.indexOf("more")>-1) listitems[level][i].style.display = "block";
	}
	// show hr below collapsed menu
	if (document.getElementById("hr-"+level)) document.getElementById("hr-"+level).style.display = "block";
}

/**
 * Expands the given menu of level 1 or 2, so all menu items excepting more button und hr are shown
 * This method is just called internally by menuActivate()
 *
 * @param	integer		menu to expand (0 for level 1 menu or 1...m for level 2 menu)
 * 
 * @return	void
 */
function menuExpand(level) {
	// hide all menus excepting level 1 menu and all subitems and remove act class
	for (i=0;lists.length>i;i++) {
		if (i>0) lists[i].style.display = "none";
		for (j=0;listitems[i].length>j;j++) {
			if ((i>=level) && (listitems[i][j].className.indexOf("act")>-1)) 
				listitems[i][j].className = listitems[i][j].className.substring(0,listitems[i][j].className.indexOf("act"));
			if (i>0) listitems[i][j].style.display = "none";
		}
	}
	// display all items in current menu (level) and hide more button
	lists[level].style.display = "block";
	for (i=0;listitems[level].length>i;i++) {
		listitems[level][i].style.display = "block";
		if (listitems[level][i].className.indexOf("more")>-1) listitems[level][i].style.display = "none";
	}
	// hide hrs below expanded menu
	i = level;
	while (document.getElementById("hr-"+i)) {
		if (document.getElementById("hr-"+i)) document.getElementById("hr-"+i).style.display = "none";
		i++;
	}
}

/**
 * Main method, used in menu links (onclick event). Calls menuCollapse() and menuExpand() as needed, shows sub menu items of
 * current menu and hides content.
 *
 * @param	integer		current menu (e.g. one of the items of this menu was clicked)
 * @param	integer		clicked menu item 
 * 						special case for 2 levels only: level 1 onlick links are set to (second level menu number,-1)
 * 
 * @return	void
 */
function menuActivate(level,nr) {
	// hide content
	if (document.getElementById("contentcontainer")) document.getElementById("contentcontainer").style.display = "none";

	// get all lists
	alllists = document.getElementsByTagName("ul");
	// select only menu lists
	lists = [];
	j=0;
	for (i=0;i<alllists.length;i++) {
		if (alllists[i].id.substr(0,5)=="menu-") {
			lists[j] = alllists[i];
			j++;
		}
	}
	// get an array with all menu listitems	and add menu numbers (from id) to list array values
	listitems = [];
	for (i=0;i<lists.length;i++) {
		// id=menu-x
		if (lists[i].id.indexOf("-") == lists[i].id.lastIndexOf("-") ) {
			lists[i].nr1 = lists[i].id.substr(lists[i].id.indexOf("-")+1,2);
			lists[i].nr2 = "";
		// id=menu-x-y
		} else {
			lists[i].nr1 = lists[i].id.substring(lists[i].id.indexOf("-")+1,lists[i].id.lastIndexOf("-"));
			lists[i].nr2 = lists[i].id.substr(lists[i].id.lastIndexOf("-")+1,2);
		}
		listitems[i] = lists[i].getElementsByTagName("li");
	}
	
	// this method menuActivate() is called on onclick event. So we have to decide what to do: 
	// expand collapsed menu or collapse expanded menu
	
	// expand hidden menu (more button is displayed, so menu is collapsed)
	if (document.getElementById("more-"+level).style.display == "block") {
		// special case: nr is set to -1 via onclick link, if there are 2 levels only (level 2 is a dummy level in that case, level 3
		// acts as second level) and if there is no real level 2 it can only be the level 1 menu which has to be expanded, so we set 
		// level to 0 in that case
		if (nr==-1) level=0; 
		menuExpand(level);
	}
	// collapse menu and show sub menu
	else {
		// special case for 2 levels only (s.a.): if there is no real level 2 we have to collapse level 1 menu first bevor showing 
		// the third level menu. In that case in onclick method call nr is set to -1 (2 levels only flag) and level holds the second
		// level menu number. So we call menuActivate with (0,level) again to collapse level 1 menu.
		if (nr==-1) {
			menuActivate(0,level);
			// if there is no real level 2, level 3 has only 1 submenu, so we set nr to 1 here
			nr=1;
		}
		// display submenu and subitems
		for (i=0;i<lists.length;i++) {
			// show submenu of current level 1 menu item and hide all others
			if (level==0 && lists[i].nr1==nr && lists[i].nr2=="") {
				lists[i].style.display = "block";
				// show all submenu items but more buttons
				for (j=0;j<listitems[i].length;j++) if (listitems[i][j].className.indexOf("more")==-1) listitems[i][j].style.display = "block";
			}
			// show submenu of current level 2 menu item and hide all others
			if (lists[i].nr1==level && lists[i].nr2==nr) {
				lists[i].style.display = "block";
				// show all submenu items but more buttons
				for (j=0;j<listitems[i].length;j++) if (listitems[i][j].className.indexOf("more")==-1) listitems[i][j].style.display = "block";
			}
		}
		// collapse menu
		menuCollapse(level,nr);
	}
}
