/**
*	SmartSuggest class performs ajax request to get suggestions according the user's inputs.
*/
function smartSuggestInput(searchBoxId, divId){

	/**
	*	Input box id for suggestion(user's input)
	*/
	var smartInputId = searchBoxId; //input id

	/**
	*	Div id - container for displaying the suggestions
	*/
	var suggestDivId = divId;

	/**
	*	Input box element for suggestion(user's input)
	*/
	var smartInput = null; // input element

	/**
	*	Div element - container for displaying the suggestions
	*/
	var divSuggest = null; // div element

	/**
	*	The suggest number, that currently active
	*/
	var currentSuggestNum = -1; // suggest number from suggest list

	/**
	*	User's string, that entered into the input box
	*/
	var userQuery = "";

	/**
	*	Ajax request object
	*/
	var smartSuggestReq = null;

	/**
	*	Indicator, that shows if the mouse over the div
	*/
	var inDiv = false;
	
	/**
	*	This function used onKeyUp events, performs managing different key presses
	*/
	this.manageKey = function(sEvent){
		if(!sEvent){
			var sEvent = window.event;
		}
		switch(sEvent.keyCode){
			case 13:   //Enter
				userQuery = "";
				removeSuggest();
				wcds.searchForText(0, smartInput.value);
				break;
			case 27: //Esc
				userQuery = "";
				removeSuggest();
				break;
			case 40: // down arrow
				moveDown();
				break;
			case 38: // up arrow
				moveUp();
				break;					
			default: //any other
				inDiv = false;
				currentSuggestNum = -1;
				if(smartInput.value == "" || smartInput.value == undefined || smartInput.value == null){
					userQuery = "";
					removeSuggest();
				} else {
					if(smartInput.value != userQuery){
						userQuery = smartInput.value;
						getSuggests(userQuery);
					}
				}
				break;
		}
		return true;
	}				
	
	/**
	*	Initialize smart suggest 
	*/
	this.initSmartSuggest = function(action){
		smartInput = document.getElementById(searchBoxId);
		divSuggest = document.getElementById(suggestDivId);
		smartSuggestReq = wcds.getLEajaxRequest(action);
		smartSuggestReq.setCallbackFunction(updateSuggest);
	}

	this.mouseOver = function(elem){
		elem.className = "query-smart-suggest-selected";	
	}
	
	this.mouseOut = function(elem){
		elem.className = "query-smart-suggest";
	}

	this.divMouseOver = function(){
		inDiv = true;	
	}
	
	this.divMouseOut = function(){
		inDiv = false;
	}
	
	this.click = function(elem){
		inDiv = false;
		smartInput.value = trim((elem.getElementsByTagName("span"))[0].innerHTML);
		divSuggest.style.visibility = "hidden";
		divSuggest.innerHTML = "";
		wcds.searchForText(0, smartInput.value);
	}

	this.focusOut = function(){
		if(!inDiv){
			divSuggest.style.visibility = "hidden";
			divSuggest.innerHTML = "";		
		}
	}
	
	function removeSuggest(){
		divSuggest.innerHTML = "";		
		divSuggest.style.visibility = "hidden";
	}
	
	function updateSuggest(){
		var result = smartSuggestReq.getResponseText();
		if(result != null && result.length > 0){
			divSuggest.innerHTML = result;		
			if(divSuggest.childNodes.length > 0){
				divSuggest.style.visibility = "visible";
			} else {
				divSuggest.style.visibility = "hidden";
			}
		} else {
			divSuggest.style.visibility = "hidden";
		}
	}

	function getSuggests(queryString){
		smartSuggestReq.addRequestCGI('prefix', queryString);
		smartSuggestReq.sendAJAXGETRequest();		
	}

	function moveDown(){
		var suggests = divSuggest.getElementsByTagName("td");
		if(suggests.length > 0){
			if(currentSuggestNum >= suggests.length - 1){
				smartInput.focus();
			} else if(currentSuggestNum == -1){
				currentSuggestNum++;
				suggests[currentSuggestNum].className = "query-smart-suggest-selected";
				var td = suggests[currentSuggestNum];
				var span = td.getElementsByTagName("span");
				smartInput.value = trim(span[0].innerHTML);
				smartInput.focus();
			} else {
				suggests[currentSuggestNum].className = "query-smart-suggest";
				currentSuggestNum++;
				suggests[currentSuggestNum].className = "query-smart-suggest-selected";		
				smartInput.value = trim(((suggests[currentSuggestNum]).getElementsByTagName("span"))[0].innerHTML);
				smartInput.focus();	
			}
		}
	}
		
	function moveUp(){
		var suggests = divSuggest.getElementsByTagName("td");
		if(currentSuggestNum == -1){
			smartInput.focus();
		} else if(currentSuggestNum == 0){
			suggests[currentSuggestNum].className = "query-smart-suggest";				
			currentSuggestNum--;
			smartInput.focus();
		} else {
			suggests[currentSuggestNum].className = "query-smart-suggest";
			currentSuggestNum--;
			suggests[currentSuggestNum].className = "query-smart-suggest-selected";		
			smartInput.value = trim(((suggests[currentSuggestNum]).getElementsByTagName("span"))[0].innerHTML);
			smartInput.focus();
		}
	}
	
	function trim(string) {
		if( string != undefined || string != "" || string != null){
			return string.replace(/^\s+|\s+$/g,"");
		} else {
			return "";
		}
	}
}

