/*********************************************************/
/*  Validierungsfunktion für die Startmaske (Standard)   */
/*********************************************************/
/*****************************************************************************
  todo
  - check jugendliche , studenten , erwachsene nicht gleichzeitig
  - datums check
  - ausputzen
*****************************************************************************/


var f; // the  form
var validator;

/* später auf XSL-Template auslagern, da CSS abhängig oder können wir von hier aus auf das CSS zugreifen? */
var Cfg = {
  input_bg_ok: "#ffffff",
  input_bg_warn: "#00ffff",
  airport_fields: null,
  airport_oj_fields: null,
  error_border_style: '1px solid #ff0000'
}

/*
function init_page () {
  setTimeout('init_page1()',5000);
}
*/

function init_page () {
  /* beserer Zugriff auf die Formelemente - kürzer, Auslesen der verschiedenene Elemente gekapselt */
  //debugger;
  f = document.forms['startform'];
  var inp = Form.serialize(f, true);
  //set_tabIndexes();
    
  var hdate = f.hdate_start.value.split('.');
  var rdate = f.rdate_start.value.split('.');
  //init_calendar(hdate.reverse().join('') , rdate.reverse().join(''), f.mindatum.value, f.maxdatum.value);
  
  /* Maske je nach Vorauswahl der Flugart anzeigen: Normal, Oneway oder Gabelflug */
  change_flugart();
    
  // try {$("pause").hide();} catch(e){}
    
  /*****************************************************************************
    Todo: 
      nur wenn es sich um den ersten Aufruf der Seite handelt
  *****************************************************************************/
  if(f.maske.value == 'alpha1') {
    if(ajax_startdate) set_startdate(ajax_startdate, f.freedate.value);
    change_backdate (7);
  } 
    
  init_validator(f, null, Cfg.error_border_style);
  
  /* ie6 Hack (durchscheinende Dropdowns (jetzt durch iframe Hack gelöst */
  
  if (0 && ie6) {
    $("calendars").style.top = '350px';
    $("calendars").style.left = '180px';
    $("teilnehmer_info").style.top = '350px';
    $("teilnehmer_info").style.left = '180px';
  }
  
  change_dob_display();
  
}
  
