var tree = new Array();
var level1 = new Array();
var level2 = new Array();
var level3 = new Array();

var loadedOpened = -1;

var currElement = null;

function menuItem(id, parId, url, target, mode, text)
{
	this.id = id;
	this.parId = parId;
	this.url = url;
	this.target = target;
	this.mode = mode;
	this.text = text;
	
	this.level = -1;

	var baseClass;	//	[BC]
	el("nav_tab_" + id).baseClass = el("nav_tab_" + id).className;
}

function setStyles(mode, img, td1)
{	
	switch(mode)
	{
		case "*" : img.className = "inIMG";   img.src = img_closed_url; td1.className = "inTD";   break;
		case "_" : img.className = "inIMG_l"; img.src = img_empty_url;  td1.className = "inTD";   break;
		case "_*": img.className = "inIMG";   img.src = img_closed_url; td1.className = "inTD_l"; break;
		case "__": img.className = "inIMG_d"; img.src = img_empty_url;  td1.className = "inTD";	  break;
		case "___": img.className = "inIMG_d"; img.src = img_empty_url;  td1.className = "inTD_l2";	  break;
		
	}
}

function initIndNav()
{
	var container = el("nav_0");
	
	if(container)
	{
		initObjects(container);
		
		initLevels(imagePoolRoot);
		
		initObjectHierarchyTokens();

		show(0, false);
	}
}

function initLevels(imgPoolUrl)
{
	// find first level elements
	for(var i = 0; i < tree.length; ++i)
	{
		var obj = tree[i];
		if(obj.parId == 0)
		{
			obj.level = 1;
			level1[level1.length] = obj.id;
		}
	}
	
	// find second level elements
	for(var i = 0; i < tree.length; ++i)
	{
		var obj = tree[i];
		for(var ii = 0; ii < level1.length; ++ii)
		{
			if(obj.parId == level1[ii])
			{
				obj.level = 2;
				level2[level2.length] = obj.id;
			}
		}
	}
	
	// find third level elements
	for(var i = 0; i < tree.length; ++i)
	{
		var obj = tree[i];
		for(var ii = 0; ii < level2.length; ++ii)
		{
			if(obj.parId == level2[ii])
			{
				obj.level = 3;
				level3[level3.length] = obj.id;
			}
		}
	}
	
	initGlobals_IndNav(imgPoolUrl);
	//if(level1.length > 0 && el("upmostBorder")) el("upmostBorder").className = "inTAB_s";
}

function initGlobals_IndNav(imgPoolUrl)
{
	img_closed_url = imgPoolUrl + img_closed;
	img_open_url = imgPoolUrl + img_open;
	img_empty_url = imgPoolUrl + img_empty;
}

function initObjects(topElm)
{
	
	var topElmId = getIdFromElmId(topElm.id);
	var childNodes = (((browser.mac && !browser.mozilla5) || browser.opera)?topElm.children:topElm.childNodes);
	var spanNodes = new Array();
	
	for(var i = 0; i < childNodes.length; ++i)
	{
		var elm = childNodes[i];
		
		var isSpan = false;
		if(browser.ns6)
		{
			var elmId = new String(elm.id);
			if(elmId && elmId.indexOf("nav_") > -1 && elmId.indexOf("nav_t") < 0 && elmId.indexOf("nav_a") < 0 && elmId.indexOf("nav_i") < 0)
			{
				isSpan = true;
			}
		}
		else
		{
			var elmTag = new String(elm.tagName);
			isSpan = (elm && elmTag.toUpperCase() == "SPAN");
		}
		
		if(isSpan)
		{
			var id = getIdFromElmId(elm.id);
			
			var a = el("nav_a_" + id);
			
			tree[tree.length] = new menuItem(id, topElmId, a.href, a.target, "", a.innerHTML);
			
			initObjects(elm);
			
			if(browser.opera)
			{
				spanNodes[spanNodes.length] = elm;
			}
		}
	}
	
	if(browser.opera)
	{
		for(var i = 0; i < spanNodes.length; ++i)
		{
			topElm.removeChild(spanNodes[i]);
		}
	}
}

function initObjectHierarchyTokens()
{
	for(var i = 0; i < tree.length; ++i)
	{
		obj = tree[i];
		var hasChildren = false;
		
		for(var ii = 0; ii < tree.length; ++ii)
		{
			var currObj = tree[ii];
			if(currObj.parId == obj.id)
			{
				hasChildren = true;
				break;
			}
		}
		
		switch(obj.level)
		{
			case 1:
				obj.mode = (hasChildren?"*":"_");
				break;
			case 2:
				obj.mode = (hasChildren?"_*":"__");
				break;
			default:
				obj.mode = "___";
				break;
		}
	}
}

