diff options
Diffstat (limited to 'js/jquery.multi-select.js')
-rw-r--r-- | js/jquery.multi-select.js | 115 |
1 files changed, 65 insertions, 50 deletions
diff --git a/js/jquery.multi-select.js b/js/jquery.multi-select.js index d429ebc..c0eb3d3 100644 --- a/js/jquery.multi-select.js +++ b/js/jquery.multi-select.js @@ -48,7 +48,8 @@ optgroupCpt++; } if ($(this).is("option:not(option[value=''])")){ - var selectableLi = $('<li class="ms-elem-selectable" ms-value="'+$(this).val()+'">'+$(this).text()+'</li>'); + var klass = $(this).attr('class') ? ' '+$(this).attr('class') : ''; + var selectableLi = $('<li class="ms-elem-selectable'+klass+'" ms-value="'+$(this).val()+'">'+$(this).text()+'</li>'); if ($(this).attr('title')) selectableLi.attr('title', $(this).attr('title')); @@ -82,70 +83,82 @@ }, 'refresh' : function() { $("#ms-"+$(this).attr("id")).remove(); - $(this).multiSelect("init"); + $(this).multiSelect("init", $(this).data("settings")); }, 'select' : function(value, method){ var ms = this, selectedOption = ms.find('option[value="'+value +'"]'), text = selectedOption.text(), + klass = selectedOption.attr('class'), titleAttr = selectedOption.attr('title'); - var selectedLi = $('<li class="ms-elem-selected" ms-value="'+value+'">'+text+'</li>'), - selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'), - selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'), - selectableLi = selectableUl.children('li[ms-value="'+value+'"]'), - haveToSelect = !selectableLi.hasClass(ms.data('settings').disabledClass) && value != '' && - ((method == 'init' && selectedOption.attr('selected')) || - (method != 'init' && !selectedOption.attr('selected'))) + var selectedLi = $('<li class="ms-elem-selected'+(klass ? ' '+klass : '')+'" ms-value="'+value+'">'+text+'</li>'), + selectableUl = $('#ms-'+ms.attr('id')+' .ms-selectable ul'), + selectedUl = $('#ms-'+ms.attr('id')+' .ms-selection ul'), + selectableLi = selectableUl.children('li[ms-value="'+value+'"]'), + haveToSelect = ((!selectableLi.hasClass(ms.data('settings').disabledClass)) || + (selectableLi.hasClass(ms.data('settings').disabledClass) && method == 'init')) && + value != '' && + ((method == 'init' && selectedOption.attr('selected')) || + (method != 'init' && !selectedOption.attr('selected'))) - if (haveToSelect ){ - var parentOptgroup = selectableLi.parent('.ms-optgroup'); - if (parentOptgroup.length > 0) - if (parentOptgroup.children('.ms-elem-selectable:not(:hidden)').length == 1) - parentOptgroup.children('.ms-optgroup-label').hide(); - selectableLi.addClass('ms-selected'); - selectableLi.hide(); - selectedOption.attr('selected', 'selected'); - if(titleAttr){ - selectedLi.attr('title', titleAttr) - } + if (haveToSelect ){ + var parentOptgroup = selectableLi.parent('.ms-optgroup'); + if (parentOptgroup.length > 0) + if (parentOptgroup.children('.ms-elem-selectable:not(:hidden)').length == 1) + parentOptgroup.children('.ms-optgroup-label').hide(); + selectableLi.addClass('ms-selected'); + selectableLi.hide(); + selectedOption.attr('selected', 'selected'); + if(titleAttr){ + selectedLi.attr('title', titleAttr) + } + if (selectableLi.hasClass(ms.data('settings').disabledClass)){ + selectedLi.addClass(ms.data('settings').disabledClass); + } else { selectedLi.click(function(){ ms.multiSelect('deselect', $(this).attr('ms-value')); }); + } - var selectedUlLis = selectedUl.children('.ms-elem-selected'); - if (method != 'init' && ms.data('settings').keepOrder && selectedUlLis.length > 0) { + var selectedUlLis = selectedUl.children('.ms-elem-selected'); + if (method != 'init' && ms.data('settings').keepOrder && selectedUlLis.length > 0) { - var getIndexOf = function(value) { - elems = selectableUl.children('.ms-elem-selectable'); - return(elems.index(elems.closest('[ms-value="'+value+'"]'))); - } - - var index = getIndexOf(selectedLi.attr('ms-value')); - if (index == 0) - selectedUl.prepend(selectedLi); - else { - for (i = index - 1; i >= 0; i--){ - if (selectedUlLis[i] && getIndexOf($(selectedUlLis[i]).attr('ms-value')) < index) { - $(selectedUlLis[i]).after(selectedLi); - break; - } + var getIndexOf = function(value) { + elems = selectableUl.children('.ms-elem-selectable'); + return(elems.index(elems.closest('[ms-value="'+value+'"]'))); + } + + var index = getIndexOf(selectedLi.attr('ms-value')); + if (index == 0) + selectedUl.prepend(selectedLi); + else { + for (i = index - 1; i >= 0; i--){ + if (selectedUlLis[i] && getIndexOf($(selectedUlLis[i]).attr('ms-value')) < index) { + $(selectedUlLis[i]).after(selectedLi); + break; + } else if (i == 0) { + $(selectedUlLis[i]).before(selectedLi); } } - } else { - selectedUl.append(selectedLi); } + } else { + selectedUl.append(selectedLi); + } - if (ms.find("option[value='']")){ - ms.find("option[value='']").removeAttr('selected'); + if (ms.find("option[value='']")){ + ms.find("option[value='']").removeAttr('selected'); + } + if (method == "select_all" && parentOptgroup.children('.ms-elem-selectable').length > 0){ + parentOptgroup.children('.ms-optgroup-label').hide(); + } + if(method != 'init' || ms.data('settings').callbackOnInit){ + selectedUl.trigger('change'); + selectableUl.trigger('change'); + if (typeof ms.data('settings').afterSelect == 'function' && + (method != 'init' || ms.data('settings').callbackOnInit)) { + ms.data('settings').afterSelect.call(this, value, text); } - if(method != 'init' || ms.data('settings').callbackOnInit){ - selectedUl.trigger('change'); - selectableUl.trigger('change'); - if (typeof ms.data('settings').afterSelect == 'function' && - (method != 'init' || ms.data('settings').callbackOnInit)) { - ms.data('settings').afterSelect.call(this, value, text); - } } } }, @@ -162,8 +175,10 @@ selectedLi = selectedUl.children('li[ms-value="'+value+'"]'); var parentOptgroup = selectableLi.parent('.ms-optgroup'); - if (parentOptgroup.length > 0) - parentOptgroup.children('.ms-optgroup-label').show(); + if (parentOptgroup.length > 0){ + parentOptgroup.children('.ms-optgroup-label').addClass('collapse').show(); + parentOptgroup.children('.ms-elem-selectable:not(.ms-selected)').show(); + } selectedOption.removeAttr('selected'); selectableLi.show(); selectableLi.removeClass('ms-selected'); @@ -199,4 +214,4 @@ } return false; }; -})(jQuery);
\ No newline at end of file +})(jQuery); |