(function(A){A.fn.extend({autocompleteFunction:function(B,C){C=A.extend({},A.AutocompleterFunction.defaults,{userFunction:B,delay:10,max:10},C);C.highlight=C.highlight||function(D){return D};return this.each(function(){new A.AutocompleterFunction(this,C)})},result:function(B){return this.bind("result",B)},setOptions:function(B){return this.trigger("setOptions",[B])},unAutocompleteFunction:function(){return this.trigger("unAutocompleteFunction")}});A.AutocompleterFunction=function(J,G){var C={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8};var B=A(J).attr("autocompleteFunction","off").addClass(G.inputClass);var H;var N="";var K=A.AutocompleterFunction.Cache(G);var E=0;var R;var U={mouseDownOnSelect:false};var O=A.AutocompleterFunction.Select(G,J,D,U);var T;A.browser.opera&&A(J.form).bind("submit.autocompleteFunction",function(){if(T){T=false;return false}});B.bind((A.browser.opera?"keypress":"keydown")+".autocompleteFunction",function(V){E=1;R=V.keyCode;switch(V.keyCode){case C.UP:if(O.visible()){V.preventDefault();O.prev()}else{Q(0,true)}break;case C.DOWN:if(O.visible()){V.preventDefault();O.next()}else{Q(0,true)}break;case C.PAGEUP:if(O.visible()){V.preventDefault();O.pageUp()}else{Q(0,true)}break;case C.PAGEDOWN:if(O.visible()){V.preventDefault();O.pageDown()}else{Q(0,true)}break;case C.TAB:case C.RETURN:if(D()){V.preventDefault();T=true;return false}break;case C.ESC:O.hide();break;default:clearTimeout(H);H=setTimeout(Q,G.delay);break}}).focus(function(){E++}).blur(function(){E=0;if(!U.mouseDownOnSelect){P()}}).click(function(){if(E++>1&&!O.visible()){Q(0,true)}}).bind("setOptions",function(){A.extend(true,G,arguments[1])}).bind("unAutocompleteFunction",function(){O.unbind();B.unbind();A(J.form).unbind(".autocompleteFunction")});function D(){var W=O.selected();if(!W){return false}var V=W.result;N=V;B.val(V);S();B.trigger("result",[W.data,W.value]);return true}function Q(X,W){if(R==C.DEL){O.hide();return }var V=B.val();if(!W&&V==N){return }N=V;if(V.length>=G.minChars){B.addClass(G.loadingClass);V=V.toLowerCase();F(V,I)}else{L();O.hide()}}function P(){clearTimeout(H);H=setTimeout(S,200)}function S(){O.hide();clearTimeout(H);L()}function I(W,V){if(V&&V.length&&E){L();O.display(V,W);O.show()}else{S()}}function F(V,X){V=V.toLowerCase();var W=K.load(V);if(!W||!W.length){var Y={timestamp:+new Date()};A.each(G.extraParams,function(Z,a){Y[Z]=typeof a=="function"?a():a});W=G.userFunction(A.extend({q:V,limit:G.max},Y));if(typeof W=="string"){W=W.split(G.lineSeparator)}W=G.parse&&G.parse(W)||M(W);K.add(V,W)}X(V,W)}function M(X){var V=[];for(var W=0;W<X.length;W++){var Y=A.trim(X[W]);if(Y){Y=Y.split(G.cellSeparator);V[V.length]={data:Y,value:Y[0],result:G.formatResult&&G.formatResult(Y,Y[0])||Y[0]}}}return V}function L(){B.removeClass(G.loadingClass)}};A.AutocompleterFunction.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,delay:10,max:1000,extraParams:{},selectFirst:true,formatItem:function(B){return B[0]},width:0,lineSeparator:"\n",cellSeparator:"|",inputFocus:true,highlight:function(C,B){return C.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)("+B.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>")},scroll:true,scrollHeight:180,scrollJumpPosition:true};A.AutocompleterFunction.Cache=function(B){var C={};return{add:function(E,D){C[E]=D},load:function(D){if(C[D]){return C[D]}return null}}};A.AutocompleterFunction.Select=function(E,J,L,P){var I={ACTIVE:"ac_over"};var K,F=-1,R,M="",S=true,C,O;function N(){if(!S){return }C=A("<div/>").hide().addClass(E.resultsClass).css("position","absolute").appendTo(document.body).hover(function(T){if(A(this).is(":visible")){J.focus()}P.mouseDownOnSelect=false});O=A("<ul/>").appendTo(C).mouseover(function(T){if(Q(T).nodeName&&Q(T).nodeName.toUpperCase()=="LI"){F=A("li",O).removeClass(I.ACTIVE).index(Q(T));A(Q(T)).addClass(I.ACTIVE)}}).click(function(T){A(Q(T)).addClass(I.ACTIVE);L();if(E.inputFocus){J.focus()}return false}).mousedown(function(){P.mouseDownOnSelect=true}).mouseup(function(){P.mouseDownOnSelect=false});if(E.width>0){C.css("width",E.width)}S=false}function Q(U){var T=U.target;while(T&&T.tagName!="LI"){T=T.parentNode}if(!T){return[]}return T}function H(T){K.slice(F,F+1).removeClass(I.ACTIVE);G(T);var V=K.slice(F,F+1).addClass(I.ACTIVE);if(E.scroll){var U=0;K.slice(0,F).each(function(){U+=this.offsetHeight});if((U+V[0].offsetHeight-O.scrollTop())>O[0].clientHeight){O.scrollTop(U+V[0].offsetHeight-O.innerHeight())}else{if(U<O.scrollTop()){O.scrollTop(U)}}}}function G(T){if(E.scrollJumpPosition||(!E.scrollJumpPosition&&!((T<0&&F==0)||(T>0&&F==K.size()-1)))){F+=T;if(F<0){F=K.size()-1}else{if(F>=K.size()){F=0}}}}function B(T){return E.max&&E.max<T?E.max:T}function D(){O.empty();var U=B(R.length);for(var V=0;V<U;V++){if(!R[V]){continue}var W=E.formatItem(R[V].data,V+1,U,R[V].value,M);if(W===false){continue}var T=A("<li/>").html(E.highlight(W,M)).addClass(V%2==0?"ac_even":"ac_odd").appendTo(O)[0];A.data(T,"ac_data",R[V])}K=O.find("li");if(E.selectFirst){K.slice(0,1).addClass(I.ACTIVE);F=0}if(A.fn.bgiframe){O.bgiframe()}}return{display:function(U,T){N();R=U;M=T;D()},next:function(){H(1)},prev:function(){H(-1)},pageUp:function(){if(F!=0&&F-8<0){H(-F)}else{H(-8)}},pageDown:function(){if(F!=K.size()-1&&F+8>K.size()){H(K.size()-1-F)}else{H(8)}},hide:function(){C&&C.hide();K&&K.removeClass(I.ACTIVE);F=-1},visible:function(){return C&&C.is(":visible")},current:function(){return this.visible()&&(K.filter("."+I.ACTIVE)[0]||E.selectFirst&&K[0])},show:function(){var V=A(J).offset();C.css({width:typeof E.width=="string"||E.width>0?E.width:A(J).width(),top:V.top+J.offsetHeight,left:V.left}).show();if(E.scroll){O.scrollTop(0);O.css({maxHeight:E.scrollHeight,overflow:"auto"});if(A.browser.msie&&typeof document.body.style.maxHeight==="undefined"){var T=0;K.each(function(){T+=this.offsetHeight});var U=T>E.scrollHeight;O.css("height",U?E.scrollHeight:T);if(!U){K.width(O.width()-parseInt(K.css("padding-left"))-parseInt(K.css("padding-right")))}}}},selected:function(){var T=K&&K.filter("."+I.ACTIVE).removeClass(I.ACTIVE);return T&&T.length&&A.data(T[0],"ac_data")},emptyList:function(){O&&O.empty()},unbind:function(){C&&C.remove()}}}})(jQuery);