// id:    Numerische ID des Knotens
// parId: Numerische ID des direkten Eltern-Knotens
// text:  Textinhalt des Menüeintrags
// mode:  Hierarchische Einstufung des Menüeintrags (*, _, _*, __)
function createItem(id, parId, text, mode)
{
	var parElm, span, table, tr, td1, a, td2, img, a2;

	if(browser.opera)
	{
		parElm = el("nav_" + parId);
		
		span = document.createElement("SPAN");
		span = appendChildElm(parElm, span);
		span.id = "nav_" + id;
		
		table = document.createElement("TABLE");
		table = appendChildElm(span, table);
		table.id = "nav_tab_" + id;
		
		tr = appendTableItem(table, "TR");
		tr.id = "nav_tr_" + id;
		
		td1 = appendTableItem(tr, "TD");
		td1.id = "nav_td1_" + id;
		
		img = document.createElement("IMG");
		img = appendChildElm(td1, img);
		img.id = "nav_img_" + id;
			
		td2 = appendTableItem(tr, "TD");
		td2.id = "nav_td2_" + id;
		
		a = document.createElement("A");
		a.id = "nav_a_" + id;
		a = appendChildElm(td2, a);
		a.href = "javascript:show(" + id + ", true);";
		a.innerHTML = text;
	}
	else
	{
		parElm = el("nav_" + parId);
		span = el("nav_" + id);
		table = el("nav_tab_" + id);
		tr = el("nav_tr_" + id);
		td1 = el("nav_td1_" + id);
		img = el("nav_img_" + id);
		td2 = el("nav_td2_" + id);
		a = el("nav_a_" + id);
		span.style.display = "inline";
	}
	
	parElm.style.zIndex = 1;
	//table.className = "inTAB";
	table.cellSpacing = 0;
	table.cellPadding = 0;
	setHighlighting_IndNav(table);
	
	td2.className = "inTD_r";
	
	a.style.textDecoration = "none";
	
	setStyles(mode, img, td1);
	
	if(browser.mac && !browser.mozilla5)
	{
		span.style.width = "146px"; /*146*/
		table.style.width = "146px";
	}
}

function show(parId, link, skipHighlighting)
{
	var levelToShow = -1;
	var element = ob(parId);

	if(!element)
	{
		parId = 0;
		levelToShow = 1;
	}
	else
	{
		levelToShow = element.level - 0 + 1;
		
		var table;
		// currElement ist immer noch das beim vergangenen Klicken selektierte Element
		var prevElement = currElement;
		// currElement ist schon das beim aktuellen Klicken selektierte Element
		currElement = element;

		if(skipHighlighting)
		{
			var temp = prevElement;
			prevElement = currElement;
			currElement = temp;
		}

		if(prevElement != null)
		{
			table = el("nav_tab_" + prevElement.id);
			setHighlighting_IndNav(table);
			el("nav_tab_" + prevElement.id).className = el("nav_tab_" + prevElement.id).baseClass; //	[BC]	el("nav_tab_" + prevElement.id).style.backgroundColor = "#FF0000"
		}
		
		table = el("nav_tab_" + currElement.id);
		setHighlighting_IndNav(table);
	}
	
	var levelItems = ((levelToShow == 3)?level3:((levelToShow == 2)?level2:((levelToShow == 1)?level1:new Array())));
	
	if(levelToShow != 1)
	{
		if(element.mode == "*" || element.mode == "_*")
		{
			var elmSrc = new String(el("nav_img_" + parId).src);
			var childrenFound = false;
			
			hide(levelToShow - 1);
			
			if(elmSrc.indexOf(img_closed) > -1)
			{
				for(var i = 0; i < levelItems.length; ++i)
				{
					var obj = ob(levelItems[i]);
					if(obj.parId == parId)
					{
						document.getElementById("nav_tab_" + obj.id).className = "inTAB_s";	// [BC]
						document.getElementById("nav_tab_" + obj.id).baseClass = "inTAB_s";	// [BC]
						createItem(obj.id, parId, obj.text, obj.mode);
						childrenFound = true;
					}
				}
			}		
		}
		else
		{
			hide(levelToShow - 1);
		}
		setArrows(parId, childrenFound);
		if(link) navigate(element);
		
		if(browser.mac && !browser.mozilla5 && el("hn_tab"))
		{
			el("hn_tab").style.top = "81px"; /*81*/
			el("hn_tab").style.clientTop = "81px";
		}
		// aktueller Knoten soll markiert werden/bleiben
		
	}
	else
	{
		//show level 1 only
		for(var i = 0; i < levelItems.length; ++i)
		{
			var obj = ob(levelItems[i]);
			if(obj.parId == parId)
			{
				createItem(obj.id, parId, obj.text, obj.mode);
			}
		}
	}
}

