var Drag = {
	obj : null,
	doc : null,

	initDrag : function(oRoot, o, doc, x, y, minX, minY, maxX, maxY, gridX, gridY){
		Drag.doc = doc;
		o.root = oRoot;
		o.onmousedown	  = Drag.start;

		oRoot.style.left = (x?x:"0")+"px";
		oRoot.style.top  = (y?y:"0")+"px";

		o.minX	= typeof minX != 'undefined' ? minX : null;
		o.minY	= typeof minY != 'undefined' ? minY : null;
		o.maxX	= typeof maxX != 'undefined' ? maxX : null;
		o.maxY	= typeof maxY != 'undefined' ? maxY : null;
		o.gridX	= typeof gridX != 'undefined' ? (gridX >=0 ? gridX : 1) : 1;
		o.gridY	= typeof gridY != 'undefined' ? (gridY >=0 ? gridY : 1) : 1;

		o.root.onDragStart	= new Function();
		o.root.onDragEnd	= new Function();
		o.root.onDrag		= new Function();
		o.root.onStart		= function(){return true;};
	},
	
	initResize : function(oRoot, name, doc, flag, minXSize, minYSize){
		var o = doc.getElementById(name);
		o.root = oRoot;
		o.onmousedown = Drag.start;
		o.resize = flag;
		o.minXSize = typeof minXSize != 'undefined' ? minXSize : 100;
		o.minYSize = typeof minYSize != 'undefined' ? minYSize : 100;

		o.root.onResizeStart= new Function();
		o.root.onResizeEnd	= new Function();
		o.root.onResize		= new Function();
		o.root.onStart		= function(){return true;};
	},

	start : function(e){
		var o = Drag.obj = this;
		if (!o.root.onStart())
			return;
		e = Drag.fixE(e);
		var x = parseInt(o.root.style.left);
		var dx = parseInt(o.root.style.width);
		var y = parseInt(o.root.style.top);
		var dy = parseInt(o.root.style.height);
		
		if (o.resize==null)
			o.root.onDragStart(x, y);
		else
			o.root.onResizeStart(dx, dy);

		o.lastMouseX	= e.clientX;
		o.lastMouseY	= e.clientY;

		if (o.minX != null)	
			o.minMouseX	= e.clientX - x + o.minX;
		else
			o.minMouseX=-9999;
		if (o.maxX != null)	
			o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		else
			o.maxMouseX=9999;
	
		if (o.minY != null)	
			o.minMouseY	= e.clientY - y + o.minY;
		else
			o.minMouseY=-9999;
		if (o.maxY != null)	
			o.maxMouseY	= o.minMouseY + o.maxY - o.minY;
		else
			o.maxMouseY=9999;
			
		if (o.resize!=null){
			if (Drag.obj.resize&1)
				o.maxMouseY = Math.min(o.maxMouseY, y+dy-o.minYSize);
			if (Drag.obj.resize&2)
				o.minMouseX = Math.max(o.minMouseX, x+o.minXSize);
			if (Drag.obj.resize&4)
				o.minMouseY = Math.max(o.minMouseY, y+o.minYSize);
			if (Drag.obj.resize&8)
				o.maxMouseX = Math.min(o.maxMouseX, x+dx-o.minXSize);
		}
		o.realXPos = x;
		o.realYPos = y;
		o.realXSize = dx;
		o.realYSize = dy;

		Drag.doc.onmousemove	= Drag.move;
		Drag.doc.onmouseup	  	= Drag.end;
		return false;
	},
	snapX : function(x){
		if (Drag.obj.gridX != null)
			return x = x - (x % Drag.obj.gridX);
		return x;
	},
	snapY : function(y){
		if (Drag.obj.gridY != null)
			return y = y - (y % Drag.obj.gridY);
		return y;
	},
	move : function(e){
		e = Drag.fixE(e);
		var o = Drag.obj;

		var ey	= e.clientY;
		var ex	= e.clientX;
			
		if (o.minX != null || o.resize & 2) 
			ex = Math.max(ex, o.minMouseX);
		if (o.maxX != null || o.resize & 8) 
			ex = Math.min(ex, o.maxMouseX);
		if (o.minY != null || o.resize & 4) 
			ey = Math.max(ey, o.minMouseY);
		if (o.maxY != null || o.resize & 1) 
			ey = Math.min(ey, o.maxMouseY);

		if (o.resize==null){
			o.realXPos = Drag.snapX(o.realXPos + (ex - o.lastMouseX));
			o.realYPos = Drag.snapY(o.realYPos + (ey - o.lastMouseY));
			Drag.obj.root.style["left"] = o.realXPos + "px";
			Drag.obj.root.style["top"] = o.realYPos + "px";
			Drag.obj.root.onDrag(o.realXPos, o.realYPos);
		} else {
			if (Drag.obj.resize&1){
				o.realYPos = Drag.snapY(o.realYPos + (ey - o.lastMouseY));
				o.realYSize = Drag.snapY(o.realYSize - (ey - o.lastMouseY));
				Drag.obj.root.style["top"] = o.realYPos + "px";
				Drag.obj.root.style["height"] = o.realYSize + "px";
			} 
			if (Drag.obj.resize&2){
				o.realXSize = Drag.snapX(o.realXSize + (ex - o.lastMouseX));
				Drag.obj.root.style["width"] = o.realXSize + "px";
			}
			if (Drag.obj.resize&4){
				o.realYSize = Drag.snapY(o.realYSize + (ey - o.lastMouseY));
				Drag.obj.root.style["height"] = o.realYSize + "px";
			}
			if (Drag.obj.resize&8){
				o.realXPos = Drag.snapX(o.realXPos + (ex - o.lastMouseX));
				o.realXSize = Drag.snapX(o.realXSize - (ex - o.lastMouseX));
				Drag.obj.root.style["left"] = o.realXPos + "px";
				Drag.obj.root.style["width"] = o.realXSize + "px";
			}
			Drag.obj.root.onResize(o.realXSize, o.realYSize);
		}
		Drag.obj.lastMouseX	= ex;
		Drag.obj.lastMouseY	= ey;

		return false;
	},

	end : function(){
		Drag.doc.onmousemove	= null;
		Drag.doc.onmouseup	  = null;
		
		if (Drag.obj.resize!=null)
			Drag.obj.root.onResizeEnd(parseInt(Drag.obj.root.style["width"]), parseInt(Drag.obj.root.style["height"]));
		else
			Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]));
		Drag.obj = null;
	},

	fixE : function(e){
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};
