
// ---- <Config> ----

var NAVI_URL_COMPARE_DEPTH = 4;											// URL-Segmenttiefe fuer Vergleich, ob Navi Ebene 1 aktiv ist
var ID_AKT_MEN_DIV = 'aktSubMen';										// div-ID für Anzeigebereich aktive Navi Ebene 2
var NAVI_MOUSEOVER_BACKGROUND = "url(/tlt/pic/naviOn.gif)";		// bg-Grafik Navi Ebene 1 bei mouseover
var NAVI_MOUSEOUT_BACKGROUND = "url(/tlt/pic/naviOff.gif)";		// bg-Grafik Navi Ebene 1 bei mouseout

// ---- </Config> ----

if (!d) var d = document;


// -----------------------------------------------------------------------------

/**
* JavaScript-Include
*
* @return void
* @author Niels Bobogk <niels@i-d.de>
*/
function include(path) {
	if (!d.createElement) {
		return;
	}
	var s = d.createElement('script');
	if (s) {
		try {
			s.setAttribute('type', 'text/javascript');
			s.setAttribute('src', path);
			s.setAttribute('charset', 'iso-8859-1');
			var head = d.getElementsByTagName('head')[0];
			if (head) {			
				head.appendChild(s);
			}
		} catch (e) {
			return (e);	
		}
	}
}



// -----------------------------------------------------------------------------

/**
* für Flexmodul popup_fixwin
* Öffnet ein Bild in gegebenen Maßen im neuen Browaserfenster
*
* @return void
* @author Dirk Hildebrandt <hille@i-d.de>
*/
function picwin(pfad, winname, options) {
	var win = window.open(pfad, winname, options);
}


// -----------------------------------------------------------------------------

/**
* falls Prototype nicht geladen wurde, wird in einer Zeitschleife gewartet,
* bis die erforderlichen Funktionen zur Verfuegung stehen
*
* @return void
*/
function waitPrototype() {
	if (typeof Prototype != 'undefined') {
		window.clearTimeout(d.to);
		// Opera führt schon eher aus, daher so:
		Prototype.Browser.Opera ? Event.observe(window, 'load', decodeEMail) : decodeEMail();			
	} else {
		d.to = window.setTimeout('waitPrototype()', 1000);
	}
}




// -----------------------------------------------------------------------------

// zum Auffinden von maskierten E-Mail-Adressen
// geklammerte Elemente werden als Gruppe im Ergebnis der RegExp-Suche behandelt...
var EMAIL_PATTERN  = /([a-zA-Z0-9\._-]+)(\[at\])([a-zA-Z0-9\._-]+)(\[punkt\])([a-zA-Z]+)/i;
// ... und werden durch die folgende Werte ersetzt;
// leeres Feld bedeutet, das der urspruengliche Wert erhalten bleibt
// ACHTUNG: in Feld 0 steht immer das komplette Ergebnis; die Indizierung der
// geklammerten Ergebnisse beginnt also mit 1 (eins)!
var EMAIL_REPLACES = new Array (5);
EMAIL_REPLACES[2] = '@';
EMAIL_REPLACES[4] = '.';

// -----------------------------------------------------------------------------

/**
* cross-Browser Elementerfassung
*
* @param object Referenz auf zu erfassendes Objekt
* @return object Objektkoordinaten von elem
*/
function getPos(elem) { 
	var pos = {x:0, y:0}; 
	var o = elem; 
	while(o) { 
		pos.y += o.offsetTop; 
		pos.x += o.offsetLeft; 
		o = o.offsetParent; 
	} 
	return pos; 
}

//-----------------------------------------------------------------------------------------------------

/**
* cross-Browser Elementerfassung
*
* @param string id des zu erfassenden Elements
* @return object, wenn Element erfasst wurde, sonst null
*/
function getElement(id) {
	var element;
	if (document.all) return document.all[id];
	else if (document.layers) return document.layers[id];
	else if (document.getElementById) return document.getElementById(id);
	else return null;
}

