Object.prototype.extendOpts = function(objOpts){
	for(strEntry in objOpts)
  	this[strEntry] = objOpts[strEntry];
}

/* Ajax-Klasse
 *
 * Eigenschaften des Objekts im Parameter objArgs:
 * -----------------------------------------------
 * method  - (string) gewünschte Methode (post, get ..)
 * async   - (bool) Asynchroner (true) oder synchroner (false) Request
 * data    - (string) Datenstring mit Request-Parametern (z.B. text=1&args=2)
 * nocache - (bool) Daten sollen gecached werden (false), ohne Caching (true)
 * url     - (string) Request-URL
 */
clAjax = function(objArgs){
	// Basis-Objekt mit Default-Werten
  var objAjax = {
  	method: "GET",
    async: true,
    nocache: true,
    data: ''
  };

  // Objekt erweitern
  objAjax.extendOpts(objArgs);

  // Erweiterung des Basis-Objektes um die Methode zum Ausführen des Requests
  objAjax.request = function(){
    try{
	  	// Erstellen des XMLHttpRequest-Objekts
	    this.xmlReq = window.XMLHttpRequest ? new XMLHttpRequest()
	              													: new ActiveXObject("Microsoft.XMLHTTP");

      // Methode anpassen
      this.method = this.method.toUpperCase();

      // String für send-Methode generieren
	    //this.sendData = (this.method.toUpperCase() == "GET")? null : this.data;
      this.sendData = (this.method.toUpperCase() == "GET")? ((document.all && !window.opera)?null:true) : this.data;

	    // Aufbereiten der URL
	    this.url = ((this.method == "POST") || (this.data == ""))
      						// Falls es sich um einen POST-Request handelt oder der Request-String leer ist -> nur URL
	                ? this.url
                  // Falls es sich um einen GET-Request handelt und Request-Daten vorhanden sind
	                : (
	                    (this.url.indexOf('?') == -1)
	                      ? this.url + '?' + encodeURI(this.data)  // Falls es sich um die ersten Parameter handelt -> ? voranstellen
	                      : this.url + '&' + encodeURI(this.data)  // Sonst - Parameter mit Kaufmanns-UND anhängen
	                  );

	    // Initialisieren des Requests
	    this.xmlReq.open(this.method, this.url, this.async);

	    // Falls es sich um einen POST-Request handelt -> senden der bei POST erforderlichen Request-Header
	    if(this.method == "POST"){
	      this.xmlReq.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	      this.xmlReq.setRequestHeader("Content-length", this.sendData.length);
	      this.xmlReq.setRequestHeader("Connection", "close");
	    }

	    // Falls die Nutzung des Cache verhindert werden soll
	    if(!typeof this.nocache || this.nocache){
	    	this.xmlReq.setRequestHeader("If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT");
	    }

	    // Falls eine verarbeitende Callback-Funktion übergeben wurde
	    //if((typeof this.onComplete != 'undefined') && (typeof window[this.onComplete] == 'function')){
      if((typeof this.onComplete != 'undefined') && (typeof this.onComplete == 'function')){
      	var _this = this;
	      this.xmlReq.onreadystatechange = function(){
        	if((_this.xmlReq.readyState==4) && (_this.xmlReq.status==200)){
	          // Übergebene Fkt. aus dem window-Kontext mit Basis-Objekt (xmlReq) aufrufen
	          // objAjax.xmlReq entspricht XMLHttpRequest-Objekt
	          //window[objAjax.onComplete](objAjax);
            _this.onComplete(_this);
          }
	      };
	    }

	    // Request absetzen
	    this.xmlReq.send(this.sendData);

    }catch(objExcNoRequest){
      try{
      	console.log('Fehler:AJAX.request()');
      }catch(objExcNoConsole){}
    }
  }

  // Rückgabe des Basis-Objekts
  return objAjax;
}



/*
 * Klasse zum Initialisieren und periodischen Wechseln der Werbung
 *
 * Methoden:
 * - .init(objArgs) - Initialisiert die Klasse mit dem Objekt in objArgs
 * - .updateAd()    - Führt einen Ajax-Request aus und aktualisiert die Anzeige<br>
 *
 * Initialisierungsobjekt:
 * - id     - (string) ID des Elements, dass mit dem neuen Inhalt aktualisiert werden soll
 * - delay  - (integer) Intervall, nach dem die Werbung aktualisiert werden soll (in Millisekunden)
 * - method - (post/get) Methode des Ajax-Requests
 * - url    - (string) URL des Scripts, das den Request bearbeitet und die Antwort liefert
 *
 * Das Initialisierungsobjekt wird als Objektliteral übergeben. Bsp:
 *	qp_Ad({
 * 	  delay: 5000,
 *     url: 'req_script.php',
 *     method: 'post',
 *     id: 'ad_id'
 *   }).init();
 */
var qp_Ad = function(objArgs){
	var objOpt = {
  	id: 'ad_id',
    delay: 10000,
    method: 'post',
    url: 'inc/__docpart_bookad.inc.php'
  };

  // Objekt erweitern
  objOpt.extendOpts(objArgs);

  objOpt.init = function(){
  	// this-Referenz closuren
    var _this = this;

    // Werbungselement ermitteln
	  var objElem = document.getElementById(this.id);
    // Bei mouseover Timer stoppen
	  objElem.onmouseover = function(){window.clearTimeout(hTimer);};
    // Bei mouseout Timer und somit Inhaltswechsel wieder starten
	  objElem.onmouseout  = function(){hTimer = window.setTimeout(function(){qp_Ad({url:_this.url, delay: _this.delay}).updateAd();}, _this.delay);};

    // Wechsel-Methode starten
	  hTimer = window.setTimeout(function(){qp_Ad({url:_this.url, delay: _this.delay}).updateAd();}, _this.delay);

    return objOpt;
  };

  // Wechselmethode
  objOpt.updateAd = function(){
  	// this-Referenz closuren
    var _this = this;
    //alert(this.url);

    // Ajax-Klasse initialisieren und Request ausführen
	  clAjax({
	    'url': this.url,
	    'data': 'req=1&args='+new Date().getTime(),
	    'method': this.method,
	    'id': this.id,
	    'onComplete': function(objThis){
	      document.getElementById(objThis.id).innerHTML = unescape(objThis.xmlReq.responseText);
	    }
	  }).request();

    // Wechselfunktion zeitverzögert erneut aufrufen
	  hTimer = window.setTimeout(function(){qp_Ad({url:_this.url, delay: _this.delay}).updateAd();}, _this.delay);

    return objOpt;
  }

  return objOpt;
}