/* * HTML5 Sortable jQuery Plugin * http://farhadi.ir/projects/html5sortable * * Copyright 2012, Ali Farhadi * Released under the MIT license. */ (function($) { var dragging, placeholders = $(); $.fn.sortable = function(options) { options = options || {}; return this.each(function() { if (/^enable|disable|destroy$/.test(options)) { var items = $(this).children($(this).data('items')).attr('draggable', options == 'enable'); options == 'destroy' && items.add(this) .removeData('connectWith').removeData('items') .unbind('dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s'); return; } var index, items = $(this).children(options.items), connectWith = options.connectWith || false; var placeholder = $('<' + items[0].tagName + ' class="sortable-placeholder">'); var handle = options.handle, isHandle; items.find(handle).mousedown(function() { isHandle = true; }).mouseup(function() { isHandle = false; }); $(this).data('items', options.items) placeholders = placeholders.add(placeholder); if (connectWith) { $(connectWith).add(this).data('connectWith', connectWith); } items.attr('draggable', 'true').bind('dragstart.h5s', function(e) { if (handle && !isHandle) { return false; } isHandle = false; var dt = e.originalEvent.dataTransfer; dt.effectAllowed = 'move'; dt.setData('Text', 'dummy'); dragging = $(this).addClass('sortable-dragging'); index = dragging.index(); }).bind('dragend.h5s', function() { dragging.removeClass('sortable-dragging').fadeIn(); placeholders.detach(); if (index != dragging.index()) { items.parent().trigger('sortupdate'); } dragging = null; }).not('a[href], img').bind('selectstart.h5s', function() { this.dragDrop && this.dragDrop(); return false; }).end().add([this, placeholder]).bind('dragover.h5s dragenter.h5s drop.h5s', function(e) { if (!items.is(dragging) && connectWith !== $(dragging).parent().data('connectWith')) { return true; } if (e.type == 'drop') { e.stopPropagation(); placeholders.filter(':visible').after(dragging); return false; } e.preventDefault(); e.originalEvent.dataTransfer.dropEffect = 'move'; if (items.is(this)) { dragging.hide(); $(this)[placeholder.index() < $(this).index() ? 'after' : 'before'](placeholder); placeholders.not(placeholder).detach(); } return false; }); }); }; })(jQuery);