function startform_valid (theForm) {
  var flugart = theForm.flugart.value || getCheckedValue(theForm.flugart);
  
  var ret = true; 
  
  if (flugart == "G") {// Gabelflug
    ret = validator.check_fields_in_array(Cfg.airport_oj_fields);
  }
  /*****************************************************************************
     sma: todo was wenn einer kein P2P hat? ->  alles für beide Modi 
     funktionsfähig machen + testen.
     Problem taucht nur im firefox auf, da dieser auch elemente, die nicht 
     sichtbar sind (visible:none) an den server weitergibt und das Frontend 
     dann irrtümlich einen Openjaw annimmt
  *****************************************************************************/
  else {// oneway / return
    ret = validator.check_fields_in_array(Cfg.airport_fields);
  }
  
  if (!ret) return(false);
//  und nun die Datumsbetrachtung // TODO -> überarbeiten


  if (parseInt(theForm.freedate.value) == 1)
  {
    
    hdat = extract_datum (theForm.hdate.value);
    hd3 = parseInt (hdat / 10000);
    hd1 = hdat % 100;
    hd2 = parseInt ((hdat-hd3*10000)/100.);

    theForm.hdate1.value  = hd1;
    theForm.hdate2.value = hd3*100 + hd2;
    var focus_element = theForm.hdate;
  }
  else
  {
    hd1 = parseInt (parseFloat(theForm.hdate1.value));
    hd3 = parseInt (theForm.hdate2.value/100.);
    hd2 = parseInt (theForm.hdate2.value % 100.);

    hdat = hd3*10000 + hd2*100 + hd1;
    focus_element = theForm.hdate1;
  }

  if (! teste_datum (hd1,hd2,hd3))
  {
    alert (Msg['DATE_NOT_EXISTING']);
    focus_element.focus();
    return (false);
  }

  if (hdat < theForm.mindatum.value)
  {
    alert (Msg['EARLIEST_DEPDATE']+" "+formatDate(theForm.mindatum.value));
    focus_element.focus();
    return (false);
  }

  if (flugart != "O") //  bei onewayFlügen ist Rückflugsdatum irrelevant
  {
    if (parseInt(theForm.freedate.value) == 1)
    {
      rdat = extract_datum (theForm.rdate.value);

      rd3 = parseInt (rdat / 10000);
      rd1 = rdat % 100;
      rd2 = parseInt ((rdat-rd3*10000)/100.);

      theForm.rdate1.value  = rd1;
      theForm.rdate2.value = rd3*100 + rd2;
      focus_element = theForm.rdate;
    }
    else
    {
      rd1 = parseInt (parseFloat(theForm.rdate1.value));
      rd3 = parseInt (theForm.rdate2.value/100.);
      rd2 = parseInt (theForm.rdate2.value % 100.);

      rdat = rd3*10000 + rd2*100 + rd1;
      focus_element = theForm.rdate1;
    }

    if (rdat > theForm.maxdatum.value)
    {
      alert (Msg['LATEST_RETDATE']+" "+theForm.maxdatumt.value);
      focus_element.focus();
      return (false);
    }
    if (! teste_datum (rd1,rd2,rd3))
    {
      alert (Msg['DATE_NOT_EXISTING']);
      focus_element.focus();
      return (false);
    }

    if (rdat < hdat)
    {
      alert (Msg['RET_BEFORE_DEST_DATE']);
      if (parseInt(theForm.freedate.value) == 1)
        theForm.hdate.focus();
      else
        theForm.hdate1.focus();
      return (false);
    }
  }

  var num_adults = parseInt (theForm.adult.options[theForm.adult.selectedIndex].value);
  var num_youths = 0;
  var num_students = 0;
  var num_infants = 0;
  try {
    num_youths = parseInt (theForm.youth.options[theForm.youth.selectedIndex].value);
  } catch (e) {
    num_youths = 0;
  }
  try {
    num_students = parseInt (theForm.student.options[theForm.student.selectedIndex].value);
  } catch (e) {
    num_students = 0;
  }
  
  try {
    num_infants = parseInt (theForm.infant.options[theForm.infant.selectedIndex].value);
  } catch (e) {
    num_infants = 0;
  }
  
  if (num_adults == 0 && num_youths == 0 && num_students == 0) {
    alert (Msg['CHOOSE_PAX']);
    theForm.adult.focus();
    return (false);
  }
  else if (num_adults != 0 && (num_youths != 0 || num_students != 0)) {
    alert (Msg['INVALID_PAX_COMBINATION']);
    theForm.adult.focus();
    return (false);
  }
  else if (num_youths != 0 && num_students != 0) {
    alert (Msg['INVALID_YOUTH_STUDENT_COMBINATION']);
    theForm.student.focus();
    return (false);
  }
  else if ((num_adults + num_youths + num_students) < num_infants) {
    alert (Msg['TO_MANY_INFANTS']);
    theForm.infant.focus();
    return (false);
  }
  
  /*****************************************************************************
    Um Verwirrung durch Doppeltbenennung zu vermeiden wurden inital 
    fromt + destt für Openjaw mit oj_fromt + oj_destt benannt.
    Das Frontend erwartet aber fromt + destt.
  *****************************************************************************/
  if (flugart == "G") {// Gabelflug
    setValue($('fromt'), $('oj_fromt').value);
    setValue($('destt'), $('oj_destt').value);
  } 
  
  if(f.agentc.value == 'alp') {
    if(f.fromt.value != 'BERN' && f.fromt.value != 'BERN /BRN'  && f.destt.value != 'BERN' &&  f.destt.value != 'BERN /BRN') {
      alert ("Entweder der Abflugsort oder das Reiseziel muss BERN sein.");
      return (false);
    }
    
  }
    
  try {$("pause").show();} catch(e){}

  return (true);
} // validator

