/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 * Script featured on Dynamic Drive (http://www.dynamicdrive.com) 12.08.2005
 *
 * DEPENDENCIES:
 *     tags.js
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 * 03/14/07 CEM P7186 Added the modal pane/shim to the 
 *				openPopup and closePopup to the function.
 * 04/03/07 JLS P7106  Added shim support so that select
 *              drop downs are hidden behind the popup
 *              in IE 6.
 **************************************************/

var Drag = {

	obj : null,

    /*
     Please note, the shimId is NOT the actual shim object, it is only
     the id that references the shim.  There should exist a shimIdContainer
     HTML object on the page.  The init code appends "Container" to the shimId
     value passed in and dynamically creates the shimId inside the 
     container.  Also, the shim is only created for IE browsers, or any
     browser that has the document.all array.
    */
	init : function(o, oRoot, shimId, minX, maxX, minY, maxY, bSwapHorzRef, bSwapVertRef, fXMapper, fYMapper)
	{
	    var oShim = null;
	    
	    // if a shimId is passed in, and a shim container exists on the
	    // page, AND if this is an IE browser, then create the shim:
	    if(shimId != null && document.getElementById(shimId + "Container") != null && document.all)
	        try
	        {
		        oShim = createHTMLElement(document.getElementById(shimId + "Container"), "iframe", shimId,
		    	    {"src":"javascript:false","scrolling":"no", "frameborder":"0"});
			}
			catch(ex)
			{
			    // unable to create shim.  
			}	    

		if(oShim != null)
		{
		    var shimStyle = this.getStyle(oShim);
		    if(shimStyle != null)
		    {
			    shimStyle.position = "absolute";
			    shimStyle.top = "0px";
			    shimStyle.left = "0px";
			    shimStyle.display = "none";
			    
			    shimStyle.filter = "alpha(opacity=0)";

				if(shimStyle.opacity)
					shimStyle.opacity = 0;
				
				if(shimStyle.MozOpacity)
					shimStyle.MozOpacity = 0;
			}
		}
	    	
		o.onmousedown	= Drag.start;

		o.hmode			= bSwapHorzRef ? false : true ;
		o.vmode			= bSwapVertRef ? false : true ;

		o.root = oRoot && oRoot != null ? oRoot : o ;
        o.shim = oShim;

		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();
	},

	start : function(e)
	{
		var o = Drag.obj = this;
		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 );
		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);
		Drag.alignShimWithObject(o.root, o.shim);
		
		return false;
	},

	end : function()
	{
		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;
	},

    alignShimWithObject: function(popupObj, shimObj)
    {
        try
        {
            if(shimObj == null || popupObj == null)
                return;

        	alignObjects(popupObj, shimObj);
       	}
       	catch(ex)
       	{
       	    // alignObjects is not included in the source page.
       	    // include tags.js to use this feature.
       	}
    },

	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;
	},
	
    openPopup: function(popupObj)
    {
		if(!popupObj || popupObj == null)
			return;
    	var id = popupObj.id;
		var popupStyle = Drag.getStyle(popupObj);
		popupStyle.zIndex = 100;

		if(Drag.getObject(id +"ModalPane") && Drag.getObject(id +"ModalPane")!=null)
		{
			var modalPane = Drag.getObject(id +"ModalPane");
			modalPane.style.zIndex = popupObj.style.zIndex - 1;
			if(document.all)
			{
				// this js function is located in the forms.js file
				disableSelectFormFields();
			}
			modalPane.style.display = "block";
			eval(id+"ResizeModalPane();");
		}
		
		popupStyle.display = "block";

       // display the shim too:
       if(popupObj.id)
       {
	       var shimObj = Drag.getObject(id + "Shim");
	       if(shimObj != null)
	       	Drag.alignShimWithObject(popupObj, shimObj);
	   }
    },

   /**
    * Closes the popup and the shim Object.
    */   
   closePopup: function(popupObj)
   {
       if(!popupObj || popupObj== null)
           return;
           
	   var id = popupObj.id;           
	   var popupStyle = Drag.getStyle(popupObj);
	   popupStyle.display = "none";

	   // hide the shim too:
	   if(popupObj.id)
	   {
	       var shimObj = Drag.getObject(id + "Shim");
	       
	       if(shimObj != null)
	       {
		       var shimStyle = Drag.getStyle(shimObj);
 		       shimStyle.display = "none";
 		   }
	   }
	   
		if(Drag.getObject(id +"ModalPane") && Drag.getObject(id +"ModalPane")!=null)
		{
			var modalPane = Drag.getObject(id +"ModalPane");
			modalPane.style.display = "none";		
			if(document.all)
			{
				// this js function is located in the forms.js file
				enableSelectFormFields();
			}
		}
   },
   
   /*
    * Executes a cross-browser object lookup.
	* @param id = The value set in a tag's id attribute.
	*/
  getObject: function(id)
  {
	var obj = null;
	
	if (document.getElementById)
	{	
		// standards-compliant mechanism
		obj = document.getElementById(id);
	}
	else if (document.all)
	{	// older IE mechanism
		obj = document.all[id];
	}
	else if (document.layers)
	{	
		// Netscape 4 mechanism
		obj = document.layers[id];
	}
	
	return obj;
  },
  /**
   * Retrieves the object's styles.
   * @return - The style object for the object specified.
   */
  getStyle: function(object)
  {
	var style = null;
		
	if(object.style)
		style = object.style;
	else
		style = object;
		
	return style;
  }	
};


