/**
 * JavaScript Layer Bibliothek
 * (c) 2002 evermind technologies GmbH
 *
 * Funktion checkBrowser()
 *      liefert den Namen des Browsers zurück
 *
 * Funktion getLayer(id)
 *      liefert die browserspezifische Layer-Implementaion anhand der ID zurück
 *
 * Funktion showLayer(id)
 *      zeigt einen Layer an
 *
 * Funktion hideLayer(id)
 *      versteckt einen Layer
 *
 * Funktion enterLayer(scope, id)
 *      Zeigt einen Layer an und merkt sich, dass sieser Layer angezeigt wurde.
 *      Ein bereits mit enterLayer angezeigter Layer wird versteckt
 *      scope fasst eine Gruppe von Layern zusammen, für die dieses Verhalten gilt
 *
 * Funktion leaveLayer(scope, id, [timeout])
 *      Verstekt einen Layer nach einer bestimmten Zeit (in Millisekunden),
 *      falls nicht zwischendurch ein enterLayer für diesen Layer ausgelöst wurde
 *      scope fasst eine Gruppe von Layern zusammen, für die dieses Verhalten gilt
 *      timeout ist optional, default: 250 ms
 *
 *  Funktion posLayer(id, x, y)
 *      Positioniert einen Layer auf eine bestimmte Position
 *
 **/

/**
 * Bibliothek initialisieren
 **/
layerLib=layers_UNKNOWN;
initLayerLib();

// TODO: resize Handler? 

MenuManager=new menuManagerObject();
/**
 * MenüManager-Objekt
 **/
function menuManagerObject()
{
    menus=new Array();
    var created=false;
    this.createMenu = function()
    {
        menu=new MenuObject(menus.length+1);
        menus[menus.length]=menu;
        return menu;
    }
    
    this.writeOnInit = function()
    {
        if (browser=="NS4") return;
        this.write();
    }

    this.writeOnLoad = function()
    {
        this.write();
    }
    
    this.write = function()
    {
        if (created) return;
        created=true;
        for (j=0;j<menus.length;j++)
        {
            menus[j].create();
        }
    }
    
    this.enter = function(num)
    {
        menus[num - 1].enter();
    }

    this.enter = function(num,xpos)
    {
        menus[num - 1].setXPosition(xpos);
        menus[num - 1].enter();
    }
    
    this.leave = function(num)
    {
        menus[num - 1].leave();
    }
    
    this.handleResize = function()
    {
        if (browser=="NS4")
        {
            // workaround for resize bug on netscape 
            document.location.reload();
        }
    }
}

/**
 * Menü-Objekt
 **/
function MenuObject(_num)
{
    var num=_num;
    var layername="menulayer"+num;
    var x=0;
    var y=0;
    var base="";
    var items=new Array();
    var content="";
    var normalClass="itemBorderNormal";
    var overClass=normalClass;
    var created=false;

    this.setXPosition = function(_x)
    {
        this.setPosition(_x,y);
    }
    
    this.setPosition = function(_x,_y)
    {
        x=_x;
        y=_y;
        this.resetPosition();
    }
    
    this.resetPosition = function()
    {
        if (created) posLayer(layername,x,y);
    }
    
    this.setBase = function(_base)
    {
        base=_base;
    }
    
    this.setOverClass = function(_overClass)
    {
        overClass=_overClass;
    }
    
    this.enter = function()
    {
        if (browser=="OPERA")
        {
            // workaround for rezize bug on opera 
            this.resetPosition();
        }
        enterLayer("menu",layername);
    }
    
    this.leave = function()
    {
        leaveLayer("menu",layername);
    }
    
    this.addItem = function(name,link)
    {
        items[items.length]=new Array(name,link);
        content="";
        currentMenu="";
    }
    
    this.create = function()
    {
        if (created) return;
        created=true;
        if (content=="")
        {
            this.createContent();
        }
        
        if (browser=="NS4")
        {
            layer=new Layer(0);
            layer.visibility="hidden";
            layer.document.write(content);
            layer.document.close();
            layername=layer.name;
        }
        else
        {
            document.write('<div id="'+layername+'" style="position:absolute;visibility:hidden;">');
            document.write(content);
            document.write('</div>');
        }
        this.resetPosition();
    }
    
    this.createContent = function()
    {
        if (content!="") return;
        
        content ='<table width="152" border="0" cellpadding="3" cellspacing="0" bgcolor="#939393">';
        for (i=0;i<items.length;i++)
        {
            content+='<tr>';
            content+='<td onClick="document.location.href=\''+base+items[i][1]+'\'" style="cursor:hand;cursor:pointer;" class="'+normalClass+'" onMouseOut="MenuManager.leave('+num+'); this.className=\''+normalClass+'\';" onMouseOver="MenuManager.enter('+num+'); this.className=\''+overClass+'\';">'
            content+='<a style="text-decoration:none;color:white;font-family: Verdana,Geneva,Arial,Helvetica,sans-serif;" href="'+base+items[i][1]+'" class="itemText" onMouseOut="MenuManager.leave('+num+');" onMouseOver="MenuManager.enter('+num+');">';
            content+=items[i][0];
            content+='</a>';
            content+='</td>';
            content+='</tr>';
        }
        content+='</table>';
    }
}


/**
 * Browserabhängige Layer-Bibliotheken
 **/
function initLayerLib()
{
    browser=checkBrowser();
    if (browser=="NS6")
    {
        layerLib=layers_NS6;
        return;
    }
    if (browser=="NS4")
    {
        // Netscape resize Bug
        window.onresize = function()
            {
                if (window.innerWidth != origWidth || window.innerHeight != origHeight) history.go(0);
            }
        layerLib=layers_NS4;
        return;
    }
    if (browser=="IE")
    {
        layerLib=new layers_IE();
        return;
    }
    if (browser=="OPERA")
    {
        layerLib=new layers_OPERA();
        return;
    }
    if (browser=="KONQUEROR")
    {
        layerLib=new layers_KONQUEROR();
        return;
    }
}

