// Basisobjekt
// Copyright 2009 Herbert Gebhart

//Global die Stringfunktionen erweitern!
String.prototype.ltrim=function() {return this.replace(/\s*((\S+\s*)*)/, "$1");}
String.prototype.rtrim=function() {return this.replace(/((\s*\S+)*)\s*/, "$1");}
String.prototype.trim=function() {return this.ltrim().rtrim();}

function gpobject()
{
  this.gpevents=null;	//Für Liste der eingetragenen Events - eventID,eventtype,eventdata,docobj,eventfunc,eventfuncdata,eventhandlerfunc

  //Initialisierung der Klasse
  this.init = function()
  {
    this.gpevents=new Array();
  }


  //ein Event eintragen und den Handler erzeugen!
  //Parameter:	eventID - ID zur Erkennung (fürs Entfernen)
  //		eventtype - Art des Events (=Parameter für addEventListener/attachevent) z.B. "click"
  //				oder auch die Window-Methoden "timeout"/"interval"
  //				oder auch "gpuser" für programmatisch/eigene auszulösende Events.
  //		eventdata - Parameter für Eventerzeugung, e.g. Zeitangabe für Timeout & Interval
  //		docobj - HTML-Object, in welches das Event eingetragen werden soll (muß eine ID haben und ein eingetragenes 'gpobject'!)
  //		eventfunc - die aufzurufende Funktion
  //		eventfuncdata - Userdaten für Funktion
  //Beim Event werden folgende Daten übergeben:
  // event - die Systemdaten
  // eventobj - dieses Objekt
  // userdata - die spezifizierten Userdaten (eventfuncdata)
  // Es können mehrere gleiche Events eingetragen werden.
  this.setevent = function(eventID,eventtype,eventdata,docobj,eventfunc,eventfuncdata)
  {
    arguments.length = 8 //Feld vergrößern um Platz für Eventhandler-Routine und SystemIDs zu schaffen
    if (eventtype=="timeout")
    {
      arguments[7]=window.setTimeout("document.getElementById('" + docobj.id + "').gpobject.gptimeout('" + eventID + "','" + docobj.id + "')",eventdata);
    }
    else if (eventtype=="interval")
    {
      arguments[7]=window.setInterval("document.getElementById('" + docobj.id + "').gpobject.gpinterval('" + eventID + "','" + docobj.id + "')",eventdata);
    }
    else if (document.addEventListener)
      { arguments[6]=function(event) {this.gpobject.gpeventhandler(event,this);};
        docobj.addEventListener(eventtype,arguments[6],false);
      }
    else
      { arguments[6]=function(){gpIEeventhandler(docobj.id);};
        docobj.attachEvent("on"+eventtype,arguments[6]);
      }

    this.gpevents.push(arguments); // [eventID-0,eventtype-1,eventdata-2,docobj-3,eventfunc-4,eventfuncdata-5,eventhandlerfunc-6,sysID]
  }

  //ein Event aus der Liste entfernen
  //Parameter:	eventID - die ID zur Erkennung
  //		mythis - übergebenes gpobject, da this nicht immer stimmt
  //Falls keine weitere Funktion mehr eingetragen ist so wird auch der Handler entfernt!
  this.removeevent = function(eventID,mythis)
  {
    if (!mythis) {mythis=this}
    var l=mythis.gpevents.length;
    if (l==0) return null;
    
    for (var i=0; i<l;i++)
    {
      if (mythis.gpevents[i][0]==eventID)
      {
        var eventtype=mythis.gpevents[i][1];
      	if (eventtype=="timeout") { window.clearTimeout(mythis.gpevents[i][7]); }
        else if (eventtype=="interval") { window.clearInterval(mythis.gpevents[i][7]); }
        else
        {
   	  var docobj=mythis.gpevents[i][3];
      	  if (docobj.removeEventListener) { docobj.removeEventListener(eventtype,mythis.gpevents[i][5], false ); }
      	  else { docobj.detachEvent("on"+eventtype,mythis.gpevents[i][5]); }
        }
        return mythis.removeevententry(i,mythis)
      }
    }
  }

  //Nur den Eintrag eines Events entfernen
  this.removeevententry = function(i,mythis)
  {
    var l=mythis.gpevents.length;
    if (l==0) return null;
    
    l-=1
    mythis.gpevents[i][0]=mythis.gpevents[l][0]; //letztes Element nach vorne kopieren und Feld verkürzen
    mythis.gpevents[i][1]=mythis.gpevents[l][1];
    mythis.gpevents[i][2]=mythis.gpevents[l][2];
    mythis.gpevents[i][3]=mythis.gpevents[l][3];
    mythis.gpevents[i][4]=mythis.gpevents[l][4];
    mythis.gpevents[i][5]=mythis.gpevents[l][5];
    mythis.gpevents[i][6]=mythis.gpevents[l][6];
    mythis.gpevents[i][7]=mythis.gpevents[l][7];
    mythis.gpevents.length = l;
    return null;
  }


  //Verteilt einen Event an alle eingetragenen Funktionen
  //Beim Event werden folgende Daten übergeben:
  // event - die Systemdaten
  // docobj - auslösendes HTML-Object
  // eventobj - dieses Objekt (weil this nicht stimmen muß!)
  // userdata - die spezifizierten Userdaten (eventfuncdata)
  this.gpeventhandler = function(event,docobj)
  {
    if (!event) {event=window.event;}
    var mythis=docobj.gpobject;
    var myeventtype=event.type;

    for (var i=0;i<mythis.gpevents.length;i++)
    {
      if((mythis.gpevents[i][1]==myeventtype) && (mythis.gpevents[i][3]==docobj)) { mythis.gpevents[i][4](event,docobj,mythis,mythis.gpevents[i][5]); }
    }
  }

  //Eventhandler für Timeouts
  this.gptimeout = function(eventID,objID)
  {
    var docobj=document.getElementById(objID);
    var mythis=docobj.gpobject;
    var event = new Object(); //statt Systemobjekt ein eigenes erstellen für Übergabe des Eventtyps
    event.type="timeout"
  
    for (var i=0;i<mythis.gpevents.length;i++)
    {
      if (mythis.gpevents[i][0]==eventID)
      {
         var docobj=mythis.gpevents[i][3];
      	 var eventfunc=mythis.gpevents[i][4];
      	 var eventfuncdata=mythis.gpevents[i][5];
      	 mythis.removeevententry(i,mythis);  //da Timeouts nur einmalig sind, müssen Sie aus der Liste ausgetragen werden
      	 eventfunc(event,docobj,mythis,eventfuncdata);
      }
    }
  }

  //Eventhandler für Intervalle
  this.gpinterval = function(eventID,objID)
  {
    var docobj=document.getElementById(objID);
    var mythis=docobj.gpobject;
    var event = new Object(); //statt Systemobjekt ein eigenes erstellen für Übergabe des Eventtyps
    event.type="interval"
  
    for (var i=0;i<mythis.gpevents.length;i++)
    {
      if (mythis.gpevents[i][0]==eventID) { mythis.gpevents[i][4](event,docobj,mythis,mythis.gpevents[i][5]); }
    }
  }


  //this.init() //wird nur von abgeleiteten Klassen aufgerufen!
}//Ende der Klasse

//Globaler Eventhandler für IE Events
function gpIEeventhandler(objID)
{
  var docobj=document.getElementById(objID);
  var mythis=docobj.gpobject;
  mythis.gpeventhandler(window.event,docobj); //jetzt rufen wir den Handler im Objekt auf
  
  window.event.cancelBubble = true;
}

