/*
    Datei: layer.js
    Datum: 17.04.2004
    Autor: J. Strübig <jstruebig@web.de>

    Beschreibung: Funktionen um Layer mit Hilfe von Javascript zu manipulieren.

    Funktionsliste:

     setProp(id, prop, attr [,win])
        setzt eine CSS Eigenschaft eines Layers mit der id.

     getById(id [, win]);
        Sucht den Layer mit der id im Dokument doc (oder im aktuellen Dokument).

     fixLayer(id [,window])
        fixiert einen Layer an seiner Position.

     setVis(obj, mode)
        zeigt/versteckt einen Layer.

     pagePos(obj [, x, y])
        Die Position eines Layer.

     getSize(obj [, win])
        Die Größe eines Layers.

     pageOffset([window])
        aktuelle Scrollposition der Seite.

     getWinSize(window)
        Größe des Anzeigebreiches

     getDocSize(window)
        Größe des Dokumentes

*/
var DEBUG = false;



////////////////////////////////////////////////////////////
// getDocSize(window)
// Anmerkung (22.4.204) Evtl. muss der mode abgefragt werden

function getDocSize(w)
{
    if(!w) w = window;
    var pos = {w:0,h:0};
    if (typeof document.height != 'undefined')
    {
        pos =  { w: w.document.width, h: w.document.height};
    }
    else if (document.body && typeof document.body.scrollHeight != 'undefined')
    {
        pos.w = w.document.body.scrollWidth;
        pos.h = w.document.body.scrollHeight;
    }
    return pos;
}

////////////////////////////////////////////////////////////
// getWinSize(window)
function getWinSize(win)
{
    if(!win) win = window;
    var pos = {w:0,h:0};
    if(typeof win.innerWidth != 'undefined')
    {
        pos = { w: win.innerWidth, h: win.innerHeight};
    }
    else if (win.document.body)
    {
       pos.w = parseInt(win.document.body.clientWidth);
       pos.h = parseInt(win.document.body.clientHeight);
    }
    return pos;
}
////////////////////////////////////////////////////////////
// offset(window)
function pageOffset(win)
{
    if(!win) win = window;
    var pos = {left:0,top:0};
    var m = Mode() == 'Strict';

    pos.left = typeof win.pageXOffset != 'undefined' ? win.pageXOffset : // Mozilla/Netscape
    m ?  // IE im strict Modus
    document.documentElement.scrollLeft : // Strict Modus
    win.document.body.scrollLeft // Quirks Modus
    ;

    pos.top = typeof win.pageYOffset != 'undefined' ? win.pageYOffset :
    m  ?
    document.documentElement.scrollTop :// Strict Modus
    win.document.body.scrollTop // Quirks Modus
    ;

    return pos;
}

///////////////////////////////////////////////////////////
// setProp(id, prop, attr, win)

function setProp(id, prop, attr, win)
{
     var style = getStyle(id, win);
     if(!style) return null;
     if(typeof style[prop] == 'undefined' ) return null;
     if(typeof attr != 'undefined' ) style[prop] = attr;
     return style[prop];
}

///////////////////////////////////////////////////////////
// getStyle(id)
function getStyle(id, win)
{
    if(!id) return null;
    if(typeof id == "string") id = getById(id, win);
    if(typeof id.style == 'undefined') return id;
    return id.style;
}
///////////////////////////////////////////////////////////
// getById(id [, win])

function getById(id, win)
{
    var doc = window.document;
    if(win) doc = win.document;

    if(typeof id == 'undefined') return null;

    var obj = null;
    if(document.getElementById) obj = doc.getElementById(id);
    else if(typeof document.layers != 'undefined')  obj = _findObj_(id, doc);
    else if(document.all) obj = doc.all[id];

    return obj;
}
////////////////////////////////////////////////////////////
// Ein Layer beschreiben
function print(obj, text, win)
{
    if(!obj) return;
    if(typeof obj == "string") obj = getById(obj, win);

    if(typeof obj.innerHTML != 'undefined')
    {
       obj.innerHTML = text;
    }
    else if(typeof document.layers != 'undefined')
    {
         obj.document.open('text/html');
         obj.document.write(text);
         obj.document.close();
    }

}
////////////////////////////////////////////////////////////
// Ein Layer fixieren

