var Drag =
{
	BIG_Z_INDEX : 10000,
	group : null,
	isDragging : false,

	makeDraggable : function(group)
	{
		group.handle = group;
		group.handle.group = group;
		group.onDragStart = new Function();
		group.onDragEnd = new Function();
		group.onDrag = new Function();
		group.setDragHandle = Drag.setDragHandle;
		group.getElementsByTagName("div")[1].onmousedown = Drag.onMouseDown;
	},

	setDragHandle : function(handle) 
	{
		if (handle && handle != null) 
			this.handle = handle;
		else
			this.handle = this;

		this.handle.group = this;
		this.onmousedown = null;
		this.handle.onmousedown = Drag.onMouseDown;
	},

	onMouseDown : function(event)
	{
		event = Drag.fixEvent(event);
		Drag.group = this.parentNode.parentNode.group;
		Drag.isDragging = true;

		var group = Drag.group;
		var mouse = event.windowCoordinate;
		var nwOffset = Coordinates.northwestOffset(group, true);
		
		group.originalZIndex = group.style.zIndex;
		group.originalWidth = group.offsetWidth;
		group.onDragStart();
		group.style.position = "absolute";
		group.initialWindowCoordinate = mouse;
		group.diffPos = mouse.minus(nwOffset);
		group.style.width = group.originalWidth + "px";
		
		group.style["zIndex"] = Drag.BIG_Z_INDEX;
		//Drag.setOpacity(.4);

		nwOffset.reposition(group);
		
		document.onmousemove = Drag.onMouseMove;
		document.onmouseup = Drag.onMouseUp;
		
		var scrollPos = Coordinates.scrollPosition();
		//Drag.showStatus(mouse, "", "", "", "", nwOffset);

		return false;
	},

	onMouseMove : function(event)
	{
		event = Drag.fixEvent(event);
		var group = Drag.group;
		var mouse = event.windowCoordinate;
		var scrollPos = Coordinates.scrollPosition();
		var clientWindow = Coordinates.clientWindow();
		/*
		var nwOffset = Coordinates.northwestOffset(group, true);
		var nwPosition = Coordinates.northwestPosition(group);
		var sePosition = Coordinates.southeastPosition(group);
		var seOffset = Coordinates.southeastOffset(group, true);
		*/
		
		group.onDrag(mouse, scrollPos);
		
		if(scrollPos.y > 0 && mouse.y < 30)
			DragUtils.scrollWindow(0, -5);
		else if((clientWindow.y - mouse.y) < 30)
			DragUtils.scrollWindow(0, 5);
		//else if(scrollPos.x > 0 && mouse.x < 30)
		//	DragUtils.scrollWindow(-5, 0);
		//else if((clientWindow.x - mouse.x) < 30)
		//	DragUtils.scrollWindow(5, 0);
		
		var scrollPosAfter = Coordinates.scrollPosition();
		
		if(!scrollPosAfter.equals(scrollPos))
		{
			//Fix scroll effects
			if(scrollPosAfter.y != scrollPos.y)
			{
				group.diffPos.y += scrollPos.y - scrollPosAfter.y;
				mouse.minus(group.diffPos).reposition(group);
			}
			else if(scrollPosAfter.x != scrollPos.x)
			{
				group.diffPos.x += scrollPos.x - scrollPosAfter.x;
				mouse.minus(group.diffPos).reposition(group);
			}
		}
		else
		{
			mouse.minus(group.diffPos).reposition(group);
		}
		
		//Drag.showStatus(mouse, "", "", "", scrollPos, clientWindow);

		return false;
	},

	onMouseUp : function(event)
	{
		event = Drag.fixEvent(event);
		var group = Drag.group;

		document.onmousemove = null;
		document.onmouseup   = null;
		group.style.position = "relative";
		group.style.width = "";
		group.onDragEnd();

		if (Drag.isDragging) 
		{
			// restoring zIndex before opacity avoids visual flicker in Firefox
			group.style["zIndex"] = group.originalZIndex;
			//Drag.setOpacity(1);
		}

		Drag.group = null;
		Drag.isDragging = false;

		return false;
	},

	fixEvent : function(event)
	{
		if (typeof event == 'undefined')
			event = window.event;
			
		Coordinates.fixEvent(event);
		return event;
	},
	
	showStatus : function(mouse, nwPosition, sePosition, nwOffset, seOffset, custom)
	{
		window.status = 
				"Mouse: " + mouse.toString() + "    " + 
				"NW pos: " + nwPosition.toString() + "    " + 
				"SE pos: " + sePosition.toString() + "    " + 
				"NW offset: " + nwOffset.toString() + "    " +
				"SE offset: " + seOffset.toString() + "    " +
				"Custom: " + custom.toString();
	},
	
	setOpacity : function(val)
	{
		var group = Drag.group;
		
		if (group.filters)
		{
			try
			{
				group.filters["alpha"].opacity = val*100;
			}
			catch (e)
			{}
		} 
		else if (group.style.opacity)
		{
			group.style.opacity = val;
		}
	}
};
