
/**
 * Prueft, ob der Client-Browser die DHTML-Funktionen für die Website unterstuetzt
 * und gibt bei Erfolg true zurueck.
 *
 * @return bool
 */
function hasRightDHTMLVersion() {
    var hasRightDHTMLVersion = true;
    var sUserAgent = navigator.userAgent.toLowerCase();
    var iMozRV = window.controllers && sUserAgent.indexOf('rv:') != -1
                 ? parseFloat(sUserAgent.match(/rv:([0-9]+[.])+[0-9]+/)[0].replace(/[.]/, ',')
                              .replace(/[^0-9,]/g, '').replace(/[,]/, '.'))
                 : null;
    if ((typeof document.getElementById == 'undefined')
        || (window.opera && !document.createComment)
        || (typeof iMozRV == 'number' && iMozRV < 1.2)
        || (navigator.vendor && navigator.vendor.toLowerCase().indexOf('kde') != -1 && !document.compatMode)
        || (navigator.vendor && navigator.vendor.toLowerCase().indexOf('apple') != -1
            && !window.XMLHttpRequest)) {

        var hasRightDHTMLVersion = false;
    }

    return hasRightDHTMLVersion;
}
var isProDHTML = hasRightDHTMLVersion();

/**
 * Setzt Massnahmen, wenn sich die Fenstergroesse des Browsers geaendert hat ('onresize').
 *
 * @return void
 */
function pageOnResize()
{
    if (typeof window.initSliders == 'function') {
        initSliders();
    }
}

/**
 * Setzt Massnahmen, nachdem die Seite geladen wurde ('onload').
 *
 * @return void
 */
function pageOnLoad()
{
    /*if (typeof window.naviHover == 'function') {
        naviHover('naviTop', true, true, true, 5);
    }*/
}

/**
 * Fängt Fehlermeldungen bei Browsern, die den print()-Befehl nicht unterstuetzen, ab.
 *
 * @return void
 */
if (typeof window.print == 'undefined') {
    Object.prototype.print = function()
    {
        return;
    }
}

/**
 * Prueft, ob ein Wert in einem Array enthalten ist.
 *
 * @param mixed mNeedle (required) Der Wert, der im Array enthalten sein soll.
 * @param array aArray (required) Das Array, das geprueft werden soll.
 * @param bool blStrict (default false) Soll auf Typengleichheit geprueft werden.
 * @return bool
 */
function inArray(mNeedle, aArray, blStrict)
{
    if (typeof blStrict == 'undefined') {
        blStrict = false;
    }

    var i;
    for (i=0; i < aArray.length; i++) {
        if (!blStrict && mNeedle == aArray[i]) {
            return true;
        } else if (blStrict && mNeedle === aArray[i]) {
            return true;
        }
    }

    return false;
}

/**
 * Setzt die Stylesheet-Klasse eines HTML-Elements 'CrossBrowser-kompatibel'.
 *
 * @param mixed mElement (required) Die ID oder das Objekt des HTML-Elements.
 * @param string sClassName (required) Der Klassenname.
 * @return void
 */
function setClassName(mElement, sClassName)
{
    var oElement = typeof mElement == 'string' ? document.getElementById(mElement) : mElement;
    if (!oElement) {
        return;
    }

    if (typeof oElement.className != 'undefined') {
        oElement.className = sClassName;
    } else if (typeof oElement.setAttribute != 'undefined') {
        oElement.setAttribute('class', sClassName);
    }
}

/**
 * Ermittelt die Stylesheet-Klasse eines HTML-Elements 'CrossBrowser-kompatibel' und gibt sie
 * zurueck.
 *
 * @param mixed mElement (required) Die ID oder das Objekt des HTML-Elements.
 * @return string
 */
function getClassName(mElement)
{
    var oElement = typeof mElement == 'string' ? document.getElementById(mElement) : mElement;
    if (!oElement) {
        return '';
    }

    if (typeof oElement.className != 'undefined') {
        return oElement.className;
    } else if(typeof oElement.setAttribute != 'undefined') {
        return oElement.getAttribute('class');
    } else {
        return '';
    }
}

/**
 * Gibt den Abstand eines HTML-Elements zur linken und oberen Ecke des Browser-Anzeigefensters,
 * und die Breite und Hoehe des Elements in Pixel als Array zurueck [left, top, width, height].
 *
 * @param mixed mElement (required) Die ID oder das Objekt des HTML-Elements.
 * @return array
 */
function getNodeCoordinates(mElement)
{
    var oElement = typeof mElement == 'string' ? document.getElementById(mElement) : mElement;
    if (!oElement) {
        return;
    }

    function getOffsetPosition(oElement)
    {
        var iLeft = 0;
        var iTop  = 0;
        if (typeof oElement.offsetParent == 'undefined') {
            return [iLeft, iTop];
        }

        while (oElement && oElement.nodeName != 'BODY' && oElement.nodeName != 'HTML') {
            iLeft += oElement.offsetLeft;
            iTop  += oElement.offsetTop;
            oElement = oElement.offsetParent;
        }

        return [iLeft, iTop];
    }

    var aPos = getOffsetPosition(oElement);
    var iLeft = oElement.style.left || oElement.style.pixelLeft || aPos[0] || 0;
    var iTop = oElement.style.top || oElement.style.pixelTop || aPos[1] || 0;
    var iWidth = oElement.offsetWidth || oElement.style.pixelWidth || 0;
    var iHeight = oElement.offsetHeight || oElement.style.pixelHeight || 0;

    return [parseInt(iLeft), parseInt(iTop), parseInt(iWidth), parseInt(iHeight)];
}

