var locationArray = new Array();
var suggestionElement = parent.document.createElement("div");
suggestionElement.Id = "suggestionbox";
var isTabbed = false;

function tabCheck(ev)
{
  if(ev.keyCode == 9)
  {
    isTabbed = true;
  }
}

function focusNextElement(event)
{
  if(event.keyCode == 9)
  {
    parent.document.getElementById("departure").focus();
    suggestionElement.style.visibility = "hidden";
    suggestionElement.style.display = "none";
    document.getElementById("departure").value = '';
  }
}

function retrieveURL(e)
{
  var inputBox= document.getElementById("departure");

    inputBox.onblur = function(){
      isTabbed = true;
      if(isTabbed)
      {
      	if(inputBox.value.length > 2)
        {
         if(parent.document.getElementById("suggest") && parent.document.getElementById("suggest").disabled == false)
	        {
	         parent.document.getElementById('suggest').style.display='inline';
	         parent.document.getElementById('suggest').style.visibility = 'visible';
            parent.document.getElementById('suggest').focus();
          //parent.document.getElementById('suggest').options[0].selected = true;
	       }
	       else
	       {
	       	  suggestionElement.style.display = "none";
	       	  inputBox.value = '';
	       }
        }
    }
     isTabbed = false;
  }

   if ((e.keyCode >= 65 && e.keyCode <= 90) ||
    (e.keyCode >= 97 && e.keyCode <= 122) ||
    (e.keyCode >= 33 && e.keyCode <= 39) ||
    (e.keyCode >= 16 && e.keyCode <= 20) ||
    (e.keyCode >= 44 && e.keyCode <= 46) ||
    (e.keyCode==91 || e.keyCode==92 || e.keyCode==27 || e.keyCode == 40 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 13 || e.keyCode == 144 || e.keyCode ==109 || e.keyCode == 192 || e.keyCode == 222 || e.keyCode == 55))
     {

       var nchar = getNormalCharacter();
       if (nchar!=0)
       {
         var locationName = document.getElementById('departure').value;
         locationName = locationName.substr(0,locationName.length-1)+nchar;
         document.getElementById('departure').value = locationName;
       }

       // This code is added to allow key press for special keys
       // like PRINTSCREEN, ESC to enter for search but not to proceed with it.
       // Without this condition 'No Results' will get displayed
       // for such keys when entered, which is wrong.
       if((e.keyCode >= 44 && e.keyCode <= 46) ||(e.keyCode >= 16 && e.keyCode <= 20) || e.keyCode==9 || e.keyCode==91 || e.keyCode==92 || e.keyCode==27 || e.keyCode == 144 ||(e.keyCode >= 33 && e.keyCode <= 39) )
       {
        return;
       }

       if (document.getElementById('departure').value.length < 3 )
       {
        resetSearchCodes();

        suggestionElement.style.visibility = "hidden";
        suggestionElement.style.display = "none";
        suggestionElement.innerHTML = "";
        return;
       }

       suggestionElement.style.visibility = "visible";
       suggestionElement.style.display = "inline";

       var ignorelist = new Array('hot','hote','hotel','hotel ','vil','vill','villa','villa ','the');
       for (i=0;i<ignorelist.length;i++)
       {
         if(document.getElementById('departure').value.toString().toLowerCase() == ignorelist[i])
         {
           suggestionElement.innerHTML = "<select style=\"font-size: 11px !important;font-family:arial !important;\" size='4' style=\"width:196px;\" id=\"suggest\"><option>No Results</option></select>";
           alignSuggestionBox();
           parent.document.getElementById("suggest").disabled = true;
           return;
         }
      }

  var predictStr = inputBox.value;
  var ampPosition=predictStr.indexOf('&');
  if(ampPosition!=-1)
  {
     predictStr = predictStr.substr(0, ampPosition-1) + ' AMPERSAND' + predictStr.substr(ampPosition+1, predictStr.length);
  }

     //convert the url to a string
     url="/thomson/page/byo/search/predictivesearch.page?"+"destinationString=" + predictStr;

     //Do the AJAX call
     if (window.XMLHttpRequest)
     {
      // Non-IE browsers
      req = new XMLHttpRequest();
      req.onreadystatechange = processStateChange;
      try
      {
       req.open("GET", url, true);
      }
      catch (e)
      {
      alert("Server Communication Problem\n"+e);
      }
      req.send(null);
    } else if (window.ActiveXObject)
      {
       // IE

       req = new ActiveXObject("Microsoft.XMLHTTP");
       if (req)
       {
        req.onreadystatechange=processStateChange;
        req.open("GET", url, true);
        req.send();
       }
      }
   }
   else if(document.getElementById('departure').value.length > 2)
   {
     if(e.keyCode!=32)
      {
       suggestionElement.style.visibility = "visible";
        suggestionElement.style.display = "inline";
       ajaxHtmlResponse = "<select style=\"font-size: 11px !important;font-family:arial !important;\" size='4' style=\"width:196px;\" id=\"suggest\"><option>No Results</option></select>";
       suggestionElement.innerHTML = ajaxHtmlResponse;
       alignSuggestionBox();
       parent.document.getElementById("suggest").disabled = true;
       }
   }
}

