forked from Pixabay/JavaScript-autoComplete
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathauto-complete.min.js
More file actions
6 lines (6 loc) · 6.65 KB
/
Copy pathauto-complete.min.js
File metadata and controls
6 lines (6 loc) · 6.65 KB
1
2
3
4
5
6
/*!
* JavaScript autoComplete v1.0.3
* https://github.com/Pixabay/JavaScript-autoComplete
*/
!function(a,b){var c="autoComplete";"function"==typeof define&&define.amd?define([],function(){return a[c]=b()}):"object"==typeof exports?module.exports=b():a[c]=b()}(this,function(){"use strict";function a(a){document.querySelector&&(this.settings=this.buildSettings(a),this.eventHandlers=[],this.instances=this.createInstances(this.settings.selector),this.addEvent(window,"resize",this.onResize,null))}return a.prototype={defaults:{selector:0,source:0,minChars:3,delay:150,cache:1,menuClass:"",renderItem:function(a,b){b=b.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");var c=new RegExp("("+b.split(" ").join("|")+")","gi");return'<div class="autocomplete-suggestion" data-val="'+a+'">'+a.replace(c,"<b>$1</b>")+"</div>"},onSelect:function(a,b,c){},popupContainer:document.body},buildSettings:function(a){var b={},c=this.defaults;for(var d in c)a.hasOwnProperty(d)?b[d]=a[d]:b[d]=c[d];return b},createInstances:function(a){for(var b="object"==typeof a?[a]:document.querySelectorAll(a),c=[],d=this.settings,e=0;e<b.length;e++){var f=b[e],g=this.createSuggestionsContainer(),h={textField:f,suggestionsContainer:g,autocompleteAttr:f.getAttribute("autocomplete"),cache:{},lastVal:""},i={instance:h};this.live("autocomplete-suggestion","mouseleave",this.onMouseLeave,g,i),this.live("autocomplete-suggestion","mouseover",this.onMouseOver,g,i),this.live("autocomplete-suggestion","mousedown",this.onMouseDown,g,i),this.addEvent(f,"blur",this.onBlur,i),this.addEvent(f,"keydown",this.onKeyDown,i),this.addEvent(f,"keyup",this.onKeyUp,i),d.minChars||this.addEvent(f,"focus",this.onFocus,i),f.autoCompleteInstance=h,f.setAttribute("autocomplete","off"),d.popupContainer.appendChild(g),c.push(h)}return c},createSuggestionsContainer:function(){var a=document.createElement("div");return a.className="autocomplete-suggestions "+this.settings.menuClass,a},getStyle:function(a){return window.getComputedStyle?getComputedStyle(a,null):a.currentStyle},isVisible:function(a){var b=a.suggestionsContainer;return"block"===this.getStyle(b).display},hide:function(a){var b=a.suggestionsContainer;b.style.display="none"},updateSuggestionsContainer:function(a,b,c){var d=a.textField,e=a.suggestionsContainer,f=d.getBoundingClientRect(),g=e.style;if(g.left=f.left+(window.pageXOffset||document.documentElement.scrollLeft)+"px",g.top=f.bottom+(window.pageYOffset||document.documentElement.scrollTop)+1+"px",g.width=f.right-f.left+"px",!b&&(g.display="block",e.maxHeight||(e.maxHeight=parseInt(this.getStyle(e).maxHeight)),e.suggestionHeight||(e.suggestionHeight=e.querySelector(".autocomplete-suggestion").offsetHeight),e.suggestionHeight))if(c){var h=e.scrollTop,i=c.getBoundingClientRect().top-e.getBoundingClientRect().top;i+e.suggestionHeight-e.maxHeight>0?e.scrollTop=i+e.suggestionHeight+h-e.maxHeight:0>i&&(e.scrollTop=i+h)}else e.scrollTop=0},suggest:function(a,b,c){var d=a.suggestionsContainer,e=this.settings;if(e.cache&&(a.cache[b]=c),c.length&&b.length>=e.minChars){for(var f="",g=0;g<c.length;g++)f+=e.renderItem(c[g],b);d.innerHTML=f,this.updateSuggestionsContainer(a,!1)}else this.hide(a)},hasClass:function(a,b){return a.classList?a.classList.contains(b):new RegExp("\\b"+b+"\\b").test(a.className)},addEvent:function(a,b,c,d){for(var e=this,f=b.split(" "),g=function(a){return c.call(e,this,a,d)},h=0;h<f.length;h++){var i=f[h];a.attachEvent?a.attachEvent("on"+i,g):a.addEventListener(i,g)}return this.eventHandlers.push({el:a,type:b,handler:g}),g},removeEvent:function(a,b,c){for(var d=b.split(" "),e=0;e<d.length;e++){var f=d[e];a.detachEvent?a.detachEvent("on"+f,c):a.removeEventListener(f,c)}},live:function(a,b,c,d,e){d=d||document;var f=this,g=function(b,d){for(var g,h=d.target||d.srcElement;h&&!(g=f.hasClass(h,a));)h=h.parentElement;g&&c.apply(this,[h,d,e])};return this.addEvent(d,b,g,e)},destroy:function(){for(var a=this.instances,b=this.eventHandlers,c=0;c<b.length;c++){var d=b[c];this.removeEvent(d.el,d.type,d.handler)}for(var e=0;e<a.length;e++){var f=a[e],g=f.textField;f.autocompleteAttr?g.setAttribute("autocomplete",f.autocompleteAttr):g.removeAttribute("autocomplete"),f.suggestionsContainer.parentNode.removeChild(f.suggestionsContainer),delete g.autoCompleteInstance}},onResize:function(a,b,c){for(var d=this.instances,e=0;e<d.length;e++)this.updateSuggestionsContainer(d[e],!0)},onMouseLeave:function(a,b,c){var d=c.instance.suggestionsContainer,e=d.querySelector(".autocomplete-suggestion.selected");e&&setTimeout(function(){e.className=e.className.replace(/\s*selected/,"")},20)},onMouseOver:function(a,b,c){var d=c.instance.suggestionsContainer,e=d.querySelector(".autocomplete-suggestion.selected");e&&(e.className=e.className.replace(/\s*selected/,"")),a.className+=" selected"},onMouseDown:function(a,b,c){var d=c.instance,e=d.textField;if(this.hasClass(a,"autocomplete-suggestion")){var f=a.getAttribute("data-val");e.value=f,this.settings.onSelect(b,f,a),this.hide(d)}},onBlur:function(a,b,c){var d=c.instance,e=(d.suggestionsContainer,0),f=this;try{e=document.querySelector(".autocomplete-suggestions:hover")}catch(g){}e?a!==document.activeElement&&setTimeout(function(){a.focus()},20):(d.lastVal=a.value,f.hide(d),setTimeout(function(){f.hide(d)},350))},onKeyDown:function(a,b,c){var d,e=window.event?b.keyCode:b.which,f=c.instance,g=f.suggestionsContainer,h=this;if((40===e||38===e)&&g.innerHTML){var i;return d=g.querySelector(".autocomplete-suggestion.selected"),d?(i=40===e?d.nextSibling:d.previousSibling,i?(d.className=d.className.replace(/\s*selected/,""),i.className+=" selected",a.value=i.getAttribute("data-val")):(d.className=d.className.replace(/\s*selected/,""),a.value=f.lastVal,i=0)):(i=40===e?g.querySelector(".autocomplete-suggestion"):g.childNodes[g.childNodes.length-1],i.className+=" selected",a.value=i.getAttribute("data-val")),this.updateSuggestionsContainer(f,!1,i),!1}27===e?(a.value=f.lastVal,this.hide(f)):(13===e||9===e)&&(d=g.querySelector(".autocomplete-suggestion.selected"),d&&this.isVisible(f)&&(this.settings.onSelect(b,d.getAttribute("data-val"),d),setTimeout(function(){h.hide(f)},20)))},onKeyUp:function(a,b,c){var d=window.event?b.keyCode:b.which,e=this,f=e.settings,g=c.instance;if(!d||(35>d||d>40)&&13!==d&&27!==d){var h=g.textField.value;if(h.length>=f.minChars){if(h!==g.lastVal){g.lastVal=h,clearTimeout(g.timer);var i=function(a){e.suggest(g,h,a)};if(f.cache){if(h in g.cache)return void i(g.cache[h]);for(var j=1;j<h.length-f.minChars;j++){var k=h.slice(0,h.length-j);if(k in g.cache&&!g.cache[k].length)return void i([])}}g.timer=setTimeout(function(){f.source(h,i)},f.delay)}}else g.lastVal=h,this.hide(g)}},onFocus:function(a,b,c){c.instance.lastVal="\n",this.onKeyUp.call(this,a,b,c)}},a});
//# sourceMappingURL=auto-complete.min.js.map