
// CONSTANTS
    // Als MENUE_ID muss die ID des div-Elements notiert werden, in
    // dem sich das Ausklappmenue befindet.
    var MENU_ID = 'menue';
    var DELAY = 500;
    // VARIABLES
    var menuItemArray = [];
    var currentSrcObj = null;
    var timer = null;
    /* ********************************************
                      PART I                      
    ********************************************* */
    // Sucht das div-Element, das das Menue enthaelt.
    function init() {
        var divNode = document.getElementById(MENU_ID);
        // explorer bug
        if (divNode.id == '') divNode = divNode.nextSibling;
        parse(divNode);
    }
    function parse(menu) {
        var parentMenu, subMenu, menuItems, linkList, hideOnly;
        parentMenu = menu.getElementsByTagName('UL')[0];
        menuItems = getChildrenByTagName(parentMenu,'LI');
        for(var i=0; i<menuItems.length; i++) {
            linkList = menuItems[i].getElementsByTagName('A');
            subMenu = menuItems[i].getElementsByTagName('UL')[0];
            hideOnly = (menuItems[i].className == 'on') ? true : false;
            createMenuItemObj(linkList,subMenu, hideOnly);
        }
    }
    // Hilfsfunktion - sucht alle direkten Child-Elemente mit
    // dem entsprechenden Tagname.
    // Als Array zurueck
    
    function getChildrenByTagName(parent, tagname) {
        var allChildren, childList = [];
        
        if (parent == null) return childList;
        allChildren = parent.childNodes; 
        for(var i=0; i<allChildren.length; i++) {
            if (allChildren[i].nodeType == 1 && allChildren[i].tagName == tagname)
                childList[childList.length] = allChildren[i];
        }
        return childList;
    }
    // Erzeugt die Menue-Objekte. Ein Menueobjekt besteht aus
    // einem source (a-Tag), einem subMenu (das per Mouseover
    // einzublendene bzw, bei Mouseout auszublendene Submenue)
    // sowie hideOnly (wird gebraucht fuer Sonderbehandlung des
    // Menues im "on"-Zustand - dann soll das Submenue soll ja
    // nicht eingeblendet werden, andere Submenues muessen aber
    // dennoch ausgeblendet werden).
    function createMenuItemObj(linkList, subMenu, hideOnly) {
        for(var j=0; j < linkList.length; j++) {
            var menuItemObj = { source: linkList[j], subMenu: subMenu, hideOnly: hideOnly };
            menuItemArray[menuItemArray.length] = menuItemObj;
            addEvents(menuItemObj);
        }
    }
    // Hier werden die Events an die a-Tags der Menue-Objekte
    // angehaengt
    function addEvents(menuItemObj) {
        menuItemObj.source.onmouseover = toggleOver;
        menuItemObj.source.onmouseout = toggleOut;
        menuItemObj.source.onfocus = toggleOver;
        menuItemObj.source.onblur = toggleOut;
    }
    /* ********************************************
                      PART II                      
    ********************************************* */
    // Diese Funktion gibt das Element zurueck, das das
    // Event ausgeloest hat.
    function getSource(e) {
        var source;
        if (typeof e == 'undefined') e = window.event;
        if (typeof e.target != 'undefined') 
            source = e.target;
        else if (typeof e.srcElement != 'undefined')
            source = e.srcElement;
        else return true;
        if (source.nodeType == 3) source = source.parentNode;
        return source;
    }
    // Das zugehoerige menuItemObj des Elements, das das Event
    // ausgeloest hat, wird gesucht und zurueckgegeben.
    // menuItemObj wird benoetigt, um z.B die Information
    // zu erhalten, welches subMenu eingeblendet werden soll.
    function getMenuItemObj(source) {
        var menuItemObj = null;
        for (var i = 0; i < menuItemArray.length; i++) {
            if (menuItemArray[i].source == source && menuItemArray[i].subMenu != null)
                menuItemObj = menuItemArray[i];
        }
        return menuItemObj;
    }
    // Das entsprechende Submenue des menuItemObjs wird eingeblendet.
    // Die CSS-Klasse (className) wird dazu auf "einblenden" gesetzt.
    function showSubMenu(menuItemObj) {
       menuItemObj.subMenu.className = 'einblenden';
    }
    // Das entsprechende Submenue des menuItemObjs wird ausgeblendet.
    // Die CSS-Klasse (className) wird dazu auf "ausblenden" gesetzt.
    function hideSubMenu(menuItemObj) {
       menuItemObj.subMenu.className = 'ausblenden';
    }
    // Wird von der Funktion toggleOver aufgerufen, die beim
    // Mouseover-Event ausgeloest wird.
    // Diese Funktion blendet zunaechst eventuell noch
    // sichtbares Submenue aus und blendet dann das
    // entsprechende ein.
    function show(source) {
        var menuItemObj = getMenuItemObj(source);
        clearTimeout(timer);
        if (currentSrcObj != null && (menuItemObj == null || currentSrcObj.subMenu != menuItemObj.subMenu)) hideSubMenu(currentSrcObj);
        if (menuItemObj != null && !menuItemObj.hideOnly) showSubMenu(menuItemObj);
        currentSrcObj = menuItemObj;
    }
    // Wird von der Funktion toggleOut aufgerufen, welche beim
    // Mouseout-Event ausgeloest wird.
    // Diese Funktion blendet das entsprechende Submenue aus.
    function hide(source) {
        var menuItemObj = getMenuItemObj(source);
        if (menuItemObj != null) hideSubMenu(menuItemObj);
    }
    // Wird beim Mouseover-Event aufgerufen
    function toggleOver(e) {
        show(getSource(e));
        return false;
    }
    // Wird beim Mouseout-Event aufgerufen
    // Ruft die Funktion hide() mit Verzoegerung auf
    // (Die Verzoegerung wird oben im Kopf dieser Datei durch
    // DELAY definiert, z.B. DELAY = 500 -> Verzoegerung 500 ms)
    function toggleOut(e) {
        timer = setTimeout("hide('"+getSource(e)+"')", DELAY);
        return false;
    }

