function AutoSuggest(B){this.options={bindElement:"suggest_input",suggestElement:"auto_suggest",ajax:{url:"request.php",params:"func=matches&input="},className:"suggestion_list",suggestPrepend:""};if(B!=null){this.options=$merge(this.options,B)}var C=this;this.elem=this.options.bindElement;this.eligible=new Array();this.inputText=null;this.highlighted=-1;this.div=this.options.suggestElement;this.div.setStyles({"z-index":42,display:"none"});this.requestCache=new Hash();C.fix=new OverlayFix(this.div);var A=9;var F=13;var E=27;var D=38;var H=40;this.elem.setAttribute("autocomplete","off");if(!this.elem.id){var G="autosuggest"+idCounter;idCounter++;this.elem.id=G}this.elem.onkeydown=function(J){var I=C.getKeyCode(J);switch(I){case F:case A:C.useSuggestion();break;case E:C.fix.hide();C.hideDiv();break;case D:if(C.highlighted>0){C.highlighted--}C.changeHighlight(I);break;case H:if(C.highlighted<(C.eligible.length-1)){C.highlighted++}C.changeHighlight(I);break}};this.elem.onkeyup=function(J){var I=C.getKeyCode(J);switch(I){case A:case F:case E:case D:case H:return ;default:if(this.value!=C.inputText&&this.value.length>0){C.inputText=this.value;C.getEligible()}else{if(this.value.length==0){C.inputText="";C.hideDiv()}}}};this.elem.onmouseup=function(I){C.hideDiv()};this.useSuggestion=function(){if(this.highlighted>-1){this.elem.value=this.options.suggestPrepend+_htmlentity_decode(this.eligible[this.highlighted]);this.hideDiv();setTimeout("document.getElementById('"+this.elem.id+"').focus()",0)}};this.showDiv=function(){this.div.style.display="block";this.fix.show()};this.hideDiv=function(){this.div.style.display="none";this.highlighted=-1;this.fix.hide()};this.dropdownOpen=function(){if(this.div.getStyle("display")=="none"){return false}else{return true}};this.changeHighlight=function(){var J=this.div.getElementsByTagName("LI");for(i in J){var I=J[i];try{if(this.highlighted==i){I.className="selected"}else{I.className=""}}catch(K){}}};this.positionDiv=function(){var J=this.elem;var I=0;var K=J.offsetHeight;while(J.offsetParent&&J.tagName.toUpperCase()!="BODY"){I+=J.offsetLeft;K+=J.offsetTop;J=J.offsetParent}I+=J.offsetLeft;K+=J.offsetTop;this.div.style.left=I+"px";this.div.style.top=K+"px"};this.createDiv=function(){var J=document.createElement("ul");this.eligible.each(function(N,M){var K=document.createElement("li");var L=document.createElement("a");L.href="javascript:false";L.innerHTML=N;K.appendChild(L);if(C.highlighted==M){K.className="selected"}J.appendChild(K)});this.div.replaceChild(J,this.div.childNodes[0]);var I=this.div.getElements("li");I.each(function(L,K){L.addEvent("mouseover",function(M){C.highlighted=K;C.changeHighlight()});L.addEvent("click",function(M){C.useSuggestion();C.hideDiv();C.cancelEvent(M);return false})});this.div.className=C.options.className;this.div.style.position="absolute"};this.processEligible=function(){if(C.eligible.length>0){if((C.eligible.length==1)&&(C.eligible[0]==C.inputText)){C.hideDiv()}else{C.createDiv();C.positionDiv();C.showDiv()}}else{C.hideDiv()}};this.getEligible=function(){this.eligible=new Array();if(this.requestCache.has(encodeURIComponent(C.inputText))){this.eligible=this.requestCache.get(encodeURIComponent(C.inputText));C.processEligible()}else{var I=new Request({url:C.options.ajax["url"],method:"post",onSuccess:function(K,J){C.eligible=JSON.decode(K);if(C.eligible==null){C.eligible=[]}C.requestCache.set(encodeURIComponent(C.inputText),C.eligible);C.processEligible()}});I.send(_htmlentity_decode(C.options.ajax["params"])+encodeURIComponent(C.inputText))}};this.getKeyCode=function(I){if(I){return I.keyCode}if(window.event){return window.event.keyCode}};this.getEventSource=function(I){if(I){return I.target}if(window.event){return window.event.srcElement}};this.cancelEvent=function(I){if(I){I.preventDefault();I.stopPropagation()}if(window.event){window.event.returnValue=false}}}var idCounter=0;