/* 
* Fügt den Listeneinträgen Eventhandler und CSS Klassen hinzu,
* um die Menüpunkte am Anfang zu schließen.
* 
* menu: Referenz auf die Liste.
* data: String, der die Nummern aufgeklappter Menüpunkte enthält.
*/
function treeMenu_init(menu_id, data) {
	var menu = document.getElementById(menu_id);
	var array = new Array(0);
	if(data != null && data != "") {
		var data_neu = new Array(0);
		var data_alt = new Array();
		data_alt = data.split('\n');
		//alert ('seite aufgerufen - altstring: '+data_alt); //####### test
		for(var i = 0; i < data_alt.length; i++) {
			if(data_alt[i].search(menu_id) != -1) {
				//data_neu.push(data_alt[i]);
				data_neu[data_neu.length] = data_alt[i];
			}
		}
		if(data_neu.length > 0){
			var data_string = data_neu.join(" ");
			var data_sauber = data_string.replace(menu_id, "");	
			array = data_sauber.match(/\d+/g);
		}
	}
	var items = menu.getElementsByTagName("li");
	for(var i = 0; i < items.length; i++) {
		items[i].onclick = treeMenu_handleClick;
		if(!treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened")
		&& items[i].getElementsByTagName("ul").length
        + items[i].getElementsByTagName("ol").length > 0) {
			var classes = treeMenu_getClasses(items[i]);
			if(array.length > 0 && array[0] == i) {
					//classes.push("treeMenu_opened");
					classes[classes.length] = "treeMenu_opened";
			}
			else {
				//classes.push("treeMenu_closed");
				classes[classes.length] = "treeMenu_closed";
			}
			items[i].className = classes.join(" ");
			if(array.length > 0 && array[0] == i) {
				array.shift();
			}
		}
	}
}

/*
* Ändert die Klasse eines angeclickten Listenelements, sodass
* geöffnete Menüpunkte geschlossen und geschlossene geöffnet
* werden.
*
* event: Das Event Objekt, dass der Browser übergibt.
*/
function treeMenu_handleClick(event) {
	if(event == null) { //Workaround für die fehlenden DOM Eigenschaften im IE
		event = window.event;
		event.currentTarget = event.srcElement;
		while(event.currentTarget.nodeName.toLowerCase() != "li") {
			event.currentTarget = event.currentTarget.parentNode;
		}
		event.cancelBubble = true;
	}
	else {
		event.stopPropagation();
	}
	var array = treeMenu_getClasses(event.currentTarget);
	for(var i = 0; i < array.length; i++) {
		if(array[i] == "treeMenu_closed") {
			array[i] = "treeMenu_opened";
		}
		else if(array[i] == "treeMenu_opened") {
			array[i] = "treeMenu_closed"
		}
	}
	event.currentTarget.className = array.join(" ");
}

/*
* Gibt alle Klassen zurück, die einem HTML-Element zugeordnet sind.
* 
* element: Das HTML-Element
* return: Die zugeordneten Klassen.
*/
function treeMenu_getClasses(element) {
	if(element.className) {
		return element.className.match(/[^ \t\n\r]+/g);
	}
	else {
		return new Array(0);
	}
}

/*
* Überprüft, ob ein Array ein bestimmtes Element enthält.
* 
* array: Das Array
* element: Das Element
* return: true, wenn das Array das Element enthält.
*/
function treeMenu_contains(array, element) {
	for(var i = 0; i < array.length; i++) {
		if(array[i] == element) {
			return true;
		}
	}
	return false;
}

