/* 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) {
		var xmouse = dragEvent.transformedMouseOffset;
		ToolMan.temp = {dragStartOffset : {x:xmouse.x,y:xmouse.y}}
	},

	_onDragMove : function(dragEvent) {
		var helpers = ToolMan.helpers();
		var coordinates = ToolMan.coordinates();

		var item = dragEvent.group.element;
		var xmouse = dragEvent.transformedMouseOffset;
		var moveTo = null;
		
		var old = ToolMan.temp.dragStartOffset;
		// ---- If mouse is move up ---- //
		if (xmouse.y < old.y)
		{
			var previous = helpers.previousItem(item, item.nodeName);
			if (previous != null) {
				var bottomRight = coordinates.bottomRightOffset(previous);
				if (xmouse.y <= bottomRight.y && xmouse.x <= bottomRight.x) {
					moveTo = previous;
					helpers.moveBefore(item, moveTo);
				}
			}
		}
		else // ---- mouse is move down ---- //
		{
			var next = helpers.nextItem(item, item.nodeName);
			if (next != null) {
				var topLeftOffset = coordinates.topLeftOffset(next);
				if (xmouse.y >= topLeftOffset.y && xmouse.x >= topLeftOffset.x) {
					moveTo = next;
					helpers.moveAfter(item, moveTo);
				}
			}
		}
		ToolMan.temp = {dragStartOffset : {x:xmouse.x,y:xmouse.y}}
		/*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);
	}
}