/*****************************************************************************
  Diese Funktionen evt. als Klassenfunktionen, um eine bessere Zusammengehörigkeit zu erreichen
*****************************************************************************/

function isValidDestination (input) {
  var ret = true;
  
  if(input == '') {
    ret = false;
  }
  /* weitere checks ... */
  return (ret);
}


function check_datum (typ)
{
  var status, dat, jahr, tag, monat;

  if (typ == 1)
    str = new String(f.hdate.value);
  else
    str = new String(f.rdate.value);

  dat = extract_datum (str);

  jahr = parseInt (dat / 10000);
  tag = dat % 100;
  monat = parseInt ((dat-jahr*10000)/100.);

  status = 0;

  while (true)
  {
    if (dat <= 0)
    {
      alert (Msg['ENTER_VALID_DATE']);
      break;
    }

    if (typ == 1)
    {
      if (dat < parseInt(f.mindatum.value))
      {
        alert (Msg['EARLIEST_DEPDATE']+" "+formatDate(f.mindatum.value));
        break;
      }
      if (dat > parseInt(f.maxdatum.value))
      {
        alert (Msg['LATEST_DEPDATE']+" "+f.maxdatumt.value);
        break;
      }
    }
    status = 1;
    break;
  }

  if (status == 0) 
  {
    if (typ == 1) f.hdate.value = f.hdate_start.value;
    if (typ == 2) f.rdate.value = f.rdate_start.value;
  } 
  else
  {
    if (tag < 10) 
      datstr = "0"+tag;
    else
      datstr = tag;

    datstr += ".";

    if (monat < 10) 
      datstr += "0"+monat;
    else
      datstr += monat;
    datstr += ".";

    datstr += jahr;

    if (typ == 1) f.hdate.value = datstr;
    if (typ == 2) f.rdate.value = datstr;
  }

  if (typ == 1)
  {
    rdate = calc_datum_diff (jahr*10000+monat*100+tag, 7);
    jahr = parseInt (rdate / 10000);
    tag = parseInt(rdate % 100);
    monat = parseInt ((rdate-jahr*10000)/100.);

    if (tag < 10) 
      datstr = "0"+tag;
    else
      datstr = tag;

    datstr += ".";

    if (monat < 10) 
      datstr += "0"+monat;
    else
      datstr += monat;
    datstr += ".";

    datstr += jahr;

    f.rdate.value = datstr;
  }
  
  return (true);
}


function change_backdate (offset) {
  if (f.freedate.value == '1') {
    var d =  f.hdate.value;
    var iDate = d.substring(6,10) +  d.substring(3,5) + d.substring(0,2);
    var rd = calc_datum_diff(parseFloat(iDate), offset);
    f.rdate.value = formatDate(rd);
  }
  else { 
    htag = parseInt (parseFloat(document.startform.hdate1.value));
    hjahr = parseInt (document.startform.hdate2.value / 100.);
    hmonat = parseInt (document.startform.hdate2.value % 100.);   
    rdate = calc_datum_diff (hjahr*10000+hmonat*100+htag,offset);
  
    rtag = parseInt (rdate % 100);
    rmon = parseInt (rdate / 100.);
  
    document.startform.rdate1.selectedIndex =  rtag-1; 
    for (var i=0 ; i<document.startform.rdate2.length ; i++)
    {
      if (parseInt(parseFloat(document.startform.rdate2.options[i].value)) == rmon)
      {
        document.startform.rdate2.selectedIndex = i;
        break;
      }
    }
  }
  return (true);  
}

function change_fromt ()
{
  /* das klappt nicht, wenn man P2P nicht aktiviert hat -> changed sma 8.5.08 */
  //if (document.forms.startform.fromt[0].selectedIndex == document.forms.startform.fromt[0].length-1)
  var sel = document.forms.startform.fromt[0].selectedIndex;
  if (document.forms.startform.fromt[0].options[sel].value == 'other')
  { 
    anzeigen ("input_dropdown", 0);
    anzeigen ("input_texthin", 1);
    dropdown = 0;
    
    document.startform.fromt[0].value = "";
    document.startform.fromt[1].focus();
  }
}

