/*
 * jQuery MultiSelect UI Widget 1.8
 * 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(c){var o=0;c.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 a=this.element.hide(),b=this.options;this.speed=c.fx.speeds._default;this._isOpen=false;a=(this.button=c('<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(b.classes).attr({title:a.attr("title"), "aria-haspopup":true}).insertAfter(a);(this.buttonlabel=c("<span></span>")).html(b.noneSelectedText).appendTo(a);a=(this.menu=c("<div />")).addClass("ui-multiselect-menu ui-widget ui-widget-content ui-corner-all").addClass(b.classes).insertAfter(a);var e=(this.header=c("<div />")).addClass("ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix").appendTo(a);(this.headerLinkContainer=c("<ul />")).addClass("ui-helper-reset").html(function(){return b.header===true?'<li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span>'+ b.checkAllText+'</span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span>'+b.uncheckAllText+"</span></a></li>":typeof b.header==="string"?"<li>"+b.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(e);(this.checkboxContainer=c("<ul />")).addClass("ui-multiselect-checkboxes ui-helper-reset").appendTo(a);this._bindEvents(); this.refresh(true)},_init:function(){this.options.header===false&&this.header.hide();this.options.multiple||this.headerLinkContainer.find(".ui-multiselect-all, .ui-multiselect-none").hide();this.options.autoOpen&&this.open();this.element.is(":disabled")&&this.disable()},refresh:function(a){var b=this.options,e=this.menu,d=this.button,g=this.checkboxContainer,f=[],i=this.element.attr("id")||o++;g.empty();this.element.find("option").each(function(h){var j=c(this),m=j.html(),n=this.value;h=this.id|| "ui-multiselect-"+i+"-option-"+h;var k=j.parent();j=j.is(":disabled");var l=["ui-corner-all"];if(k.is("optgroup")){k=k.attr("label");if(c.inArray(k,f)===-1){c('<li><a href="#">'+k+"</a></li>").addClass("ui-multiselect-optgroup-label").appendTo(g);f.push(k)}}if(n.length>0){j&&l.push("ui-state-disabled");k=c("<li />").addClass(j?"ui-multiselect-disabled":"").appendTo(g);l=c("<label />").attr("for",h).addClass(l.join(" ")).appendTo(k);c('<input type="'+(b.multiple?"checkbox":"radio")+'" '+(this.selected? 'checked="checked"':"")+' name="multiselect_'+i+'" />').attr({id:h,checked:this.selected,title:m,disabled:j,"aria-disabled":j,"aria-selected":this.selected}).val(n).appendTo(l).after("<span>"+m+"</span>")}});this.labels=e.find("label");this._setButtonWidth();this._setMenuWidth();d[0].defaultValue=this.update();a||this._trigger("refresh")},update:function(){var a=this.options,b=this.labels.find("input"),e=b.filter(":checked"),d=e.length;a=d===0?a.noneSelectedText:c.isFunction(a.selectedText)?a.selectedText.call(this, d,b.length,e.get()):/\d/.test(a.selectedList)&&a.selectedList>0&&d<=a.selectedList?e.map(function(){return this.title}).get().join(", "):a.selectedText.replace("#",d).replace("#",b.length);this.buttonlabel.html(a);return a},_bindEvents:function(){function a(){b[b._isOpen?"close":"open"]();return false}var b=this,e=this.button;e.find("span").bind("click.multiselect",a);e.bind({click:a,keypress:function(d){switch(d.which){case 27:case 38:case 37:b.close();break;case 39:case 40:b.open()}},mouseenter:function(){e.hasClass("ui-state-disabled")|| c(this).addClass("ui-state-hover")},mouseleave:function(){c(this).removeClass("ui-state-hover")},focus:function(){e.hasClass("ui-state-disabled")||c(this).addClass("ui-state-focus")},blur:function(){c(this).removeClass("ui-state-focus")}});this.header.delegate("a","click.multiselect",function(d){c(this).hasClass("ui-multiselect-close")?b.close():b[c(this).hasClass("ui-multiselect-all")?"checkAll":"uncheckAll"]();d.preventDefault()});this.menu.delegate("li.ui-multiselect-optgroup-label a","click.multiselect", function(d){var g=c(this),f=g.parent().nextUntil("li.ui-multiselect-optgroup-label").find("input:visible:not(:disabled)");b._toggleChecked(f.filter(":checked").length!==f.length,f);b._trigger("optgrouptoggle",d,{inputs:f.get(),label:g.parent().text(),checked:f[0].checked});d.preventDefault()}).delegate("label","mouseenter",function(){if(!c(this).hasClass("ui-state-disabled")){b.labels.removeClass("ui-state-hover");c(this).addClass("ui-state-hover").find("input").focus()}}).delegate("label","keydown", function(d){switch(d.which){case 9:case 27:b.close();break;case 38:case 40:case 37:case 39:b._traverse(d.which,this);d.preventDefault();break;case 13:d.preventDefault();c(this).find("input").trigger("click")}}).delegate(":checkbox, :radio","click",function(d){var g=c(this),f=this.value,i=this.checked,h=b.element.find("option");if(g.is(":disabled")||b._trigger("click",d,{value:f,text:this.title,checked:i})===false)d.preventDefault();else{b.options.multiple||h.not(function(){return this.value===f}).removeAttr("selected"); g.attr("aria-selected",i);h.filter(function(){return this.value===f}).attr("selected",i?"selected":"");setTimeout(c.proxy(b.update,b),10)}});c(document).bind("click.multiselect",function(d){var g=c(d.target);b._isOpen&&!c.contains(b.menu[0],d.target)&&!g.is("button.ui-multiselect")&&b.close()});c(this.element[0].form).bind("reset",function(){setTimeout(function(){b.update()},10)})},_setButtonWidth:function(){var a=this.element.outerWidth(),b=this.options;if(/\d/.test(b.minWidth)&&a<b.minWidth)a=b.minWidth; this.button.width(a)},_setMenuWidth:function(){var a=this.menu,b=this.button.outerWidth()-parseInt(a.css("padding-left"),10)-parseInt(a.css("padding-right"),10)-parseInt(a.css("border-right-width"),10)-parseInt(a.css("border-left-width"),10);a.width(b||this.button.outerWidth())},_traverse:function(a,b){var e=c(b),d=a===38||a===37;e=e.parent()[d?"prevAll":"nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[d?"last":"first"]();if(e.length)e.find("label").trigger("mouseover"); else{e=this.menu.find("ul:last");this.menu.find("label")[d?"last":"first"]().trigger("mouseover");e.scrollTop(d?e.height():0)}},_toggleChecked:function(a,b){var e=b&&b.length?b:this.labels.find("input");e.not(":disabled").attr({checked:a,"aria-selected":a});this.update();var d=e.map(function(){return this.value}).get();this.element.find("option").filter(function(){return!this.disabled&&c.inArray(this.value,d)>-1}).attr({selected:a,"aria-selected":a})},_toggleDisabled:function(a){this.button.attr({disabled:a, "aria-disabled":a})[a?"addClass":"removeClass"]("ui-state-disabled");this.menu.find("input").attr({disabled:a,"aria-disabled":a}).parent()[a?"addClass":"removeClass"]("ui-state-disabled");this.element.attr({disabled:a,"aria-disabled":a})},open:function(){var a=this.button,b=this.menu,e=this.speed,d=this.options;if(!(this._trigger("beforeopen")===false||a.hasClass("ui-state-disabled")||this._isOpen)){c(":ech-multiselect").not(this.element).each(function(){var h=c(this);h.multiselect("isOpen")&&h.multiselect("close")}); var g=b.find("ul:last"),f=d.show,i=a.position();if(c.isArray(d.show)){f=d.show[0];e=d.show[1]||this.speed}g.scrollTop(0).height(d.height);if(c.ui.position&&!c.isEmptyObject(d.position)){d.position.of=d.position.of||a;b.show().position(d.position).hide().show(f,e)}else b.css({top:i.top+a.outerHeight(),left:i.left}).show(f,e);this.labels.eq(0).trigger("mouseover").trigger("mouseenter").find("input").trigger("focus");a.addClass("ui-state-active");this._isOpen=true;this._trigger("open")}},close:function(){if(this._trigger("beforeclose")!== false){var a=this.options,b=a.hide,e=this.speed;if(c.isArray(a.hide)){b=a.hide[0];e=a.hide[1]||this.speed}this.menu.hide(b,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(){c.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(a,b){var e=this.menu;switch(a){case "header":e.find("div.ui-multiselect-header")[b?"show":"hide"]();break;case "checkAllText":e.find("a.ui-multiselect-all span").eq(-1).text(b);break;case "uncheckAllText":e.find("a.ui-multiselect-none span").eq(-1).text(b);break;case "height":e.find("ul:last").height(parseInt(b, 10));break;case "minWidth":this.options[a]=parseInt(b,10);this._setButtonWidth();this._setMenuWidth();break;case "selectedText":case "selectedList":case "noneSelectedText":this.options[a]=b;this.update();break;case "classes":e.add(this.button).removeClass(this.options.classes).addClass(b)}c.Widget.prototype._setOption.apply(this,arguments)}})})(jQuery);
