(function($){function Autocomplete(a,b){this.el=$(a);this.el.attr("autocomplete","off");this.suggestions=[];this.data=[];this.datav2=[];this.badQueries=[];this.selectedIndex=-1;this.currentValue=this.el.val();this.intervalId=0;this.cachedResponse=[];this.onChangeInterval=null;this.ignoreValueChange=false;this.serviceUrl=b.serviceUrl;this.isLocal=false;this.options={autoSubmit:false,minChars:1,maxHeight:300,deferRequestBy:0,width:0,highlight:true,params:{},fnFormatResult:fnFormatResult,delimiter:null,zIndex:9999};this.initialize();this.setOptions(b)}function fnFormatResult(a,b,c){var d="("+c.replace(reEscape,"\\$1")+")";return a.replace(new RegExp(d,"gi"),"<strong>$1</strong>")}var reEscape=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\"].join("|\\")+")","g");$.fn.autocomplete=function(a){return new Autocomplete(this.get(0)||$("<input />"),a)};Autocomplete.prototype={killerFn:null,initialize:function(){var a,b,c;a=this;b=Math.floor(Math.random()*1048576).toString(16);c="Autocomplete_"+b;this.killerFn=function(b){if($(b.target).parents(".autocomplete").size()===0){a.killSuggestions();a.disableKillerFn()}};if(!this.options.width){this.options.width=this.el.width()}this.mainContainerId="AutocompleteContainter_"+b;$('<div id="'+this.mainContainerId+'" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="'+c+'" style="display:none; width:300px;"></div></div></div>').appendTo("body");this.container=$("#"+c);this.fixPosition();if(window.opera){this.el.keypress(function(b){a.onKeyPress(b)})}else{this.el.keydown(function(b){a.onKeyPress(b)})}this.el.keyup(function(b){a.onKeyUp(b)});this.el.blur(function(){a.enableKillerFn()});this.el.focus(function(){a.fixPosition()})},setOptions:function(a){var b=this.options;$.extend(b,a);if(b.lookup){this.isLocal=true;if($.isArray(b.lookup)){b.lookup={suggestions:b.lookup,data:[]}}}$("#"+this.mainContainerId).css({zIndex:b.zIndex});this.container.css({maxHeight:b.maxHeight+"px",width:b.width})},clearCache:function(){this.cachedResponse=[];this.badQueries=[]},disable:function(){this.disabled=true},enable:function(){this.disabled=false},fixPosition:function(){var a=this.el.offset();$("#"+this.mainContainerId).css({top:a.top+this.el.innerHeight()+"px",left:a.left+"px"})},enableKillerFn:function(){var a=this;$(document).bind("click",a.killerFn)},disableKillerFn:function(){var a=this;$(document).unbind("click",a.killerFn)},killSuggestions:function(){var a=this;this.stopKillSuggestions();this.intervalId=window.setInterval(function(){a.hide();a.stopKillSuggestions()},300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},onKeyPress:function(a){if(this.disabled||!this.enabled){return}switch(a.keyCode){case 27:this.el.val(this.currentValue);this.hide();break;case 9:case 13:if(this.selectedIndex===-1){this.hide();return}this.select(this.selectedIndex);if(a.keyCode===9){return}break;case 38:this.moveUp();break;case 40:this.moveDown();break;default:return}a.stopImmediatePropagation();a.preventDefault()},onKeyUp:function(a){if(this.disabled){return}switch(a.keyCode){case 38:case 40:return}clearInterval(this.onChangeInterval);if(this.currentValue!==this.el.val()){if(this.options.deferRequestBy>0){var b=this;this.onChangeInterval=setInterval(function(){b.onValueChange()},this.options.deferRequestBy)}else{this.onValueChange()}}},onValueChange:function(){clearInterval(this.onChangeInterval);this.currentValue=this.el.val();var a=this.getQuery(this.currentValue);this.selectedIndex=-1;if(this.ignoreValueChange){this.ignoreValueChange=false;return}if(a===""||a.length<this.options.minChars){this.hide()}else{this.getSuggestions(a)}},getQuery:function(a){var b,c;b=this.options.delimiter;if(!b){return $.trim(a)}c=a.split(b);return $.trim(c[c.length-1])},getSuggestionsLocal:function(a){var b,c,d,e,f;c=this.options.lookup;d=c.suggestions.length;b={suggestions:[],data:[]};a=a.toLowerCase();for(f=0;f<d;f++){e=c.suggestions[f];if(e.toLowerCase().indexOf(a)===0){b.suggestions.push(e);b.data.push(c.data[f])}}return b},getSuggestions:function(a){var b,c;b=this.isLocal?this.getSuggestionsLocal(a):this.cachedResponse[a];if(b&&$.isArray(b.suggestions)){this.suggestions=b.suggestions;this.data=b.data;this.suggest()}else if(!this.isBadQuery(a)){c=this;c.options.params.query=a;$.get(this.serviceUrl,c.options.params,function(a){c.processResponse(a)},"text")}},isBadQuery:function(a){var b=this.badQueries.length;while(b--){if(a.indexOf(this.badQueries[b])===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();return}var a,b,c,d,e,f,g,h,i;a=this;b=this.suggestions.length;d=this.options.fnFormatResult;e=this.getQuery(this.currentValue);h=function(b){return function(){a.activate(b)}};i=function(b){return function(){a.select(b)}};this.container.hide().empty();for(f=0;f<b;f++){g=this.suggestions[f];c=$((a.selectedIndex===f?'<div class="selected"':"<div")+' title="'+a.datav2[f]+'">'+d(g,this.data[f],e)+"</div>");c.mouseover(h(f));c.click(i(f));this.container.append(c)}this.enabled=true;this.container.show()},processResponse:function(text){var response;try{response=eval("("+text+")")}catch(err){return}if(!$.isArray(response.data)){response.data=[]}if(!this.options.noCache){this.cachedResponse[response.query]=response;if(response.suggestions.length===0){this.badQueries.push(response.query)}}if(response.query===this.getQuery(this.currentValue)){this.suggestions=response.suggestions;this.data=response.data;this.datav2=response.datav2;this.suggest()}},activate:function(a){var b,c;b=this.container.children();if(this.selectedIndex!==-1&&b.length>this.selectedIndex){$(b.get(this.selectedIndex)).removeClass()}this.selectedIndex=a;if(this.selectedIndex!==-1&&b.length>this.selectedIndex){c=b.get(this.selectedIndex);$(c).addClass("selected")}return c},deactivate:function(a,b){a.className="";if(this.selectedIndex===b){this.selectedIndex=-1}},select:function(a){var b,c;b=this.suggestions[a];if(b){this.el.val(b);if(this.options.autoSubmit){c=this.el.parents("form");if(c.length>0){c.get(0).submit()}}this.ignoreValueChange=true;this.hide();this.onSelect(a)}},moveUp:function(){if(this.selectedIndex===-1){return}if(this.selectedIndex===0){this.container.children().get(0).className="";this.selectedIndex=-1;this.el.val(this.currentValue);return}this.adjustScroll(this.selectedIndex-1)},moveDown:function(){if(this.selectedIndex===this.suggestions.length-1){return}this.adjustScroll(this.selectedIndex+1)},adjustScroll:function(a){var b,c,d,e;b=this.activate(a);c=b.offsetTop;d=this.container.scrollTop();e=d+this.options.maxHeight-25;if(c<d){this.container.scrollTop(c)}else if(c>e){this.container.scrollTop(c-this.options.maxHeight+25)}this.el.val(this.getValue(this.datav2[a]))},onSelect:function(a){var b,c,d,e;b=this;c=b.options.onSelect;d=b.datav2[a];e=b.data[a];b.el.val(b.getValue(d));if($.isFunction(c)){c(d,e,b.el)}},getValue:function(a){var b,c,d,e;e=this;b=e.options.delimiter;if(!b){return a}c=e.currentValue;d=c.split(b);if(d.length===1){return a}return c.substr(0,c.length-d[d.length-1].length)+a}}})(jQuery)