function change_fromt_ojaw ()
{
  if (document.startform.rdestt.value == "") document.startform.rdestt.value = document.startform.fromt[2].value;
}
function change_rfromt_ojaw ()
{
  if (document.startform.rfromt.value == "") document.startform.rfromt.value = document.startform.destt[0].value;
}
  
function change_flugart ()
{
  var flugart = getCheckedValue(f.flugart);
  
  /* Gabelflug */
  if (flugart == "G") {
    $("row_openjaw").show();
    $("row_returnflight").hide();
    toggle_return_row(true);
  }
  /* Oneway */
  else if (flugart == "O")  {
    $("row_openjaw").hide();
    $("row_returnflight").show();
    toggle_return_row(false);
  }
  /* Normalflug */
  else  {
    if ($("row_openjaw"))
    {
      $("row_openjaw").hide();
    }
    if ($("row_returnflight"))
    {
      $("row_returnflight").show();
    }
    toggle_return_row(true);
  }
}

function calendar_toggler() {
  
  /*
  new Timeframe('calendars', {
    startField: 'hdate',
        endField: 'rdate',
        earliest: new Date(),
        maxRange: 1,
        resetButton: 'reset' }
      );
      */
}

function Kalender_hin()
{
  posleft = 250;
  postop = 150;

  href = document.startform.cal_url.value + "&mode=14&direction=1" + "&unique_id=" + document.startform.unique_id.value + "&hdate=" + document.startform.hdate.value + "&hdate1=" + document.startform.hdate1.value + "&hdate2=" + document.startform.hdate2.value + "&mindatum=" + document.startform.mindatum.value + "&maxdatum=" + document.startform.maxdatum.value;
  neu = open(href,"Kalender","innerWidth=160,width=175,height=170,menubar=no,resizable=no,scrollbars=no,left=" + posleft + ",top=" + postop);
}

function Kalender_rueck()
{
  posleft = 250;
  postop = 150;

  href = document.startform.cal_url.value + "&mode=14&direction=2" + "&unique_id=" + document.startform.unique_id.value + "&rdate=" + document.startform.rdate.value + "&rdate1=" + document.startform.rdate1.value + "&rdate2=" + document.startform.rdate2.value + "&mindatum=" + document.startform.mindatum.value + "&maxdatum=" + document.startform.maxdatum.value;
  neu = open(href,"Kalender","innerWidth=160,width=175,height=170,menubar=no,resizable=no,scrollbars=no,left=" + posleft + ",top=" + postop);
} 

function RegionOeffnen(typ, dd) 
{
// wenn ein Dropdown beim Abflugsort besteht, dann muss dieses gegen ein Inputfeld getauscht werden 
  var dropdown = 0;
  if (typ == 5 && dropdown == 1)
  {
    $("input_dropdown").hide();
    $("input_texthin").show();
    dropdown = 0;
  
    document.startform.fromt[0].length = 0;
    document.startform.fromt[0].value = "";
    document.startform.fromt[1].focus();
  }
  href = document.startform.cal_url.value + "&mode=10" + "&unique_id=" + document.startform.unique_id.value + "&direction=" + String(typ);
  neu = open (href,"RegionFenster","width=900,height=500,resizable=1,toolbar=0,scrolling=yes,scrollbars=1,location=0");
} 




/*****************************************************************************
  Ermittelt den Index einer dropdown-option, die mit <val> übereinstimmt.
  Optional kann ein Suchstring mitgegeben werden. 
  Dann wird mit dem Substring NACH diesem Suchstring verglichen.
  Bei Bedarf erweitern. 
  
  Bsp. Dropdown <dp> enthält den value "München /MUC" 
    -> getIndexByValue(dp, 'MUC', '/') liefert den Index
*****************************************************************************/
function getIndexByValue(dropdown, val, substringafter) {
  if (dropdown) {
    var substr = substringafter || ""; 
    var r = 0;
    for (var i = 0; i < dropdown.length; i++) {
      var pos;
      if(substr.length > 0) {
        pos = dropdown.options[i].value.search(substr);
        str = dropdown.options[i].value.substr(pos+1);
      }
      else {
        str = dropdown.options[i].value
      }
      if (str == val) {
        r = i;
        break;
      }
    }
  }
  return (r);
}


