
var queryField;
var lookupURL;
var divName;
var ifName;
var lastVal = "";
var val = ""
var xmlHttp;
var cache = new Object();
var searching = false;
var globalDiv;
var divFormatted = false;
var DIV_BG_COLOR = "#ffffff";
var DIV_HIGHLIGHT_COLOR = "#3366cc";
var FONT_COLOR = "#000000";
var FONT_HOVER_COLOR = "#ffffff";



function InitQueryCode (queryFieldName, lookupURLPrefix, hiddenDivName) {
   
    queryField = document.getElementById(queryFieldName);
  //queryField.onblur = hideDiv;
    
  queryField.onkeydown = keypressHandler;
  queryField.autocomplete = "off";
  
  lookupURL = lookupURLPrefix;
  if (hiddenDivName)
    divName = hiddenDivName;
  else
      divName = "querydiv";

    ifName = "queryiframe";
  
  addToCache("", new Array(), new Array());
  setTimeout("mainLoop()", 100);
}

function addToCache (queryString, resultArray1, resultArray2)
{
    if (resultArray2!=null)
        cache[queryString] = new Array(resultArray1, resultArray2);
      else 
        cache[queryString] = new Array(resultArray1);
}

mainLoop = function() {
    val = escape(queryField.value);
   
    if (lastVal != val && searching == false) {
        var cacheResult = cache[val];
        if (cacheResult)
        //showQueryDiv(val, cacheResult[0], cacheResult[1]);
            showQueryDiv(val, cacheResult[0]);
        else
            doRemoteQuery(val);
        lastVal = val;
    }

    setTimeout("mainLoop()", 100);
    return true;
}
;

function getDiv (divID)
{
  if (!globalDiv) {
    if (!document.getElementById(divID)) {
      var newNode = document.createElement("div");
      newNode.setAttribute("id", divID);
      document.body.appendChild(newNode);
    }
    
    globalDiv = document.getElementById(divID);
    var x = queryField.offsetLeft;
    var y = queryField.offsetTop + queryField.offsetHeight;
    var parent = queryField;
    while (parent.offsetParent) {
      parent = parent.offsetParent;
      x += parent.offsetLeft;
      y += parent.offsetTop;
    }

    if (!divFormatted) {
      globalDiv.style.backgroundColor = DIV_BG_COLOR;
      globalDiv.style.fontFamily = "Arial, Helvetica, sans-serif";
      //globalDiv.style.padding = "4px";
      globalDiv.style.border = "1px solid #666666";
      globalDiv.style.fontSize = "12px";
      globalDiv.style.fontFamily = "Comic Sans MS, Trebuchet MS";
      globalDiv.style.width = "260px";
      globalDiv.style.overflow = "auto";
      globalDiv.style.height = "250px";
      globalDiv.style.position = "absolute";
      //hack
      if ($.browser.msie) {
          globalDiv.style.left = x + 10 + "px";
          globalDiv.style.top = y + 10 + "px";
      } else {
          globalDiv.style.left = x - 8 + "px";
          globalDiv.style.top = y + "px";
      }
      
      globalDiv.style.visibility = "hidden";
      globalDiv.style.zIndex = 10000;
      divFormatted = true;
    }
  }
  
  return globalDiv;
}

function showQueryDiv (queryString, resultArray1)
{

  var div = getDiv(divName);
  while (div.childNodes.length > 0)
    div.removeChild(div.childNodes[0]);
  for (var i = 0; i < resultArray1.length; i++)
  {
    // each result will be contained within its own div
    var result = document.createElement("div");
    result.style.cursor = "pointer";
    //result.style.borderBottom = "1px solid #000000";
    result.style.padding = "0px 5px 0px 5px";
    _unhighlightResult(result);
    result.onmousedown = selectResult;
    result.onmouseover = highlightResult;
    result.onmouseout = unhighlightResult;
    

    var result1 = document.createElement("span");
    result1.className = "result1";
    result1.style.textAlign = "left";
    result1.style.fontWeight = "normal";
    result1.innerHTML = unescape(resultArray1[i]);
    
//    var result2 = document.createElement("span");
//    result2.className = "result2";
//    result2.style.textAlign = "right";
//    result2.style.paddingLeft = "20px";
//    result2.innerHTML = resultArray2[i];
//    
    result.appendChild(result1);
    //result.appendChild(result2);
    div.appendChild(result);
  }
  
  var isCached = cache[queryString];
  if (!isCached)
      addToCache(queryString, resultArray1,null);
    //addToCache(queryString, resultArray1, resultArray2);
  showDiv(resultArray1.length > 0);
}

function selectResult() {
  _selectResult(this);
}

function _selectResult(item) {
    
  var spans = item.getElementsByTagName("span");
  if (spans) {
    for (var i = 0; i < spans.length; i++) {
        if (spans[i].className == "result1") {
        queryField.value = spans[i].innerHTML;
        lastVal = val = escape(queryField.value);
        searching = false;
        mainLoop();
        queryField.focus();
        showDiv(false);
        return;
      }
    }
  }
}

