var DragDrop = {
	firstContainer : null,
	lastContainer : null,
    parent_id : null,
    parent_group : null,    
	/**
	 *
	 */    
	makeListContainer : function(list, group) {
		if (this.firstContainer == null) {
			this.firstContainer = this.lastContainer = list;
			list.previousContainer = null;
			list.nextContainer = null;
		} else {
			list.previousContainer = this.lastContainer;
			list.nextContainer = null;
			this.lastContainer.nextContainer = list;
			this.lastContainer = list;
		}
		
		list.onDragOver = new Function();
		list.onDragOut = new Function();
        list.onDragDrop = new Function();
        list.group = group;
		
    	var items = list.getElementsByTagName( "li" );    	
		for (var i = 0; i < items.length; i++) {
			DragDrop.makeItemDragable(items[i]);
		}
	},
	/**
	 *
	 */
	serData : function ( group, theid ) {
		var container = DragDrop.firstContainer;
		var j = 0;
		var string = "";		
		while (container != null) {
        	if(theid != null && container.id != theid){
				container = container.nextContainer;
				continue;
			}
            if(group != null && container.group != group){
              container = container.nextContainer;
              continue;
            }
            j ++;
            if(j > 1) string += ":";
			string += container.id;
			
			var items = container.getElementsByTagName( "li" );
			string += "(";
        	for (var i = 0; i < items.length; i++) {
				if(i > 0) string += ",";
				string += items[i].id;
        	}
			string += ")";
			container = container.nextContainer;
		}
		return string;   
	},
	/**
	 *
	 */
	makeItemDragable : function(item) {
		Drag.makeDraggable(item);
		item.setDragThreshold(5);		
		item.isOutside = false;	
		item.onDragStart = DragDrop.onDragStart;
		item.onDrag = DragDrop.onDrag;
		item.onDragEnd = DragDrop.onDragEnd;
	},
	/**
	 *
	 */
	onDragStart : function(nwPosition, sePosition, nwOffset, seOffset) {
		var container = DragDrop.firstContainer;
		while (container != null) {
			container.northwest = Coordinates.northwestOffset( container, true );
			container.southeast = Coordinates.southeastOffset( container, true );
			container = container.nextContainer;
		}
		
		// item starts out over current parent
		if (typeof this.parentNode.onDragOver == 'function'){
			this.parentNode.onDragOver();
                parent_id = this.parentNode.id;
                parent_group = this.parentNode.group;
        }
	},
	/**
	 *
	 */
	onDrag : function(nwPosition, sePosition, nwOffset, seOffset) {	
		//this.style["border"] = "1px solid #DDDDDD";	
		if (this.isOutside) {
			var container = DragDrop.firstContainer;
			while (container != null) {

				if ((nwOffset.inside( container.northwest, container.southeast ) ||
					seOffset.inside( container.northwest, container.southeast )) && container.group == parent_group) {
					container.onDragOver();
					this.isOutside = false;
					var tempParent = this.parentNode;
					tempParent.removeChild( this );
					container.appendChild( this );
					tempParent.parentNode.removeChild( tempParent );
					break;
				}
				container = container.nextContainer;
			}
			if (this.isOutside)
				return;
		
		} else if (!(nwOffset.inside( this.parentNode.northwest, this.parentNode.southeast ) ||
			seOffset.inside( this.parentNode.northwest, this.parentNode.southeast ))) {
			
			this.parentNode.onDragOut();
			this.isOutside = true;
			
			var container = DragDrop.firstContainer;
			while (container != null) {
				if ((nwOffset.inside( container.northwest, container.southeast ) ||
					seOffset.inside( container.northwest, container.southeast )) && container.group == parent_group) {
					container.onDragOver();
					this.isOutside = false;
					this.parentNode.removeChild( this );
					container.appendChild( this );
					break;
				}
				container = container.nextContainer;
			}
			if (this.isOutside) {
				var tempParent = this.parentNode.cloneNode( false );
				this.parentNode.removeChild( this );
				tempParent.appendChild( this );
				tempParent.style.border = 0;
				document.getElementsByTagName( "body" ).item(0).appendChild( tempParent );
				return;
			}
		}		
		var parent = this.parentNode;			
		var item = this;
		var next = DragUtils.nextItem(item);
		while (next != null && this.offsetTop >= next.offsetTop - 2) {
			var item = next;
			var next = DragUtils.nextItem(item);
		}
		if (this != item) {
			DragUtils.swap(this, next);
			return;
		}
		var item = this;
		var previous = DragUtils.previousItem(item);
		while (previous != null && this.offsetTop <= previous.offsetTop + 2) {
			var item = previous;
			var previous = DragUtils.previousItem(item);
		}
		if (this != item) {
			DragUtils.swap(this, item);
			return;
		}		
	},
	/**
	 *
	 */
	onDragEnd : function(nwPosition, sePosition, nwOffset, seOffset) {
		if (this.isOutside) {
			var container = DragDrop.firstContainer;
			while (container != null) {
   				if(container.id == parent_id){
     				break;
   				}
   				container = container.nextContainer;
			}
			this.isOutside = false;
			this.parentNode.removeChild( this );
			container.appendChild( this );
                this.style["top"] = "0px";
		        this.style["left"] = "0px";
				//var container = DragDrop.firstContainer;
				//container.appendChild( this );
			return;
		}
		this.parentNode.onDragOut();
        this.parentNode.onDragDrop();
      	this.style["top"] = "0px";
		this.style["left"] = "0px";
		this.style["border"] = "0";	
		
	}
};




var DragUtils = {
	swap : function(item1, item2) {
		var parent = item1.parentNode;
		parent.removeChild(item1);
		parent.insertBefore(item1, item2);

		item1.style["top"] = "0px";
		item1.style["left"] = "0px";
	},

	nextItem : function(item) {
		var sibling = item.nextSibling;
		while (sibling != null) {
			if (sibling.nodeName == item.nodeName) return sibling;
			sibling = sibling.nextSibling;
		}
		return null;
	},

	previousItem : function(item) {
		var sibling = item.previousSibling;
		while (sibling != null) {
			if (sibling.nodeName == item.nodeName) return sibling;
			sibling = sibling.previousSibling;
		}
		return null;
	}		
};

