/**
 * @author: Mateusz Czaja
 * @date 09.08.2007
 */
function cmCarsSuggest()
{
//@todo: test if iframe loaded
var urlSugg = location.protocol + '//' + location.host + '/suggestoutput.php';
var gMode  = 1;
var gStLen = 3;
var searchS = '';
var searchPage   = '';
var searchI=0;
var lastSearchInput=0;
this.lastSearchInput=lastSearchInput
var indexMax=0;
var indexMin=0;
var indexCurr=0;
var sugObj = new Object;
sugObj['dep']  = 0;
sugObj['dest'] = 0;
//geo
var tabDepFull=new Array();
var tabDepCode=new Array();
////geo
var sugC = new Object;//current
sugC['dep']=0;sugC['dest']=0;
var sugS = new Object;//suggest
sugS['dep']=0;sugS['dest']=0;
var sugIB = new Object;//iframeBody
sugIB['dep']=0;sugIB['dest']=0;
var sugIO = new Object;//IframeObject
sugIO['dep']=0;sugIO['dest']=0;
var currC;//currentCode
var safKD = 0;//safarikeydown
var safB = -1;//safariBrowser
//var globalIndex;
var gExit=0;
var gCallerObj;
var gMore = 0;
var gTimeout=300;
var gLang;
var safB=navigator.appVersion.search(/Safari/);
var ajaxRun = 0;
var gCompensateDest = 0;
//===
function setMode(mode){
  gMode = mode;
}
this.setMode = setMode;
function compensateDest()
{
    gCompensateDest = 1;
}
this.compensateDest = compensateDest

//===
function listenSearch(field)
{
  try {
    getObj(field).addEventListener("keyup",processKey,false);
  } catch(e) {
    try { //ie
      getObj(field).attachEvent("onkeyup",processKey);
    } catch(f) {}
  }
}
this.listenSearch = listenSearch;
//===
function processKey(event)
{
  if(gExit==1){
    return;
  }

  /*if (typeof(event.keyCode) ='undefined') {
    return;
  }*/

  if(event.keyCode != 37 && event.keyCode != 39) {
    if(docGet('depInput')) {
      docGet('depInput').className = '';
    }
  }

  searchI = (event.target) ? event.target : event.srcElement;
  if(event.keyCode == 13 ){
    if (gMode==1 ) {
      fill();
    } else {
      fillGeo();
    }
  } else if (indexMax>=0 && (event.keyCode == 38 || event.keyCode == 40)){ //down or up
    //for safari skip second event (for onkeydown)
    if(safB != -1){
      if(safKD == 0){
        safKD = 1;
      } else {
        safKD = 0;
        return;
      }
    }
    if(!sugC[searchI.id]){
      return;
    }
    if(event.keyCode == 40){ //down
      setNextCode()
    }
    if(event.keyCode == 38){ //up
      setPreviousCode();
    }
    scrollSuggest();
  } else if(event.keyCode == 27 ||  event.keyCode == 9){
    gCallerObj.hideDivs();
  } else if((event.keyCode >=65 && event.keyCode <=90) || event.keyCode==8 || event.keyCode==32 || event.keyCode==46){
    //really letters
    if (gMode==1) {
      docGet(searchI.id+'Airport').value='';
    }
    showResults(event);
  }
}
this.processKey=processKey
//===
function showResults(field)
{
  searchI= (field.target) ? field.target : field.srcElement;
  param=(field.target) ? field.target.value : field.srcElement.value;
  if(param.length<3){
    searchS=param;
    if(param.length<3){
      if(gMode==1){
        docGet('sug'+searchI.id+'_iframe').style.visibility='hidden';
      } else {
        docGet('sug'+searchI.id.substr(0,3)+'_iframe').style.visibility='hidden';
      }
      if(gMode==1) {
        docGet('submitEnabled').value = 1;
      }
    }
    return;
  } else {
    if (gMode==1) {
      docGet(searchI.id+'Airport').value='';
    }
  }
  if(param==searchS){
    if(docGet('depInput') && docGet('sug'+searchI.id+'_iframe').style.visibility != 'visible') {
      docGet('depInput').className = 'error';
    }
    return;
  } else {
    searchS=param;
  }
  doSearch();
}
this.showResults = showResults;
//===
function doSearch(pForce)
{
  noResults = null;
  if(searchS.length<3){
    return;
  }
  force = pForce;
  if(typeof(pForce)=='undefined'){
    force = 0;
  }
  if(gMode!=2 && force==0 && gMore==0) {
    if(searchS.length>3 && typeof(sugObj[searchI.id]) !='undefined' && sugObj[searchI.id].length>0 && (searchS.substring(0,gStLen)==sugS[searchI.id]) ){
      var sugg = new Array();
      sugg[0]=new Array(); //>3, no airport
      var tmpIndex   = 0;
      var tmpCountry = 0;
      var tmpRegion  = 0;
      var tmpSearchS = searchS.toLowerCase().replace(' ','-').replace('-','[ -]');
      for(var i=0; i<sugObj[searchI.id].length; ++i) {
        if (sugObj[searchI.id][i][0].length == "4" && i == "0") {
          continue;
        } else if (sugObj[searchI.id][i][0] == '0') {//country
          tmpCountry=sugObj[searchI.id][i];
          tmpRegion=0;
          continue;
        } else if (sugObj[searchI.id][i][0]==1) {//region
          var pass = eval('sugObj[searchI.id]['+i+'][1].toLowerCase().match(/^'+tmpSearchS+'/g)');
          if(pass){
            tmpRegion = 1;
            sugg[++tmpIndex]=sugObj[searchI.id][i];
          } else {
            tmpRegion = 0;
          }
          tmpCountry = 0;
          continue;
        }
        if (tmpRegion==1) {
          sugg[++tmpIndex]=sugObj[searchI.id][i];
        } else {
          if (eval('sugObj[searchI.id]['+i+'][1].toLowerCase().match(/^'+tmpSearchS+'/g)')) {
            if (tmpCountry!=0) {
              sugg[++tmpIndex]=tmpCountry
              tmpCountry=0;
            }
            sugg[++tmpIndex]=sugObj[searchI.id][i];
          }
        }
      }//for
      if(sugS[searchI.id]==searchS.substring(0,gStLen)){
        sugC[searchI.id]=sugg;
        showSuggest(sugg);
      }
      return;
    }
    if (sugS[searchI.id] == searchS.substring(0,gStLen)) {
      sugC[searchI.id] = sugObj[searchI.id]
      showSuggest( sugC[searchI.id] );
      return;
    }
  }
  if(gMore==1){
      gMore=0;
  }
  var params="query="+escape(searchS.substr(0,3))+'&field='+escape(searchI.id);
  if(gMode!=1){
    params +='&mode=2&country='+docGet('country').value
  }
  if (force) {
    params +='&force=1';
  }
  if (gLang != -1) {
    params +='&lang=' + gLang;
  }

  if (ajaxRun==0) {
    ajaxRun = 1;
    createAjax(params, execResult, urlSugg);
  }
//===
function execResult(txt,xmL)
{
   ajaxRun = 0;
  try{
    if(txt!=-1 && txt.length>10){
      eval(txt);
    } else if(searchI && searchI.id){
      try {
        docGet('sug'+searchI.id+'_iframe').style.visibility='hidden';
        docGet('submitEnabled').value = 1;
        if(docGet('depInput')) {
            docGet('depInput').className = 'error';
        }
      } catch(g) { log(g); }
    }
  } catch(f){
    log(f)
  }
}
//===
function geo(field, mode, sugg)
{
  currC = '';
  gMode=mode;
  sugg = translateSuggest(sugg);
  try{
    if (gMode==3) {
      gStLen = searchS.length;
    } else {
      gStLen = 3;
    }
    sugS[searchI.id]  = searchS.substring(0, gStLen);
    sugIO[searchI.id] = docGet('sug'+searchI.id.substr(0,3)+'_iframe');
    try {
      sugIB[searchI.id] = getIFrameDocument('sug'+searchI.id.substr(0,3)+'_iframe')
    } catch(ff) {

    }
    try {
      sugIB[searchI.id].getElementById('sugContent').innerHTML = '';
    } catch(ff) {
      gExit = 1;
      return;
    }
    sugObj[field] = sugg;
    sugC[field]   = sugg;
  } catch(ff){

  }
  try {
    if(field==searchI.id){
      coords.setXY(field, "sugHolder");
      showSuggest(sugg)
    }
  } catch(ff){

  }
}
//===
function sug(field, sugg)
{
  sugg = translateSuggest(sugg);
  try{
    sugS[searchI.id]     = searchS.substring(0,gStLen);
    sugIO[searchI.id]  = docGet('sug'+searchI.id+'_iframe');
    try{
      sugIB[searchI.id] = getIFrameDocument('sug'+searchI.id+'_iframe')
    } catch(ff){}
    try{
      sugIB[searchI.id].getElementById('sugContent').innerHTML= '';
    } catch(ff){
      gExit = 1;
      return;
    }
    sugObj[field] = sugg;
    sugC[field] = sugg;
  } catch(ff){}
  try {
    if(field==searchI.id){
      showSuggest(sugg)
    }
  } catch(ff){}
}
function actionFailure(){
}
//===
}//doSearch
//===
function translateSuggest(sugg)
{
  var sugArray = new Array();
  if(gMode>1){
    var fields = 4;
    var loops = parseInt(sugg.length/fields);
    for(var i=0; i<loops; ++i){
      sugArray[i]= new Array(sugg[0+(i*fields)], sugg[1+(i*fields)], sugg[2+(i*fields)], sugg[3+(i*fields)]);
    }
  } else {
    var fields = 2;
    var loops = parseInt(sugg.length/fields);
    for(var i=0; i<loops; ++i){
      sugArray[i]= new Array(sugg[0+(i*fields)], sugg[1+(i*fields)]);
    }
  }
  return sugArray;
}
//===
function showSuggest(sugg)
{
  try {
    currC=0;
    var html='';
    var rows=0;
    var countryCount = 0;

    tmpRegion=0;
    if (gMode==2) {
        html +='<div class="sugCountry">'+js_tr['suggest']['popular_cities']+'</div>';
    } else if(gMode==3) {
        html +='<div class="sugCountry">'+js_tr['suggest']['please_select']+'</div>';
    }
    for(var i=0; i<sugg.length; ++i){
      if(sugg[i].length>0) {
        if (sugg[i][0] == '0') {
          if (countryCount == 0 && ((sugg[0][0] && sugg[0][0].length > 3) || (sugg[1][0] && sugg[1][0].length > 4))) {
              html +='<div class="sugCountry" style="border-top: 1px dashed #005E34;">'+sugg[i][1]+'</div>';
          } else {
              html +='<div class="sugCountry">'+sugg[i][1]+'</div>';
          }
          countryCount++;
          tmpRegion=0;
        } else if (sugg[i][0]==1) {
          //@todo: add sugRegion to suggest.css
          html +='<div class="sugRegion">'+sugg[i][1]+' ('+js_tr["suggest"]["region"]+')</div>';
          tmpRegion=1;
        } else if (sugg[i][0]=='more') {
          html += '<div class="sugCity" id="more" onmouseover="sug.setRow(\'more\')" onclick="sug.fillGeo(\'more\')"><div class="sugMore">'+js_tr['suggest']['more_cities']+'</div></div>';
        } else {
          if (gMode==1) {
                var city = "";
                var name = sugg[i][1].replace(/(.{3})(.*)/g, '<span class="first3">$1</span>$2');
                if (i == 0 && sugg[0][0].length == 0) {
                    continue;
                } else if (i == 0 && sugg[0][0].length == 4) {//airport, code FRA+A (must be uniq)
                    city +='<div id="'+ sugg[0][0] +'" class="sugAirport" onMouseOver="sug.setRow(\''+sugg[0][0]+'\')" onclick="sug.fill(\''+sugg[0][0]+'\')">'
                    city +='<span class="first3">'+sugg[0][0].substring(0,3)+'</span> - '+sugg[0][1];
                    city +='</div>';
                } else if (sugg[i][0].length > 4) {
                    countryIcon = "";
                    type = sugg[i][0].substring(2,4);
                    if (type == 'XX') {
                        countryCode = sugg[i][0].substring(0,2);
                        countryIcon = 'style="background-image:url(/framework/de-de/icons/icon_'+countryCode+'.gif);background-repeat:no-repeat;background-position:8px 4px;"';
                        countryClass = "Country";
                    } else {
                        countryClass = "Region";
                    }

                    city +='<div id="'+ sugg[i][0] +'" class="sugAirport'+countryClass+'" '+countryIcon+' onMouseOver="sug.setRow(\''+sugg[i][0]+'\')" onclick="sug.fill(\''+sugg[i][0]+'\')">'
                    city +=name;
                    if (countryClass=="Region") {
                        city += ' ('+js_tr["suggest"]["region"]+')';
                    }
                    city +='</div>';

                } else {
                    city += '<div class="sugCity" id="'+ sugg[i][0] +'" onmouseover="sug.setRow(\''+sugg[i][0];
                    city += '\')" onclick="sug.fill(\''+sugg[i][0]+'\')">'+name+'</div>';
                }
          } else {
            if (i == 0 && sugg[0][0].length == 0) {
                continue;
            } else if (typeof(sugg[i][2]) == 'object'){
              var city  = '<div class="sugCity" id="'+ sugg[i][0] +'" onmouseover="sug.setRow(\''+sugg[i][0];
              city += '\')" onclick="sug.fillGeo()">'
              city += '<em>'+parseInt(sugg[i][2].length/3)+' '+sugg[i][1]+' '+js_tr['suggest']['show_card']+'</em></div>';
            } else {
              var city  = '<div class="sugCity" id="'+ sugg[i][0] +'" onmouseover=\'sug.setRow("'+sugg[i][0]+'")\'';
              city     += ' onclick=\'sug.fillGeo("'+sugg[i][0]+'","'+sugg[i][1].replace(/'/g,"&#39;")+"\","+sugg[i][2]+","+sugg[i][3]+")'>"+sugg[i][1]+"</div>";
            }
          }
          html += city;
        }
        ++rows;
      }
    }
    if(rows>0 && gMode>1){
      ++rows;
    }
    if(rows==0){
      sugIB[searchI.id].getElementById('sugContent').innerHTML= '';
      sugIO[searchI.id].style.visibility='hidden';
      if(docGet('depInput')) {
          docGet('depInput').className = 'error';
      }
      if (gMode!=1) {
        gCallerObj.notFound();
      }
      return;
    }

    sugIB[searchI.id].getElementById('sugContent').innerHTML=html

    var iFrameHeight=0;
    if(sugg[0].length>0) {//airportCode
      iFrameHeight = 3;
    }
    if(rows>6){
      iFrameHeight += rows*18
    } else {
      iFrameHeight += rows*19
    }
    if(iFrameHeight>200){
      iFrameHeight=200;
    }
    sugIO[searchI.id].style.height=iFrameHeight+'px'
    sugIO[searchI.id].style.visibility="visible";
    docGet('submitEnabled').value = 0;

    if(rows>0 && gMode>1){
        sugIB[searchI.id].getElementById(sugg[1][0]).className=sugIB[searchI.id].getElementById(sugg[1][0]).className+'A';
        currC=sugg[1][0];
    }

  } catch(ff){
    log(ff);
  }
}
//===
function setNextCode(field)
{
  var sugg = sugC[searchI.id];
  var tryNext=0;
  if(!currC){
    jumpToFirst()
  } else {
    for(var i=0; i<sugg.length; ++i){
      if(sugg[i][0]!=0 && sugg[i][0]!=1) {//only cities
        if(tryNext==1){
          currC = sugg[i][0];
          sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className+'A';
          return;
        }
        if(sugg[i][0]==currC){
          tryNext=1;
          sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className.substr(0, sugIB[searchI.id].getElementById(currC).className.length-1);
        }
      }
    }//for
    if(tryNext==1){
      jumpToFirst();
    }
  }
}
//===
function setPreviousCode()
{
  var sugg = sugC[searchI.id];
  var tryPrevious=0;
  if(!currC){
    jumpToLast()
  } else {
    var minIndex = 1;
    if(sugg[0].length>0){
      minIndex=0;
    }
    for(var i=sugg.length-1; i>=minIndex; --i){
      if(sugg[i][0]!='undefined' && sugg[i][0]!=0 && sugg[i][0]!=1) {//only cities
        if(tryPrevious==1){
          currC = sugg[i][0];
          sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className+'A';
          return;
        }
        if(sugg[i][0]==currC){
          tryPrevious=1;
          sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className.substr(0, sugIB[searchI.id].getElementById(currC).className.length-1);
        }
      }
    }
    if(tryPrevious==1){
      jumpToLast();
    }
  }
}
//===
function jumpToFirst()
{
  var sugg = sugC[searchI.id];
  if(currC){
      sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className;
  }
  if (sugg[0][0] && sugg[0][0].length>0) {//airport
    currC = sugg[0][0];
    sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className+'A';
    return;
  } else {
    for(var i=1; i<sugg.length; ++i){
      if(sugg[i][0]!=0) {//only cities
        currC=sugg[i][0];
        sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className+'A';
        return;
      }
    }
  }
}
//===
function jumpToLast()
{
  var sugg = sugC[searchI.id];
  if(currC){
      sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className;
  }
  for(var i=sugg.length-1; i>=0; --i){
    if(sugg[i][0]!=0) {//only cities
      currC = sugg[i][0];
      sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className+'A';
      return;
    }
  }
}
//===
function scrollSuggest()
{
  var sugg = sugC[searchI.id];
  var iframeWin= getIFrameWindow('sug'+searchI.id.substr(0,3)+'_iframe')
  maxHeight=180;
  singleHeight=18;
  for(var i=0; i<sugg.length; ++i){
    if(sugg[i][0]==currC) {
      var y = singleHeight * i;
      if(y>maxHeight) {
        var newPos = (parseInt((y/maxHeight))*1)*maxHeight
        iframeWin.scrollTo(0, newPos);
      } else {
        iframeWin.scrollTo(0, 0);
      }
    }
  }
 }
//===
function getIFrameDocument(aID){
   var rv = null;
   if (docGet(aID).contentDocument){//W3C compliant
     rv = docGet(aID).contentDocument;
   } else {// IE
      rv = document.frames[aID].document;
   }
   return rv;
}
//===
function getIFrameWindow(aID){
   var rv = null;
   if (docGet(aID).contentWindow){//W3C compliant
     rv = docGet(aID).contentWindow;
   } else { // IE
     rv = document.frames[aID].window;
   }
   return rv;
 }
//===
function setRow(code)//ind
{
    if(currC){
      sugIB[searchI.id].getElementById(currC).className=sugIB[searchI.id].getElementById(currC).className.substr(0, sugIB[searchI.id].getElementById(currC).className.length-1);
    }
    sugIB[searchI.id].getElementById(code).className=sugIB[searchI.id].getElementById(code).className+'A';
    currC = code;
}
this.setRow = setRow;
//===
function fill(code, field)
{
    var country = "";

    if(!code || code<0) {//ie
      code = currC;
    }
    if(!field) {
      field = searchI.id;
    }
    try {
      sugCity=sugIB[searchI.id].getElementById(code).innerHTML;
      sugState="XX";
      if(code.length > 4) {
          sugStates="";
          sugAirport=code.substring(0,2);
          sugState=code.substring(2,4);
          if (sugState != 'XX') {
              sugStates = sugState+sugAirport;
              sugAirport= "";
          } else {
              country = sugAirport;
          }
      } else {
          sugAirport=code.substring(0,3);//airport has 4
      }

      if(gCompensateDest ==1 && field=='dep'){
          docGet('dest').value=sugCity.replace(/<[^>]*>/g, "");
          if(code.length < 7) {
              if (sugState != 'XX') {
                  docGet('destStates').value=sugStates;
                  docGet('destAirport').value= "";
              } else {
                  docGet('destAirport').value=sugAirport;
                  docGet('destCountry').value=country;
              }
          }
      }
      docGet(field).value=sugCity.replace(/<[^>]*>/g, "");
      if(code.length < 7) {
          if (sugState != 'XX') {
              docGet(field+'States').value=sugStates;
              docGet(field+'Airport').value= "";
          } else if (country == "") {
              docGet(field+'Airport').value=sugAirport;
          }
      }

      docGet(field+"Country").value = country;
      sugIB[searchI.id].getElementById('sugContent').innerHTML='';


      try{
        docGet('sug'+searchI.id+'_iframe').style.visibility='hidden';
      } catch(f) {}
      searchS='';
      gCallerObj.gotoNext(field)
    } catch(f) {
      //log(f);
    }
    docGet('submitEnabled').value = 1;
}
this.fill=fill;
//===
function fillGeo(code, name, xcoord, ycoord, lastField )
{
    if(!code || code<0) {//ie
      code = currC;
    }
    if (typeof(lastField) != 'undefined') {
      field = lastField;
    } else {
      field = searchI.id;
    }
    if (code=='') {
        return;
    }
    if (code=='more') {
        if(gMore==0) {
            doSearch(1);
            gMore=1;
        } else {
            //
        }
        return;
    }
    var anotherArray = 0;
    if (!name && typeof(field)!='undefined' && typeof(sugC[field])!='undefined'){
      for(var i=0; i<sugC[field].length; ++i){
        if (typeof(sugC[field][i][0])!='undefined' && sugC[field][i][0] == code) {
          name   = sugC[field][i][1]
          xcoord = sugC[field][i][2]
          ycoord = sugC[field][i][3]
          break;
        }
      }
    }
    if(typeof(xcoord)=='object') {
      anotherArray = xcoord;
    }
    if(name==0 || typeof(name)=='undefined'){
        try {
           // searchI.focus();
        }catch(ff){

        }
        return false;
    }
    searchI.value = name;
    try {
      sugIB[searchI.id].getElementById('sugContent').innerHTML='';
      try{
        docGet('sug'+searchI.id.substr(0,3)+'_iframe').style.visibility='hidden';
      } catch(f) {}
      searchS='';
      if (anotherArray!=0) {
        gCallerObj.fillMultiGeo(name, anotherArray);
      } else {
        gCallerObj.fillGeo(code, name, xcoord, ycoord);
        docGet('submitEnabled').value = 1;
      }
      currC = '';
     // gCallerObj.gotoNext(field)
    } catch(f) {}

    try {
      if(searchI.id.length>3) {
        var last = parseInt(searchI.id.substr(3,1))+1;
        //document.getElementById(searchI.id.substr(0,3)+last).focus();
        var param = "if(document.getElementById('"+searchI.id.substr(0,3)+last+"')){document.getElementById('"+searchI.id.substr(0,3)+last+"').focus();}";
        setTimeout(param, gTimeout);
        currC = '';
      }
    } catch (ff) {}

}
this.fillGeo=fillGeo;
//===
function setCaller(obj)
{
  gCallerObj = obj;
}
this.setCaller = setCaller
//===
function setLang(lang)
{
  gLang = lang;
}
this.setLang = setLang
//===
function createAjax(params, successHandler, curl)
{
    if (!curl) {
      curl = url; //default
    }
    var myAjax = new Ajax();
    myAjax.url = curl;
    myAjax.params = params;
    myAjax.method = "POST";
    myAjax.onSuccess = successHandler;
    myAjax.onError = ajaxError;
    myAjax.doRequest();
}
//===
function ajaxError(msg)
{
ajaxRun = 0;
}
//===
function log(msg)
{
    try {
      console.log(msg);
    } catch(f) {
      try {
        var tmp = docGet('logs').innerHTML;
        docGet('logs').innerHTML=msg+'<br/>'+tmp
      } catch(g) {}
    }
}
function docGet(nic)
{
  return document.getElementById(nic);
}
//===
}
var sug=new  cmCarsSuggest();
