(function($){ var msMethods = { 'init' : function(options){ this.settings = { }; if(options) { this.settings = $.extend(this.settings, options); } var multiSelects = this; multiSelects.hide(); multiSelects.each(function(){ var ms = $(this); ms.attr('id', ms.attr('id') != undefined ? ms.attr('id') : 'select'+((new Date()).getTime())); var container = $('
').detach(), selectableContainer = $('
').detach(), selectedContainer = $('
').detach(), selectableUl = $('').detach(), selectedUl = $('').detach(); ms.data('settings', multiSelects.settings); ms.children('option').each(function(){ var selectableLi = $('
  • '+$(this).text()+'
  • ').detach(); selectableLi.click(function(){ ms.multiSelect('select', $(this).attr('ms-value')); }); selectableUl.append(selectableLi); }); if (multiSelects.settings.selectableHeader){ selectableContainer.append(multiSelects.settings.selectableHeader); } selectableContainer.append(selectableUl); if (multiSelects.settings.selectedHeader){ selectedContainer.append(multiSelects.settings.selectedHeader); } selectedContainer.append(selectedUl); container.append(selectableContainer); container.append(selectedContainer); ms.after(container); ms.children('option:selected').each(function(){ ms.multiSelect('select', $(this).val(), 'init'); }); }); }, 'select' : function(value, method){ var ms = this, msValues = (ms.val() ? ms.val() : []), alreadyPresent = $.inArray(value, msValues), text = ms.find('option[value="'+value+'"]').text(); if(alreadyPresent == -1 || method == 'init'){ var selectedLi = $('
  • '+text+'
  • ').detach(), newValues = $.merge(msValues, [value]), selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'), selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'), selectableLi = selectableUl.children('li[ms-value="'+value+'"]'); selectableLi.hide(); ms.val(newValues); selectedLi.click(function(){ ms.multiSelect('deselect', $(this).attr('ms-value')); }); selectedUl.append(selectedLi); if (typeof ms.data('settings').afterSelect == 'function' && method != 'init') { ms.data('settings').afterSelect.call(this, value, text); } } }, 'deselect' : function(value){ var ms = this, msValues = (ms.val() ? ms.val() : []), present = false, newValues = $.map(msValues, function(e){ if(e != value){ return e; }else{ present = true}}); if(present){ var selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'), selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'), selectableLi = selectableUl.children('li[ms-value="'+value+'"]'), selectedLi = selectedUl.children('li[ms-value="'+value+'"]').detach(); ms.val(newValues); selectableLi.show(); selectedLi.remove(); if (typeof ms.data('settings').afterDeselect == 'function') { ms.data('settings').afterDeselect.call(this, value, selectedLi.text()); } } }, 'select_all' : function(){ var ms = this; ms.children('option').each(function(){ ms.multiSelect('select', $(this).val(), 'select_all'); }); }, 'deselect_all' :function(){ var ms = this; ms.children('option').each(function(){ ms.multiSelect('deselect', $(this).val(), 'deselect_all'); }); } } $.fn.multiSelect = function(method){ if ( msMethods[method] ) { return msMethods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); } else if ( typeof method === 'object' || ! method ) { return msMethods.init.apply( this, arguments ); } else { if(console.log) console.log( 'Method ' + method + ' does not exist on jquery.multiSelect' ); } } })(jQuery);