/**
 * Aendert das Erscheinungsbild eines Slider-Buttons.
 *
 * @param mixed mButton (required) Die ID oder das Objekt des Buttons.
 * @param string sTxt (default null) Der neue Text innerhalb des Buttons.
 * @param string sClass (default null) Der neue CSS-Klassenname des Buttons.
 * Entweder sTxt und/oder sClass sind erforderlich.
 * @return void
 */
function handleSliderButton(mButton, sTxt, sClass)
{
    var oButton = typeof mButton == 'string' ? document.getElementById(mButton) : mButton;
    if (!isProDHTML || !oButton) {
        return;
    }

    if (oButton.nodeName == 'A' || oButton.nodeName == 'BUTTON') {
        if (sTxt) {
            oButton.firstChild.nodeValue = sTxt;
        }
        if (sClass) {
            setClassName(oButton, sClass);
        }
    } else if (oButton.nodeName == 'INPUT' && sTxt) {
        if (typeof oButton.setAttribute != 'undefined') {
            oButton.setAttribute('value', sTxt);
        } else {
            oButton.value = sTxt;
        }
    }
}

/**
 * Setzt das Oeffnen oder Schliessen von 'oSlider' in Abhaengigkeit von seinem aktuellen
 * Status in Gang und wechselt das Erscheinungsbild des aufrufenden Buttons.
 *
 * @param string sWhich (required) Die Bezeichnung des Sliders ('bl' + sWhich + 'Clipped').
 * @param string sButtonID (required) Die ID des Buttons, der den Befehl zum Oeffnen und
 *                                    Schliessen gibt.
 * @param object oSlider (required) Das Slider-DHTML-Element, das geoeffnet oder geschlossen
 *                                  werden soll.
 * @param string sTxtToOpen (default null) Der Text, der symbolisiert, das der Slider geoeffnet
 *                                         werden kann.
 * @param string sTxtToClose (default null) Der Text, der symbolisiert, das der Slider
 *                                          geschlossen werden kann.
 * @param string sClassToOpen (default null) Der Name der Button-CSS-Klasse, deren enthaltenes
 *                                           Hintergrundbild symbolisiert, das der Slider
 *                                           geoeffnet werden kann.
 * @param string sClassToClose (default null) Der Name der Button-CSS-Klasse, deren enthaltenes
 *                                            Hintergrundbild symbolisiert, das der Slider
 *                                            geschlossen werden kann.
 * Entweder sTxtToOpen, sTxtToClose und/oder sClassToOpen, sClassToClose sind erforderlich.
 * @return void
 */
function handleSlider(sWhich, sButtonID, oSlider, sTxtToOpen, sTxtToClose, sClassToOpen, sClassToClose)
{
    var oButton = document.getElementById(sButtonID);
    if (!isProDHTML || !oButton || typeof oSlider == 'undefined') {
        return;
    }

    if (eval('bl' + sWhich + 'Clipped')) {
        eval('bl' + sWhich + 'Clipped = false');
        handleSliderButton(oButton, sTxtToClose, sClassToClose);
        oSlider.clipIt(oSlider.iInitT, oSlider.iInitR, oSlider.iInitB, oSlider.iInitL);
        oSlider.slideIt(oSlider.iInitX, oSlider.iInitY);
    } else {
        eval('bl' + sWhich + 'Clipped = true');
        handleSliderButton(oButton, sTxtToOpen, sClassToOpen);
        oSlider.clipIt(oSlider.iTargetT, oSlider.iTargetR, oSlider.iTargetB, oSlider.iTargetL);
        oSlider.slideIt(oSlider.iTargetX, oSlider.iTargetY);
    }
}

/**
 * Weist dem 'document'-Objekt einen 'Click-Event-Listener' für die uebergebene Funktion 'sFuncName'
 * zu.
 *
 * @param string sFuncName (required) Der Name der Funktion, die beim Eintreten des Events
 *                                    aufgerufen werden soll.
 * @return void
 */
var fOldOnClickFunction = null;
function addDocClickListener(sFuncName)
{
    if (typeof document.addEventListener != 'undefined') {
        document.addEventListener('click', sFuncName, false);
    } else if (typeof document.attachEvent != 'undefined') {
        document.attachEvent('onclick', sFuncName);
    } else if (typeof document.onclick == 'function') {
	    var fOnClick = fOldOnClickFunction = document.onclick;
        document.onclick = function(oEvent)
        {
            fOnClick(oEvent);
            sFuncName(oEvent);
        }
    } else {
        document.onclick = sFuncName;
    }
}

/**
 * Entfernt den, mit 'addClickListener()' zugewiesenen 'Click-Event-Listener' vom 'document'-Objekt.
 *
 * @param string sFuncName (required) Der Name der Funktion, die aus dem Click-Events des
 *                                    'document'-Objekts entfernt werden soll.
 * @return void
 */
function removeDocClickListener(sFuncName)
{
    if (typeof document.removeEventListener != 'undefined') {
        document.removeEventListener('click', sFuncName, false);
    } else if (typeof document.detachEvent != 'undefined') {
        document.detachEvent('onclick', sFuncName);
    } else if (typeof document.onclick == 'function') {
        document.onclick = fOldOnClickFunction || null;
    }
}