/*
 * jQuery MultiSelect UI Widget Filtering Plugin 1.1
 * Copyright (c) 2010 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(a){var b=/[\-\[\]{}()*+?.,\\^$|#\s]/g;a.widget("ech.multiselectfilter",{options:{label:"Filter:",width:null,placeholder:"Enter keywords"},_create:function(){var b=this,c=this.options,d=this.instance=a(this.element).data("multiselect"),e=this.header=d.menu.find(".ui-multiselect-header").addClass("ui-multiselect-hasfilter"),f=this.wrapper=a('<div class="ui-multiselect-filter">'+(c.label.length?c.label:"")+'<input placeholder="'+c.placeholder+'" type="search"'+(/\d/.test(c.width)?'style="width:'+c.width+'px"':"")+" /></div>").prependTo(this.header);this.inputs=d.menu.find('input[type="checkbox"], input[type="radio"]');this.input=f.find("input").bind({keydown:function(a){if(a.which===13){a.preventDefault()}},keyup:a.proxy(b._handler,b),click:a.proxy(b._handler,b)});this.updateCache();d._toggleChecked=function(c,d){var e=d&&d.length?d:this.labels.find("input"),f=b.instance._isOpen?":disabled, :hidden":":disabled";e.not(f).attr("checked",c);this.update();var g=e.map(function(){return this.value}).get();this.element.find("option").filter(function(){return!this.disabled&&a.inArray(this.value,g)>-1}).attr({selected:c,"aria-selected":c})};a(document).bind("multiselectrefresh",function(){b.updateCache();b._handler()})},_handler:function(c){var d=a.trim(this.input[0].value.toLowerCase()),e=this.rows,f=this.inputs,g=this.cache;if(!d){e.show()}else{e.hide();var h=new RegExp(d.replace(b,"\\$&"),"gi");this._trigger("filter",c,a.map(g,function(a,b){if(a.search(h)!==-1){e.eq(b).show();return f.get(b)}return null}))}this.instance.menu.find(".ui-multiselect-optgroup-label").each(function(){var b=a(this);b[b.nextUntil(".ui-multiselect-optgroup-label").filter(":visible").length?"show":"hide"]()})},updateCache:function(){this.rows=this.instance.menu.find(".ui-multiselect-checkboxes li:not(.ui-multiselect-optgroup-label)");this.cache=this.element.children().map(function(){var b=a(this);if(this.tagName.toLowerCase()==="optgroup"){b=b.children()}if(!b.val().length){return null}return b.map(function(){return this.innerHTML.toLowerCase()}).get()}).get()},widget:function(){return this.wrapper},destroy:function(){a.Widget.prototype.destroy.call(this);this.input.val("").trigger("keyup");this.wrapper.remove()}})})(jQuery)