function getNormalCharacter()
{
   var stringEntered = document.getElementById('departure').value
   var lastCharEntered = stringEntered.substr(stringEntered.length-1, stringEntered.length).toUpperCase();
   for(var i=0;i<specialChar.length;i++)
   {
      if(lastCharEntered==specialChar[i].toUpperCase())
      {
         return displayChar[i];
      }
   }
   return 0;
}

function processStateChange()
{
   // Complete
   if (req.readyState == 4)
   {
       // OK response
      if (req.status == 200)
      {

         var ajaxHtmlResponse = "<select size='11' style=\"font-size: 11px !important;font-family:arial !important;\" id=\"suggest\" onclick=\"var withinIframe = false;var iframeObjIdx = null;for(i=0;i<parent.document.getElementsByTagName(\'iframe\').length;i++){if (parent.document.getElementsByTagName(\'iframe\')[i].src && ((parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'usp.page\')!= -1 ) || (parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'searchpanel.page\')!= -1 ) || (parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'searchpanel?\')!= -1 ))){withinIframe = true;iframeObjIdx = i;break;}}if (withinIframe){parent.frames[iframeObjIdx].setPredictiveDestinationValues(this)}else{setPredictiveDestinationValues(this);}\" onkeydown=\"var withinIframe = false;var iframeObjIdx = null;for(i=0;i<parent.document.getElementsByTagName(\'iframe\').length;i++){if (parent.document.getElementsByTagName(\'iframe\')[i].src && ((parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'usp.page\')!= -1) || (parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'searchpanel.page\')!= -1 ) || (parent.document.getElementsByTagName(\'iframe\')[i].src.indexOf(\'searchpanel?\')!= -1 ))){withinIframe = true;iframeObjIdx = i;break;}}if (withinIframe){parent.frames[iframeObjIdx].focusNextElement(event);parent.frames[iframeObjIdx].setPredictiveDestinationValuesUsingKeyBoard(event, this);}else{focusNextElement(event);setPredictiveDestinationValuesUsingKeyBoard(event, this);}\">"

         if (req.responseXML != null)
         {
         getElem('ajaxresponse').innerHTML = req.responseText;
      getElem('ajaxresponse').style.display='none';
          var content=getElem('ajaxresponse').getElementsByTagName("table");
      if (content[0])
      {
      var arrIndex=0;
          var locations = content[0].childNodes[0].childNodes;
          for (var x=0; x<content[0].childNodes[0].childNodes.length; x++)
          {
            if(locations[x].childNodes[3].getAttribute("Id")!="")
            {
              locationArray[arrIndex] = new Location(locations[x].childNodes[0].getAttribute("Id"),locations[x].childNodes[0].getAttribute("Name"),
                            locations[x].childNodes[1].getAttribute("Id"),locations[x].childNodes[1].getAttribute("Name"),
                                   locations[x].childNodes[2].getAttribute("Id"),locations[x].childNodes[2].getAttribute("Name"),
                                   locations[x].childNodes[3].getAttribute("Id"),locations[x].childNodes[3].getAttribute("Name"))

              if (locations[x].childNodes[0].getAttribute("Name") != "")
              {
          ajaxHtmlResponse += "<option id=\""+x+"\">"+
              locations[x].childNodes[0].getAttribute("Name")
                +"</option>"
                arrIndex++;
              }
                else if (locations[x].childNodes[1].getAttribute("Name") != "")
                {
            ajaxHtmlResponse += "<option id=\""+x+"\">"+
                locations[x].childNodes[1].getAttribute("Name")
                  +"</option>"
                  arrIndex++;
                }
          else if (locations[x].childNodes[2].getAttribute("Name") != "")
          {
            ajaxHtmlResponse += "<option id=\""+x+"\">"+
              locations[x].childNodes[2].getAttribute("Name")
                  +"</option>"
                  arrIndex++;
          }
          else
          {
            ajaxHtmlResponse += "<option id=\""+x+"\">"+
              locations[x].childNodes[3].getAttribute("Name")
                  +"</option>"
                  arrIndex++;
          }
        }
          }
          ajaxHtmlResponse +="</select>"
      suggestionElement.innerHTML = ajaxHtmlResponse;

            alignSuggestionBox();
         }
         else
         {
          ajaxHtmlResponse = "<select style=\"font-size: 11px !important;font-family:arial !important;\" size='4' style=\"width:196px;\" id=\"suggest\"><option>No Results</option></select>";
           suggestionElement.innerHTML = ajaxHtmlResponse;
           alignSuggestionBox();
           parent.document.getElementById("suggest").disabled = true;
         }
       }
     }
   }
}

