/**
*@fileoverview In dieser Datei werden Methoden für Ziel-/Regionsauswahlboxen
*für Erde-Formulare definiert
*@author Guido Fünders, fuenders@traveltainment.de
*/

/**
*Enthält Methoden für das dynamische Füllen und Updaten von Ziel-/Regionsauswahlboxen
*@params {Object} ttregs  Regionsarray
*@constructor
*@extends TTIBE
*/
function Zielauswahl(optUserRegSelect){
  /**
  *Flag, ob ein Ziel(-Filter) ausgewählt ist oder nicht
  *@type Bool
  */
  this.gfilt = false;
  /**
  *Regions-Array
  *@type Array
  */
  this.Regionen = [];
  if(typeof(window["TTREGS_"+this.port])!='undefined')
    this.Regionen = window["TTREGS_"+this.port];

  /**
  *Name des ausgewählten Ziels
  *@type String
  */
  this.strZiel = "";//ttregs.g_strZiel;
  /**
  *Value des ausgewählten Ziels
  *@type Int
  */
  this.valZiel = -1;//ttregs.g_nZiel;
  /**
  *Name der ausgewählten Region
  *@type String
  */
  this.strReg = "";//ttregs.g_strRegion;
  /**
  *Value der ausgewählten Region im Format('Zielgebietskenner'|'Regionskenner')
  *@type String
  */
  this.valReg = -1;

  this.uthema = '';

  var defAuswahl = {
    ziel:"<Alle Reiseziele>",
    region:"<Alle Regionen>"
  };

  this.optFirstRegSelect= optUserRegSelect || defAuswahl;

  if(this.req['show_regModBalearen']==1){
    for(var i=0;i<this.Regionen.length;++i){
      var sr=this.Regionen[i].split('|');
      if(sr[1]==10000)
        sr[0]='Mallorca, Ibiza, Menorca';
      this.Regionen[i]=sr.join('|');
    }
    this.Regionen.sort();
  }

  this.getTTZiel = function(topregion){
    topregion = topregion || 0;
    for(var i=0;i<this.Regionen.length;++i){
      var tr = this.Regionen[i].split("|")[3] || 0;
      if(tr==topregion){
        return this.Regionen[i].split("|")[2] || 0;
      }
    }
    return 0;
  };

  this.getTTRegion = function(topregion){
    topregion = topregion || 0;
    for(var i=0;i<this.Regionen.length;++i){
      var tr = this.Regionen[i].split("|")[3] || 0;
      if(tr==topregion){
        return this.Regionen[i].split("|")[1] || 0;
      }
    }
    return 0;
  };

  this.getTTFlugdauer = function(zk){
    zk = zk || 0;
    for(var i=0;i<this.Regionen.length;++i){
      var aktzk = this.Regionen[i].split("|")[1] || 0;
      if(aktzk==zk){
        return this.Regionen[i].split("|")[2] || 0;
      }
    }
    return 0;
  };

  var topregion=this.req['topRegion'] || 0;
  var flugdauer=this.req['flugdauer'] || 0;
  var zielgebiets_kenner=this.req['zielgebiets_kenner'] || 0;

  if(parseInt(topregion)>=10000){
    this.valZiel = parseInt(topregion);
  }else if(parseInt(topregion)>0){
    this.valReg  = this.getTTRegion(parseInt(topregion));
    this.valZiel = this.getTTZiel(parseInt(topregion));
  }else{
    this.valReg  = zielgebiets_kenner!=''?zielgebiets_kenner:0;
    this.valZiel = flugdauer!=''?flugdauer:0;
    if(this.valReg!=0 && (this.valZiel==0 || this.valZiel=="-1")){
      this.valZiel = this.getTTFlugdauer(this.valReg);
      this.req['flugdauer']=this.valZiel;
      flugdauer = this.valZiel;
    }
  }

  this.updateRegListe=function(){
    this.valZiel=-1; this.strZiel='';
    this.valReg=-1;  this.strReg='';
    this.UpdateRegionen();
  }

  /**
  *füllt die "ziel"-Selectbox und ruft danach FixRSel auf, welche dann die Regionen füllt
  *@param {Array} rec Regionsarray
  *@return falls Kein Array übergeben wurde "false", ansonsten nix
  *@type void
  */
  this.UpdateRegionen = function(){
    if(document.forms[this.formname].uthema){
      this.uthema=document.forms[this.formname].uthema.value;
    }
    else if(document.forms[this.formname].uthema_dis){
      this.uthema=document.forms[this.formname].uthema_dis.value;
    }
    else{
      if(document.forms[this.formname].zielOrt){
        var opt = document.forms[this.formname].zielOrt.options;
        for(var i=0;i<opt.length;i++){
          if(this.req['orte_IFF'] && opt[i].value.split(' ')[1]==this.req['orte_IFF'])
            bform.zielOrt.value = opt[i].value;
        }
      }
      return;
    }

    this.HBit=this.uthema.split("_");
    if(this.HBit[0]==1){
      this.tmp_val=4;this.tmp_HBit=1;
    }else{
      this.tmp_val=5;this.tmp_HBit=2;
    }

    // Erstes Element der Regionauswahlbox erstellen
    document.forms[this.formname].elements["region"].options[0] = new Option(this.optFirstRegSelect['region'],"-1");

    // Erstes Element der Zielauswahl erstellen
    var opt=document.forms[this.formname].elements["ziel"].options;
    while(opt.length>0)
      opt[opt.length-1] = null;
    opt[0] = new Option(this.optFirstRegSelect['ziel'],"-1");

    for(var i=0;i<this.Regionen.length;++i){
      var sr=this.Regionen[i].split("|");
      if(sr[1]>=10000){
        if((sr[this.tmp_val]&(1<<this.HBit[1]-1) && this.HBit[0]==this.tmp_HBit) || this.uthema=='' || this.uthema=='0')
          opt[opt.length]=new Option(sr[0],sr[1]);
      }
    }
    this.FixRSel();
  };

  /**
  *RZC => ReiseZiel_onChange: Updated die Regionsauswahl
  *@param {int} ds Deselect (optional) wenn gesetzt wird die Auswahl aufgehoben
  */
  this.RZC = function(ds){
    var bform = document.forms[this.formname];
    var zielSel = bform.elements["ziel"];
    var kenner  = zielSel.value;
    this.valZiel = kenner;

    // globale Variable "g_strZiel" updaten
    if(zielSel.selectedIndex>0){
      this.strZiel=zielSel[zielSel.selectedIndex].text;
    }else this.strZiel="";

    // Filter auf true setzen wenn Ziel ausgewählt ist
    this.gfilt = kenner!=-1;
    var opt = bform.elements["region"].options;

    while(opt.length>1)
      opt[opt.length-1] = null;

    for(var i=0;i<this.Regionen.length;++i){
      var sr = this.Regionen[i].split("|");
      if(sr[1]<10000 && (kenner<0 || sr[2]==kenner)){
        if((sr[this.tmp_val]&(1<<this.HBit[1]-1) && this.HBit[0]==this.tmp_HBit) || this.uthema=='' || this.uthema=='0'){
          opt[opt.length]=new Option(sr[0],sr[1]+"|"+sr[2]);
        }
      }
    }

    if(ds){
      opt.selectedIndex=0;
      this.strReg="";
      this.valReg=-1;
      this.emptyElements();
    }
  };

  /**
  *REGC => Region_onChange: Updated die Zielauswahl
  */
  this.REGC=function(){
    var bform = document.forms[this.formname];
    var ropt=bform.elements["region"].options;
    var kenner=ropt[ropt.selectedIndex].value.split("|");

    // Globale Variable "g_nRegion" auf aktuellen Value setzen
    this.valReg=kenner[0];

    // Wenn eine Region ausgewählt ist:
    if(ropt.selectedIndex>0){
      // evtl enthaltene Klammerausdrücke werden weggeschnitten
      this.strReg = ropt[ropt.selectedIndex].text.replace(/([^(]*)\((.*)/,"$1");
    }else this.strReg="";

    // Wenn kein Zielfilter gesetzt ist, aber eine Region selektiert ist,
    // setze Das Ziel entsprechend.
    if(this.gfilt==false && kenner[0]>=0){
      try{
        var selZiel = bform.elements["ziel"];
        selZiel.value = kenner[1];
        this.valZiel=kenner[1];
        this.strZiel=selZiel.options[selZiel.options.selectedIndex].text;
      }catch(e){}
    }
    this.emptyElements();
  };
  this.emptyElements = function() {
     if (typeof delElementsForPost == 'undefined') {
        delElementsForPost = new Array('s_ort','sleistung');
     }
     if (typeof delElementsForPost != 'undefined' && delElementsForPost.length > 0) {
          for(var c = 0;c < delElementsForPost.length;c++) {
              if (typeof document.forms[this.formname].elements[delElementsForPost[c].toString()] != 'undefined'
                    && document.forms[this.formname].elements[delElementsForPost[c].toString()].value != "") {
                    document.forms[this.formname].elements[delElementsForPost[c].toString()].value = "";
                    }
          }
     }
  };
  /**
  *Wird von der Funktion UpdateRegionen aufgerufen und selektiert das Ziel
  *anhand der Variablen "valZiel". Ist "valZiel" kein Value der Selectbox
  *wird ein entsprechendes Optionselement angehängt (falls die Variable "strZiel"
  *gesetzt ist). Danach wird die Funktion RZC aufgerufen, die die
  *"region"-Selectbox füllt. Falls die Variable "valReg" gesetzt ist, wird
  *eine entsprechende Region selektiert
  */
  this.FixRSel = function(){
    var opt=document.forms[this.formname].elements["ziel"].options;
    // ist das richtige Ziel ausgewählt?
    if((opt.selectedIndex<0 || opt.value!=this.valZiel) && this.valZiel!=0){
      try{
        document.forms[this.formname].elements["ziel"].value = this.valZiel;
      }catch(e){
        if(this.strZiel!="")
          opt[opt.length]=new Option(this.strZiel,this.valZiel,true,true);
        else{
          opt.selectedIndex=0;this.RZC();return;
        }
      }
    }
    this.RZC();

    opt=document.forms[this.formname].elements["region"].options;
    if(opt.selectedIndex<0 || opt[opt.selectedIndex].value.split("|")[0]!=this.valReg){
      for(i=0;i<opt.length;i++)
        if(opt[i].value.split("|")[0]==this.valReg){
          opt.selectedIndex=i;break;
        }

      if(i==opt.length){
        if(this.strReg!="")
          opt[opt.length]=new Option(this.strReg+" (keine Ang.)",this.valReg+"|"+this.valZiel,true,true);
        else{
          opt.selectedIndex=0;this.valReg=-1;this.strReg="";
        }
      }
    }
  };

    /**
     * bei einer ajaxbasierten TerminSeite muss die Vorauswahl nachgesteuert werden
     */
    this.updateDestinationsForTerminWithAjax = function() {
        if (pStrecke.terminRegionData == 'null' || pStrecke.terminRegionData == null || typeof pStrecke.terminRegionData == 'undefined') {
            // Kompatiblität mit älteren Lösungen
            window.setTimeout(function(){
                //console.debug('wait');
                IBE.updateDestinationsForTerminWithAjax();
            }, 30);
        } else {
            topregion = pStrecke.terminRegionData.topReg;
            
            if (this.valZiel == -1 && this.valReg == -1) {
                this.valReg  = this.getTTRegion(parseInt(topregion));
                this.valZiel = this.getTTZiel(parseInt(topregion));
                this.UpdateRegionen();
            }
            if (typeof uebergabe != 'undefined') {
                uebergabe = uebergabe.replace(/&zielgebiets_kenner=(\d+|-1)/, '');
                uebergabe = uebergabe + '&topRegion=' + parseInt(pStrecke.terminRegionData.topReg);
            }
        }
    };
}
