TimeTrex/interface/html5/framework/jquery.sortable.js

118 lines
4.2 KiB
JavaScript

/*
* 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 ) {
var method = String( options );
options = $.extend( {
connectWith: false
}, options );
return this.each( function() {
if ( /^enable|disable|destroy$/.test( method ) ) {
var items = $( this ).children( $( this ).data( 'items' ) ).attr( 'draggable', method == 'enable' );
if ( method == 'destroy' ) {
items.add( this ).removeData( 'connectWith items' )
.off( 'dragstart.h5s dragend.h5s selectstart.h5s dragover.h5s dragenter.h5s drop.h5s' );
}
return;
}
var isHandle, index, items = $( this ).children( options.items );
var placeholder = $( '<' + (/^ul|ol$/i.test( this.tagName ) ? 'li' : 'div') + ' class="sortable-placeholder">' );
items.find( options.handle ).mousedown( function() {
isHandle = true;
} ).mouseup( function() {
isHandle = false;
} );
$( this ).data( 'items', options.items );
placeholders = placeholders.add( placeholder );
if ( options.connectWith ) {
$( options.connectWith ).add( this ).data( 'connectWith', options.connectWith );
}
items.attr( 'draggable', 'true' ).on( 'dragstart.h5s', function( e ) {
if ( options.handle && !isHandle ) {
return false;
}
isHandle = false;
var dt = e.originalEvent.dataTransfer;
dt.effectAllowed = 'move';
dt.setData( 'Text', 'dummy' );
index = (dragging = $( this )).addClass( 'sortable-dragging' ).index();
} ).on( 'dragend.h5s', function() {
dragging.removeClass( 'sortable-dragging' ).show();
placeholders.detach();
//if ( index != dragging.index() ) {
//items.parent().trigger( 'sortupdate', {item: dragging} );
//}
items.parent().trigger( 'sortupdate', {item: dragging} );
dragging = null;
} ).not( 'a[href], img' ).on( 'selectstart.h5s', function() {
this.dragDrop && this.dragDrop();
return false;
} ).end().add( [this, placeholder] ).on( 'dragover.h5s dragenter.h5s drop.h5s', function( e ) {
if ( !items.is( dragging ) && options.connectWith !== $( dragging ).parent().data( 'connectWith' ) ) {
return true;
}
if ( e.type == 'drop' ) {
e.stopPropagation();
placeholders.filter( ':visible' ).after( dragging );
$( '.dashlet-cover--display-red' ).removeClass( 'dashlet-cover--display-red' );
$( '.dashlet-cover--display-green' ).removeClass( 'dashlet-cover--display-green' );
return false;
}
if ( e.type == 'dragover' ) {
var target = $( e.currentTarget );
var direction = 'LEFT';
if ( target.attr( 'class' ).indexOf('dashlet-container') >= 0) {
$( '.dashlet-cover--display-red' ).removeClass( 'dashlet-cover--display-red' );
$( '.dashlet-cover--display-green' ).removeClass( 'dashlet-cover--display-green' );
var mouseOffset = e.originalEvent.pageX - target.offset().left;
if ( mouseOffset > target.width() / 2 ) {
direction = 'RIGHT';
if ( $( placeholder ).index() == index ) {
target.find( '.dashlet-right-cover' ).addClass( 'dashlet-cover--display-red' );
} else {
target.find( '.dashlet-right-cover' ).addClass( 'dashlet-cover--display-green' );
}
} else {
direction = 'LEFT';
if ( $( placeholder ).index() == index + 1 ) {
target.find( '.dashlet-left-cover' ).addClass( 'dashlet-cover--display-red' );
} else {
target.find( '.dashlet-left-cover' ).addClass( 'dashlet-cover--display-green' );
}
}
}
}
e.preventDefault();
e.originalEvent.dataTransfer.dropEffect = 'move';
if ( items.is( this ) ) {
if ( options.forcePlaceholderSize ) {
placeholder.height( dragging.outerHeight() );
}
dragging.hide();
if ( direction === 'LEFT' ) {
$( this )['before']( placeholder );
} else {
$( this )['after']( placeholder );
}
placeholders.not( placeholder ).detach();
} else if ( !placeholders.is( this ) && !$( this ).children( options.items ).length ) {
placeholders.detach();
$( this ).append( placeholder );
}
return false;
} );
} );
};
})( jQuery );