function findPos(obj) {
 if (obj)
 {
   var curleft = curtop = 0;
   if (obj.offsetParent) {
    curleft = obj.offsetLeft
    curtop = obj.offsetTop
    while (obj = obj.offsetParent) {
     curleft += obj.offsetLeft
     curtop += obj.offsetTop
    }
   }
   return [curleft,curtop];
 }else{
   return [0,0];
 }
}

function clearPredictiveInputElements()
{
   if (parent.document.getElementById("suggest") != null)
   {
      if ( suggestionElement.style.display == 'inline'
         && parent.document.getElementById("suggest").selectedIndex == '-1')
      {
         suggestionElement.style.display = 'none';
         document.getElementById("departure").value = '';
      }
   }
     else if (parent.document.getElementById("suggest") == null )
     {
         if(document.getElementById("departure").value.length > 2)
         {
            suggestionElement.style.display = 'none';
            document.getElementById("departure").value = '';
         }
     }
}

function appendOnFocusToAllElements()
{
  for (i=0; i<document.forms.length; i++)
  {
    for (j=0; j<document.forms[i].elements.length; j++)
    if (document.forms[i].elements[j].type != 'hidden'
      && document.forms[i].elements[j].name != 'departure'
      && document.forms[i].elements[j].name != 'suggest' )
    {
      document.forms[i].elements[j].onfocus=function(){clearPredictiveInputElements();}
    }
  }
}

function Location(accommodationCode, accommodationName, resortCode, resortName, destinationCode, destinationName, countryCode, countryName)
{
   this.accommodationCode = accommodationCode;
   this.accommodationName = accommodationName;
   this.resortCode = resortCode;
   this.resortName = resortName;
   this.destinationCode = destinationCode;
   this.destinationName = destinationName;
   this.countryCode = countryCode;
   this.countryName = countryName;
}

function setPredictiveDestinationValues(selectedOption)
{
    var index = selectedOption.selectedIndex;
  document.getElementById("departure").value = selectedOption.options[index].text;
  document.getElementById("countryCode").value = locationArray[index].countryCode;
  document.getElementById("destinationCode").value = locationArray[index].destinationCode;
  document.getElementById("resortCode").value = locationArray[index].resortCode;
  document.getElementById('accommodationCode').value = locationArray[index].accommodationCode;
  setDropdownsToDefault();
  setRadioToDefault();
  suggestionElement.style.visibility = "hidden";
  suggestionElement.style.display = "none";
}

function closeSuggestionBox()
{
  if (suggestionElement)
  {
    suggestionElement.style.display = 'none';
  }
  document.getElementById("departure").value = '';
}

function setPredictiveDestinationValuesUsingKeyBoard(e, selectedOption)

{
  if (e.keyCode == 13)
  {
    var index = selectedOption.selectedIndex;
    document.getElementById("departure").value = selectedOption.options[index].text;
    document.getElementById("countryCode").value = locationArray[index].countryCode;
    document.getElementById("destinationCode").value = locationArray[index].destinationCode;
    document.getElementById("resortCode").value = locationArray[index].resortCode;
    document.getElementById('accommodationCode').value = locationArray[index].accommodationCode;
    setDropdownsToDefault();
    setRadioToDefault();
    suggestionElement.style.visibility = "hidden";
    suggestionElement.style.display = "none";
  }
}

