
// (Only called from within this file)
function updatePositionOfBackgroundMask(elementId)
{
	var el = document.getElementById(elementId);
	
	if (el != null)
	{
		var elementToCover;
		
		if (el.elementToCoverId && el.elementToCoverId != "")
			elementToCover = document.getElementById(el.elementToCoverId);
		else
			elementToCover = null;
		
		var originPos = findCoordinateOriginForObject(el);
		
		if (elementToCover == null)
		{
			// Cover the whole viewport
			var viewPortOffset = findViewPortOffset();
			var viewPortSize = findViewPortSize();
			
			var width = viewPortOffset[0] + viewPortSize[0];
			var height = viewPortOffset[1] + viewPortSize[1];
			
			if (document.body.offsetWidth > width)
				width = document.body.offsetWidth;
			
			if (document.body.offsetHeight > height)
				height = document.body.offsetHeight;
			

			el.style.left = (originPos[0]) + 'px';
			el.style.top = (originPos[1]) + 'px';
			
			el.style.width = width + "px";
			el.style.height = height + "px";
		}
		else
		{
			// We have an element that our background mask should map to exactly
			var elementToCoverOriginPos = findCoordinateOriginForObject(elementToCover);
			
			el.style.left = (originPos[0] - elementToCoverOriginPos[0] + elementToCover.offsetLeft) + 'px';
			el.style.top = (originPos[1] - elementToCoverOriginPos[1] + elementToCover.offsetTop) + 'px';
			
			el.style.width = elementToCover.offsetWidth + "px";
			el.style.height = elementToCover.offsetHeight + "px";
		}
	}
}

// (Only called from within this file)
function updatePositionsOfAllBackgroundMasks()
{
	if (!document.body.backgroundMasks)
		return null;
	
	var elementIds = document.body.backgroundMasks.split(",");
	
	var i;
	for (i = 0; i < elementIds.length; i++)
		if (elementIds[i].length > 0)
			updatePositionOfBackgroundMask(elementIds[i].substring(1, elementIds[i].length - 1));
}

// (Only called from BasePopupDiv)
function alwaysUpdatePositionOfBackgroundMask(elementId, elementToCoverId)
{
	var el = document.getElementById(elementId);
	
	if (el != null)
		el.elementToCoverId = elementToCoverId;
	
	updatePositionOfBackgroundMask(elementId);
	
	if (!document.body.backgroundMasks)
		document.body.backgroundMasks = "";
	
	if (document.body.backgroundMasks.indexOf("[" + elementId + "]") == -1)
		document.body.backgroundMasks = document.body.backgroundMasks + "[" + elementId + "]" + ",";
	
	window.onresize = updatePositionsOfAllBackgroundMasks;
	
	if (document.body.pollingScrollingForBackgroundMasks != "Y")
	{
		document.body.pollingScrollingForBackgroundMasks = "Y";
		setTimeout("pollScrollingForBackgroundMasks()", 300);
	}
}

// (Only called from alwaysUpdatePositionOfBackgroundMask())
function pollScrollingForBackgroundMasks()
{
	updatePositionsOfAllBackgroundMasks();
	setTimeout("pollScrollingForBackgroundMasks()", 300);
}

// (Called from BasePopupDiv and NBR-type buttons)
function triggerPopup(triggerControlId, loadingDivId, backgroundMaskId, hiddenControlToAppearNearId, hiddenIsOpenControlId, hiddenPositionControlId, position, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin)
{
	var loadingDiv = document.getElementById(loadingDivId);
	var backgroundMask = document.getElementById(backgroundMaskId);
	var hiddenControlToAppearNear = document.getElementById(hiddenControlToAppearNearId);
	var hiddenIsOpenControl;
	var hiddenPositionControl;
	
	if (hiddenIsOpenControlId != "")
		hiddenIsOpenControl = document.getElementById(hiddenIsOpenControlId);
	else
		hiddenIsOpenControl = null;
	
	if (hiddenPositionControlId != "")
		hiddenPositionControl = document.getElementById(hiddenPositionControlId);
	else
		hiddenPositionControl = null;
	
	loadingDiv.style.display = 'block';
	loadingDiv.triggerControlId = triggerControlId;
	
	backgroundMask.style.display = 'block';
	backgroundMask.onclick = doNotBubble;
	updatePositionOfBackgroundMask(backgroundMaskId);
	
	hiddenControlToAppearNear.value = triggerControlId;
	if (hiddenIsOpenControl != null)
		hiddenIsOpenControl.value = "Y";
	if (hiddenPositionControl != null)
	    hiddenPositionControl.value = position;
	
	positionPopup(loadingDivId, triggerControlId, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin);
}

