function calcOffset(C,A){var B=0;while(C){B+=C[A];C=C.offsetParent}return B}AC=Class.create();AC.prototype={initialize:function(A,B){this.element=$(A);this.update=$(B);this.hasFocus=false;this.changed=false;this.active=false;this.index=0;this.entryCount=0;this.cache={};this.ci="";this.options={tokens:[],onShow:function(C,D){$("ach").style.top=calcOffset(C,"offsetTop")+C.offsetHeight-1+"px";$("ach").style.left=calcOffset(C,"offsetLeft")+"px";$("ach").style.width=$("q").offsetWidth-2+"px";D.show()},onHide:function(C,D){D.hide()}};this.observer=null;this.element.autocomplete="off";this.update.hide();this.element.on("keypress",this.onKeyPress.bind(this));this.element.on("blur",this.onBlur.bind(this))},getUpdatedChoices:function(){var C=this.getToken().toUpperCase();var B=document.getElementById("chk_inthis");var A=((!B||!B.checked)?"00000000":B.value);this.ci=C+A;if(this.cache[this.ci]){this.onComplete({responseText:this.cache[this.ci]})}else{new Ajax.Request("/default_su.html",{parameters:"q="+encodeURIComponent(C)+"&c="+A,onComplete:this.onComplete.bind(this)})}},onComplete:function(request){this.cache[this.ci]=request.responseText;eval("var choices="+request.responseText);if(!this.changed&&this.hasFocus){this.update.innerHTML="";for(var i=0;i<choices.length;i++){var li=document.createElement("LI");var span11=document.createElement("SPAN");span11.className="span0";span11.innerHTML=choices[i][0];var span12=document.createElement("SPAN");span12.className=choices[i][1]>0?"span1":"span1n";span12.innerHTML=choices[i][1]>0?(choices[i][1]+" найдено"):"не найдено";li.appendChild(span11);li.appendChild(span12);li.autocompleteIndex=i;Event.observe(li,"mouseover",this.onHover.bind(this));Event.observe(li,"click",this.onClick.bind(this));this.update.appendChild(li)}this.entryCount=choices.length;this.index=-1;if(this.entryCount==1&&this.options.autoSelect){this.selectEntry();this.hide()}else{this.render()}}},hide:function(){if(this.update.visible()){this.options.onHide(this.element,this.update)}},onKeyPress:function(A){if(this.active){switch(A.keyCode){case 9:case 13:this.selectEntry();Event.stop(A);case 27:this.hide();this.active=false;Event.stop(A);return ;case 37:case 39:return ;case 38:this.index=(this.index>0)?this.index-1:this.entryCount-1;this.render();if(_.WebKit){Event.stop(A)}return ;case 40:this.index=(this.index<this.entryCount-1)?this.index+1:0;this.render();if(_.WebKit){Event.stop(A)}return }}else{if(A.keyCode==9||A.keyCode==13||(_.WebKit&&A.keyCode==0)){if(A.keyCode==13){document.forms.generic_search.submit()}return }}this.changed=true;this.hasFocus=true;if(this.observer){clearTimeout(this.observer)}this.observer=setTimeout(this.onObserverEvent.bind(this),400)},onHover:function(B){var A=Event.element(B);while(A.tagName!="LI"){A=A.parentNode}if(this.index!=A.autocompleteIndex){this.index=A.autocompleteIndex;this.render()}Event.stop(B)},onClick:function(B){var A=Event.element(B);while(A.tagName!="LI"){A=A.parentNode}this.index=A.autocompleteIndex;this.selectEntry();this.hide()},onBlur:function(A){setTimeout(this.hide.bind(this),250);this.hasFocus=false;this.active=false},render:function(){if(this.entryCount>0){for(var A=0;A<this.entryCount;A++){$(this.getEntry(A))[(this.index==A?"add":"remove")+"Class"]("selected")}if(this.hasFocus){if(!this.update.visible()){this.options.onShow(this.element,this.update)}this.active=true}}else{this.active=false;this.hide()}},getEntry:function(A){return this.update.childNodes[A]},selectEntry:function(){this.active=false;var B=this.getEntry(this.index).firstChild.innerHTML;var C=this.findLastToken();if(C!=-1){var A=this.element.value.substr(C+1).match(/^\s+/);this.element.value=this.element.value.substr(0,C+1)+(A?A[0]:"")+B}else{this.element.value=B}this.element.focus();document.forms.generic_search.submit()},onObserverEvent:function(){this.changed=false;if(this.getToken().length>=1){this.getUpdatedChoices()}else{this.active=false;this.hide()}},getToken:function(){var B=this.findLastToken();var A=(B!=-1)?this.element.value.substr(B+1).replace(/^\s+/,"").replace(/\s+$/,""):this.element.value;return/\n/.test(A)?"":A},findLastToken:function(){var C=-1;for(var B=0;B<this.options.tokens.length;B++){var A=this.element.value.lastIndexOf(this.options.tokens[B]);if(A>C){C=A}}return C}}