var DIF_debugging=!true;

var _DIF_console=null;
function DIF_debug(msg)
{
	if (_DIF_console == null || _DIF_console.closed)
	{
		_DIF_console = window.open("","DIF_console","width=400,height=150,resizable,scrollbars=yes,left=0,top=0");
		_DIF_console.document.open("text/plain");
		_DIF_console.focus();
	}
	
	if (msg==null)
	{
		_DIF_console.document.open("text/plain");
	}
	else
	{
		_DIF_console.document.writeln(msg);
	}
}

// ===================================================================
// Author: Matt Kruse <matt@mattkruse.com>
// WWW: http://www.mattkruse.com/
//
// NOTICE: You may use this code for any purpose, commercial or
// private, without any further permission from the author. You may
// remove this notice from your final code if you wish, however it is
// appreciated by the author if at least my web site address is kept.

var	DIF_beginDragScreenX=0;
var	DIF_beginDragScreenY=0;
var	DIF_beginDragObjectX=0;
var	DIF_beginDragObjectY=0;
var DIF_beginDragScrollLeft=0;
var DIF_beginDragscrollTop=0;

// 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_handles = new Object();
var DIF_highestZIndex=99;
var DIF_raiseSelectedIframe=false;
var DIF_allowDragOffScreen=false;

//dyn
var DIF_gridX=0;
var DIF_gridY=0;
var DIF_winSizeX = 0;
var DIF_winSizeY = 0;

//dyn
function dif_setGridSize(x,y)
{
	DIF_gridX = x;
	DIF_gridY = y;
}

function dif_setWinSize(x,y)
{
	DIF_winSizeX = x;
	DIF_winSizeY = y;
}

// Set to true to always raise the dragged iframe to top zIndex
function dif_bringSelectedIframeToTop(val)
{
	DIF_raiseSelectedIframe = val;
}
	
// Set to try to allow iframes to be dragged off the top/left of the document
function dif_allowDragOffScreen(val)
{
	DIF_allowDragOffScreen=val;
}


// Method to be used by iframe content document to specify what object can be draggable in the window
// returns true if can be dragged, false if not
function addHandle(o, win)
{
	if (DIF_debugging)
	{
		//DIF_debug();
		DIF_debug("addHandle:");
		DIF_debug("arguments.length="+arguments.length);
		DIF_debug("win==window="+(win==window));
	}

	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
		// (dyn issue 3757: excluding parent windows that are Dashboard items - in case current Item is nested inside another Item - i.e. same window drilldown)
		var p = win;
		while (p=p.parent)
		{
			if (p!=win && p.addHandle && p.g_isItem==null) { p.addHandle(o,win,true); return true; }
			if (p==win.top) { return false; } // Already reached the top, stop looking
		}
		return false; // 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
	if (typeof(win.DIF_mainHandlersAdded)=="undefined" || !win.DIF_mainHandlersAdded)
	{
		// This is done in a funky way to make Netscape happy
		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("function OnMouseMoveHandler(evt) { if(typeof(evt)=='undefined'){evt=event;}"+topRefStr+".parent.DIF_iframemove(evt, "+topRefStr+") }");
			eval("document.onmousemove = OnMouseMoveHandler;");

			win.DIF_handlersAdded = true;
			win.DIF_mainHandlersAdded = true;
		}
	}

	// Add handler to this window
	if (typeof(window.DIF_handlersAdded)!="undefined" || !window.DIF_handlersAdded)
	{
		eval("function OnMouseMoveHandler(evt) { if(typeof(evt)=='undefined'){evt=event;}DIF_mouseMove(evt, window) }");
		eval("document.onmousemove = OnMouseMoveHandler;");
		window.DIF_handlersAdded=true;
	}
	o.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_handles[name][DIF_handles[name].length] = o;

	return false;
}


// 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 o = iframes.item(i);
		var w = null;
		if (o.contentWindow)
		{
			// For IE5.5 and IE6
			w = o.contentWindow;
		}
		else if (window.frames && window.frames[o.id].window)
		{
			w = window.frames[o.id];
		}
		if (w == win)
		{
			DIF_iframeWindows[o.id] = win;
			DIF_iframeObjects[o.id] = o;
			return o.id; 
		}
	}
	return null;
}


