90 lines
2.4 KiB
JavaScript
Executable File
90 lines
2.4 KiB
JavaScript
Executable File
/* Copyright (c) 2005 Tim Taylor Consulting (see LICENSE.txt) */
|
|
|
|
ToolMan._dragsortFactory = {
|
|
makeSortable : function(item) {
|
|
var group = ToolMan.drag().createSimpleGroup(item)
|
|
|
|
group.register('dragstart', this._onDragStart)
|
|
group.register('dragmove', this._onDragMove)
|
|
group.register('dragend', this._onDragEnd)
|
|
|
|
return group
|
|
},
|
|
|
|
/**
|
|
* Iterates over a list's items, making them sortable, applying
|
|
* optional functions to each item.
|
|
*
|
|
* example: makeListSortable(myList, myFunc1, myFunc2, ... , myFuncN)
|
|
*/
|
|
makeListSortable : function(list) {
|
|
dragsort = this;
|
|
|
|
var helpers = ToolMan.helpers()
|
|
var coordinates = ToolMan.coordinates()
|
|
var items = list.getElementsByTagName("li")
|
|
|
|
helpers.map(items, function(item) {
|
|
var dragGroup = dragsort.makeSortable(item)
|
|
dragGroup.setThreshold(4)
|
|
var min, max
|
|
dragGroup.addTransform(function(coordinate, dragEvent) {
|
|
return coordinate.constrainTo(min, max)
|
|
})
|
|
dragGroup.register('dragstart', function() {
|
|
var items = list.getElementsByTagName("li")
|
|
min = max = coordinates.topLeftOffset(items[0])
|
|
for (var i = 1, n = items.length; i < n; i++) {
|
|
var offset = coordinates.topLeftOffset(items[i])
|
|
min = min.min(offset)
|
|
max = max.max(offset)
|
|
}
|
|
})
|
|
})
|
|
for (var i = 1, n = arguments.length; i < n; i++)
|
|
helpers.map(items, arguments[i])
|
|
},
|
|
|
|
_onDragStart : function(dragEvent) {
|
|
},
|
|
|
|
_onDragMove : function(dragEvent) {
|
|
var helpers = ToolMan.helpers()
|
|
var coordinates = ToolMan.coordinates()
|
|
|
|
var item = dragEvent.group.element
|
|
var xmouse = dragEvent.transformedMouseOffset
|
|
var moveTo = null
|
|
|
|
var previous = helpers.previousItem(item, item.nodeName)
|
|
while (previous != null) {
|
|
var bottomRight = coordinates.bottomRightOffset(previous)
|
|
if (xmouse.y <= bottomRight.y && xmouse.x <= bottomRight.x) {
|
|
moveTo = previous
|
|
}
|
|
previous = helpers.previousItem(previous, item.nodeName)
|
|
}
|
|
if (moveTo != null) {
|
|
helpers.moveBefore(item, moveTo)
|
|
return
|
|
}
|
|
|
|
var next = helpers.nextItem(item, item.nodeName)
|
|
while (next != null) {
|
|
var topLeft = coordinates.topLeftOffset(next)
|
|
if (topLeft.y <= xmouse.y && topLeft.x <= xmouse.x) {
|
|
moveTo = next
|
|
}
|
|
next = helpers.nextItem(next, item.nodeName)
|
|
}
|
|
if (moveTo != null) {
|
|
helpers.moveBefore(item, helpers.nextItem(moveTo, item.nodeName))
|
|
return
|
|
}
|
|
},
|
|
|
|
_onDragEnd : function(dragEvent) {
|
|
ToolMan.coordinates().create(0, 0).reposition(dragEvent.group.element);
|
|
}
|
|
}
|