/*
	+++
	
	TMDomLib.js Version 0.5.3
	DHTML-Bibliothek
	
	Diese DHTML-Bibliothek stellt grundlegende Crossbrowser-DHTML-Funktionen bereit.
	Beruecksichtigt werden nur Browser, die die W3C-DOM-Syntax weitgehend verstehen.
	
	Kompatible Browser (Liste u.U. unvollstaendig):
	-	Mozilla-basierte Browser (Mozilla, Firefox/Firebird/Phoenix, Netscape 6+ etc.)
	-	Internet Explorer 5+
	-	Opera 6 (teilweise)
	-	Opera 7+
	-	Safari/KHTML
	
	Code:	Tobias Mueller 2004
	
	+++
	
	Die Funktionen im Ueberblick:

	TMDomInit()
		Ermittelt anhand unterstuetzter Methoden, ob der Browser des Benutzers ausreichend DOM-kompatibel ist und ermittelt in diesem Fall auch den Browser.


	TMGetEl(el)
		Regelt den Elementzugriff je nach uebergebenen Argumenten:
		-	Elementzugriff per getElementById, wenn nur ein Argument als String uebergeben wird
			Beispiel: TMGetEl('elementID'); --> Greift auf das Objekt mit der id 'elementID' zu.
		-	Elementzugriff per getElementsByName, wenn drei Argumente uebergeben werden, davon die ersten beiden als String wobei das zweite Argument 'name' lauten muss. Das dritte Argument muss die Indexnummer sein.
			Beispiel: TMGetEl('elementNAME','name',0);  --> Greift auf das erste Objekt mit dem Namen 'elementNAME' zu.
		-	Elementzugriff per getElementsByTagName, wenn drei Argumente uebergeben werden, davon die ersten beiden als String wobei das zweite Argument 'tagname' lauten muss. Das dritte Argument muss die Indexnummer sein.
			Beispiel: TMGetEl('img','tagname',3);  --> Greift auf das vierte img-Objekt(Bild) innerhalb des Dokuments zu.
		-	Wenn das erste Argument kein String, sondern vom Typ 'object' ist, wird es unveraendert zurueckgegeben.
			Beispiel: TMGetEl(document); --> gibt document zurueck
	
	
	TMSetCSS(el)
		Regelt den Zugriff auf die CSS-Eigenschaften eines Elements
		-	Dabei gilt im Prinzip das selbe wie bei TMGetEl(el), nur dass zusätzlich zum Element .style zurueckgeben wird.
			Beispiel: TMSetCSS('elementID').backgroundColor; --> gibt document.getElementById('elementID').style.backgroundColor; zurueck.
	

	TMSetVisibility()
		Setzt die CSS-Visibility-Eigenschaft eines oder mehrerer Elemente je nach uebergebenen Argumenten.
		Benoetigt TMGetEl(el)
		-	Pro Element muessen der Funktion in dieser Reihenfolge zwei Argumente uebergeben werden:
			-	Die ID des Elements.
			-	Der String 'ein', um das Element sichtbar zu machen, oder der String 'aus', um das Element unsichtbar zu machen.
		-	Es koennen der Funktion beliebig viele dieser Argumentpaare uebergeben werden und somit beliebig viele Elemente in ihrer Sichtbarkeit veraendert werden.
			Beispiel: TMSetVisibility('element1','ein','element2','aus'); --> Blendet Das Element mit der ID 'element1' ein und das mit der ID 'element2' aus.


	TMSetDisplay()
		Setzt die CSS-Display-Eigenschaft eines oder mehrerer Elemente je nach uebergebenen Argumenten.
		Benoetigt TMGetEl(el)
		-	Pro Element muessen der Funktion in dieser Reihenfolge zwei Argumente uebergeben werden:
			-	Die ID des Elements.
			-	Ein String mit der gewuenschten Display-Eigenschaft.
		-	Es koennen der Funktion beliebig viele dieser Argumentpaare uebergeben werden und somit die Display-Eigenschaft beliebig vieler Elemente veraendert werden.
			Beispiel: TMSetDisplay('element1','block','element2','none','element3','inline'); --> Setzt das Element mit der ID 'element1' auf display:block, das mit der ID 'element2' auf display:none und das mit der ID 'element3' auf display:inline.


	TMSetPosition()
		Setzt die X- und Y-Position eines oder mehrerer per CSS positionierter Elemente je nach uebergebenen Argumenten.
		Benoetigt TMGetEl(el)
		-	Pro Element muessen der Funktion in dieser Reihenfolge drei Argumente uebergeben werden:
			-	Die ID des Elements.
			-	Die gewuenschte X-Position des Elements als Ganzzahl.
			-	Die gewuenschte Y-Position des Elements als Ganzzahl.
		-	Es koennen der Funktion beliebig viele dieser Argumentpaare uebergeben werden und somit die Position beliebig vieler Elemente veraendert werden.
			Beispiel: TMSetPosition('element1',100,50,'element2',400,100); --> Setzt das Element mit der ID 'element1' auf die Position left:100px und top:50px und das mit der ID 'element2' auf die Position left:400px und top:100px.


	TMSetClip()
		Setzt die CSS-Clip-Werte eines oder mehrerer Elemente je nach uebergebenen Argumenten.
		Benoetigt TMGetEl(el)
		-	Pro Element muessen der Funktion in dieser Reihenfolge fuenf Argumente uebergeben werden:
			-	Die ID des Elements.
			-	Der obere ClipWert als Ganzzahl.
			-	Der rechte ClipWert als Ganzzahl.
			-	Der untere ClipWert als Ganzzahl.
			-	Der linke ClipWert als Ganzzahl.
		-	Es koennen der Funktion beliebig viele dieser Argumentpaare uebergeben werden und somit die Clip-Werte beliebig vieler Elemente veraendert werden.
			Beispiel: TMSetClip('element1',0,300,200,0); --> Setzt den Clip-Bereich des Elements mit der ID 'element1' auf clip:rect(0px, 300px, 200px, 0px).


	TMSetZ()
		Setzt den CSS-Z-Index eines oder mehrerer Elemente je nach uebergebenen Argumenten.
		Benoetigt TMGetEl(el)
		-	Pro Element muessen der Funktion in dieser Reihenfolge zwei Argumente uebergeben werden:
			-	Die ID des Elements.
			-	Der gweuenschte Z-Index als Ganzzahl.
		-	Es koennen der Funktion beliebig viele dieser Argumentpaare uebergeben werden und somit die Z-Index-Werte beliebig vieler Elemente veraendert werden.
			Beispiel: TMSetZ('element1',10,'element2',20); --> Setzt den Z-Index des Elements mit der ID 'element1' auf z-index:10 und den des Elements mit der ID 'element2' auf z-index:20.


	TMGetElemPosY(el)
		Ermittelt die Y-Position eines Elements und gibt diese zurueck.


	TMGetElemPosX(el)
		Ermittelt die X-Position eines Elements und gibt diese zurueck.


	TMGetMousePosition(e)
		Ermittelt die Mauspostion bei einem zu uebergebenden Event.
		Beruecksichtigt wird dabei die veraenderte Position durch eventuelles Scrollen des sichtbaren Bereichs, sowie die unterschiedliche Ermittlung desselben im IE 6 je nach Quirks- oder Standard-Modus.
		-	Die X-Position der Maus wird in der globalen Variablen xPosMaus gespeichert.
		-	Die Y-Position der Maus wird in der globalen Variablen yPosMaus gespeichert.
			Beispiele:	onclick="TMGetMousePosition(event);"
						document.onmousemove = TMGetMousePosition;
						TMAddEvent('elementID','click',TMGetMousePosition,false);


	TMAddEvent(el,handler,funktion,bubble)
		Registriert einen Event-Handler an einem Element nach dem Event-Modell des W3C bzw. im Falle des IE nach dem Microsoft-Event-Modell.
		Opera 6 muss draussen bleiben, weil er dieses fortgeschrittene Event-Handling nicht versteht.
		Benoetigt TMGetEl(el)
		-	Der Funktion muessen in dieser Reihenfolge vier Argumente uebergeben werden:
			-	Das Element, dem ein Event-Handler hinzugefuegt werden soll als String (ID des Elements) oder Objektreferenz (z.B. document).
			-	Der Event-Handler, der dem Element hinzugefuegt werden soll als String in Kleinschreibweise und ohne die Vorsilbe 'on'.
			-	Die Funktion, die bei Eintreten des Events aufgerufen werden soll als Objektreferenz.
			-	Ein Boolescher Wert (true oder false), der beim Event-Modell des W3C das Event-Bubbling bestimmt.
			Beispiel: TMAddEvent(document,'mousemove',TMGetMousePosition,false);


	TMRemoveEvent(el,handler,funktion,bubble)
		Deregistriert einen Event-Handler, der mit der Funktion TMAddEvent an einem Element registriert wurde.
		Opera 6 muss draussen bleiben, weil er dieses fortgeschrittene Event-Handling nicht versteht.
		Benoetigt TMGetEl(el)
		-	Der Funktion muessen in dieser Reihenfolge vier Argumente uebergeben werden:
			-	Das Element, von dem ein Event-Handler entfernt werden soll als String (ID des Elements) oder Objektreferenz (z.B. document).
			-	Der Event-Handler, der von dem Element entfernt werden soll als String in Kleinschreibweise und ohne die Vorsilbe 'on'.
			-	Die Funktion, die bei Registrierung des Events angegebne wurde als Objektreferenz.
			-	Ein Boolescher Wert (true oder false), der beim Event-Modell des W3C das Event-Bubbling bestimmt.
			Beispiel: TMRemoveEvent(document,'mousemove',TMGetMousePosition,false);


	TMWriteLn(text)
		Schreibt beim Rendern dynamisch Text oder Markup in das Dokument, wenn der Brwoser DOM unterstuetzt.
		-	Der Funktion muss als String der zu schreibenede Text uebergebenen werden
			Beispiel: TMWriteLn('<link rel="stylesheet" type="text/css" href="stil.css"/>'); --> Innerhalb eines Javascript-Bereichs im Head einer HTML-Datei notiert, wird in diesem Fall dynamisch ein Stylesheet eingebunden.

*/

