﻿// 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 getGenus(group, list, base) {
  var url = base + '/ajax/getGenus.php?group=' + group;
  loadOptions(list, url);
}

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

function getSpecies(genus, list, base) {
  var url = base + '/ajax/getSpecies.php?genus=' + genus;
  loadOptions(list, url);
}

function getSubspecies(species, list, base) {
  var url = base + '/ajax/getSubspecies.php?species=' + species;
  loadOptions(list, url);
}

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