var contextMenuClipY = new Array();
var contextMenuIntervals = new Array();
var openContextMenus = new Array();
var contextMenuSwitchMappings = new Array();
var contextMenuFlapDirections = new Array();

var contextMenuResizeOffset = 30;
var contextMenuResizeDelay = 2;

var contextMenuBackgroundColor = '#93cd00';

var hideContextMenuJobs = new Array();

/**
 * Zeigt ein Kontextmenü an
 * Benötigt das Element auf das man klickt um das Menü anzuzeigen,
 * das Menü selbst und die bevorzugte Ausrollrichtung in X-Richtung
 * Ausrollrichtungen müssen 'right' oder 'left' sein
 */
function showContextMenu(ContextMenuSwitch, ContextMenu, preferredFlapDirection)
{
    if (!openContextMenus[ContextMenu.id])
    {
        /** Alle offenen Kontextmenüs schliessen **/
        for (var ContextMenuIndex in openContextMenus)
        {
            if (openContextMenus[ContextMenuIndex])
                hideContextMenu(openContextMenus[ContextMenuIndex]);
        }

        /** Hintergrundfarbe des Schalters grün machen **/
        ContextMenuSwitch.style.backgroundColor = contextMenuBackgroundColor;
        contextMenuSwitchMappings[ContextMenu.id] = ContextMenuSwitch;

        /** Startposition und Y-Ausrollrichtung ermitteln **/
        ContextMenuSwitchTop = getEltPosTop(ContextMenuSwitch);

        if ((ContextMenuSwitchTop + ContextMenu.offsetHeight) > (window.innerHeight + window.pageYOffset))
        {
            flapDirection = "up";
            contextMenuTop = ContextMenuSwitchTop - ContextMenu.offsetHeight;
            ContextMenu.style.clip = "rect(" + (ContextMenu.offsetHeight) + "px, " + (ContextMenu.offsetWidth) + "px, " + (ContextMenu.offsetHeight) + "px, 0px)";
        }
        else
        {
            flapDirection = "down";
            contextMenuTop = ContextMenuSwitchTop + ContextMenuSwitch.offsetHeight
            ContextMenu.style.clip = 'rect(0px, ' + (ContextMenu.offsetWidth) + 'px, 1px, 0px)';
        }


        contextMenuFlapDirections[ContextMenu.id] = flapDirection;

        /** Kontextmenü in Y-Richtung positionieren **/
        if (ContextMenu.offsetParent.tagName != "BODY")
            contextMenuTop = contextMenuTop - getEltPosTop(ContextMenu.offsetParent);
        setEltTop(ContextMenu, contextMenuTop);

        /** Position von Links bestimmen **/
        ContextMenuSwitchLeft = getEltPosLeft(ContextMenuSwitch);
        if (preferredFlapDirection == "left")
        {
            contextMenuLeft = (ContextMenuSwitchLeft > (ContextMenu.offsetWidth + 10))?(ContextMenuSwitchLeft - ContextMenu.offsetWidth + ContextMenuSwitch.offsetWidth):(ContextMenuSwitchLeft);
        }
        else
        {
            contextMenuLeft = ((window.innerWidth + window.pageXOffset - ContextMenuSwitchLeft) < (ContextMenu.offsetWidth + 10))?(ContextMenuSwitchLeft - ContextMenu.offsetWidth + ContextMenuSwitch.offsetWidth):(ContextMenuSwitchLeft);
        }

        if (ContextMenu.offsetParent.tagName != "BODY")
            contextMenuLeft = contextMenuLeft - getEltPosLeft(ContextMenu.offsetParent);
        /** Kontextmenü in X-Richtung positionieren **/
        setEltLeft(ContextMenu, contextMenuLeft);

        /** Kontextmenü Anzeigen **/
        showElement(ContextMenu);
        openContextMenus[ContextMenu.id] = ContextMenu;

        /** Kontextmenü Ausrollvorgang starten **/
        contextMenuClipY[ContextMenu.id] = (flapDirection == "down")?(1):(ContextMenu.offsetHeight);
        contextMenuIntervals[ContextMenu.id] = window.setInterval("resizeContextMenu('" + ContextMenu.id + "'," + contextMenuResizeOffset + ",'" + flapDirection + "')", contextMenuResizeDelay);
    }
    else
    {
        /** Falls Kontextmenü schon angezeigt ist, wird es wieder eingeklappt **/
        hideContextMenu(ContextMenu);
    }
}

/**
 * Rollt das übergebene Kontextmenü wieder ein
 */
