
var bn_autocomplete=function(){
	var sugul_id,iframe;
	
	var suggestion,input,sug_ul,suggest,current=-1,keylock=false,mouseOnSug=false,mouselock=false,isClkSug=false,makeAPICall=false;
	var isIE=navigator.userAgent.indexOf("MSIE")!=-1&&!window.opera;
	var isWebKit=(navigator.userAgent.indexOf("AppleWebKit/")>-1);
	var isGecko=(navigator.userAgent.indexOf("Gecko")>-1)&&(navigator.userAgent.indexOf("KHTML")==-1);
	var timer1,timer2=0,timer3=0,oldQuery="",query="";

	this.init=function(div_id,input_id,form_id,isAPI){
		if(div_id&&input_id){
			suggestion=document.getElementById(div_id);
			input=document.getElementById(input_id);
			sugul_id=div_id+"_ul";
			iframe=div_id+"_iframe";
		}
		else
			return;
		if(form_id && isAPI==true){
			form=document.getElementById(form_id);
			makeAPICall=true;
		}
		else{
			form=null;
			makeAPICall=false;
		}

		if(isIE)
		{
			var sug_if=document.createElement("IFRAME");sug_if.src="javascript:void(0)";sug_if.id=iframe;
			suggestion.parentNode.insertBefore(sug_if,suggestion)
		}
		
		input.onkeydown=keydown;
		input.onblur=function(e){//onblur search box
			if(!isClkSug)
			{
				if(timer3==0)
				{timer3=setTimeout(ClearSuggest,200)}
			}
			isClkSug=false
		};
		document.onmousedown=function(e){//when mouse click outof suggest list
			e=e||window.event;var elm=e.target||e.srcElement;
			if(elm==input)
			{return }
			while(elm=elm.parentNode)
			{
				if(elm==suggestion||elm==input)
				{isClkSug=true;return }
			}
			if(timer3==0)
			{timer3=setTimeout(ClearSuggest,200)}
		};
		window.onresize=function(){
			if(typeof (timer3)!="undefined"&&timer3!=0)
			{clearTimeout(timer3)}
			resetSuggestion()
		};
		document.onkeydown=function(e){
			if(isGecko)
			{
				e=e||window.event;
				if(e.ctrlKey)
				{
					if(e.keyCode==61||e.keyCode==107||e.keyCode==109||e.keyCode==96||e.keyCode==48)
					{resetSuggestion()}
				}
			}
		};
		input.onbeforedeactivate=function(){
			if(mouselock)
			{window.event.cancelBubble=true;window.event.returnValue=false;mouselock=false}
		};
		
		
		timer1=setInterval(Main,10);
	};
	function sug(data){
			if(typeof (data)=="object")
			{suggest=data;setSugetElement()}
			else
			{ClearSuggest();suggest=[]}
	};
	function ClearSuggest()//clear suggest
	{
		if(isIE){document.getElementById(iframe).style.display="none"}
		suggestion.style.display="none";
		timer3=0
	}
	function ClearStyle()//clear table style
	{
		var lis=sug_ul.childNodes;
		for(var i=0;i<lis.length;i++)
		{
			lis[i].className="bn_autocomplete_mouseout";
		}
	}
	function ClickSuggest()//suggest onclick
	{
		return function(){
			input.blur();
			ClearSuggest();
			input.value=this.innerHTML;
			keylock=true;
			submitElement();
			}
	}
	function submitElement()//submit
	{
		if(makeAPICall)
			form.submit();
	}

	function setSugetElement()//build suggest list
	{
		if(typeof (suggest)!="object")
		{return; }
		
		var ul=document.createElement("ul");
		ul.id=sugul_id;
		for(var i=0;i<suggest.length;i++)//set even & content for every suggest
		{
			var li=document.createElement("li");
			li.onmouseover=function(){ClearStyle();this.className="bn_autocomplete_mousein";mouseOnSug=true;};
			li.onmouseout=function(){ClearStyle();};
			li.onmousedown=function(e){mouselock=true;if(!isIE){e.stopPropagation();return false;}};
			li.onclick=ClickSuggest(i);
			li.innerHTML=suggest[i].childNodes[0].nodeValue;
			ul.appendChild(li);
		}
		
		//set style of suggest list
		suggestion.innerHTML="";
		suggestion.appendChild(ul);

		if(isIE)
		{
			var sug_if=document.getElementById(iframe);
			with(sug_if.style)
			{
				display="";position="absolute";
				width=suggestion.offsetWidth+"px";height=ul.offsetHeight+"px"; 
			}
		}
		sug_ul=document.getElementById(sugul_id);current=-1;
	}
	function keydown(e)//onkeydown
	{
		e=e||window.event;keylock=false;
		if(e.keyCode==13)//when push enter
		{
			if(isIE)
			{e.returnValue=false}
			else
			{e.preventDefault()}
			ClearSuggest();
			submitElement();
			return 
		}
		if(e.keyCode==38||e.keyCode==40)//when push up or down  set style
		{
			mouseOnSug=false;
			if(suggestion.style.display!="none")
			{
				var lis=sug_ul.childNodes;var l=lis.length-1;
				for(var i=0;i<l;i++)
				{
					if(lis[i].className=="bn_autocomplete_mousein")
					{current=i;break}
				}
				ClearStyle();var cli;
				if(e.keyCode==38)//up
				{
					if(current==0)
					{input.value=query;current=-1;keylock=true}
					else
					{
						if(current==-1)
						{current=l+1}
						cli=lis[--current];cli.className="bn_autocomplete_mousein";input.value=cli.innerHTML
					}
				}
				if(e.keyCode==40)//down
				{
					if(current==l)
					{input.value=query;current=-1;keylock=true}
					else
					{
						cli=lis[++current];cli.className="bn_autocomplete_mousein";input.value=cli.innerHTML
					}
				}
				if(!isIE)
				{e.preventDefault()}
			}
		}
	}

	function CheckAPI(){
		var flag=true;var keyword=input.value;
		if(typeof(sug_ul)!="undefined" && sug_ul!=null)
		{
			var lis=sug_ul.childNodes;
			for(var i=0;i<lis.length;i++)
			{
				if(lis[i].className=="bn_autocomplete_mousein")
				{
					if(keyword==lis[i].innerHTML && !mouseOnSug)
					{flag=false}//block the api call when the terms equals highlisht suggest.
				}
			}
		}
		if(flag&&!keylock)
		{
			if(BaynoteAPI && BaynoteAPI.getAjaxTag)
        		BaynoteAPI.getAjaxTag().send({
        			bnURL: '/baynote/api',
        			onSuccess: mySuccessHandler,
        			onFailure: myErrorHandler,
        			params: {
        				action: 'AutoComplete',
        				query: encodeURIComponent(input.value).replace(/%20/g," "),
        				size: 10,
        				format: 'xml'
        			}
        		});
		}
	}
	function parseXML(text) {
		if (window.DOMParser) {
			parser=new DOMParser();
			xmlDoc=parser.parseFromString(text,"text/xml");
		}
		else { // Internet Explorer
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.async="false";
			xmlDoc.loadXML(text);
		}
		return xmlDoc;
	}
	function mySuccessHandler(responseText) {
		var xmlDoc = parseXML(responseText);
		var attrs = xmlDoc.getElementsByTagName("response")[0].attributes;
		var isError = attrs.getNamedItem("isError").value;
		if (isError == "false")
		{
			var terms = xmlDoc.getElementsByTagName("tm");
			if (terms.length > 0)
			{
				sug(terms);

				suggestion.style.display="block";
			}
			else
			{
				ClearSuggest();
			}
		}
		else
		{
			ClearSuggest();
		}
	}
	
	function myErrorHandler(responseText) {
		ClearSuggest();
	}
	function Main(){
		var newQuery=input.value;
		if(newQuery==oldQuery && newQuery!="")
		{
			if(timer2==0)
			{timer2=setTimeout(CheckAPI,800)}
		}
		else
		{
			clearTimeout(timer2);
			timer2=0;
			oldQuery=newQuery;
			if(newQuery=="")
			{ClearSuggest()}
		}
	}
	function resetSuggestion(){
		if(suggestion.style.display!="none")
		{
			setTimeout(function(){
				ClearSuggest();
				if(suggest!=null)
				{setSugetElement(suggest);input.focus()}
			},100)
		}
	}
};