function TMDomInit() {
	var agent = navigator.userAgent.toLowerCase();
	var os = navigator.platform.toLowerCase();
	var mac = (os.indexOf('mac') != -1) ? true : false;
	var isW3CDOM = (document.getElementById) ? true : false;
	if (window.opera && isW3CDOM) {
		isOPERA = true;
		isOPERA6 = (document.createElement && !document.addEventListener) ? true : false;
		isOPERA7 = (document.createElement && document.addEventListener) ? true : false;
	} else {
		isOPERA = false;
		isOPERA6 = false;
		isOPERA7 = false;	
	}
	if (document.all && isW3CDOM && !isOPERA) {
		isIE = true;
		isIE5 = (!document.createEventObject && !mac) ? true : false;
		isIE55 = (document.createEventObject && !document.compatMode && !mac) ? true : false;
		isIE6 = (document.compatMode && !mac) ? true : false;
		isIE5MAC = (mac) ? true : false;
	} else {
		isIE = false;
		isIE5 = false;
		isIE55 = false;
		isIE6 = false;
		isIE5MAC = false;
	}
	isKHTML = (isW3CDOM && document.clientWidth) ? true : false;
	isGECKO = (isW3CDOM && !isKHTML && !isIE && !isOPERA) ? true : false;
	isGECKOPR = (isGECKO && (agent.indexOf('rv') == -1) && !document.compatMode) ? true : false;
	isDOM = (isGECKO || isKHTML || isIE || isOPERA6 || isOPERA7) ? true : false;
}

