/*
 * jQuery MultiSelect UI Widget 1.12
 * Copyright (c) 2011 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){
    var j=0;
    d.widget("ech.multiselect",{
        options:{
            header:!0,
            height:175,
            minWidth:225,
            menuWidth: null,
            buttonWidth: null,
            classes:"",
            checkAllText:"Check all",
            uncheckAllText:"Uncheck all",
            noneSelectedText:"Select options",
            selectedText:"# selected",
            selectedList:0,
            show:"",
            hide:"",
            autoOpen:!1,
            multiple:!0,
            position:{}
    },
    _create:function(){
        var a=this.element.hide(),b=this.options;
        this.speed=d.fx.speeds._default;
        this._isOpen=!1;
        a=(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(b.classes).attr({
            title:a.attr("title"), 
            "aria-haspopup":!0,
            tabIndex:a.attr("tabIndex")
            }).insertAfter(a);
        (this.buttonlabel=d("<span />")).html(b.noneSelectedText).appendTo(a);
        var a=(this.menu=d("<div />")).addClass("ui-multiselect-menu ui-widget ui-widget-content ui-corner-all").addClass(b.classes).appendTo(document.body),c=(this.header=d("<div />")).addClass("ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix").appendTo(a);
        (this.headerLinkContainer=d("<ul />")).addClass("ui-helper-reset").html(function(){
            return!0=== b.header?'<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>":"string"===typeof b.header?"<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(c);
        (this.checkboxContainer= d("<ul />")).addClass("ui-multiselect-checkboxes ui-helper-reset").appendTo(a);
        this._bindEvents();
        this.refresh(!0);
        b.multiple||a.addClass("ui-multiselect-single")
        },
    _init:function(){
        !1===this.options.header&&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.element,c=this.options,e=this.menu,h=this.checkboxContainer, g=[],f=[],i=b.attr("id")||j++;
        b.find("option").each(function(b){
            d(this);
            var a=this.parentNode,e=this.innerHTML,h=this.title,j=this.value,b=this.id||"ui-multiselect-"+i+"-option-"+b,k=this.disabled,m=this.selected,l=["ui-corner-all"];
            "optgroup"===a.tagName.toLowerCase()&&(a=a.getAttribute("label"),-1===d.inArray(a,g)&&(f.push('<li class="ui-multiselect-optgroup-label"><a href="#">'+a+"</a></li>"),g.push(a)));
            k&&l.push("ui-state-disabled");
            m&&!c.multiple&&l.push("ui-state-active");
            f.push('<li class="'+ (k?"ui-multiselect-disabled":"")+'">');
            f.push('<label for="'+b+'" title="'+h+'" class="'+l.join(" ")+'">');
            f.push('<input id="'+b+'" name="multiselect_'+i+'" type="'+(c.multiple?"checkbox":"radio")+'" value="'+j+'" title="'+e+'"');
            m&&(f.push(' checked="checked"'),f.push(' aria-selected="true"'));
            k&&(f.push(' disabled="disabled"'),f.push(' aria-disabled="true"'));
            f.push(" /><span>"+e+"</span></label></li>")
            });
        h.html(f.join(""));
        this.labels=e.find("label");
        this._setButtonWidth();
        this._setMenuWidth();
        this.button[0].defaultValue=this.update();
        a||this._trigger("refresh")
        },
    update:function(){
        var a=this.options,b=this.labels.find("input"),c=b.filter("[checked]"),e=c.length,a=0===e?a.noneSelectedText:d.isFunction(a.selectedText)?a.selectedText.call(this,e,b.length,c.get()):/\d/.test(a.selectedList)&&0<a.selectedList&&e<=a.selectedList?c.map(function(){
            return d(this).next().text()
            }).get().join(", "):a.selectedText.replace("#",e).replace("#",b.length);
        this.buttonlabel.html(a);
        return a
        },
    _bindEvents:function(){
        function 
(){
            b[b._isOpen?  "close":"open"]();
            return!1
            }
            var b=this,c=this.button;
        c.find("span").bind("click.multiselect",a);
        c.bind({
            click:a,
            keypress:function(a){
                switch(a.which){
                    case 27:case 38:case 37:
                        b.close();
                        break;
                    case 39:case 40:
                        b.open()
                        }
                    },
        mouseenter:function(){
            c.hasClass("ui-state-disabled")||d(this).addClass("ui-state-hover")
            },
        mouseleave:function(){
            d(this).removeClass("ui-state-hover")
            },
        focus:function(){
            c.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(a){
        if(d(this).hasClass("ui-multiselect-close"))b.close();else b[d(this).hasClass("ui-multiselect-all")?"checkAll":"uncheckAll"]();
        a.preventDefault()
        });
    this.menu.delegate("li.ui-multiselect-optgroup-label a","click.multiselect",function(a){
        a.preventDefault();
        var c=d(this),g=c.parent().nextUntil("li.ui-multiselect-optgroup-label").find("input:visible:not(:disabled)"),f=g.get(),c=c.parent().text();
        !1!==b._trigger("beforeoptgrouptoggle",a,{
            inputs:f, 
            label:c
        })&&(b._toggleChecked(g.filter("[checked]").length!==g.length,g),b._trigger("optgrouptoggle",a,{
            inputs:f,
            label:c,
            checked:f[0].checked
            }))
        }).delegate("label","mouseenter.multiselect",function(){
        d(this).hasClass("ui-state-disabled")||(b.labels.removeClass("ui-state-hover"),d(this).addClass("ui-state-hover").find("input").focus())
        }).delegate("label","keydown.multiselect",function(a){
        a.preventDefault();
        switch(a.which){
            case 9:case 27:
                b.close();
                break;
            case 38:case 40:case 37:case 39:
                b._traverse(a.which, this);
                break;
            case 13:
                d(this).find("input")[0].click()
                }
            }).delegate('input[type="checkbox"], input[type="radio"]',"click.multiselect",function(a){
    var c=d(this),g=this.value,f=this.checked,i=b.element.find("option");
    this.disabled||!1===b._trigger("click",a,{
        value:g,
        text:this.title,
        checked:f
    })?a.preventDefault():(c.focus(),c.attr("aria-selected",f),i.each(function(){
        if(this.value===g)this.selected=f;
        else if(!b.options.multiple)this.selected=!1
            }),b.options.multiple||(b.labels.removeClass("ui-state-active"), c.closest("label").toggleClass("ui-state-active",f),b.close()),b.element.trigger("change"),setTimeout(d.proxy(b.update,b),10))
    });
d(document).bind("mousedown.multiselect",function(a){
    b._isOpen&&!d.contains(b.menu[0],a.target)&&!d.contains(b.button[0],a.target)&&a.target!==b.button[0]&&b.close()
    });
d(this.element[0].form).bind("reset.multiselect",function(){
    setTimeout(d.proxy(b.refresh,b),10)
    })
},
_setButtonWidth:function(){
    var a=this.element.outerWidth(),
        b=this.options;
    if(/\d/.test(b.minWidth) && a < b.minWidth)
        a = b.minWidth;
    if(b.minWidth != null)
        a = b.buttonWidth;
    this.button.width(a)
    
    },
// set menu width
_setMenuWidth: function(){
    var m = this.menu,
        o = this.options,
        width;

    if( /\d/.test(o.menuWidth) ) {
        width = o.menuWidth;
    } else {
        width = this.button.outerWidth()
    }

    if( width ) {
        width -= parseInt(m.css('padding-left'),10)+
            parseInt(m.css('padding-right'),10)+
            parseInt(m.css('border-right-width'),10)+
            parseInt(m.css('border-left-width'),10);
    }

    m.width( width || this.button.outerWidth() );
},
_traverse:function(a,b){
    var c=d(b),e=38===a||37===a,c=c.parent()[e?"prevAll":"nextAll"]("li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)")[e?"last":"first"]();
    c.length?c.find("label").trigger("mouseover"): (c=this.menu.find("ul").last(),this.menu.find("label")[e?"last":"first"]().trigger("mouseover"),c.scrollTop(e?c.height():0))
    },
_toggleState:function(a,b){
    return function(){
        this.disabled||(this[a]=b);
        b?this.setAttribute("aria-selected",!0):this.removeAttribute("aria-selected")
        }
    },
_toggleChecked:function(a,b){
    var c=b&&b.length?b:this.labels.find("input"),e=this;
    c.each(this._toggleState("checked",a));
    c.eq(0).focus();
    this.update();
    var h=c.map(function(){
        return this.value
        }).get();
    this.element.find("option").each(function(){
        !this.disabled&& -1<d.inArray(this.value,h)&&e._toggleState("selected",a).call(this)
        });
    c.length&&this.element.trigger("change")
    },
_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,c=this.speed,e=this.options;
    if(!(!1===this._trigger("beforeopen")|| a.hasClass("ui-state-disabled")||this._isOpen)){
        var h=b.find("ul").last(),g=e.show,f=a.offset();
        d.isArray(e.show)&&(g=e.show[0],c=e.show[1]||this.speed);
        h.scrollTop(0).height(e.height);
        d.ui.position&&!d.isEmptyObject(e.position)?(e.position.of=e.position.of||a,b.show().position(e.position).hide().show(g,c)):b.css({
            top:f.top+a.outerHeight(),
            left:f.left
            }).show(g,c);
        this.labels.eq(0).trigger("mouseover").trigger("mouseenter").find("input").trigger("focus");
        a.addClass("ui-state-active");
        this._isOpen= !0;
        this._trigger("open")
        }
    },
close:function(){
    if(!1!==this._trigger("beforeclose")){
        var a=this.options,b=a.hide,c=this.speed;
        d.isArray(a.hide)&&(b=a.hide[0],c=a.hide[1]||this.speed);
        this.menu.hide(b,c);
        this.button.removeClass("ui-state-active").trigger("blur").trigger("mouseleave");
        this._isOpen=!1;
        this._trigger("close")
        }
    },
enable:function(){
    this._toggleDisabled(!1)
    },
disable:function(){
    this._toggleDisabled(!0)
    },
checkAll:function(){
    this._toggleChecked(!0);
    this._trigger("checkAll")
    },
uncheckAll:function(){
    this._toggleChecked(!1);
    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(a,b){
    var c=this.menu;
    switch(a){
        case "header":
            c.find("div.ui-multiselect-header")[b?"show":"hide"]();
            break;
        case "checkAllText":
            c.find("a.ui-multiselect-all span").eq(-1).text(b);
            break;
        case "uncheckAllText":
            c.find("a.ui-multiselect-none span").eq(-1).text(b);
            break;
        case "height":
            c.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":
            c.add(this.button).removeClass(this.options.classes).addClass(b)
            }
            d.Widget.prototype._setOption.apply(this,arguments)
    }
})
})(jQuery);

a