/*
 * jQuery MultiSelect UI Widget 1.7
 * Copyright (c) 2010 Eric Hynds
 *
 * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/
 *
 * Depends:
 *   - jQuery 1.4.2+
 *   - jQuery UI 1.8 widget factory
 *
 * Optional:
 *   - jQuery UI effects
 *   - jQuery UI position utility
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
*/
(function(d,q){var r=0;d.widget("ech.multiselect",{options:{header:true,height:175,minWidth:225,classes:"",checkAllText:"Check all",uncheckAllText:"Uncheck all",noneSelectedText:"Select options",selectedText:"# selected",selectedList:0,show:"",hide:"",autoOpen:false,multiple:true,position:{}},_create:function(){var b=this.element.hide(),a=this.options,e=[],c=b.attr("id")||r++;this.speed=d.fx.speeds._default;this._isOpen=false;var g=(this.button=d('<button type="button"><span class="ui-icon ui-icon-triangle-2-n-s"></span></button>')).addClass("ui-multiselect ui-widget ui-state-default ui-corner-all").addClass(a.classes).attr({title:b.attr("title"), "aria-haspopup":true}).insertAfter(b);(this.buttonlabel=d("<span></span>")).html(a.noneSelectedText).appendTo(g);var f=(this.menu=d("<div />")).addClass("ui-multiselect-menu ui-widget ui-widget-content ui-corner-all").addClass(a.classes).insertAfter(g),h=(this.header=d("<div />")).addClass("ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix").appendTo(f);d("<ul />").addClass("ui-helper-reset").html(function(){return a.header===true?'<li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span>'+ a.checkAllText+'</span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span>'+a.uncheckAllText+"</span></a></li>":typeof a.header==="string"?"<li>"+a.header+"</li>":""}).append('<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-close"></span></a></li>').appendTo(h);var i=(this.checkboxContainer=d("<ul />")).addClass("ui-multiselect-checkboxes ui-helper-reset").appendTo(f);b.find("option").each(function(k){var l= d(this),o=l.html(),p=this.value;k=this.id||"ui-multiselect-"+c+"-option-"+k;var j=l.parent(),m=l.is(":disabled"),n=["ui-corner-all"];if(j.is("optgroup")){j=j.attr("label");if(d.inArray(j,e)===-1){d('<li><a href="#">'+j+"</a></li>").addClass("ui-multiselect-optgroup-label").appendTo(i);e.push(j)}}if(p.length>0){m&&n.push("ui-state-disabled");j=d("<li />").addClass(m?"ui-multiselect-disabled":"").appendTo(i);n=d("<label />").attr("for",k).addClass(n.join(" ")).appendTo(j);d('<input type="'+(a.multiple? "checkbox":"radio")+'" '+(l.is(":selected")?'checked="checked"':"")+'" name="multiselect_'+c+'" />').attr({id:k,title:o,disabled:m,"aria-disabled":m}).val(p).appendTo(n).after("<span>"+o+"</span>")}});this.labels=f.find("label");if(!a.multiple)this.radios=f.find(":radio");this._setButtonWidth();this._setMenuWidth();this._bindEvents();g[0].defaultValue=this.update()},_init:function(){if(this.options.header===false||this.options.multiple===false)this.header.hide();this.options.autoOpen&&this.open(); this.element.is(":disabled")&&this.disable()},_bindEvents:function(){function b(){a[a._isOpen?"close":"open"]();return false}var a=this,e=this.button;e.find("span").bind("click.multiselect",b);e.bind({click:b,keypress:function(c){switch(c.which){case 27:case 38:case 37:a.close();break;case 39:case 40:a.open()}},mouseenter:function(){e.hasClass("ui-state-disabled")||d(this).addClass("ui-state-hover")},mouseleave:function(){d(this).removeClass("ui-state-hover")},focus:function(){e.hasClass("ui-state-disabled")|| d(this).addClass("ui-state-focus")},blur:function(){d(this).removeClass("ui-state-focus")}});this.header.delegate("a","click.multiselect",function(c){d(this).hasClass("ui-multiselect-close")?a.close():a[d(this).hasClass("ui-multiselect-all")?"checkAll":"uncheckAll"]();c.preventDefault()});this.menu.delegate("li.ui-multiselect-optgroup-label a","click.multiselect",function(c){var g=d(this),f=g.parent().nextUntil("li.ui-multiselect-optgroup-label").find("input:visible:not(:disabled)");a._toggleChecked(f.filter(":checked").length!== f.length,f);a._trigger("optgrouptoggle",c,{inputs:f.get(),label:g.parent().text(),checked:f[0].checked});c.preventDefault()}).delegate("label","mouseenter",function(){if(!d(this).hasClass("ui-state-disabled")){a.labels.removeClass("ui-state-hover");d(this).addClass("ui-state-hover").find("input").focus()}}).delegate("label","keydown",function(c){switch(c.which){case 9:case 27:a.close();break;case 38:case 40:case 37:case 39:a._traverse(c.which,this);c.preventDefault();break;case 13:c.preventDefault(); d(this).find("input").trigger("click")}}).delegate(":checkbox, :radio","click",function(c){var g=d(this),f=this.value,h=this.checked,i=a.element.find("option");if(g.is(":disabled")||a._trigger("click",c,{value:f,text:this.title,checked:h})===false)c.preventDefault();else{a.options.multiple||i.not(function(){return this.value===f}).removeAttr("selected");g.attr("aria-selected",h);i.filter(function(){return this.value===f}).attr("selected",h?"selected":"");a.update(!c.originalEvent?h?-1:1:0)}});d(document).bind("click.multiselect", function(c){var g=d(c.target);a._isOpen&&!d.contains(a.menu[0],c.target)&&!g.is("button.ui-multiselect")&&a.close()});d(this.element[0].form).bind("reset",function(){setTimeout(function(){a.update()},10)})},_setButtonWidth:function(){var b=this.element.outerWidth(),a=this.options;if(/\d/.test(a.minWidth)&&b<a.minWidth)b=a.minWidth;this.button.width(b)},_setMenuWidth:function(){var b=this.menu,a=this.button.outerWidth()-parseInt(b.css("padding-left"),10)-parseInt(b.css("padding-right"),10)-parseInt(b.css("border-right-width"), 10)-parseInt(b.css("border-left-width"),10);b.width(a||this.button.outerWidth())},_traverse:function(b,a){var e=d(a),c=b===38||b===37;e=e.parent()[c?"prevAll":"nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[c?"last":"first"]();if(e.length)e.find("label").trigger("mouseover");else{e=this.menu.find("ul:last");this.menu.find("label")[c?"last":"first"]().trigger("mouseover");e.scrollTop(c?e.height():0)}},_toggleChecked:function(b,a){var e=a&&a.length?a:this.labels.find("input"); e.not(":disabled").attr({checked:b,"aria-selected":b});this.update();var c=e.map(function(){return this.value}).get();this.element.find("option").filter(function(){return!this.disabled&&d.inArray(this.value,c)>-1}).attr({selected:b,"aria-selected":b})},_toggleDisabled:function(b){this.button.attr({disabled:b,"aria-disabled":b})[b?"addClass":"removeClass"]("ui-state-disabled");this.menu.find("input").attr({disabled:b,"aria-disabled":b}).parent()[b?"addClass":"removeClass"]("ui-state-disabled");this.element.attr({disabled:b, "aria-disabled":b})},update:function(b){if(b===q)b=0;var a=this.options,e=this.labels.find("input"),c=e.filter(":checked");b=c.length+b;a=b===0?a.noneSelectedText:d.isFunction(a.selectedText)?a.selectedText.call(this,b,e.length,c.get()):/\d/.test(a.selectedList)&&a.selectedList>0&&b<=a.selectedList?c.map(function(){return this.title}).get().join(", "):a.selectedText.replace("#",b).replace("#",e.length);this.buttonlabel.html(a);return a},open:function(){var b=this.button,a=this.menu,e=this.speed,c= this.options;if(!(this._trigger("beforeopen")===false||b.hasClass("ui-state-disabled")||this._isOpen)){d(":ech-multiselect").not(this.element).each(function(){var i=d(this);i.multiselect("isOpen")&&i.multiselect("close")});var g=a.find("ul:last"),f=c.show,h=b.position();if(d.isArray(c.show)){f=c.show[0];e=c.show[1]||this.speed}g.scrollTop(0).height(c.height);if(d.ui.position&&!d.isEmptyObject(c.position)){c.position.of=c.position.of||b;a.show().position(c.position).hide().show(f,e)}else a.css({top:h.top+ b.outerHeight(),left:h.left}).show(f,e);this.labels.eq(0).trigger("mouseover").trigger("mouseenter").find("input").trigger("focus");b.addClass("ui-state-active");this._isOpen=true;this._trigger("open")}},close:function(){if(this._trigger("beforeclose")!==false){var b=this.options,a=b.hide,e=this.speed;if(d.isArray(b.hide)){a=b.hide[0];e=b.hide[1]||this.speed}this.menu.hide(a,e);this.button.removeClass("ui-state-active").trigger("blur").trigger("mouseleave");this._trigger("close");this._isOpen=false}}, enable:function(){this._toggleDisabled(false)},disable:function(){this._toggleDisabled(true)},checkAll:function(){this._toggleChecked(true);this._trigger("checkAll")},uncheckAll:function(){this._toggleChecked(false);this._trigger("uncheckAll")},getChecked:function(){return this.menu.find("input").filter(":checked")},destroy:function(){d.Widget.prototype.destroy.call(this);this.button.remove();this.menu.remove();this.element.show();return this},isOpen:function(){return this._isOpen},widget:function(){return this.menu}, _setOption:function(b,a){var e=this.menu;switch(b){case "header":e.find("div.ui-multiselect-header")[a?"show":"hide"]();break;case "checkAllText":e.find("a.ui-multiselect-all span").eq(-1).text(a);break;case "uncheckAllText":e.find("a.ui-multiselect-none span").eq(-1).text(a);break;case "height":e.find("ul:last").height(parseInt(a,10));break;case "minWidth":this.options[b]=parseInt(a,10);this._setButtonWidth();this._setMenuWidth();break;case "selectedText":case "selectedList":case "noneSelectedText":this.options[b]= a;this.update();break;case "classes":e.add(this.button).removeClass(this.options.classes).addClass(a)}d.Widget.prototype._setOption.apply(this,arguments)}})})(jQuery);
