/**
 * @author Ed Slocombe
 */

var ac_prevInputVal = "";
var ac_inputField;
var ac_suggestionDiv;
var ac_selectedSuggestion;
var ac_suggestBoxOpen = false;
var ac_suggestionsAvail = false;

function ac_start(evt, url, inputField, suggestionDiv) {
	
	if (!inputField.value || inputField.value.length < 3) {
		if (ac_suggestBoxOpen) ac_hide();
		return;
	}

	// If true, only up or down arrow keys were pressed,
	// then no need to change anything else	
	if (ac_suggestBoxOpen && ac_handleArrowKeys(evt)) return;
		
	// If the input hasn't been changed, no need to change suggestions	
	if (ac_prevInputVal == inputField.value) {
		if (!ac_suggestionsAvail) return;
		ac_suggestBoxOpen = true;
		document.getElementById(suggestionDiv).style.display = "block";
	} else {
		ac_selectedSuggestion = null;
		ac_prevInputVal = inputField.value;
		ac_inputField = inputField;
		ac_suggestionDiv = suggestionDiv;
		AJAX.call(url+"?data="+encodeURI(inputField.value), ac_handleResponse);
	}	
	
}

function ac_handleResponse(xmlData) {
	
	/* Expect data to be xml
	 * e.g.
	 * <results>
	 * 		<result id="1">An example</result>
	 * 		<result id="US">LA</result>
	 * </results>
	 */
	
	if (! xmlData) return false;
	
	var ac_suggestionObj = document.getElementById(ac_suggestionDiv);
	var results = xmlData.getElementsByTagName("result");
	
	var newHtml = "";
	
	for (var i = 0; i < results.length; i++) {
		
		if (results[i].nodeType == 1) {
			var show = results[i].firstChild.nodeValue.replace(/[<|>]/g, "");
			newHtml += "<div id=\"ac_opt_"+i+"\" class=\"ac_opt\"";
			newHtml += "onclick=\"ac_handleSuggestClk('"+show+"')\"";
			newHtml += "onmouseover=\"ac_setSelectedSug(this)\"";
			newHtml += ">"+show+"</div>"
		}

	}	
	
	if (newHtml != "") {
		ac_suggestBoxOpen = true;
		ac_suggestionObj.style.display = "block";
		ac_suggestionsAvail = true;
	} else {
		ac_suggestionObj.style.display = "none";
		ac_suggestionsAvail = false;
	} 
	
	ac_suggestionObj.innerHTML = newHtml;
	
}

function ac_hide() {
	if (!ac_suggestionDiv) return;
	ac_selectedSuggestion = null;
	ac_suggestBoxOpen = false;
	document.getElementById(ac_suggestionDiv).style.display = "none";
}

function ac_handleSuggestClk(clickedSuggestion) {
	ac_inputField.value = clickedSuggestion;
	ac_hide();
}

function ac_handleArrowKeys(evt) {
	
	evt = (evt)? evt : ((window.event)? event : null);
	if (!evt) return;
	
	switch (evt.keyCode) {
		case 40 : 
			// Move down to next suggestion 
			if (ac_selectedSuggestion) {
				var tmpNew = parseInt(ac_selectedSuggestion.substring(7, 9)) + 1;
				if (document.getElementById("ac_opt_"+tmpNew)) {
					ac_setSelectedSug(document.getElementById("ac_opt_"+tmpNew));
				}	
			} else {
				ac_setSelectedSug(document.getElementById("ac_opt_0"));
			}
			return true;
		case 38 : 
			// Move up to previous suggestion 
			if (ac_selectedSuggestion) {
				var tmpNew = parseInt(ac_selectedSuggestion.substring(7, 9)) - 1;
				if (document.getElementById("ac_opt_" + tmpNew)) {
					ac_setSelectedSug(document.getElementById("ac_opt_" + tmpNew));
				}
			}
			return true;
		case 13:
			// On enter - set input value to selected
			if (ac_selectedSuggestion) {
				ac_inputField.value = document.getElementById(ac_selectedSuggestion).innerHTML;
				ac_hide();
			}
			return true;			
	}
	
	return false;
	
}

function ac_setSelectedSug(newSelection) {
	if (!newSelection) return;
	if (ac_selectedSuggestion) ac_unsetSelectionSug();
	ac_selectedSuggestion = newSelection.id;
	newSelection.style.backgroundColor = "#006693"; 
	newSelection.style.color = "#FFFFFF"; 
}

function ac_unsetSelectionSug() {
	var oldSelection = document.getElementById(ac_selectedSuggestion);
	oldSelection.style.backgroundColor = "#FFFFFF"; 
	oldSelection.style.color = "#666666"; 
}

