	// Variables used for "Draggable IFrame" (DIF) functions
	var DIF_dragging=false;
	var DIF_iframeBeingDragged="";
	var DIF_iframeObjects=new Object();
	var DIF_iframeWindows=new Object();
	var DIF_iframeMouseDownLeft = new Object();
	var DIF_iframeMouseDownTop = new Object();
	var DIF_pageMouseDownLeft = new Object();
	var DIF_pageMouseDownTop = new Object();
	var DIF_handles = new Object();
	var DIF_highestZIndex=999;
	var DIF_raiseSelectedIframe=true;
	var DIF_allowDragOffScreen=false;

	// Set to true to always raise the dragged iframe to top zIndex
	function bringSelectedIframeToTop(val)
	{
		DIF_raiseSelectedIframe = val;
	}
	
	// Set to try to allow iframes to be dragged off the top/left of the document
	function allowDragOffScreen(val)
	{
		DIF_allowDragOffScreen=val;
	}

	// Method to be used by iframe content document to specify what object can be draggable in the window
	function addHandle(obj, win)
	{
		if (arguments.length==2 && win==window)
		 {
			// JS is included in the iframe who has a handle, search up the chain to find a parent window that this one is dragged in
			var p = win;
			while (p=p.parent)
			 {
				if (p.addHandle) { p.addHandle(obj,win,true); return; }
				if (p==win.top) { return; } // Already reached the top, stop looking
			 }
			return; // If it reaches here, there is no parent with the addHandle function defined, so this frame can't be dragged!
		}
		var topRef=win;
		var topRefStr = "window";
		while (topRef.parent && topRef.parent!=window)
		 {
			topRef = topRef.parent;
			topRefStr = topRefStr + ".parent";
		 }
		// Add handlers to child window
		
		with (win)
		{ 
			eval("function OnMouseDownHandler(evt) { if(typeof(evt)=='undefined'){evt=event;}"+topRefStr+".parent.DIF_begindrag(evt, "+topRefStr+") }");
			eval("document.onmousedown = OnMouseDownHandler;");
			eval("function OnMouseUpHandler(evt) { if(typeof(evt)=='undefined'){evt=event;}"+topRefStr+".parent.DIF_enddrag(evt, "+topRefStr+") }");
			eval("document.onmouseup = OnMouseUpHandler;");
			eval("document.onmouseout = OnMouseUpHandler;");
			eval("function OnMouseMoveHandler(evt) { if(typeof(evt)=='undefined'){evt=event;}"+topRefStr+".parent.DIF_iframemove(evt, "+topRefStr+") }");
			eval("document.onmousemove = OnMouseMoveHandler;");
		}
		obj.style.cursor="move";
		var name = DIF_getIframeId(topRef);
		if (DIF_handles[name]==null)
		{
			// Initialize relative positions for mouse down events
			DIF_handles[name] = new Array();
			DIF_iframeMouseDownLeft[name] = 0;
			DIF_iframeMouseDownTop[name] = 0;
			DIF_pageMouseDownLeft[name] = 0;
			DIF_pageMouseDownTop[name] = 0;
		}
		DIF_handles[name][DIF_handles[name].length] = obj;
	}

	// Generalized function to get position of an event (like mousedown, mousemove, etc)
	function DIF_getEventPosition(evt)
	{
		var pos=new Object();
		pos.x=0;
		pos.y=0;
		if (!evt)
		{
			evt = window.event;
		}
		if (typeof(evt.pageX) == 'number')
		{
			pos.x = evt.pageX;
			pos.y = evt.pageY;
		}
		else
		{
			pos.x = evt.clientX;
			pos.y = evt.clientY;
			if (!top.opera)
			{
				if ((!window.document.compatMode) || (window.document.compatMode == 'BackCompat'))
				{
					pos.x += window.document.body.scrollLeft;
					pos.y += window.document.body.scrollTop;
				}
				else
				{
					pos.x += window.document.documentElement.scrollLeft;
					pos.y += window.document.documentElement.scrollTop;
				}
			}
		}
		return pos;
	}

	// Gets the ID of a frame given a reference to a window object.
	// Also stores a reference to the IFRAME object and it's window object
	function DIF_getIframeId(win)
	{
		// Loop through the window's IFRAME objects looking for a matching window object
		var iframes = document.getElementsByTagName("IFRAME");
		for (var i=0; i<iframes.length; i++)
		{
			var objItem = iframes.item(i);
			var w = null;
			if (objItem.contentWindow)
			{
				// For IE5.5 and IE6
				w = objItem.contentWindow;
			}
			else if (window.frames && window.frames[objItem.id].window)
			{
				w = window.frames[objItem.id];
			}
			if (w == win)
			{
				DIF_iframeWindows[objItem.id] = win;
				DIF_iframeObjects[objItem.id] = objItem;
				return objItem.id; 
			}
		}
		return null;
	}

	// Gets the page x, y coordinates of the iframe (or any object)
	function DIF_getObjectXY(objXY)
	{
		var res = new Object();
		res.x=0; res.y=0;
		if (objXY != null)
		{
			res.x = objXY.style.left.substring(0,objXY.style.left.indexOf("px"));
			res.y = objXY.style.top.substring(0,objXY.style.top.indexOf("px"));
		}
		return res;
	}