function highlightResult() {
    _highlightResult(this);
}

function _highlightResult(item) {

  item.style.backgroundColor = DIV_HIGHLIGHT_COLOR;
  item.style.color = FONT_HOVER_COLOR
}

function unhighlightResult() {   
    _unhighlightResult(this);
}

function _unhighlightResult(item)
{
  item.style.backgroundColor = DIV_BG_COLOR;
  item.style.color = FONT_COLOR
}

function showDiv (show) {

  var div = getDiv(divName);
  if (show)
      div.style.visibility = "visible";
  else {
      
      div.style.visibility = "hidden";
  }

  adjustiFrame();
}

function hideDiv (div) {
  showDiv(false);
}

function adjustiFrame()
{
  if (!document.getElementById(ifName)) {
    var newNode = document.createElement("iFrame");
    newNode.setAttribute("id", ifName);
    newNode.setAttribute("src", "javascript:false;");
    newNode.setAttribute("scrolling", "no");
    newNode.setAttribute("frameborder", "0");
    document.body.appendChild(newNode);
  }
  
  iFrameDiv = document.getElementById(ifName);
  var div = getDiv(divName);
  
  try {
    iFrameDiv.style.position = "absolute";
    iFrameDiv.style.width = div.offsetWidth;
    iFrameDiv.style.height = div.offsetHeight;
    iFrameDiv.style.top = div.style.top;
    iFrameDiv.style.left = div.style.left;
    iFrameDiv.style.zIndex = div.style.zIndex- 1;
    iFrameDiv.style.visibility = div.style.visibility;
  } catch(e) {
  }
}

function getXMLHTTP() {

  var A = null;
  
  try{
    A = new ActiveXObject("Msxml2.XMLHTTP");
  }catch(e){
    try{
      A = new ActiveXObject("Microsoft.XMLHTTP");
    } catch(oc){
      A = null;
    }
  }
  
  if(!A && typeof XMLHttpRequest != "undefined") {
    A = new XMLHttpRequest();
  }
  
  return A;
}

function doRemoteQuery (queryString) {
 
  searching = true;
  if(xmlHttp && xmlHttp.readyState != 0) {
    xmlHttp.abort()
  }
  
  xmlHttp=getXMLHTTP();
  if(xmlHttp){
    xmlHttp.open("GET", lookupURL + queryString, true);
    
    // What do we do when the response comes back?
    xmlHttp.onreadystatechange = function() {
      if (xmlHttp.readyState == 4 && xmlHttp.responseText && searching) {
      eval(xmlHttp.responseText);
        searching = false;
      }
    }
    ;
    
    xmlHttp.send(null);
  }
  
}

function keypressHandler (evt) {

  // don't do anything if the div is hidden
  var div = getDiv(divName);
  if (div.style.visibility == "hidden")
    return true;
  
  // make sure we have a valid event variable
  if(!evt && window.event) {
    evt = window.event;
  }
  var key = evt.keyCode;
  
  // if this key isn't one of the ones we care about, just return
  var KEYUP = 38;
  var KEYDOWN = 40;
  var KEYENTER = 13;
  var KEYTAB = 9;
  
  if ((key != KEYUP) && (key != KEYDOWN) && (key != KEYENTER) && (key != KEYTAB))
    return true;
  
  // get the span that's currently selected, and perform an appropriate action
  var selNum = getSelectedSpanNum(div);
  var selSpan = setSelectedSpan(div, selNum);

  if ((key == KEYENTER) || (key == KEYTAB)) {
      
    if (selSpan)
      _selectResult(selSpan);
    evt.cancelBubble=true;
    return false;
  } else {
    if (key == KEYUP)
      selSpan = setSelectedSpan(div, selNum - 1);
    if (key == KEYDOWN)
      selSpan = setSelectedSpan(div, selNum + 1);
  if (selSpan)
      _highlightResult(selSpan);
  
  }

  showDiv(true);
  return true;
}

function getSelectedSpanNum (div) {
  var count = -1;
  var spans = div.getElementsByTagName("div");
  if (spans) {
    for (var i = 0; i < spans.length; i++) {
      count++;
      if (spans[i].style.backgroundColor != div.style.backgroundColor)
        return count;
    }
  }
  
  return -1;
}

function setSelectedSpan (div, spanNum) {
    
  var count = -1;
  var thisSpan;
  var spans = div.getElementsByTagName("div");
  if (spans) {
    for (var i = 0; i < spans.length; i++) {
      if (++count == spanNum) {
        _highlightResult(spans[i]);
        thisSpan = spans[i];
      } else {
        _unhighlightResult(spans[i]);
      }
    }
  }
  
  return thisSpan;
}


