kapp.namespace('suggest');kapp.suggest.AutoSuggest=function(id,param){if(!document.getElementById)return 0;this.fld=$(id);if(!this.fld)return 0;this.sInp="";this.nInpC=0;this.aSug=[];this.iHigh=0;var defaults={minchars:1,meth:"get",varname:"input",className:"autosuggest",timeout:2500,delay:500,offsety:-5,shownoresults:true,noresults:"No results!",maxheight:250,cache:true,maxentries:25};this.oP=param?$H(defaults).merge(param)._object:{};var p=this;Event.observe(this.fld,'keypress',p.onKeyPress.bind(this));Event.observe(this.fld,'keyup',p.onKeyUp.bind(this));Event.observe(this.fld,'blur',p.clearSuggestions.bind(this));this.fld.setAttribute("autocomplete","off")};kapp.suggest.AutoSuggest.prototype.onKeyPress=function(ev){var key=(window.event)?window.event.keyCode:ev.keyCode;var RETURN=13;var TAB=9;var ESC=27;var bubble=1;switch(key){case RETURN:this.setHighlightedValue.bind(this).call();bubble=0;break;case ESC:this.clearSuggestions.bind(this).call();break}return bubble};kapp.suggest.AutoSuggest.prototype.onKeyUp=function(ev){var key=(window.event)?window.event.keyCode:ev.keyCode;var ARRUP=38;var ARRDN=40;var bubble=1;switch(key){case ARRUP:this.changeHighlight.bind(this,key).call();bubble=0;break;case ARRDN:this.changeHighlight.bind(this,key).call();bubble=0;break;default:this.getSuggestions.bind(this,this.fld.value).call()}return bubble};kapp.suggest.AutoSuggest.prototype.getSuggestions=function(val){if(val==this.sInp)return 0;if($(this.idAs))$(this.idAs).remove();this.sInp=val;if(val.length<this.oP.minchars){this.aSug=[];this.nInpC=val.length;return 0}var ol=this.nInpC;this.nInpC=val.length?val.length:0;var l=this.aSug.length;if(this.nInpC>ol&&l&&l<this.oP.maxentries&&this.oP.cache){var arr=[];for(var i=0;i<l;i++){if(this.aSug[i]&&this.aSug[i].value&&this.aSug[i].value.substr(0,val.length).toLowerCase()==val.toLowerCase())arr.push(this.aSug[i])};this.aSug=arr;this.createList(this.aSug);return false}else{var pointer=this;var input=this.sInp;clearTimeout(this.ajID);this.ajID=setTimeout(pointer.doAjaxRequest.bind(this,input),this.oP.delay)};return false};kapp.suggest.AutoSuggest.prototype.doAjaxRequest=function(input){if(input!=this.fld.value)return false;var pointer=this;if(typeof(this.oP.script)=="function")var url=this.oP.script(encodeURIComponent(this.sInp));else var url=this.oP.script+encodeURIComponent(this.sInp);if(!url)return false;var meth=this.oP.meth;var input=this.sInp;var onSuccessFunc=function(req){pointer.setSuggestions(req,input)};var onErrorFunc=function(status){alert("AJAX error: "+status)};new Ajax.Request(url,{'method':meth,onSuccess:onSuccessFunc,onFailure:onErrorFunc})};kapp.suggest.AutoSuggest.prototype.setSuggestions=function(req,input){if(input!=this.fld.value)return false;this.aSug=[];if(this.oP.json){var jsondata=eval('('+req.responseText+')');for(var i=0;i<jsondata.results.length;i++){this.aSug.push({'id':jsondata.results[i].id,'value':jsondata.results[i].value,'info':jsondata.results[i].info})}}else{var xml=req.responseXML;var results=xml.getElementsByTagName('results')[0].childNodes;for(var i=0;i<results.length;i++){if(results[i].hasChildNodes())this.aSug.push({'id':results[i].getAttribute('id'),'value':results[i].childNodes[0].nodeValue,'info':results[i].getAttribute('info')})}};this.idAs="as_"+this.fld.id;this.createList(this.aSug)};kapp.suggest.AutoSuggest.prototype.createList=function(arr){var pointer=this;if($(this.idAs))$(this.idAs).remove();this.killTimeout();if(arr.length==0&&!this.oP.shownoresults)return false;var div=new Element("div",{'id':this.idAs,'class':this.oP.className});this.ul=new Element("ul",{'id':"as_ul"});for(var i=0;i<arr.length;i++){var val=arr[i].value;var st=val.toLowerCase().indexOf(this.sInp.toLowerCase());var output=val.substring(0,st)+"<span>"+val.substring(st,st+this.sInp.length)+"</span>"+val.substring(st+this.sInp.length);var li=new Element("li").update(output);li.name=i+1;Event.observe(li,'click',pointer.setHighlightedValue.bind(this));Event.observe(li,'mouseover',pointer.setHighlight.bind(this,li.name));this.ul.appendChild(li)};if(arr.length==0&&this.oP.shownoresults){var li=new Element("li",{'class':"as_warning"}).update(this.oP.noresults);this.ul.appendChild(li)};div.appendChild(this.ul);var pos=$(this.fld).cumulativeOffset();div.style.left=pos.left+"px";div.style.top=(pos.top+this.fld.offsetHeight+this.oP.offsety+10)+"px";div.style.width=this.fld.offsetWidth+"px";Event.observe(div,'mouseover',function(){pointer.killTimeout.bind(this)});Event.observe(div,'mouseout',function(){pointer.resetTimeout.bind(this)});document.getElementsByTagName("body")[0].appendChild(div);this.iHigh=0;var pointer=this;this.toID=setTimeout(function(){pointer.clearSuggestions()},this.oP.timeout)};kapp.suggest.AutoSuggest.prototype.changeHighlight=function(key){var list=this.ul;if(!list)return false;var n;if(key==40)n=this.iHigh+1;else if(key==38)n=this.iHigh-1;if(n>list.childNodes.length)n=list.childNodes.length;if(n<1)n=1;this.setHighlight.bind(this,n).call()};kapp.suggest.AutoSuggest.prototype.setHighlight=function(n){var list=this.ul;if(!list)return false;if(this.iHigh>0)this.clearHighlight.bind(this).call();this.iHigh=Number(n);list.childNodes[this.iHigh-1].addClassName("highlight");this.killTimeout()};kapp.suggest.AutoSuggest.prototype.clearHighlight=function(){var list=this.ul;if(!list)return false;if(this.iHigh>0){list.childNodes[this.iHigh-1].removeClassName("highlight");this.iHigh=0}};kapp.suggest.AutoSuggest.prototype.setHighlightedValue=function(){if(this.iHigh){this.sInp=this.fld.value=this.aSug[this.iHigh-1].value;this.fld.focus();if(this.fld.selectionStart)this.fld.setSelectionRange(this.sInp.length,this.sInp.length);this.clearSuggestions();if(typeof(this.oP.callback)=="function")this.oP.callback(this.aSug[this.iHigh-1])}};kapp.suggest.AutoSuggest.prototype.killTimeout=function(){clearTimeout(this.toID)};kapp.suggest.AutoSuggest.prototype.resetTimeout=function(){clearTimeout(this.toID);this.toID=setTimeout(this.clearSuggestions.bind(this),1000)};kapp.suggest.AutoSuggest.prototype.clearSuggestions=function(){this.killTimeout();var ele=$(this.idAs);var pointer=this;if(ele){var fade=new Effect.Fade(ele,{from:1,to:0,duration:.25,onComplete:function(){$(pointer.idAs).remove()}})}};kapp.suggest.as=new kapp.suggest.AutoSuggest('searchText',{script:"/suggest/",json:true,maxresults:5,shownoresults:false,timeout:5000,cache:false});
