//------------------------------------------------------------------------------------------------------------------------
//Menu Steuerung in Java mit Hilfe des Prototype JavaScript framework, version 1.6.0.2
//Author: van Gelder Gerrit
//Version: 1.14
//------------------------------------------------------------------------------------------------------------------------
//Beschreibung:
//Es wird mit dem XML Dom Object, welches in der Browsern unterschiedlich implementiert ist,
//ein XML File eingeladen. Dieses entspricht einer DTD(Doc Type Definition) und enthält die
//Menu Struktur inklusive der Beschriftungen und Links. Diese XML Datei wird traversiert
//und es wird nach und nach der HTML Code zusammengestellt um das Menu darzustellen.
//Als Library für die DOM Zugriffe wird Prototype verwendet. Diese stellt Browserübergreifend
//einheitliche Zugriffsmöglichkeiten auf das DOM bereit. Das zusammengestellte Menu wird
//im Anschluss an die Zusammenstellung in die Homepage integriert. Darüber hinaus sind hier
//Funktionen für den Betrieb des Menus eingebaut. Dazu gehören unteranderem auf- & zuklapp
//Funktionen. Die Funktion menuOnClick wird bei Klicks im Menu aufgerufen und ist zentrale
//Sammelstelle für alle Funktionen welche im Menu integriert werden sollen.
//------------------------------------------------------------------------------------------------------------------------
//Änderungen:
//2008-03-28 (GVG)	-	Hilfsfunktionen ausgelagert
//				-	Titel aktualisierung wird nun beim reload des Iframes vorgenommen
//				-	Titel sind nun in den Inhaltsdateien abgelegt
//				-	Nun ist ein Vor und Zurück im Browser möglich ohne das die Titel nicht angepasst werden
//				-	Es werden nur noch Links in die Menueinträge eingefügt wenn auch tatsächlich ein Link im XML File hinterlegt ist
//2008-04-02 (GVG)	-	Try / Catch Block in die Initialize Funktion hinzugefügt
//2008-04-07 (GVG)	-	Indexierung der Menueinträge hinzugefügt
//2008-04-09 (GVG)	-	Indexierung der Menueinträge erweitert (id = Hierarchie-Ebene + einzigartige Nummer)
//				-	menuOnClick erweitert: es werden nun auch beim anklicken von Menupunkten (auf Hierarchie-Ebene 1) ohne Untermenu alle anderen Untermenus geschlossen
//2008-04-10 (GVG)	-	Markierung des Menueintrags, welcher als letzter angeklickt worden ist, hinzugefügt ( highlight(SUID) in tools.js abgelegt)
//------------------------------------------------------------------------------------------------------------------------


var xmlDoc;											//XML Dokument in dem die Menu Daten gespeichert sind
var par_className	= 'entryL';						//Parameter und Pfade
var menuBoxContent	= '';							//String als Puffer für die Menubox
var containerName	= 'menuBox';					//Container für das gesamte Menu
var uniqueID		= 0;							//Ein Zähler damit jedes Untermenu eine eindeutige Id erhält
var sUniqueID		= 0;							//Ein Zähler für einzigartige Nummerierung der Einträge im Menu
var	subStartClosed	= true;							//Parameter, welcher angibt ob die Menus am anfang geschlossen oder geöffnet sind
var closeSubs		= true;							//Parameter, welcher angibt ob beim Öffnen eines neuen Submenus alle anderen geschlossen werden
var noLinkString	= '#';							//Wird dieser String als Link übergeben so soll sich nicht der Titel ändern
var imgPath			= 'gfx/';						//Ort an dem die Bilder gespeichert sind


//------------------------------------------------------------------------------------------------------------------------
//Diese Funktion wird immer aufgerufen wenn der Inhalt des Iframes neu geladen wird.
//Funktionen welche beim Neuladen / Wechseln des Inhalts aufgerufen werden müssen
//hier eingetragen werde.
//------------------------------------------------------------------------------------------------------------------------
function iframeOnReload()
{
	resizeObject('cIframe');
	changeTitle('cIframe');
}

