/**
* Kendo UI v2016.1.112 (http://www.telerik.com/kendo-ui)
* Copyright 2016 Telerik AD. All rights reserved.
*
* Kendo UI commercial licenses may be obtained at
* http://www.telerik.com/purchase/license-agreement/kendo-ui-complete
* If you do not own a commercial license, this file shall be governed by the trial license terms.
*/
(function (f, define) {
define('kendo.reorderable', [
'kendo.core',
'kendo.draganddrop'
], f);
}(function () {
var __meta__ = {
id: 'reorderable',
name: 'Reorderable',
category: 'framework',
depends: [
'core',
'draganddrop'
],
advanced: true
};
(function ($, undefined) {
var kendo = window.kendo, getOffset = kendo.getOffset, Widget = kendo.ui.Widget, CHANGE = 'change', KREORDERABLE = 'k-reorderable';
function toggleHintClass(hint, denied) {
hint = $(hint);
if (denied) {
hint.find('.k-drag-status').removeClass('k-add').addClass('k-denied');
} else {
hint.find('.k-drag-status').removeClass('k-denied').addClass('k-add');
}
}
var Reorderable = Widget.extend({
init: function (element, options) {
var that = this, draggable, group = kendo.guid() + '-reorderable';
Widget.fn.init.call(that, element, options);
element = that.element.addClass(KREORDERABLE);
options = that.options;
that.draggable = draggable = options.draggable || new kendo.ui.Draggable(element, {
group: group,
autoScroll: true,
filter: options.filter,
hint: options.hint
});
that.reorderDropCue = $('
');
element.find(draggable.options.filter).kendoDropTarget({
group: draggable.options.group,
dragenter: function (e) {
if (!that._draggable) {
return;
}
var dropTarget = this.element, offset;
var denied = !that._dropTargetAllowed(dropTarget) || that._isLastDraggable();
toggleHintClass(e.draggable.hint, denied);
if (!denied) {
offset = getOffset(dropTarget);
var left = offset.left;
if (options.inSameContainer && !options.inSameContainer({
source: dropTarget,
target: that._draggable,
sourceIndex: that._index(dropTarget),
targetIndex: that._index(that._draggable)
})) {
that._dropTarget = dropTarget;
} else {
if (that._index(dropTarget) > that._index(that._draggable)) {
left += dropTarget.outerWidth();
}
}
that.reorderDropCue.css({
height: dropTarget.outerHeight(),
top: offset.top,
left: left
}).appendTo(document.body);
}
},
dragleave: function (e) {
toggleHintClass(e.draggable.hint, true);
that.reorderDropCue.remove();
that._dropTarget = null;
},
drop: function () {
that._dropTarget = null;
if (!that._draggable) {
return;
}
var dropTarget = this.element;
var draggable = that._draggable;
if (that._dropTargetAllowed(dropTarget) && !that._isLastDraggable()) {
that.trigger(CHANGE, {
element: that._draggable,
target: dropTarget,
oldIndex: that._index(draggable),
newIndex: that._index(dropTarget),
position: getOffset(that.reorderDropCue).left > getOffset(dropTarget).left ? 'after' : 'before'
});
}
}
});
draggable.bind([
'dragcancel',
'dragend',
'dragstart',
'drag'
], {
dragcancel: function () {
that.reorderDropCue.remove();
that._draggable = null;
that._elements = null;
},
dragend: function () {
that.reorderDropCue.remove();
that._draggable = null;
that._elements = null;
},
dragstart: function (e) {
that._draggable = e.currentTarget;
that._elements = that.element.find(that.draggable.options.filter);
},
drag: function (e) {
if (!that._dropTarget || this.hint.find('.k-drag-status').hasClass('k-denied')) {
return;
}
var dropStartOffset = getOffset(that._dropTarget).left;
var width = that._dropTarget.outerWidth();
if (e.pageX > dropStartOffset + width / 2) {
that.reorderDropCue.css({ left: dropStartOffset + width });
} else {
that.reorderDropCue.css({ left: dropStartOffset });
}
}
});
},
options: {
name: 'Reorderable',
filter: '*'
},
events: [CHANGE],
_isLastDraggable: function () {
var inSameContainer = this.options.inSameContainer, draggable = this._draggable[0], elements = this._elements.get(), found = false, item;
if (!inSameContainer) {
return false;
}
while (!found && elements.length > 0) {
item = elements.pop();
found = draggable !== item && inSameContainer({
source: draggable,
target: item,
sourceIndex: this._index(draggable),
targetIndex: this._index(item)
});
}
return !found;
},
_dropTargetAllowed: function (dropTarget) {
var inSameContainer = this.options.inSameContainer, dragOverContainers = this.options.dragOverContainers, draggable = this._draggable;
if (draggable[0] === dropTarget[0]) {
return false;
}
if (!inSameContainer || !dragOverContainers) {
return true;
}
if (inSameContainer({
source: draggable,
target: dropTarget,
sourceIndex: this._index(draggable),
targetIndex: this._index(dropTarget)
})) {
return true;
}
return dragOverContainers(this._index(draggable), this._index(dropTarget));
},
_index: function (element) {
return this._elements.index(element);
},
destroy: function () {
var that = this;
Widget.fn.destroy.call(that);
that.element.find(that.draggable.options.filter).each(function () {
var item = $(this);
if (item.data('kendoDropTarget')) {
item.data('kendoDropTarget').destroy();
}
});
if (that.draggable) {
that.draggable.destroy();
that.draggable.element = that.draggable = null;
}
that.elements = that.reorderDropCue = that._elements = that._draggable = null;
}
});
kendo.ui.plugin(Reorderable);
}(window.kendo.jQuery));
return window.kendo;
}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {
(a3 || a2)();
}));