(function(a){a.fn.autocompleteplugin=function(a){return this.each(function(){return new b(this,a)})};var d=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\"].join("|\\")+")","g"),c=function(c,e,a){var b="("+a.replace(d,"\\$1")+")";return c.replace(new RegExp(b,"gi"),"<strong>$1</strong>")},b=function(d,b){this.el=a(d);this.el.attr("autocompleteplugin","off");this.suggestions=[];this.data=[];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:c,delimiter:null};b&&a.extend(this.options,b);if(this.options.lookup){this.isLocal=true;if(a.isArray(this.options.lookup))this.options.lookup={suggestions:this.options.lookup,data:[]}}this.initialize()};b.prototype={killerFn:null,initialize:function(){var b,d;b=this;d=Math.max.apply(null,a.map(a("body > *"),function(c){var b=a(c).css("position");if(b==="absolute"||b==="relative")return parseInt(a(c).css("z-index"),10)||1}));this.killerFn=function(c){if(a(c.target).parents(".autocomplete").size()===0){b.killSuggestions();b.disableKillerFn()}};var e=(new Date).getTime(),c="Autocomplete_"+e;if(!this.options.width)this.options.width=this.el.width();this.mainContainerId="AutocompleteContainter_"+e;a('<div id="'+this.mainContainerId+'" style="position:absolute;z-index:'+d+'"><div class="autocomplete-w1"><div class="autocomplete" id="'+c+'" style="display:none; width:'+this.options.width+'px;"></div></div></div>').appendTo("body");this.container=a("#"+c);this.fixPosition();if(window.opera)this.el.keypress(function(a){b.onKeyPress(a)});else this.el.keydown(function(a){b.onKeyPress(a)});this.el.keyup(function(a){b.onKeyUp(a)});this.el.blur(function(){b.enableKillerFn()});this.el.focus(function(){b.fixPosition()});this.container.css({maxHeight:this.options.maxHeight+"px"})},fixPosition:function(){var b=this.el.offset();a("#"+this.mainContainerId).css({top:b.top+this.el.innerHeight()+"px",left:b.left+"px"})},enableKillerFn:function(){var b=this;a(document).bind("click",b.killerFn)},disableKillerFn:function(){var b=this;a(document).unbind("click",b.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.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(b){switch(b.keyCode){case 38:case 40:return}clearInterval(this.onChangeInterval);if(this.currentValue!==this.el.val())if(this.options.deferRequestBy>0){var a=this;this.onChangeInterval=setInterval(function(){a.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(d){var c,b;c=this.options.delimiter;if(!c)return a.trim(d);b=d.split(c);return a.trim(b[b.length-1])},getSuggestionsLocal:function(f){var b,a,e,d;a=this.options.lookup;e=a.suggestions.length;b={suggestions:[],data:[]};for(var c=0;c<e;c++){d=a.suggestions[c];if(d.toLowerCase().indexOf(f.toLowerCase())===0){b.suggestions.push(d);b.data.push(a.data[c])}}return b},getSuggestions:function(d){var b,c,e;b=this.isLocal?this.getSuggestionsLocal(d):this.cachedResponse[d];if(b&&a.isArray(b.suggestions)){this.suggestions=b.suggestions;this.data=b.data;this.suggest()}else if(!this.isBadQuery(d)){c=this;c.options.params.query=d;a.get(this.serviceUrl,c.options.params,function(a){c.processResponse(a)},"text")}},isBadQuery:function(b){var a=this.badQueries.length;while(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();return}var d,e,c,f;d=this;e=this.suggestions.length;f=this.options.fnFormatResult;v=this.getQuery(this.currentValue);this.container.hide().empty();for(var b=0;b<e;b++){c=a((d.selectedIndex===b?'<div class="selected"':"<div")+' title="'+this.data[b]+'">'+f(this.suggestions[b],this.data[b],v)+"</div>");c.mouseover(function(a){return function(){d.activate(a)}}(b));c.click(function(a){return function(){d.select(a)}}(b));this.container.append(c)}this.enabled=true;this.container.show()},processResponse:function(c){var b;try{b=eval("("+c+")")}catch(d){return}if(!a.isArray(b.data))b.data=[];this.cachedResponse[b.query]=b;b.suggestions.length===0&&this.badQueries.push(b.query);if(b.query===this.getQuery(this.currentValue)){this.suggestions=b.suggestions;this.data=b.data;this.suggest()}},activate:function(d){var b=this.container.children(),c;this.selectedIndex!==-1&&b.length>this.selectedIndex&&a(b.get(this.selectedIndex)).attr("class","");this.selectedIndex=d;if(this.selectedIndex!==-1&&b.length>this.selectedIndex){c=b.get(this.selectedIndex);a(c).attr("class","selected")}return c},deactivate:function(b,a){b.className="";if(this.selectedIndex===a)this.selectedIndex=-1},select:function(c){var a=this.data[c];if(a){this.el.val(a);if(this.options.autoSubmit){var b=this.el.parents("form");b.length>0&&b.get(0).submit()}this.ignoreValueChange=true;this.hide();this.onSelect(c)}},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(e){var c,a,b,d;c=this.activate(e);a=c.offsetTop;b=this.container.scrollTop();d=b+this.options.maxHeight-25;if(a<b)this.container.scrollTop(a);else a>d&&this.container.scrollTop(a-this.options.maxHeight+25)},onSelect:function(f){var b,c,e,g,d;b=this;c=b.options.onSelect;e=function(c){var e,a;e=b.options.delimiter;a=b.currentValue;if(!e)return c;var d=a.split(e);return d.length===1?c:a.substr(0,a.length-d[d.length-1].length)+c};g=b.suggestions[f];d=b.data[f];b.el.val(e(d));a.isFunction(c)&&c(g,d)}}})(jQuery)