TMDomInit();

function TMGetEl(el) {
	if (isDOM) {
		var a = arguments;
		if (typeof el == 'string') {
			if (a.length == 1) {
				return document.getElementById(el);
			} else if (a.length == 3 && typeof a[1] == 'string' && typeof a[2] == 'number') {
				if (a[1].toLowerCase() == 'name') {
					return document.getElementsByName(el)[a[2]];
				} else if (a[1].toLowerCase() == 'tagname') {
					return document.getElementsByTagName(el)[a[2]];
				}
			}
		} else if (typeof el == 'object') {
			return el;
		}
	}
}

function TMSetCSS(el) {
	if (isDOM) {
		var a = arguments;
		if (typeof el == 'string') {
			if (a.length == 1) {
				return TMGetEl(el).style;
			} else if (a.length == 3 && typeof a[1] == 'string' && typeof a[2] == 'number') {
				return TMGetEl(el,a[1],a[2]).style;
			}
		} else if (typeof el == 'object') {
			return el.style;
		}
	}
}
				
function TMSetVisibility() {
	if (isDOM) {
		var a = arguments;
		for (var i = 0; i<a.length-1; i+=2) {
			if (typeof a[i] == 'string' || typeof a[i] == 'object') {
				if (a[i+1].toLowerCase() == 'ein') {
					TMGetEl(a[i]).style.visibility = 'visible';
				} else {
					TMGetEl(a[i]).style.visibility = 'hidden';	
				}
			}
		}
	}
}

