(function(d){d.fn.extend({autocomplete:function(a,c){var p=typeof a=="string",c=d.extend({},d.Autocompleter.defaults,{url:p?a:null,data:p?null:a,delay:p?d.Autocompleter.defaults.delay:10,max:c&&!c.scroll?10:150},c);c.highlight=c.highlight||function(a){return a};c.formatMatch=c.formatMatch||c.formatItem;return this.each(function(){new d.Autocompleter(this,c)})},result:function(a){return this.bind("result",a)},search:function(a){return this.trigger("search",[a])},flushCache:function(){return this.trigger("flushCache")},
setOptions:function(a){return this.trigger("setOptions",[a])},unautocomplete:function(){return this.trigger("unautocomplete")}});d.Autocompleter=function(a,c){function p(){var a=l.selected();if(!a)return!1;var b=a.result;o=b;if(c.multiple){var d=q(h.val());d.length>1&&(b=d.slice(0,d.length-1).join(c.multipleSeparator)+c.multipleSeparator+b);b+=c.multipleSeparator}h.val(b);m();h.trigger("result",[a.data,a.value]);return!0}function i(a,d){if(r==b.DEL)l.hide();else{var e=h.val();if(d||e!=o)o=e,e=j(e),
e.length>=c.minChars?(h.addClass(c.loadingClass),c.matchCase||(e=e.toLowerCase()),g(e,f,m)):(h.removeClass(c.loadingClass),l.hide())}}function q(a){if(!a)return[""];var a=a.split(c.multipleSeparator),b=[];d.each(a,function(a,c){d.trim(c)&&(b[a]=d.trim(c))});return b}function j(a){if(!c.multiple)return a;a=q(a);return a[a.length-1]}function m(){var b=l.visible();l.hide();clearTimeout(k);h.removeClass(c.loadingClass);c.mustMatch&&h.search(function(a){a||(c.multiple?(a=q(h.val()).slice(0,-1),h.val(a.join(c.multipleSeparator)+
(a.length?c.multipleSeparator:""))):h.val(""))});b&&d.Autocompleter.Selection(a,a.value.length,a.value.length)}function f(g,f){if(f&&f.length&&e){h.removeClass(c.loadingClass);l.display(f,g);var k=f[0].value;c.autoFill&&j(h.val()).toLowerCase()==g.toLowerCase()&&r!=b.BACKSPACE&&(h.val(h.val()+k.substring(j(o).length)),d.Autocompleter.Selection(a,o.length,o.length+k.length));l.show()}else m()}function g(b,g,r){c.matchCase||(b=b.toLowerCase());var f=n.load(b);if(f&&f.length)g(b,f);else if(typeof c.url==
"string"&&c.url.length>0){var e={timestamp:+new Date};d.each(c.extraParams,function(a,b){e[a]=typeof b=="function"?b():b});d.ajax({mode:"abort",port:"autocomplete"+a.name,dataType:c.dataType,url:c.url,data:d.extend({q:j(b),limit:c.max},e),success:function(a){var f;if(!(f=c.parse&&c.parse(a))){f=[];for(var a=a.split("\n"),r=0;r<a.length;r++){var e=d.trim(a[r]);e&&(e=e.split("|"),f[f.length]={data:e,value:e[0],result:c.formatResult&&c.formatResult(e,e[0])||e[0]})}}n.add(b,f);g(b,f)}})}else l.emptyList(),
r(b)}var b={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8},h=d(a).attr("autocomplete","off").addClass(c.inputClass),k,o="",n=d.Autocompleter.Cache(c),e=0,r,t={mouseDownOnSelect:!1},l=d.Autocompleter.Select(c,a,p,t),s;d.browser.opera&&d(a.form).bind("submit.autocomplete",function(){if(s)return s=!1});h.bind((d.browser.opera?"keypress":"keydown")+".autocomplete",function(a){r=a.keyCode;switch(a.keyCode){case b.UP:a.preventDefault();l.visible()?l.prev():i(0,
!0);break;case b.DOWN:a.preventDefault();l.visible()?l.next():i(0,!0);break;case b.PAGEUP:a.preventDefault();l.visible()?l.pageUp():i(0,!0);break;case b.PAGEDOWN:a.preventDefault();l.visible()?l.pageDown():i(0,!0);break;case c.multiple&&d.trim(c.multipleSeparator)==","&&b.COMMA:case b.TAB:case b.RETURN:if(p())return a.preventDefault(),s=!0,!1;break;case b.ESC:l.hide();break;default:clearTimeout(k),k=setTimeout(i,c.delay)}}).focus(function(){e++}).blur(function(){e=0;t.mouseDownOnSelect||(clearTimeout(k),
k=setTimeout(m,200))}).click(function(){e++>1&&!l.visible()&&i(0,!0)}).bind("search",function(){function a(c,d){var f;if(d&&d.length)for(var e=0;e<d.length;e++)if(d[e].result.toLowerCase()==c.toLowerCase()){f=d[e];break}typeof b=="function"?b(f):h.trigger("result",f&&[f.data,f.value])}var b=arguments.length>1?arguments[1]:null;d.each(q(h.val()),function(b,c){g(c,a,a)})}).bind("flushCache",function(){n.flush()}).bind("setOptions",function(a,b){d.extend(c,b);"data"in b&&n.populate()}).bind("unautocomplete",
function(){l.unbind();h.unbind();d(a.form).unbind(".autocomplete")})};d.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:3,delay:400,matchCase:!1,matchSubset:!0,matchContains:!1,cacheLength:10,max:100,mustMatch:!1,extraParams:{},selectFirst:!0,formatItem:function(a){return a[0]},formatMatch:null,autoFill:!0,width:0,multiple:!1,multipleSeparator:", ",highlight:function(a,c){return a.replace(RegExp("(?![^&;]+;)(?!<[^<>]*)("+c.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,
"\\$1")+")(?![^<>]*>)(?![^&;]+;)","gi"),"<strong>$1</strong>")},scroll:!0,scrollHeight:180};d.Autocompleter.Cache=function(a){function c(c,d){a.matchCase||(c=c.toLowerCase());var b=c.indexOf(d);return b==-1?!1:b==0||a.matchContains}function p(c,d){m>a.cacheLength&&q();j[c]||m++;j[c]=d}function i(){if(!a.data)return!1;var c={},g=0;if(!a.url)a.cacheLength=1;c[""]=[];for(var b=0,h=a.data.length;b<h;b++){var k=a.data[b],k=typeof k=="string"?[k]:k,o=a.formatMatch(k,b+1,a.data.length);if(o!==!1){var j=
o.charAt(0).toLowerCase();c[j]||(c[j]=[]);k={value:o,data:k,result:a.formatResult&&a.formatResult(k)||o};c[j].push(k);g++<a.max&&c[""].push(k)}}d.each(c,function(c,b){a.cacheLength++;p(c,b)})}function q(){j={};m=0}var j={},m=0;setTimeout(i,25);return{flush:q,add:p,populate:i,load:function(f){if(!a.cacheLength||!m)return null;if(!a.url&&a.matchContains){var g=[],b;for(b in j)if(b.length>0){var h=j[b];d.each(h,function(a,b){c(b.value,f)&&g.push(b)})}return g}else if(j[f])return j[f];else if(a.matchSubset)for(b=
f.length-1;b>=a.minChars;b--)if(h=j[f.substr(0,b)])return g=[],d.each(h,function(a,b){c(b.value,f)&&(g[g.length]=b)}),g;return null}}};d.Autocompleter.Select=function(a,c,p,i){function q(){o&&(n=d("<div/>").hide().addClass(a.resultsClass).css("position","absolute").appendTo(document.body),e=d("<ul/>").appendTo(n).mouseover(function(a){j(a).nodeName&&j(a).nodeName.toUpperCase()=="LI"&&(b=d("li",e).removeClass(f.ACTIVE).index(j(a)),d(j(a)).addClass(f.ACTIVE))}).click(function(a){d(j(a)).addClass(f.ACTIVE);
p();c.focus();return!1}).mousedown(function(){i.mouseDownOnSelect=!0}).mouseup(function(){i.mouseDownOnSelect=!1}),a.width>0&&n.css("width",a.width),o=!1)}function j(a){for(a=a.target;a&&a.tagName!="LI";)a=a.parentNode;return!a?[]:a}function m(c){g.slice(b,b+1).removeClass(f.ACTIVE);b+=c;b<0?b=g.size()-1:b>=g.size()&&(b=0);c=g.slice(b,b+1).addClass(f.ACTIVE);if(a.scroll){var d=0;g.slice(0,b).each(function(){d+=this.offsetHeight});d+c[0].offsetHeight-e.scrollTop()>e[0].clientHeight?e.scrollTop(d+c[0].offsetHeight-
e.innerHeight()):d<e.scrollTop()&&e.scrollTop(d)}}var f={ACTIVE:"ac_over"},g,b=-1,h,k="",o=!0,n,e;return{display:function(c,j){q();h=c;k=j;e.empty();for(var l=a.max&&a.max<h.length?a.max:h.length,i=0;i<l;i++)if(h[i]){var m=a.formatItem(h[i].data,i+1,l,h[i].value,k);m!==!1&&(m=d("<li/>").html(a.highlight(m,k)).addClass(i%2==0?"ac_even":"ac_odd").appendTo(e)[0],d.data(m,"ac_data",h[i]))}g=e.find("li");a.selectFirst&&(g.slice(0,1).addClass(f.ACTIVE),b=0);d.fn.bgiframe&&e.bgiframe()},next:function(){m(1)},
prev:function(){m(-1)},pageUp:function(){b!=0&&b-8<0?m(-b):m(-8)},pageDown:function(){b!=g.size()-1&&b+8>g.size()?m(g.size()-1-b):m(8)},hide:function(){n&&n.hide();g&&g.removeClass(f.ACTIVE);b=-1},visible:function(){return n&&n.is(":visible")},current:function(){return this.visible()&&(g.filter("."+f.ACTIVE)[0]||a.selectFirst&&g[0])},show:function(){var b=d(c).offset();n.css({width:typeof a.width=="string"||a.width>0?a.width:d(c).width(),top:b.top+c.offsetHeight,left:b.left}).show();if(a.scroll&&
(e.scrollTop(0),e.css({maxHeight:a.scrollHeight,overflow:"auto"}),d.browser.msie&&typeof document.body.style.maxHeight==="undefined")){var f=0;g.each(function(){f+=this.offsetHeight});b=f>a.scrollHeight;e.css("height",b?a.scrollHeight:f);b||g.width(e.width()-parseInt(g.css("padding-left"))-parseInt(g.css("padding-right")))}},selected:function(){var a=g&&g.filter("."+f.ACTIVE).removeClass(f.ACTIVE);return a&&a.length&&d.data(a[0],"ac_data")},emptyList:function(){e&&e.empty()},unbind:function(){n&&
n.remove()}}};d.Autocompleter.Selection=function(a,c,d){if(a.createTextRange){var i=a.createTextRange();i.collapse(!0);i.moveStart("character",c);i.moveEnd("character",d);i.select()}else if(a.setSelectionRange)a.setSelectionRange(c,d);else if(a.selectionStart)a.selectionStart=c,a.selectionEnd=d;a.focus()}})(jQuery);

