/**
*@fileoverview In dieser Datei werden Hilfsfunktionen für Formulare definiert
*@author Guido Fünders, fuenders@traveltainment.de
*/

/**
*Enthält Methoden für den einfacheren Umgang mit Formularen
*@constructor
*@extends TTIBE
*/
function FormBase(){
  /**
  *Füllt eine Selectbox mit den Daten eines Arrays.
  *Die Arrayelemente müssen dafür wie folgt aussehen: "label;value"
  *@param {String} selname Name der zu füllenden Selectbox
  *@param {Array} arrdata Array der die Daten enthält
  */
  this.fillSelFromArray = function(selname,arrdata){
    var sb = document.forms[this.formname].elements[selname] || 0;
    if(!sb || sb.type!='select-one') return;
    var sel = this.req[selname]!='undefined'?this.req[selname]:'';

    for(var i=0;i<arrdata.length;i++){
      var lbl = arrdata[i].split(';')[0];
      var val = arrdata[i].split(';')[1];
      sb.options[sb.options.length] = new Option(lbl,val);
      if(val==sel) sb.options[sb.options.length-1].selected=true;
    }
  };

  /**
  *Füllt eine Selectbox mit den Daten eines Arrays, mit zusätzlicher,
  *optionaler class für die options.
  *Die Arrayelemente müssen dafür wie folgt aussehen: "label;value;classname"
  *@param {String} selname Name der zu füllenden Selectbox
  *@param {Array} arrdata Array der die Daten enthält
  */
  this.fillSelFromArrayStyled = function(selname, arrdata) {
    var sb = document.forms[this.formname].elements[selname] || 0;
    if (!sb || sb.type != 'select-one') return;
    var sel = this.req[selname] != 'undefined' ? this.req[selname] : '';
    for (var i = 0; i < arrdata.length; i++) {
      var arrTmp = arrdata[i].split(';');
      var lbl   = arrTmp[0];
      var val   = arrTmp[1];
      var cName = arrTmp[2] || '';
      sb.options[sb.options.length] = new Option(lbl, val);
      if (val == sel) sb.options[sb.options.length-1].selected = true;
      if (cName != '') sb.options[sb.options.length-1].className = cName;
    }
  };

  /**
  *Füllt eine Selectbox mit den Daten eines Objekts.
  *Die Attributnamen entsprechen den Values, Die Attributwerte den Labels
  *@param {Object} boxobject Objekt mit den zu füllenden Selectbox.
  */
  this.fillSels = function(boxobject) {
    for(var boxname in boxobject) {
      this.fillSelFromArray(boxname,boxobject[boxname]);
    }
  };

  /**
  *Füllt eine Selectbox mit den Daten eiens Objekts anhand von Bitwerten.
  *Die Attributnamen entsprechen den Values, Die Attributwerte den Labels
  *(wird z.B. bei den erweierten Zimmertypen in LMPS benutzt)
  *@param {Object} boxobject Objekt mit den zu füllenden Selectbox.
  */
  this.fillBitSels = function(boxobject) {
    for(var boxname in boxobject) {
      var sb = document.forms[this.formname].elements[boxname] || 0;
      if(!sb || sb.type!='select-one') continue;
      var arrdata = boxobject[boxname];
      var sel = this.req[boxname]!='undefined'?parseInt(this.req[boxname]):0;
      sel = sel<0?0:sel;
      for(var i=0;i<arrdata.length;i++){
        var lbl = arrdata[i].split(';')[0];
        var val = arrdata[i].split(';')[1];
        sb.options[sb.options.length] = new Option(lbl,val);
        if((parseInt(val,10)&sel)!=0){
            sb.options[sb.options.length-1].selected=true;
        }
      }
    }
  };

  /**
  *Setzt Radiovalues
  *@param {Array} rnames Array mit den zu Namen der Radiobuttons
  */
  this.setRadios = function(rnames){
    for(var i=0;i<rnames.length;++i){
      var rb = document.forms[this.formname].elements[rnames[i]] || 0;
      if(!rb) continue;
      var val = this.req[rnames[i]]!='undefined'?this.req[rnames[i]]:'';
      for(var j=0;j<rb.length;j++)
        if(rb[j].value==val) rb[j].checked=true;
    }
  };

  /**
  *Setzt Checkboxen
  *@param {Array} cknames Array mit den zu Namen der Checkboxen
  */
  this.setChecks = function(cknames){
    for(var i=0;i<cknames.length;++i){
      var cb = document.forms[this.formname].elements[cknames[i]] || 0;
      if(!cb) continue;
      var val = typeof(this.req[cknames[i]])!='undefined'?this.req[cknames[i]]:'';
      if(cb && cb.value==val) cb.checked=true;
    }
  };

  /**
  *Setzt Checkboxen anhand von Bitwerten (z.B. "meer" oder "zfilter" bei LMPS)
  *@param {Array} cknames Array mit den zu Namen der Checkboxen
  */
  this.setBitChecks = function(cknames){
    for(var i=0;i<cknames.length;++i){
      var cb = document.forms[this.formname].elements[cknames[i]] || 0;
      if(!cb) continue;
      var val = typeof(this.req[cknames[i]])!='undefined'?parseInt(this.req[cknames[i]],10):0;
      val = val<0?0:val;
      if(cb && (parseInt(cb.value,10)&val)!=0) cb.checked=true;
    }
  };

  /**
  *Setzt Checkboxen anhand von Bitwerten (z.B. "sports") bei Checkboxgruppen
  *@param {Array} cknames Array mit den zu Namen der Checkboxen
  */
  this.setBitChecksGroups = function(cknames){
    for(var i=0;i<cknames.length;++i){
        cba = document.getElementsByName(cknames[i]);
        for(var j=0;j<cba.length;++j){
          var cb = cba[j];
          if(!cb) continue;
          var val = typeof(this.req[cknames[i]])!='undefined'?parseInt(this.req[cknames[i]],10):0;
          val = val<0?0:val;
          if(cb && (parseInt(cb.value,10)&val)!=0) cb.checked=true;
        }
    }
  };

  /**
  *Füllt Textfelder
  *@param {Array} txtnames Array mit den Namen der zu füllenden Textfelder
  */
  this.setTexts = function(txtnames){
    for(var i=0;i<txtnames.length;++i){
      var tb = document.forms[this.formname].elements[txtnames[i]] || 0;
      if(!tb) continue;
      var val = typeof(this.req[txtnames[i]])!='undefined'?this.req[txtnames[i]]:'';
      if(tb) tb.value=val;
    }
  };

  /**
  *C(hange)Rad(io): setzt einen Radiowert (erweiterte Zimmertypen)
  *@param {INT} val Kenner
  */
  this.CRad = function(val){
    if(val==1) document.forms[this.formname].zimmer[6].checked=true;
    else document.forms[this.formname].zimmer2.selectedIndex=0;
  };

  /**
  *Füllt die Selectboxen für die Reisenden (Erwachsene + 3x Kinderalter)
  */
  this.fillReisende = function(optUsrPersLbl){
    var defPersLbl = {
      erw:["Erwachsener","Erwachsene"],  // "normal"
      erw_short:["Erw.","Erw."],         // Formular 2 / Nur Flug
      pers:["Person","Personen"],        // Fewo
      kinder:["Jah.","Jahre"]
    };
    
    /* overwrite defPersLbl for multilanguage capability */
    if (typeof stringRessources != 'undefined' && typeof stringRessources.common != 'undefined') {
        if (typeof stringRessources.common.sadult == 'undefined') {
            defPersLbl.erw[0]       = stringRessources.common.sadult;
        }
        if (typeof stringRessources.common.sadults == 'undefined') {
            defPersLbl.erw[1]       = stringRessources.common.sadults;
        }
        if (typeof stringRessources.common.sadultAbbr == 'undefined') {
            defPersLbl.erw_short[0] = stringRessources.common.sadultAbbr;
            defPersLbl.erw_short[1] = stringRessources.common.sadultAbbr;
        }
        if (typeof stringRessources.common.sperson == 'undefined') {
            defPersLbl.pers[0]      = stringRessources.common.sperson;
        }
        if (typeof stringRessources.common.spersons == 'undefined') {
            defPersLbl.pers[1]      = stringRessources.common.spersons;
        }
        if (typeof stringRessources.common.sy == 'undefined') {
            defPersLbl.kinder[0]    = stringRessources.common.sy;
        }
        if (typeof stringRessources.common.syears == 'undefined') {
            defPersLbl.kinder[1]    = stringRessources.common.syears;
        }
    }
    var optPersLbl= optUsrPersLbl || defPersLbl;
    var strPers = this.Personen;
    var bform = document.forms[this.formname];
    var elems = ['alter1', 'alter2','alter3'];
    var erwSel = bform.erwachsene;
    var strErw = "25";
    var erwMax = this.req['engine']=='fewo'?8:4;
    if (typeof(bform.erwachsene) != 'undefined'){
        for(var i=1;i<=erwMax;i++){
          if(this.req['engine']=='fewo')
            var lbl = i==1?optPersLbl['pers'][0]:optPersLbl['pers'][1];
          else if(this.req['formular']=='2' || this.req['formular']=='3' ||
                  typeof(window['SucheERDEKlein'])!='undefined' ||
                  typeof(window['SucheLMPSKlein'])!='undefined')
            var lbl = i==1?optPersLbl['erw_short'][0]:optPersLbl['erw_short'][1];
          else
            var lbl = i==1?optPersLbl['erw'][0]:optPersLbl['erw'][1];
          erwSel.options[erwSel.options.length] = new Option(i+" "+lbl,strErw);
          strErw += ";25";
        }
        erwSel.options.selectedIndex = this.AnzErwachsene-1;

        for(var i=0;i<elems.length;++i){
          if(bform[elems[i]]){
            bform[elems[i]].options[0] = new Option(" --- ","-1");
            bform[elems[i]].options[1] = new Option("< 2 "+optPersLbl['kinder'][0],"1");
            for(var j=2;j<=16;j++)
              bform[elems[i]].options[j] = new Option(j+" "+optPersLbl['kinder'][1],j);
            if(this.AlterKinder[i] && this.AlterKinder[i]!="-1")
              bform[elems[i]].value=this.AlterKinder[i];
          }
        }
    }
  };

  /**
  *Füllt die "Dauer"-Selectbox mit Tagen (Erde/Flug)
  */
  this.dauert = function(){
    var sRCsany  = 'beliebig';
    var sRCsday  = 'Tag';
    var sRCsdays = 'Tage';
    if (typeof stringRessources != 'undefined' && typeof stringRessources.common != 'undefined') {
        if (typeof stringRessources.common.sany != 'undefined') {
            sRCsany = stringRessources.common.sany;
        }
        if (typeof stringRessources.common.sday != 'undefined') {
            sRCsday = stringRessources.common.sday;
        }
        if (typeof stringRessources.common.sdays != 'undefined') {
            sRCsdays = stringRessources.common.sdays;
        }
    }
    var sb = document.getElementsByName('dauer')[0] || 0;
    if(!sb || sb.type!='select-one') return;
    sb.options[sb.options.length] = new Option(sRCsany,"-1");
    sb.options[sb.options.length] = new Option("1 " + sRCsday,"6_1");
    for(i=2;i<=21;i++){
      sb.options[sb.options.length] = new Option(i + " " + sRCsdays,"6_"+i);
    }
    sb.options[sb.options.length] = new Option("> 22 " + sRCsdays,"13");
    try{
      if(this.req['dauer']!='' && this.req['dauer']!='-1')
        sb.value=this.req['dauer'];
    }catch(e){}
  };


    /**
     * lcfilter
     * - betrifft ohneTransfer und Mietwagen
     * befüllt ohneTransfer / mitMietwagen Auswahl
     * funktioniert mit Radios und SelectBoxen
     */
    this.setFormsForLcfilter = function (nameValueObj) {

        if (typeof nameValueObj == 'undefined') {
            alert('keine Definition für lcfilter Formularfelder vorgegeben - Bitte optLcfilter definieren!');
            return;
        }

        var withoutTransfer = '-1';
        var withRentalCar   = '-1';
        
        if (typeof this.req['lcfilter'] != undefined) {
            var lcFilter = this.req['lcfilter'];

            // *** lcfilter auswerten ******************************************
            
            if (lcFilter.search(';') == -1) {
                if (lcFilter != '') {
                    // --- Transfer ---
                    if (lcFilter & 512) {
                        withoutTransfer = '1';
                        lcFilter = parseInt(lcFilter);
                        lcFilter |= 512;
                    }
                    // --- Mietwagen ---
                    if (lcFilter & 1) {
                        withRentalCar = '1';
                        lcFilter = parseInt(lcFilter);
                        lcFilter |= 1;
                    }                    
                    this.req['lcfilter'] = lcFilter + ';' + lcFilter;
                }
            } else {
                var lcFilterArr = lcFilter.split(';');
                    lcFilterArr[0] = parseInt(lcFilterArr[0]);
                    lcFilterArr[1] = parseInt(lcFilterArr[1]);
                // --- Transfer ---
                if (lcFilterArr[0] & 512 && lcFilterArr[1] & 512) {
                    withoutTransfer = '1';
                } else if (lcFilterArr[0] & 512 && lcFilterArr[1] ^ 512) {
                    withoutTransfer = '0';
                }
                // --- Mietwagen ---
                if (lcFilterArr[0] & 1 && lcFilterArr[1] & 1) {
                    withRentalCar = '1';
                } else if (lcFilterArr[0] & 1 && lcFilterArr[1] ^ 1) {
                    withRentalCar = '0';
                }
            }
            
            // *** Formularfelder belegen **************************************
            var bForm                = document.bengine;
            var bFormWithoutTransfer = bForm.lcfilterWithoutTransfer;
            var bFormWithRentalCar   = bForm.lcfilterWithRentalCar;
            
            /* *** SelectBox *** */
            if (typeof bFormWithoutTransfer != 'undefined' && bFormWithoutTransfer.type == 'select-one') {
                for (var i = 0; i < nameValueObj.withoutTransfer.length; i++) {
                    bFormWithoutTransfer.options[i] = new Option(nameValueObj.withoutTransfer[i].name, nameValueObj.withoutTransfer[i].value, true, ((withoutTransfer == nameValueObj.withoutTransfer[i].value) ? true : false));
                }
            }
            if (typeof bFormWithRentalCar != 'undefined' && bFormWithRentalCar.type == 'select-one') {
                for (var i = 0; i < nameValueObj.withoutTransfer.length; i++) {
                    bFormWithRentalCar.options[i] = new Option(nameValueObj.withRentalCar[i].name, nameValueObj.withRentalCar[i].value, true, ((withRentalCar == nameValueObj.withRentalCar[i].value) ? true : false));
                }
            }
            /* *** RadioButton *** */        
            if (typeof bFormWithoutTransfer != 'undefined' && bFormWithoutTransfer.length > 1 && bFormWithoutTransfer[0].type == 'radio') {
                for (var i = 0; i < bFormWithoutTransfer.length; i++) {
                    if (bFormWithoutTransfer[i].value == withoutTransfer) {
                        bFormWithoutTransfer[i].checked = true;
                        break;
                    }
                }
            }
            if (typeof bFormWithRentalCar != 'undefined' && bFormWithRentalCar.length > 0 && bFormWithRentalCar[0].type == 'radio') {
                for (var i = 0; i < bFormWithRentalCar.length; i++) {
                    if (bFormWithRentalCar[i].value == withRentalCar) {
                        bFormWithRentalCar[i].checked = true;
                        break;
                    }
                }
            }            
            
            // *** Events dranhängen *******************************************
            // --- SelectBox withoutTransfer ---
            if (typeof bFormWithoutTransfer != 'undefined' && bFormWithoutTransfer.type == 'select-one') {
                if (typeof window.attachEvent != 'undefined') {
                    bFormWithoutTransfer.attachEvent('onchange', IBE.setLcfilterHiddenFieldForSearch);
                } else {
                    bFormWithoutTransfer.setAttribute('onchange', 'IBE.setLcfilterHiddenFieldForSearch();');
                }
            }
            // --- SelectBox withRentalCar ---
            if (typeof bFormWithRentalCar != 'undefined' && bFormWithRentalCar.type == 'select-one') {
                if (typeof window.attachEvent != 'undefined') {
                    bFormWithRentalCar.attachEvent('onchange', IBE.setLcfilterHiddenFieldForSearch);
                } else {
                    bFormWithRentalCar.setAttribute('onchange', 'IBE.setLcfilterHiddenFieldForSearch();');
                }
            }
            // --- radioButton withoutTransfer ---
            if (typeof bFormWithoutTransfer != 'undefined' && bFormWithoutTransfer.length > 1 && bFormWithoutTransfer[0].type == 'radio') {
                for (var i = 0; i < bFormWithoutTransfer.length; i++) {
                    if (typeof window.attachEvent != 'undefined') {
                        bFormWithoutTransfer[i].attachEvent('onclick', IBE.setLcfilterHiddenFieldForSearch);
                    } else {
                        bFormWithoutTransfer[i].setAttribute('onclick', 'IBE.setLcfilterHiddenFieldForSearch();');
                    }
                }
            }
            // --- radioButton withRentalCar ---
            if (typeof bFormWithRentalCar != 'undefined' && bFormWithRentalCar.length > 0 && bFormWithRentalCar[0].type == 'radio') {
                for (var i = 0; i < bFormWithRentalCar.length; i++) {
                    if (typeof window.attachEvent != 'undefined') {
                        bFormWithRentalCar[i].attachEvent('onclick', IBE.setLcfilterHiddenFieldForSearch);
                    } else {
                        bFormWithRentalCar[i].setAttribute('onclick', 'IBE.setLcfilterHiddenFieldForSearch();');
                    }
                }
            }
        } else {
            alert ('lcfilter nicht in IBE.req[] gesetzt.');
        }
    };
    
    
    /**
     * lcfilter 
     * - betrifft ohneTransfer und Mietwagen
     * berechnet aus bestehenden und neu gesetzten Optionen den lcfilter String <MASKE>;<FILTER>
     * und befüllt hidden Field
     */
    
    this.setLcfilterHiddenFieldForSearch = function () {

        var bForm                = document.bengine;
        var bFormWithoutTransfer = bForm.lcfilterWithoutTransfer;
        var bFormWithRentalCar   = bForm.lcfilterWithRentalCar;
        var aLcfilter            = new Array();
        var withoutTransferValue = '';
        var withRentalCarValue   = '';
                
        if (IBE.req['lcfilter'] != '') {
            aLcfilter = IBE.req['lcfilter'].split(';');
        }

        if (typeof bFormWithoutTransfer != "undefined") {
            if (typeof bFormWithoutTransfer != "undefined" && bFormWithoutTransfer.type == "select-one") {
                withoutTransferValue = bFormWithoutTransfer.value;
            }
            if (typeof bFormWithoutTransfer != "undefined" && bFormWithoutTransfer.length > 1 && bFormWithoutTransfer[0].type == "radio") {
                for (var i = 0; i < bFormWithoutTransfer.length; i++) {
                    if (bFormWithoutTransfer[i].checked == true) {
                        withoutTransferValue = bFormWithoutTransfer[i].value;
                        break;
                    }
                }
            }
        }
        if (typeof bFormWithRentalCar != "undefined") {
            if (typeof bFormWithRentalCar != "undefined" && bFormWithRentalCar.type == "select-one") {
                withRentalCarValue = bFormWithRentalCar.value;
            }
            if (typeof bFormWithRentalCar != "undefined" && bFormWithRentalCar.length > 0 && bFormWithRentalCar[0].type == "radio") {
                for (var i = 0; i < bFormWithRentalCar.length; i++) {
                    if (bFormWithRentalCar[i].checked == true) {
                        withRentalCarValue = bFormWithRentalCar[i].value;
                        break;
                    }
                }
            }
        }
    
        // *** lcfilter erstellen **********************************************
        
        // erstmal eleminieren wenn gesetzt und benutzt wird
        if (typeof bFormWithoutTransfer != "undefined") {
            aLcfilter[0] &= ~512;
            aLcfilter[1] &= ~512;
            
        }
        if (typeof bFormWithRentalCar != "undefined") {
            aLcfilter[0] &= ~1;
            aLcfilter[1] &= ~1;
        }
        // dann nach Bedarf setzen
        if (withoutTransferValue == '0') {
            aLcfilter[0] |= 512;
            //aLcfilter[1] |= 0;
        } else if (withoutTransferValue == '1') {
            aLcfilter[0] |= 512;
            aLcfilter[1] |= 512;            
        }
        if (withRentalCarValue == '1') {
            aLcfilter[0] |= 1;
            aLcfilter[1] |= 1;
        } else if (withRentalCarValue == '0') {
            aLcfilter[0] |= 1;
            //aLcfilter[1] |= 0;            
        }
        if (typeof document.bengine.lcfilter != "undefined") {
            var newLcfilter = aLcfilter.join(";");
            if (newLcfilter != '' && newLcfilter != ';' && newLcfilter != '0;0') {
                document.bengine.lcfilter.value = aLcfilter.join(";");    
            } else {
                document.bengine.lcfilter.value = '';
            }
            
        } else {
            alert('Achtung!\r\nHiddenField lcfilter nicht gesetzt!');
        }
        //console.debug(document.bengine.lcfilter.value);
        //alert('===> ' + document.bengine.lcfilter.value);
    };
};
