// -----------------------------------------------------------------------------
// Script:  MiLifeDragging.js
// Project : NPD/4978 MiLife Coaching Ltd, MiLife
// Copyright ©2006 Imperative Health Limited.  All rights reserved. 
//	
// Description:
//      Cross-browser drag and drop support for MiLife.
//
//  Modification History
//
//  Version		Date				By			Description
//  V1R1M0		05/02/2006			ADCS		Created.
//  V1R1M1      06/12/2006          GROJ        Refactored from MiLifeDragging to MiLifeDragging
//-------------------------------------------------------------------------------

var Drag = {

	obj : null,
	haltDrag: false,
	dragEvent: null,

	init : function(o, oRoot, minX, maxX, minY, maxY)
	{
		o.onmousedown = Drag.doStart;

		o.root = oRoot && oRoot != null ? oRoot : o;

		if (isNaN(parseInt(o.root.style.left))) o.root.style.left = "0px";
		if (isNaN(parseInt(o.root.style.top))) o.root.style.top = "0px";

		o.root.origX = o.root.style.left;
		o.root.origY = o.root.style.top;
		
		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.root.onDragStart = new Function();
		o.root.onDragEnd = new Function();
		o.root.onDrag = new Function();
	},

	doStart : function(e)
	{
		var evnt = e;
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		Drag.dragEvent = e;
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);
		o.root.onDragStart(o, x, y, evnt);
        
        //if onDragStart sets this then halt the drag
        if(Drag.haltDrag)
        {
            Drag.haltDrag = false;
            return false;
        }
        
		o.lastMouseX = e.clientX;
		o.lastMouseY = e.clientY;

		if (o.minX != null)	o.minMouseX	= e.clientX - x + o.minX;
		if (o.maxX != null)	o.maxMouseX	= o.minMouseX + o.maxX - o.minX;
		if (o.minY != null)	o.minMouseY	= e.clientY - y + o.minY;
		if (o.maxY != null)	o.maxMouseY	= o.minMouseY + o.maxY - o.minY;

		document.onmousemove = Drag.doDragging;
		document.onmouseup = Drag.doEnd;

		return false;
	},

	doDragging : function(e)
	{
		e = Drag.fixE(e);
		Drag.dragEvent = e;
		var o = Drag.obj;

		var ey = e.clientY;
		var ex = e.clientX;
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);

		if (o.minX != null) Math.max(ex, o.minMouseX);
		if (o.maxX != null) Math.min(ex, o.maxMouseX);
		if (o.minY != null) Math.max(ey, o.minMouseY);
		if (o.maxY != null) Math.min(ey, o.maxMouseY);

		var nx = x + ex - o.lastMouseX;
		var ny = y + ey - o.lastMouseY;

		o.root.style.left = nx + "px";
		o.root.style.top = ny + "px";
		o.lastMouseX	= ex;
		o.lastMouseY	= ey;

		o.root.onDrag(o, nx, ny);
		return false;
	},

	doEnd : function()
	{
		var o = Drag.obj;
		
		document.onmousemove = null;
		document.onmouseup = null;
		o.root.onDragEnd(o, parseInt(o.root.style.left), parseInt(o.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;
		    e.layerY = e.offsetY;
		}
		return e;
	}
};
