11 lines
9.3 KiB
JavaScript
11 lines
9.3 KiB
JavaScript
/*
|
|
* jQuery Autocomplete plugin 1.1
|
|
*
|
|
* Copyright (c) 2009 Jörn Zaefferer
|
|
*
|
|
* Dual licensed under the MIT and GPL licenses:
|
|
* http://www.opensource.org/licenses/mit-license.php
|
|
* http://www.gnu.org/licenses/gpl.html
|
|
*
|
|
* Revision: $Id: jquery.autocomplete.js 15 2009-08-22 10:30:27Z joern.zaefferer $
|
|
*/(function(d){d.fn.extend({autocomplete:function(a,b){var u="string"==typeof a;b=d.extend({},d.Autocompleter.defaults,{url:u?a:null,data:u?null:a,delay:u?d.Autocompleter.defaults.delay:10,max:b&&!b.scroll?10:150},b);b.highlight=b.highlight||function(a){return a};b.formatMatch=b.formatMatch||b.formatItem;return this.each(function(){new d.Autocompleter(this,b)})},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,b){function u(){var h=q.selected();if(!h)return!1;var c=h.result;v=c;if(b.multiple){var m=t(k.val());if(1<m.length){var f=b.multipleSeparator.length,e=d(a).selection().start,n,g=0;d.each(m,function(a,b){g+=b.length;if(e<=g)return n=a,!1;g+=f});m[n]=c;c=m.join(b.multipleSeparator)}c+=b.multipleSeparator}k.val(c);l();k.trigger("result",[h.data,h.value]);return!0}function p(a,d){if(m==c.DEL)q.hide();else{var h=k.val();if(d||h!=v)v=h,h=g(h),h.length>=b.minChars?(k.addClass(b.loadingClass),b.matchCase||(h=h.toLowerCase()),f(h,e,l)):(k.removeClass(b.loadingClass),q.hide())}}function t(a){return a?b.multiple?d.map(a.split(b.multipleSeparator),function(b){return d.trim(a).length?d.trim(b):null}):[d.trim(a)]:[""]}function g(h){if(!b.multiple)return h;var c=t(h);if(1==c.length)return c[0];c=d(a).selection().start;c=c==h.length?t(h):t(h.replace(h.substring(c),""));return c[c.length-1]}function l(){q.visible();q.hide();clearTimeout(w);k.removeClass(b.loadingClass);b.mustMatch&&k.search(function(a){a||(b.multiple?(a=t(k.val()).slice(0,-1),k.val(a.join(b.multipleSeparator)+(a.length?b.multipleSeparator:""))):(k.val(""),k.trigger("result",null)))})}function e(h,f){if(f&&f.length&&n){k.removeClass(b.loadingClass);q.display(f,h);var e=f[0].value;b.autoFill&&g(k.val()).toLowerCase()==h.toLowerCase()&&m!=c.BACKSPACE&&(k.val(k.val()+e.substring(g(v).length)),d(a).selection(v.length,v.length+e.length));q.show()}else l()}function f(c,f,m){b.matchCase||(c=c.toLowerCase());var h=r.load(c);if(h&&h.length)f(c,h);else if("string"==typeof b.url&&0<b.url.length){var e={timestamp:+new Date};d.each(b.extraParams,function(a,c){e[a]="function"==typeof c?c():c});d.ajax({mode:"abort",port:"autocomplete"+a.name,dataType:b.dataType,url:b.url,data:d.extend({q:g(c),limit:b.max},e),success:function(a){var m;if(!(m=b.parse&&b.parse(a))){m=[];a=a.split("\n");for(var h=0;h<a.length;h++){var e=d.trim(a[h]);e&&(e=e.split("|"),m[m.length]={data:e,value:e[0],result:b.formatResult&&b.formatResult(e,e[0])||e[0]})}}r.add(c,m);f(c,m)}})}else q.emptyList(),m(c)}var c={UP:38,DOWN:40,DEL:46,TAB:9,RETURN:13,ESC:27,COMMA:188,PAGEUP:33,PAGEDOWN:34,BACKSPACE:8},k=d(a).attr("autocomplete","off").addClass(b.inputClass),w,v="",r=d.Autocompleter.Cache(b),n=0,m,y={mouseDownOnSelect:!1},q=d.Autocompleter.Select(b,a,u,y),x;d.browser.opera&&d(a.form).bind("submit.autocomplete",function(){if(x)return x=!1});k.bind((d.browser.opera?"keypress":"keydown")+".autocomplete",function(a){n=1;m=a.keyCode;switch(a.keyCode){case c.UP:a.preventDefault();q.visible()?q.prev():p(0,!0);break;case c.DOWN:a.preventDefault();q.visible()?q.next():p(0,!0);break;case c.PAGEUP:a.preventDefault();q.visible()?q.pageUp():p(0,!0);break;case c.PAGEDOWN:a.preventDefault();q.visible()?q.pageDown():p(0,!0);break;case b.multiple&&","==d.trim(b.multipleSeparator)&&c.COMMA:case c.TAB:case c.RETURN:if(u())return a.preventDefault(),x=!0,!1;break;case c.ESC:q.hide();break;default:clearTimeout(w),w=setTimeout(p,b.delay)}}).focus(function(){n++}).blur(function(){n=0;y.mouseDownOnSelect||(clearTimeout(w),w=setTimeout(l,200))}).click(function(){1<n++&&!q.visible()&&p(0,!0)}).bind("search",function(){function a(a,b){var m;if(b&&b.length)for(var e=0;e<b.length;e++)if(b[e].result.toLowerCase()==a.toLowerCase()){m=b[e];break}"function"==typeof c?c(m):k.trigger("result",m&&[m.data,m.value])}var c=1<arguments.length?arguments[1]:null;d.each(t(k.val()),function(c,b){f(b,a,a)})}).bind("flushCache",function(){r.flush()}).bind("setOptions",function(a,c){d.extend(b,c);"data"in c&&r.populate()}).bind("unautocomplete",function(){q.unbind();k.unbind();d(a.form).unbind(".autocomplete")}).bind("input",function(){p(0,!0)})};d.Autocompleter.defaults={inputClass:"ac_input",resultsClass:"ac_results",loadingClass:"ac_loading",minChars:1,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:!1,width:0,multiple:!1,multipleSeparator:", ",highlight:function(a,b){return a.replace(new RegExp("(?![^\x26;]+;)(?!\x3c[^\x3c\x3e]*)("+b.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi,"\\$1")+")(?![^\x3c\x3e]*\x3e)(?![^\x26;]+;)","gi"),"\x3cstrong\x3e$1\x3c/strong\x3e")},scroll:!0,scrollHeight:180};d.Autocompleter.Cache=function(a){function b(b,d){a.matchCase||(b=b.toLowerCase());var c=b.indexOf(d);"word"==a.matchContains&&(c=b.toLowerCase().search("\\b"+d.toLowerCase()));return-1==c?!1:0==c||a.matchContains}function u(b,d){l>a.cacheLength&&t();g[b]||l++;g[b]=d}function p(){if(!a.data)return!1;var b={},f=0;a.url||(a.cacheLength=1);b[""]=[];for(var c=0,k=a.data.length;c<k;c++){var g=a.data[c],g="string"==typeof g?[g]:g,l=a.formatMatch(g,c+1,a.data.length);if(!1!==l){var p=l.charAt(0).toLowerCase();b[p]||(b[p]=[]);g={value:l,data:g,result:a.formatResult&&a.formatResult(g)||l};b[p].push(g);f++<a.max&&b[""].push(g)}}d.each(b,function(b,c){a.cacheLength++;u(b,c)})}function t(){g={};l=0}var g={},l=0;setTimeout(p,25);return{flush:t,add:u,populate:p,load:function(e){if(!a.cacheLength||!l)return null;if(!a.url&&a.matchContains){var f=[],c;for(c in g)if(0<c.length){var k=g[c];d.each(k,function(a,c){b(c.value,e)&&f.push(c)})}return f}if(g[e])return g[e];if(a.matchSubset)for(c=e.length-1;c>=a.minChars;c--)if(k=g[e.substr(0,c)])return f=[],d.each(k,function(a,c){b(c.value,e)&&(f[f.length]=c)}),f;return null}}};d.Autocompleter.Select=function(a,b,u,p){function t(){v&&(r=d("\x3cdiv/\x3e").hide().addClass(a.resultsClass).css("position","absolute").appendTo(document.body),n=d("\x3cul/\x3e").appendTo(r).mouseover(function(a){g(a).nodeName&&"LI"==g(a).nodeName.toUpperCase()&&(c=d("li",n).removeClass(e.ACTIVE).index(g(a)),d(g(a)).addClass(e.ACTIVE))}).click(function(a){d(g(a)).addClass(e.ACTIVE);u();b.focus();return!1}).mousedown(function(){p.mouseDownOnSelect=!0}).mouseup(function(){p.mouseDownOnSelect=!1}),0<a.width&&r.css("width",a.width),v=!1)}function g(a){for(a=a.target;a&&"LI"!=a.tagName;)a=a.parentNode;return a?a:[]}function l(b){f.slice(c,c+1).removeClass(e.ACTIVE);c+=b;0>c?c=f.size()-1:c>=f.size()&&(c=0);b=f.slice(c,c+1).addClass(e.ACTIVE);if(a.scroll){var d=0;f.slice(0,c).each(function(){d+=this.offsetHeight});d+b[0].offsetHeight-n.scrollTop()>n[0].clientHeight?n.scrollTop(d+b[0].offsetHeight-n.innerHeight()):d<n.scrollTop()&&n.scrollTop(d)}}var e={ACTIVE:"ac_over"},f,c=-1,k,w="",v=!0,r,n;return{display:function(b,g){t();k=b;w=g;n.empty();var m;m=k.length;m=a.max&&a.max<m?a.max:m;for(var l=0;l<m;l++)if(k[l]){var h=a.formatItem(k[l].data,l+1,m,k[l].value,w);!1!==h&&(h=d("\x3cli/\x3e").html(a.highlight(h,w)).addClass(0==l%2?"ac_even":"ac_odd").appendTo(n)[0],d.data(h,"ac_data",k[l]))}f=n.find("li");a.selectFirst&&(f.slice(0,1).addClass(e.ACTIVE),c=0);d.fn.bgiframe&&n.bgiframe()},next:function(){l(1)},prev:function(){l(-1)},pageUp:function(){0!=c&&0>c-8?l(-c):l(-8)},pageDown:function(){c!=f.size()-1&&c+8>f.size()?l(f.size()-1-c):l(8)},hide:function(){r&&r.hide();f&&f.removeClass(e.ACTIVE);c=-1},visible:function(){return r&&r.is(":visible")},current:function(){return this.visible()&&(f.filter("."+e.ACTIVE)[0]||a.selectFirst&&f[0])},show:function(){var c=d(b).offset();r.css({width:"string"==typeof a.width||0<a.width?a.width:d(b).width(),top:c.top+b.offsetHeight,left:c.left}).show();if(a.scroll&&(n.scrollTop(0),n.css({maxHeight:a.scrollHeight,overflow:"auto"}),d.browser.msie&&"undefined"===typeof document.body.style.maxHeight)){var e=0;f.each(function(){e+=this.offsetHeight});c=e>a.scrollHeight;n.css("height",c?a.scrollHeight:e);c||f.width(n.width()-parseInt(f.css("padding-left"))-parseInt(f.css("padding-right")))}},selected:function(){var a=f&&f.filter("."+e.ACTIVE).removeClass(e.ACTIVE);return a&&a.length&&d.data(a[0],"ac_data")},emptyList:function(){n&&n.empty()},unbind:function(){r&&r.remove()}}};d.fn.selection=function(a,b){if(void 0!==a)return this.each(function(){if(this.createTextRange){var d=this.createTextRange();void 0===b||a==b?d.move("character",a):(d.collapse(!0),d.moveStart("character",a),d.moveEnd("character",b));d.select()}else this.setSelectionRange?this.setSelectionRange(a,b):this.selectionStart&&(this.selectionStart=a,this.selectionEnd=b)});var d=this[0];if(d.createTextRange){var p=document.selection.createRange(),t=d.value,g=p.text.length;p.text="\x3c-\x3e";p=d.value.indexOf("\x3c-\x3e");d.value=t;this.selection(p,p+g);return{start:p,end:p+g}}if(void 0!==d.selectionStart)return{start:d.selectionStart,end:d.selectionEnd}}})(jQuery); |