/*
DOM:
====

UL @id=XYZ
	LI				[over]:	mouseOverLi(evt)
										selbst mit Highlite-Klasse versehen				:: highliteLi(li)
										Siblings die Highlite klasse rausnehmen		:: for i in ... downliteLi(li)
										Siblings die U-Menüs ausblenden						:: hideSubmenu(li)
										Untermüs einblenden												:: showSubmenu(li)
										Zähler stoppen														:: stopMenuTimer(li)
						[out]:	selbst Highlite klasse rausnehmen					:: downliteLi(this)
										Zähler starten														:: startMenuTimer(li)
						[click]: unteres A ausführen
		A				[over und out]:	dito für parent: mouseOverLi(parentNode)
		UL
			LI
				A
				
Umgebungsvariabeln:
===================
window.ulKlappmenuMouseOverClasses[@id][0] = Mouseover Rootlevel
window.ulKlappmenuMouseOverClasses[@id][1] = Mouseover submenu 1
...
window.ulKlappmenuMouseOverClasses[@id][n] = Mouseover submenu n
		
*/
function ulKlappmenu(ulId, mouseOverClasses) {
	window.ulKlappmenuConfig = new Array();
	window.ulKlappmenuConfig[ulId] = new Array();
	window.ulKlappmenuConfig[ulId] = mouseOverClasses;
	lis = document.getElementById(ulId).getElementsByTagName("LI");
	for(j=0;j<lis.length;j++) {
		addEvent(lis[j], "mouseover", mouseOverLi);
		if(lis[j].getElementsByTagName("A")[0] != null) {addEvent(lis[j].getElementsByTagName("A")[0], "mouseover", mouseOverLiA);}
		if(lis[j].getElementsByTagName("SPAN")[0] != null) {addEvent(lis[j].getElementsByTagName("SPAN")[0], "mouseover", mouseOverLiSpan);}
		addEvent(lis[j], "mouseout", mouseOutLi);
		/*addEvent(lis[j], "click", goToChildHref);*/
	}
	timers[ulId] = null;
}
function mouseOverLi(evt) {
	li = getTarget(evt);
	if(li.nodeName == "LI") {
		highliteLi(li);
	}
	clearTimeout(timers[getRootUl(li).id]);
}
function mouseOverLiA(evt) {
	a = getTarget(evt);
	if(a.nodeName == "A") highliteLi(a.parentNode);
	clearTimeout(timers[getRootUl(a.parentNode).id]);
	
}
function mouseOverLiSpan(evt) {
	a = getTarget(evt);
	if(a.nodeName == "SPAN") highliteLi(a.parentNode);
	clearTimeout(timers[getRootUl(a.parentNode).id]);
	
}
function mouseOutLi(evt) {
	li = getTarget(evt);
	setMenuTimer(getRootUl(li).id);
}
function mouseOutLiA(evt) {
	a = getTarget(evt);
	if(a.nodeName == "A") removeAClass(a.parentNode, window.ulKlappmenuConfig[getRootUl(a.parentNode).id][getLevel(a.parentNode)-1]);
}
function highliteLi(li) {
	rootUl = getRootUl(li); 
	addAClass(li, window.ulKlappmenuConfig[rootUl.id][getLevel(li)-1]);
	showSubmenu(li);
	lis = rootUl.getElementsByTagName("LI");
	for(j=0;j<lis.length;j++) {
		if(!selfOrAnchestor(li, lis[j])) {
			removeAClass(lis[j], window.ulKlappmenuConfig[rootUl.id][getLevel(lis[j])-1]);
			hideSubmenues(lis[j]);
		}
	}
}
function selfOrAnchestor(li, otherLi) {
	if(li == otherLi) return true;
	else {
		isAnchestor = false;
		go = true;
		while(go) {
			if(go) li = li.parentNode;
			go = li.parentNode.nodeName == "LI" || li.parentNode.nodeName == "UL";
			if(li.nodeName=="LI") isAnchestor = isAnchestor || (li == otherLi);
		}
		return isAnchestor;
	}
}
function hideSubmenues(li) {
	uls = li.getElementsByTagName("UL");
	for(i=0;i<uls.length;i++) {
		uls[i].style.display="none";
	}
}
function showSubmenu(li) {
	submenu = li.getElementsByTagName("UL")[0];
	if(submenu) {
		submenu.style.display = "block";
		submenu.style.position = "absolute";
		if(li.parentNode.style.listStyle == "") {
			submenu.style.top = li.offsetTop + li.offsetHeight;
			submenu.style.left = li.offsetLeft;
			
			/**********
			 *
			 *			 Speziell für Eberspächer!!!
			 */
			lis = submenu.getElementsByTagName("LI");
			if(lis) {
				if(lis.length > 3) {
					for(i=4;i<lis.length;i++) {
						lis[i].style.position = "absolute";
						lis[i].style.top = li.offsetTop + ((i-4) * lis[0].offsetHeight) + "px";
						lis[i].style.left = lis[0].offsetWidth+"px";
						lis[i].style.width = lis[0].offsetWidth+"px";
					}
				}
			}
// 			
			
		}
	}
}
// Damit man nicht genau die Links treffen muss:
function goToChildHref(evt) {
		//Get the firing Element
	li = getTarget(evt);
	location.href = li.childNodes[0].href;
}

//Setzt Klasse oder fügt diese hinzu
function addAClass(obj, classname) {
	if(obj && obj.className) {
		if(obj.className.indexOf(classname) == -1) {
			if(obj.className == "") obj.className = classname;
			else obj.className += " "+classname;
		}
	}
}
function removeAClass(obj, classname) {
	if(obj && obj.className) {
		//classname überhaupt vorhanden?
		if(obj.className.indexOf(classname) > -1) {
			//classname ist in Token?
			if(obj.className.indexOf(" "+classname) > -1) {
				obj.className = obj.className.replace(" "+classname, "");
			} else {	//classname ist beginn von Token?
				if(obj.className.indexOf(classname+" ") > -1) {
					obj.className = obj.className.replace(classname+" ", "");
				} else {
					obj.className = "";
				}
			}
		}
	}
}
function setMenuTimer(id) {
	clearTimeout(timers[id]);
	timers[id] = setTimeout("downliteMenu('"+id+"')", 1000);
}
function downliteMenu(id) {
	rootUl = document.getElementById(id);
	lis = rootUl.getElementsByTagName("LI");
	for(j=0;j<lis.length;j++) {
		removeAClass(lis[j], window.ulKlappmenuConfig[rootUl.id][getLevel(lis[j])-1]);
		hideSubmenues(lis[j]);
	}
}
function getRootId(li) {
	return getRootUl(li).id;
}
function getRootUl(li) {
	go = true;
	while(go) {
		if(li.parentNode.nodeName == "UL") retr = li.parentNode.id;
		go = li.parentNode.nodeName == "LI" || li.parentNode.nodeName == "UL";
		if(go) li = li.parentNode;
	}
	return li;
}
function getLevel(li) {
	level = 0;
	go = true;
	while(go) {
		if(li.parentNode.nodeName == "UL") level++;
		go = li.parentNode.nodeName == "LI" || li.parentNode.nodeName == "UL";
		li = li.parentNode;
	}
	return level;
}
//Hilfsfunktionen
function addEvent(obj, evType, fn){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    return false;
	}
}
function getTarget(evt) {
      if(evt.srcElement) return evt.srcElement;
      else return evt.target;
}
