var showAtOnce = true; // flag controls if subnavigation is shown at once
var ShowLoopTimeoutObject; // Timeoutobjekt für Anzeigenloop
var HideLoopTimeoutObject; // Timeoutobjekt für Versteckenloop
var currentListObject;
var stack = new Array();
var currentId; // ID des Objekts der ersten Navigationseben, über dem sich die Maus befindet

// Konstanten
var HOVERCLASS = "hover"; // Name der Klasse für Formatierungen mit onMouseOver-Effekt
var HIDETIMEOUT = 1; // Geschwindigkeit des Versteckens
var SHOWTIMEOUT = 100; // Geschwindigkeit des Anzeigens

function over(obj) { // Maus befindet sicht über dem Objekt obj

    var id = obj.id;
    currentId = id;

    // Objekt bekommt zusätzlich Formatierungsklasse zugeordnet
    if (obj.className.indexOf(HOVERCLASS) == -1) {
    	obj.className += ' ' + HOVERCLASS;
    }
	
    // Stack enthält später die Element, die bei onMouseOut wieder versteckt werden müssen
	if (!stack[id]) {
	    stack[id] = new Array();
	}

    //	Zum ersten UL-Element innerhlab des Objekts gehen
	var i = 0;
	var child;
    while (child = obj.childNodes[i]) {
        if (child.tagName && child.tagName == 'UL') {
            if (child.firstChild) {
                // Element der Liste sollen nacheinander angezeigt werden
                currentListObject = child.firstChild;
                showSubnav(id);
            }
    		break;
        }
        ++i;
    }
}

function showSubnav(id) {
    var obj = currentListObject;
    if (obj) { // Funktion macht nur Sinn, wenn das Objekt existiert
        // Suche das erste LI-Element innerhalb der Liste
        while (obj && obj.tagName != 'LI') {
            obj = obj.nextSibling;
        }
        if (obj) {
            obj.style.display = 'block'; // Element wird angezeigt
            // Eventhandler werden hinzugefügt
            obj.onmouseover = function() {
                over(this);
            }
            obj.onmouseout = function() {
                out(this);
            }

            // Element wird auf den Stack gelegt
            stack[id].push(obj);
            if (obj.nextSibling) {
                // Es gibt evtl. Folgeelemente, die auch angezeigt werden sollen
                currentListObject = obj.nextSibling;
                if (showAtOnce) {
                    showSubnav(id);
                } else {
                    ShowLoopTimeoutObject = setTimeout('showSubnav("' + id + '")', SHOWTIMEOUT);
                }
            } else {
                // Es gibt keine weiteren Elemente, Anzeigeloop wird abgebrochen
                currentListObject = obj;
                clearTimeout(ShowLoopTimeoutObject);
            }
        }
    }
}

function out(obj) {
    // Formatierungsklasse wird wieder entfernt
	obj.className = obj.className.replace(HOVERCLASS, '');
	
    id = obj.id;
	currentId = '';
    if (showAtOnce) {
        hideSubnav(id);
    } else {
    	// Der Versteckenloop wird verzögert aktiviert, um Mausebewegungen abzufangen
        HideLoopTimeoutObject = setTimeout('hideSubnav("' + id + '")', HIDETIMEOUT);
    	clearTimeout(ShowLoopTimeoutObject);
    }
}

function hideSubnav(id) {
    if (id != currentId) {
        if (obj = stack[id].shift()) {
            // Es liegt noch ein Objekt auf dem Stack
            obj.style.display = 'none'; // Element wird versteckt
            if (showAtOnce) {
                hideSubnav(id);
            } else {
                HideLoopTimeoutObject = setTimeout('hideSubnav("' + id + '")', HIDETIMEOUT);
            }
        } else {
            // Es gibt keine Elemente mehr, die versteckt werden müssen
            clearTimeout(HideLoopTimeoutObject);
        }
    }
}