(function(d){d.Autocompleter=function(a,c){this.cacheData_={};this.cacheLength_=0;this.selectClass_="jquery-autocomplete-selected-item";this.lastSelectedValue_=this.lastProcessedValue_=this.lastKeyPressed_=this.keyTimeout_=null;this.active_=!1;this.finishOnBlur_=!0;if(!a||!(a instanceof jQuery)||a.length!==1||a.get(0).tagName.toUpperCase()!=="INPUT")alert("Invalid parameter for jquery.Autocompleter, jQuery object with one element with INPUT tag expected");else{this.options=typeof c==="string"?{url:c}: c;this.options.maxCacheLength=parseInt(this.options.maxCacheLength,10);if(isNaN(this.options.maxCacheLength)||this.options.maxCacheLength<1)this.options.maxCacheLength=1;this.options.minChars=parseInt(this.options.minChars,10);if(isNaN(this.options.minChars)||this.options.minChars<1)this.options.minChars=1;this.dom={};this.dom.$elem=a;this.options.inputClass&&this.dom.$elem.addClass(this.options.inputClass);this.dom.$results=d("<div></div>").hide();this.options.resultsClass&&this.dom.$results.addClass(this.options.resultsClass); this.dom.$results.css({position:"absolute"});d("body").append(this.dom.$results);var b=this;a.keydown(function(a){b.lastKeyPressed_=a.keyCode;switch(b.lastKeyPressed_){case 38:return a.preventDefault(),b.active_?b.focusPrev():b.activate(),!1;case 40:return a.preventDefault(),b.active_?b.focusNext():b.activate(),!1;case 9:case 13:if(b.active_)return a.preventDefault(),b.selectCurrent(),!1;break;case 27:if(b.active_)return a.preventDefault(),b.finish(),!1;break;default:b.activate()}});a.blur(function(){b.finishOnBlur_&& setTimeout(function(){b.finish()},200)})}};d.Autocompleter.prototype.position=function(){var a=this.dom.$elem.offset();this.dom.$results.css({top:a.top+this.dom.$elem.outerHeight(),left:a.left})};d.Autocompleter.prototype.cacheRead=function(a){var c,b,d,g,h;if(this.options.useCache){a=String(a);c=a.length;for(b=this.options.matchSubset?1:c;b<=c;){g=this.options.matchInside?c-b:0;for(h=0;h<=g;){d=a.substr(0,b);if(this.cacheData_[d]!==void 0)return this.cacheData_[d];h++}b++}}return!1};d.Autocompleter.prototype.cacheWrite= function(a,c){return this.options.useCache?(this.cacheLength_>=this.options.maxCacheLength&&this.cacheFlush(),a=String(a),this.cacheData_[a]!==void 0&&this.cacheLength_++,this.cacheData_[a]=c):!1};d.Autocompleter.prototype.cacheFlush=function(){this.cacheData_={};this.cacheLength_=0};d.Autocompleter.prototype.callHook=function(a,c){var b=this.options[a];return b&&d.isFunction(b)?b(c,this):!1};d.Autocompleter.prototype.activate=function(){var a=this,c=parseInt(this.options.delay,10);if(isNaN(c)||c<= 0)c=250;this.keyTimeout_&&clearTimeout(this.keyTimeout_);this.keyTimeout_=setTimeout(function(){a.activateNow()},c)};d.Autocompleter.prototype.activateNow=function(){var a=this.dom.$elem.val();if(a!==this.lastProcessedValue_&&a!==this.lastSelectedValue_&&a.length>=this.options.minChars)this.active_=!0,this.lastProcessedValue_=a,this.fetchData(a)};d.Autocompleter.prototype.fetchData=function(a){if(this.options.data)this.filterAndShowResults(this.options.data,a);else{var c=this;this.fetchRemoteData(a, function(b){c.filterAndShowResults(b,a)})}};d.Autocompleter.prototype.fetchRemoteData=function(a,c){var b=this.cacheRead(a);if(b)c(b);else{var e=this;this.dom.$elem.addClass(this.options.loadingClass);var g=function(b){var d=!1;b!==!1&&(d=e.parseRemoteData(b),e.cacheWrite(a,d));e.dom.$elem.removeClass(e.options.loadingClass);c(d)};d.ajax({url:this.makeUrl(a),success:g,error:function(){g(!1)}})}};d.Autocompleter.prototype.setExtraParam=function(a,c){var b=d.trim(String(a));if(b){if(!this.options.extraParams)this.options.extraParams= {};this.options.extraParams[b]!==c&&(this.options.extraParams[b]=c,this.cacheFlush())}};d.Autocompleter.prototype.makeUrl=function(a){var c=this,b=this.options.paramName||"q",e=this.options.url,g=d.extend({},this.options.extraParams);this.options.paramName===!1?e+=encodeURIComponent(a):g[b]=a;var h=[];d.each(g,function(a,b){h.push(c.makeUrlParam(a,b))});h.length&&(e+=e.indexOf("?")==-1?"?":"&",e+=h.join("&"));return e};d.Autocompleter.prototype.makeUrlParam=function(a,c){return String(a)+"="+encodeURIComponent(c)}; d.Autocompleter.prototype.parseRemoteData=function(a){for(var c=[],b,d,g,h=String(a).replace("\r\n","\n").split("\n"),a=0;a<h.length;a++){g=h[a].split("|");d=[];for(b=0;b<g.length;b++)d.push(unescape(g[b]));b=d.shift();c.push({value:unescape(b),data:d})}return c};d.Autocompleter.prototype.filterAndShowResults=function(a,c){this.showResults(this.filterResults(a,c),c)};d.Autocompleter.prototype.filterResults=function(a,c){var b=[],e,g,h,f,i,j="",k=RegExp("[.*+?|()\\[\\]{}\\\\]","g");for(h=0;h<a.length;h++){f= a[h];i=typeof f;if(i==="string")e=f,g={};else if(d.isArray(f))e=f[0],g=f.slice(1);else if(i==="object")e=f.value,g=f.data;e=String(e);e>""&&(typeof g!=="object"&&(g={}),f=!this.options.filterResults,f||(f=String(c),f=f.replace(k,"\\$&"),this.options.matchInside||(f="^"+f),this.options.matchCase||(j="i"),f=RegExp(f,j),f=f.test(e)),f&&b.push({value:e,data:g}))}this.options.sortResults&&(b=this.sortResults(b,c));if(this.options.maxItemsToShow>0&&this.options.maxItemsToShow<b.length)b.length=this.options.maxItemsToShow; return b};d.Autocompleter.prototype.sortResults=function(a,c){var b=this,e=this.options.sortFunction;d.isFunction(e)||(e=function(a,c,d){return b.sortValueAlpha(a,c,d)});a.sort(function(a,b){return e(a,b,c)});return a};d.Autocompleter.prototype.sortValueAlpha=function(a,c){a=String(a.value);c=String(c.value);this.options.matchCase||(a=a.toLowerCase(),c=c.toLowerCase());return a>c?1:a<c?-1:0};d.Autocompleter.prototype.showResults=function(a,c){var b=this,e=d("<ul></ul>"),g,h,f,i=!1,j=!1,k=a.length; for(g=0;g<k;g++)h=a[g],f=d("<li>"+this.showResult(h.value,h.data)+"</li>"),f.data("value",h.value),f.data("data",h.data),f.click(function(){var a=d(this);b.selectItem(a)}).mousedown(function(){b.finishOnBlur_=!1}).mouseup(function(){b.finishOnBlur_=!0}),e.append(f),i===!1&&(i=String(h.value),j=f,f.addClass(this.options.firstItemClass)),g==k-1&&f.addClass(this.options.lastItemClass);this.position();this.dom.$results.html(e).show();e=this.dom.$results.outerWidth()-this.dom.$results.width();this.dom.$results.width(this.dom.$elem.outerWidth()- e);d("li",this.dom.$results).hover(function(){b.focusItem(this)},function(){});this.autoFill(i,c)&&this.focusItem(j)};d.Autocompleter.prototype.showResult=function(a,c){return d.isFunction(this.options.showResult)?this.options.showResult(a,c):a};d.Autocompleter.prototype.autoFill=function(a,c){var b,d,g,h;return this.options.autoFill&&this.lastKeyPressed_!=8&&(b=String(a).toLowerCase(),d=String(c).toLowerCase(),g=a.length,h=c.length,b.substr(0,h)===d)?(this.dom.$elem.val(a),this.selectRange(h,g), !0):!1};d.Autocompleter.prototype.focusNext=function(){this.focusMove(1)};d.Autocompleter.prototype.focusPrev=function(){this.focusMove(-1)};d.Autocompleter.prototype.focusMove=function(a){var c,b=d("li",this.dom.$results),a=parseInt(a,10);for(c=0;c<b.length;c++)if(d(b[c]).hasClass(this.selectClass_)){this.focusItem(c+a);return}this.focusItem(0)};d.Autocompleter.prototype.focusItem=function(a){var c=d("li",this.dom.$results);c.length&&(c.removeClass(this.selectClass_).removeClass(this.options.selectClass), typeof a==="number"?(a=parseInt(a,10),a<0?a=0:a>=c.length&&(a=c.length-1),a=d(c[a])):a=d(a),a&&a.addClass(this.selectClass_).addClass(this.options.selectClass))};d.Autocompleter.prototype.selectCurrent=function(){var a=d("li."+this.selectClass_,this.dom.$results);a.length==1?this.selectItem(a):this.finish()};d.Autocompleter.prototype.selectItem=function(a){var c=a.data("value"),a=a.data("data"),b=this.displayValue(c,a);this.lastSelectedValue_=this.lastProcessedValue_=b;this.dom.$elem.val(b).focus(); this.setCaret(b.length);this.callHook("onItemSelect",{value:c,data:a});this.finish()};d.Autocompleter.prototype.displayValue=function(a,c){return d.isFunction(this.options.displayValue)?this.options.displayValue(a,c):a};d.Autocompleter.prototype.finish=function(){this.keyTimeout_&&clearTimeout(this.keyTimeout_);this.dom.$elem.val()!==this.lastSelectedValue_&&(this.options.mustMatch&&this.dom.$elem.val(""),this.callHook("onNoMatch"));this.dom.$results.hide();this.lastProcessedValue_=this.lastKeyPressed_= null;this.active_&&this.callHook("onFinish");this.active_=!1};d.Autocompleter.prototype.selectRange=function(a,c){var b=this.dom.$elem.get(0);b.setSelectionRange?(b.focus(),b.setSelectionRange(a,c)):this.createTextRange&&(b=this.createTextRange(),b.collapse(!0),b.moveEnd("character",c),b.moveStart("character",a),b.select())};d.Autocompleter.prototype.setCaret=function(a){this.selectRange(a,a)};d.fn.autocomplete=function(a){typeof a==="string"&&(a={url:a});var c=d.extend({},d.fn.autocomplete.defaults, a);return this.each(function(){var a=d(this),e=new d.Autocompleter(a,c);a.data("autocompleter",e)})};d.fn.autocomplete.defaults={paramName:"q",minChars:1,loadingClass:"acLoading",resultsClass:"acResults",inputClass:"acInput",selectClass:"acSelect",mustMatch:!1,matchCase:!1,matchInside:!0,matchSubset:!0,useCache:!0,maxCacheLength:10,autoFill:!1,filterResults:!0,sortResults:!0,sortFunction:!1,onItemSelect:!1,onNoMatch:!1,maxItemsToShow:-1}})(jQuery);

