function Menu() {
	this.nTimeout = 300;   /* Zeit für Timeout zum Schliessen des Menues beim verlassen */
	this.oTimeout = null;  /* Timeout-Objekt */
	this.cMenuID = 'topmenu'; /* ID der Node des Menues */
}

var oMenu = new Menu();

/* 
   Ermittelt die Node des Hauptmenüs. NodeID wird über Membervariable cMenuID definiert.
*/
Menu.prototype.getRoot = function() { 
	if (window.document.getElementById) return (window.document.getElementById(this.cMenuID));
	
}

/* static function 
   Fügt einer Node eine CSS-Klasse hinzu.
*/
Menu.prototype.addNodeClass = function (oNode, cAddClassName) {
	var cClass = oNode.className;
	oNode.className = cClass + (cClass == '' ? '' : ' ') + cAddClassName;
	//alert (oNode.className);
	//cClass = null;
}

/* 
   Schliesst das Menue.
*/
Menu.prototype.close = function() {
	var oRoot = this.getRoot();
	var aItems = oRoot.getItems();
	for (var i=0; i<aItems.length; i++) aItems[i].close();
}

/* 
   Initialisiert rekursiv alle Nodes des Menues. 
	 Fuegt CSS-Klassen 'hasChildren' oder 'last' hinzu.
	 Fuegt mouseover- / mouseout-Funktionalität hinzu.
*/
Menu.prototype.init = function() {
	oRoot = this.getRoot();
	
	/*
		Liefert die Node in dem sich die Untermenuepunkte dieser Node befinden.
	*/
	oRoot.getItemContainer = function() {
		for (var j=0; j<this.childNodes.length; j++) {
			if (this.childNodes[j].nodeName == 'UL') return (this.childNodes[j]);
		}
	}

	/*
		Liefert die Nodes der Untermenuepunkte dieser Node.
	*/
	oRoot.getItems = function() {
		var aItems = new Array();
		var oContainer = this.getItemContainer();
		if (oContainer){
			for (var i=0; i < oContainer.childNodes.length; i++) {
				var oChildNode = oContainer.childNodes[i];
				if (oChildNode.nodeName == 'LI') aItems[aItems.length] = oChildNode;
			}
		}
		return (aItems);
	}
	
	/*
		Initialisiert die Node (und rekursiv die Nodes ihrer Untermenuepunkte).
	*/
	oRoot.init = function () {
		
		var aItems = this.getItems();
		
		/* Der letzte Menuepunkt (einer jeden Ebene) erhaelt die CSS-Klasse 'last'. */
		if (aItems.length > 0) oMenu.addNodeClass (aItems[aItems.length-1], 'last');

		if (this != oMenu.getRoot()) {
			if (aItems.length > 0) {
				/*
					Hat ein Menuepunkt ein Untermenu wird die CSS-Klasse 'hasChildren' hinzugefuegt;
					bei existierender CSS-Klasse 'current' (Menuepunkt auf Pfad zur aktuellen Seite) wird
					die Klasse in 'currentHasChildren' geaendert.
				*/
				//if (this.className.match ('current'))
				//	this.className = this.className.replace ('current', 'currentHasChildren');
				//else
					oMenu.addNodeClass (this, 'hasChildren');
			}
			else{
				oMenu.addNodeClass (this, 'noChildren');
			}
			/*
				Bei Mouseover werden die Siblings geschlossen und die CSS-Klasse 'over' hinzugefügt.
			*/
			this.onmouseover = function() {
				if (oMenu){
					window.clearTimeout (oMenu.oTimeout);
					if (!this.className.match (/\s?over/)) {
						for (var j=0; j<this.parentNode.childNodes.length; j++) {
							var oSibling = this.parentNode.childNodes[j];
							if (oSibling.nodeName=='LI') {
								oSibling.close();
								oSibling = null;/* IELEAK */
							}
						}
						oMenu.addNodeClass (this, 'over');
					}
				}
			}
			
			/*
				CSS-Klasse 'over' wird entfernt, aller Untermenuepunkte werden ebenfalls geschlossen.
			*/
			this.close = function() {
				if (!this.className.match (/\s?static/)) this.className = this.className.replace(/\over/, '');
				var aItems = this.getItems();
				for (var i=0; i<aItems.length; i++) aItems[i].close();
			}
			
			if (this.parentNode.parentNode == oMenu.getRoot()) {
				/*
					Nur fuer die obersten Menuepunkte (indem sich auch alle aufgeklappten Untermenues befinden) 
					wird bei MouseOut der Timer zum Schliessen des Menues gestartet.
				*/
				this.onmouseout=function() {
					oMenu.oTimeout = window.setTimeout ('oMenu.close()', oMenu.nTimeout);
				}
			}
		}

		/* Nodes der Untermenuepunkte mit Methoden versehen und initialisieren; 
		   dabei andere Implementierung für getItemContainer. */
		for (var i=0; i<aItems.length; i++) {
			oItem = aItems[i];
			oItem.getItemContainer = function() {
				for (var j=0; j < this.childNodes.length; j++) {
					if (this.childNodes[j].nodeName == 'UL' || this.childNodes[j].nodeName == 'OL') return (this.childNodes[j]);
				}
			}
			oItem.getItems = this.getItems;
			oItem.init = this.init;
			oItem.init();
			oItem = null;/* IELEAK */
		}
		aItems = null;/* IELEAK */
	}
	
	oRoot.init();
	oRoot=null; /* IELEAK */
	// Statische Liste der Unterseiten ausblenden
	//var oSubpages = window.document.getElementById('subpages');
	//oSubpages.className = 'pageNav';
}

