Clone
jquery.autocomplete.min.js
!function(e){"use strict";"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)}(function(e){"use strict";function t(n,s){var o=function(){},i=this,a={autoSelectFirst:!1,appendTo:"body",serviceUrl:null,lookup:null,onSelect:null,width:"auto",minChars:1,maxHeight:300,deferRequestBy:0,params:{},formatResult:t.formatResult,delimiter:null,zIndex:9999,type:"GET",noCache:!1,onSearchStart:o,onSearchComplete:o,containerClass:"autocomplete-suggestions",tabDisabled:!1,dataType:"text",lookupFilter:function(e,t,n){return-1!==e.value.toLowerCase().indexOf(n)},paramName:"query",transformResult:function(t){return"string"==typeof t?e.parseJSON(t):t}};i.element=n,i.el=e(n),i.suggestions=[],i.badQueries=[],i.selectedIndex=-1,i.currentValue=i.element.value,i.intervalId=0,i.cachedResponse=[],i.onChangeInterval=null,i.onChange=null,i.ignoreValueChange=!1,i.isLocal=!1,i.suggestionsContainer=null,i.options=e.extend({},a,s),i.classes={selected:"autocomplete-selected",suggestion:"autocomplete-suggestion"},i.initialize(),i.setOptions(s)}var n=function(){return{extend:function(t,n){return e.extend(t,n)},createNode:function(e){var t=document.createElement("div");return t.innerHTML=e,t.firstChild}}}(),s={ESC:27,TAB:9,RETURN:13,UP:38,DOWN:40};t.utils=n,e.Autocomplete=t,t.formatResult=function(e,t){var n=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\"].join("|\\")+")","g"),s="("+t.replace(n,"\\$1")+")";return e.value.replace(new RegExp(s,"gi"),"<strong>$1</strong>")},t.prototype={killerFn:null,initialize:function(){var n,s=this,o="."+s.classes.suggestion,i=s.classes.selected,a=s.options;s.element.setAttribute("autocomplete","off"),s.killerFn=function(t){0===e(t.target).closest("."+s.options.containerClass).length&&(s.killSuggestions(),s.disableKillerFn())},a.width&&"auto"!==a.width||(a.width=s.el.outerWidth()),s.suggestionsContainer=t.utils.createNode('<div class="'+a.containerClass+'" style="position: absolute; display: none;"></div>'),n=e(s.suggestionsContainer),n.appendTo(a.appendTo).width(a.width),n.on("mouseover.autocomplete",o,function(){s.activate(e(this).data("index"))}),n.on("mouseout.autocomplete",function(){s.selectedIndex=-1,n.children("."+i).removeClass(i)}),n.on("click.autocomplete",o,function(){s.select(e(this).data("index"),!1)}),s.fixPosition(),window.opera?s.el.on("keypress.autocomplete",function(e){s.onKeyPress(e)}):s.el.on("keydown.autocomplete",function(e){s.onKeyPress(e)}),s.el.on("keyup.autocomplete",function(e){s.onKeyUp(e)}),s.el.on("blur.autocomplete",function(){s.onBlur()}),s.el.on("focus.autocomplete",function(){s.fixPosition()})},onBlur:function(){this.enableKillerFn()},setOptions:function(t){var s=this,o=s.options;n.extend(o,t),s.isLocal=e.isArray(o.lookup),s.isLocal&&(o.lookup=s.verifySuggestionsFormat(o.lookup)),e(s.suggestionsContainer).css({"max-height":o.maxHeight+"px",width:o.width+"px","z-index":o.zIndex})},clearCache:function(){this.cachedResponse=[],this.badQueries=[]},clear:function(){this.clearCache(),this.currentValue=null,this.suggestions=[]},disable:function(){this.disabled=!0},enable:function(){this.disabled=!1},fixPosition:function(){var t,n=this;"body"===n.options.appendTo&&(t=n.el.offset(),e(n.suggestionsContainer).css({top:t.top+n.el.outerHeight()+"px",left:t.left+"px"}))},enableKillerFn:function(){var t=this;e(document).on("click.autocomplete",t.killerFn)},disableKillerFn:function(){var t=this;e(document).off("click.autocomplete",t.killerFn)},killSuggestions:function(){var e=this;e.stopKillSuggestions(),e.intervalId=window.setInterval(function(){e.hide(),e.stopKillSuggestions()},300)},stopKillSuggestions:function(){window.clearInterval(this.intervalId)},onKeyPress:function(e){var t=this;if(!t.disabled&&!t.visible&&e.keyCode===s.DOWN&&t.currentValue)return t.suggest(),void 0;if(!t.disabled&&t.visible){switch(e.keyCode){case s.ESC:t.el.val(t.currentValue),t.hide();break;case s.TAB:case s.RETURN:if(-1===t.selectedIndex)return t.hide(),void 0;if(t.select(t.selectedIndex,e.keyCode===s.RETURN),e.keyCode===s.TAB&&this.options.tabDisabled===!1)return;break;case s.UP:t.moveUp();break;case s.DOWN:t.moveDown();break;default:return}e.stopImmediatePropagation(),e.preventDefault()}},onKeyUp:function(e){var t=this;if(!t.disabled){switch(e.keyCode){case s.UP:case s.DOWN:return}clearInterval(t.onChangeInterval),t.currentValue!==t.el.val()&&(t.options.deferRequestBy>0?t.onChangeInterval=setInterval(function(){t.onValueChange()},t.options.deferRequestBy):t.onValueChange())}},onValueChange:function(){var e,t=this;return clearInterval(t.onChangeInterval),t.currentValue=t.element.value,e=t.getQuery(t.currentValue),t.selectedIndex=-1,t.ignoreValueChange?(t.ignoreValueChange=!1,void 0):(e.length<t.options.minChars?t.hide():t.getSuggestions(e),void 0)},getQuery:function(t){var n,s=this.options.delimiter;return s?(n=t.split(s),e.trim(n[n.length-1])):e.trim(t)},getSuggestionsLocal:function(t){var n=this,s=t.toLowerCase(),o=n.options.lookupFilter;return{suggestions:e.grep(n.options.lookup,function(e){return o(e,t,s)})}},getSuggestions:function(t){var n,s=this,o=s.options,i=o.serviceUrl;if(n=s.isLocal?s.getSuggestionsLocal(t):s.cachedResponse[t],n&&e.isArray(n.suggestions))s.suggestions=n.suggestions,s.suggest();else if(!s.isBadQuery(t)){if(o.params[o.paramName]=t,o.onSearchStart.call(s.element,o.params)===!1)return;e.isFunction(o.serviceUrl)&&(i=o.serviceUrl.call(s.element,t)),e.ajax({url:i,data:o.ignoreParams?null:o.params,type:o.type,dataType:o.dataType}).done(function(e){s.processResponse(e,t),o.onSearchComplete.call(s.element,t)})}},isBadQuery:function(e){for(var t=this.badQueries,n=t.length;n--;)if(0===e.indexOf(t[n]))return!0;return!1},hide:function(){var t=this;t.visible=!1,t.selectedIndex=-1,e(t.suggestionsContainer).hide()},suggest:function(){if(0===this.suggestions.length)return this.hide(),void 0;var t=this,n=t.options.formatResult,s=t.getQuery(t.currentValue),o=t.classes.suggestion,i=t.classes.selected,a=e(t.suggestionsContainer),l="";e.each(t.suggestions,function(e,t){l+='<div class="'+o+'" data-index="'+e+'">'+n(t,s)+"</div>"}),a.html(l).show(),t.visible=!0,t.options.autoSelectFirst&&(t.selectedIndex=0,a.children().first().addClass(i))},verifySuggestionsFormat:function(t){return t.length&&"string"==typeof t[0]?e.map(t,function(e){return{value:e,data:null}}):t},processResponse:function(e,t){var n=this,s=n.options,o=s.transformResult(e,t);o.suggestions=n.verifySuggestionsFormat(o.suggestions),s.noCache||(n.cachedResponse[o[s.paramName]]=o,0===o.suggestions.length&&n.badQueries.push(o[s.paramName])),t===n.getQuery(n.currentValue)&&(n.suggestions=o.suggestions,n.suggest())},activate:function(t){var n,s=this,o=s.classes.selected,i=e(s.suggestionsContainer),a=i.children();return i.children("."+o).removeClass(o),s.selectedIndex=t,-1!==s.selectedIndex&&a.length>s.selectedIndex?(n=a.get(s.selectedIndex),e(n).addClass(o),n):null},select:function(e,t){var n=this,s=n.suggestions[e];s&&(n.el.val(s),n.ignoreValueChange=t,n.hide(),n.onSelect(e))},moveUp:function(){var t=this;if(-1!==t.selectedIndex)return 0===t.selectedIndex?(e(t.suggestionsContainer).children().first().removeClass(t.classes.selected),t.selectedIndex=-1,t.el.val(t.currentValue),void 0):(t.adjustScroll(t.selectedIndex-1),void 0)},moveDown:function(){var e=this;e.selectedIndex!==e.suggestions.length-1&&e.adjustScroll(e.selectedIndex+1)},adjustScroll:function(t){var n,s,o,i=this,a=i.activate(t),l=25;a&&(n=a.offsetTop,s=e(i.suggestionsContainer).scrollTop(),o=s+i.options.maxHeight-l,s>n?e(i.suggestionsContainer).scrollTop(n):n>o&&e(i.suggestionsContainer).scrollTop(n-i.options.maxHeight+l),i.el.val(i.getValue(i.suggestions[t].value)))},onSelect:function(t){var n=this,s=n.options.onSelect,o=n.suggestions[t];n.el.val(n.getValue(o.value)),e.isFunction(s)&&s.call(n.element,o)},getValue:function(e){var t,n,s=this,o=s.options.delimiter;return o?(t=s.currentValue,n=t.split(o),1===n.length?e:t.substr(0,t.length-n[n.length-1].length)+e):e},dispose:function(){var t=this;t.el.off(".autocomplete").removeData("autocomplete"),t.disableKillerFn(),e(t.suggestionsContainer).remove()}},e.fn.autocomplete=function(n,s){var o="autocomplete";return 0===arguments.length?this.first().data(o):this.each(function(){var i=e(this),a=i.data(o);"string"==typeof n?a&&"function"==typeof a[n]&&a[n](s):(a&&a.dispose&&a.dispose(),a=new t(this,n),i.data(o,a))})}});