function Drag()
{
	var me = this;
	this.obj = null;
	this.init = function(o,oRoot,minX,maxX,minY,maxY,bSwapHorzRef,bSwapVertRef,fXMapper,fYMapper)
	{
		o.onmousedown=me.start;
		o.hmode = bSwapHorzRef ? false : true;
		o.vmode = bSwapVertRef ? false : true;
		o.root = (oRoot&&oRoot != null) ? oRoot : o;
		
		if (o.hmode && isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";
		
		if (o.vmode && isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";
		
		if (!o.hmode && isNaN(parseInt(o.root.style.right))) o.root.style.right="0px";
		
		if (!o.vmode && isNaN(parseInt(o.root.style.bottom))) o.root.style.bottom="0px";
		
		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.xMapper=fXMapper?fXMapper:null;
		o.yMapper=fYMapper?fYMapper:null;
		
		o.root.onDragStart = new Function();
		
		o.root.onDragEnd=new Function();
		
		o.root.onDrag=new Function()};
		
		this.start = function(e)
		{
			var o=me.obj=this;
			e=me.fixE(e);
			var y=parseInt(o.vmode?o.root.style.top:o.root.style.bottom);
			var x=parseInt(o.hmode?o.root.style.left:o.root.style.right);
			o.root.onDragStart(x,y);
			o.lastMouseX=e.clientX;
			o.lastMouseY=e.clientY;
			
			if(o.hmode)
			{
				if(o.minX!=null)o.minMouseX=e.clientX-x+o.minX;
				if(o.maxX!=null)o.maxMouseX=o.minMouseX+o.maxX-o.minX
			}
			else
			{
				if(o.minX!=null) o.maxMouseX=-o.minX+e.clientX+x;
				if(o.maxX!=null)o.minMouseX=-o.maxX+e.clientX+x
			}
			
			if(o.vmode)
			{
				if(o.minY!=null)o.minMouseY=e.clientY-y+o.minY;
				if(o.maxY!=null)o.maxMouseY=o.minMouseY+o.maxY-o.minY
			}
			else
			{
				if(o.minY!=null)o.maxMouseY=-o.minY+e.clientY+y;
				if(o.maxY!=null)o.minMouseY=-o.maxY+e.clientY+y
			}
			
			document.onmousemove=me.drag;
			document.onmouseup=me.end;return false
		};
		
		this.drag = function(e)
		{
			e=me.fixE(e);
			var o=me.obj;
			var ey=e.clientY;
			var ex=e.clientX;
			var y=parseInt(o.vmode?o.root.style.top:o.root.style.bottom);
			var x=parseInt(o.hmode?o.root.style.left:o.root.style.right);
			var nx,ny;
			
			if(o.minX!=null)ex=o.hmode?Math.max(ex,o.minMouseX):Math.min(ex,o.maxMouseX);
			if(o.maxX!=null)ex=o.hmode?Math.min(ex,o.maxMouseX):Math.max(ex,o.minMouseX);
			if(o.minY!=null)ey=o.vmode?Math.max(ey,o.minMouseY):Math.min(ey,o.maxMouseY);
			if(o.maxY!=null)ey=o.vmode?Math.min(ey,o.maxMouseY):Math.max(ey,o.minMouseY);
			
			nx=x+((ex-o.lastMouseX)*(o.hmode?1:-1));
			ny=y+((ey-o.lastMouseY)*(o.vmode?1:-1));
			
			if(o.xMapper)nx=o.xMapper(y);
			else if(o.yMapper)ny=o.yMapper(x);
			
			me.obj.root.style[o.hmode?"left":"right"]=nx+"px";
			me.obj.root.style[o.vmode?"top":"bottom"]=ny+"px";
			
			me.obj.lastMouseX=ex;
			me.obj.lastMouseY=ey;
			me.obj.root.onDrag(nx,ny);
			
			return false
		};
		
		this.end = function()
		{
			document.onmousemove=null;
			document.onmouseup=null;
			
			me.obj.root.onDragEnd(parseInt(me.obj.root.style[me.obj.hmode?"left":"right"]),parseInt(me.obj.root.style[me.obj.vmode?"top":"bottom"]));
			
			me.obj=null};
			
			this.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
			}
};