function navigate(element)
{
	if(element && element.url != "" && element.url != "#")
	{
		switch(element.target)
		{
			case "_blank":
				window.open(element.url);
				break;
			case "_parent":
				if(window.parent)
				{
					window.parent.location.href = element.url;
				}
				else
				{
					window.location.href = element.url;
				}
				break;
			case "_top":
				if(window.top)
				{
					window.top.location.href = element.url;
				}
				else
				{
					window.location.href = element.url;
				}
				break;
			default:
				window.location.href = element.url;
				break;
		}
	}
}

// Entferne alle Elemente, die einer der Unterebenen der angegebenen Ebene gehören.
function hide(parLevel)
{
	hideLevel(parLevel - 0 + 1);
}

function hideLevel(level)
{
	var levelItems = ((level == 3)?level3:((level == 2)?level2:((level == 1)?level1:new Array())));
	for(var i = 0; i < levelItems.length; ++i)
	{
		try
		{
			if(browser.opera)
			{
				var elm = el("nav_" + levelItems[i]);
				var parElm = el("nav_" + ob(levelItems[i]).parId);
				parElm.removeChild(elm);
			}
			else
			{
				var elm = el("nav_" + levelItems[i]);
				if(elm) 
				{
					makeAllSubItemsInvisible(ob(levelItems[i]));
					//alert("Hiding " + ob(levelItems[i]).text);
					elm.style.display = "none";
				}
			}
		}
		catch(e){}
	}
}

function makeAllSubItemsInvisible(obj)
{
	for(var i = 0; i < tree.length; ++i)
	{
		var currObj = tree[i];
		if(currObj.parId == obj.id)
		{
			for(var ii = 0; ii < tree.length; ++ii)
			{
				if(tree[ii].parId == currObj.id) 
				{
					//alert("Hiding " + tree[ii].text);
					el("nav_" + tree[ii].id).style.display = "none";
				}
			}
			
			//alert("Hiding " + currObj.text);
			el("nav_" + currObj.id).style.display = "none";
		}
	}
}

function setArrows(lastId, lastItemHasSubmenu)
{
	var openIt = false;
	var imgElm = el("nav_img_" + lastId);
	var imgSrc = new String(imgElm.src);
	if(imgSrc.indexOf(img_closed) > -1)
	{
		openIt = true;
	}
	
	// reset all arrows
	for(var i = 0; i < tree.length; ++i)
	{
		try
		{
			imgElm = el("nav_img_" + tree[i].id);
			imgSrc = new String(imgElm.src);
			if(imgSrc.indexOf(img_closed) > -1 || imgSrc.indexOf(img_open) > -1)
			{
				imgElm.src = img_closed_url;
			}
		}
		catch(e){}
	}
	
	var id = lastId;
	
	while(id != 0)
	{
		try
		{
			if(((!openIt && id == lastId) == false) && ((id == lastId && lastItemHasSubmenu) || (id != lastId)))
			{
				el("nav_img_" + id).src = img_open_url;
			}
			id = ob(ob(id).parId).id;
		}
		catch(e){id = 0;}
	}
}

function setPath(url)
{
	var sCurrUrl = new String(url);
	sCurrUrl = sCurrUrl.toLowerCase();
	for(var i = 0; i < 10; ++i)
	{
		sCurrUrl = sCurrUrl.replace("&amp;", "&");
	}
	 
	var id = -1;
	for(var i = 0; i < tree.length; ++i)	
	{
		var sItemUrl = new String(tree[i].url);
		sItemUrl = sItemUrl.toLowerCase();
		
		// nur die Ordner-Punkte haben eine Raute in der URL -> ausgeschlossen
		if(sItemUrl.indexOf("#") < 0 && sItemUrl.indexOf(sCurrUrl) > -1)
		{
			id = tree[i].id;
			break;
		}
	}
	
	if(id > -1)
	{	
		currElement = ob(id);

		table = el("nav_tab_" + id);
		setHighlighting_IndNav(table);		
		var inversePath = new Array();
		
		while(id != 0)
		{
			try
			{
				inversePath[inversePath.length] = ob(id);
				id = ob(ob(id).parId).id;
			}
			catch(e){id = 0;}
		}
		
		// die erste Ebene wurde beim Laden bereits aufgebaut => 
		// ab der zweiten Ebene aufbauen
		for(var i = inversePath.length - 2; i >= 0; i--)
		{
			show(inversePath[i].parId, false, 1);
		}
		
		//if(ob(inversePath[0].id).mode == "*" || ob(inversePath[0].id).mode == "_*") show(inversePath[0].id, true);
		setFocus(inversePath[0].id);
		loadedOpened = inversePath[0].id;
		return false;
	}
}

