/*
|
* 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);
|