//Adding a local cache to Ajax.Autocompleter

function init_ac(request, result) {
  var url = document.location.protocol + "//" + host + ".onlinetravel.ch/flightx-engine/?mode=23";
  // url += "&unique_id=";
  // url += document.forms['startform'].unique_id.value;
  url += "&agentc=";
  url += document.forms['startform'].agentc.value;
  url += "&language=";
  url += document.forms['startform'].language.value;
  //url += "&date=" + d; // prevent IE from caching
  // $('trace_info').innerHTML = url;
  new Ajax.Autocompleter(request, result, url,  /*airportres.html*/
    { 
      paramName: "s", 
      minChars: 2,
      frequency: 0.5,     //indicator: "indicator1",
      method: 'GET',
      //onFailure: reportFailure,
      //onSuccess: reportComplete,
      onException: reportError,
      onError:  reportError
    }
  );
}

function reportComplete(request)
{
  alert('year.');
}


function reportFailure(request)
{
  alert('Sorry. There was an Failure.');
}

function reportError(request)
{
  //alert('Sorry. There was an error.');
}
function oc_airport() {
  alert('.');

}





function theTest(str)
{
  return(str);  
}
/*
  
*/
function change_airport(opt, fieldname, airport_number, label) {
  if(opt.value == 'other') {
    if ($('destt').type == 'text') { // nehmen wir als Template
      var id = 'td_' + fieldname;
      var node = $(id);
      node.innerHTML = $('td_destt').innerHTML; 
      
      var inp = node.getElementsByTagName("input")[0];
      var inp1;
      try { // IE
        inp1 = document.createElement('<input type="text" name="' + fieldname +'"/>');
      }
      catch (e) {
        inp1 = document.createElement('input');
        inp1.name = fieldname;
        inp1.type = 'text';
        
      }
      inp1.id = fieldname;
      node.replaceChild(inp1, inp);
      
      var div = node.getElementsByTagName("div")[0];
      div.setAttribute("id", "result_" + fieldname);
      
      var script  = node.getElementsByTagName("script")[0];
      node.removeChild(script);
                
      var anker = node.getElementsByTagName("a")[0];
      var oc = 'RegionOeffnen(' + airport_number +'); return (false);';
      anker.setAttribute("onclick", oc);
      anker.setAttribute("href","_self");
      
      $(id).className = 'inpt_a';
      $(id).innerHTML = label + node.innerHTML; // IE Hack
      var result_div = 'result_' + fieldname;
      init_ac(fieldname, result_div);
      if(f.agentc.value == 'alp') {
        f.destt.value = 'BERN /BRN';
      }
    }
    
    /* Default Zuweisung */   
    else {
      var id = 'td_' + fieldname;
      
      var str = '';
      html = str.concat('<input type="text" name="', fieldname, '" id="', fieldname, '"/>'); 
      html += '<div class="autocomplete" style="display:none; position:absolute;" id="' +result_div +'"/>'; 
      $(id).innerHTML = html;
      $(id).className = 'inpt_a';
      init_ac(fieldname, result_div);
    }
    
    
  }
  return;
}


function set_tabIndexes() {
  var i = 0; 
  /* control array definieren in der Reihenfolge wie die tabIndexe gesetzt werden sollen */
  var ctrl = new Array();
  ctrl[0] = f.fromt;
  ctrl[1] = f.destt;
  ctrl[2] = f.hdate;
  ctrl[3] = f.rdate;
  ctrl[4] = $('search');
  
  while (i < ctrl.length) {
    ctrl[i].tabIndex = i + 1;
//    alert(ctrl[i].name + "=" + ctrl[i].tabIndex); 
    i++;
  }
  ctrl[0].focus();
  return;
}


