/* These functions enact the restriction against one-way flights originating in a foreign country
 * where we do not yet have permission 
 */

// Define your popup messages here:
//MBJ_popup = "***Disclaimer***\n\nPurchasing a one way flight to Montego Bay, Jamaica does not guarantee return to originating city. Return service on JetBlue Airways from Sangster International Airport is subject to receipt of Jamaican operating authority and is NOT currently available for purchase except as part of a roundtrip itinerary.\n\nTravel currently must be purchased and originate in the United States only; itineraries that begin in Montego Bay will be available for sale at a later date, pending final government approval."

// Detect and alert certain cities:
function ExcludeFromOrigin (panelID, liText)
{
  if ( panelID.match('Desde') && liText )
  {
    // NOTE:  Changes here need to be made in 'genericPanel.js' as well!

    // EXAMPLE: MBJ:
    //if (liText.match('(MBJ)'))
    //  return true;

    // ???: Add more here as necessary.
    
  }

  return false;
}

function OWAlert(cityCode)
{
  // NOTE:  Changes here need to be made in 'genericPanel.js' as well!

  // EXAMPLE: MBJ:
  //if (cityCode == 'MBJ')
  //{
  //  alert(MBJ_popup);
  //  return true;
  //}

  // ???: Add more here as necessary.

  return false;
}


/*
Panel + subPanel constructors
----------------------------------------------*/
var allPanels = [];
var counter = 0;
var pairIndex = 0;

function panel(pair) {
  if(document.getElementById && document.getElementsByTagName) {
    this.subPanels = [];
    for(var i=0; i<pair.length; i++) {
      allPanels[allPanels.length] = new SubPanel(pair[i][0], pair[i][1], pair[i][2], pair[i][3], pairIndex, counter);
      this.subPanels[this.subPanels.length] = allPanels[allPanels.length - 1];
      counter += 1;
    }
    pairIndex += 1;
  }
}

function SubPanel(targetId, title, hiddenId, type, pIndex, theCount) {
  this.target = document.getElementById(targetId);
  this.title = (title.length == 3 && typeof(eval("s" + title)) == "string") ? eval("s" + title) + " (" + title + ")" : title;
  this.titleTemp = this.title;
  this.anchorId = targetId + "_anchor";
  this.hiddenId = hiddenId;
  this.inputName = "panInput_" + theCount;
  this.panelId = targetId + "_panel";
  this.type = type;
  this.cFlag = false;
  this.pIndex = pIndex;
  this.kbIndex = -1;
  this.pos = theCount; var holder = theCount;
  this.target.onmouseover = function() { allPanels[holder].cFlag = true; };
  this.target.onmouseout = function() { allPanels[holder].cFlag = false; };
  this.set = Dests;
  this.searchSet = Dests;
  this.selectedItem = null;
  this.render = render;
  var self = this;

  var pWrapper = document.createElement("div");
  if(type == 0)
    pWrapper.className = "panelWrapper panelWrapperZ";
  else if(type == 100) //booktravel special case
    pWrapper.className = "panelWrapperZ";
  else
    pWrapper.className = "panelWrapper";

  //pWrapper.className = (type == 0) ? "panelWrapper panelWrapperZ" : "panelWrapper";

  var anchor = document.createElement("a");
  anchor.id = self.anchorId;
  anchor.onclick = function(e) {
    if(!e) e = window.event;
    e.cancelBubble = true;
    showPanel(self);
    document.getElementById(self.inputName).focus();
  };

  var jsInput = document.createElement("div");
  jsInput.className = "jsInput";

  var input = document.createElement("input");
  input.type = "text";
  input.id = self.inputName;
  input.name = self.inputName;
  input.value = self.title;
  input.setAttribute("autocomplete", "off");
  input.onfocus = function() {
    if(this.setSelectionRange)
      this.setSelectionRange(0, this.value.length);
    else
      this.select();

    showPanel(self);
  };
  input.onkeypress = function(e) {
    if(!e) e = window.event;
    if(e.keyCode==13)
      return false;
  };
  input.onkeyup = function(e) {
    autoComplete(this, self, e);
  }
  input.onkeydown = function(e) {
    self.titleTemp = document.getElementById(self.inputName).value;
    kbListener(self, e);
  };

  jsInput.appendChild(input);
  anchor.appendChild(jsInput);
  pWrapper.appendChild(anchor);

  var p = document.createElement("div");
  p.id = self.panelId;
  p.className = "panel";
  p.onclick = function(e) {
    if(!e) e = window.event;
    var target = e.target ? e.target.nodeName.toLowerCase() : e.srcElement.nodeName.toLowerCase();
    if(target == "li" || target == "div" || target == "ul" || target == "h5")
      document.getElementById(self.inputName).focus();
  };

  var pbody = document.createElement("div");
  pbody.className = "panelBody";

  var pfoot = document.createElement("div");
  pfoot.className = "panelFoot";

  var pfootInnerDiv = document.createElement("div");

  var closeAnchor = document.createElement("a");
  closeAnchor.href = "javascript:void(0)";
  closeAnchor.onclick = function() {
    hidePanel(self);
  };

  var closeBtn = document.createElement("img");
  closeBtn.src = "http://hola.jetblue.com/img/jetblue/ES_1502.gif";

  closeAnchor.appendChild(closeBtn);
  pfootInnerDiv.appendChild(closeAnchor);
  pfoot.appendChild(pfootInnerDiv);
  p.appendChild(pbody);
  p.appendChild(pfoot);
  pWrapper.appendChild(p);
  
  this.target.appendChild(pWrapper);
  this.render();
}