/*function setPath(id)
{
	var inversePath = new Array();
	
	while(id != 0)
	{
		try
		{
			inversePath[inversePath.length] = ob(id);
			id = ob(ob(id).parId).id;
		}
		catch(e){id = 0;}
	}
	
	// die erste Ebene wurde beim Laden bereits aufgebaut => 
	// ab der zweiten Ebene aufbauen
	for(var i = inversePath.length - 2; i >= 0; i--)
	{
		show(inversePath[i].parId, false);
	}
	
	show(inversePath[0].id, true);
	setFocus(inversePath[0].id);
	loadedOpened = inversePath[0].id;
}*/

function setFocus(id)
{
	el("nav_tab_" + id).className = el("nav_tab_" + id).baseClass + " active";	//	[BC]	el("nav_tab_" + id).style.backgroundColor = "#FCFCFC";
}

function setHighlighting_IndNav(elm)
{
	if(browser.ie && !browser.mozilla5)
	{
		if(browser.mac)
		{
			elm.onmouseover = setColor_IndNav_high;
			if(currElement != null && "nav_tab_" + currElement.id == elm.id)
				elm.onmouseout = setColor_IndNav_high;
			else
				elm.onmouseout = setColor_IndNav_low;
		}
		else
		{
			elm.attachEvent("onmouseover", setColor_IndNav_high);
			if(currElement != null && "nav_tab_" + currElement.id == elm.id)
			{
				//alert("nav_tab_" + currElement.id + " / " + elm.id);
				elm.detachEvent("onmouseout", setColor_IndNav_low);
				elm.attachEvent("onmouseout", setColor_IndNav_high);
			}
			else
			{
				elm.detachEvent("onmouseout", setColor_IndNav_high);	//	RdL ???
				elm.attachEvent("onmouseout", setColor_IndNav_low);
			}
		}
	}
	else
	{
		elm.setAttribute("onmouseover", "setColor_IndNav(this, 1);");
		if(currElement != null && "nav_tab_" + currElement.id == elm.id)
			elm.setAttribute("onmouseout", "setColor_IndNav(this, 1);");
		else
			elm.setAttribute("onmouseout", "setColor_IndNav(this, 0);");
	}
}

function resetDehighlighting(elm)
{
	if(browser.ie && !browser.mozilla5)
	{
		if(browser.mac)
		{
			elm.onmouseout = "";
		}
		else
		{
			elm.attachEvent("onmouseout", null);
		}
	}
	else
	{
		elm.setAttribute("onmouseout", "");
	}
}

function setColor_IndNav_high()
{
	//unhighlightLoadedOpened();

	var id = getIdFromElmId(event.srcElement.id);
//if(id == 29681) alert("hi");
	if(id && id > 0) 
		el("nav_tab_" + id).className = el("nav_tab_" + id).baseClass + " hover";	//	[BC]	if(id && id > 0) el("nav_tab_" + id).style.backgroundColor = "#FCFCFC";
//	event.cancelBubble = true;
}

function setColor_IndNav_low()
{
	var id = getIdFromElmId(event.srcElement.id);
//if(id == 29681) alert("lo");
	if(id && id > 0) 
		el("nav_tab_" + id).className = el("nav_tab_" + id).baseClass;	//	[BC]	if(id && id > 0) el("nav_tab_" + id).style.backgroundColor = "#DDDDDD";
//	event.cancelBubble = true;
}

function unhighlightLoadedOpened()
{
	if(loadedOpened > -1)
	{
		// das Menü wurde im aufgeklappten Modus geladen =>
		// man muss zuerst das gehighlightete Item ausblenden
		// bevor man ein neues highlighten darf 
		el("nav_tab_" + loadedOpened).className = el("nav_tab_" + loadedOpened).baseClass;	//	[BC]	el("nav_tab_" + loadedOpened).style.backgroundColor = "#DDDDDD";
		loadedOpened = -1;
	}
}

function setColor_IndNav(elm, mode)
{
	unhighlightLoadedOpened();
	elm.className = ((mode == 1)?elm.baseClass + " hover":elm.baseClass);	//	[BC]	elm.style.backgroundColor = ((mode == 1)?"#FCFCFC":"#DDDDDD");
}

// Finde das MenuItem Objekt zu einer numerischen NavID
function ob(id)
{
	for(var i = 0; i < tree.length; ++i)
	{
		var obj = tree[i];
		if(obj.id == id)
		{
			return obj;
		}
	}
	
	return null;
}