var ToolMan = {
	events : function() {
		if (!ToolMan.tmEventsFactory) throw "ToolMan Events module isn't loaded";
		return ToolMan.tmEventsFactory
	},

	css : function() {
		if (!ToolMan.tmCssFactory) throw "ToolMan CSS module isn't loaded";
		return ToolMan.tmCssFactory
	},

	coordinates : function() {
		if (!ToolMan.tmCoordinatesFactory) throw "ToolMan Coordinates module isn't loaded";
		return ToolMan.tmCoordinatesFactory
	},

	drag : function() {
		if (!ToolMan.tmDragFactory) throw "ToolMan Drag module isn't loaded";
		return ToolMan.tmDragFactory
	},

	dragsort : function() {
		if (!ToolMan.tmDragsortFactory) throw "ToolMan DragSort module isn't loaded";
		return ToolMan.tmDragsortFactory
	},

	helpers : function() {
		return ToolMan.tmHelpers
	},

	cookies : function() {
		if (!ToolMan.tmCookieOven) throw "ToolMan Cookie module isn't loaded";
		return ToolMan.tmCookieOven
	},

	junkdrawer : function() {
		return ToolMan.tmJunkdrawer
	}

}

ToolMan.tmHelpers = {
	map : function(array, func) {
		for (var i = 0, n = array.length; i < n; i++) func(array[i])
	},

	nextItem : function(item, nodeName) {
		if (item == null) return
		var next = item.nextSibling
		while (next != null) {
			if (next.nodeName == nodeName) return next
			next = next.nextSibling
		}
		return null
	},

	previousItem : function(item, nodeName) {
		var previous = item.previousSibling
		while (previous != null) {
			if (previous.nodeName == nodeName) return previous
			previous = previous.previousSibling
		}
		return null
	},

	moveBefore : function(item1, item2) {
		var parent = item1.parentNode
		parent.removeChild(item1)
		parent.insertBefore(item1, item2)
	},

	moveAfter : function(item1, item2) {
		var parent = item1.parentNode
		parent.removeChild(item1)
		parent.insertBefore(item1, item2 ? item2.nextSibling : null)
	}
}


ToolMan.tmJunkdrawer = {
	serializeList : function(list) {
	    var array = new Array()
	    if (list != null)
	    {
		    var items = list.getElementsByTagName("div")
		    for (var i = 0, n = items.length; i < n; i++) {
			    var item = items[i]

			    array.push(ToolMan.junkdrawer().tmIdentifier(item))
		    }
		}
		return array.join('|')
	},
	
	serializeList2 : function(list, objArray) {
	    var array = new Array()
	    if (list != null)
	    {
		    var items = list.getElementsByTagName("div")
		    for (var i = 0, n = items.length; i < n; i++) {
			    var item = items[i]

                var objArrayIdx = ToolMan.junkdrawer().getObjArrayIndex(item, objArray);
                
                if (objArrayIdx != null)
                {
			        //array.push(ToolMan.junkdrawer().tmIdentifier(item))
			        array.push(objArray[objArrayIdx]);
			    }
		    }
		}
		//return array.join('|')
		return array;
	},	

	inspectListOrder : function(id) {
		alert(ToolMan.junkdrawer().serializeList(document.getElementById(id)))
	},
	
	inspectListOrder2 : function (node, objArray) {
		return ToolMan.junkdrawer().serializeList2(node, objArray)
	},

	getObjArrayIndex : function (item, objArray) {		
		var i;
		for (i = 0; i < objArray.length; i++)
		{
		    if (objArray[i])
		    {
		        if (objArray[i].GetDiv() == item)
		            return i;
		    }
		}
		return null;
	},

	restoreListOrder : function(listID) {
		var list = document.getElementById(listID)
		if (list == null) return

		var cookie = ToolMan.cookies().get("list-" + listID)
		if (!cookie) return;

		var IDs = cookie.split('|')
		var items = ToolMan.junkdrawer().tmItemsByID(list)

		for (var i = 0, n = IDs.length; i < n; i++) {
			var itemID = IDs[i]
			if (itemID in items) {
				var item = items[itemID]
				list.removeChild(item)
				list.insertBefore(item, null)
			}
		}
	},

	tmIdentifier : function(item) {
		var trim = ToolMan.junkdrawer().trim
		var identifier

		identifier = trim(item.getAttribute("id"))
		if (identifier != null && identifier.length > 0) return identifier;
		
		identifier = trim(item.getAttribute("itemID"))
		if (identifier != null && identifier.length > 0) return identifier;
		
		// FIXME: strip out special chars or make this an MD5 hash or something
		return trim(item.innerHTML)
	},

	tmItemsByID : function(list) {
		var array = new Array()
		var items = list.getElementsByTagName('li')
		for (var i = 0, n = items.length; i < n; i++) {
			var item = items[i]
			array[ToolMan.junkdrawer().tmIdentifier(item)] = item
		}
		return array
	},

	trim : function(text) {
		if (text == null) return null
		return text.replace(/^(\s+)?(.*\S)(\s+)?$/, '$2')
	}
}
