/**
*@fileoverview In dieser Datei wird die TTIBE-Basisklasse definiert.
*Hier enthaltene Attribute und Methoden sind in den anderen Klassen ebenfalls
*verfügbar. Es wird beim Einbinden sieser Datei automatisch eine neue TTIBE-Instanz
*"IBE" erzeugt
*@author Guido Fünders, fuenders@traveltainment.de
*/
function twoDigit(val){
  return parseInt(val,10)<10?"0"+parseInt(val,10):parseInt(val,10);
}

//******************************************************************************
var oErrorLog={
  xmlReq: null,
  onAjaxSuccess: function(){},
  onAjaxError: function(){}
};

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

function TTAjaxRequest(sUrl,oOptions,pRefObj){
  var pRefObj  = pRefObj || window;
  this.Options = {
    method:'GET',
    params:'',
    async:true

  };
  Object.extend(this.Options,oOptions || {});
  this.Url = sUrl;
  if(this.Options.method.toUpperCase()=='GET' && this.Options.params!=''){
    if(this.Url.indexOf('?')!=-1)
      this.Url += "&"+this.Options.params;
    else
      this.Url += "?"+this.Options.params;
  }
  this.onStateChange = function(){
    if (!pRefObj || !pRefObj.xmlReq) {
      this.onStateChange = null;
      return;
    }
    if(pRefObj.xmlReq.readyState == 4){
      if(pRefObj.xmlReq.status == 200 || pRefObj.xmlReq.status == 304){
        if(pRefObj.xmlReq.responseText==""){
          pRefObj.onAjaxError();
        }else{
          pRefObj.onAjaxSuccess();
        }
      }else{
        pRefObj.onAjaxError();
      }
    }
  };
  var xmlRequest = false;
  try{
    xmlRequest = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
    try{
      xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");
    }catch(e){
      xmlRequest = false;
    }
  }
  if(!xmlRequest && typeof(XMLHttpRequest)!='undefined') {
    xmlRequest = new XMLHttpRequest();
  }
  if(xmlRequest){
    pRefObj.xmlReq = xmlRequest;
    pRefObj.xmlReq.open(this.Options.method,this.Url,this.Options.async);
    pRefObj.xmlReq.onreadystatechange = this.onStateChange;
    if(this.Options.method.toUpperCase()=='GET'){
      pRefObj.xmlReq.send(null);
    }else{
      pRefObj.xmlReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      pRefObj.xmlReq.send(this.Options.params);
    }
  }
}
//******************************************************************************

/**
*Dient als Basisklasse. Hier enthaltene Attribute und Methoden
*sind in den anderen Klassen ebenfalls verfügbar.
*@constructor
*@param {String} name Name der Instanz
*@param {Int} port Engine-Port
*@param {String} formname Name des Formulars
*/
function TTIBE(name,port,formname){
  /**
  *Name der TTIBE Instanz
  *@type String
  */
  this.name     = typeof(name)!='undefined'?name:"IBE";
  /**
  *Engine-Port
  *@type Int
  */
  this.port     = typeof(port)!='undefined'?port:654;
  /**
  *Name des zugehörigen Formulars
  *@type String
  */
  this.formname = typeof(formname)!='undefined'?formname:"bengine";
}

TTIBE.prototype = {
  /**
  *Überträgt Objektattributen eines Quellobjekts auf ein Zielobjekt
  *@param {Object} dest Zielobjekt
  *@param {Object} src Quellobjekt
  *@return Zielobjekt
  *@type Object
  */
  extend: function(dest,src){
    for(attr in src) dest[attr]=src[attr];
    return dest;
  },

  /**
  *Dynamisches Einbinden einer JavaScript/CSS-Datei
  *@param {String} tag Der Tagname des Includes ('script' oder 'link')
  *@param {String} pfad Der Pfad zu der einzubindenden Datei
  */
  include: function(tag,pfad){
    var attrs = {
      link:   {rel:"stylesheet",type:"text/css",href:pfad},
      script: {type:"text/javascript",src:pfad}
    };
    document.getElementsByTagName("head")[0].appendChild(
      this.extend(document.createElement(tag),attrs[tag])
    );
  },

  /**
  *Dynamisches Einbinden mehrer JavaScript/CSS-Dateien
  */
  includeFiles: function(){
    for(var i in window["cacheFiles_"+this.port]){
      if(this.req['nurflug']=='1' && (window["cacheFiles_"+this.port][i].search(/regionen.*/)!=-1)) continue;
      else if(this.req['engine']=='erde' && this.req['formular']=='2' && (window["cacheFiles_"+this.port][i].search(/regionen.*/)!=-1)) continue;
      this.include("script",cacheurl+"booking/cache/"+KID+"/"+this.port+"/"+window["cacheFiles_"+this.port][i]);
    }
    for(var i in this.jsFiles) this.include("script",this.jsFiles[i]);
  },

  /**
  *Übertragen von Attributen und Methoden von einer oder mehreren Klassen (Mehrfachvererbung)
  *@param {Object} Objekt mit den Klassennamen und entsprechenden Konstruktorargumenten
  */
  inject: function(obj){
    for(var ClassName in obj){
      //window[ClassName].apply(this,obj[ClassName]);
      try{
        window[ClassName].apply(this,obj[ClassName]);
      }catch(e){
        var strError = ClassName+" - type: "+typeof(window[ClassName])+"\n";
        strError += "typeof Args = "+typeof(obj[ClassName])+"\n";
        for(i=0;i<obj[ClassName].length;i++){
          strError += "arg["+i+"]="+obj[ClassName][i]+", type="+typeof(obj[ClassName][i])+"\n\n";
        }

        for(var i in e){
          if(i=='number'){
            strError += "number: "+(e[i] & 0xFFFF)+"\n";
            //strError += "facility: "+translate_facility((e[i] & 0xFFF0000)>>16)+"\n";
          }else
            strError += i+": "+e[i]+"\n";
        }

        var url = '/booking_ml/jslib/errorReport.php';
        var par = 'errKID=TCF'
                + '&errMessage=' + escape(strError)
                + '&errBrowser=' + escape(navigator.userAgent)
        var ttajax = new TTAjaxRequest(url,{
          params: par,
          method: 'GET',
          async: false
        }, oErrorLog);
        alert("An error occured ('"+ClassName+"')\n\nPlease reload the page.");
      }
    }
  },

  /**
  *Schreibt für die Elemente im "hidf" Objekt entsprechende Hiddenfelder
  */
  writeHF: function(){
    for(hfname in this.hidf){
      document.write('<input type="hidden" name="'+hfname+'" value="'+this.hidf[hfname]+'">'+"\n");
    }
  }
};
