var keyword_min_lenght=2;
var httpRequestKeyword = "";
var userKeyword = "";
var suggestions = 0;
var suggestionMaxLength = 30;
var isKeyUpDownPressed = false;
var autocompletedKeyword = "";
var hasResults = false;
var timeoutId = -1;
var position = -1;
var oCache = new Object();
var urlCache = new Object();
var modelCache = new Object();
var minVisiblePosition = 0;
var maxVisiblePosition = 5;
var xmlHttpGetSuggestions = createXmlHttpRequestObject();

function createXmlHttpRequestObject() 
{
	var xmlHttp;
	try{xmlHttp = new XMLHttpRequest();}
	catch(e)
	{
		var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.3.0");
		for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) 
		{
			try {xmlHttp = new ActiveXObject(XmlHttpVersions[i]);} 
			catch (e) {}
		}
	}
	if (!xmlHttp) alert("Error creating the XMLHttpRequest object.");
	else return xmlHttp;
}

function init() 
{  
	var oKeyword = document.getElementById(field_for_suggest);    
	oKeyword.setAttribute("autocomplete", "off");  
	setTimeout("checkForChanges()", 300);
} 

function addToCache(keyword, values, urls, models)
{
	oCache[keyword] = new Array();
	urlCache[keyword] = new Array();
	modelCache[keyword] = new Array();
	for(i=0; i<values.length; i++)
	{
		oCache[keyword][i] = values[i];
		urlCache[keyword][i] = urls[i];
		modelCache[keyword][i] = models[i];
	}
}

function checkCache(keyword)
{
	if(oCache[keyword])return true;
	else return false;
}

function getSuggestions(keyword) 
{  
	if(keyword != "" && !isKeyUpDownPressed)
	{
		isInCache = checkCache(keyword);
		if(isInCache == true)          
		{     
			httpRequestKeyword=keyword;
			userKeyword=keyword;     
			displayResults(keyword, oCache[keyword], urlCache[keyword], modelCache[keyword]);                          
		}
		else    
		{    
			if(xmlHttpGetSuggestions)
			{ 
				try
				{
					if (xmlHttpGetSuggestions.readyState == 4 || xmlHttpGetSuggestions.readyState == 0) 
					{    
						httpRequestKeyword = keyword;
						userKeyword = keyword;
						xmlHttpGetSuggestions.open("GET",getFunctionsUrl + encodeURIComponent(keyword), true);
						xmlHttpGetSuggestions.onreadystatechange = handleGettingSuggestions; 
						xmlHttpGetSuggestions.send(null);
					}
					else
					{
						userKeyword = keyword;
						if(timeoutId != -1) clearTimeout(timeoutId);          
						timeoutId = setTimeout("getSuggestions(userKeyword);", 300);
					}
				}
				catch(e){}
			}
		}    
	}
}

function xmlToArray(resultsXml)
{
	var resultsArray= new Array();  
	for(i=0;i<resultsXml.length;i++) resultsArray[i]= resultsXml.item(i).firstChild.data;
	return resultsArray;
}

function handleGettingSuggestions() 
{
	if (xmlHttpGetSuggestions.readyState == 4) 
	{
		if (xmlHttpGetSuggestions.status == 200) 
    	{ 
			try{updateSuggestions();}
			catch(e){}  
		} 
	}
}

function updateSuggestions()
{
	var response = xmlHttpGetSuggestions.responseText;
	if (response.indexOf("ERRNO") >= 0 || response.indexOf("error:") >= 0 || response.length == 0) throw(response.length == 0 ? "Void server response." : response);
	response = xmlHttpGetSuggestions.responseXML.documentElement;

	nameArray = new Array();
	urlArray = new Array();
	modelArray = new Array();

	if(response.childNodes.length)
	{
		nameArray= xmlToArray(response.getElementsByTagName("name"));
		modelArray= xmlToArray(response.getElementsByTagName("model"));
		urlArray= xmlToArray(response.getElementsByTagName("url"));              
	}

	if(httpRequestKeyword == userKeyword){displayResults(httpRequestKeyword, nameArray, urlArray, modelArray);}
	else{addToCache(httpRequestKeyword, nameArray, urlArray, modelArray);}
}

