/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 * Script featured on Dynamic Drive (http://www.dynamicdrive.com) 12.08.2005
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 
 *24.06.2011 adapted for jQuery and special use by Jürgen Müller-Lütken
 **************************************************/
var xx = 0;
var Drag = {

	obj : null,

	init : function(o, oRoot, minX, maxX, minY, maxY)
	{
		var elm = document.getElementById(o);
		if(elm == null)
		{
			return;
		}
		var o = $('#'+o);
		
		var el = $(document.createElement('div')).attr('class', 'layer');
		el.css({'width':o.width(), 'height':o.height()});
		o.before(el);
		o.appendTo(el);
		
		if(minX < maxX || minY < maxY)
		{
			o.css('cursor', 'move');
		}
		
		o.bind('mousedown', Drag.start);

		elm.root = oRoot && oRoot != null ? oRoot : elm;

		elm.minX	= typeof minX != 'undefined' ? minX : null;
		elm.minY	= typeof minY != 'undefined' ? minY : null;
		elm.maxX	= typeof maxX != 'undefined' ? maxX : null;
		elm.maxY	= typeof maxY != 'undefined' ? maxY : null;

		elm.root.onDragStart	= new Function();
		elm.root.onDragEnd	= new Function();
		elm.root.onDrag		= new Function();
	},

	start : function(e)
	{
		var obj = Drag.obj = this;
		var o = $(this);
		
		o.parent().append('<div id="dragHelper"></div>');
		obj.layer = $('#dragHelper');
			
		e = Drag.fixE(e);
		var y = o.position().top;
		var x = o.position().left;
		obj.root.onDragStart(x, y);

		obj.lastMouseX	= e.clientX;
		obj.lastMouseY	= e.clientY;

		if (obj.minX != null)	obj.minMouseX	= e.clientX - x + obj.minX;
		if (obj.maxX != null)	obj.maxMouseX	= obj.minMouseX + obj.maxX - obj.minX;

		if (obj.minY != null)	obj.minMouseY	= e.clientY - y + obj.minY;
		if (obj.maxY != null)	obj.maxMouseY	= obj.minMouseY + obj.maxY - obj.minY;

		obj.layer.bind('mousemove', Drag.drag);
		obj.layer.bind('mouseup', Drag.end);
		o.bind('mousemove', Drag.drag);
		o.bind('mouseup', Drag.end);
		return false;
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var obj = Drag.obj;
		var o = $(obj);
		
		if(!obj.active)
		{
			o.css('position', 'absolute');
			var cursor = 'default';
			if(obj.minX < obj.maxX || obj.minY < obj.maxY)
			{
				cursor = 'move';
			}
			obj.layer.css({'position' : 'absolute', 'top' : o.position().top + 'px', 'left' : o.position().left + 'px', 'width' : o.width() + 'px', 'height': o.height() + 'px', 'z-index' : 100, 'cursor': cursor});
			obj.active = true;
			o.unbind('mousemove');
			o.unbind('mouseup');
		}
	
		var ey	= e.clientY;
		var ex	= e.clientX;
		var y = o.position().top;
		var x = o.position().left;
		var nx, ny;

		if (obj.minX != null) ex = Math.max(ex, obj.minMouseX);
		if (obj.maxX != null) ex = Math.min(ex, obj.maxMouseX);
		if (obj.minY != null) ey = Math.max(ey, obj.minMouseY);
		if (obj.maxY != null) ey = Math.min(ey, obj.maxMouseY);

		nx = x + ((ex - obj.lastMouseX) * 1);
		ny = y + ((ey - obj.lastMouseY) * 1);

		o.css({"left": nx + "px", "top": ny + "px"});
		obj.layer.css({"left": nx + "px", "top": ny + "px"});
		
		obj.lastMouseX	= ex;
		obj.lastMouseY	= ey;

		obj.root.onDrag(nx, ny);
		return false;
	},

	end : function()
	{
		var obj = Drag.obj;
		var o = $(obj);
		
		obj.layer.unbind('mousemove');
		obj.layer.unbind('mouseup');
		obj.root.onDragEnd(o.css("left"), o.css("top"));
		obj.layer.remove();
		obj.active = false;
		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;
	}
};
