| /* 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) { |
| 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) |
| } |
| } |