// Global Objects
var http     = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
var target   = null;
var s_list   = null;
var s_words  = new Array();
var s_active = null;
var s_index  = -1;


// Utility Functions
function removeChildrenFromNode(node) {
  if(!node) return;
  while (node.hasChildNodes()) node.removeChild(node.firstChild);
}

function getAbsPos(obj, which) {
  var pos = 0;
  while (obj != null) {
    pos += obj["offset" + which];
    obj = obj.offsetParent;
  }
  return pos;
}
function getAbsY(obj) { return getAbsPos(obj, 'Top'); }
function getAbsX(obj) { return getAbsPos(obj, 'Left'); }

// Response Handlers
function updateListHandler() {
  if(http.readyState == 4 && http.status == 200) {
    target.options.length = 0;
    var options = http.responseXML.getElementsByTagName('option');
    for(i = 0; i < options.length; i++) {
      target.options[target.options.length] = new Option(options[i].firstChild.nodeValue, options[i].getAttribute('value'));
    }
  }
}

function suggestionHandler() {
  if(http.readyState == 4 && http.status == 200) {
    getSuggestionListObj();
    s_words = http.responseXML.getElementsByTagName("suggestion");
    s_index = -1;
    updateSuggestionList();
  }
}

function getSuggestionListObj() {
  if(!s_list) {
    s_list = document.createElement('ul');
    s_list.style.position = 'absolute';
    s_list.style.zindex   = 100;
    s_list.style.display  = 'none';
    s_list.className      = 's_list';
    document.body.appendChild(s_list);
  }
  return s_list;
}

function updateSuggestionList() {
  getSuggestionListObj();
  removeChildrenFromNode(s_list);
  if(s_words.length > 0 && s_active) {
    for(i = 0; i < s_words.length; i++) {
      option = document.createElement('li');
      option.onclick = function() { setSuggestionValue(this.firstChild.nodeValue); }
      option.className = (i == s_index ? 'activesuggestion' : 'suggestion');
      option.appendChild(document.createTextNode(s_words[i].firstChild.nodeValue));
      s_list.appendChild(option);
    }
    s_list.style.top     = (getAbsY(s_active) + s_active.offsetHeight + 1) + 'px';
    s_list.style.left    = getAbsX(s_active) + 'px';
    s_list.style.width   = s_active.offsetWidth + 'px';
    s_list.style.display = 'block';
  } else {
    s_list.style.display = 'none';
  }
}

function setSuggestionValue(value) {
  if(s_active) s_active.value       = value;
  if(s_list)   s_list.style.display = 'none';
}


// User Functions
function setDefaultOption(list, text) {
  list.options.length = 0;
  list.options[0] = new Option(text, '');
}
  
function loadOptions(list, url) {
  showLoading(list);
  if(http.readyState == 0 || http.readyState == 4) {
    target  = list;
    http.open('get', url);
    http.onreadystatechange = updateListHandler;
    http.send(null);
  }
}

function resetOptions(list) {
  setDefaultOption(list, '----------');
}

function showLoading(list) {
  setDefaultOption(list, 'Loading...');
}

function getStates(country, list) {
  var url = '/ajax/getStates.php?country=' + country;
  loadOptions(list, url);
}

function getCounties(state, list) {
  var url = '/ajax/getCounties.php?state=' + state;
  loadOptions(list, url);
}

function getGenus(group, list) {
  var url = '/ajax/getGenus.php?group=' + group;
  loadOptions(list, url);
}

function getChildren(parent, list) {
  var url = '/ajax/getChildren.php?parent=' + parent;
  loadOptions(list, url);
}

function getSuggestions(e, obj) {
  if(!e) e = window.event;
  var text = obj.value;
  if(text == '') {
    if(s_list) {
      s_list.style.display = 'none';
      removeChildrenFromNode(s_list);
    }
    //s_active = null;
  } else {
    switch(e.keyCode) {
      case 9:  // Tab
      case 37: // Left arrow
      case 39: // Right arrow
      case 13: // Enter
        if(s_index > -1) setSuggestionValue(s_words[s_index].firstChild.nodeValue);
        return false;
      case 38: // arrow up
        if(s_index > -1) s_index--;
        updateSuggestionList();
        break;
      case 40: // arrow down
        if(s_index < (s_words.length - 1)) s_index++;
        updateSuggestionList();
        break;
      default:
        if(http.readyState == 0 || http.readyState == 4) {
          var url = '/ajax/getSuggestions.php?text=' + escape(text);

          http.open('get', url);
          http.onreadystatechange = suggestionHandler;
          http.send(null);
          s_active = obj;
        }
    }
  }
}

function disableEnterKey(e) {
  if(!e) e = window.event;
  if(e.keyCode == 13) return false;
  return true;
}