/*
* Gibt einen String zurück, indem die Nummern aller geöffneten
* Menüpunkte stehen. 
*
* menu: Referenz auf die Liste
* return: Der String
*/
function treeMenu_store(menu_id) {
	var menu = document.getElementById(menu_id);
	var result = new Array();
	var items = menu.getElementsByTagName("li");
	for(var i = 0; i < items.length; i++) {
		if(treeMenu_contains(treeMenu_getClasses(items[i]), "treeMenu_opened")) {
			//result.push(i);
			result[result.length] = i;
		}
	}
	//wenn im window.name Einträge existieren
	if(window.name != 0 && window.name != "" && window.name != null) {
		var altstring = unescape(window.name); //richtig??????????
	}
	//wenn im window.name keine Einträge existieren
	else{
		var altstring = "";
	}
	//wenn offene <li>'s vorhanden sind
	if(result != "") {
		var resultstring = result.join(" ");
		//var menustring = menu_id;
		var aktuellstring = menu_id.concat(resultstring);
	}
	//wenn keine offenen <li>'s vorhanden sind
	else {
		var aktuellstring = "";
	}
	
	////////////////////
	//wenn window.name leer ist und die aktuelle seite auch keine offenen <li>'s enthält
	if(altstring == "" && aktuellstring == "") {
		var neustring = "";
	}
	//wenn window.name leer ist und die aktuelle seite offene <li>'s enthält
	if(altstring == "" && aktuellstring != "") {
		var neustring = aktuellstring;
	}
	//wenn window.name nicht leer ist, gucken, ob die aktuelle menu_id schon im window.name vorhanden ist
	if(altstring != "") {
		var Suche = altstring.search(menu_id);
		//wenn die aktuelle menu_id nicht im window.name vorhanden ist und die seite keine offenen <li>'s besitzt
		if (Suche == -1 && aktuellstring == "") { 
			var neustring = altstring;
		}
		//wenn die aktuelle menu_id nicht im window.name vorhanden ist und die seite offene <li>'s besitzt
		if (Suche == -1 && aktuellstring != "") { 
			var neustring = altstring.concat('\n'+aktuellstring);
		}
		////wenn die aktuelle menu_id im window.name vorhanden ist
		//wenn die seite keine offenen <li>'s besitzt -> Eintrag aus window.name entfernen
		if (Suche != -1 && aktuellstring == "") { 
			var altstring_array = new Array();
			var neustring_array = new Array();
			var altstring_array = altstring.split('\n');
			for(var i = 0; i < altstring_array.length; i++) {
				if(altstring_array[i].search(menu_id) == -1) {
					//neustring_array.push(altstring_array[i]);
					neustring_array[neustring_array.length] = altstring_array[i];
					
				}
			}
			var neustring = neustring_array.join(" ");
		}
		//wenn die seite offene <li>'s besitzt -> Eintrag austauschen
		if (Suche != -1 && aktuellstring != "") { 
			var altstring_array = new Array();
			var neustring_array = new Array();
			var altstring_array = altstring.split('\n');
			for(var i = 0; i < altstring_array.length; i++) {
				//extra Abfragen bezgl. i nur, damit zu Beginn von windows.name nicht unendlich viele Zeilenumbrüche entstehen
				if(i == 0 && altstring_array[i].search(menu_id) != -1) {
					//neustring_array.push(aktuellstring);
					neustring_array[neustring_array.length] = aktuellstring;
				}
				else if(i != 0 && altstring_array[i].search(menu_id) != -1) {
					//neustring_array.push('\n' + aktuellstring);
					neustring_array[neustring_array.length] = '\n' + aktuellstring;
				}
				else if(i == 0 && altstring_array[i].search(menu_id) == -1) {
					//neustring_array.push(altstring_array[i]);
					neustring_array[neustring_array.length] = altstring_array[i];
				}
				else if(i != 0 && altstring_array[i].search(menu_id) == -1) {
					//neustring_array.push('\n' + altstring_array[i]);
					neustring_array[neustring_array.length] = '\n' + altstring_array[i];
				}
			}
			var neustring = neustring_array.join(" ");
		}
	}
	//alert ('seite verlassen - neustring: '+neustring); //####### test
	return neustring;
}

/*
window.onload=function() { treeMenu_init(document.getElementById('subnav1'), unescape(window.name).split(',')[0]);}
window.onunload=function() { window.name = escape(treeMenu_store(document.getElementById('subnav1')));}

Aufruf vom body aus: <body onload="treeMenu_init(document.getElementById('holstenhalle'), unescape(window.name).split(',')[0]);" onunload="window.name = escape(treeMenu_store(document.getElementById('holstenhalle')))">*/