-
Notifications
You must be signed in to change notification settings - Fork 8
/
jquery.immybox.min.js
1 lines (1 loc) · 7.9 KB
/
jquery.immybox.min.js
1
(function(){var c,o,n,l,r,a,h=function(e,t){return function(){return e.apply(t,arguments)}},p=[].indexOf||function(e){for(var t=0,i=this.length;t<i;t++)if(t in this&&this[t]===e)return t;return-1};c=jQuery,o=window,document,a="immybox",l={choices:[],maxResults:50,showArrow:!0,openOnClick:!0,defaultSelectedValue:void 0,filterFn:function(t){return function(e){return 0<=e.text.toLowerCase().indexOf(t.toLowerCase())}},formatChoice:function(e){var t;return null!=e&&""!==e?(t=new RegExp(e.replace(/[#-.]|[[-^]|[?|{}]/g,"\\$&"),"gi"),function(e){return e.text.replace(t,'<span class="highlight">$&</span>')}):function(e){return e.text}}},r=[],n=function(){function e(e,t){var i,s;this.reposition=h(this.reposition,this),this.revert=h(this.revert,this),this.openResults=h(this.openResults,this),this.doSelection=h(this.doSelection,this),this.doQuery=h(this.doQuery,this),(s=this).element=c(e),this.element.addClass(a),this.element.attr("autocomplete","off"),this._defaults=l,this._name=a,this._element=e,this.options=c.extend({},l,t),this.choices=this.options.choices,this.selectedChoice=null,this.defaultSelectedChoice=null!=this.options.defaultSelectedValue?this.choices.filter(function(e){return e.value===s.options.defaultSelectedValue})[0]||null:this.options.defaultSelectedValue,this.options.showArrow&&this.element.addClass(a+"_witharrow"),this.options.openOnClick&&this.element.on("click",this.openResults),this.selectChoiceByValue(this.element.val()),this.queryResultArea=c("<div class='"+a+"_results'></div>"),"function"==typeof(i=this.queryResultArea).scrollLock&&i.scrollLock(),this.queryResultAreaVisible=!1,this._val=this.element.val(),this.oldQuery=this._val,this.queryResultArea.on("click","li."+a+"_choice",function(){var e;e=c(this).data("value"),s.selectChoiceByValue(e),s.hideResults(),s._val=s.element.val(),s.element.focus()}),this.queryResultArea.on("mouseenter","li."+a+"_choice",function(){s.queryResultArea.find("li."+a+"_choice.active").removeClass("active"),c(this).addClass("active")}),this.element.on("keyup change search",this.doQuery),this.element.on("keydown",this.doSelection)}return e.prototype.doQuery=function(){var e;e=this.element.val(),this._val!==e&&(this._val=e,""===(this.oldQuery=e)?(this.hideResults(),this.selectChoiceByValue(null)):this.insertFilteredChoiceElements(e))},e.prototype.doSelection=function(e){if(27===e.which&&(this.display(),this.hideResults()),this.queryResultAreaVisible)switch(e.which){case 9:this.selectHighlightedChoice();break;case 13:e.preventDefault(),this.selectHighlightedChoice();break;case 38:e.preventDefault(),this.highlightPreviousChoice(),this.scroll();break;case 40:e.preventDefault(),this.highlightNextChoice(),this.scroll()}else switch(e.which){case 40:e.preventDefault(),null!=this.selectedChoice?this.insertFilteredChoiceElements(this.oldQuery):this.insertFilteredChoiceElements("");break;case 9:this.revert()}},e.prototype.openResults=function(e){e.stopPropagation(),this.revertOtherInstances(),null!=this.selectedChoice?this.insertFilteredChoiceElements(this.oldQuery):this.insertFilteredChoiceElements("")},e.prototype.revert=function(){this.queryResultAreaVisible?(this.display(),this.hideResults()):""===this.element.val()&&this.selectChoiceByValue(null)},e.prototype.reposition=function(){this.queryResultAreaVisible&&this.positionResultsArea()},e.prototype.insertFilteredChoiceElements=function(i){var t,e,s,l,h,o,n,r,u;r=(e=""===i?this.choices:this.choices.filter(this.options.filterFn(this.oldQuery))).slice(0,this.options.maxResults),(t=this.defaultSelectedChoice)&&0<=p.call(e,t)&&(p.call(r,t)<0?(r.unshift(t),r.pop()):r[0]!==t&&(r=r.filter(function(e){return e.value!==t.value})).unshift(t)),1===(s=this.options.formatChoice).length&&(s=s(i)),n=!1,0===(o=r.map((u=this,function(e){var t;return(t=c("<li class='"+a+"_choice'></li>")).attr("data-value",e.value),t.html(s(e,i)),e===u.selectedChoice&&(n=!0,t.addClass("active")),t}))).length?(l=c("<p class='"+a+"_noresults'>no matches</p>"),this.queryResultArea.empty().append(l)):(n||null!==t&&o[0].addClass("active"),h=c("<ul></ul>").append(o),this.queryResultArea.empty().append(h)),this.showResults()},e.prototype.scroll=function(){var e,t,i,s,l,h,o;h=this.queryResultArea.height(),l=(o=this.queryResultArea.scrollTop())+h,null!=(e=this.getHighlightedChoice())&&(i=e.outerHeight(),t=(s=e.position().top+o)+i,s<o&&this.queryResultArea.scrollTop(s),l<t&&this.queryResultArea.scrollTop(t-h))},e.prototype.positionResultsArea=function(){var e,t,i,s,l,h;t=this.element.offset(),e=this.element.outerHeight(),i=this.element.outerWidth(),l=this.queryResultArea.outerHeight(),s=t.top+e+l,h=c(o).height()+c(o).scrollTop(),this.queryResultArea.outerWidth(i),this.queryResultArea.css({left:t.left}),h<s?this.queryResultArea.css({top:t.top-l}):this.queryResultArea.css({top:t.top+e})},e.prototype.getHighlightedChoice=function(){var e;return 1===(e=this.queryResultArea.find("li."+a+"_choice.active")).length?e:null},e.prototype.highlightNextChoice=function(){var e,t,i;null!=(t=this.getHighlightedChoice())?1===(i=t.next("li."+a+"_choice")).length&&(t.removeClass("active"),i.addClass("active")):(e=this.queryResultArea.find("li."+a+"_choice")).length&&c(e[0]).addClass("active")},e.prototype.highlightPreviousChoice=function(){var e,t,i;null!=(t=this.getHighlightedChoice())?1===(i=t.prev("li."+a+"_choice")).length&&(t.removeClass("active"),i.addClass("active")):(e=this.queryResultArea.find("li."+a+"_choice")).length&&c(e[e.length-1]).addClass("active")},e.prototype.selectHighlightedChoice=function(){var e,t;null!=(e=this.getHighlightedChoice())?(t=e.data("value"),this.selectChoiceByValue(t),this._val=this.element.val(),this.hideResults()):this.revert()},e.prototype.display=function(){null!=this.selectedChoice?(this.selectedChoice.text,this.element.val(this.selectedChoice.text)):this.element.val(""),"undefined"!=typeof Event&&this._element.dispatchEvent(new Event("input")),this._val=this.element.val()},e.prototype.selectChoiceByValue=function(t){var e,i,s;i=this.getValue(),null!=t&&""!==t&&null!=(e=this.choices.filter(function(e){return e.value==t}))[0]?this.selectedChoice=e[0]:this.selectedChoice=null,(s=this.getValue())!==i&&this.element.trigger("update",[s]),this.display()},e.prototype.revertOtherInstances=function(){var e,t,i;for(e=0,t=r.length;e<t;e++)(i=r[e])!==this&&i.revert()},e.prototype.publicMethods=["showResults","hideResults","getChoices","setChoices","getValue","setValue","destroy"],e.prototype.showResults=function(){c("body").append(this.queryResultArea),this.queryResultAreaVisible=!0,this.scroll(),this.positionResultsArea()},e.prototype.hideResults=function(){this.queryResultArea.detach(),this.queryResultAreaVisible=!1},e.prototype.getChoices=function(){return this.choices},e.prototype.setChoices=function(e){return this.choices=e,null!=this.selectedChoice&&this.selectChoiceByValue(this.selectedChoice.value),this.oldQuery="",e},e.prototype.getValue=function(){return null!=this.selectedChoice?this.selectedChoice.value:null},e.prototype.setValue=function(e){var t;return(t=this.getValue())!==e?(this.selectChoiceByValue(e),this.oldQuery="",this.getValue()):t},e.prototype.destroy=function(){var t;this.element.off("keyup change search",this.doQuery),this.element.off("keydown",this.doSelection),this.options.openOnClick&&this.element.off("click",this.openResults),this.element.removeClass(a),this.queryResultArea.remove(),c.removeData(this.element[0],"plugin_"+a),r=r.filter((t=this,function(e){return e!==t}))},e}(),c("html").on("click",function(){var e,t;for(e=0,t=r.length;e<t;e++)r[e].revert()}),c(o).on("resize scroll",function(){var e,t,i;for(e=0,t=r.length;e<t;e++)(i=r[e]).queryResultAreaVisible&&i.reposition()}),c.fn[a]=function(s){var l,h;return l=Array.prototype.slice.call(arguments,1),h=[],this.each(function(){var e,t,i;if(c.data(this,"plugin_"+a)){if(null!=s&&"string"==typeof s){if(i=c.data(this,"plugin_"+a),e=s,!(0<=p.call(i.publicMethods,e)))throw new Error(a+" has no method '"+e+"'");h.push(i[e].apply(i,l))}}else t=new n(this,s),r.push(t),h.push(c.data(this,"plugin_"+a,t))}),h}}).call(this);