/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ /* * jQuery MultiSelect UI Widget Filtering Plugin 2.0.0 * Copyright (c) 2012 Eric Hynds * * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ * * Depends: * - jQuery UI MultiSelect widget * * Dual licensed under the MIT and GPL licenses: * http://www.opensource.org/licenses/mit-license.php * http://www.gnu.org/licenses/gpl.html * */ (function($){var rEscape=/[\-\[\]{}()*+?.,\\\^$|#\s]/g;function debounce(func,wait,immediate){var timeout;return function(){var context=this,args=arguments;var later=function(){timeout=null;if(!immediate){func.apply(context,args)}};var callNow=immediate&&!timeout;clearTimeout(timeout);timeout=setTimeout(later,wait);if(callNow){func.apply(context,args)}}}$.widget("ech.multiselectfilter",{options:{label:"Filter:",width:null,placeholder:"Enter keywords",autoReset:false,debounceMS:250},_create:function(){var opts=this.options;var elem=$(this.element);this.instance=elem.multiselect("instance");this.header=this.instance.menu.find(".ui-multiselect-header").addClass("ui-multiselect-hasfilter");this.input=$("").attr({placeholder:opts.placeholder,type:"search"}).css({width:/\d/.test(opts.width)?opts.width+"px":null}).bind({keydown:function(e){if(e.which===13){e.preventDefault()}else if(e.which===27){elem.multiselect("close");e.preventDefault()}else if(e.which===9&&e.shiftKey){elem.multiselect("close");e.preventDefault()}else if(e.altKey){switch(e.which){case 82:e.preventDefault();$(this).val("").trigger("input","");break;case 65:elem.multiselect("checkAll");break;case 85:elem.multiselect("uncheckAll");break;case 76:elem.multiselect("instance").labels.first().trigger("mouseenter");break}}},input:$.proxy(debounce(this._handler,opts.debounceMS),this),search:$.proxy(this._handler,this)});if(this.options.autoReset){elem.bind("multiselectclose",$.proxy(this._reset,this))}elem.bind("multiselectrefresh",$.proxy(function(){this.updateCache();this._handler()},this));this.wrapper=$("
").addClass("ui-multiselect-filter").text(opts.label).append(this.input).prependTo(this.header);this.inputs=this.instance.menu.find('input[type="checkbox"], input[type="radio"]');this.updateCache();this.instance._toggleChecked=function(flag,group){var $inputs=group&&group.length?group:this.labels.find("input");var _self=this;var selector=_self._isOpen?":disabled, :hidden":":disabled";$inputs=$inputs.not(selector).each(this._toggleState("checked",flag));this.update();var values={};$inputs.each(function(){values[this.value]=true});this.element.find("option").filter(function(){if(!this.disabled&&values[this.value]){_self._toggleState("selected",flag).call(this)}});if($inputs.length){this.element.trigger("change")}}},_handler:function(e){var term=$.trim(this.input[0].value.toLowerCase()),rows=this.rows,inputs=this.inputs,cache=this.cache;var $groups=this.instance.menu.find(".ui-multiselect-optgroup");$groups.show();if(!term){rows.show()}else{rows.hide();var regex=new RegExp(term.replace(rEscape,"\\$&"),"gi");this._trigger("filter",e,$.map(cache,function(v,i){if(v.search(regex)!==-1){rows.eq(i).show();return inputs.get(i)}return null}))}$groups.each(function(){var $this=$(this);if(!$this.children("li:visible").length){$this.hide()}});this.instance._setMenuHeight()},_reset:function(){this.input.val("").trigger("input","")},updateCache:function(){this.rows=this.instance.labels.parent();this.cache=this.element.children().map(function(){var elem=$(this);if(this.tagName.toLowerCase()==="optgroup"){elem=elem.children()}return elem.map(function(){return this.innerHTML.toLowerCase()}).get()}).get()},widget:function(){return this.wrapper},destroy:function(){$.Widget.prototype.destroy.call(this);this.input.val("").trigger("keyup");this.wrapper.remove()}})})(jQuery);