/***** 
 *****     panel.js
 *****
 *****/


// Get some scripts imported dynamically if they're not already here:
if (typeof(dynamic_imported_scripts) == 'undefined') var dynamic_imported_scripts = new Object();
dynamic_script_import('http://www.jetblue.com/j/OriginRestrictions.js');

function dynamic_script_import(jsFile) {
if (dynamic_imported_scripts[jsFile] != null) return;
var scriptElt = document.createElement('script');
scriptElt.type = 'text/javascript';
scriptElt.src = jsFile;
document.getElementsByTagName('head')[0].appendChild(scriptElt);
dynamic_imported_scripts[jsFile] = jsFile; // or whatever value your prefer
}


/*
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 && eval("typeof(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 panelCloser = document.createElement("div");
  panelCloser.id = "panelCloser";
  panelCloser.onclick = function(e) {
    e = e || window.event;
    hidePanel(self);
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
  };
  panelCloser.appendChild(document.createTextNode("Cerrar"));

  pfoot.appendChild(panelCloser);
  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, o.searchSet[i])) {
        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);

