var isIE = (navigator.userAgent.indexOf("MSIE") != -1) ? true : false;
var ie5 = (navigator.userAgent.indexOf("MSIE 5") != -1) ? true : false;
var ie6 = (navigator.userAgent.indexOf("MSIE 6") != -1) ? true : false;
var ie7 = (navigator.userAgent.indexOf("MSIE 7") != -1) ? true : false;
var ie8 = (navigator.userAgent.indexOf("MSIE 8") != -1) ? true : false;

var isFF = (navigator.userAgent.indexOf("Firefox") != -1) ? true : false;
var ff1 = (navigator.userAgent.indexOf("Firefox/1") != -1) ? true : false;
var ff2 = (navigator.userAgent.indexOf("Firefox/2") != -1) ? true : false;

var op9 = (navigator.userAgent.indexOf("Opera/9") != -1) ? true : false;
//<![CDATA[

var SearchSuggest = {
	obj : null , 
	url : null,
	ignored : false,
	response : null,
	operation : false,
	query : "",
	queryEncode : "",
	prevQuery : false,
	cacheQuery : {},
	cacheQueryID : 0,
	cacheMaxSize : 150,
	tmDelay : 150,
	tmID : false,
	HintsIsOpen : false,
	HintFrsValue : false,
	HintCurValue : false,
	HintCurSelect : false,
	HintCurID : false,
	HintsNodeList : false,
	onMainPage : null,
	minLength : 1,
		
	setBasicVariable : function(obj) {
		this.obj = obj;
		if (SearchSuggest.onMainPage) obj.value = "";
		obj.setAttribute("autocomplete","off");
	},
	
	SetObjectEvent : function(event) { 
		addHandler(SearchSuggest.obj, event, SearchSuggest.SwitcherOperation);
	},
	
	GetEncodedQuery : function() {
			return encodeURI(SearchSuggest.obj.value.toLowerCase());
	},
	
	SwitcherOperation : function(e) {
	
		if (SearchSuggest.ignored){
			if (SearchSuggest.HintsIsOpen) {
				SearchSuggest.DestroyHintsArea();
			}
			return;
		}
		e = e || window.event;
		e.cancelBubble = true;
		if (e.type == "click") {return;}
		var keyCode = e.keyCode ? e.keyCode : e.which ? e.which : null;
		SearchSuggest.query = ((ie6 || ie7) && keyCode == 27) ? SearchSuggest.query : SearchSuggest.obj.value;
		SearchSuggest.queryEncode = encodeURIComponent(SearchSuggest.query.toLowerCase());
		if (SearchSuggest.queryEncode == "") {
			if (SearchSuggest.HintsIsOpen) {
				SearchSuggest.DestroyHintsArea();
			}
			SearchSuggest.prevQuery = false;
			return;
		}
		if (keyCode == 13) {
			if (SearchSuggest.HintCurValue && SearchSuggest.HintCurID) {
				SearchSuggest.obj.value = SearchSuggest.HintCurValue;
			}
			SearchSuggest.DestroyHintsArea();
			return;
		}
		if (keyCode != 27 && keyCode != 40 && keyCode != 38 && SearchSuggest.prevQuery === SearchSuggest.queryEncode) {
			return;
		}

		//debug(SearchSuggest.operation+" - "+SearchSuggest.tmID+" - "+keyCode);
		
		var c_response = SearchSuggest.CheckCache(SearchSuggest.queryEncode);
		if (keyCode == 27) {
			
			setTimeout(function(){
				if (!SearchSuggest.CheckOpenSock()) {
					SearchSuggest.HintsGetRepeat(true);
				}
			}, SearchSuggest.tmDelay);

			if (ie6 || ie7) {
				if (e.type == "keypress") {
					if (SearchSuggest.HintsIsOpen) {
						SearchSuggest.obj.value = SearchSuggest.HintFrsValue;
						SearchSuggest.query = SearchSuggest.HintFrsValue;
						SearchSuggest.DestroyHintsArea();
					} else {
						SearchSuggest.obj.value = SearchSuggest.query;
					}
				}
			} else {
				if (SearchSuggest.HintsIsOpen) {
					SearchSuggest.obj.value = SearchSuggest.HintFrsValue;
					SearchSuggest.DestroyHintsArea();
				}
			}
			SearchSuggest.obj.focus();
			return;
		}
		if ((keyCode == 40 || keyCode == 38) && SearchSuggest.HintsIsOpen) {
								
			if (e.preventDefault) e.preventDefault();
				e.returnValue = false;
									
			SearchSuggest.HintsSelect(e);
			return false;
		}
		
		if (e.type == "keypress" && (keyCode == 40 || keyCode == 38)) {
		
		if (e.preventDefault) e.preventDefault();
				e.returnValue = false;
		
		}
		
		if (c_response) {
			if (keyCode == 40 && !SearchSuggest.HintsIsOpen) {
				SearchSuggest.DestroyHintsArea();
				SearchSuggest.BuildHintsArea(c_response);
			} else if (keyCode != 38) {
				SearchSuggest.DestroyHintsArea();
				SearchSuggest.BuildHintsArea(c_response);
			}
			SearchSuggest.prevQuery = SearchSuggest.queryEncode;
			return;
		}
		SearchSuggest.HintsGet();
	},
	
	HintsGet : function() {
				if (!SearchSuggest.CheckOpenSock()) {
					return false;
				}
				
				if (SearchSuggest.obj.value.length < SearchSuggest.minLength) {
					return false;
				}
	
				SearchSuggest.tmID = setTimeout(function() {
				
				SearchSuggest.prevQuery = SearchSuggest.queryEncode;
				if (SearchSuggest.prevQuery == "" || SearchSuggest.CheckCache(SearchSuggest.prevQuery)) {
				SearchSuggest.HintsGetRepeat(true);
				return;
				}
				var _url = '/ajaxsearch?sugg=1&q=' + SearchSuggest.prevQuery;
				ajax_call_static(_url,SearchSuggest.ResponseHandler);
				SearchSuggest.operation = true;
				return;
				}, SearchSuggest.tmDelay);
	
	},
	
	
	ResponseHandler : function(result,eq) {
				if (result.length != 0) {
					var res_s = result;
					SearchSuggest.cacheQuery[eq] = result; 
					SearchSuggest.cacheQueryID++;
					if (SearchSuggest.GetEncodedQuery() != "")
						 SearchSuggest.BuildHintsArea(res_s); 
				} else 
					SearchSuggest.DestroyHintsArea();
					
					SearchSuggest.HintsGetRepeat();
	},
	
	BuildHintsArea : function(result) { 
	
	if(SearchSuggest.HintsIsOpen) 
	SearchSuggest.DestroyHintsArea();

	SearchSuggest.HintsIsOpen = true; 
	SearchSuggest.HintCurSelect = false;
	SearchSuggest.HintCurID = false;
	SearchSuggest.HintsNodeList = false;
	SearchSuggest.HintFrsValue = SearchSuggest.query;
	
		var hq = gebi("gogoHintQuery");
		var i;
		var hint;
		
		if (result.length > 0 ) {
		for (i = 0; i < result.length; i++) { 
			hint = document.createElement("div");
			hint.className = "hint";
			hint.id = "hint" + i;
			hint.innerHTML = result[i];
			addHandler(hint, "mouseover", SearchSuggest.HintsSelect);
			addHandler(hint, "mouseout", SearchSuggest.HintsSelect);
			addHandler(hint, "click", SearchSuggest.HintsSelectedClick);
			hq.appendChild(hint);
			
		}
		SearchSuggest.HintsNodeList = hq.getElementsByTagName("div");
				
		var a_cont = document.createElement("div");
		a_cont.style.textAlign = "right";
		hq.appendChild(a_cont);
		var a = document.createElement("a");
		addHandler(a, "click", SearchSuggest.HintsClosePer);
		a.innerHTML = "закрыть";
		a.className = "hint_close";
		a_cont.appendChild(a);
		
		hq.style.display = "block";
		SearchSuggest.correctHintsArea();
								
		}
	},
	
	correctHintsArea : function() { 
	if(gebi("gogoHintQuery").style.display == "block" ) { 
		
		if (SearchSuggest.onMainPage) { 
			if (!op9) {
			if (getWinSize().w < 1200)  gebi("gogoHintQuery").style.left = "79px";
				else gebi("gogoHintQuery").style.left = "79px";
			}else {
			if (getWinSize().w < 1200)  gebi("gogoHintQuery").style.left = "100px";
				else gebi("gogoHintQuery").style.left = "100px";
				}
			}
		}
	},
	
			
	DestroyHintsArea : function() {
	
		if (gebi("gogoHintQuery").style.display == "block") {
			gebi("gogoHintQuery").style.display = "none";
			gebi("gogoHintQuery").innerHTML = "";
		}
		
		SearchSuggest.HintsIsOpen = false; 
		SearchSuggest.HintCurSelect = false;
		SearchSuggest.HintCurID = false;
		SearchSuggest.HintsNodeList = false;
			
	},
	
	HintIdGet : function() {
		var id = false;
		for (var i=0; i<SearchSuggest.HintsNodeList.length-1; i++) {
			if (SearchSuggest.HintsNodeList[i].className == "ra") {
				id = i;
				break;
			}
		}
		return id;
	},
	
	HintsSelectedClick : function() {
		SearchSuggest.obj.value = SearchSuggest.HintCurValue;
		gebi('search').submit();
	},
	
	HintsClosePer : function() {
		SearchSuggest.DestroyHintsArea();
		SearchSuggest.ignored = true;
	},
	
	InpFocusToEnd : function() {
		if (SearchSuggest.obj.createTextRange) {
			//var r = SearchSuggest.obj.createTextRange();
			//r.collapse(false);
			var c=0,b=0;
			var d=SearchSuggest.obj.createTextRange(),e=document.selection.createRange(); 
			
			if(d.inRange(e)){
				d.setEndPoint("EndToStart",e); 
				b=d.text.length;
				d.setEndPoint("EndToEnd",e);
				c=d.text.length;
			}
		} else if (SearchSuggest.obj.selectionStart) {
			var end = SearchSuggest.obj.value.length;
			SearchSuggest.obj.setSelectionRange(end,end);
		}
		SearchSuggest.obj.focus();
	},
	
	HintsSelect : function(e) {
					
		e = e || window.event;
		e.cancelBubble = true;
	
		var keyCode = e.keyCode ? e.keyCode : e.which ? e.which : null;
		var type = e.type;
		if (type != "keydown" && type != "mouseover" && type != "mouseout"){
			if (type == "keyup") {
				if (!op9) SearchSuggest.InpFocusToEnd();
			}
			return;		
		}
		if (typeof SearchSuggest.HintsNodeList != "array" && typeof SearchSuggest.HintsNodeList != "object") {
			return;
		}
		var all = SearchSuggest.HintsNodeList.length-1;
		var cur = SearchSuggest.HintCurSelect;
		switch (type) {
		case "mouseover":
			if (cur) {
				cur.className = "rn"; 
			}
			cur = e.target || e.srcElement;
			cur.className = "ra";
			SearchSuggest.HintCurValue = cur.innerHTML;
			SearchSuggest.HintCurID = SearchSuggest.HintIdGet();
		break;
		case "mouseout":
			//if (cur) {
			//	cur.className = "rn";
			//}
		break;
		case "keydown":
			SearchSuggest.obj.blur();
			setTimeout(function(){SearchSuggest.obj.focus();},100);
			if (keyCode == 38) {
				if (SearchSuggest.HintCurID === false) {
					if (cur) {
						cur.className = "rn";
					}
					cur = SearchSuggest.HintsNodeList[(all-1)];
					cur.className = "ra";
					SearchSuggest.HintCurID = SearchSuggest.HintIdGet();
				} else {
					if (cur) {
						cur.className = "rn";
					}
					SearchSuggest.HintCurID--;
					if (SearchSuggest.HintCurID < 0) {
						if (cur) {
							cur = false;
						}
						SearchSuggest.HintCurID = false;
					} else {
						cur = SearchSuggest.HintsNodeList[SearchSuggest.HintCurID];
						cur.className = "ra";
						SearchSuggest.HintCurValue = cur.innerHTML;
					}
				}
			} else if (keyCode == 40) {
				if (SearchSuggest.HintCurID === false) {
					if (cur) {
						cur.className = "rn";
					}
					cur = SearchSuggest.HintsNodeList[0];
					cur.className = "ra";
					SearchSuggest.HintCurID = SearchSuggest.HintIdGet();
				} else {
					if (cur) {
						cur.className = "rn";
					}
					SearchSuggest.HintCurID++;
					if (SearchSuggest.HintCurID == all) {
						if (cur) {
							cur = false;
						}
						SearchSuggest.HintCurID = false;
					} else {
						cur = SearchSuggest.HintsNodeList[SearchSuggest.HintCurID];
						cur.className = "ra";
					}
				}
			}
			if (SearchSuggest.HintCurID === false) {
				SearchSuggest.obj.value = SearchSuggest.HintFrsValue;
			} else {
				SearchSuggest.HintCurValue = cur.innerHTML;
				SearchSuggest.obj.value = SearchSuggest.HintCurValue;
			}
		break;
		}
		SearchSuggest.HintCurSelect = cur;
		
	},
	
	
	CheckCache : function(eq) { 
		var cache = false;
		if (SearchSuggest.cacheQuery[eq]) {
			cache = SearchSuggest.cacheQuery[eq];
		}
		if (SearchSuggest.cacheQueryID >= SearchSuggest.cacheMaxSize) {
			SearchSuggest.cacheQuery = null;
			SearchSuggest.cacheQuery = {};
			SearchSuggest.cacheQueryID = 0;
		}
		return cache;
	},
	
	HintsGetRepeat : function(cancel) {
		SearchSuggest.operation = false;
		SearchSuggest.tmID = false;
		!cancel ? SearchSuggest.HintsGet() : null;
	},
	
		
	
	CheckOpenSock : function() {
		if (SearchSuggest.tmID !== false || SearchSuggest.operation || SearchSuggest.prevQuery === SearchSuggest.queryEncode) {
			return false;
		}
		return true;
	},
	
	CheckHints : function() {
		if (SearchSuggest.queryEncode == "" && SearchSuggest.HintsIsOpen) {
			SearchSuggest.DestroyHintsArea();
		}
	},
	
	PreventDefault : function() {
			document.onkeydown = function(e) {
			e = e || window.event;
	
			if (gebi("gogoHintQuery")) {
				if (gebi("gogoHintQuery").style.display == "block") {
					if (e.keyCode == 38 || e.keyCode == 40) {
							if (e.preventDefault) e.preventDefault();
							e.returnValue = false;
							return false;
						}
					}
			}
		}
			document.onkeypress = function(e) {
			e = e || window.event;
	
				if (gebi("gogoHintQuery")) {
					if (gebi("gogoHintQuery").style.display == "block") { 
						if (e.keyCode == 38 || e.keyCode == 40) { 
							if (e.preventDefault) e.preventDefault();
								e.returnValue = false;
								return false;
							}
						}
					}
			}
	}


}
//]]>