/*
Panel methods
----------------------------------*/
function render() {
  var o = this;
  o.kbIndex = -1;

  var area = document.getElementById(o.panelId).firstChild;
  area.innerHTML = "";

  var total = o.searchSet.length - 1;
  var numCols = Math.ceil(total / 16);
  var start = 0;
  var width = 0;
  var startTemp, end, ul, li, a, text, textNode;
  
  while(start < total) {
    ul = document.createElement("ul");

    startTemp = start;
    end = Math.ceil((total - start) / numCols);
    for(var i=start; i<startTemp+end; i++) {
      a = document.createElement("a");
      a.id = o.pos + "_" + o.searchSet[i];
      a.href = "javascript:void(0)";
      a.className = (o.selectedItem && (o.selectedItem.id == a.id)) ? "selected" : "";
      a.onclick = function() {
        onclickWrap(o, this);
      };
      text = eval("s" + o.searchSet[i]) + " (" + o.searchSet[i] + ")";

      if (!ExcludeFromOrigin(o.panelId, text)) {
        textNode = document.createTextNode(text);
        a.appendChild(textNode);
        li = document.createElement("li");
        li.appendChild(a);
        ul.appendChild(li);
      }

      start++;
    }
    numCols--;
    area.appendChild(ul);


  }
  setWidth(o);
}

function autoComplete(self, obj, e) {
  if(obj.titleTemp == self.value)
    return;
  
  if(!e) e = window.event;
  var results = new Array();
  var list = obj.set;
  var value = self.value.toLowerCase();

  var text;
  var code;
  var parts = new Array();
  for(var i=0; i<list.length-1; i++) {
    text = eval("s" + list[i]) + " (" + list[i] + ")";
    text = text.toLowerCase();
    code = text.slice(text.lastIndexOf("(")+1, text.lastIndexOf(")"));
    if(code.indexOf(value) == 0) {
      results[results.length] = list[i];
      continue;
    }
    text = text.slice(0, text.lastIndexOf("(")-1);
    parts = text.split(", ");
    for(var n=0; n<parts.length; n++) {
      if(parts[n].indexOf(value) == 0) {
        results[results.length] = list[i];
        break;
      }
    }
  }
  results[results.length] = 0;

  var pbody = document.getElementById(obj.panelId).getElementsByTagName("div")[0];
  if(results.length > 1) {
    obj.searchSet = results;
    obj.render();
    if(results.length == 2)
      pbody.getElementsByTagName("a")[0].className = "selected";
  }
  else {
    pbody.innerHTML = "<ul><li><h5>\241Uy! Intenta nuevamente o borra tu<br />acceso para ver los lugares adonde volamos.</h5></li></ul>";
    setWidth(obj);
  }
}

