/**
 * Suggestions combo-box methods.
 * Copyright 2007 by Hallwyl Software Engineering.
 * http://www.hse.dk/
 */

/** A global variable is need to pass elementid to respose handler. */
var currentSuggestionElementId = null;
var cuurentContainer = null;
var currentOptions = null;

var suggestionsTimeout = true;

function log(message) {
  var log = document.getElementById("log");
  if (log)
    log.value = log.value + message + "\n";
}
 
function enableSuggestions(elementId, searchMethod) {
   
  var element = document.getElementById(elementId);
  currentSuggestionElementId = elementId;
  
  var position;
  position = getPosition(element);
  position[1] = position[1] + 17;
  var container = document.createElement("div");
  currentContainer = container;
  container.id = elementId + "suggestionscontainer";
  container.style.position = "absolute";
  container.style.left = position[0] +"px";
  container.style.top = position[1] + "px";
  container.style.padding = 0;
  container.x = 300;
  container.y = 300;
  container.style.width = element.style.width;
  container.style.height = "150px";
  container.style.visibility = "hidden";
  
  var options = document.createElement("select");
  currentOptions = options;
  options.id = elementId + "suggestionsoptions";
  options.multiple = true;
  options.size = 5;
  options.style.width = container.style.width;
  options.style.height = container.style.height;
  
  if(element.value.length > 4) {
  	container.style.visibility = "visible";
  }
  
  // onchange is only used when focus is on options, which only happens when mouse is used to select
  options.onchange = function() { 
    element.value = options.value; 
    element.focus(); 
    container.style.visibility = "hidden";
  };
  
  // options onblur makes no sense, sice it is only focused on a mouse click, which will hide the container in options.onchange
  //options.onblur = function() { log("options.onblur"); };

  document.getElementsByTagName("body")[0].appendChild(container);
  document.getElementById(elementId + "suggestionscontainer").appendChild(options);


  element.setAttribute("autocomplete","off");
  element.onfocus = function () { currentSuggestionElementId = element.id; suggestionsTimeout = true; };
  
  /* you cannot use onblur because a mouse click on options will blur element */
  //element.onblur = function() { log('element.onblur');  };
  
  element.onkeyup = function (event) {
    if (!event) var event = window.event;
      
    if (element.value.length < 4) {
      container.style.visibility = "hidden";
      return;
    }
    
    // Arrow down
    if(event.keyCode == 38) {
      selectUp(options);
      return;
    }

    // Arrow up
    if(event.keyCode == 40) {
      selectDown(options);
      return;
    }
    
    // Enter selects the selected suggestion
    
    if(event.keyCode == 13) {
      if (options.value.length != 0)
        element.value = options.value;
      container.style.visibility = "hidden";
      return;      
    }

    if (suggestionsTimeout) {
      window.setTimeout("suggestionsTimeout = true;", 1000);
      suggestionsTimeout = false;
      searchMethod(element.value);
    }
  };
    
}
      
function disableSuggestions(elementId, searchMethod) {
  var element = document.getElementById(elementId);
  element.onkeyup = null;
  element.onblur = null;
  element.onfocus = function() { enableSuggestions(elementId, searchMethod); };
  document.getElementsByTagName("body")[0].removeChild(document.getElementById(elementId + "suggestionscontainer"));
}
    
function suggestionsResponseHandler(xml) {
  var container = document.getElementById(currentSuggestionElementId + "suggestionscontainer");
  var select = document.getElementById(currentSuggestionElementId + "suggestionsoptions");
  var options = xml.getElementsByTagName("option");

  if (options.length == 0) {
    container.style.visibility = "hidden";
    return;
  } else {
    container.style.visibility = "visible";
  }
        
  var length = select.length;
  for (var i = length - 1; i >= 0; i--) {
    select.remove(i);
  }
        
  var option;
  for (var i = 0; i < options.length; i++) {
    option = document.createElement('option');
    option.text = options[i].firstChild.nodeValue;
    option.value = options[i].firstChild.nodeValue;
    
    try {
      select.add(option, null); // standards compliant
    } catch(ex) {
      select.add(option); // IE only
    }
    
  }
}

/**
 * Select the next (down) from the already selected.
 * If none is selected the first will be selected.
 */
function selectDown(select) {
  
  var selected = -1;
  for (var i = 0; i < select.length; i++) {
    if (select.options[i].selected == true) {
      select.options[i].selected = false;
      if (i != select.length -1)       
        select.options[i + 1].selected = true;
      return;
    }
  }
  select.options[0].selected = true;
}

/**
 * Select the previous (up) from the already selected.
 * If none is selected the first will be selected.
 */
function selectUp(select){

  var selected = -1;
  for (var i = 0; i < select.length; i++) {
    if (select.options[i].selected == true) {
      select.options[i].selected = false;
      if (i != 0)
        select.options[i - 1].selected = true;
      return;
    }
  }
  select.options[0].selected = true;
}

/**
 * Returns the absolute position of an element.
 */
function getPosition(element) {
 	
	var left = 0;
	var top = 0;
	if (element.offsetParent) {
		left = element.offsetLeft
		top = element.offsetTop
		while (element = element.offsetParent) {
			left += element.offsetLeft
			top += element.offsetTop
		}
	}
	return [left,top];
	
}


function fieldBlur(elementId) {
	
	var e = document.getElementById(currentSuggestionElementId);
	if(currentOptions.value != "") {
		e.value = currentOptions.value;
	}
	currentContainer.style.visibility = "hidden";
	
}