//------------------------------------------------------------------------------------------------------------------------
//In diese Funktion kommen alle Aufrufe rein welche beim onClick Event gefeuert werdne sollen
//Funktion wird immer aufgerufen wenn ein Menupunkt angeklickt wird.
//Es wird gebrauch gemacht von der Eigenschaft keine feste Parameter Anzahl festzulegen.
//Somit können nachträglich beliebig viele Parameter hinzugefügt werden.
//Wichtig ist dennoch die Reihenfolge bzw. Nummerierung der Parameter zu beachten!
//------------------------------------------------------------------------------------------------------------------------
function menuOnClick()
{
	var counterID;
	
	//(1)Markierung des angeklickten Menueintrages und demakierung aller anderen
	highlight(menuOnClick.arguments[1]);
	
	//(2)Wenn ein Menu Punkt auf oberster Ebene angeklickt worden ist, dann alle anderen Menus zu klappen
	if(menuOnClick.arguments[1])
	{
		if(menuOnClick.arguments[1].search(/l1/)+1)
		{
			counterID = 1;
			
			//Wichtig: Eigentlich muss eine Prüfung stattfinden ob eventuell ein Menupunkt angeklickt wurde welcher Untermenus enthält,
			//sonst würde sich dieser nach dem er geöffnet wurde direkt wieder schliessen. Daher werden erst alle Menus geschlossen und dann
			//weiter unten bei (3) das entsprechende wieder geöffnet
			while($(''+counterID))
			{
				$(''+counterID).hide();
				
				counterID += 1;
			}
		}
	}

	//(3)Wenn die UID übergeben worden ist ...
	if(menuOnClick.arguments[0])
	{
		//...Aufklappen / Zuklappen Untermenü
		$(menuOnClick.arguments[0]).show();

		//...Sub Menus schliessen beim öffnen eines Anderen
			counterID	=	1;
		var	parentID 	= 	parseInt($(menuOnClick.arguments[0]).ancestors()[0].getAttribute('id'));
		var	currentID	= 	parseInt(menuOnClick.arguments[0]);
		
		while($(''+counterID))
		{
			if ( (counterID != currentID) && (counterID != parentID) )
				$(''+counterID).hide();
			
			counterID += 1;
		}
	}
}

//------------------------------------------------------------------------------------------------------------------------
//Diese Funktion liest das XML File mit den Menu eintraägen aus, erstellt daraus ein Dokument
//Im Arbeitsspeicher mit dessen Hilfe das Menu erzeugt werden kann.
//------------------------------------------------------------------------------------------------------------------------
function startMenu(file)
{
	if (window.ActiveXObject)
	{   //Microsofts Dokument Objekt Model laden
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = false;
		xmlDoc.load(file);
		initialize();
	}
	else if (document.implementation && document.implementation.createDocument)
	{   //Standart DOM (Netscape,Firefox,Opera) laden
		xmlDoc = document.implementation.createDocument("","",null);
		xmlDoc.load(file);
		xmlDoc.onload = initialize;
	}
	else
	{   //Keines der DOM Objekte vorhanden, geplant ist ein Textparser (aber nicht möglich, da javascript kein Zugang zum Filesystem hat)
		alert('StartMenu: Fehler, Ihr Browser unterstützt kein XML.');
	}
}

//------------------------------------------------------------------------------------------------------------------------
//Diese Funktion führt alle notwendigen Schritte, um das Menu zu erstellen, in der richtigen
//Reihenfolge aus.
//------------------------------------------------------------------------------------------------------------------------
function initialize()
{
	//Nodes aus dem XML Files 
	try { xmlDoc = xmlDoc.documentElement; }
	catch(e) { alert('initialize: Fehler, konnte XML Objekt nicht initialisieren!'); }
	
	//Menu erstellen, Fehlermeldung auf Wunsch von KR angepasst
	try { createMenu(xmlDoc,1); }
	catch(e) { alert('Die Seite konnte nicht richtig angezeigt werden. Bitte deaktivieren sie gegebenenfalls Firebug und starten sie den Browser neu.'); } 
	
	//Menu in Homepage einfügen
	$(containerName).innerHTML = menuBoxContent;

	//Folgende Zeile erzeugt eine Ausgabe des Menus in ein Textfeld zum debuggen
	//$(containerName).innerHTML = "<textarea>"+menuBoxContent+"</textarea>";
}