function TMSetDisplay() {
	if (isDOM) {
		var a = arguments;
		for (var i = 0; i<a.length-1; i+=2) {
			if (typeof a[i] == 'string' || typeof a[i] == 'object') {
				TMGetEl(a[i]).style.display = a[i+1];
			}
		}
	}
}

function TMSetPosition() {
	if (isDOM) {
		var a = arguments;
		for (var i = 0; i<a.length-2; i+=3) {
			if (typeof a[i] == 'string' || typeof a[i] == 'object') {
				TMGetEl(a[i]).style.left = a[i+1] + 'px';
				TMGetEl(a[i]).style.top = a[i+2] + 'px';
			}
		}
	}
}

function TMSetClip() {
	if (isDOM) {
		var a = arguments;
		for (var i = 0; i<a.length-4; i+=5) {
			if (typeof a[i] == 'string' || typeof a[i] == 'object') {
				TMGetEl(a[i]).style.clip = 'rect('+ a[i+1] +'px, ' + a[i+2] + 'px, ' + a[i+3] + 'px, ' + a[i+4] + 'px)';
			}
		}
	}
}

function TMSetZ() {
	if (isDOM) {
		var a = arguments;
		for (var i = 0; i<a.length-1; i+=2) {
			if (typeof a[i] == 'string' || typeof a[i] == 'object') {
				TMGetEl(a[i]).style.zIndex = a[i+1];
			}
		}
	}
}

function TMGetElemPosY(el) {
	var yPosEl = 0, element = el;
	while (typeof element == 'object') {
		yPosEl += element.offsetTop;
		if (element.tagName.toLowerCase() == 'body' || ((isIE6 && document.documentElement) && element.tagName.toLowerCase() == 'html')) {
			element = 0;
		}
		if (typeof(el.offsetParent) == 'object') {
			element = element.offsetParent;
		}
	}
	return yPosEl;
}
				
function TMGetElemPosX(el) {
	var xPosEl = 0, element = el;
	while (typeof element == 'object') {
		xPosEl += element.offsetLeft;
		if (element.tagName.toLowerCase() == 'body' || ((isIE6 && document.documentElement) && element.tagName.toLowerCase() == 'html')) {
			element = 0;
		}
		if (typeof(el.offsetParent) == 'object') {
			element = el.offsetParent;
		}
	}
	return xPosEl;
}

function TMGetMouse(e) {
	if (isDOM) {
		if (isIE) {
			var e = window.event;
		}
		mausPosX = e.clientX;
		mausPosY = e.clientY;
	}
}

function TMGetMousePlus(e) {
	if (isDOM) {
		var xOffset, yOffset;
		if (isIE) {
			e = window.event;
			if (document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) {
				xOffset = document.documentElement.scrollLeft;
				yOffset = document.documentElement.scrollTop;
			} else if (document.body) {
				xOffset = document.body.scrollLeft;
				yOffset = document.body.scrollTop;
			}
		} else {
			xOffset = window.pageXOffset;
			yOffset = window.pageYOffset;
		}
		mausPosXPlus = e.clientX + xOffset;
		mausPosYPlus = e.clientY + yOffset;
	}
}

function TMAddEvent(handler,funktion,obj) {
	var element = (obj == null) ? document : TMGetEl(obj);
	return element['on' + handler] = funktion;
}

function TMRemoveEvent(handler,obj) {
	var element = (obj == null) ? document : TMGetEl(obj);
	return element['on' + handler] = null;
}

function TMAddDom2Event(obj,handler,funktion,bubble) {
	if (isDOM && !isOPERA6) {
		var element = TMGetEl(obj);
		if (element.addEventListener) {
			element.addEventListener(handler,funktion,bubble);
		} else if (element.attachEvent) {
			element.attachEvent('on' + handler,funktion);
		}
	}
}

function TMRemoveDom2Event(obj,handler,funktion,bubble) {
	if (isDOM && !isOPERA6) {
		var element = TMGetEl(obj);
		if (element.removeEventListener) {
			element.removeEventListener(handler,funktion,bubble);
		} else if (element.detachEvent) {
			element.detachEvent('on' + handler,funktion);
		}
	}
}

function TMWriteLn(text) {
	if (isDOM) {
		document.writeln(text);
	}
}
