/**************************************************
 * 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.
 *************************************************
 * 29/08/08 - ARM. Customize for Good Governance
 * 09/10/08 - AFC. Fixed issue with dragging while leaving the window
 * ISA Technologies All Rights Reserved (c) 2008
 *************************************************
 */

var Drag = {

	obj : null,

	init : function(o, displayY, oRoot, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
	{
	    var defaultStartY = typeof displayY == 'undefined' ? getScreenCenterY() : displayY;
		o.onmousedown	= Drag.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   = getScreenCenterX()+"px";
//		if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = getScreenCenterY()+"px"; //original code
        if (o.vmode  && isNaN(parseInt(o.root.style.top   ))) o.root.style.top    = defaultStartY+"px";
		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 : 0;
		o.minY	= typeof minY != 'undefined' ? minY : 0;
		//original code
//		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();
	},

	start : function(e)
	{
		var targ;
		if (!e){
		  var e = window.event;
		}
		if (e.target){
		  targ = e.target;
		}
		else if (e.srcElement){
		  targ = e.srcElement;
		}
		if (targ.nodeType == 3){ // defeat Safari bug
		  targ = targ.parentNode;
		}
		var tname;
		tname=targ.tagName;

		if((tname != "TEXTAREA") && (tname != "INPUT")){//do not drag for these Tags
			var o = Drag.obj = this;
			//Adjust max values when window resized
			o.maxX	= typeof maxX != 'undefined' ? maxX : document.body.clientWidth-406;
			o.maxY	= typeof maxY != 'undefined' ? maxY : document.body.clientHeight-390;

			e = Drag.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 );
			
			var currXPos = 388 - (e.clientX-x);
			var currYPos = 60 - ((getDisplayY(e)+220)-y);

			if((currXPos > 0) || ((currXPos < 0) && (currYPos > 0))){//excluding the v-scrollbar area
			    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	= Drag.drag;
			    document.onmouseup		= Drag.end;
    	
			    return false;
			}
		}
	},

	drag : function(e)
	{
		e = Drag.fixE(e);
		var o = Drag.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)

		Drag.obj.root.style[o.hmode ? "left" : "right"] = nx + "px";
		Drag.obj.root.style[o.vmode ? "top" : "bottom"] = ny + "px";
		Drag.obj.lastMouseX	= ex;
		Drag.obj.lastMouseY	= ey;

		Drag.obj.root.onDrag(nx, ny);
	    o.onmouseleave = Drag.end;
		
		return false;
	},

	end : function()
	{
		if (Drag.obj != null)
		{
		    document.onmousemove = null;
		    document.onmouseup   = null;
		    Drag.obj.root.onDragEnd(	parseInt(Drag.obj.root.style[Drag.obj.hmode ? "left" : "right"]), 
									    parseInt(Drag.obj.root.style[Drag.obj.vmode ? "top" : "bottom"]));
		    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;
	}
};

function getDisplayY(e){
	if (typeof e == 'undefined') e = window.event;
	
	var yHeight = getScrollOffset() + e.clientY - 220;
	if((getInnerHeight()-yHeight) <= 220){
		yHeight = yHeight - 220;
	}

	return yHeight;
}

function getScreenCenterY() {
	var y = 0;
	y = getScrollOffset()+(getInnerHeight()/2);
	return(y);
}

function getScreenCenterX() {
//	return((document.body.clientWidth)/2);  //original code
	var x = 0;
	var divWidth = 400; //this is the width fo the overlay (width is in the o.id's 3rd gen child for GG)
	x = (document.body.clientWidth - divWidth)/2;
	 
	return(x);
}

function getInnerHeight() {
	var y;
	if (self.innerHeight){ // all except Explorer
		y = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientHeight){
	// Explorer 6 Strict Mode
		y = document.documentElement.clientHeight;
	}
	else if (document.body){ // other Explorers
		y = document.body.clientHeight;
	}
	
	return(y);
}

function getScrollOffset() {
	var y;
	if (self.pageYOffset){ // all except Explorer
		y = self.pageYOffset;
	}
	else if (document.documentElement && document.documentElement.scrollTop){
	// Explorer 6 Strict
		y = document.documentElement.scrollTop;
	}
	else if (document.body){ // all other Explorers
		y = document.body.scrollTop;
	}
	
	return(y);
}
