/*
    Datei: lib.js
    Datum: 15.04.2005
    struebig@gmx.net
    http://javascript.jstruebig.de/

    Beschreibung:
    Basis Bibliothek!

    include( datei )

    Einbinden von Bibliotheken.
    Die Datei wird relativ von lib.js angegeben.
    Netscape 4.x kann den Pfad dieser Datei nicht selbständig
    herausfinden.
*/
var NL = "\n";
var Px = document.childNodes ? 'px' : '';
var DEBUG = 1;
var JS_LIB = '.'; // Default Verzeichniss - bei Bedarf ändern;

///////////////////////////////////////////////////////////
function include(lib)
///////////////////////////////////////////////////////////
{
    document.write('<script type="text/javascript" src="'
    + JS_LIB + '/'
    + lib
    + '"><\/script>'
    + NL);

}
///////////////////////////////////////////////////////////
function debug(obj)
///////////////////////////////////////////////////////////
{
    var text = 'Debug: ' + (obj.id || obj.name) + NL;
    for(var i in obj)
    {
        if(typeof obj[i] == 'function') continue;
        text += ( i + '=' + obj[i] + NL);
    }
    return text;
}


///////////////////////////////////////////////////////////
// Eventlistener
var EVT = new Object();
EVT.mousemove = 'onmousemove';
EVT.mousedown = 'onmousedown';
EVT.mouseup   = 'onmouseup';
EVT.mouseover = 'onmouseover';
EVT.mouseout  = 'onmouseout';
EVT.load      = 'onload';
EVT.click     = 'onclick';
EVT.dblclick  = 'ondblclick';

EVT.id        = 0;
///////////////////////////////////////////////////////////
function addEvent(wo, evt, func, evt_through)
{
    if(!wo || !evt) return alert('Syntaxfehler: addEvent( wo, evt, function)');
    // func muss eine Referenz auf eine Funktion sein.
    if(typeof func != 'function') return alert('Funktionsreferenz erwartet');
    if(!EVT[evt]) return alert(evt + ' ist kein gültiger Event');

    var e = EVT[evt];
    // Vorbereitungen für NC 4.x
    if(window.addEventListener)
    {
          wo.addEventListener(e, EVENT_CATCHER, false);
    }
    else if(typeof document.layers != 'undefined')
    {
          var cpt_evt = null;
          // Netscape 4 fängt nicht das onclick event.
          if(evt == 'click') e = 'mousedown';

          if(evt == 'mousedown') cpt_evt = Event.MOUSEDOWN;
          else if(evt == 'mousemove') cpt_evt = Event.MOUSEMOVE;
          else if(evt == 'mouseover') cpt_evt = Event.MOUSEOVER;
          else if(evt == 'mouseout') cpt_evt = Event.MOUSEOUT;

          wo.captureEvents(cpt_evt);
    }
    // Die Events sammeln
    if(typeof wo.hook == 'undefined') wo.hook = new Array();

    // Den Event vorbereiten
    if(typeof wo.hook[evt] == 'undefined')
    {
        wo.hook[evt] = new Array();
        // alten Event sichern
        if(typeof wo[evt] == 'function') wo.hook[evt][wo.hook.length] = wo[evt];
        wo[e] = EVENT_CATCHER;
    }
    func.evt_id = EVT.id++;
    func.evt_through = !!evt_through;
    wo.hook[evt][func.evt_id] = func;
    return func.evt_id;
}
function removeEvent(wo, id)
{
    for(var e in wo.hook)
    {
         for(var evt_id in wo.hook[e])
         {
              if(evt_id == id)
              {
              delete wo.hook[e];
              }
         }
    }
}
//////////////////////////////////////////////////////////
function EVENT_CATCHER(e)
{
    var evt = prepareEvent(e);
    var i, func;
    if(!this.hook)
    {
    for(i in window.hook[evt.type])
    {
         func = window.hook[evt.type][i];
         if(func.evt_through) func(evt, window);
         else func(window);
    }
    }
    else
    {
         for(i in this.hook[evt.type])
         {
              func = this.hook[evt.type][i];
              if(func.evt_through) func(evt, this);
              else func(this);
         }
    }
    return true;
}


//////////////////////////////////////////////////////////
// Crossbrowser Event Funktionen
// fügt dem Event folgende Eigenschaften zu:
// code = Tastaturcode
// posX/posY = Position im Dokument.
// target = Objekt das den Event auslöst.
function prepareEvent(e)
{
    if(!e) e = window.event;

    var o = {};
    o.type = e.type;
    // Tastaturcode
    o.code = e.keyCode ? e.keyCode : e.which ? e.which :  null;

    if (e.pageX || e.pageY)
    {
         o.posX = e.pageX;
         o.posY = e.pageY;
    }
    else if (e.clientX || e.clientY)
    {
         o.posX = e.clientX + document.body.scrollLeft;
         o.posY = e.clientY + document.body.scrollTop;
    }
    o.target = e.target ? e.target :
    e.srcElement ? e.srcElement:
    e.nodeType == 3 ? // defeat Safari bug
    o.target.parentNode : null;
    return o;
}
//////////////////////////////////////////////////////////
// Den Pfad zu den Libaries suchen

var JS_LIB = 'lib';
if(self.document.getElementsByTagName)
{
    // DOM
    var o = self.document.getElementsByTagName('script');
    for(var i = 0; i < o.length; i++)
    {
         var src = o[i].src;
         if(src && src.lastIndexOf('lib.js') > -1)
         {
              JS_LIB = src.substring(0, src.lastIndexOf('lib.js') - 1) ;
              break;
         }
    }
}
else
{
    // IE 4
    var o = document.all;
    for(var i = 0; i < o.length; i++)
    {
         if( o[i].tagName == 'SCRIPT' && o[i].src.indexOf('lib.js') != -1)
         {
              var src = o[i].src;
              var idx = src.indexOf('/');
              if(idx == -1) idx = 1
              var base = self.location.href;
              base = base.substring(0, base.lastIndexOf('/') );
              JS_LIB = base + '/' + src.substring(0, idx  );
              break;
         }
    }
}