/**
 * Browserversion herausfinden
 */
function checkBrowser()
{
    if (window.opera) return "OPERA";
    if ((navigator) &&
        (navigator.appName=="Konqueror")) return "KONQUEROR"
    if ((navigator) &&
        (navigator.appName=="Netscape") &&
        (navigator.appVersion.charAt(0)=='4')) return "NS4";
    if (document.all) return "IE";
    if (document.getElementById) return "NS6";
    return "UNKNOWN";
}

/**
 * Layer zurückliefern
 **/
function getLayer(id)
{
    return layerLib.getLayer(id);
}

/**
 * Layer anzeigen
 **/
function showLayer(id)
{
    layerLib.showLayer(id);
}

/**
 * Layer verstecken
 **/
function hideLayer(id)
{
    return layerLib.hideLayer(id);
}

/**
 * Layer positionieren
 **/
function posLayer(id,x,y)
{
    return layerLib.posLayer(id,x,y);
}

/**
 * Inhalt des Layers ändern 
 **/
function setLayerContent(id, content)
{
    return layerLib.setLayerContent(id,content);
}


function enterLayer(scope, id)
{
    tl=getTimedLayer(scope);
    if (tl.id==id) // Gleicher Layer wie bisher -> eventuelles hide abbrechen
    {
        if (tl.timer!=null)
        {
            window.clearTimeout(tl.timer);
            tl.timer=null;
        }
    }
    else    // Anderer Layer als momentan angezeigter
    {
        if (tl.id!=null)
        {
            hideLayer(tl.id);
        }
    }
    tl.id=id;
    showLayer(id);
}

function leaveLayer(scope, id, timeout)
{
    tl=getTimedLayer(scope);
    if (!timeout) timeout=500; // Default: 250 ms
    if (tl.timer!=null) // Altes hide abbrechen
    {
        window.clearTimeout(tl.timer);
    }
    tl.timer=window.setTimeout("autoHideLayer('"+id+"','"+scope+"')",timeout);
}

function autoHideLayer(id,scope)
{
    tl=getTimedLayer(scope);
    tl.timer=null;
    hideLayer(id);
}

_timesLayers=new Array();
function timedLayer()
{
    this.scope=null;
    this.id=null;
    this.timer=null;
}
function getTimedLayer(scope)
{
    for (i=0;i<_timesLayers.length;i++)
    {
        if (_timesLayers[i].scope==scope) return _timesLayers[i];
    }
    _tl=new timedLayer();
    _tl.scope=scope;
    _timesLayers[_timesLayers.length]=_tl;
    return _tl;
}

function test(x,y)
{
    if (!x) x=0;
    if (!y) if (x>200) y=0;
    posLayer("xyz",x,y);
    if (x>300) x=0;
    if (y>300) y=0;
    window.setTimeout("test("+(x+1)+","+(y+1)+")",25);
}

/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
//
// Browserspezifische Implementierungen

/**
 * Implementation er Bibliothek für Netscape 4.x
 **/
function layers_NS4()
{
    function getLayer(id)
    {
        return document.layers[id];
    }
    
    function showLayer(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.visibility = "show";
    }

    function hideLayer(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.visibility = "hide";
    }

    function posLayer(id,x,y)
    {
        layer=getLayer(id);
        if (!layer) return;
        if (x) layer.left = x;
        if (y) layer.top = y;
    }
}

/**
 * Implementation er Bibliothek für Mozilla/Netscape 6
 **/
function layers_NS6()
{
    function getLayer(id)
    {
        return document.getElementById(id);
    }
    
    function showLayer(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "visible";
    }

    function hideLayer(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "hidden";
    }

    function posLayer(id,x,y)
    {
        layer=getLayer(id);
        if (!layer) return;
        if (x) layer.style.left = x;
        if (y) layer.style.top = y;
    }
}

/**
 * Implementation er Bibliothek für Internet Explorer
 **/
function layers_IE()
{
    this.getLayer = function(id)
    {
        return document.all[id];
    }
    this.showLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "visible";
    }
    this.hideLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "hidden";
    }
    this.posLayer = function(id,x,y)
    {
        layer=getLayer(id);
        if (!layer) return;
        if (x) layer.style.left = x;
        if (y) layer.style.top = y;
    }
}

/**
 * Implementation er Bibliothek für den KDE Konqueror
 **/
function layers_KONQUEROR()
{
    this.getLayer = function(id)
    {
        return document.getElementById(id);
    }
    this.showLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "visible";
    }
    this.hideLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "hidden";
    }
    this.posLayer = function(id,x,y)
    {
        layer=getLayer(id);
        if (!layer) return;
        if (x) layer.style.left = x;
        if (y) layer.style.top = y;
    }
}

/**
 * Implementation er Bibliothek für Opera
 **/
function layers_OPERA()
{
    this.getLayer = function(id)
    {
        return document.getElementById(id);
    }
    this.showLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "visible";
    }
    this.hideLayer = function(id)
    {
        layer=getLayer(id);
        if (!layer) return;
        layer.style.visibility = "hidden";
    }
    this.posLayer = function(id,x,y)
    {
        layer=getLayer(id);
        if (!layer) return;
        if (x) layer.style.left = x;
        if (y) layer.style.top = y;
    }
}

/**
 * Implementation er Bibliothek für Unbekannte Browser
 **/
function layers_UNKNOWN()
{
    function getLayer(id) {};
    function showLayer(id) {};
    function hideLayer(id) {};
    function posLayer(id,x,y) {};
}