function resetSearchCodes()
{
  if(document.getElementById("countryDestCode").selectedIndex==0
     && document.getElementById("departure").value=="")
      {
        document.getElementById("countryCode").value = "";
        document.getElementById("destinationCode").value = "";
          document.getElementById("accommodationCode").value = "";
          document.getElementById("resortCode").value = "";

          document.getElementById("resortAccomCode").selectedIndex=0;
       }
}

function setDropdownsToDefault()
{
  //document.getElementById("resortAccomCode").options[document.getElementById("resortAccomCode").selectedIndex].value="";
    document.getElementById("resortAccomCode").value="";
    document.getElementById("resortAccomCode").selectedIndex =0;
    document.getElementById("resortAccomCode").disabled=true;

  //document.getElementById("countryDestCode").options[document.getElementById("countryDestCode").selectedIndex].value="";
     document.getElementById("countryDestCode").value="";
    document.getElementById("countryDestCode").selectedIndex =0;
}

function clearPredictivePanels()
{
    suggestionElement.style.visibility = "hidden";
    suggestionElement.style.display = "none";
    document.getElementById("departure").value = "";
}

function disableFreeTextSearchOnEnter()
{
  var nav = document.addEventListener ? true : false;

  if (nav) {
     if (typeof(Event.KEYDOWN) != 'undefined')
     {
        window.captureEvents(Event.KEYDOWN);
        window.onkeydown = NetscapeEventHandler_KeyDown;
     }
  } else {
     document.onkeydown = MicrosoftEventHandler_KeyDown;
  }

  function NetscapeEventHandler_KeyDown(e) {
    if (e.which == 13 && (parent.document.getElementById("suggest")==null || parent.document.getElementById("suggest").selectedIndex== -1)) { return false; }
    return true;
  }

  function MicrosoftEventHandler_KeyDown() {
    if (event.keyCode == 13 && (parent.document.getElementById("suggest")==null || parent.document.getElementById("suggest").selectedIndex== -1)) { return false; }
    return true;
  }
}

function setRadioToDefault()
{
  if (document.searchForm.favouriteDestination)
  {
    for (i=0;i<9 ;i++ )
    {
      document.searchForm.favouriteDestination[i].checked = false;
    }
  }
}



function setDestinationCode(countryCode, destinationCode)
{
   suggestionElement.style.visibility = "hidden";
   suggestionElement.style.display = "none";
   document.getElementById("departure").value="";

   document.getElementById("destinationCode").value=destinationCode;
   document.getElementById("countryCode").value=countryCode;
// document.getElementById("resortCode").value;

   if (getElem("matchedDestinations"))
   {
      ElementAction('matchedDestinations', 'hide');
      ElementAction('matchedDestinations', 'nodisplay');
   }
}

function alignSuggestionBox()
{

  suggestionElement.style.position= "absolute";
  var withinIframe = false;
  var iframeObj = null;
  for(i=0;i<parent.document.getElementsByTagName('iframe').length;i++)
  {
    if (parent.document.getElementsByTagName('iframe')[i].src && ((parent.document.getElementsByTagName('iframe')[i].src.indexOf('usp.page')!=-1) || (parent.document.getElementsByTagName('iframe')[i].src.indexOf('searchpanel.page ')!=-1) || (parent.document.getElementsByTagName('iframe')[i].src.indexOf('searchpanel?')!=-1)))
    {
      withinIframe = true;
      iframeObj = parent.document.getElementsByTagName('iframe')[i];
      break;
    }
  }




  //alert(parent.document.getElementsByTagName('iframe')[0].href);
  //alert(findPos(parent.document.getElementsByTagName('iframe')[0]));
  if (withinIframe)
  {
    suggestionElement.style.left = findPos(document.getElementById("predictbox"))[0] + findPos(iframeObj)[0] + "px";
    suggestionElement.style.top = findPos(document.getElementById("predictbox"))[1] + findPos(iframeObj)[1] + "px";
  }else{
  suggestionElement.style.left = findPos(document.getElementById("predictbox"))[0] + "px";
  suggestionElement.style.top = findPos(document.getElementById("predictbox"))[1] + "px";
  }
  parent.document.body.appendChild(suggestionElement);
}

