﻿	var nsh_HintsCount=7;

	function nshtrim(str, chars) {return nshltrim(nshrtrim(str, chars), chars);}
	function nshltrim(str, chars){chars = chars || "\\s";return str.replace(new RegExp("^[" + chars + "]+", "g"), "");}
	function nshrtrim(str, chars) {chars = chars || "\\s";return str.replace(new RegExp("[" + chars + "]+$", "g"), "");}
	function nshucfirst(str) {var f = str.charAt(0).toUpperCase();return f + str.substr(1);}
	function nshspliti(sep,str)
	{
		var temp = str.toLowerCase();
		temp 	 = temp.split(sep.toLowerCase());
		pos=0;
		for(var i=0;i<temp.length;i++)
		{
			var len = temp[i].length;
			if(len!=0)
				temp[i]=str.substr(pos,len);
			pos=pos+len + sep.length;
		}
		return temp;
	}
	function nshstr_replace_spec(needle,str,L,R)
	{
		var temp = nshspliti(needle,str);//разбиваем по вхождениям
		var res  = '';
		var nlen =needle.length;
		var pos=0;
		for(var i=0;i<temp.length;i++)
		{
			if(i!=0)
			{
				var arr=needle.split(' ');//разбиваем по словам
				var cneedle='';
				var pos2=pos;
				for(var j=0;j<arr.length;j++)
				{ 
					var cw=arr[j];
					var wlen=cw.length;
					if(j!=0)
					{
						cneedle=cneedle+' ';
						pos2++;
					}
					var was=str.substr(pos2,wlen);
					if(was==was.toUpperCase())
						cw=cw.toUpperCase();
					else if(was==nshucfirst(was))
						cw=nshucfirst(cw);
					cneedle=cneedle+cw;
					pos2=pos2 + wlen;
				}
				res=res+L+cneedle+R;
				pos=pos+nlen;
			}
			res=res+temp[i];
			pos=pos+temp[i].length;
		}
		return res;
	}
	function nshstr_replace(needle, replacement,haystack)
	{
		var temp = nshspliti(needle,haystack);
		var Res=temp.join(replacement);
		if(haystack.charAt(0)==haystack.charAt(0).toUpperCase())
			Res=nshucfirst(Res)
		return Res;
	}
	var fhnames  		 = new Array('Лондонcкая','Лондон');
	var uhnames  		 = new Array('1111','22222');
	var uhnamesc  		 = new Array();

	var fhnames_low	 	 = new Array();	
	var fhnames_minlen   = 10000;//нужен для ускорения поиска
	var nsh_LastKey      = false;
	var nsh_LastAffix    = false;
	var nsh_ShowingAffix = false;
	var nsh_Selected  	 = -1;
	
	
	function nsh_close()
	{
		if(nsh_ShowingAffix===false)
			return;
		else if(!nsh_ShowingAffix)
			nsh_ShowingAffix='';
		var hints0=document.getElementById('seach_by_name_hints'+nsh_ShowingAffix);
		if(!hints0)
			hints0=document.getElementById('seach_by_name_hints');
		var hints=document.getElementById('seach_by_name_hints_span0'+nsh_LastAffix);
		if(!hints)
			hints=document.getElementById('seach_by_name_hints_span0');
			
		if(hints0)
		{
			hints0.innerHTML='';	
			hints.style.display="none";
		}
		nsh_ShowingAffix=false;
	}
	function nsh_addDocOnClick(func) {
        var oldonload = document.onclick;
        if (typeof document.onclick != 'function') {document.onclick = func;}
        else {document.onclick = function() {oldonload();func();}}
	}
	//try{nsh_addDocOnClick(function(){nsh_close(); return true;})} catch(err){};
	function nsh_set_value(value)
	{
		if(nsh_ShowingAffix===false)
			return;
		if(!nsh_LastAffix)
			nsh_LastAffix='';
		else if(!nsh_ShowingAffix)
			nsh_ShowingAffix='';
		var iinptel	= document.getElementById('seach_by_name_input'+nsh_LastAffix);
		if(!iinptel)
			iinptel	= document.getElementById('seach_by_name_input');	
		iinptel.value=value;
	}
	function nsh_by_name_change(ev,affix)
	{
		nsh_LastKey=ev.keyCode;
		nsh_LastAffix=affix;
		var ckey=nsh_LastKey;

		if(ckey==13)
		{
			if(nsh_Selected!=-1)
			{
				if(fhnames.length==uhnames.length)
					window.location.href=uhnamesc[nsh_Selected];
				else
					nsh_set_value(uhnamesc[nsh_Selected]);
				nsh_SetSeLEl(false);
				nsh_Selected=-1;	
				nsh_close();
				return false;
			}
			return true;
		}
		setTimeout(function(){nsh_by_name_change0()},1);
		return true;
	}
	function nsh_SetSeLEl(eSel)
	{
		var stcl="nsh_li_selected";
		if(!eSel)
			stcl="";
		if(nsh_Selected!=-1)
		{
			var cnSelectedEl=document.getElementById('nsh_li_'+nsh_Selected);
			if(cnSelectedEl)
			{
				cnSelectedEl.setAttribute("class", stcl);
				cnSelectedEl.setAttribute("className", stcl); 
			}
		}		
	}
	var nsh_Sanitarize_Filters=new Array();

	function nsh_TestFilter(Value)
	{
		Value =nshstr_replace('отель','',Value);
		Value =nshstr_replace('гостиница','',Value);
		return nshtrim(Value);
	}
	nsh_Sanitarize_Filters.push('nsh_TestFilter');

	function nsh_SanExec(Value)
	{
		for (var i=0; i<nsh_Sanitarize_Filters.length; i++) 
			Value=window[nsh_Sanitarize_Filters[i]](Value);
		return Value;
	}
	
	function nsh_by_name_change0()
	{	
		//40 вниз, 38 вверх, 27 - esc, 13 - энтер
		if(!nsh_LastAffix)
			nsh_LastAffix='';
		var ckey=nsh_LastKey;
		/*
		var sestr='';
		for(var i=0;i<fhnames.length;i++)
		{
			 sestr=sestr+"\n"+fhnames[i];
		}
		document.write('<pre>'+sestr);
		*/
		if(ckey==40||ckey==38)
		{
			nsh_SetSeLEl(false);
			if(ckey==40)
				nsh_Selected++;
			else
				nsh_Selected--;

			if(nsh_Selected<0)
				nsh_Selected=uhnamesc.length-1;
			else if(nsh_Selected>=uhnamesc.length)
				nsh_Selected=0;
	
			nsh_SetSeLEl(true);
			return;
		}	
		else
		{
			nsh_SetSeLEl(false);
			nsh_Selected=-1;
		}
		var iinptel	= document.getElementById('seach_by_name_input'+nsh_LastAffix);
		if(!iinptel)
			iinptel	= document.getElementById('seach_by_name_input');
		var text =nshtrim(iinptel.value);  
		if(!text || text==''|| ckey==27)
		{
			nsh_close();
			return;
		}
		text =nshstr_replace('ё','е',text);
		text =nshstr_replace('"',' ',text);
		text =nshstr_replace("'",' ',text);
		text =nshstr_replace("-",' ',text);
		text =nshstr_replace(",",' ',text);
		text =nshstr_replace(":",' ',text);
		text =nshstr_replace(":",'_',text);

		text =nshstr_replace('  ',' ',text);
		text =nshstr_replace('  ',' ',text);
		text =nshstr_replace('  ',' ',text);
		text =nsh_SanExec(text);
		var text_up=text;
		text=text.toLowerCase();
		
		var hnfind =new Array();
		var hnfind0=new Array();
		var hnfind1=new Array();
		if(fhnames_low.length==0)
		{
			for(i=0;i<fhnames.length;i++)
			{
				if(fhnames_minlen<fhnames[i].length)
					fhnames_minlen=fhnames[i].length;
				fhnames_low.push(fhnames[i].toLowerCase());
			}
		}		
		for(i=0;i<fhnames.length;i++)
		{
			var cur  = fhnames_low[i];
			
			var cur2;
			if(fhnames.length==uhnames.length)
				cur2= fhnames[i]+'::'+uhnames[i];
			else
				cur2= fhnames[i];
				
			if(cur==text)  //полное соответствие 
				hnfind.push(cur2);
			else
			{
				var	ind=cur.indexOf(text);
				if(ind==0)//соответствие начал 
				{
					hnfind0.push(cur2);
					if((hnfind0.length+hnfind.length)>=nsh_HintsCount 
					&& (text.length<fhnames_minlen || hnfind.length>=1)) 
						break;//Мы нашли все что нужно
				}
				else if(ind!==-1)
					hnfind1.push(cur2);
			}
		}
		for(i=0;i<hnfind0.length;i++)
			hnfind.push(hnfind0[i]);
		for(i=0;i<hnfind1.length && hnfind.length<=nsh_HintsCount;i++)
			hnfind.push(hnfind1[i]);

		if(hnfind.length==0)
		{
			nsh_close();
			return;
		}
		var str='';	
		uhnamesc  		= new Array();
		for(i=0;i<hnfind.length;i++)
		{
			var cur  = hnfind[i];
			if(fhnames.length==uhnames.length)
			{
				cur=cur.split('::');
				cur[0]=nshstr_replace_spec(text,cur[0],'<b>','</b>');
				uhnamesc.push(cur[1]);
				str=str+'<li id="nsh_li_'+i+'" onclick="window.location.href='+"'"+cur[1]+"'"+'"><a href="'+cur[1]+'">'+cur[0]+'</a><span class="span1">&nbsp;</span><span class="span2"> </span><span class="span3">&nbsp;</span></li>';
			}
			else
			{
				var cur0=cur;
				uhnamesc.push(cur0);
				cur=nshstr_replace_spec(text,cur0,'<b>','</b>');
				str=str+'<li id="nsh_li_'+i+'" onclick="nsh_set_value(\''+cur0+'\')"><u>'+cur+'</u><span class="span1">&nbsp;</span><span class="span2"> </span><span class="span3">&nbsp;</span></li>';
			}
			if(i==nsh_HintsCount-1)
				break;
		}
		var hints0=document.getElementById('seach_by_name_hints'+nsh_LastAffix);
		if(!hints0)
			hints0=document.getElementById('seach_by_name_hints');

		var hints=document.getElementById('seach_by_name_hints_span0'+nsh_LastAffix);
		if(!hints)
			hints=document.getElementById('seach_by_name_hints_span0');

		str='<ul>'+str+'</ul>';
		hints0.innerHTML=str;
		hints.style.display="block";
		nsh_ShowingAffix=nsh_LastAffix;
	}