//-----------------------------------------------------------------------------------------------------

/**
* blendet html-selects im IE aus, da sich dort diese nicht
* überlagern lassen (z-index)
*
* @return void
*/
function hideSelect() {
	var allSelects = document.getElementsByTagName('select');
	if (document.all && !window.opera) {
		for (var i = 0; i < allSelects.length; i++) {
			allSelects[i].style.visibility = 'hidden';
		}
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* blendet html-selects im IE ein, welche mit hideSelect() ausgeblendet wurden
*
* @return void
*/
function showSelect() {
	var allSelects = document.getElementsByTagName('select');
	if (document.all && !window.opera) {
		for (var i = 0; i < allSelects.length; i++) {
			allSelects[i].style.visibility = 'visible';
		}
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* vergleicht einen (Linkverweis)URL mit dem location-URL bis zur
* angegebenen Segmenttiefe "urldepth"; Segementtrenner ist "/" in URL
*
* @param string URL des Linkverweises
* @param integer Anzahl/Tiefe der zu vergleichenden URL-Segmente von links an
* @return bool true, wenn bis zur angegebenen Segmenttiefe uebereinstimmt; sonst false
*/
function isActiveNavi (a, urldepth) {
	// URL aufsplitten
	var url = document.location.href.split("/");
	var a = a.href.split("/");
	for (var i = 0; i <= urldepth && i < url.length; i++) {		
		if (url[i] != a[i]) {
			//alert(url[i] + "\n" + a[i]);
			return false;
		}
	}
	return true;
}

//-----------------------------------------------------------------------------------------------------

/**
* Objekt zur Erfassung eines Navielement;
* besteht aus Listenelement, Link, untergeordneter Liste (Navi Ebene 2)
*
* @param object Objektreferenz auf Listenelement
* @return object, wenn Element erfasst wurde, sonst null
*/
function naviItem(li) {
	var d = document;
	
	// Listenelement mit Hauptnavigationspunkt
	this.li = (li) ? li : null;
	this.on = false;
	this.active = false;
	this.divAktSub = false;
	
	// Link Navi Ebene 1
	if (!this.a) {
		if (this.li && this.li.childNodes) {
			// der erste untergeordnete Anker wird als Link angenommen
			for (var i = 0; i < this.li.childNodes.length; i++) {
				if (this.li.childNodes[i].nodeName.toLowerCase() == 'a') {
					this.a = this.li.childNodes[i];
					break;
				}
			}
		}
	}
	
	// ul-Liste Navi Ebene 2
	if (!this.ul) {
		if (this.li && this.li.childNodes) {
			for (var i = 0; i < this.li.childNodes.length; i++) {
				if (this.li.childNodes[i].nodeName.toLowerCase() == 'ul') {
					this.ul = this.li.childNodes[i];				
					break;
				}
			}
		}
	}
	
	
	/**
	* positioniert aktives Subelement-DIV
	*
	* @return void
	*/
	this.posAktDiv = function () {
		if (this.active) {
			var divPos = getPos(this.a);							
			
			this.divAktSub.style.left = parseInt(divPos.x) + 'px';
			this.divAktSub.style.top = parseInt(divPos.y) + parseInt(this.a.offsetHeight) + 'px';
			// +12px wegen padding
			this.divAktSub.style.width = parseInt(this.a.offsetWidth) - 12 + 'px';
		}
	}

	// aktiven Navipunkt setzen
	if (isActiveNavi(this.a, NAVI_URL_COMPARE_DEPTH)) {
		this.active = true;
		this.a.style.background = NAVI_MOUSEOVER_BACKGROUND;
		
		// aktiven Submenüpunkt setzen
		for (var i = 0; i < this.ul.childNodes.length && i < 50; i++) {
			// Anker in Listenelement
			if (this.ul.childNodes[i].hasChildNodes) {
				var lis = this.ul.childNodes[i].childNodes;
				
				for (var a = 0; a < lis.length && a < 50; a++) {
					// Link erfassen
					if (lis[a].nodeName.toLowerCase() == 'a') {
						// Link mit URL vergleichen
						//alert(lis[a] + "\n" + location.href);
						if (isActiveNavi(lis[a], NAVI_URL_COMPARE_DEPTH + 1)) {
							// aktiven Subnavi-DIV befuellen, positionieren und einblenden
							if (d.getElementById(ID_AKT_MEN_DIV) && lis[a].innerHTML) {
								this.divAktSub = d.getElementById(ID_AKT_MEN_DIV);
								this.divAktSub.innerHTML = '<a href="' + lis[a] + '" style="color:#FFF">' + lis[a].innerHTML + '</a>';
								this.posAktDiv();
								this.divAktSub.style.visibility = 'visible';
							}
						}
					}
				}
			}
		}
	}
	
	// auf hendheld ist subnavi eingeblendet, daher hier den Startwert merken als Unterscheidung
	this.ulStartVis = this.ul.style.visibility;
	this.aStartBgImg = this.a.style.backgroundImage;
	
	/**
	* einblenden des zum Objekt gehoerenden Submenues (Navi Ebene 2)
	*
	* @return void
	*/
	this.show = function() {
		// offset des parent abfragen, da bei absoluter Positionierung dieses der Bezugspunkt ist
		var pos = getPos(this.a);
		if (this.a.style.background != 'none') this.a.style.background = NAVI_MOUSEOVER_BACKGROUND;
		this.on = true;
		this.ul.style.left = parseInt(pos.x) + 'px';
		this.ul.style.top = parseInt(pos.y) + parseInt(this.a.offsetHeight) + 'px';
		if (this.a.offsetWidth) this.ul.style.width = parseInt(this.a.offsetWidth) + 'px';
		if (this.divAktSub) this.divAktSub.style.visibility = 'hidden';
		this.ul.style.visibility = 'visible';
	}
	
	/**
	* ausblenden des zum Objekt gehoerenden Submenues (Navi Ebene 2)
	*
	* @return void
	*/
	this.hide = function() {
		if (!this.active) this.a.style.background = this.aStartBgImg;
		//this.ul.style.visibility = 'hidden';
		this.ul.style.visibility = this.ulStartVis
		this.on = false;
		if (this.divAktSub) this.divAktSub.style.visibility = 'visible';
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* ermittelt, welches Submenue bei Mouseover eingeblendet werden soll
*
* @param object window.event
* @return void
*/
function showSubMenu(evt) {
	var e = (evt) ? evt : window.event;
	var d = document;
	var eSrc = false;
	
	// Event-Quelle je nach Browser
	if (e.srcElement) {
		eSrc = e.srcElement;
		var eX = e.clientX;
		var eY = e.clientY;
	}
	else if (e.target) {
		eSrc = e.target;
		var eX = e.pageX;
		var eY = e.pageY;
	}
	
	if (eSrc && d.arrNavi) {		
		for (var naviItem = 0; naviItem < d.arrNavi.length; naviItem++) {
			
			if (eSrc == d.arrNavi[naviItem].a) {
				if(document.all && !window.opera) hideSelect();
				d.arrNavi[naviItem].show();
			}
		}
	}
}

//-----------------------------------------------------------------------------------------------------

function showSubMenuFocus(evt) {
	var e = (evt) ? evt : window.event;
	var d = document;
	var eSrc = false;
	var menuefocus = false;	// falls kein Menü den Focus hat, dann Selects im IE wieder einblenden
	
	// Event-Quelle je nach Browser
	if (e.srcElement) {
		eSrc = e.srcElement;
		var eX = e.clientX;
		var eY = e.clientY;
	}
	else if (e.target) {
		eSrc = e.target;
		var eX = e.pageX;
		var eY = e.pageY;
	}

	if (eSrc && d.arrNavi) {		
		// durch alle Navi Ebene 1
		for (var naviItem = 0; naviItem < d.arrNavi.length; naviItem++) {		
			var isOn = false;
			
			// wenn Eventquelle ein Navielement 1. Ebene ist, dann zugehoerige 2. Ebene einblende
			if (eSrc == d.arrNavi[naviItem].a) {
				isOn = true;
			}
			// sonst checken, ob Eventelement ein untergeordnetes Element diese Navielements ist;
			// nur wenn nicht, dann Subnavi ausblenden (damit Submenue beim Tab-schalten ON bleibt)
			else {
				// nur von Interesse, wenn NaviItem aktiv geschaltet
				if (d.arrNavi[naviItem].ul.childNodes) {
					
					// durch alle childs des UL-Menue => LIs
					for (var li = 0; li < d.arrNavi[naviItem].ul.childNodes.length; li++) {
						if (eSrc == d.arrNavi[naviItem].ul.childNodes[li]) {
							isOn = true;
						}
						else {
							// durch alle childs des LIs
							for (var a = 0; d.arrNavi[naviItem].ul.childNodes[li].childNodes && a < d.arrNavi[naviItem].ul.childNodes[li].childNodes.length; a++) {
								if (eSrc == d.arrNavi[naviItem].ul.childNodes[li].childNodes[a]) {
									isOn = true;
								}
							}
						}
					}
				}
			}
			
			// ein- oder ausblenden
			if (isOn) {
				if(document.all && !window.opera) hideSelect();
				d.arrNavi[naviItem].show();
				menuefocus = true;
			}
			else {
				d.arrNavi[naviItem].hide();
			}
		}
	}
	
	if (!menuefocus && document.all && !window.opera) showSelect();
}

//-----------------------------------------------------------------------------------------------------

/**
* checkt bei mousemove, ob sich Maus über einem aktiven Menü befindet
* wenn nicht, wird Submenü ausgeblendet
*
* @param object window.event
* @return void
*/
function hideSubMenu(evt) {
	var e = (evt) ? evt : window.event;
	var d = document;
	var eSrc = false;
	
	if (e.srcElement) {
		eSrc = e.srcElement;
		var eX = e.clientX;
		var eY = e.clientY;
	}
	else if (e.target) {
		eSrc = e.target;
		var eX = e.pageX;
		var eY = e.pageY;
	}
	
	if (eSrc && d.arrNavi) {
		for (var i = 0; i < d.arrNavi.length; i++) {
			if (d.arrNavi[i].on) {
				// submenue nur verstecken, wenn Mousezeiger nicht mehr drueber
				var pos = getPos(d.arrNavi[i].a);
				var isX = (pos.x <= eX) && (pos.x + d.arrNavi[i].a.offsetWidth >= eX);
				var isY = (pos.y <= eY) && (pos.y + d.arrNavi[i].a.offsetHeight + d.arrNavi[i].ul.offsetHeight >= eY);
				if (!(isX && isY))  {
					d.arrNavi[i].hide();
					// Selects wieder einblenden
					if (document.all && !window.opera) showSelect();
					return;
				}
			}
		}
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* den aktiven Submenuepunkt nach Window-resize neu positionieren
*
* @return void
*/
function onresize() {
	var d = document;
	
	// aktives Submenue positionieren
	if (d.arrNavi) {	
		for (var i = 0; i < d.arrNavi.length; i++) {
			if (d.arrNavi[i].active) {
				d.arrNavi[i].posAktDiv();
				return;
			}
		}
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* externe Links in neuem Fenster wg. XHtml-strict
* (strict hat kein "target"-Attribut mehr bei a)
*
* @return void
*/
function externalLinks() {
	if (!document.getElementsByTagName) return;
	var anchors = document.getElementsByTagName("a");
	for (var i=0; i<anchors.length; i++) {
  		var anchor = anchors[i];
		if (anchor.getAttribute("href") && anchor.getAttribute("rel") == "external") anchor.target = "_blank";
	}
}

//-----------------------------------------------------------------------------------------------------

/**
* Initialisierung der Navigation (ul mit id "navi")
*
* @return void
*/
function init() {
	var d = window.document;
	var ulNavi = getElement('navi');
	var curLi;
	
	// durch alle li von ul#navi laufen und Navi-Elemente zuenden
	if (ulNavi && ulNavi.hasChildNodes()) {
		// Navigationselemente in globalem Array speichern
		if (!d.arrNavi) d.arrNavi = new Array();
		
		// durch alle li in navi laufen und diese als NaviItems registrieren
		for (var i = 0; i < ulNavi.childNodes.length; i++) {
			curLi = ulNavi.childNodes[i];	
			
			// Listen als Untermenues
			if (curLi.nodeName && curLi.nodeName.toLowerCase() == 'li') {
				curLi = new naviItem(curLi);
				d.arrNavi.push(curLi);
			}
		}
	}
	
	externalLinks ();
	decodeEMail ();
}

//-----------------------------------------------------------------------------------------------------


/**
* ersetzt maskierte Mail-Adressen sowohl in Textknoten als auch in
* mailto-Links
*
* @author Niels Bobogk <niels@i-d.de>
* @return void
*/
function decodeEMail() {
	// zunaechst alle mailto-Links bearbeiten
	var a = d.links;
	var matches, newEMail;

	// href aller mailto-links ersetzen
	for (var i = 0; i < a.length; i++) {
		matches = EMAIL_PATTERN.exec(a[i].href);
		if (matches != null) {
			a[i].href = a[i].href.replace(EMAIL_PATTERN, replaceMaskedEMail(matches));
			
		};
	}	
	// alle Textknoten filtern
	decodeEMailInText(d.body);
}

// -----------------------------------------------------------------------------

/**
* durchsucht rekursiv die Textknoten ab einer bestimmten Stelle nach
* maskierten E-Mailadressen
*
* @author Niels Bobogk <niels@i-d.de>
* @param object node: Startknoten (z.B. 'document.body')
* @return void
*/
function decodeEMailInText(nodeCurr) {
	for (var i = 0; i < nodeCurr.childNodes.length; i++) {
		decodeEMailInText(nodeCurr.childNodes[i]);	
	}
	// Textknoten?
	if (nodeCurr.nodeType == 3) {
		var matches = EMAIL_PATTERN.exec(nodeCurr.nodeValue);
		if (matches != null) {
			nodeCurr.nodeValue = nodeCurr.nodeValue.replace(EMAIL_PATTERN, replaceMaskedEMail(matches));
		};	
	}
}

// -----------------------------------------------------------------------------

/**
* maskierte E-Mail-Adresse umwandeln
*
* @param match auf maskierte E-Mail-Adresse
* @return string
*/
function replaceMaskedEMail(matches) {
	var newEMail = '';
	
	try {		
		if (matches != null) {		
			// Indizierung der Gruppen beginnt ab Feld 1 !
			for (var i = 1; i < matches.length; i++) {
				// urspruenglichen Wert behalten
				if (EMAIL_REPLACES[i] == null || EMAIL_REPLACES[i] == '') {
					newEMail += matches[i];
				}
				// Wert ersetzen
				else {
					newEMail += EMAIL_REPLACES[i];
				}
			}
		}
	} 
	catch (e) {
		newEMail = "FEHLER: " + e;	
	}
	return 	newEMail;
}

// -----------------------------------------------------------------------------

document.onmouseover = showSubMenu;
// IE bubbelt onfocus nicht, daher IE-prop. Event
if (document.all) {
	document.onactivate = showSubMenuFocus;
}
else {
	document.onfocus = showSubMenuFocus;
}
document.onmousemove = hideSubMenu;
window.onresize = onresize;
window.onload = init;
