  var offsetX = 0;
  var offsetY = 0;
  var externalFile = './auto_suggest.php';	// Path to external file
  var minimumLettersBeforeLookup = 2;	// Number of letters entered before a lookup is performed.
	
  var activeInput = false;
  var autoSuggestObject = false;
  var suggestionBox_activeItem;
  var suggestionBox_firstItem = false;
  var suggestionBox = false;
  var suggestionBox_iframe = false;

  var microsoft_ie = false;
  if (navigator.userAgent.indexOf('MSIE') >= 0 && navigator.userAgent.indexOf('Opera') < 0) microsoft_ie = true;
	
  function getTopPos(inputObj) {		
    var returnValue = inputObj.offsetTop;
    while ((inputObj = inputObj.offsetParent) != null) {
      returnValue += inputObj.offsetTop;
    }
    return returnValue;
  }

  function cancelEvent() {
    return false;
  }
	
  function getLeftPos(inputObj) {
    var returnValue = inputObj.offsetLeft;
    while ((inputObj = inputObj.offsetParent) != null) returnValue += inputObj.offsetLeft;
    return returnValue;
  }
	
  function setValue(e,inputObj) {

    if (!inputObj) inputObj = this;

    document.getElementById(activeInput.name).value = inputObj.name;
    if (document.getElementById(activeInput.name + '_id')) document.getElementById(activeInput.name + '_id').value = inputObj.id; 
    hideSuggestionBox();

    if (document.getElementById("accession_number") != undefined) {
      clear_accession_number(activeInput);
    }

    clear_genes(activeInput);

    if (document.getElementById("trans_factor1") != undefined) {
      clear_trans_factors(activeInput);
    }
  }
	
  function hideSuggestionBox() {
    if (suggestionBox) suggestionBox.style.display = 'none';	
    if (suggestionBox_iframe) suggestionBox_iframe.style.display = 'none';
  }

  function rollOverActiveItem(item,fromKeyBoard) {
    if (suggestionBox_activeItem) suggestionBox_activeItem.className = 'optionDiv';
    item.className = 'optionDivSelected';
    suggestionBox_activeItem = item;
 
    if (fromKeyBoard) {
      if (suggestionBox_activeItem.offsetTop > suggestionBox.offsetHeight) {
	 suggestionBox.scrollTop = suggestionBox_activeItem.offsetTop - suggestionBox.offsetHeight + suggestionBox_activeItem.offsetHeight + 2 ;
      }
      if (suggestionBox_activeItem.offsetTop<suggestionBox.scrollTop) {
        suggestionBox.scrollTop = 0;	
      }
    }
  }
	
  function buildSuggestionBox(inputObj) {
    suggestionBox.innerHTML = '';
    suggestionBox_activeItem = false;

    if(suggestionBoxElements.length<=1){
      hideSuggestionBox();
      return;			
    }
		
    suggestionBox_firstItem = false;
    var optionsAdded = false;
    for (var i=0; i < suggestionBoxElements.length; i++) {
      if (suggestionBoxElements[i].length == 0) continue;
      optionsAdded = true;
      var div = document.createElement('DIV');
      var items = suggestionBoxElements[i].split(/###/gi);
      var name = items[items.length-1];
      name = name.replace(/<\/span>/,"");
      name = name.replace(/<span style=\'color\:red\'>/,"");

      div.innerHTML = items[items.length-1];
      div.name = name;
      div.id = items[0];
      div.className = 'optionDiv';
      div.onmouseover = function(){ rollOverActiveItem(this,false) }
      div.onclick = setValue;
      if (!suggestionBox_firstItem) suggestionBox_firstItem = div;
      suggestionBox.appendChild(div);
    }	

    if (optionsAdded) {
      suggestionBox.style.display = 'block';
      if(suggestionBox_iframe) suggestionBox_iframe.style.display = '';
      rollOverActiveItem(suggestionBox_firstItem,true);
    }
  }
	
  function showContent(inputObj) {
    var content = autoSuggestObject.response;
    var elements = content.split('|');
    suggestionBoxElements = elements;
    buildSuggestionBox(inputObj);
  }
	
  function resizeSuggestionBox(inputObj) {
    suggestionBox.style.top = (getTopPos(inputObj) + inputObj.offsetHeight + offsetY) + 'px';
    suggestionBox.style.left = (getLeftPos(inputObj) + offsetX) + 'px';
    if (suggestionBox_iframe) {
      suggestionBox_iframe.style.left = suggestionBox.style.left;
      suggestionBox_iframe.style.top = suggestionBox.style.top;			
    }		
  }
	
  function showOptions(inputObj,type,id,e) {
    if (e.keyCode == 13 || e.keyCode == 9) return; // 9 = Tab, 13 = Enter
    if (!suggestionBox) {
      suggestionBox = document.createElement('DIV');
      suggestionBox.id = 'ajax_listOfOptions';	
      document.body.appendChild(suggestionBox);
	
      if (microsoft_ie) {
	 suggestionBox_iframe = document.createElement('IFRAME');
	 suggestionBox_iframe.border = '0';
	 suggestionBox_iframe.style.width = suggestionBox.clientWidth + 'px';
	 suggestionBox_iframe.style.height = suggestionBox.clientHeight + 'px';
	 suggestionBox_iframe.id = 'ajax_listOfOptions_iframe';
				
	 document.body.appendChild(suggestionBox_iframe);
      }			

      var allInputs = document.getElementsByTagName('INPUT');
      for (var i = 0; i < allInputs.length; i++) {
        if (!allInputs[i].onkeyup) allInputs[i].onfocus = hideSuggestionBox;
      }		
    
      var allSelects = document.getElementsByTagName('SELECT');
      for (var i = 0; i < allSelects.length; i++) allSelects[i].onfocus = hideSuggestionBox;

      var oldonkeydown=document.body.onkeydown;
      if (typeof oldonkeydown != 'function') document.body.onkeydown = keyNavigation;
      else {
	 document.body.onkeydown = function() {
	   oldonkeydown();
	   keyNavigation() ;
        }
      }
	
      var oldonresize = document.body.onresize;
      if (typeof oldonresize != 'function') document.body.onresize = function() { resizeSuggestionBox(inputObj); };
      else {
	 document.body.onresize = function() { 
          oldonresize();
	   resizeSuggestionBox(inputObj);
        }
      }
    }
			
    if (inputObj.value.length < minimumLettersBeforeLookup){
      hideSuggestionBox();
      return;
    }
				
    suggestionBox.style.top = (getTopPos(inputObj) + inputObj.offsetHeight + offsetY) + 'px';
    suggestionBox.style.left = (getLeftPos(inputObj) + offsetX) + 'px';
		
    if (suggestionBox_iframe){
      suggestionBox_iframe.style.left = suggestionBox.style.left;
      suggestionBox_iframe.style.top = suggestionBox.style.top;			
    }
		
    activeInput = inputObj;
    suggestionBox.onselectstart =  cancelEvent;
    suggestionBox.innerHTML = '';
    autoSuggestObject = new sack();
    var url = externalFile + '?type=' + type + '&name=' + inputObj.name + '&id=' + id + '&search=' + inputObj.value.replace(" ","+");
    autoSuggestObject.requestFile = url;	// Specifying which file to get
    autoSuggestObject.onCompletion = function() { showContent(inputObj); };	// Specify function that will be executed after file has been found
    autoSuggestObject.runAJAX();		// Execute AJAX function
  }

  function keyNavigation(e) {
    if (document.all) e = event;
		
    if (!suggestionBox) return;
    if (suggestionBox.style.display=='none') return;
		
    if (e.keyCode == 38) {	// Up arrow
      if (!suggestionBox_activeItem) return;
      if (suggestionBox_activeItem && !suggestionBox_activeItem.previousSibling) return;
      rollOverActiveItem(suggestionBox_activeItem.previousSibling,true);
    }
		
    if (e.keyCode == 40) {	// Down arrow
      if (!suggestionBox_activeItem) {
        rollOverActiveItem(suggestionBox_firstItem,true);
      }
      else {
        if (!suggestionBox_activeItem.nextSibling) return;
        rollOverActiveItem(suggestionBox_activeItem.nextSibling,true);
      }
    }
		
    if (e.keyCode == 13 || e.keyCode == 9) {	// Enter key or tab key
      if (suggestionBox_activeItem && suggestionBox_activeItem.className == 'optionDivSelected') setValue(false,suggestionBox_activeItem);
      if (e.keyCode == 13) return false; 
      else return true;
    }

    if (e.keyCode == 27) {	// Escape key
      hideSuggestionBox();			
    }
  }
	
  document.documentElement.onclick = autoHideList;
	
  function autoHideList(e) 	{
    if (document.all) e = event;
		
    if (e.target) source = e.target;
    else if (e.srcElement) source = e.srcElement;
    if (source.nodeType == 3) // defeat Safari bug
      source = source.parentNode;		
    if (source.tagName.toLowerCase() != 'input' && source.tagName.toLowerCase() != 'textarea') hideSuggestionBox();
  }