// Gets the page x, y coordinates of the iframe (or any object)
function DIF_getObjectXY(o)
{
	var res = new Object();
	res.x=0; res.y=0;
	if (o != null) {
		res.x = o.style.left.substring(0,o.style.left.indexOf("px"));
		res.y = o.style.top.substring(0,o.style.top.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)
{
	if (DIF_debugging)
	{
		DIF_debug();
		DIF_debug("DIF_begindrag:");
		DIF_debug("DIF_dragging="+DIF_dragging);
		DIF_debug("e.button="+e.button);
		DIF_debug("e.clientX="+e.clientX + "\t e.clientY="+e.clientY);
		DIF_debug("e.offsetX="+e.offsetX + "\t e.offsetY="+e.offsetY);
		DIF_debug("e.pageX="+e.pageX + "\t e.pageY="+e.pageY);
		DIF_debug("e.screenX="+e.screenX + "\t e.screenY="+e.screenY);
		DIF_debug("e.x="+e.x + "\t\t e.y="+e.y);
	}

	// only allow left mouse button to drag
	if (e.button && e.button!=1)
	{
		return;
	}
	
	// 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;

	//HIDE CONTENTS WHILE DRAGGING
	var co = DIF_iframeWindows[DIF_iframeBeingDragged];
	co.setDragging(true);
	if (this.setIsDraggingItems!=null) setIsDraggingItems(true);
	
	// Store state at beginning of drag to allow dragging position to be worked out
	var o = DIF_getObjectXY(DIF_iframeObjects[DIF_iframeBeingDragged]);
	DIF_beginDragScreenX=Number(e.screenX);
	DIF_beginDragScreenY=Number(e.screenY);
	DIF_beginDragObjectX=Number(o.x);
	DIF_beginDragObjectY=Number(o.y);
	DIF_beginDragScrollLeft=Number(window.document.body.scrollLeft);
	DIF_beginDragscrollTop=Number(window.document.body.scrollTop);
	if (DIF_debugging)
	{
		DIF_debug("beginDragScreenX="+DIF_beginDragScreenX + "\t beginDragScreenY="+DIF_beginDragScreenY);
		DIF_debug("beginDragObjectX="+DIF_beginDragObjectX + "\t beginDragObjectY="+DIF_beginDragObjectY);
	}
}


// Called when mouse button is released after dragging an iframe
function DIF_enddrag(e)
{
	if (DIF_debugging)
	{
		DIF_debug();
		DIF_debug("DIF_enddrag:");
		DIF_debug("DIF_dragging="+DIF_dragging);
		DIF_debug("e.clientX="+e.clientX + "\t e.clientY="+e.clientY);
		DIF_debug("e.offsetX="+e.offsetX + "\t e.offsetY="+e.offsetY);
		DIF_debug("e.pageX="+e.pageX + "\t e.pageY="+e.pageY);
		DIF_debug("e.screenX="+e.screenX + "\t e.screenY="+e.screenY);
		DIF_debug("e.x="+e.x + "\t\t e.y="+e.y);
	}

	if (null==DIF_iframeObjects[DIF_iframeBeingDragged]) return;

	var o = DIF_getObjectXY(DIF_iframeObjects[DIF_iframeBeingDragged]);

	//dynistics start
	// snap to grid X
	if (DIF_gridX!=0)
	{
		var positionX = o.x;
		if (positionX % DIF_gridX !=0)
		{
			var newPositionX = parseInt(positionX/DIF_gridX) * DIF_gridX;
			if (positionX - newPositionX > (DIF_gridX/2))
			{
				newPositionX += DIF_gridX;
			}
			if (null!=DIF_iframeObjects[DIF_iframeBeingDragged])
			{
				DIF_iframeObjects[DIF_iframeBeingDragged].style.left = newPositionX + "px";
			}
		}
	}
	// snap to grid Y
	if (DIF_gridY!=0)
	{
		var positionY = o.y;
		if (positionY % DIF_gridY !=0)
		{
			var newPositionY = parseInt(positionY/DIF_gridY) * DIF_gridY;
			if (positionY - newPositionY > (DIF_gridY/2))
			{
				newPositionY += DIF_gridY;
			}
			if (null!=DIF_iframeObjects[DIF_iframeBeingDragged])
			{
				DIF_iframeObjects[DIF_iframeBeingDragged].style.top  = newPositionY + "px";
			}
		}
	}

	// swap position of any item currently at position dragged item has been moved to
	var dragItem=DIF_iframeObjects[DIF_iframeBeingDragged];
	for (var prop in DIF_iframeObjects)
	{
		var item = DIF_iframeObjects[prop];
		if (item==dragItem) {continue}; //skip item being dragged
		
		if (item.style.left==dragItem.style.left && item.style.top==dragItem.style.top) //items in same position?
		{
			if (dragItem.origleft!=null && dragItem.origtop!=null)
			{
				//alert('swap ' + prop);
				// move item in same position
				item.style.left=dragItem.origleft;
				item.style.top=dragItem.origtop;
				item.origleft=item.style.left;
				item.origtop=item.style.top;
			}
		}
	}

	// store new original position of moved item for next time
	dragItem.origleft = dragItem.style.left
	dragItem.origtop = dragItem.style.top
	//dynistics end

	//SHOW CONTENTS AFTER DRAGGING
	var co = DIF_iframeWindows[DIF_iframeBeingDragged];
	co.setDragging(false);
	if (this.setIsDraggingItems!=null) setIsDraggingItems(false);

	DIF_dragging=false;
	DIF_iframeBeingDragged="";
	
	// Call function in document to check for blank rows
	if (typeof checkGrid !="undefined") checkGrid();
}


// Called when mouse moves in the main window
function DIF_mouseMove(e)
{
	if (DIF_debugging)
	{
		DIF_debug();
		DIF_debug("DIF_mouseMove:");
		DIF_debug("DIF_iframeBeingDragged="+DIF_iframeBeingDragged);
		DIF_debug("DIF_dragging="+DIF_dragging);
		DIF_debug("e.clientX="+e.clientX + "\t e.clientY="+e.clientY);
		DIF_debug("e.offsetX="+e.offsetX + "\t e.offsetY="+e.offsetY);
		DIF_debug("e.pageX="+e.pageX + "\t e.pageY="+e.pageY);
		DIF_debug("e.screenX="+e.screenX + "\t e.screenY="+e.screenY);
		DIF_debug("e.x="+e.x + "\t\t e.y="+e.y);
	}
	
	if (DIF_dragging)
	{
		DIF_drag(e);
	}
}


// Called when mouse moves in the IFRAME window
function DIF_iframemove(e)
{
	if (DIF_debugging)
	{
		DIF_debug();
		DIF_debug("DIF_iframemove:");
		DIF_debug("DIF_iframeBeingDragged="+DIF_iframeBeingDragged);
		DIF_debug("DIF_dragging="+DIF_dragging);
		DIF_debug("e.clientX="+e.clientX + "\t e.clientY="+e.clientY);
		DIF_debug("e.offsetX="+e.offsetX + "\t e.offsetY="+e.offsetY);
		DIF_debug("e.pageX="+e.pageX + "\t e.pageY="+e.pageY);
		DIF_debug("e.screenX="+e.screenX + "\t e.screenY="+e.screenY);
		DIF_debug("e.x="+e.x + "\t\t e.y="+e.y);
	}

	if (DIF_dragging)
	{
		DIF_drag(e);
	}
}



// Function which actually moves of the iframe object on the screen
function DIF_drag(e)
{
	var newX = DIF_beginDragObjectX + e.screenX - DIF_beginDragScreenX;
	var newY = DIF_beginDragObjectY + e.screenY - DIF_beginDragScreenY;

	newX += window.document.body.scrollLeft - DIF_beginDragScrollLeft;
	newY += window.document.body.scrollTop - DIF_beginDragscrollTop;

	if (DIF_debugging)
	{
		DIF_debug();
		DIF_debug("DIF_drag:");
		DIF_debug("DIF_iframeBeingDragged="+DIF_iframeBeingDragged);
		DIF_debug("DIF_dragging="+DIF_dragging);
		DIF_debug("beginDragScreenX="+DIF_beginDragScreenX + "\t beginDragScreenY="+DIF_beginDragScreenY);
		DIF_debug("beginDragObjectX="+DIF_beginDragObjectX + "\t beginDragObjectY="+DIF_beginDragObjectY);
		DIF_debug("beginDragScrollLeft="+DIF_beginDragScrollLeft + "\t beginDragscrollTop="+DIF_beginDragscrollTop);
		DIF_debug("e.screenX="+e.screenX + "\t e.screenY="+e.screenY);
		DIF_debug("newX="+newX + "\t newY="+newY);
	}

	if (!DIF_allowDragOffScreen)
	{
		if (newX < 0) { newX=0; }
		if (newY < 0) { newY=0; }

		if (DIF_winSizeX > 0 && newX > DIF_winSizeX-DIF_gridX)
			{ newX=DIF_winSizeX-DIF_gridX; }

		if (DIF_winSizeY > 0 && newY > DIF_winSizeY-DIF_gridY)
			{ newY=DIF_winSizeY-DIF_gridY; }
	}

	// Set position of iframe
	var ifo=DIF_iframeObjects[DIF_iframeBeingDragged];
	ifo.style.left=newX+"px";
	ifo.style.top=newY+"px";
}
