diff options
author | lou <louiscuny@gmail.com> | 2011-04-17 16:11:32 +0200 |
---|---|---|
committer | lou <louiscuny@gmail.com> | 2011-04-17 16:11:32 +0200 |
commit | d46c1a9729a4cc97dd215dfa02a1af647a3f35ef (patch) | |
tree | 8fde6badf7ace5c335cae7347024dfa5a5a06f50 /js/jquery.multi-select.js | |
parent | 64f8e2582c185af5702e047a071eff2e7fe913a0 (diff) | |
download | multi-select-d46c1a9729a4cc97dd215dfa02a1af647a3f35ef.zip multi-select-d46c1a9729a4cc97dd215dfa02a1af647a3f35ef.tar.gz multi-select-d46c1a9729a4cc97dd215dfa02a1af647a3f35ef.tar.bz2 |
site on !
Diffstat (limited to 'js/jquery.multi-select.js')
-rw-r--r-- | js/jquery.multi-select.js | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/js/jquery.multi-select.js b/js/jquery.multi-select.js new file mode 100644 index 0000000..54da005 --- /dev/null +++ b/js/jquery.multi-select.js @@ -0,0 +1,114 @@ +(function($){ + + var methods = { + 'init' : function(options){ + this.settings = { + + }; + if(options) { + this.settings = $.extend(this.settings, options); + } + + var multiSelects = this; + multiSelects.hide(); + + multiSelects.each(function(){ + var ms = $(this); + var msId = 'ms-'+ms.attr('id'); + var container = $('<div id="'+msId+'" class="ms-container"></div>'); + var selectableContainer = $('<div class="ms-selectable"></div>'); + var selectedContainer = $('<div class="ms-selection"></div>'); + var selectableUl = $('<ul></ul>'); + var selectedUl = $('<ul></ul>'); + + ms.data('settings', multiSelects.settings); + ms.children('option').each(function(){ + var selectableLi = $('<li ms-value="'+$(this).val()+'"></li>'); + + selectableLi.html($(this).text()); + selectableLi.click(function(){ + ms.multiSelect('select', $(this).attr('ms-value')); + }); + selectableUl.append(selectableLi); + }); + selectableContainer.append(selectableUl); + 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; + var msValues = (ms.val() ? ms.val() : []); + var alreadyPresent = $.inArray(value, ms.val()); + + if(alreadyPresent == -1 || method == 'init'){ + var option = ms.find('option[value="'+value+'"]'); + var selectedLi = $('<li ms-value="'+value+'"></li>'); + var newValues = $.merge(msValues, [value]); + var selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'); + var selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'); + var selectableLi = selectableUl.children('li[ms-value="'+value+'"]'); + var text = option.text(); + + selectableLi.hide(); + ms.val(newValues); + selectedLi.html(text); + 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); + } + } + }, + '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'); + }); + }, + 'deselect' : function(value){ + var ms = this; + var msValues = (ms.val() ? ms.val() : []); + var present = false; + var newValues = $.map(msValues, function(e){ if(e != value){ return e; }else{ present = true}}); + + if(present){ + var selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'); + var selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'); + var selectableLi = selectableUl.children('li[ms-value="'+value+'"]'); + var selectedLi = selectedUl.children('li[ms-value="'+value+'"]'); + var text = selectedLi.text(); + + ms.val(newValues); + selectableLi.show(); + selectedLi.remove(); + if (typeof ms.data('settings').afterDeselect == 'function') { + ms.data('settings').afterDeselect.call(this, value, text); + } + } + } + } + + $.fn.multiSelect = function(method){ + if ( methods[method] ) { + return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return methods.init.apply( this, arguments ); + } else { + if(console.log) console.log( 'Method ' + method + ' does not exist on jquery.multiSelect' ); + } + } +})(jQuery);
\ No newline at end of file |