var getSuggestUrl = "../suggest.php?q=";
var bolShowError = false;
var httpReqKW = "";
var lastKW = "";
var intSuggest = 0;
var isKeyUpDownPressed = false;
var autoCompleteKW = "";
var hasResults = false;
var timeoutId = -1;
var position = -1;
var objCache = new Object();
var intShowColum = 10;
var debugMode = true;
var xmlHttp = createXmlHttpRequestObject();
window.onload = init;

function createXmlHttpRequestObject()
{
	var xmlHttp;
	
	if(window.ActiveXObject){
		try{
			xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e){
			xmlHttp = false;
		}
	} else {
		try{
			xmlHttp = new XMLHttpRequest();
		} catch (e){
			xmlHttp = false;
		}
	}

	if(!xmlHttp){
		return false;
	} else {
		return xmlHttp;
	}
}

function init()
{
	var objKW = document.getElementById("q");
	objKW.setAttribute("autocomplete", "off");
	//objKW.value = "";
	objKW.focus();
}

function addToCache(kw, values)
{	
	objCache[kw] = new Array();
	for (i = 0; i < values.length; i++){
		objCache[kw][i] = values[i];
	}
}

function checkCache(kw)
{
	if (objCache[kw]){
		return true;
	}
	return false;
}


function getSuggestions(kw)
{
	if (kw == ""){
		hideSuggestions();
		return;
	}
	
	if (kw != "" && !isKeyUpDownPressed){
		isInCache = checkCache(kw);
		
		if (isInCache == true){
			httpReqKW = kw;
			lastKW = kw;
			displayResults(kw, objCache[kw]);
		} else {
			if (xmlHttp){
				try{
					if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0){
						httpReqKW = kw;
						lastKW = kw;
						xmlHttp.open("GET", getSuggestUrl + kw, true);
						xmlHttp.onreadystatechange = handleGettingSuggestions;
						xmlHttp.send(null);
					} else {
						lastKW = kw;
						if (timeoutId != -1){
							clearTimeOut(timeoutId);
							timeoutId = setTimeout("getSuggestions(" + kw + ")", 500);
						}
					}
				} catch (e){
					displayError("cannot connect to server\n" + e.toString());
				}
			}
		}
	}
}

function handleGettingSuggestions()
{
	if (xmlHttp.readyState == 4){
		if (xmlHttp.status == 200){
			try{
				updateSuggestions();
			} catch(e){
				displayError("error in handleGettingSuggestions\n" + e.toString());
			}
		} else {
			displayError("error in handleGettingSuggestions\n" + xmlHttp.statusText);
		}
	}
}

function updateSuggestions()
{
	var response = xmlHttp.responseText;
	//alert(response);
	eval(response);
	if (httpReqKW == lastKW){
		displayResults(httpReqKW, arr);
	} else {
		addToCache(httpReqKW, arr);
	}
}

function displayResults(kw, arrResults)
{
	if (!objCache[kw] && kw){
		addToCache(kw, arrResults);
	}
	if (arrResults.length == 0){
		hasResults = false;
		intSuggest = 0;
		hideSuggestions();
		return;
	}
	var div = "<table>";
	postion = -1;
	isKeyUpDownPressed = false;
	hasResults = true;
	intSuggest = objCache[kw].length / 2 ;
	for (var i = 0; i < intSuggest; i++){
		div += "<tr id='tr" + i + "' onmouseover='handleOnMouserOver(this)' onmouseout='handleOnMouseOut(this)' onclick='handleOnScrollClick(this)'><td>" + arrResults[2*i] + "</td>";
		div += "<td align='right'>" + arrResults[2*i+1] + "</td></tr>";
	}
	div += "</table>";;
	var objSuggest = document.getElementById("suggest");
	var objScroll = document.getElementById("scroll");
	objScroll.scrollTop = 0;
	objSuggest.innerHTML = div;
	objScroll.style.visibility = "visible";
}

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 >32 && code < 46 && code != 38 && code != 40) || (code >= 112 && code <= 123)){
		} else if (code == 40){//down arrow
			if (position >= 0 && position <= intSuggest -1){
				oldTR = document.getElementById("tr" + position);
				oldTR.className = '';
			}
			if (position < intSuggest -1){
				newTR = document.getElementById("tr" + (++position));
				newTR.className = 'highlightrow';
				updateKeywordValue(newTR.childNodes[0].innerHTML);
			} else if (position == intSuggest -1){
				position = -1;
				updateKeywordValue(httpReqKW);
			}
			updateScrollTop();
			e.cancelBubble = true;
			e.returnValue = false;
			isKeyUpDownPressed = true;
		} else if (code == 38){	//up arrow
			if (position != -1){
				oldTR = document.getElementById("tr" + position);
				oldTR.className = '';
			}
			if (position > 0){
				newTR = document.getElementById("tr" + (--position));
				newTR.className = 'highlightrow';
				updateKeywordValue(newTR.childNodes[0].innerHTML);
			} else if (position == 0){
				updateKeywordValue(httpReqKW);
				position --;
			} else if (position == -1){
				position = intSuggest -1;
				newTR = document.getElementById("tr" + position);
				newTR.className = 'highlightrow';
				updateKeywordValue(newTR.childNodes[0].innerHTML);
			}
			e.cancelBubble = true;
			e.returnValue = false;
			isKeyUpDownPressed = true;
			updateScrollTop();
		} else{
			position = -1;
			var oKeyword = document.getElementById('q');
			getSuggestions(oKeyword.value);
		}
	}
}

function updateScrollTop()
{
	if (intSuggest <= intShowColum){
		return;
	}
	objScroll = document.getElementById('scroll');
	if(position < intShowColum - 1){
		objScroll.scrollTop = 0;
	} else {
		objScroll.scrollTop = 10 * (position - intShowColum + 2);
	}
}

function updateKeywordValue(kwValue)
{
	var oKeyword = document.getElementById('q');
	oKeyword.value = trim(kwValue);
}

function deselectAll()
{
	for (i=0; i < intSuggest; i++){
		var oCrtTr = document.getElementById("tr" + i);
		oCrtTr.className = "";
	}
}

function handleOnMouserOver(oTr)
{
	deselectAll();
	oTr.className = "highlightrow";
	position = oTr.id.substring(2, oTr.id.lenth);
}

function handleOnMouseOut(oTr)
{
	oTr.className = "";
	position = -1;
}

function handleOnScrollClick(oTr)
{
	updateKeywordValue(oTr.childNodes[0].innerHTML);
}

function hideSuggestions()
{	
	var objScroll = document.getElementById("scroll");
	objScroll.style.visibility = "hidden";
}

function displayError(msg)
{
	if (bolShowError){
		alert("connect to server error!" + (debugMode ? "\n" + msg : ""));
	}
}  

function ltrim(str)
{
	return str.replace(/(^\s+)/, '');
}

function rtrim(str)
{
	return str.replace(/(\s+$)/, '');
}

function trim(str)
{
	return rtrim(ltrim(str));
}

