

var CMN_debug = false;
/*--------------------------------------------------------------------------------
* Function name    : CMN_setDivLocation
*	
*	This function will position a div on the screen relative to a given element.
*
*   Arguments:	
*
*	relativePositionElement - This is the element is used to get the position where 
*							  the div should be placed.
*
*	divToPosition - The div which will be positioned.
*
*-------------------------------------------------------------------------------*/
function CMN_setDivLocation(relativePositionElement, divToPosition, offsetY, offsetX)
{
	var totalX = 0;
	var totalY = 0;
	var currentElement = relativePositionElement;
	var lastElement = currentElement;
	CMN_outerPopupOffsetX = 0;
	CMN_outerPopupOffsetY = 0;
	var climbedOut = false;
	var internalTotalX = 0;
	var internalTotalY = 0;
	var debugOLIncluded;
	var debugOTIncluded;
	
	// by default, position the div below the element
	if (offsetY === undefined)
		offsetY = currentElement.offsetHeight + 2;

	// by default, position the div below the element
	if (offsetX === undefined)
		offsetX = 0;
	
	notDone = true;
	
	while (notDone)
	{
		if (currentElement == null)
		{
			if (!climbedOut)
			{
				internalTotalX = totalX;
				internalTotalY = totalY;
			}
			climbedOut = true;
			
			currentElement = lastElement.document.parentWindow.frameElement;
		
			if (CMN_debug)
				alert("Climbed out of frame." + (currentElement == null ? "" : "\nFrame id: " + currentElement.id));
			
			if (currentElement == null)
			{
				notDone = false;
				break;
			}
		}
		
		if (currentElement.parentElement == divToPosition.parentElement)
			notDone = false;
			
		// certain elements "repeat" the information of elements within them - e.g.
		// for a BUTTON element with a SPAN around it, both elements would have an offsetLeft
		// of 19 pixels
		debugOLIncluded = false;
		debugOTIncluded = false;
		if (currentElement.tagName != "TBODY" &&
			currentElement.tagName != "SPAN" &&
			currentElement.tagName != "DIV" &&
			currentElement.tagName != "FORM")
		{
			if (currentElement.tagName != "TR")
			{
				totalX += currentElement.offsetLeft;
				debugOLIncluded = true;
			}
			if (currentElement.tagName != "TD")
			{
				totalY += currentElement.offsetTop;
				debugOTIncluded = true;
			}
		}
		
		if (CMN_debug)
		{
			currentElement.style.backgroundColor = "red";
			alert(currentElement.tagName + ": " + currentElement.id + "\n" +
				"offsetLeft: " + currentElement.offsetLeft + (debugOLIncluded == false ? " (ignored)" : "") + "\n" +
				"offsetTop: " + currentElement.offsetTop + (debugOTIncluded == false ? " (ignored)" : "") + "\n" +
				"same level: " + (currentElement.parentElement == divToPosition.parentElement));
		}
		
		lastElement = currentElement;
		currentElement = currentElement.parentElement;
	}
	
	if (climbedOut)
	{
		divToPosition.CMN_outerPopupOffsetX = totalX - internalTotalX;
		divToPosition.CMN_outerPopupOffsetY = totalY - internalTotalY;
	}
	
	divToPosition.style.left = totalX;
	divToPosition.style.top = totalY;
	
	if (offsetY)
	{
		divToPosition.style.top = divToPosition.style.pixelTop + offsetY;
		divToPosition.CMN_outerPopupOffsetY += offsetY;
	}
	if (offsetX)
	{
		divToPosition.style.left = divToPosition.style.pixelLeft + offsetX;
		divToPosition.CMN_outerPopupOffsetX += offsetX;
	}

	if (CMN_debug)
		alert("divToPosition.style.left: " + divToPosition.style.left + "\n" +
			"divToPosition.style.top: " + divToPosition.style.top);
}
