/**
 * @namespace com.thesis.util.Draggable
 * @author 钟军锐 August.R@263.net
 */

/** @id Draggable */
function Draggable(oTarget, iType, oFire){
	this.Target = oTarget;
	this.DragType = iType;
	this.Fire = oFire;
	this.iDiffX = 0;
	this.iDiffY = 0;
	this.Dragging = false;
	
	if(!this.Target) return null;
	
	if(!oFire) this.Fire = this.Target;
	
	if(typeof Draggable._initialized == "undefined"){
		Draggable._initialized = true;
		
		/** @id handleMouseMove */
		Draggable.prototype.handleMouseMove = function(){
			var oEvent = uEvent.getBrowserEvent();
			var Current = Draggable.Current;
			if((Current.DragType & Draggable.DRAG_X) == Draggable.DRAG_X)
				Current.Target.style.left = oEvent.clientX - Current.iDiffX + "px";
			if((Current.DragType & Draggable.DRAG_Y) == Draggable.DRAG_Y)
				Current.Target.style.top = oEvent.clientY - Current.iDiffY + "px";
		};
		
		/** @id handleMouseUp */
		Draggable.prototype.handleMouseUp = function(){
			document.body.parentNode.style.cursor = "auto";
			uEvent.removeBrowserHandler(document.body.parentNode, "mousemove", Draggable.Current.handleMouseMove);
			uEvent.removeBrowserHandler(document.body.parentNode, "mouseup", Draggable.Current.handleMouseUp);
			Draggable.Current.Dragging = false;
			Draggable.Current = null;
		};
		
		/** @id handleMouseDown */
		Draggable.prototype.handleMouseDown = function(oEvent){
			this.iDiffX = oEvent.clientX - this.Target.offsetLeft;
			this.iDiffY = oEvent.clientY - this.Target.offsetTop;
			
			document.body.parentNode.style.cursor = "move";
			
			uEvent.addBrowserHandler(document.body.parentNode, "mousemove", this.handleMouseMove);
			uEvent.addBrowserHandler(document.body.parentNode, "mouseup", this.handleMouseUp);
		};
		
		/** @id initailize */
		Draggable.prototype.initailize = function(Root){
			this.Target.style.position = "absolute";
			uEvent.addBrowserHandler(this.Fire, "mousedown", function(){
				var oEvent = uEvent.getBrowserEvent();
				if(oEvent.button != 2 && Root.Dragging == false){
					Draggable.Current = Root;
					Root.Dragging = true;
					Root.handleMouseDown(oEvent);
				}
			});
		};
	}
	
	
	this.initailize(this);
}
Draggable.DRAG_X = 1;
Draggable.DRAG_Y = 2;
Draggable.DRAG_Both = 3;
/** @type {Draggable} */
Draggable.Current = null;


