(function($) { jQuery.fn.lateSelect = function() { function os_build_selected_item($option){ var quantity_html = ''; if($option.data('quantity')) quantity_html = '<span class="os-late-quantity-selector-w"><span class="os-late-quantity-selector minus" data-sign="minus"></span><input class="os-late-quantity-selector-input" type="text" data-max-quantity="'+ $option.data('max-quantity') +'" value="' + $option.data('quantity') + '"/><span class="os-late-quantity-selector plus" data-sign="plus"></span></span>'; return '<div class="ls-item" data-value="' + $option.val() + '"><span class="latepoint-icon latepoint-icon-cross ls-item-remover"></span><span>' + $option.text() + '</span>' + quantity_html + '</div>' } this.each( function() { var lateselect_html = ''; var all_items = ''; var selected_items = ''; var is_selected = ''; if(jQuery(this).hasClass('os-late-select-active')) return; jQuery(this).hide().addClass('os-late-select-active'); jQuery(this).find('option').each(function(){ if(jQuery(this).is(':selected')) selected_items+= os_build_selected_item(jQuery(this)); is_selected = jQuery(this).is(':selected') ? 'selected' : ''; all_items+= '<div class="ls-item '+ is_selected +'" data-value="' + jQuery(this).val() + '">' + jQuery(this).text() + '</div>'; }); var placeholder = '<div class="ls-placeholder">' + jQuery(this).data('placeholder') + '</div>'; lateselect_html = jQuery('<div class="lateselect-w"></div>'); jQuery(this).wrap(lateselect_html); var $lateselect_wrapper = jQuery(this).closest('.lateselect-w'); $lateselect_wrapper.append('<div class="ls-selected-items-w">' + placeholder + selected_items + '</div>'); $lateselect_wrapper.append('<div class="ls-all-items-w">' + all_items + '</div>'); // ADD ITEM $lateselect_wrapper.on('click', '.ls-all-items-w .ls-item:not(.selected)', function(){ var selected_value = jQuery(this).data('value'); $lateselect_wrapper.find('.ls-selected-items-w').append(os_build_selected_item($lateselect_wrapper.find('select option[value="'+ selected_value +'"]'))); jQuery(this).addClass('selected'); $lateselect_wrapper.removeClass('ls-selecting'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').prop('selected', true); $lateselect_wrapper.find('select').trigger('change'); return false; }); // REMOVE ITEM $lateselect_wrapper.on('click', '.ls-selected-items-w .ls-item-remover', function(){ var selected_value = jQuery(this).closest('.ls-item').data('value'); jQuery(this).closest('.ls-item').remove(); $lateselect_wrapper.find('.ls-all-items-w .ls-item.selected[data-value="' + selected_value + '"]').removeClass('selected'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').prop('selected', false); $lateselect_wrapper.find('select').trigger('change'); return false; }); $lateselect_wrapper.on('click', '.ls-selected-items-w', function(){ $lateselect_wrapper.toggleClass('ls-selecting'); return false; }); $lateselect_wrapper.on('click', '.os-late-quantity-selector', function(){ var $input = jQuery(this).closest('.ls-item').find('input.os-late-quantity-selector-input'); var current_value = parseInt($input.val()); var new_quantity = (jQuery(this).data('sign') == 'minus') ? current_value - 1 : current_value + 1; var max_quantity = $input.data('max-quantity'); if(new_quantity <= 0) new_quantity = 1; if(max_quantity && (new_quantity > max_quantity)) new_quantity = max_quantity; var selected_value = jQuery(this).closest('.ls-item').data('value'); $lateselect_wrapper.find('select option[value="'+ selected_value +'"]').data('quantity', new_quantity); $input.val(new_quantity); $lateselect_wrapper.find('select').trigger('change'); return false; }); jQuery(this).on('change', function(){ var $hidden_connection = false; if(jQuery(this).data('hidden-connection')){ $hidden_connection = jQuery(jQuery(this).data('hidden-connection')); }else{ $hidden_connection = jQuery(this).closest('.lateselect-w').next('input[type="hidden"]'); } var formatted_ids = ''; if(jQuery(this).find('option:selected').length){ jQuery(this).find('option:selected').each(function(){ if(jQuery(this).data('quantity')){ var quantity = jQuery(this).data('quantity') ? jQuery(this).data('quantity') : 1; formatted_ids+= jQuery(this).val() + ':' + quantity + ','; }else{ formatted_ids+= jQuery(this).val() + ','; } }); }else{ formatted_ids = ''; } if(formatted_ids != '') formatted_ids = formatted_ids.slice(0, -1); $hidden_connection.val(formatted_ids); }); }); } }(jQuery));