function hideContextMenu(ContextMenu)
{
    /** Zustand des Kontextmenüs speichern **/
    openContextMenus[ContextMenu.id] = false;

    /** Richtung in die das Menü ausgeklappt wurde ermitteln **/
    flapDirection = contextMenuFlapDirections[ContextMenu.id];

    /** Startgröße des Kontextmenüs festlegen **/
    contextMenuClipY[ContextMenu.id] = (flapDirection == "up")?(0):((ContextMenu.offsetHeight));

    /** Einrollvorgang starten **/
    contextMenuIntervals[ContextMenu.id] = window.setInterval("resizeContextMenu('" + ContextMenu.id + "',-" + contextMenuResizeOffset + ",'" + flapDirection + "')", contextMenuResizeDelay);

    /** Hintergrundfarbe des Schalters wieder transparent machen **/
    contextMenuSwitchMappings[ContextMenu.id].style.backgroundColor = 'transparent';

    if (hideContextMenuJobs[ContextMenu.id])
    {
        for (var i in hideContextMenuJobs[ContextMenu.id])
        {
            if (hideContextMenuJobs[ContextMenu.id])
            {
                eval(hideContextMenuJobs[ContextMenu.id][i]);
                hideContextMenuJobs[ContextMenu.id] = false;
            }
        }
    }
}

/**
 * Macht ein Kontextmenü ein wenig größer
 */
function resizeContextMenu(eltId, myOffset, myDirection)
{
    Elt = document.getElementById(eltId);
    if (myDirection == "down")
    {
        Elt.style.clip = 'rect(0px, ' + (Elt.offsetWidth) + 'px, ' + contextMenuClipY[eltId] + 'px, 0px)';

        if ((myOffset > 0 && contextMenuClipY[eltId] >= (Elt.offsetHeight)) || (myOffset < 0 && contextMenuClipY[eltId] <= 0))
            clearInterval(contextMenuIntervals[eltId]);
        else
            contextMenuClipY[eltId] = contextMenuClipY[eltId] + myOffset;
    }
    else
    {
        Elt.style.clip = "rect(" + contextMenuClipY[eltId] + "px, " + (Elt.offsetWidth) + "px, " + Elt.offsetHeight + "px, 0px)";

        if ((myOffset > 0 && contextMenuClipY[eltId] < 0) || (myOffset < 0 && contextMenuClipY[eltId] >= Elt.offsetHeight))
            clearInterval(contextMenuIntervals[eltId]);
        else
            contextMenuClipY[eltId] = contextMenuClipY[eltId] - myOffset;
    }
}


/**
 * Austauschen des Inhalts eines Contextmenüs
 */
function showContextMenuInfo(ContextMenuName, ContextMenuInnerDivId, InfoDivId, ClickedElement)
{
    ContextMenuInnerDiv = document.getElementById(ContextMenuInnerDivId);
    InfoDiv = document.getElementById(InfoDivId).cloneNode(true);
    InfoDiv.style.display = "";

    i = 0;
    while(document.getElementById('InfoDivJS' + i))
    {
        i++;
    }
    InfoDiv.setAttribute('id','InfoDivJS' + i);

    for (var Child in ContextMenuInnerDiv.childNodes)
    {
        if (ContextMenuInnerDiv.childNodes[Child].nodeType == 1)
            ContextMenuInnerDiv.childNodes[Child].style.display = 'none';
    }

    ContextMenuInnerDiv.appendChild(InfoDiv);

    if (typeof hideContextMenuJobs[ContextMenuName] == 'undefined');
        hideContextMenuJobs[ContextMenuName] = new Array();

    hideContextMenuJobs[ContextMenuName].push("hideContextMenuInfo('" + ContextMenuInnerDivId + "')");

    if (ClickedElement.tagName == "A")
    {
        TRNode = findNextOnClick(ClickedElement);
        setCSSClass(TRNode, 'ContextMenuFunctionsTrLo');
        recoverParentOnClick(ClickedElement);
    }
    else
    {
        setCSSClass(ClickedElement, 'ContextMenuFunctionsTrLo');
    }

    return false;
}

/**
 * Verstecken eines ausgetauschten Inhalts in einem Contextmenü
 */
function hideContextMenuInfo(ContextMenuInnerDivId)
{
    ContextMenuInnerDiv = document.getElementById(ContextMenuInnerDivId);

    elementsToRemove = new Array();
    for (var Child in ContextMenuInnerDiv.childNodes)
    {
        if (ContextMenuInnerDiv.childNodes[Child].nodeType == 1)
        {
            if (ContextMenuInnerDiv.childNodes[Child].className == 'ContextMenuInfoDiv')
            {
                elementsToRemove.push(ContextMenuInnerDiv.childNodes[Child]);
            }
            else
            {
                ContextMenuInnerDiv.childNodes[Child].style.display = '';
            }
        }
    }

    for (var eltIndex in elementsToRemove)
    {
        ContextMenuInnerDiv.removeChild(elementsToRemove[eltIndex]);
    }
}



