﻿
var u = 60, I = "";
var gInputQuery = null, gBtnSearch = null;
var gInputQueryFocused = false, gInputQueryBlured = false, gInputQueryValue = null, gInputQueryKeycode = "";
var gKeyword = "", gKeywordPre = "", gKeywordToDisplayCompStrings = "";
var gCompDiv = null, gCompIFrame = null;
var gCompDivBorderLeftWidth = 1, gCompDivBorderTopWidth = 1;
var gCompleteStrings = {};
var gNotResponsedResquestNum = 0;
var gTimerHideCompDiv = null;
var gDivTagName = "div";
var gSpanTagName = "span";
var gCompStringDivNum = 5;
var gCompStringDivNumber = -1;
var gCompStringDivs = null;
var gSelectedCompStringDiv = null, gSelectedCompStringDivIndex = -1;
var gSelectionValue = null, gSelectionStart = null, gSelectionLength = null;
var gMousePositionX = -1, gMousePositionY = -1;
var gDocumentKeycode = -1;
var gSubmitting = false;
var gTimeFactor = 1;
var gRadioHits="checked", gRadioApha="", gRadioStart="checked", gRadioAnywhere="";
var gOrderFlag=1, gLikeFlag=1;
function JSONscriptRequest(fullUrl) {
	this.fullUrl = fullUrl;
	this.noCacheIE = "&noCacheIE=" + (new Date()).getTime();
	this.headLoc = document.getElementsByTagName("head").item(0);
	this.scriptId = "JscriptId" + JSONscriptRequest.scriptCounter++;
}
JSONscriptRequest.scriptCounter = 1;
JSONscriptRequest.prototype.buildScriptTag = function () {
	this.scriptObj = document.createElement("script");
	this.scriptObj.setAttribute("type", "text/javascript");
	this.scriptObj.setAttribute("src", this.fullUrl);
};
JSONscriptRequest.prototype.removeScriptTag = function () {
	this.headLoc.removeChild(this.scriptObj);
};
JSONscriptRequest.prototype.addScriptTag = function () {
	this.headLoc.appendChild(this.scriptObj);
};
function addCompleteStrings(keyword, completeStrings, displayStrings) {
	gCompleteStrings[keyword] = new Array(completeStrings, displayStrings);
}
setupAC = function (inputQuery, btnSearch) {
	gInputQuery = inputQuery;
	gBtnSearch = btnSearch;
	initAC();
};
function initAC() {
	gInputQuery.autocomplete = "off";
	gInputQuery.onblur = inputQueryOnblur;
	gInputQuery.onfocus = inputQueryOnfocus;
	if (gInputQuery.createTextRange) {
		gInputQuery.onkeyup = new Function("return inputQueryOnkeyup(event); ");
	} else {
		gInputQuery.onkeyup = inputQueryOnkeyup;
	}
	gInputQuery.onsubmit = inputQueryOnsubmit;
	gKeyword = gInputQuery.value;
	gKeywordPre = gKeyword;
	gCompDiv = document.createElement("DIV");
	gCompDiv.id = "completeDiv";
	gCompDivBorderLeftWidth = 1;
	gCompDivBorderTopWidth = 1;
	gCompDiv.style.borderRight = "black " + gCompDivBorderLeftWidth + "px solid";
	gCompDiv.style.borderLeft = "black " + gCompDivBorderLeftWidth + "px solid";
	gCompDiv.style.borderTop = "black " + gCompDivBorderTopWidth + "px solid";
	gCompDiv.style.borderBottom = "black " + gCompDivBorderTopWidth + "px solid";
	gCompDiv.style.zIndex = "202";
	gCompDiv.style.paddingRight = "0";
	gCompDiv.style.paddingLeft = "0";
	gCompDiv.style.paddingTop = "0";
	gCompDiv.style.paddingBottom = "0";
	gCompDiv.style.visibility = "hidden";
	gCompDiv.style.position = "absolute";
	gCompDiv.style.backgroundColor = "white";
	gCompIFrame = document.createElement("IFRAME");
	gCompIFrame.id = "completeIFrame";
	gCompIFrame.style.zIndex = "201";
	gCompIFrame.style.position = "absolute";
	gCompIFrame.style.display = "block";
	gCompIFrame.style.visibility = "hidden";
	gCompIFrame.style.borderRightWidth = "0";
	gCompIFrame.style.borderLeftWidth = "0";
	gCompIFrame.style.borderTopWidth = "0";
	gCompIFrame.style.borderBottomWidth = "0";
	setCompDivPosition();
	document.body.appendChild(gCompDiv);
	document.body.appendChild(gCompIFrame);
	addCompleteStrings("", [], []);
	ua();
	setStyle(gCompDiv, "mAutoComplete");
	window.onresize = windowOnresize;
	document.onkeydown = documentOnkeydown;
	gb();
	setTimeout("inputQueryValueChange()", 10 * gTimeFactor);
	var flag1 = readCookie("Order");
	var flag2 = readCookie("Like");
	if(flag1!="")
	{
	    gOrderFlag = flag1;
	}
	if(flag2!="")
	{
	    gLikeFlag = flag2;
	}
	
	InitRadioChecked();
}
function inputQueryTemporaryBlur() {
	gInputQueryBlured = true;
	gInputQuery.blur();
	setTimeout("inputQueryFocus();", 10 * gTimeFactor);
}
function gb() {
	if (document.createEventObject) {
		var a = document.createEventObject();
		a.ctrlKey = true;
		a.keyCode = 70;
		document.fireEvent("onkeydown", a);
	}
}
function documentOnkeydown(keydownEvent) {
	if (!keydownEvent && window.event) {
		keydownEvent = window.event;
	}
	if (keydownEvent) {
		gDocumentKeycode = keydownEvent.keyCode;
	}
	if (keydownEvent && keydownEvent.keyCode == 8) {
	}
}
function windowOnresize() {
	setCompDivPosition();
}
function setCompDivPosition() {
	if (gCompDiv) {
		gCompDiv.style.left = absoluteLocation(gInputQuery, "offsetLeft") + "px";
		gCompDiv.style.top = absoluteLocation(gInputQuery, "offsetTop") + gInputQuery.offsetHeight - 1 + "px";
		gCompDiv.style.width = adjustOffsetWidth() + "px";
		if (gCompIFrame) {
			gCompIFrame.style.left = gCompDiv.style.left;
			gCompIFrame.style.top = gCompDiv.style.top;
			gCompIFrame.style.width = gCompDiv.style.width;
			gCompIFrame.style.height = gCompDiv.style.height;
		}
	}
}
function adjustOffsetWidth() {
	return gInputQuery.offsetWidth - gCompDivBorderLeftWidth * 2;
}
function inputQueryOnfocus(a) {
	gInputQueryFocused = true;
}
function inputQueryOnblur(blurEvent) {
	gInputQueryFocused = false;
	if (!blurEvent && window.event) {
		blurEvent = window.event;
	}
	if (!gInputQueryBlured) {
		hideCompleteDiv();
		if (gDocumentKeycode == 9) {
			gBtnSearch.focus();
			gDocumentKeycode = -1;
		}
	}
	gInputQueryBlured = false;
}
inputQueryOnkeyup = function (keyEvent) {
	gInputQueryKeycode = keyEvent.keyCode;
	gInputQueryValue = gInputQuery.value;
	processUserInput();
};
einputQueryFocus = function () {
	gInputQuery.focus();
};
function trimStr(str) {
	for (var i = 0, trimedStr = "", crlf = "\n\r"; i < str.length; i++) {
		if (crlf.indexOf(str.charAt(i)) == -1) {
			trimedStr += str.charAt(i);
		} else {
			trimedStr += " ";
		}
	}
	return trimedStr;
}
function separateCompStringDiv(compStringDiv, styleClassName) {
	var compStringSpan = compStringDiv.getElementsByTagName(gSpanTagName);
	if (compStringSpan) {
		for (var i = 0; i < compStringSpan.length; ++i) {
			if (compStringSpan[i].className == styleClassName) {
				var f = compStringSpan[i].innerHTML;
				if (f == "&nbsp;") {
					return "";
				} else {
					var str = trimStr(f);
					return str;
				}
			}
		}
	} else {
		return "";
	}
}
function separateCompStringDivC(compStringDiv) {
	if (!compStringDiv) {
		return null;
	}
	return separateCompStringDiv(compStringDiv, "cAutoComplete");
}
function separateCompStringDivD(compStringDiv) {
	if (!compStringDiv) {
		return null;
	}
	return separateCompStringDiv(compStringDiv, "dAutoComplete");
}
function hideCompleteDiv() {
	document.getElementById("completeDiv").style.visibility = "hidden";
	document.getElementById("completeIFrame").style.visibility = "hidden";
}
function showCompleteDiv() {
	document.getElementById("completeDiv").style.visibility = "visible";
	document.getElementById("completeIFrame").style.visibility = "visible";
	setCompDivPosition();
}
compRequest = function () {
	if (gKeywordPre != gKeyword) {
		if (!gSubmitting) {
			var escaped_keyword = encodeAndEscape(gKeyword), completeStrings = gCompleteStrings[gKeyword];
			if (completeStrings) {
				compResp(gKeyword, completeStrings[0], completeStrings[1]);
			} else {
				gNotResponsedResquestNum++;
				var req = "http://www.global-smile.com/ajax/search.asp?word="+ escaped_keyword +"&Order=" +gOrderFlag + "&Like="+gLikeFlag;
				//var req = "http://ac.xunlei.com:80/complete?ac=" + escaped_keyword;
				var jsonReq = new JSONscriptRequest(req);
				jsonReq.buildScriptTag();
				jsonReq.addScriptTag();
			}
			gInputQuery.focus();
		}
		gSubmitting = false;
	}
	gKeywordPre = gKeyword;
	setTimeout("compRequest()", calcNextTimeoutInterval(gNotResponsedResquestNum));
	return true;
};
compResp = function (keyword, completeStrings, displayStrings) {
	if (gNotResponsedResquestNum > 0) {
		gNotResponsedResquestNum--;
	}
	addCompleteStrings(keyword, completeStrings, displayStrings);
	if (keyword == gKeyword) {
		if (gTimerHideCompDiv) {
			clearTimeout(gTimerHideCompDiv);
			gTimerHideCompDiv = null;
		}
		gKeywordToDisplayCompStrings = keyword;
	}
	var completeDiv = gCompDiv;
	completeDiv.completeStrings = completeStrings;
	completeDiv.displayStrings = displayStrings;
	fillCompDiv(completeDiv, completeDiv.completeStrings, completeDiv.displayStrings);
	displayCompDiv(completeDiv, separateCompStringDivC);
	if (gCompStringDivNum > 0) {
		completeDiv.height = 16 * gCompStringDivNum + 4;
		gCompIFrame.height = completeDiv.height - 4;
	} else {
		hideCompleteDiv();
	}
};
hideCompDiv = function () {
	hideCompleteDiv();
	gTimerHideCompDiv = null;
};
function processUserInput() {
	if (gInputQueryKeycode == 40 || gInputQueryKeycode == 38) {
		inputQueryTemporaryBlur();
	}
	var length = selectionLength(gInputQuery), start = selectionStart(gInputQuery), inputValue = gInputQuery.value;
	if (gInputQueryKeycode != 9 && gInputQueryKeycode != 13 && !(gInputQueryKeycode >= 16 && gInputQueryKeycode <= 20) && gInputQueryKeycode != 27 && !(gInputQueryKeycode >= 33 && gInputQueryKeycode <= 38) && gInputQueryKeycode != 40 && gInputQueryKeycode != 44 && !(gInputQueryKeycode >= 112 && gInputQueryKeycode <= 123)) {
		gKeyword = inputValue;
		if (gInputQueryKeycode != 39) {
			ia = inputValue;
		}
	}
	if (notCompStringDivsNavigation(gInputQueryKeycode) && gInputQueryKeycode != 0 && gKeywordToDisplayCompStrings == gKeyword) {
		displayCompDiv(gCompDiv, separateCompStringDivC);
	}
	if (gKeywordToDisplayCompStrings != gKeyword && !gTimerHideCompDiv) {
		gTimerHideCompDiv = setTimeout("hideCompDiv()", 500 * gTimeFactor);
	}
}
function inputQueryOnsubmit() {
	gSubmitting = true;
	hideCompleteDiv();
	check();
	return true;
}
inputQueryValueChange = function (a) {
	if (gInputQueryFocused) {
		getSelectionInfo();
	}
	var curValue = gInputQuery.value;
	if (curValue != gInputQueryValue) {
		gInputQueryKeycode = 0;
		processUserInput();
	}
	gInputQueryValue = curValue;
	setTimeout("inputQueryValueChange()", 10 * gTimeFactor);
};
function encodeAndEscape(a) {
	if (encodeURIComponent) {
		return encodeURIComponent(a);
	}
	if (escape) {
		return escape(a);
	}
}
function calcNextTimeoutInterval(notResponsedResquestNum) {
	var interval = 100 * gTimeFactor;
	for (var i = 1; i <= (notResponsedResquestNum - 2) / 2; i++) {
		interval = interval * 2;
	}
	interval = interval + 50 * gTimeFactor;
	return interval;
}
setTimeout("compRequest()", 10 * gTimeFactor);
var compStringDivOnmousedown = function () {
	setInputQueryValue(separateCompStringDivC(this));
	inputQueryOnsubmit();
};
var compStringDivOnmousemove = function () {
	if (window.event) {
		var x = window.event.x, y = window.event.y;
		if (x == gMousePositionX && y == gMousePositionY) {
			return;
		}
		gMousePositionX = x;
		gMousePositionY = y;
	}
	if (gSelectedCompStringDiv) {
		setStyle(gSelectedCompStringDiv, "aAutoComplete");
	}
	setStyle(this, "bAutoComplete");
	gSelectedCompStringDiv = this;
	for (var i = 0; i < gCompStringDivNumber; i++) {
		if (gCompStringDivs[i] == gSelectedCompStringDiv) {
			gSelectedCompStringDivIndex = i;
			break;
		}
	}
};
var compStringDivOnmouseout = function () {
	setStyle(this, "aAutoComplete");
};
function hilightCompStringDiv(compStringDivIndex) {
	gKeyword = I;
	setInputQueryValue(I);
	if (!gCompStringDivs || gCompStringDivNumber <= 0) {
		return;
	}
	showCompleteDiv();
	if (compStringDivIndex >= gCompStringDivNumber) {
		compStringDivIndex = gCompStringDivNumber - 1;
	}
	if (gSelectedCompStringDivIndex != -1 && compStringDivIndex != gSelectedCompStringDivIndex) {
		setStyle(gSelectedCompStringDiv, "aAutoComplete");
		gSelectedCompStringDivIndex = -1;
	}
	if (compStringDivIndex < 0) {
		gSelectedCompStringDivIndex = -1;
		gInputQuery.focus();
		return;
	}
	gSelectedCompStringDivIndex = compStringDivIndex;
	gSelectedCompStringDiv = gCompStringDivs.item(compStringDivIndex);
	setStyle(gSelectedCompStringDiv, "bAutoComplete");
	gKeyword = I;
	setInputQueryValue(separateCompStringDivC(gSelectedCompStringDiv));
}
function notCompStringDivsNavigation(keycode) {
	if (keycode == 40) {
		hilightCompStringDiv(gSelectedCompStringDivIndex + 1);
		return false;
	} else {
		if (keycode == 38) {
			hilightCompStringDiv(gSelectedCompStringDivIndex - 1);
			return false;
		} else {
			if (keycode == 13 || keycode == 3) {
				if (window.navigator.userAgent.toLowerCase().indexOf("firefox") != -1) {
					inputQueryOnsubmit();
				}
				return false;
			}
		}
	}
	return true;
}
function displayCompDiv(completeDiv, separateCompString) {
	var c = gInputQuery, hasStringToSelect = false;
	gSelectedCompStringDivIndex = -1;
	var compStringDivs = completeDiv.getElementsByTagName(gDivTagName), compStringDivNum = compStringDivs.length;
	gCompStringDivNumber = compStringDivNum;
	gCompStringDivs = compStringDivs;
	gCompStringDivNum = compStringDivNum;
	I = gKeyword;
	if (gKeyword == "" || compStringDivNum == 0) {
		hideCompleteDiv();
	} else {
		showCompleteDiv();
	}
	for (var i = 0; i < compStringDivNum; i++) {
		setStyle(compStringDivs.item(i), "aAutoComplete");
	}
	gSelectedCompStringDivIndex = -1;
	gSelectedCompStringDiv = null;
}
function absoluteLocation(element, offset) {
	var c = 0;
	while (element) {
		c += element[offset];
		element = element.offsetParent;
	}
	return c;
}
function selectionLength(inputQuery) {
	var length = -1;
	if (inputQuery.createTextRange) {
		var textRange = document.selection.createRange().duplicate();
		length = textRange.text.length;
	} else {
		if (inputQuery.setSelectionRange) {
			length = inputQuery.selectionEnd - inputQuery.selectionStart;
		}
	}
	return length;
}
function selectionStart(inputQuery) {
	var start = 0;
	if (inputQuery.createTextRange) {
		var textRange = document.selection.createRange().duplicate();
		textRange.moveEnd("textedit", 1);
		start = inputQuery.value.length - textRange.text.length;
	} else {
		if (inputQuery.setSelectionRange) {
			start = inputQuery.selectionStart;
		} else {
			start = -1;
		}
	}
	return start;
}
function selectionEnd(inputQuery) {
	if (inputQuery.createTextRange) {
		var textRange = inputQuery.createTextRange();
		textRange.moveStart("character", inputQuery.value.length);
		textRange.select();
	} else {
		if (inputQuery.setSelectionRange) {
			inputQuery.setSelectionRange(inputQuery.value.length, inputQuery.value.length);
		}
	}
}
function setStyle(element, styleClassName) {
	ua();
	element.className = styleClassName;
	switch (styleClassName.charAt(0)) {
	  case "m":
		element.style.fontSize = "13px";
		element.style.fontFamily = "arial,sans-serif";
		element.style.wordWrap = "break-word";
		break;
	  case "l":
		element.style.display = "block";
		element.style.paddingLeft = "3";
		element.style.paddingRight = "3";
		element.style.height = "16px";
		element.style.overflow = "hidden";
		break;
	  case "a":
		element.style.backgroundColor = "white";
		element.style.color = "black";
		if (element.displaySpan) {
			element.displaySpan.style.color = "green";
		}
		break;
	  case "b":
		element.style.backgroundColor = "#3366cc";
		element.style.color = "white";
		if (element.displaySpan) {
			element.displaySpan.style.color = "white";
		}
		break;
	  case "c":
		element.style.width = u + "%";
		if (window.navigator.userAgent.toLowerCase().indexOf("firefox") != -1) {
			element.style.cssFloat = "left";
		} else {
			element.style.styleFloat = "left";
		}
		element.style.whiteSpace = "nowrap";
		element.style.overflow = "hidden";
		element.style.textOverflow = "ellipsis";
		element.style.fontSize = "12px";
		break;
	  case "d":
		if (window.navigator.userAgent.toLowerCase().indexOf("firefox") != -1) {
			element.style.cssFloat = "right";
		} else {
			element.style.styleFloat = "right";
		}
		element.style.width = 100 - u + "%";
		element.style.fontSize = "10px";
		element.style.textAlign = "right";
		element.style.color = "green";
		element.style.paddingTop = "3px";
		break;
	}
}
function ua() {
	u = 65;
	var a = 110, b = adjustOffsetWidth(), c = (b - a) / b * 100;
	u = c;
}
function fillCompDiv(completeDiv, completeStrings, displayStrings) {
	while (completeDiv.childNodes.length > 0) {
		completeDiv.removeChild(completeDiv.childNodes[0]);
	}
	var title = document.createElement("P");
	title.innerHTML="<b>Choose a suggestion...</b>";
	title.style.fontSize = "10px";
	//title.style.color="red";
	completeDiv.appendChild(title);

	for (var e = 0; e < completeStrings.length; ++e) {
		var f = document.createElement("DIV");
		setStyle(f, "aAutoComplete");
		f.onmousedown = compStringDivOnmousedown;
		f.onmousemove = compStringDivOnmousemove;
		f.onmouseout = compStringDivOnmouseout;
		var i = document.createElement("SPAN");
		setStyle(i, "lAutoComplete");
		i.style.height = gInputQuery.offsetHeight - 4;
		var h = document.createElement("SPAN");
		h.innerHTML = completeStrings[e];
		var l = document.createElement("SPAN");
		setStyle(l, "dAutoComplete");
		setStyle(h, "cAutoComplete");
		f.displaySpan = l;
		l.innerHTML = displayStrings[e];
		i.appendChild(h);
		i.appendChild(l);
		f.appendChild(i);
		completeDiv.appendChild(f);
	}
	var option = document.createElement("A");
	option.innerHTML="<label style='color:black;'><input type='radio'  value='1' name='order' "+gRadioHits+" onmouseover='RadioBtnClick(this);'/>Most Searched Order or&nbsp;&nbsp;</label>"+
	                "<label style='color:black;'><input type='radio'  value='2' name='order' "+gRadioApha+" onmouseover='RadioBtnClick(this);'/>Aphabetic Order</label>"+
	                "<label style='color:black;'><input type='radio'  value='1' name='like' "+gRadioStart+" onmouseover='RadioBtnClick(this);'/>Starting the sentence or&nbsp;&nbsp;</label>"+
	                "<label style='color:black;'><input type='radio'  value='2' name='like' "+gRadioAnywhere+" onmouseover='RadioBtnClick(this);'/>Anywhere</label>";
	option.style.fontSize = "12px";
	//option.style.color="red";
	completeDiv.appendChild(option);
		
	var footer = document.createElement("P");
	footer.innerHTML="<b>...Or finish typing and press Enter.</b>";
	footer.style.fontSize = "10px";
	//footer.style.color="red";
	footer.style.textAlign = "right";
	completeDiv.appendChild(footer);
	
}
function RadioBtnClick(o)
{
    o.checked=true;
	if(o.name=="order")
    		gOrderFlag = o.value;
	if(o.name=="like")
    		gLikeFlag = o.value;
    InitRadioChecked();
    writeCookie("Order", gOrderFlag, 24);
    writeCookie("Like", gLikeFlag, 24);
}
function InitRadioChecked()
{
    if(gOrderFlag=="1")
    {
        gRadioHits="checked";
        gRadioApha=""; 
    }
    if(gOrderFlag=="2")
    {
        gRadioApha="checked";
        gRadioHits=""; 
    }
    if(gLikeFlag=="1")
    {
        gRadioStart="checked";
        gRadioAnywhere="";
    }
    if(gLikeFlag=="2")
    {
        gRadioAnywhere="checked";
        gRadioStart=""; 
    }
}
function readCookie(name) {
	var cookieValue = ""; 
	var search = name + "=";
	if (document.cookie.length > 0) { 
		offset = document.cookie.indexOf(search); 
		if (offset != -1) { 
			offset += search.length; 
			end = document.cookie.indexOf(";", offset); 
			if (end == -1) {
				end = document.cookie.length;
			}
			cookieValue = document.cookie.substring(offset, end);
		}
	}
	return cookieValue; 
}
function writeCookie(name, value, hours) {
	var expire = ""; 
	if(hours != null) { 
		expire = new Date((new Date()).getTime() + hours * 3600000); 
		expire = "; expires=" + expire.toGMTString(); 
	}
	document.cookie = name + "=" + value + expire; 
}
function setInputQueryValue(value) {
	gInputQuery.value = value;
	gInputQueryValue = value;
}
function selectionNotChanged() {
	var value = gInputQuery.value, start = selectionStart(gInputQuery), length = selectionLength(gInputQuery);
	return length == gSelectionStart && c == gSelectionLength && value == gSelectionValue;
}
function getSelectionInfo() {
	gSelectionValue = gInputQuery.value;
	gSelectionStart = selectionStart(gInputQuery);
	gSelectionLength = selectionLength(gInputQuery);
}

