/*
    +++
    
    TMDomLib.js Version 0.6.1
    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.


    TMSucheElem(el)
        Regelt den Elementzugriff je nach uebergebenen Argumenten:
        -   Elementzugriff per getElementById, wenn nur ein Argument als String uebergeben wird
            Beispiel: TMSucheElem('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: TMSucheElem('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: TMSucheElem('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: TMSucheElem(document); --> gibt document zurueck
    
    
    TMCSS(el)
        Regelt den Zugriff auf die CSS-Eigenschaften eines Elements
        -   Dabei gilt im Prinzip das selbe wie bei TMSucheElem(el), nur dass zusätzlich zum Element .style zurueckgeben wird.
            Beispiel: TMCSS('elementID').backgroundColor; --> gibt document.getElementById('elementID').style.backgroundColor; zurueck.
    

    TMCSSVisibility()
        Setzt die CSS-Visibility-Eigenschaft eines oder mehrerer Elemente je nach uebergebenen Argumenten.
        Benoetigt TMSucheElem(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: TMCSSVisibility('element1','ein','element2','aus'); --> Blendet Das Element mit der ID 'element1' ein und das mit der ID 'element2' aus.


    TMCSSDisplay()
        Setzt die CSS-Display-Eigenschaft eines oder mehrerer Elemente je nach uebergebenen Argumenten.
        Benoetigt TMSucheElem(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.


    TMCSSPosition()
        Setzt die X- und Y-Position eines oder mehrerer per CSS positionierter Elemente je nach uebergebenen Argumenten.
        Benoetigt TMSucheElem(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: TMCSSPosition('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.


    TMCSSClip()
        Setzt die CSS-Clip-Werte eines oder mehrerer Elemente je nach uebergebenen Argumenten.
        Benoetigt TMSucheElem(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: TMCSSClip('element1',0,300,200,0); --> Setzt den Clip-Bereich des Elements mit der ID 'element1' auf clip:rect(0px, 300px, 200px, 0px).


    TMCSSZindex()
        Setzt den CSS-Z-Index eines oder mehrerer Elemente je nach uebergebenen Argumenten.
        Benoetigt TMSucheElem(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: TMCSSZindex('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.


    TMErstelleEvent(obj,handler,funktion)
        Registriert einen Event-Handler an einem Element je nach uebergebenen Argumenten entweder nach dem Event-Modell des DOM-Level 0 oder dem des W3C-DOM-Level 2 bzw. im Falle des IE nach dem Microsoft-Event-Modell.
        Benoetigt TMSucheElem(el)
        -   Event-Registrierung nach dem Model des DOM-Level 0:
            Der Funktion muessen in dieser Reihenfolge die drei im Folgenden beschriebenen 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.
                Beispiel: TMErstelleEvent(document,'mousemove',TMSucheMaus);
        -   Event-Registrierung nach dem Model des DOM-Level 2:
            Zusatzlich zu den drei oben genannten Argumenten muss der Funktion folgendes viertes Argument uebergeben werden:
                -   Ein Boolescher Wert (true oder false), der beim Event-Modell des W3C das Event-Bubbling bestimmt.
                Beispiel: TMErstelleEvent(document,'mousemove',TMSucheMaus,false);


    TMEntferneEvent(obj,handler,funktion)
        Entfernt einen Event-Handler von einem Element je nach uebergebenen Argumenten entweder nach dem Event-Modell des DOM-Level 0 oder dem des W3C-DOM-Level 2 bzw. im Falle des IE nach dem Microsoft-Event-Modell.
        Benoetigt TMSucheElem(el)
        -   Event-Deregistrierung nach dem Model des DOM-Level 0:
            Der Funktion muessen in dieser Reihenfolge die zwei im Folgenden beschriebenen 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'.
                Beispiel: TMEntferneEvent(document,'mousemove');
        -   Event-Deregistrierung nach dem Model des DOM-Level 2:
            Zusatzlich zu den zwei oben genannten Argumenten muessen der Funktion folgende zwei Argumente in dieser Reihenfolge uebergeben werden:
                -   Die Funktion, die bei Registrierung des Events angegeben wurde als Objektreferenz.
                -   Ein Boolescher Wert (true oder false), der beim Event-Modell des W3C das Event-Bubbling bestimmt.
                Beispiel: TMEntferneEvent(document,'mousemove',TMSucheMaus,false);


    TMSucheMaus(e)
        Ermittelt die Mauspostion bei einem zu uebergebenden Event und gibt diese zurueck.
        Beruecksichtigt wird dabei die veraenderte Position durch eventuelles Scrollen des sichtbaren Bereichs.
        -   Die X- und Y-Position wird in einem Objekt gespeichert, das zurückgegeben wird. Zugriff auf X- und Y-Position siehe Beispiele.
            Beispiele:  var MausPosX = TMSucheMaus(e).x; (X-Position OHNE Beruecksichtigung des Scrollens der Seite)
                        var MausPosY = TMSucheMaus(e).y; (Y-Position OHNE Beruecksichtigung des Scrollens der Seite)
                        var MausPosXPlusScrollPosition = TMSucheMaus(e).xo; (X-Position unter Beruecksichtigung des Scrollens der Seite)
                        var MausPosYPlusScrollPosition = TMSucheMaus(e).yo; (Y-Position unter Beruecksichtigung des Scrollens der Seite)


    TMSchreibeZeile(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: SchreibeZeile('<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 TMSucheElem(obj) {
    if (isDOM) {
        var a = arguments;
        if (typeof obj == 'string') {
            if (a.length == 1) {
                return document.getElementById(obj);
            } else if (a.length == 3 && typeof a[1] == 'string' && typeof a[2] == 'number') {
                if (a[1].toLowerCase() == 'name') {
                    return document.getElementsByName(obj)[a[2]];
                } else if (a[1].toLowerCase() == 'tagname') {
                    return document.getElementsByTagName(obj)[a[2]];
                }
            }
        } else if (typeof obj == 'object') {
            return obj;
        }
    }
}

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

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

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

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

function TMCSSZindex() {
    if (isDOM) {
        var a = arguments;
        for (var i = 0; i<a.length-1; i+=2) {
            if (typeof a[i] == 'string' || typeof a[i] == 'object') {
                TMSucheElem(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 = element.offsetParent;
        }
    }
    return xPosEl;
}

function TMErmittleMasse(obj) {
    if (isDOM) {
        var obj = TMSucheElem(obj);
        var masse = new Object();
        masse.b = obj.offsetWidth;
        masse.h = obj.offsetHeight;
        return masse;
    }
}

function TMErstelleEvent(obj,handler,funktion) {
    if (isDOM) {
        var a = arguments;
        var obj = TMSucheElem(obj);
        if (a.length == 4) {
            if (obj.addEventListener) {
                return obj.addEventListener(handler,funktion,a[3]);
            } else if (obj.attachEvent) {
                return obj.attachEvent('on' + handler,funktion);
            }
        } else {
            return obj['on' + handler] = funktion;
        }
    }
}

function TMEntferneEvent(obj,handler) {
    if (isDOM) {
        var a = arguments;
        var obj = TMSucheElem(obj);
        if (a.length == 4) {
            if (obj.removeEventListener) {
                return obj.removeEventListener(handler,a[2],a[3]);
            } else if (obj.detachEvent) {
                return obj.detachEvent('on' + handler,a[2]);
            }
        } else {
            return obj['on' + handler] = null;
        }
    }
}

function TMUnterbindeStandard(e) {
    var e = e ? e : event;
    if (e.preventDefault) {
        e.preventDefault();
    } else if (isIE) {
        e.returnValue = false;
    } else {
        return false;
    }
}

function TMUnterbindeAusbreitung(e) {
    var e = e ? e : event;
    if (e.stopPropagation) {
        e.stopPropagation();
    } else if (isIE) {
        e.cancelBubble = true;
    }
}

function TMSucheMaus(e) {
    if (isDOM) {
        var xOffset, yOffset;
        var e = e ? e : window.event;
        if (isIE) {
            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;
        }
        var mausPos = new Object();
        mausPos.x = e.clientX;
        mausPos.y = e.clientY;
        mausPos.xo = mausPos.x + xOffset;
        mausPos.yo = mausPos.y + yOffset;
        return mausPos;
    }
}

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

