| 1 | /* Copyright (c) 2005 Tim Taylor Consulting (see LICENSE.txt) */ |
|---|
| 2 | |
|---|
| 3 | ToolMan._dragsortFactory = { |
|---|
| 4 | makeSortable : function(item) { |
|---|
| 5 | var group = ToolMan.drag().createSimpleGroup(item) |
|---|
| 6 | |
|---|
| 7 | group.register('dragstart', this._onDragStart) |
|---|
| 8 | group.register('dragmove', this._onDragMove) |
|---|
| 9 | group.register('dragend', this._onDragEnd) |
|---|
| 10 | |
|---|
| 11 | return group |
|---|
| 12 | }, |
|---|
| 13 | |
|---|
| 14 | /** |
|---|
| 15 | * Iterates over a list's items, making them sortable, applying |
|---|
| 16 | * optional functions to each item. |
|---|
| 17 | * |
|---|
| 18 | * example: makeListSortable(myList, myFunc1, myFunc2, ... , myFuncN) |
|---|
| 19 | */ |
|---|
| 20 | makeListSortable : function(list) { |
|---|
| 21 | var helpers = ToolMan.helpers() |
|---|
| 22 | var coordinates = ToolMan.coordinates() |
|---|
| 23 | var items = list.getElementsByTagName("li") |
|---|
| 24 | |
|---|
| 25 | helpers.map(items, function(item) { |
|---|
| 26 | var dragGroup = dragsort.makeSortable(item) |
|---|
| 27 | dragGroup.setThreshold(4) |
|---|
| 28 | var min, max |
|---|
| 29 | dragGroup.addTransform(function(coordinate, dragEvent) { |
|---|
| 30 | return coordinate.constrainTo(min, max) |
|---|
| 31 | }) |
|---|
| 32 | dragGroup.register('dragstart', function() { |
|---|
| 33 | var items = list.getElementsByTagName("li") |
|---|
| 34 | min = max = coordinates.topLeftOffset(items[0]) |
|---|
| 35 | for (var i = 1, n = items.length; i < n; i++) { |
|---|
| 36 | var offset = coordinates.topLeftOffset(items[i]) |
|---|
| 37 | min = min.min(offset) |
|---|
| 38 | max = max.max(offset) |
|---|
| 39 | } |
|---|
| 40 | }) |
|---|
| 41 | }) |
|---|
| 42 | for (var i = 1, n = arguments.length; i < n; i++) |
|---|
| 43 | helpers.map(items, arguments[i]) |
|---|
| 44 | }, |
|---|
| 45 | |
|---|
| 46 | _onDragStart : function(dragEvent) { |
|---|
| 47 | }, |
|---|
| 48 | |
|---|
| 49 | _onDragMove : function(dragEvent) { |
|---|
| 50 | var helpers = ToolMan.helpers() |
|---|
| 51 | var coordinates = ToolMan.coordinates() |
|---|
| 52 | |
|---|
| 53 | var item = dragEvent.group.element |
|---|
| 54 | var xmouse = dragEvent.transformedMouseOffset |
|---|
| 55 | var moveTo = null |
|---|
| 56 | |
|---|
| 57 | var previous = helpers.previousItem(item, item.nodeName) |
|---|
| 58 | while (previous != null) { |
|---|
| 59 | var bottomRight = coordinates.bottomRightOffset(previous) |
|---|
| 60 | if (xmouse.y <= bottomRight.y && xmouse.x <= bottomRight.x) { |
|---|
| 61 | moveTo = previous |
|---|
| 62 | } |
|---|
| 63 | previous = helpers.previousItem(previous, item.nodeName) |
|---|
| 64 | } |
|---|
| 65 | if (moveTo != null) { |
|---|
| 66 | helpers.moveBefore(item, moveTo) |
|---|
| 67 | return |
|---|
| 68 | } |
|---|
| 69 | |
|---|
| 70 | var next = helpers.nextItem(item, item.nodeName) |
|---|
| 71 | while (next != null) { |
|---|
| 72 | var topLeft = coordinates.topLeftOffset(next) |
|---|
| 73 | if (topLeft.y <= xmouse.y && topLeft.x <= xmouse.x) { |
|---|
| 74 | moveTo = next |
|---|
| 75 | } |
|---|
| 76 | next = helpers.nextItem(next, item.nodeName) |
|---|
| 77 | } |
|---|
| 78 | if (moveTo != null) { |
|---|
| 79 | helpers.moveBefore(item, helpers.nextItem(moveTo, item.nodeName)) |
|---|
| 80 | return |
|---|
| 81 | } |
|---|
| 82 | }, |
|---|
| 83 | |
|---|
| 84 | _onDragEnd : function(dragEvent) { |
|---|
| 85 | ToolMan.coordinates().create(0, 0).reposition(dragEvent.group.element) |
|---|
| 86 | } |
|---|
| 87 | } |
|---|