function kbListener(obj, e) {
  var list = document.getElementById(obj.panelId).getElementsByTagName("div")[0].getElementsByTagName("a");
  var input = document.getElementById(obj.inputName);
  if(!e) e = window.event;

  var prev;
  if(e.keyCode==13) {
    e.target ? e.preventDefault() : e.returnValue = false;
    if(list.length == 1) obj.kbIndex = 0;
    if(obj.kbIndex == -1 || list.length == 0) hidePanel(obj);
    else onclickWrap(obj, list[obj.kbIndex]);
    input.blur();
  }
  else if((e.shiftKey && e.keyCode==9) || e.keyCode==38) {
    if(list.length == 0) return;
    e.target ? e.preventDefault() : e.returnValue = false;
    obj.kbIndex = (obj.kbIndex==0 || obj.kbIndex==-1) ? list.length-1 : obj.kbIndex-1;
    list[obj.kbIndex].className = "selected";
    prev = (obj.kbIndex == list.length-1) ? 0 : obj.kbIndex+1;
    list[prev].className = ((obj.selectedItem && (obj.selectedItem.id == list[prev].id)) || obj.kbIndex==prev) ? "selected" : "";
  }
  else if(e.keyCode==9 || e.keyCode==40) {
    if(list.length == 0) return;
    e.target ? e.preventDefault() : e.returnValue = false;
    obj.kbIndex = (obj.kbIndex == list.length-1) ? 0 : obj.kbIndex+1;
    list[obj.kbIndex].className = "selected";
    prev = (obj.kbIndex == 0) ? list.length-1 : obj.kbIndex-1;
    list[prev].className = ((obj.selectedItem && (obj.selectedItem.id == list[prev].id)) || obj.kbIndex==prev) ? "selected" : "";
  }
  else if(e.keyCode==27) {
    e.target ? e.preventDefault() : e.returnValue = false;
    hidePanel(obj);
    input.blur();
  }
}

function onclickWrap(p, a) {
  highlight(p, a);
  setField(p.inputName, a.innerHTML);
  filter(p, a.id.split("_")[1]);
  hidePanel(p);
}

function highlight(obj, a) {
  if(obj.selectedItem)
    obj.selectedItem.className = "";

  obj.selectedItem = a;
  document.getElementById(obj.selectedItem.id).className = "selected";
}

function hideAll() {
  for(var i=0; i<allPanels.length; i++) {
    if(document.getElementById(allPanels[i].panelId).style.display == "block")
      hidePanel(allPanels[i]);
  }
}

function setWidth(obj) {
  var p = document.getElementById(obj.panelId);
  if(p.style.display != "block")
    return;
  
  p.style.width = "700px";
  var width = 20;
  var uls = p.getElementsByTagName("ul");
  for(var i=0; i<uls.length; i++) {
    width += (uls[i].offsetWidth + 10);
  }
  p.style.width = width + "px";
}

function showPanel(p) {
  var obj = document.getElementById(p.panelId);
  
  if(obj.style.display == "block")
    return;

  p.searchSet = p.set;
  p.render();
  obj.style.display = "block";
  setWidth(p);
}

function hidePanel(p) {
  var obj = document.getElementById(p.panelId);

  if(obj.style.display != "block")
    return;

  obj.style.display = "none";
  p.cFlag = false;

  var input = document.getElementById(p.inputName);
  input.value = p.selectedItem ? eval("s" + p.selectedItem.id.split("_")[1]) + " (" + p.selectedItem.id.split("_")[1] + ")" : p.title;
}

function setField(inputName, text) {
  document.getElementById(inputName).value = text;
}

function filter(obj, code) {
  if(allPanels[obj.pos + 1] && allPanels[obj.pos + 1].type !=0) {
    var reselect = false;
    var next = allPanels[obj.pos + 1];

    var newCodes = eval("a" + code);

    if(next.selectedItem) {
      var toMatch = next.selectedItem.id.split("_")[1];
      for(var i=0; i<newCodes.length; i++) {
        if(toMatch == newCodes[i]) {
          reselect = true;
          break;
        }
      }
    }

    next.set = newCodes;
    next.searchSet = newCodes;
    next.render();

    if(reselect) {
      highlight(next, next.selectedItem);
    }
    else {
      setField(next.inputName, "\277Hacia d\363nde?");
      document.getElementById(next.hiddenId).value = "";
      next.selectedItem = null;
    }
  }

  document.getElementById(obj.hiddenId).value = code;
}

function panOffClick() {
  for(var j=0; j<allPanels.length; j++) {
    if(!allPanels[j].cFlag)
      hidePanel(allPanels[j]);
  }
}

function initPanEvents() {
  YAHOO.util.Event.addListener(document.body, "click", panOffClick);
}

function retCityAnchor(pid, code) {
  var links = document.getElementById(pid).getElementsByTagName("a");
  for(var i=0; i<links.length; i++) {
    if(links[i].id.indexOf(code) != -1)
      return links[i];
  }
  return false;
}

YAHOO.util.Event.addListener(window, "load", initPanEvents);