function fixLayer(id, win)
{
    if(!win) win = window;
    var obj = getById(id, win);
    if(!obj) return alert('Fehler\n\nID:' + id + ' ist nicht zu finden.');

    _STICKY_OBJ_[_STICKY_OBJ_.length] = new Sticky(obj, win);

    _fixLayer_();
    if(_STICKY_OBJ_.length > 1) return obj;

    if (typeof win.onscroll != 'undefined') win.onscroll = _fixLayer_;
    else if(typeof document.layers != 'undefined')  setInterval ('_fixLayer_()', 50);
    else window.setInterval ('_fixLayer_()', 50);
    return obj
}

////////////////////////////////////////////////////////////
// setVis
function setVis(obj, mode, win)
{
    if(!obj) return null;
    if(typeof obj == "string") obj = getStyle(obj, win);
    var vis;

    if(typeof document.layers != 'undefined')
    {
         vis = mode ? 'show' : 'hidden';
         obj['visibility'] = vis;
         return obj['visibility'];
    }
    vis = mode ? 'visible' : 'hidden';
    obj['visibility'] =  vis;
    return obj['visibility']
}
////////////////////////////////////////////////////////////
// getSize(obj)
function getSize(obj, win)
{
    if(!obj) return null;
    if(typeof obj == "string") obj = getById(obj, win);

    var size = {width:0, height:0};

    if(typeof document.layers != 'undefined')
    {
         size.width = obj.clip.width;
         size.height = obj.clip.height;
    }
    else if(obj.offsetWidth)
    {
         size.width = parseInt(obj.offsetWidth);
         size.height = parseInt(obj.offsetHeight);
    }


    return size;
}

////////////////////////////////////////////////////////////
// pagePos(obj [,y, x])

function pagePos(obj, top, left, win)
{
    if(typeof obj == "string") obj = getById(obj, win);

    if(!win) win = window;
    if(!obj) return null;
    var pos;
    if(typeof left != 'undefined' && typeof top != 'undefined')
    {
         if(typeof document.layers != 'undefined')
         {
              obj.moveTo(left , top);
         }
         else
         {
              obj.style.left = left + 'px';
              obj.style.top = top + 'px';
         }
    }
    pos = {left:0, top:0};

    if(typeof obj.offsetLeft != 'undefined')
    {
         while (obj)
         {
             pos.left += obj.offsetLeft;
             pos.top += obj.offsetTop;
             obj = obj.offsetParent;
         }
    }
    else
    {
        pos.left = obj.left ;
        pos.top = obj.top ;
    }
    if(DEBUG) window.status = 'Pos:' + pos.left + ':'+ pos.top;

    return pos;
}
function Mode(doc)
{
    if(!doc) doc = window.document;
    return (doc.compatMode && doc.compatMode == "CSS1Compat") ?  // strict Modus
    'Strict' : 'Quirks';
}

/* Globale Hilfsfunktionen */

////////////////////////////////////////////////////////////
// Nur für den NC 4.x um Layer zu finden.

function _findObj_(n, doc)
{
    if(doc[n]) return doc[n];

    for(var i = 0; i < doc.layers.length; i++)
    {
         if(typeof doc.layers[i].document != 'undefined')
         {
              var obj = _findObj_(n, doc.layers[i].document);
              if(obj) return obj;
         }
    }
    return null;
}


////////////////////////////////////////////////////////////
// Sticky -> Hilfsstruktur um die Startwerte zu sichern

function Sticky(obj, win)
{
    var pos = pagePos(obj);

    this.top = pos.top;
    this.left = pos.left;
    this.obj = obj;
    this.win = win;
}
////////////////////////////////////////////////////////////
// Die eigentliche Funktion um einen Layer zu fixieren
var c = 0;

function _fixLayer_()
{
    for(var i = 0; i < _STICKY_OBJ_.length; i++)
    {
       var l = _STICKY_OBJ_[i];
       if(!l) continue;
       var offset = pageOffset(l.win);
       pagePos(l.obj, l.top + offset.top, l.left + offset.left, l.win);
       if(DEBUG) window.status = 'top/left'  + (l.top + offset.top) + '/' +
       (l.left + offset.left);
    }
}
var _STICKY_OBJ_ = new Array(); // benötigt fixLayer