function positionPopup(popupDivId, triggerControlId, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin)
{
	var popupDiv = document.getElementById(popupDivId);
	var triggerControl = document.getElementById(triggerControlId);
	
	positionElement(popupDiv, triggerControl, 4, 0, 0, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin);
}

// (Only called from BasePopupDiv)
function centrePopup(popupDivId, elementToCentreOnId, minHorizontalMargin, minVerticalMargin)
{
	var popupDiv = document.getElementById(popupDivId);
	var elementToCentreOn;
	
	if (elementToCentreOnId && elementToCentreOnId != "")
		elementToCentreOn = document.getElementById(elementToCentreOnId);
	else
		elementToCentreOn = null;
	
	var popupOriginPos = findCoordinateOriginForObject(popupDiv);
	var left;
	var top;
	
	if (elementToCentreOn == null)
	{
		// We have no element to centre on, so centre in the viewport
		var viewPortSize = findViewPortSize();
		var viewPortOffset = findViewPortOffset();
		
		left = (viewPortOffset[0] + viewPortSize[0] - popupDiv.offsetWidth) / 2;
		top = (viewPortOffset[1] + viewPortSize[1] - popupDiv.offsetHeight) / 2;
		
		if (left < minHorizontalMargin)
			left = minHorizontalMargin;
		
		if (top < minVerticalMargin)
			top = minVerticalMargin;
	}
	else
	{
		// We have an element to centre on
		var elementToCentreOnOriginPos = findCoordinateOriginForObject(elementToCentreOn);
		
		left = (elementToCentreOn.offsetWidth - popupDiv.offsetWidth) / 2;
		top = (elementToCentreOn.offsetHeight - popupDiv.offsetHeight) / 2;

		if (left < minHorizontalMargin)
			left = minHorizontalMargin;
		
		if (top < minVerticalMargin)
			top = minVerticalMargin;
		
		left += elementToCentreOnOriginPos[0] + elementToCentreOn.offsetLeft;
		top += elementToCentreOnOriginPos[1] + elementToCentreOn.offsetTop;
	}
	
	popupDiv.style.left = (popupOriginPos[0] + left) + 'px';
	popupDiv.style.top = (popupOriginPos[1] + top) + 'px';
}

// (Only called from BasePopupDiv)
function centrePopupAtTop(popupDivId, elementToCentreOnId, minHorizontalMargin, minVerticalMargin)
{
	var popupDiv = document.getElementById(popupDivId);
	var elementToCentreOn;
	
	if (elementToCentreOnId && elementToCentreOnId != "")
		elementToCentreOn = document.getElementById(elementToCentreOnId);
	else
		elementToCentreOn = null;
	
	var popupOriginPos = findCoordinateOriginForObject(popupDiv);
	var left;
	var top;
	
	if (elementToCentreOn == null)
	{
		// We have no element to centre on, so centre in the viewport
		var viewPortSize = findViewPortSize();
		var viewPortOffset = findViewPortOffset();
		
		left = (viewPortOffset[0] + viewPortSize[0] - popupDiv.offsetWidth) / 2;
		top = 0;
		
		if (left < minHorizontalMargin)
			left = minHorizontalMargin;
		
		if (top < minVerticalMargin)
			top = minVerticalMargin;
	}
	else
	{
		// We have an element to centre on
		var elementToCentreOnOriginPos = findCoordinateOriginForObject(elementToCentreOn);
		
		left = (elementToCentreOn.offsetWidth - popupDiv.offsetWidth) / 2;
		top = 0;

		if (left < minHorizontalMargin)
			left = minHorizontalMargin;
		
		if (top < minVerticalMargin)
			top = minVerticalMargin;
		
		left += elementToCentreOnOriginPos[0] + elementToCentreOn.offsetLeft;
		top += elementToCentreOnOriginPos[1] + elementToCentreOn.offsetTop;
	}
	
	popupDiv.style.left = (popupOriginPos[0] + left) + 'px';
	popupDiv.style.top = (popupOriginPos[1] + top) + 'px';
}

function closePopup(popupDivId, backgroundMaskId, hiddenIsOpenId)
{
	var popupDiv = document.getElementById(popupDivId);
	var backgroundMask = document.getElementById(backgroundMaskId);
	var hiddenIsOpen = document.getElementById(hiddenIsOpenId);
	
	popupDiv.style.display = "none";
	backgroundMask.style.display = "none";
	hiddenIsOpen.value = "N";
}