// Gets the page width , height coordinates of the iframe (or any object)
	function DIF_getObjectWHXY(objXY)
	{
		var res = new Object();
		res.x=0; res.y=0;
		if (objXY != null)
		{
			res.x = objXY.style.width.substring(0,objXY.style.width.indexOf("px"));
			res.y = objXY.style.height.substring(0,objXY.style.height.indexOf("px"));
		}
		return res;
	}
	// Function to get the src element clicked for non-IE browsers
	function getSrcElement(e)
	{
		var tgt = e.target;
		while (tgt.nodeType != 1) { tgt = tgt.parentNode; }
		return tgt;
	}

	// Check if object clicked is a 'handle' - walk up the node tree if required
	function isHandleClicked(handle, objectClicked)
	{
		if (handle==objectClicked) { return true; }
		while (objectClicked.parentNode != null)
		{
			if (objectClicked==handle)
			{
				return true;
			}
			objectClicked = objectClicked.parentNode;
		}
		return false;
	}
	
	// Called when user clicks an iframe that has a handle in it to begin dragging
	function DIF_begindrag(e, win)
	{
		// Get the IFRAME ID that was clicked on
		var iframename = DIF_getIframeId(win);
		if (iframename==null) { return; }
		// Make sure that this IFRAME has a handle and that the handle was clicked
		if (DIF_handles[iframename]==null || DIF_handles[iframename].length<1)
		{
			return;
		}
		var isHandle = false;
		var t = e.srcElement || getSrcElement(e);
		for (var i=0; i<DIF_handles[iframename].length; i++)
		{
			if (isHandleClicked(DIF_handles[iframename][i],t))
			{
				isHandle=true;
				break;
			}
		}
		if (!isHandle) { return false; }
		DIF_iframeBeingDragged = iframename;
		if (DIF_raiseSelectedIframe)
		{
			DIF_iframeObjects[DIF_iframeBeingDragged].style.zIndex=DIF_highestZIndex++;
		}
		DIF_dragging=true;
		var pos=DIF_getEventPosition(e);
		DIF_iframeMouseDownLeft[DIF_iframeBeingDragged] = pos.x;
		DIF_iframeMouseDownTop[DIF_iframeBeingDragged] = pos.y;
		var objectXY = DIF_getObjectXY(DIF_iframeObjects[DIF_iframeBeingDragged]);
		DIF_pageMouseDownLeft[DIF_iframeBeingDragged] = objectXY.x - 0 + pos.x;
		DIF_pageMouseDownTop[DIF_iframeBeingDragged] = objectXY.y -0 + pos.y;
	}

	// Called when mouse button is released after dragging an iframe
	function DIF_enddrag(e)
	{
		DIF_dragging=false;
		DIF_iframeBeingDragged="";
	}

	// Called when mouse moves in the IFRAME window
	function DIF_iframemove(e)
	 {
		if (DIF_dragging)
		{
			var pos = DIF_getEventPosition(e);
			DIF_drag(pos.x - DIF_iframeMouseDownLeft[DIF_iframeBeingDragged] , pos.y - DIF_iframeMouseDownTop[DIF_iframeBeingDragged]);
		}
	}
	// For the current Size of inner window
	function DIF_innerWindowXY()
	{
		var res = new Object();
		res.x=0;
		res.y=0;
		if( typeof( window.innerWidth ) == 'number' )
		{
			//Non-IE
			res.x = window.innerWidth;
			res.y = window.innerHeight;
		} 
		else if( document.documentElement &&( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		{
			//for IE 6+ 
			res.x = document.documentElement.clientWidth;
			res.y = document.documentElement.clientHeight;
		}
		else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		{
			//IE compatible
			res.x = document.body.clientWidth;
			res.y = document.body.clientHeight;
		}
		return res;
	}

	// Function which actually moves of the iframe object on the screen
	function DIF_drag(x,y)
	{
		var objectXY = DIF_getObjectXY(DIF_iframeObjects[DIF_iframeBeingDragged]);
		// Don't drag it off the top or left of the screen?
		var newPositionX = objectXY.x-0+x;
		var newPositionY = objectXY.y-0+y;
		if (!DIF_allowDragOffScreen) 
		{
			var objFrameXY=DIF_getObjectWHXY(DIF_iframeObjects[DIF_iframeBeingDragged]);
			var objInnerXY=DIF_innerWindowXY();
			if(newPositionX > objInnerXY.x - objFrameXY.x)				
			{
				newPositionX = objInnerXY.x - objFrameXY.x;
			}
			if (newPositionX < 0)
			{
			  newPositionX=0;
			}
			if (newPositionY < 0)
			{
			  newPositionY=0;
			}
		}
		DIF_iframeObjects[DIF_iframeBeingDragged].style.left = newPositionX + "px";
		DIF_iframeObjects[DIF_iframeBeingDragged].style.top  = newPositionY + "px";
		DIF_pageMouseDownLeft[DIF_iframeBeingDragged] += x;
		DIF_pageMouseDownTop[DIF_iframeBeingDragged] += y;
	}