function displayResults(keyword, results_array, url_array, modelArray) 
{  
	var keyword_start_pos = 0;
	var keyword_length = keyword.length;
	var div = "<table style='width:224px;'>"; 

	if(!oCache[keyword] && keyword) {addToCache(keyword, results_array, url_array, modelArray);}
	if(results_array.length == 0)
	{
//		div += "<tr><td><strong>" + keyword + "</strong>" + box_search_js_noresults + "</td></tr>";
		hasResults = false;
		suggestions = 0;
		hideSuggestions();
	}
	else
	{
		position = -1;
		isKeyUpDownPressed = false;
		hasResults = true;
		suggestions = oCache[keyword].length;
		
		for (var i=0; i<oCache[keyword].length; i++) 
		{  
			crtFunction = oCache[keyword][i];
			url = urlCache[keyword][i];
			model = modelCache[keyword][i];
			crtFunctionLink = crtFunction;
			crtFunctionLink = crtFunctionLink.toLowerCase();
			
			while(crtFunctionLink.indexOf("_") !=-1) crtFunctionLink = crtFunctionLink.replace("_","-");

div += "<tr id='tr" + i + 
"' onclick='location.href=document.getElementById(\"a" + i + 
"\").href;' onmouseover='handleOnMouseOver(this);' " + 
"onmouseout='handleOnMouseOut(this);'>" + 
"<td align='left'><a class='suggest_link' title='"+crtFunction+" ("+model+")' id='a" + i + 
"' href='" + url /*phpHelpUrl + crtFunctionLink*/;
   
			keyword_start_pos=crtFunctionLink.indexOf(keyword.toLowerCase()); 
			
			if (keyword_start_pos>-1)
			{
				var suggestionMaxLength2=suggestionMaxLength;
				if (suggestionMaxLength<(keyword_start_pos+keyword_length))suggestionMaxLength2=keyword_start_pos+keyword_length;
div += "'>" + crtFunction.substring(0,keyword_start_pos) +
"<b>" + crtFunction.substring(keyword_start_pos,keyword_start_pos+keyword_length) + "</b>" + 
crtFunction.substring(keyword_start_pos+keyword_length,suggestionMaxLength2) + " <b>(" + model + ")</b>" + "</td></tr>"   
			}
			else
			{
div += "'>" + crtFunction.substring(0,suggestionMaxLength) + " <b>(" + model + ")</b>" + "</td></tr>"   
			}
		}
	}
	div += "</table>";
	
	var oSuggest = document.getElementById(field_Suggest);
	var oScroll = document.getElementById(field_Scroll);
	oScroll.scrollTop = 0;
	oSuggest.innerHTML = div;
	if (suggestions>0) oScroll.style.visibility = "visible";
}

function checkForChanges()
{
	var keyword = document.getElementById(field_for_suggest).value;
	var keyword_length = keyword.length;
	if(keyword_length<keyword_min_lenght+1)
	{
		hideSuggestions();
		userKeyword="";
		httpRequestKeyword="";
	}
	setTimeout("checkForChanges()", 300);
	if((userKeyword != keyword) && (autocompletedKeyword != keyword) && (!isKeyUpDownPressed)&& keyword_length>keyword_min_lenght)
	getSuggestions(keyword);
}

function handleKeyUp(e) 
{
	
	e = (!e) ? window.event : e;
	target = (!e.target) ? e.srcElement : e.target;
	if (target.nodeType == 3) 
	target = target.parentNode;
	code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : ((e.which) ? e.which : 0));
	
	if (e.type == "keyup") 
	{    
		isKeyUpDownPressed =false; 
		if ((code < 13 && code != 8) || 
		(code >=14 && code < 32) || 
		(code >= 33 && code <= 46 && code != 38 && code != 40) || 
		(code >= 112 && code <= 123)){}
		else
    	if(code == 13){}        
		else
		if(code == 40)
		{                   
			newTR=document.getElementById("tr"+(++position));
			oldTR=document.getElementById("tr"+(--position));

			if(position>=0 && position<suggestions-1) oldTR.className = "";
 
 			if(position < suggestions - 1)
			{
				newTR.className = "moduleRowOver";
				position++; 
				form_with_suggest.action = document.getElementById("a" + position).href;        
			}     
			e.cancelBubble = true;
			e.returnValue = false;
			isKeyUpDownPressed = true;        

			if(position > maxVisiblePosition)
			{   
				oScroll = document.getElementById(field_Scroll);
				oScroll.scrollTop += 18;
				maxVisiblePosition += 1;
				minVisiblePosition += 1;
			}
		}
		else
		if(code == 38)
		{
			newTR=document.getElementById("tr"+(--position));
			oldTR=document.getElementById("tr"+(++position));

			if(position>=0 && position <= suggestions - 1){oldTR.className = "";}

			if(position > 0)
			{
				newTR.className = "moduleRowOver";
				position--;
				if(position<minVisiblePosition)
				{
					oScroll = document.getElementById(field_Scroll);
					oScroll.scrollTop -= 18;
					maxVisiblePosition -= 1;
					minVisiblePosition -= 1;
				}
				form_with_suggest.action = document.getElementById("a" + position).href;
			}     
			else
			if(position == 0)
			{
				position--;
				form_with_suggest.action = phpHelpUrl+userKeyword;
			}
			e.cancelBubble = true;
			e.returnValue = false;
			isKeyUpDownPressed = true; 
		}
		else
		{form_with_suggest.action = phpHelpUrl+userKeyword;}    
	}
	
}


function deselectAll()
{ 
	for(i=0; i<suggestions; i++)
	{
		var oCrtTr = document.getElementById("tr" + i);
		oCrtTr.className = "";    
	}
}


function handleOnMouseOver(oTr)
{
	deselectAll();  
	oTr.className = "moduleRowOver";  
	position = oTr.id.substring(2, oTr.id.length);
}


function handleOnMouseOut(oTr)
{
	oTr.className = "";   
	position = -1;
}


function hideSuggestions()
{
	var oScroll = document.getElementById(field_Scroll);
	oScroll.style.visibility = "hidden";
	form_with_suggest.action = phpHelpUrl+userKeyword;
}


function Blur()
{
	setTimeout("hideSuggestions()",1000);
}

