
// (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 NBR-type buttons)
function triggerPopup(triggerControlId, loadingDivId, backgroundMaskId, hiddenControlToAppearNearId, position, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin)
{
    var loadingDiv = document.getElementById(loadingDivId);
    var backgroundMask = document.getElementById(backgroundMaskId);
    var hiddenControlToAppearNear = document.getElementById(hiddenControlToAppearNearId);

    loadingDiv.style.display = 'block';
    loadingDiv.triggerControlId = triggerControlId;

    backgroundMask.style.display = 'block';
    backgroundMask.onclick = doNotBubble;
    updatePositionOfBackgroundMask(backgroundMaskId);

    hiddenControlToAppearNear.value = triggerControlId;

    positionElement(loadingDiv, triggerControl, 4, 1, 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(hiddenIsOpenId, closingAnimation)
{
    closingAnimation();

    $('#' + hiddenIsOpenId).val('N');
}
