/************************************ MINIMALECT 0.8b A minimalistic select replacement http://git.io/Xedg9w ************************************/ !function(e,t,s){function i(t,s){this.element=e(t),this.options=e.extend({},a,s),this._defaults=a,this._name=l,this.label=e('[for="'+this.element.attr("id")+'"]').attr("for","minict_"+this.element.attr("id")),this._init()}var l="minimalect",a={theme:"",reset:!1,transition:"fade",transition_time:150,remove_empty_option:!0,searchable:!0,ajax:null,debug:!1,live:!0,placeholder:"Select a choice",empty:"No results match your keyword.",error_message:"There was a problem with the request.",class_container:"minict_wrapper",class_group:"minict_group",class_empty:"minict_empty",class_active:"active",class_disabled:"disabled",class_selected:"selected",class_hidden:"hidden",class_highlighted:"highlighted",class_first:"minict_first",class_last:"minict_last",class_reset:"minict_reset",beforeinit:function(){},afterinit:function(){},onchange:function(){},onopen:function(){},onclose:function(){},onfilter:function(){}};i.prototype={_init:function(){this.options.beforeinit();var i=this.options,l=this;if(this.wrapper=e('
'),this.element.hide().after(this.wrapper),i.theme&&this.wrapper.addClass(i.theme),this.element.prop("disabled")&&this.wrapper.addClass(i.class_disabled),this.input=e(""+(this.element.find("option[selected]").html()||"")+"").appendTo(this.wrapper),i.reset&&(this.reset=e('×').appendTo(this.wrapper)),this.ul=e("").appendTo(this.wrapper),this.items=this.wrapper.find("li"),this.element.find("option[selected]").length&&(this._showResetLink(),this.items.filter('[data-value="'+this.element.find("option[selected]").val()+'"]').addClass(i.class_selected)),e(s).on("click",function(){l._hideChoices(l.wrapper)}),e("*").not(this.wrapper).not(this.wrapper.find("*")).on("focus",function(){l._hideChoices(l.wrapper)}),this.wrapper.on("click",function(e){e.stopPropagation(),l.element.prop("multiple")||l.element.prop("disabled")||l._toggleChoices()}),this.label.on("click",function(e){e.stopPropagation(),l.input.trigger("focus")}),this.wrapper.on("click","li:not(."+i.class_group+", ."+i.class_empty+", ."+i.class_disabled+")",function(){l._selectChoice(e(this))}),this.wrapper.on("click","li."+i.class_group+", li."+i.class_empty+", li."+i.class_disabled,function(e){e.stopPropagation(),l.input.focus()}),this.element.on("focus",function(){l.element.blur(),l._showChoices()}).on("blur",l._hideChoices).on("update",l.update),i.reset&&this.wrapper.on("click","a."+i.class_reset,function(e){return e.stopPropagation(),l._resetChoice(),!1}),this.input.on("focus click",function(e){e.stopPropagation(),l.element.prop("disabled")?l.input.blur():l._showChoices()}).on("keydown",function(e){switch(e.keyCode){case 38:e.preventDefault(),l._navigateChoices("up");break;case 40:e.preventDefault(),l._navigateChoices("down");break;case 13:case 9:l.items.filter("."+i.class_highlighted).length?l._selectChoice(l.items.filter("."+i.class_highlighted)):l.input.text()&&l._selectChoice(l.items.not("."+i.class_group+", ."+i.class_empty).filter(":visible").first()),13===e.keyCode&&(e.preventDefault(),l._hideChoices(l.wrapper));break;case 27:e.preventDefault(),l._hideChoices(l.wrapper)}}).on("keyup",function(t){-1===e.inArray(t.keyCode,[38,40,13,9,27])&&l._filterChoices()}),t.MutationObserver&&(this.observer=new MutationObserver(function(e){e.length>0&&(l.ul.html(l._parseSelect()+'
  • '+i.empty+"
  • "),l.items=l.wrapper.find('li'),l.options.debug&&console.log("Minimalect detected a DOM change for ",l.element))}),this.observer.observe(l.element[0],{childList:!0})),i.live){var a=this.element.val();setInterval(function(){a!=l.element.val()&&null!=l.element.val()&&""!=l.element.val()?(a=l.element.val(),"array"==typeof a?a.each(function(e,t){l._selectChoice(l.wrapper.find("li[data-value='"+t+"']"))}):l._selectChoice(l.wrapper.find("li[data-value='"+a+"']"))):(null==l.element.val()||""==l.element.val())&&(a=l.element.val(),l.items.removeClass(l.options.class_selected),l.input.text("").attr("data-placeholder",l.options.placeholder)),l.element.prop("disabled")?l.wrapper.addClass(i.class_disabled):l.wrapper.removeClass(i.class_disabled)},100)}i.afterinit()},_navigateChoices:function(e){var t=(this.wrapper,this.options),s=this.items,i="."+t.class_hidden+", ."+t.class_empty+", ."+t.class_group;if(!s.filter("."+t.class_highlighted).length)return"up"===e?s.not(i).last().addClass(t.class_highlighted):"down"===e&&s.not(i).first().addClass(t.class_highlighted),!1;if(cur=s.filter("."+t.class_highlighted),cur.removeClass(t.class_highlighted),"up"===e)if(s.not(i).first()[0]!=cur[0]){cur.prevAll("li").not(i).first().addClass(t.class_highlighted);var l=s.filter("."+t.class_highlighted).offset().top-this.ul.offset().top+this.ul.scrollTop();this.ul.scrollTop()>l&&this.ul.scrollTop(l)}else s.not(i).last().addClass(t.class_highlighted),this.ul.scrollTop(this.ul.height());else if("down"===e)if(s.not(i).last()[0]!=cur[0]){cur.nextAll("li").not(i).first().addClass(t.class_highlighted);var a=this.ul.height(),n=s.filter("."+t.class_highlighted).offset().top-this.ul.offset().top+s.filter("."+t.class_highlighted).outerHeight();n>a&&this.ul.scrollTop(this.ul.scrollTop()+n-a)}else s.not(i).first().addClass(t.class_highlighted),this.ul.scrollTop(0)},_parseSelect:function(){var t="";return this.element.find("optgroup").length?this.element.find("optgroup").each(function(){t+='
  • '+e(this).attr("label")+"
  • ",t+=this._parseElements(e(this).html())}):t=this._parseElements(this.element.html()),t},_parseElements:function(t){var s=this,i="";return e(e.trim(t)).filter("option").each(function(){var t=e(this);""===t.attr("value")&&s.options.remove_empty_option||(i+='
  • '+t.text()+"
  • ")}),i},_toggleChoices:function(){this.wrapper.hasClass(this.options.class_active)?this._hideChoices(this.wrapper):this._showChoices()},_showChoices:function(t){var s=this,i=this.wrapper,l=this.options;if(i.hasClass(l.class_active))"function"==typeof t&&t.call();else{switch(this._updateFirstLast(!1),e("."+l.class_container).each(function(){e(this)[0]!==i[0]&&s._hideChoices(e(this))}),"function"==typeof t&&t.call(),i.addClass(l.class_active),l.transition){case"fade":this.ul.fadeIn(l.transition_time);break;default:this.ul.show()}this.input.text("").focus(),this._hideResetLink(),this.options.onopen()}},_resetDropdown:function(e){var t=this.options;this.items.removeClass(t.class_hidden),this.wrapper.find("."+t.class_empty).hide(),this.items.filter("."+t.class_highlighted).removeClass(t.class_highlighted),"function"==typeof e&&e.call()},_hideChoices:function(e,t){var s=this.options,i=s.transition_time,l=this;if(e.hasClass(s.class_active)){switch(e.removeClass(s.class_active),s.transition){case"fade":e.children("ul").fadeOut(s.transition_time);break;default:e.children("ul").hide(),i=0}setTimeout(function(){l._resetDropdown(t),l.input.blur(),l.input.attr("data-placeholder")!=s.placeholder?l.input.text(l.input.attr("data-placeholder")):l.items.filter("."+s.class_selected).length||l.input.text("")},i),l._showResetLink(),s.onclose()}else"function"==typeof t&&t.call()},_filterChoices:function(){var t=this.wrapper,s=this.options,i=this;if(s.ajax)e.post(s.ajax,{q:this.input.text()}).success(function(l){if(s.debug&&console.log("Minimalect received ",l," for query '"+i.input.text()+"' in ",i.element),l.length){var a="";e.each(l,function(e,t){a+='"}),i.element.html(a),i.ul.html(i._parseSelect()+'
  • '+s.empty+"
  • "),t.find("."+s.class_empty).hide(),i.items=t.find("li"),i.options.onfilter(!0)}else i.ul.html('
  • '+s.empty+"
  • "),t.find("."+s.class_empty).show(),s.debug&&console.log("Minimalect didn't find any results for '"+i.input.text()+"' from ",i.element),i.options.onfilter(!1)}).error(function(e){t.find("."+s.class_empty).text(s.error_message),t.find("li").not("."+s.class_empty).addClass(s.class_hidden),t.find("."+s.class_empty).show(),s.debug&&console.error("Minimalect's AJAX query failed for ",i.element," - came back with ",e)});else{var l=this.input.text().replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&");this.items.filter("."+s.class_highlighted).removeClass(s.class_highlighted),this.items.not(s.class_group).each(function(){e(this).text().search(new RegExp(l,"i"))<0||e(this).hasClass(s.class_disabled)?e(this).addClass(s.class_hidden):e(this).removeClass(s.class_hidden)}),this.items.filter("."+s.class_group).removeClass(s.class_hidden).each(function(){nextlis=e(this).nextAll("li").not("."+s.class_hidden+", ."+s.class_empty),(nextlis.first().hasClass(s.class_group)||!nextlis.length)&&e(this).addClass(s.class_hidden)}),t.find("."+s.class_empty).hide(),this.items.not("."+s.class_hidden+", ."+s.class_empty).length?this.options.onfilter(!0):(t.find("."+s.class_empty).show(),s.debug&&console.log("Minimalect didn't find any results for '"+this.input.text()+"' from ",this.element),this.options.onfilter(!1)),this._updateFirstLast(!0)}},_selectChoice:function(t){var s=this.element,i=this.options,l=[],a=[];return t.hasClass(this.options.class_disabled)?!1:(this.element.prop("multiple")||this.items.removeClass(i.class_selected),t.addClass(i.class_selected),this.items.filter("."+i.class_selected).each(function(){l.push(e(this).data("value")),a.push(e(this).text())}),this.input.text(a.join(", ")).attr("data-placeholder",a.join(", ")),(s.val()!=t.data("value")||s.val()!=l)&&(s.val(l),s.trigger("change")),this._showResetLink(),void this.options.onchange(t.data("value"),t.text()))},_resetChoice:function(){this.element.val("").trigger("change"),this._hideResetLink()},_showResetLink:function(){(this.input.text().length>0||this.ul.find("li."+this.options.class_selected).length>0)&&this.options.reset&&this.reset.show()},_hideResetLink:function(){this.options.reset&&this.reset.hide()},_updateFirstLast:function(e){var t=this.wrapper,s=this.options;t.find("."+s.class_first+", ."+s.class_last).removeClass(s.class_first+" "+s.class_last),e?(this.items.filter(":visible").first().addClass(s.class_first),this.items.filter(":visible").last().addClass(s.class_last)):(this.items.first().addClass(s.class_first),this.items.not("."+s.class_empty).last().addClass(s.class_last))},destroy:function(){this.wrapper.remove(),this.element.off("change focus blur").show(),t.MutationObserver&&this.observer.disconnect(),this.options.debug&&console.log("Minimalect destroyed for ",this.element)},update:function(){this.ul.html(this._parseSelect()+'
  • '+this.options.empty+"
  • ")}},e.fn[l]=function(t,s){return this.each(function(){e.isFunction(i.prototype[t])&&"_"!=t.charAt(0)?1==arguments.length?e.data(this,"plugin_"+l)[t]():e.data(this,"plugin_"+l)[t](s):e.data(this,"plugin_"+l)||e.data(this,"plugin_"+l,new i(this,t))})}}(jQuery,window,document);