/* * jquery-autocompleter v0.1.10 - 2015-01-22 * Simple, easy, customisable and with localStorage cache support. * http://github.com/ArtemFitiskin/jquery-autocompleter * * Copyright 2015 Artem Fitiskin; MIT Licensed */ !function(a,b){"use strict";function c(b){b=a.extend({},O,b||{}),null===K&&(K=a("body"));for(var c=a(this),e=0,f=c.length;f>e;e++)d(c.eq(e),b);return c}function d(b,c){if(!b.hasClass("autocompleter-node")){c=a.extend({},c,b.data("autocompleter-options")),"string"!=typeof c.source||".json"!==c.source.slice(-5)&&c.asLocal!==!0||a.ajax({url:c.source,type:"GET",dataType:"json",async:!1}).done(function(a){c.source=a});var d='
';c.hint&&(d+='
'),d+='',d+="
",b.addClass("autocompleter-node").after(d);var e=b.next(".autocompleter").eq(0),f=b.attr("autocomplete");b.attr("autocomplete","off");var g=a.extend({$node:b,$autocompleter:e,$selected:null,$list:null,index:-1,hintText:!1,source:!1,jqxhr:!1,response:null,focused:!1,query:"",originalAutocomplete:f,guid:D++},c);g.$autocompleter.on("mousedown.autocompleter",".autocompleter-item",g,s).data("autocompleter",g),g.$node.on("keyup.autocompleter",g,k).on("keydown.autocompleter",g,l).on("focus.autocompleter",g,m).on("blur.autocompleter",g,n).on("mousedown.autocompleter",g,o)}}function e(a,b,c){var d=[];if(a=a.toUpperCase(),b.length)for(var e=0;2>e;e++)for(var f in b)if(d.lengthe;e++){var g=["autocompleter-item"],h=new RegExp(c.query,"gi");c.selectFirst&&0===e&&!c.changeWhenSelect&&g.push("autocompleter-item-selected");var i=c.customLabel&&b[e][c.customLabel]?b[e][c.customLabel]:b[e].label,j=i;i=c.highlightMatches?i.replace(h,"$&"):i;var k=c.customValue&&b[e][c.customValue]?b[e][c.customValue]:b[e].value;if(c.template){var l=c.template.replace(/({{ label }})/gi,i);for(var m in b[e])if(b[e].hasOwnProperty(m)){var n=new RegExp("{{ "+m+" }}","gi");l=l.replace(n,b[e][m])}i=l}d+=k?'
  • '+i+"
  • ":'
  • '+i+"
  • "}if(b.length&&c.hint){var o=c.customLabel&&b[0][c.customLabel]?b[0][c.customLabel]:b[0].label,p=o.substr(0,c.query.length).toUpperCase()===c.query.toUpperCase()?o:!1;if(p&&c.query!==o){var q=new RegExp(c.query,"i"),r=p.replace(q,""+c.query+"");c.$autocompleter.find(".autocompleter-hint").addClass("autocompleter-hint-show").html(r),c.hintText=r}}c.response=b,c.$autocompleter.find(".autocompleter-list").html(d),c.$selected=c.$autocompleter.find(".autocompleter-item-selected").length?c.$autocompleter.find(".autocompleter-item-selected"):null,c.$list=b.length?c.$autocompleter.find(".autocompleter-item"):null,c.index=c.$selected?c.$list.index(c.$selected):-1,c.$autocompleter.find(".autocompleter-item").each(function(b,d){a(d).data(c.response[b])})}function k(b){var c=b.data,d=b.keyCode?b.keyCode:b.which;if(40!==d&&38!==d||!c.$autocompleter.hasClass("autocompleter-show"))-1===a.inArray(d,E)&&-1===a.inArray(d,c.ignoredKeyCode)&&f(c);else{var e,g,h=c.$list.length;h&&(h>1?c.index===h-1?(e=c.changeWhenSelect?-1:0,g=c.index-1):0===c.index?(e=c.index+1,g=c.changeWhenSelect?-1:h-1):-1===c.index?(e=0,g=h-1):(e=c.index+1,g=c.index-1):-1===c.index?(e=0,g=0):(g=-1,e=-1),c.index=40===d?e:g,c.$list.removeClass("autocompleter-item-selected"),-1!==c.index&&c.$list.eq(c.index).addClass("autocompleter-item-selected"),c.$selected=c.$autocompleter.find(".autocompleter-item-selected").length?c.$autocompleter.find(".autocompleter-item-selected"):null,c.changeWhenSelect&&u(c))}}function l(a){var b=a.data,c=a.keyCode?a.keyCode:a.which;if(40===c||38===c)a.preventDefault(),a.stopPropagation();else if(39===c){if(b.hint&&b.hintText&&b.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")){a.preventDefault(),a.stopPropagation();var d=b.$autocompleter.find(".autocompleter-item").length?b.$autocompleter.find(".autocompleter-item").eq(0).attr("data-label"):!1;d&&(b.query=d,t(b))}}else 13===c&&b.$autocompleter.hasClass("autocompleter-show")&&b.$selected&&s(a)}function m(a,b){if(!b){var c=a.data;c.$autocompleter.addClass("autocompleter-focus"),c.$node.prop("disabled")||c.$autocompleter.hasClass("autocompleter-show")||c.focusOpen&&(f(c),c.focused=!0,setTimeout(function(){c.focused=!1},500))}}function n(a,b){a.preventDefault(),a.stopPropagation();var c=a.data;b||(c.$autocompleter.removeClass("autocompleter-focus"),r(a))}function o(c){if("mousedown"!==c.type||-1===a.inArray(c.which,[2,3])){var d=c.data;if(d.$list&&!d.focused&&!d.$node.is(":disabled"))if(I&&!J){var e=d.$select[0];if(b.document.createEvent){var f=b.document.createEvent("MouseEvents");f.initMouseEvent("mousedown",!1,!0,b,0,0,0,0,0,!1,!1,!1,!1,0,null),e.dispatchEvent(f)}else e.fireEvent&&e.fireEvent("onmousedown")}else d.$autocompleter.hasClass("autocompleter-closed")?p(c):d.$autocompleter.hasClass("autocompleter-show")&&r(c)}}function p(a,b){var c=a?a.data:b;!c.$node.prop("disabled")&&!c.$autocompleter.hasClass("autocompleter-show")&&c.$list&&c.$list.length&&(c.$autocompleter.removeClass("autocompleter-closed").addClass("autocompleter-show"),K.on("click.autocompleter-"+c.guid,":not(.autocompleter-item)",c,q))}function q(b){a(b.target).hasClass("autocompleter-node")||0===a(b.currentTarget).parents(".autocompleter").length&&r(b)}function r(a,b){var c=a?a.data:b;c.$autocompleter.hasClass("autocompleter-show")&&(c.$autocompleter.removeClass("autocompleter-show").addClass("autocompleter-closed"),K.off(".autocompleter-"+c.guid))}function s(b){if("mousedown"!==b.type||-1===a.inArray(b.which,[2,3])){var c=b.data;b.preventDefault(),b.stopPropagation(),"mousedown"===b.type&&a(this).length&&(c.$selected=a(this),c.index=c.$list.index(c.$selected)),c.$node.prop("disabled")||(r(b),v(c),"click"===b.type&&c.$node.trigger("focus",[!0]))}}function t(a){u(a),w(a),f(a)}function u(a){a.$selected?(a.hintText&&a.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")&&a.$autocompleter.find(".autocompleter-hint").removeClass("autocompleter-hint-show"),a.$node.val(a.$selected.attr(a.$selected.attr("data-value")?"data-value":"data-label"))):(a.hintText&&!a.$autocompleter.find(".autocompleter-hint").hasClass("autocompleter-hint-show")&&a.$autocompleter.find(".autocompleter-hint").addClass("autocompleter-hint-show"),a.$node.val(a.query))}function v(a){u(a),w(a),h(a)}function w(a){a.callback.call(a.$autocompleter,a.$node.val(),a.index,a.response[a.index]),a.$node.trigger("change")}function x(a,b){for(b=b.split(".");a&&b.length;)a=a[b.shift()];return a}function y(a,b){if(N&&a&&b){Q[a]={value:b,timestamp:+new Date};try{localStorage.setItem(M,JSON.stringify(Q))}catch(c){var d=c.code||c.number||c.message;if(22!==d)throw c;B()}}}function z(a,b){var c,d=!1;return b=b||!1,a?(c=Q[a],c&&c.value?(d=c.value,c.timestamp&&b&&+new Date-c.timestamp>1e3*b?!1:d):!1):!1}function A(){return N?JSON.parse(localStorage.getItem(M)||"{}"):void 0}function B(){try{localStorage.removeItem(M),Q=A()}catch(a){throw a}}function C(a){var b;if(null===a||"object"!=typeof a)return a;b=a.constructor();for(var c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}var D=0,E=[9,13,17,19,20,27,33,34,35,36,37,39,44,92,113,114,115,118,119,120,122,123,144,145],F=["source","empty","limit","cache","cacheExpires","focusOpen","selectFirst","changeWhenSelect","highlightMatches","ignoredKeyCode","customLabel","customValue","template","offset","combine","callback","minLength","delay"],G=b.navigator.userAgent||b.navigator.vendor||b.opera,H=/Firefox/i.test(G),I=/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(G),J=H&&I,K=null,L=null,M="autocompleterCache",N=function(){var a="undefined"!=typeof b.localStorage;if(a)try{localStorage.setItem("autocompleter","autocompleter"),localStorage.removeItem("autocompleter")}catch(c){a=!1}return a}(),O={source:null,asLocal:!1,empty:!0,limit:10,minLength:0,delay:0,customClass:[],cache:!0,cacheExpires:86400,focusOpen:!0,hint:!1,selectFirst:!1,changeWhenSelect:!0,highlightMatches:!1,ignoredKeyCode:[],customLabel:!1,customValue:!1,template:!1,offset:!1,combine:a.noop,callback:a.noop},P={defaults:function(b){return O=a.extend(O,b||{}),"object"==typeof this?a(this):!0},option:function(b){return a(this).each(function(c,d){var e=a(d).next(".autocompleter").data("autocompleter");for(var f in b)-1!==a.inArray(f,F)&&(e[f]=b[f])})},open:function(){return a(this).each(function(b,c){var d=a(c).next(".autocompleter").data("autocompleter");d&&p(null,d)})},close:function(){return a(this).each(function(b,c){var d=a(c).next(".autocompleter").data("autocompleter");d&&r(null,d)})},clearCache:function(){B()},destroy:function(){return a(this).each(function(b,c){var d=a(c).next(".autocompleter").data("autocompleter");d&&(d.jqxhr&&d.jqxhr.abort(),d.$autocompleter.hasClass("open")&&d.$autocompleter.find(".autocompleter-selected").trigger("click.autocompleter"),d.originalAutocomplete?d.$node.attr("autocomplete",d.originalAutocomplete):d.$node.removeAttr("autocomplete"),d.$node.off(".autocompleter").removeClass("autocompleter-node"),d.$autocompleter.off(".autocompleter").remove())})}},Q=A();a.fn.autocompleter=function(a){return P[a]?P[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?this:c.apply(this,arguments)},a.autocompleter=function(a){"defaults"===a?P.defaults.apply(this,Array.prototype.slice.call(arguments,1)):"clearCache"===a&&P.clearCache.apply(this,null)}}(jQuery,window);