var ajaxReq = getXmlHttpRequestObject();
var selectedElement = -1;
var elementsInList = 0;
var lastSuggestion = 0;

function getSelectedElement() {
	return selectedElement;
}

function searchSuggest(event,searchSuggest,searchValue,ajaxCall,setSearchCall,searchSuggestCall,query) {
	if(searchSuggestKeyRecognition(event,searchSuggest, setSearchCall, searchValue) == 0) {
		elementsInList = 0;
		selectedElement = -1;
		var valueInput = document.getElementById(searchValue);
		if (valueInput == null)
			return; 
		lastSuggestion = valueInput.value.length;	
		if (ajaxReq.readyState == 4 || ajaxReq.readyState == 0) {
			ajaxReq.open('GET', ajaxCall, true);
			ajaxReq.onreadystatechange = function handler() {
				if (ajaxReq.readyState == 4 && ajaxReq.responseText != '') {
					handleSearchSuggest(searchSuggest,searchValue,setSearchCall,searchSuggestCall,query);
				}
			}
			ajaxReq.send(null);
		}
	}
}

function handleSearchSuggest(searchSuggest,searchValue,setSearchCall,searchSuggestCall,query) {
	
	var ss = document.getElementById(searchSuggest);
	var browser=navigator.appName;
	ss.innerHTML = '';
	var str = ajaxReq.responseText.split("\n");
	if(str.length - 1 > 0) {
		ss.style.borderWidth='1px';
	}
	var suggest;
	var moused = true;
	for(i=0; i < str.length -1; i++) {
		var suggestion = str[i];
		if ((suggestion.indexOf('results not displayed') < 0) && (suggestion.indexOf('No results found') < 0)){
			suggest = '<div onmouseover="javascript:suggestOver(this,\'' + searchValue + '\',' + moused + ');selectedElement=this.id;" ';
			suggest += 'onmouseout="javascript:suggestOut(this);" ';
			suggest += 'onclick="javascript:' + setSearchCall + '(this.innerHTML,event,\'' + searchValue + '\',\'' + searchSuggest + '\');"';
			suggest += 'class="suggest_link" id='+ elementsInList +'>' + suggestion + '</div>';
			ss.innerHTML += suggest;
			elementsInList++;
		}else {			
			suggest = '<div ';
			suggest += 'class="suggest_link_more">' + suggestion + '</div>';
			ss.innerHTML += suggest;					
		}
	}	
	
	if (lastSuggestion != (query.length))
		{
			 eval(searchSuggestCall + '(\'' + '\')');
		}
}

function putSuggestionInTextBox(value, searchBox) {
	value = removeXMLTags(value);
	value = trim(value);		
	document.getElementById(searchBox).value = value;	
}

function removeXMLTags(text) {
 	var retVal = text.replace(/(<([^>]+)>)/ig,""); 	 	
	return retVal;
}

//Mouse over function
function suggestOver(div_value,searchValue,moused) {
	var clearDiv = document.getElementById(selectedElement);										
	suggestOut(clearDiv);			
	if (div_value != null)
	{
		div_value.className = 'suggest_link_over';			
	}
	
	//This check is added so that if the users mouse is 
	//over the area where the suggestion box will appear
	//it doesn't take first suggestion that appears under
	//the users mouse and requery on that value... again
	//this is consistent with the behavior of google's box
	if ((moused != null) && (!(moused)))
		putSuggestionInTextBox(div_value.innerHTML,searchValue);
}

//Mouse out function
function suggestOut(div_value) {
	if (div_value != null){
		div_value.className = 'suggest_link';			
	}
}

function searchSuggestKeyRecognition(e,search_suggest, setSearchCall,searchValue) {
	if (e.keyCode == 27)
			{
				closeSearchSuggest(search_suggest);
				return 1;
			}
		else if (e.keyCode == 13)
			{
				var thisDiv;
				if(selectedElement > -1) {
					thisDiv = document.getElementById(selectedElement).innerHTML;
				}
				else {
					var searchBox = document.getElementById(searchValue);
					thisDiv = searchBox.value;
				}
				
				eval(setSearchCall + '(\'' + thisDiv + '\',e,\'' + searchValue + '\',\'' + search_suggest + '\')');
				
				return 1;
			}
		else if ((e.keyCode == 37) || (e.keyCode == 38))
			{
				if ((selectedElement < 0) && (elementsInList > 0))
				{
					var myDiv = document.getElementById((elementsInList - 1));					
					selectedElement = (elementsInList - 1);
					suggestOver(myDiv,searchValue,false);
				}
				else if ((selectedElement >= 0) && (elementsInList > 0))
				{
					var myUpOldDiv = document.getElementById(selectedElement);										
					suggestOut(myUpOldDiv);
					selectedElement = (parseInt(selectedElement) - 1);
					if (selectedElement < 0)
					{
						selectedElement = (elementsInList - 1);
					}
					
					var myUpNewDiv = document.getElementById(selectedElement);					
					suggestOver(myUpNewDiv,searchValue,false);
				}
				return 1;				
			}
		else if ((e.keyCode == 39) || (e.keyCode == 40))
			{
				if ((selectedElement < 0) && (elementsInList > 0))
				{
					var myDiv = document.getElementById(0);
					selectedElement = 0;					
					suggestOver(myDiv,searchValue,false);
				}
				else if ((selectedElement >= 0) && (elementsInList > 0))
				{
					var myDownOldDiv = document.getElementById(selectedElement);										
					suggestOut(myDownOldDiv);					
					selectedElement = (parseInt(selectedElement) + 1);
					if (selectedElement >= elementsInList)
						{selectedElement = 0;
					}
					var myDownNewDiv = document.getElementById(selectedElement);					
					suggestOver(myDownNewDiv,searchValue,false);
				}
				return 1;								
			}
			else {
				return 0;
			}
}

function RemoveSuggestionHtmlTags(suggestion) {
	var cleanedTerm;
	
	if(suggestion != null) {
		cleanedTerm = removeSubstring(suggestion,"<b>");
		cleanedTerm = removeSubstring(cleanedTerm,"</b>");
		cleanedTerm = removeSubstring(cleanedTerm,'<span .+?>');
		cleanedTerm = removeSubstring(cleanedTerm,"</span>");
		cleanedTerm = removeSubstring(cleanedTerm,"<input .+?>");
		
		var synIndex = cleanedTerm.indexOf('[');
		if(synIndex != -1){
			cleanedTerm = cleanedTerm.substring(0,synIndex);
		}
		
		cleanedTerm = trim(cleanedTerm);
	}
	
	return cleanedTerm;
}

function FetchHiddenTagValue(suggestion) {
	var hiddenTagValue;
	
	var regExpHiddenTag = new RegExp("<input.*type=\"{0,1}hidden\"{0,1}.*>",'im');
	
	if(suggestion.match(regExpHiddenTag)) {
		var regExHiddenTagValue = new RegExp("<input.*value=\"{0,1}([0-9]+)\"{0,1}.*>",'im');
		var matches;
		
		if(matches = suggestion.match(regExHiddenTagValue)) {
			hiddenTagValue = matches[1];
		}
	}
	
	return hiddenTagValue;
}

function closeSearchSuggest(divId){
	var divBox = document.getElementById(divId);		
	if (divBox != null) {
		divBox.innerHTML = '';
		//divBox.setAttribute("style", "");
		divBox.style.borderWidth='0px';
		var browser=navigator.appName;
		if (browser == 'Microsoft Internet Explorer') {
			divBox.style.setAttribute('cssText', styleOff, 0);
		}
	}				
}