//------------------------------------------------------------------------------------------------------------------------
//Diese Funktion erstellt aus dem XML Baum die Menu Einträge
//------------------------------------------------------------------------------------------------------------------------
function createMenu(myRoot,lvl)
{
	var i;
	var node;
	var link; //Diese Variable enthält den Link, und ist Notwendig um den NoLinkString zu erstezen durch ein javascript aufruf

	//traversieren der derzeitigen Ebene
	for (i = 0; i < myRoot.childNodes.length; i++)
	{
		node = myRoot.childNodes[i];
		
		//Prüfen ob es sich um ein Textnode handelt
		if (node != null && node.nodeType == 1)
		{
			if (node.childNodes.length > 0)
			{
				//----------------------------------------
				//Knoten besitzt Kindknoten
				//----------------------------------------

					sUniqueID += 1;
					uniqueID += 1;

					entry  = '<div id="l'+ lvl +'e'+sUniqueID+'" ';

					entry += 'class="' + par_className + lvl + '" ';										//Klasse der Darstellung
					entry += 'onClick="menuOnClick(\'' + uniqueID + '\', \'l'+ lvl +'e'+ sUniqueID + '\');"';			//Aufruf der menuOnClick Funktion (s.o.)
					
					entry += '>';
					
					//Überprüfen ob ein Link geöffnet werden soll oder nicht (dazu muss der noLinkString ins Menu XML File als Link eingetragen sein)
					if(node.getAttribute('link') != noLinkString)
					{
						entry += '<a target="cIframe" href="'+ node.getAttribute('link') +'">';				//Verlinkte Seite
						entry += node.getAttribute('cap');								//Beschriftung
						entry += '</a>\n';
					}
					else
					{
						entry += node.getAttribute('cap');								//Beschriftung
					}

					entry += '</div>\n';

					//Menupunkt in Sammel Variable einfügen (nachdem alles zusammengestellt ist, wird das Menu in die Homepage eingetragen)
					menuBoxContent += entry;
					
					//Untermenu Behälter Öffnungs-Tag hinzufügen ( berücksichtigt ob Submenus am Anfang geöffnet sein sollen)
										menuBoxContent += '<div id="' + uniqueID + '" ';
					if (subStartClosed)	menuBoxContent += 'style="display:none;"'; //SubMenus öffnen oder schliessen ? (siehe Parameter)
										menuBoxContent += '>\n';
									
					//Untermenus traversieren via Rekursiven Aufruf
					createMenu(node,lvl+1);
					
					//Untermenu Behälter schliessen
					menuBoxContent += '</div>\n';

			}
			else
			{	//----------------------------------------
				//Knoten besitzt keine Kindknoten
				//----------------------------------------

				sUniqueID += 1;

				entry  = '<div id="l'+ lvl +'e'+ sUniqueID +'" ';

				entry += 'class="' + par_className + lvl + '" ';
				entry += 'onClick="menuOnClick(null, \'l'+ lvl +'e'+ sUniqueID + '\');"';

				entry += '>';

				if(node.getAttribute('link') != noLinkString)
				{
					entry += '<a target="cIframe" href="'+ node.getAttribute('link') +'">';				
					entry += node.getAttribute('cap');								
					entry += '</a>\n';
				}
				else
				{
					entry += node.getAttribute('cap');								
				}		

				entry += '</div>\n';

				menuBoxContent += entry;
			}
		}//Ende Prüfung ob Text-Node
	}//Ende For-Schleife
}