/*
window.onload = function() {
	oMenu.cMenuID = 'topmenucontainer';
	if (window.document.getElementById && !(document.all && navigator.platform.match (/Mac/))) {
		oMenu.init();	
	}
}
*/



/*  ########### DOJO ########################*/
var djConfig = {isDebug: true, debugAtAllCosts: true, parseWidgets: false};
	djConfig.ieClobberMinimal = true;
		
	function onDocumentLoad() {
		var topmenu = document.getElementById('topmenu');
		if (topmenu) {
			var UL = getDomChild (topmenu, 'ul');
			if (UL) {
				UL.onLoadMenuItems = function (type, xml) {
					if (type == "load" && xml.childNodes.length>0) {
						var Pg = getDomChild (xml.lastChild, 'Pg');
						if (Pg) {
							while (this.hasChildNodes()) this.removeChild (this.firstChild);
						
							var Sub = getDomChild (Pg, 'Sub');
							if (Sub) for (var i=0; i<Sub.childNodes.length; i++) {
								if (Sub.childNodes[i].nodeName == 'Pg') {
									this.addMenuPage (this, Sub.childNodes[i]);
								}
							}
						}
						oMenu.init();
					}
				};
				

				UL.addMenuPage = function (oUL, Pg, cDomain) {
					var cAccess = '' + Pg.getAttribute ('Access');
					var Lang = getDomChild (Pg, 'Lang');
					if (Lang && cAccess.match (/R/) && !(Pg.getAttribute ('Hide') == 'true')) {
						var L = getDomChild (Lang, 'L');
						while (L && L.getAttribute ('ID') != LangID && L.nextSibling) L = L.nextSibling;
						if (L) {
							var URL = L.getAttribute('URL');
							if (URL || cAccess.match (/W/)) {
								var cPath = (window.getRelativeWebRoot ? window.getRelativeWebRoot() : '');
								if (!URL)
									URL = cPath + 'Page' + Pg.getAttribute ('id') + '.html';
								else if (!URL.match (/^http:/))
									URL = cPath + URL + '.html';

								var LI = document.createElement("li");
								oUL.appendChild (LI);
								var A = document.createElement ("a");
								LI.appendChild (A);
								A.setAttribute ('href', URL);
								
								if (in_array(aPagePath,Pg.getAttribute('ID')) || Pg.getAttribute('ID') == PageID){
									A.className = 'current';
									//alert(A.className);
								}
								A.innerHTML = L.firstChild.nodeValue;
								//A.appendChild (document.createTextNode(L.firstChild.nodeValue));
								var Sub = getDomChild (Pg, 'Sub');
								if (Sub) {
									var SubUL = document.createElement('UL');
									for (var i=0; i<Sub.childNodes.length; i++) {
										if (Sub.childNodes[i].nodeName == 'Pg') {
											this.addMenuPage (SubUL, Sub.childNodes[i]);
										}
									}
									if (SubUL.hasChildNodes()) LI.appendChild (SubUL);
								}
							}
						}
					}
				};
				
				UL.loadMenu = function () {
					var _this = this;
					dojo.io.bind({url: 'MenuEntries.xml',
				    load: function (type, xml) {_this.onLoadMenuItems(type, xml);},
				    mimetype: "text/xml",
						useCache:true,
						preventCache:false,
						sendTransport:false});	
				};

				UL.loadMenu();				
			}
		}
	}
	
	function getDomChild (node, cName) {
		var cName = cName.toLowerCase();
		for (var i=0; i < node.childNodes.length; i++) {
			if(node.childNodes[i].nodeName.toLowerCase() == cName) return (node.childNodes[i]);
		}
		return (null);			
	}
	
	function in_array(a,p){
		for (i=0;i<a.length;i++)
			if (a[i] == p) return true
		return false
	}
