(function($){let defaults={columns:1,search:false,searchOptions:{delay:250,showOptGroups:false,searchText:true,searchValue:false,onSearch:function(element){}},texts:{placeholder:"Select options",search:"Search",selectedOptions:"Selected ",selectAll:"Select all",unselectAll:"Unselect all",noneSelected:"None Selected"},selectAll:false,selectGroup:false,minHeight:200,maxHeight:null,maxWidth:null,maxPlaceholderWidth:null,maxPlaceholderOpts:10,showCheckbox:true,checkboxAutoFit:false,optionAttributes:[],onLoad:function(element){},onOptionClick:function(element,option){},onControlClose:function(element){},onSelectAll:function(element,selected){},onPlaceholder:function(element,placeholder,selectedOpts){}};let msCounter=1;let msOptCounter=1;if(typeof Array.prototype.map!=="function"){Array.prototype.map=function(callback,thisArg){if(typeof thisArg==="undefined"){thisArg=this}return $.isArray(thisArg)?$.map(thisArg,callback):[]}}if(typeof String.prototype.trim!=="function"){String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}}function MultiSelect(element,options){this.element=element;this.options=$.extend(true,{},defaults,options);this.updateSelectAll=true;this.updatePlaceholder=true;this.listNumber=msCounter;msCounter=msCounter+1;if(!$(this.element).attr("multiple")){throw new Error("[jQuery-MultiSelect] Select list must be a multiselect list in order to use this plugin")}if(this.options.search){if(!this.options.searchOptions.searchText&&!this.options.searchOptions.searchValue){throw new Error("[jQuery-MultiSelect] Either searchText or searchValue should be true.")}}if("placeholder"in this.options){this.options.texts.placeholder=this.options.placeholder;delete this.options.placeholder}if("default"in this.options.searchOptions){this.options.texts.search=this.options.searchOptions["default"];delete this.options.searchOptions["default"]}this.load()}MultiSelect.prototype={load:function(){let instance=this;if(instance.element.nodeName!=="SELECT"||$(instance.element).hasClass("jqmsLoaded")){return true}$(instance.element).addClass("jqmsLoaded ms-list-"+instance.listNumber).data("plugin_multiselect-instance",instance);$(instance.element).after('
');let placeholder=$(instance.element).siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> button:first-child");let optionsWrap=$(instance.element).siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> .ms-options");let optionsList=optionsWrap.find("> ul");if(!instance.options.showCheckbox){optionsWrap.addClass("hide-checkbox")}else if(instance.options.checkboxAutoFit){optionsWrap.addClass("checkbox-autofit")}if($(instance.element).prop("disabled")){placeholder.prop("disabled",true)}if(instance.options.maxPlaceholderWidth){placeholder.css("maxWidth",instance.options.maxPlaceholderWidth)}let maxHeight;if(instance.options.maxHeight){maxHeight=instance.options.maxHeight}else{maxHeight=$(window).height()-optionsWrap.offset().top+$(window).scrollTop()-20}maxHeight=maxHeight$(this)[0].scrollHeight){e.preventDefault();this.scrollTop+=delta<0?1:-1}}});$(document).off("click.ms-hideopts").on("click.ms-hideopts",function(event){if(!$(event.target).closest(".ms-options-wrap").length){$(".ms-options-wrap.ms-active > .ms-options").each(function(){$(this).closest(".ms-options-wrap").removeClass("ms-active");var listID=$(this).closest(".ms-options-wrap").attr("id");var thisInst=$(this).parent().siblings("."+listID+".jqmsLoaded").data("plugin_multiselect-instance");if(typeof thisInst.options.onControlClose=="function"){thisInst.options.onControlClose(thisInst.element)}})}}).on("keydown",function(event){if((event.keyCode||event.which)===27){$(this).trigger("click.ms-hideopts")}});placeholder.on("keydown",function(event){let code=event.keyCode||event.which;if(code===13||code===32){placeholder.trigger("mousedown")}});placeholder.on("mousedown",function(event){if(event.which&&event.which!==1){return true}$(".ms-options-wrap.ms-active").each(function(){if($(this).siblings("."+$(this).attr("id")+".jqmsLoaded")[0]!==optionsWrap.parent().siblings(".ms-list-"+instance.listNumber+".jqmsLoaded")[0]){$(this).removeClass("ms-active");let thisInst=$(this).siblings("."+$(this).attr("id")+".jqmsLoaded").data("plugin_multiselect-instance");if(typeof thisInst.options.onControlClose=="function"){thisInst.options.onControlClose(thisInst.element)}}});optionsWrap.closest(".ms-options-wrap").toggleClass("ms-active");if(optionsWrap.closest(".ms-options-wrap").hasClass("ms-active")){optionsWrap.css("maxHeight","");let maxHeight;if(instance.options.maxHeight){maxHeight=instance.options.maxHeight}else{maxHeight=$(window).height()-optionsWrap.offset().top+$(window).scrollTop()-20}if(maxHeight){maxHeight=maxHeight ');let search=optionsWrap.find(".ms-search input");search.on("keyup",function(){if($(this).data("lastsearch")===$(this).val()){return true}if($(this).data("searchTimeout")){clearTimeout($(this).data("searchTimeout"))}let thisSearchElem=$(this);$(this).data("searchTimeout",setTimeout(function(){thisSearchElem.data("lastsearch",thisSearchElem.val());if(typeof instance.options.searchOptions.onSearch=="function"){instance.options.searchOptions.onSearch(instance.element)}let searchString=$.trim(search.val().toLowerCase());if(searchString){optionsList.find('li[data-search-term*="'+searchString+'"]:not(.optgroup)').removeClass("ms-hidden");optionsList.find('li:not([data-search-term*="'+searchString+'"], .optgroup)').addClass("ms-hidden")}else{optionsList.find(".ms-hidden").removeClass("ms-hidden")}if(!instance.options.searchOptions.showOptGroups){optionsList.find(".optgroup").each(function(){if($(this).find("li:not(.ms-hidden)").length){$(this).show()}else{$(this).hide()}})}instance._updateSelectAllText()},instance.options.searchOptions.delay))})}if(instance.options.selectAll){optionsList.before(''+instance.options.texts.selectAll+" ")}optionsWrap.on("click",".ms-selectall",function(event){event.preventDefault();instance.updateSelectAll=false;instance.updatePlaceholder=false;let select=optionsWrap.parent().siblings(".ms-list-"+instance.listNumber+".jqmsLoaded");if($(this).hasClass("global")){if(optionsList.find('li:not(.optgroup, .selected, .ms-hidden) input[type="checkbox"]:not(:disabled)').length){optionsList.find('li:not(.optgroup, .selected, .ms-hidden) input[type="checkbox"]:not(:disabled)').closest("li").addClass("selected");optionsList.find('li.selected input[type="checkbox"]:not(:disabled)').prop("checked",true)}else{optionsList.find('li:not(.optgroup, .ms-hidden).selected input[type="checkbox"]:not(:disabled)').closest("li").removeClass("selected");optionsList.find('li:not(.optgroup, .ms-hidden, .selected) input[type="checkbox"]:not(:disabled)').prop("checked",false)}}else if($(this).closest("li").hasClass("optgroup")){let optgroup=$(this).closest("li.optgroup");if(optgroup.find('li:not(.selected, .ms-hidden) input[type="checkbox"]:not(:disabled)').length){optgroup.find('li:not(.selected, .ms-hidden) input[type="checkbox"]:not(:disabled)').closest("li").addClass("selected");optgroup.find('li.selected input[type="checkbox"]:not(:disabled)').prop("checked",true)}else{optgroup.find('li:not(.ms-hidden).selected input[type="checkbox"]:not(:disabled)').closest("li").removeClass("selected");optgroup.find('li:not(.ms-hidden, .selected) input[type="checkbox"]:not(:disabled)').prop("checked",false)}}let vals=[];optionsList.find('li.selected input[type="checkbox"]').each(function(){vals.push($(this).val())});select.val(vals).trigger("change");instance.updateSelectAll=true;instance.updatePlaceholder=true;if(typeof instance.options.onSelectAll=="function"){instance.options.onSelectAll(instance.element,vals.length)}instance._updateSelectAllText();instance._updatePlaceholderText()});let options=[];$(instance.element).children().each(function(){if(this.nodeName==="OPTGROUP"){let groupOptions=[];$(this).children("option").each(function(){let thisOptionAtts={};for(let i=0;i .ms-options > ul");let optionsWrap=select.siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> .ms-options");if(overwrite){optionsList.find("> li").remove();if(updateSelect){select.find("> *").remove()}}let containers=[];for(let key in options){if(!options.hasOwnProperty(key)){continue}let thisOption=options[key];let container=$(" ");let appendContainer=true;if(thisOption.hasOwnProperty("value")){if(instance.options.showCheckbox&&instance.options.checkboxAutoFit){container.addClass("ms-reflow")}instance._addOption(container,thisOption);if(updateSelect){let selOption=$(" ",{value:thisOption.value,text:thisOption.name});if(thisOption.hasOwnProperty("attributes")&&Object.keys(thisOption.attributes).length){selOption.attr(thisOption.attributes)}if(thisOption.checked){selOption.prop("selected",true)}select.append(selOption)}}else if(thisOption.hasOwnProperty("options")){let optGroup=$(" ",{label:thisOption.label});optionsList.find("> li.optgroup > span.label").each(function(){if($(this).text()===thisOption.label){container=$(this).closest(".optgroup");appendContainer=false}});if(updateSelect){if(select.find('optgroup[label="'+thisOption.label+'"]').length){optGroup=select.find('optgroup[label="'+thisOption.label+'"]')}else{select.append(optGroup)}}if(appendContainer){container.addClass("optgroup");container.append(''+thisOption.label+" ");container.find("> .label").css({clear:"both"});if(instance.options.selectGroup){container.append(''+instance.options.texts.selectAll+" ")}container.append("")}for(let gKey in thisOption.options){if(!thisOption.options.hasOwnProperty(gKey)){continue}let thisGOption=thisOption.options[gKey];let gContainer=$(" ");if(instance.options.showCheckbox&&instance.options.checkboxAutoFit){gContainer.addClass("ms-reflow")}if(!thisGOption.hasOwnProperty("value")){continue}instance._addOption(gContainer,thisGOption);container.find("> ul").append(gContainer);if(updateSelect){let selOption=$(" ",{value:thisGOption.value,text:thisGOption.name});if(thisGOption.hasOwnProperty("attributes")&&Object.keys(thisGOption.attributes).length){selOption.attr(thisGOption.attributes)}if(thisGOption.checked){selOption.prop("selected",true)}optGroup.append(selOption)}}}else{continue}if(appendContainer){containers.push(container)}}optionsList.append(containers);if(instance.options.checkboxAutoFit&&instance.options.showCheckbox&&!optionsWrap.hasClass("hide-checkbox")){let chkbx=optionsList.find('.ms-reflow:eq(0) input[type="checkbox"]');if(chkbx.length){let checkboxWidth=chkbx.outerWidth();checkboxWidth=checkboxWidth?checkboxWidth:15;optionsList.find(".ms-reflow label").css("padding-left",parseInt(chkbx.closest("label").css("padding-left"))*2+checkboxWidth);optionsList.find(".ms-reflow").removeClass("ms-reflow")}}instance._updatePlaceholderText();optionsWrap.find("ul").css({"column-count":"","column-gap":"","-webkit-column-count":"","-webkit-column-gap":"","-moz-column-count":"","-moz-column-gap":""});if(select.find("optgroup").length){optionsList.find("> li:not(.optgroup)").css({float:"left",width:100/instance.options.columns+"%"});optionsList.find("li.optgroup").css({clear:"both"}).find("> ul").css({"column-count":instance.options.columns,"column-gap":0,"-webkit-column-count":instance.options.columns,"-webkit-column-gap":0,"-moz-column-count":instance.options.columns,"-moz-column-gap":0});if(this._ieVersion()&&this._ieVersion()<10){optionsList.find("li.optgroup > ul > li").css({float:"left",width:100/instance.options.columns+"%"})}}else{optionsList.css({"column-count":instance.options.columns,"column-gap":0,"-webkit-column-count":instance.options.columns,"-webkit-column-gap":0,"-moz-column-count":instance.options.columns,"-moz-column-gap":0});if(this._ieVersion()&&this._ieVersion()<10){optionsList.find("> li").css({float:"left",width:100/instance.options.columns+"%"})}}instance._updateSelectAllText()},settings:function(options){this.options=$.extend(true,{},this.options,options);this.reload()},unload:function(){$(this.element).siblings("#ms-list-"+this.listNumber+".ms-options-wrap").remove();$(this.element).show(function(){$(this).css("display","").removeClass("jqmsLoaded")})},reload:function(){$(this.element).siblings("#ms-list-"+this.listNumber+".ms-options-wrap").remove();$(this.element).removeClass("jqmsLoaded");this.load()},reset:function(){let defaultVals=[];$(this.element).find("option").each(function(){if($(this).prop("defaultSelected")){defaultVals.push($(this).val())}});$(this.element).val(defaultVals);this.reload()},disable:function(status){status=typeof status==="boolean"?status:true;$(this.element).prop("disabled",status);$(this.element).siblings("#ms-list-"+this.listNumber+".ms-options-wrap").find("button:first-child").prop("disabled",status)},_updateSelectAllText:function(){if(!this.updateSelectAll){return}let instance=this;if(!instance.options.selectAll&&!instance.options.selectGroup){return}let optionsWrap=$(instance.element).siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> .ms-options");optionsWrap.find(".ms-selectall").each(function(){let unselected=$(this).parent().find("li:not(.optgroup,.selected,.ms-hidden)");$(this).text(unselected.length?instance.options.texts.selectAll:instance.options.texts.unselectAll)})},_updatePlaceholderText:function(){if(!this.updatePlaceholder){return}let instance=this;let select=$(instance.element);let selectVals=select.val()?select.val():[];let placeholder=select.siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> button:first-child");let placeholderTxt=placeholder.find("span");let optionsWrap=select.siblings("#ms-list-"+instance.listNumber+".ms-options-wrap").find("> .ms-options");if(select.find("option:selected:disabled").length){selectVals=[];select.find("option:selected").each(function(){selectVals.push($(this).val())})}let selOpts=[];for(let key in selectVals){if(!selectVals.hasOwnProperty(key)){continue}selOpts.push($.trim(select.find('option[value="'+instance._escapeSelector(selectVals[key])+'"]').text()));if(selOpts.length>=instance.options.maxPlaceholderOpts){break}}placeholderTxt.text(selOpts.join(", "));if(selOpts.length){optionsWrap.closest(".ms-options-wrap").addClass("ms-has-selections");if(typeof instance.options.onPlaceholder=="function"){instance.options.onPlaceholder(instance.element,placeholderTxt,selOpts)}}else{optionsWrap.closest(".ms-options-wrap").removeClass("ms-has-selections")}if(!selOpts.length){placeholderTxt.text(instance.options.texts.placeholder)}else if(placeholderTxt.width()>placeholder.width()||selOpts.length!==selectVals.length){placeholderTxt.text(instance.options.texts.selectedOptions+selectVals.length)}},_addOption:function(container,option){let instance=this;let optionNameText=$("
").html(option.name).text();let thisOption=$(" ",{for:"ms-opt-"+msOptCounter}).html(option.name);let thisCheckbox=$(" ",{type:"checkbox",title:optionNameText,id:"ms-opt-"+msOptCounter,value:option.value});if(option.hasOwnProperty("attributes")&&Object.keys(option.attributes).length){thisCheckbox.attr(option.attributes)}if(option.checked){container.addClass("default selected");thisCheckbox.prop("checked",true)}thisOption.prepend(thisCheckbox);let searchTerm="";if(instance.options.searchOptions.searchText){searchTerm+=" "+optionNameText.toLowerCase()}if(instance.options.searchOptions.searchValue){searchTerm+=" "+option.value.toLowerCase()}container.attr("data-search-term",$.trim(searchTerm)).prepend(thisOption);msOptCounter=msOptCounter+1},_ieVersion:function(){let myNav=navigator.userAgent.toLowerCase();return myNav.indexOf("msie")!==-1?parseInt(myNav.split("msie")[1]):false},_escapeSelector:function(string){if(typeof $.escapeSelector=="function"){return $.escapeSelector(string)}else{return string.replace(/[!"#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g,"\\$&")}}};$.fn.multiselect=function(options){if(!this.length){return}let args=arguments;let ret;if(options===undefined||typeof options==="object"){return this.each(function(){if(!$.data(this,"plugin_multiselect")){$.data(this,"plugin_multiselect",new MultiSelect(this,options))}})}else if(typeof options==="string"&&options[0]!=="_"&&options!=="init"){this.each(function(){let instance=$.data(this,"plugin_multiselect");if(instance instanceof MultiSelect&&typeof instance[options]==="function"){ret=instance[options].apply(instance,Array.prototype.slice.call(args,1))}if(options==="unload"){$.data(this,"plugin_multiselect",null)}});return ret}}})(jQuery);