var Autocomplete=function(b,a){this.el=$(b);this.id=this.el.identify();this.el.setAttribute("autocomplete","off");this.suggestions=[];this.quantidade=[];this.data=[];this.badQueries=[];this.selectedIndex=-1;this.currentValue=this.el.value;this.intervalId=0;this.cachedResponse=[];this.onChangeInterval=this.instanceId=null;this.ignoreValueChange=false;this.serviceUrl=a.serviceUrl;this.options={autoSubmit:false,minChars:1,maxHeight:300,deferRequestBy:0,width:0,container:null,showResults:0};a&&Object.extend(this.options, a);Autocomplete.isDomLoaded?this.initialize():Event.observe(document,"dom:loaded",this.initialize.bind(this),false)};Autocomplete.instances=[];Autocomplete.isDomLoaded=false;Autocomplete.getInstance=function(b){for(var a=Autocomplete.instances,c=a.length;c--;)if(a[c].id===b)return a[c]};Autocomplete.highlight=function(b,a){return b.replace(a,function(c){return"<strong>"+c+"</strong>"})}; Autocomplete.prototype={killerFn:null,initialize:function(){var b=this;this.killerFn=function(c){if(!$(Event.element(c)).up(".autocomplete")){b.killSuggestions();b.disableKillerFn()}}.bindAsEventListener(this);if(!this.options.width)this.options.width=this.el.getWidth();var a=new Element("div",{style:"position:absolute;"});a.update('<div class="autocomplete-w1"><div class="autocomplete-w2"><div class="autocomplete" id="Autocomplete_'+this.id+'" style="display:none; width:'+this.options.width+'px;"></div></div></div>'); this.options.container=$(this.options.container);if(this.options.container){this.options.container.appendChild(a);this.fixPosition=function(){}}else document.body.appendChild(a);this.mainContainerId=a.identify();this.container=$("Autocomplete_"+this.id);this.fixPosition();Event.observe(this.el,window.opera?"keypress":"keydown",this.onKeyPress.bind(this));Event.observe(this.el,"keyup",this.onKeyUp.bind(this));Event.observe(this.el,"blur",this.enableKillerFn.bind(this));Event.observe(this.el,"focus", this.fixPosition.bind(this));this.container.setStyle({maxHeight:this.options.maxHeight+"px"});this.instanceId=Autocomplete.instances.push(this)-1},fixPosition:function(){var b=this.el.cumulativeOffset();$(this.mainContainerId).setStyle({top:b.top+this.el.getHeight()+"px",left:b.left+"px"})},enableKillerFn:function(){Event.observe(document.body,"click",this.killerFn)},disableKillerFn:function(){Event.stopObserving(document.body,"click",this.killerFn)},killSuggestions:function(){this.stopKillSuggestions(); this.intervalId=window.setInterval(function(){this.hide();this.stopKillSuggestions()}.bind(this),300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},onKeyPress:function(b){if(this.enabled){switch(b.keyCode){case Event.KEY_ESC:this.el.value=this.currentValue;this.hide();break;case Event.KEY_TAB:case Event.KEY_RETURN:if(this.selectedIndex===-1){this.hide();return}this.select(this.selectedIndex);if(b.keyCode===Event.KEY_TAB)return;break;case Event.KEY_UP:this.moveUp();break;case Event.KEY_DOWN:this.moveDown(); break;default:return}Event.stop(b)}},onKeyUp:function(b){switch(b.keyCode){case Event.KEY_UP:case Event.KEY_DOWN:return}clearInterval(this.onChangeInterval);if(this.currentValue!==this.el.value)if(this.options.deferRequestBy>0)this.onChangeInterval=setInterval(function(){this.onValueChange()}.bind(this),this.options.deferRequestBy);else this.onValueChange()},onValueChange:function(){clearInterval(this.onChangeInterval);this.currentValue=this.el.value;this.selectedIndex=-1;if(this.ignoreValueChange)this.ignoreValueChange= false;else this.currentValue===""||this.currentValue.length<this.options.minChars?this.hide():this.getSuggestions()},getSuggestions:function(){var b=this.cachedResponse[this.currentValue];if(b&&Object.isArray(b.suggestions)){this.suggestions=b.suggestions;this.data=b.data;this.suggest()}else this.isBadQuery(this.currentValue)||new Ajax.Request(this.serviceUrl,{parameters:{query:this.currentValue},onComplete:this.processResponse.bind(this),method:"get"})},isBadQuery:function(b){for(var a=this.badQueries.length;a--;)if(b.indexOf(this.badQueries[a])=== 0)return true;return false},hide:function(){this.enabled=false;this.selectedIndex=-1;this.container.hide()},suggest:function(){if(this.suggestions.length===0)this.hide();else{var b=[],a="",c=new RegExp("\\b"+this.currentValue.match(/\w+/g).join("|\\b"),"gi");this.suggestions.each(function(e,d){if(this.options.showResults)a=this.data[d];b.push(this.selectedIndex===d?'<div class="selected"':"<div",' title="',this.suggestions[d],'" onclick="Autocomplete.instances[',this.instanceId,"].select(",d,');" onmouseover="Autocomplete.instances[', this.instanceId,"].activate(",d,');">','<div class="suggestions">'+Autocomplete.highlight(this.suggestions[d],c)+'</div><div class="suggestionsResults">'+a+"</div>","</div>")}.bind(this));this.enabled=true;this.container.update(b.join("")).show()}},processResponse:function(b){var a;try{a=b.responseText.evalJSON();if(!Object.isArray(a.data))a.data=[]}catch(c){return}this.cachedResponse[a.query]=a;a.suggestions.length===0&&this.badQueries.push(a.query);if(a.query===this.currentValue){this.suggestions= a.suggestions;this.data=a.data;this.suggest()}},activate:function(b){var a=this.container.childNodes,c;if(this.selectedIndex!==-1&&a.length>this.selectedIndex)a[this.selectedIndex].className="";this.selectedIndex=b;if(this.selectedIndex!==-1&&a.length>this.selectedIndex){c=a[this.selectedIndex];c.className="selected"}return c},deactivate:function(b,a){b.className="";if(this.selectedIndex===a)this.selectedIndex=-1},select:function(b){var a=this.suggestions[b];if(a){this.el.value=a;this.options.autoSubmit&& this.el.form&&this.el.form.submit();this.ignoreValueChange=true;this.hide();this.onSelect(b)}},moveUp:function(){if(this.selectedIndex!==-1)if(this.selectedIndex===0){this.container.childNodes[0].className="";this.selectedIndex=-1;this.el.value=this.currentValue}else this.adjustScroll(this.selectedIndex-1)},moveDown:function(){this.selectedIndex!==this.suggestions.length-1&&this.adjustScroll(this.selectedIndex+1)},adjustScroll:function(b){var a=this.container,c=this.activate(b).offsetTop,e=a.scrollTop, d=e+this.options.maxHeight-25;if(c<e)a.scrollTop=c;else if(c>d)a.scrollTop=c-this.options.maxHeight+25;this.el.value=this.suggestions[b].replace(/&emsp;/g,"")},onSelect:function(b){(this.options.onSelect||Prototype.emptyFunction)(this.suggestions[b].replace(/&emsp;/g,""),this.data[b])}};Event.observe(document,"dom:loaded",function(){Autocomplete.isDomLoaded=true},false);
