function isNull(obj)      { return obj === null; }
function isUndefined(obj) { return typeof(obj) == 'undefined'; }
function isNot(obj)       { return isUndefined(obj) || isNull(obj); }
function isObject(obj)    { return obj && typeof(obj) == 'object'; }
var externalCounter = 0;
var pageTools = {

    /*
     * Prüft ob [object] die CSS Klasse [class_name] gesetzt hat
     */
    hasClass: function (class_name, object) {
        return object.className.indexOf(class_name) > -1;
    },

    /*
     * Fügt [object] (dem string object.className) die CSS Klasse [class_name] hinzu
     */
    addClass: function (addName, object) {
        if (object.className.length > 0){
            object.className += ' ' + addName
        } else {
            object.className = addName;
        }
    },

    /*
     * Entfernt CSS Klasse [rmName] von [object]
     */
    rmClass: function (rmName, object) {
        var newName = ''; /* className String nach entfernen von rmName */
        var position = object.className.indexOf(rmName);
        if (this.hasClass(rmName, object)) {
            if (position==0) { /* Zu entfernender Klassenname steht an erster Stelle... */
                if (object.className.length > rmName.length) { /* ... und es folgen weitere Klassennamen */
                    newName = object.className.substr(rmName.length +1, object.className.length);
                }
            } else { /* Zu entfernender Klassenname steht nicht an erster Stelle... */
                var newName = object.className.substr(0, position-1); /* führendes Space mit entfernen */
                if (object.className.length > position + rmName.length) { /* ... und es folgen weitere Klassennamen */
                    newName += object.className.substr(position + rmName.length, object.className.length);
                }
            }
            object.className = newName;
        }
    },

    getElementsByTagAndClassName: function (searchClass, searchTag, rootObj) {
        var searchObj;
        var foundObj = new Array();
        if (isNot(rootObj)) { rootObj = document; }
        searchObj = rootObj.getElementsByTagName(searchTag);
        for (var i=0; i<searchObj.length; i++) {
            if (this.hasClass(searchClass, searchObj[i])) {
                foundObj[foundObj.length] = searchObj[i];
            }
        }
        return foundObj;
    },

    recursionIterator: 0,
    maxDepth: 0,

    /*
     * Bearbeitet alle direkten Kindelelemente vom Typ [toggleTag] (name des HTML tags)
     * Setzt beim (als Objekt übergebenen) HTML Element [toggleObj] die CSS Klasse [toggleClass]
     * und entfernt sie bei allen anderen, falls vorhanden.
     */
    _toggleState2: function (parentId, toggleObj, toggleClass, toggleTag, parentObj, maxDepth) {
        if (maxDepth!=undefined) { this.maxDepth = maxDepth; }
        if (parentId!=false) {
            var aChildNodes = document.getElementById(parentId).childNodes;
        } else {
            var aChildNodes = parentObj.childNodes;
        }
        for (i=0; i<aChildNodes.length; i++) {
            if (this.recursionIterator<this.maxDepth) {
                this.recursionIterator++;
                this._toggleState(parentId, toggleObj, toggleClass, toggleTag);
            } else if (i) {
                if (aChildNodes[i].nodeName == toggleTag) {
                    if (toggleObj != aChildNodes[i]) {
                        if (this.hasClass(toggleClass, aChildNodes[i])) {
                            this.rmClass(toggleClass, aChildNodes[i]);
                        }
                    } else {
                        if (!this.hasClass(toggleClass, aChildNodes[i])) {
                            this.addClass(toggleClass, aChildNodes[i]);
                        } else {
                            return false;
                        }
                    }
                }
            }

        }
        return false;
    },

    /*
     * Interne Methode ("private")
     * Bearbeitet alle direkten Kindelelemente vom Typ [toggleTag] (name des HTML tags)
     * Setzt beim (als Objekt übergebenen) HTML Element [toggleObj] die CSS Klasse [toggleClass]
     * und entfernt sie bei allen anderen, falls vorhanden.
     */
    _toggleState: function (rootElement, toggleObj, toggleClass, toggleTag) {
        // if rootElement is an ID string -> get the Node, else rootElement is the actual rootNode
        var aChildNodes = !isObject(rootElement) ? document.getElementById(rootElement).childNodes : rootElement.childNodes;
        for (var i=0; i<aChildNodes.length; i++) {
            if (aChildNodes[i].nodeName == toggleTag) {
                if (toggleObj !== aChildNodes[i]) {
                    if (this.hasClass(toggleClass, aChildNodes[i])) {
                        this.rmClass(toggleClass, aChildNodes[i]);
                    }
                } else {
                    if (!this.hasClass(toggleClass, aChildNodes[i])) {
                        this.addClass(toggleClass, aChildNodes[i]);
                    } else {
                        return false;
                    }
                }
            }
        }
        return false;
    },

    /*
     */
    dbg: function (arr) {
        var popwin3 = window.open('', "DBG", "width=1000,height=800,right=150,top=300,resizable=yes,scrollbars=yes")
        popwin3.focus();
        popwin3.document.open();
        popwin3.document.write('--------------------------------------<br><br>');
        for (i=0; i<arr.length; i++) {
            popwin3.document.write('Entry ' + i + ': ' + arr[i] + '<br>');
        }
        popwin3.document.write('--------------------------------------<br><br>');
        popwin3.document.close();
    },

    /*
     */
    dbgPrint: function (msg) {
        var popwin3 = window.open('', "DBG", "width=1000,height=800,right=150,top=300,resizable=yes,scrollbars=yes")
        popwin3.focus();
        popwin3.document.open();
        popwin3.document.write('--------------------------------------<br><br>');
        popwin3.document.write(msg + '<br>');
        popwin3.document.write('--------------------------------------<br><br>');
        popwin3.document.close();
    },

    /*
     * __toggleState wrapper für die Contents der Tab Teaser Boxen
     */
    toggleTabs: function (listId, toggleObj) {
        this._toggleState (listId, toggleObj, 'active', 'LI');
    },

    /*
     * __toggleState wrapper für die InSiteNavi auf den Coverflow pages (Aufruf durch falsh)
     */
    toggleInSiteNav: function (toggleObj) {
        return this._toggleState ('nav4th', toggleObj, 'active', 'LI');
    },

    /*
     * __toggleState wrapper für Div Container (z.B Detailseiten)
     */
    toggleHpCoverflowList: function (toggleObj) {
        if (!isObject(toggleObj)) {
            // id string given
            toggleObj = document.getElementById(toggleObj);
        }
        return this._toggleState (toggleObj.parentNode, toggleObj, 'hover', 'LI');
    },

    /*
     *
     */
    createLayer: function () {
        if (!isObject(document.getElementById(layerId))) {
            document.createElement('div');
        }

    }
}