function init_validator(theForm, cc_checkfunction, error_border_style) {
  Cfg.airport_fields = [{field: 'fromt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS'], borderstyle: null}];
  Cfg.airport_fields.push({field: 'destt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS']});
  
  Cfg.airport_oj_fields = [{field: 'oj_fromt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS'], borderstyle: null}];
  Cfg.airport_oj_fields.push({field: 'oj_destt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS']});
  Cfg.airport_oj_fields.push({field: 'rfromt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS']});
  Cfg.airport_oj_fields.push({field: 'rdestt', type: 'text', msg: Msg['ENTER_MANDITORY_FIELDS']});
  
  validator = new Validator(theForm, cc_checkfunction, error_border_style);
  validator.get_org_styles(Cfg.airport_fields);
  validator.get_org_styles(Cfg.airport_oj_fields);

  return;
}


/* requires prototype */
function get_earliest_depdate () {
    var d = Date().split(':');
    var agentc = document.forms['startform'].agentc.value;
    var language = document.forms['startform'].language.value;
    var url = document.location.protocol + "//flight1.onlinetravel.ch/flightx-engine/?mode=24&agentc=" + agentc + "&language=" + language + "&program=flightmore" + "&d=" +d;
    var startdate = null;
    var myAjax = new Ajax.Request(
      url, 
      {
        method: 'get',
        asynchronous: false,
        onException: reportError,
        onError:  reportError,
        onComplete: function (response) {
          var doc = response.responseXML;
          startdate = doc.getElementsByTagName("startdate")[0].firstChild.data;
        }
      });
  return startdate;
}

function set_startdate(startdate, is_freedate) {
  if(is_freedate == '1') {
    if (parseInt(startdate) > parseInt(f.hdate.value)) {
      f.hdate.value = formatDate(startdate);
    }
  }
  else {
    try {
      if (parseInt(startdate) > parseInt(f.hdate2.value + f.hdate1.value)) {
        f.hdate1.selectedIndex = getIndexByValue($('hdate1'),  parseInt(parseFloat(startdate.substring(6,8))));
        f.hdate2.selectedIndex = getIndexByValue($('hdate2'),  startdate.substring(0,6));
      }
    }
    catch (e) {
      ;
    }
  }
}


/* vorerst minimal Version, bei Bedarf erweitern 
  - <date> im Format  yyyymmdd
  - returns dd.mm.yyyy

*/
function formatDate(date) {
  var strDate = String(date); // sicher ist sicher
  return strDate.substring(6,8) + '.' + strDate.substring(4,6) + '.' + strDate.substring(0,4);

}

function change_dob_display () {
  if($("gb1") != null) {
    ad = parseInt(f.adult.value);
    yo = parseInt(f.youth.value);
    sd = parseInt(f.student.value);
  
    $("gb1").hide();
    $("gb2").hide();
    $("gb3").hide();
    $("gb4").hide();
    
    for (i=0 ; i<yo+sd ; i++)   
    {
      index = "gb"+String(i+1);
      $(index).show();
    }
  }
}

function toggle_return_row(switch_on) {
  if (ie || ie6) {
    if(switch_on) {
      Form.Element.enable('row_return_date');
      if ($('row_return_date_1') != null)
      {
        Form.Element.enable('row_return_date_1');
      }
    }
    else {
      Form.Element.disable('row_return_date');
      if ($('row_return_date_1') != null)
      {
        Form.Element.disable('row_return_date_1');
      }
    }
  }
  else {
    /* disable row klappt bei ff nicht */
    if (switch_on) {
      if(f.freedate.value == '0') {
        $('rdate1').enable();
        $('rdate2').enable();
      }
      else if(f.freedate.value == '1') {
        $('rdate').enable();
      }
    }
    else {
      if(f.freedate.value == '0') {
        $('rdate1').disable();
        $('rdate2').disable();
      }
      else if(f.freedate.value == '1') {
        $('rdate').disable();
      }
    }
  }
  return;
}
