function makeFormClickHideCommonPopups()
{
    $('body').click(function()
    {
        hideCommonPopups();
    });
}

function hideCommonPopups()
{
    hideErrorPopups();
    hidePopupMenu();
}

function positionElement(elementToPosition, elementToPutNear, anchorToCorner, insideX, insideY, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin)
{
    // anchorToCorner: 1=top-left; 2=top-right; 3=bottom-right; 4=bottom-left
    // insideX,Y: 1 to overlap with the element; 0 to keep it outside
    elementToPosition.positioningElementToPutNear = elementToPutNear;
    elementToPosition.positioningAnchorToCorner = anchorToCorner;
    elementToPosition.positioningInsideX = insideX;
    elementToPosition.positioningInsideY = insideY;
    elementToPosition.positioningFavouredXOffset = favouredXOffset;
    elementToPosition.positioningFavouredYOffset = favouredYOffset;
    elementToPosition.positioningMinHorizontalMargin = minHorizontalMargin;
    elementToPosition.positioningMinVerticalMargin = minVerticalMargin;

    repositionElement(elementToPosition);
}

function repositionElement(elementToPosition)
{
    if (elementToPosition == null)
        return;

    var elementToPutNear = elementToPosition.positioningElementToPutNear;
    var anchorToCorner = elementToPosition.positioningAnchorToCorner;
    var insideX = elementToPosition.positioningInsideX;
    var insideY = elementToPosition.positioningInsideY;
    var favouredXOffset = elementToPosition.positioningFavouredXOffset;
    var favouredYOffset = elementToPosition.positioningFavouredYOffset;
    var minHorizontalMargin = elementToPosition.positioningMinHorizontalMargin;
    var minVerticalMargin = elementToPosition.positioningMinVerticalMargin;

    if (elementToPutNear == null || anchorToCorner == null || insideX == null || insideY == null || favouredXOffset == null || favouredYOffset == null || minHorizontalMargin == null || minVerticalMargin == null)
        return;

    var item = $(elementToPosition);
    var target = $(elementToPutNear);

    if (item.css('display') == 'none')
        return;

    var itemWidth = elementToPosition.offsetWidth;
    var itemHeight = elementToPosition.offsetHeight;

    var left = target.offset().left + favouredXOffset;
    var top = target.offset().top + favouredYOffset;

    // On the left
    if (anchorToCorner == 1 || anchorToCorner == 4)
    {
        if (insideX == 0)
            left -= itemWidth;
    }

    // On the right
    if (anchorToCorner == 2 || anchorToCorner == 3)
    {
        left += elementToPutNear.offsetWidth;
        if (insideX == 1)
            left -= itemWidth;
    }

    // At the top
    if (anchorToCorner == 1 || anchorToCorner == 2)
    {
        if (insideY == 0)
            top -= itemHeight;
    }

    // At the bottom
    if (anchorToCorner == 3 || anchorToCorner == 4)
    {
        top += elementToPutNear.offsetHeight;
        if (insideY == 1)
            top -= itemHeight;
    }

    var viewPortSize = findViewPortSize();
    var viewPortOffset = findViewPortOffset();

    if (left + itemWidth > viewPortOffset[0] + viewPortSize[0] - minHorizontalMargin)
        left = viewPortOffset[0] + viewPortSize[0] - minHorizontalMargin - itemWidth;

    if (top + itemHeight > viewPortOffset[1] + viewPortSize[1] - minVerticalMargin)
        top = viewPortOffset[1] + viewPortSize[1] - minVerticalMargin - itemHeight;

    if (left < viewPortOffset[0] + minHorizontalMargin)
        left = viewPortOffset[0] + minHorizontalMargin;

    if (top < viewPortOffset[1] + minVerticalMargin)
        top = viewPortOffset[1] + minVerticalMargin;

    positionElementAbsolutely(elementToPosition, left, top);
}

function positionElementAbsolutely(elementToPosition, x, y)
{
    var item = $(elementToPosition);
    var itemLeft = item.css('left');

    if (itemLeft.substr(itemLeft.length - 2, 2) != 'px')
        item.css('left', '0px');

    itemLeft = item.css('left').replace('px', '');
    item.css('position', 'absolute');
    item.css('left', (x - item.offset().left + parseInt(itemLeft)) + 'px');

    var itemTop = item.css('top');

    if (itemTop.substr(itemTop.length - 2, 2) != 'px')
        item.css('top', '0px');

    itemTop = item.css('top').replace('px', '');
    item.css('position', 'absolute');
    item.css('top', (y - item.offset().top + parseInt(itemTop)) + 'px');
}

function storeElementPosition(elementToPosition, hidCoordinates)
{
    hidCoordinates.value = $(elementToPosition).css('left') + ',' + $(elementToPosition).css('top');
}

function repositionElementExactlyAsBefore(elementToPosition, hidCoordinates)
{
    var coords = hidCoordinates.value.split(',');
    $(elementToPosition).css('left', coords[0]);
    $(elementToPosition).css('top', coords[1]);
}

function continuallyPositionElement(elementToPosition, elementToPutNear, anchorToCorner, insideX, insideY, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin)
{
    if (elementToPosition == null || elementToPutNear == null)
    {
        // Can't find the elements; stop trying
        return;
    }
    // Position the element
    elementToPosition.positioningContinually = 'Y';
    positionElement(elementToPosition, elementToPutNear, anchorToCorner, insideX, insideY, favouredXOffset, favouredYOffset, minHorizontalMargin, minVerticalMargin);

    // Reposition once really quickly (in case it's inside an appearing
    // popup, for example); subsequent repositionings are less frequent
    setTimeout("repositionElement(document.getElementById('" + elementToPosition.id + "'))", 10);
}

function continuallyRepositionElements()
{
    $('[positioningContinually]').reposition();
    setTimeout("continuallyRepositionElements()", 300);
}

function clickLinkInRow(row)
{
    clickLinkInElement(row);
}

function clickLinkInCell(cell)
{
    clickLinkInElement(cell);
}

function clickLinkInElement(element)
{
    var linkElements = element.getElementsByTagName("a");

    if (linkElements.length > 0)
        clickElement(linkElements[0]);
}

function clickElement(element)
{
    if (element.click)
    {
        element.click();
        return true;
    }
    else if (element.dispatchEvent)
    {
        window.location = element.href;
        return true;
    }
    else
    {
        return false;
    }
}

function openWindow(pageName, width, height)
{
    var top;
    var left;

    top = (window.screen.height / 2) - (height / 2);
    left = (window.screen.width / 2) - (width / 2);

    var popup_window = window.open(pageName, 'popup_window', 'top=' + top + ',left=' + left + ',width=' + width + ',height=' + height + ',title=no,status=no,resizable=no,scrollbars=yes,menubar=no');
    popup_window.focus();
}

function jumpOpenerToBookmark(bookmark)
{
    var url = window.opener.location.href;
    var hashPos = url.indexOf('#');

    if (hashPos > -1)
        url = url.substr(0, hashPos);

    window.opener.location.href = url + "#" + bookmark;
}

function disableAllInputsInTable(table, disable)
{
    for (var i = 0; i < table.childNodes.length; ++i)
    {
        if (table.childNodes[i].nodeName == "TR")
        {
            disableAllInputsInRow(table.childNodes[i], disable);
        }
        else if (table.childNodes[i].nodeName == "TBODY")
            disableAllInputsInTable(table.childNodes[i], disable)
    }
}

function disableAllInputsInRow(row, disable)
{
    for (var i = 0; i < row.childNodes.length; ++i)
    {
        if (row.childNodes[i].nodeName == "TD")
        {
            disableAllInputsInCell(row.childNodes[i], disable);
        }
    }
}

function disableAllInputsInCell(cell, disable)
{
    for (var i = 0; i < cell.childNodes.length; ++i)
    {
        if (cell.childNodes[i].nodeName == "INPUT")
        {
            cell.childNodes[i].disabled = disable;
        }
    }
}

function setAllCheckBoxes(containerElementId, checked)
{
    var containerElement = document.getElementById(containerElementId);
    var inputs = containerElement.getElementsByTagName("input");

    for (i = 0; i < inputs.length; i++)
        if (inputs[i].type == "checkbox")
        inputs[i].checked = checked;
}

function doNotBubble(objEvent)
{
    if (!objEvent)
        objEvent = window.event;

    if (objEvent.stopPropagation)
        objEvent.stopPropagation();
    else
        objEvent.cancelBubble = true;
}

// Returns the coordinates of the top left of the viewport, as should be used for the
// absolute positioning of this object.
function findCoordinateOriginForObject(obj)
{
    var left = 0;
    var top = 0;

    while (obj.offsetParent)
    {
        obj = obj.offsetParent;
        left -= obj.offsetLeft;
        top -= obj.offsetTop;
    }

    return [left, top];
}

function findViewPortSize()
{
    // Thanks to andylangton.co.uk for this bit...
    var viewPortWidth;
    var viewPortHeight;

    // the more standards compliant browsers (mozilla/netscape/opera/IE7) use window.innerWidth and window.innerHeight
    if (typeof window.innerWidth != 'undefined')
    {
        viewPortWidth = window.innerWidth,
		viewPortHeight = window.innerHeight
    }
    // IE6 in standards compliant mode (i.e. with a valid doctype as the first line in the document)
    else if (typeof document.documentElement != 'undefined' && typeof document.documentElement.clientWidth != 'undefined' && document.documentElement.clientWidth != 0)
    {
        viewPortWidth = document.documentElement.clientWidth,
		viewPortHeight = document.documentElement.clientHeight
    }
    // older versions of IE
    else
    {
        viewPortWidth = document.getElementsByTagName('body')[0].clientWidth,
		viewPortHeight = document.getElementsByTagName('body')[0].clientHeight
    }
    // ... end of thanks. kthxbye

    return [viewPortWidth, viewPortHeight];
}

function findViewPortOffset()
{
    var viewPortLeft;
    var viewPortTop;

    // Thanks to http://ptaff.ca/xhtml/?lang=en_CA for this bit...
    if (window.innerHeight)
    {
        viewPortLeft = window.pageXOffset;
        viewPortTop = window.pageYOffset;
    }
    else if (document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollTop == 0))
    {
        viewPortLeft = document.documentElement.scrollLeft;
        viewPortTop = document.documentElement.scrollTop;
    }
    else if (document.body)
    {
        viewPortLeft = document.body.scrollLeft;
        viewPortTop = document.body.scrollTop;
    }
    // ... end of thanks. kthxbye
    return [viewPortLeft, viewPortTop];
}

function selectAllText(textbox)
{
    textbox.focus();
    textbox.select();
}

function clearHtmlTagsFromElement(elementId)
{
    document.getElementById(elementId).value = '';
}

// Sets the style of the selects on the page. Use for IE 6 drop downs showing through popups.
function SetDropDownStyle(style)
{
    var dropdowns = document.getElementsByTagName("select");
    for (var d = 0; d < dropdowns.length; d++)
    {
        dropdowns[d].style.display = style;
    }
}

function setRangePickerVisibility(ddlRangeType, singleId, rangeId, tryToKeepOnOneLine)
{
    var single = document.getElementById(singleId);
    var range = document.getElementById(rangeId);

    switch (ddlRangeType.value)
    {
        case "1":
            single.style.display = "none";
            range.style.display = "none";
            break;

        case "5":
            single.style.display = "none";
            if (tryToKeepOnOneLine == 1)
                range.style.display = "";
            else
                range.style.display = "block";
            break;

        default:
            single.style.display = "";
            range.style.display = "none";
            break;
    }
}

function showWaitIcon(sender, args)
{
    if (args != null && args.get_postBackElement() != null)
    {
        var button = args.get_postBackElement();
        
        if ((' ' + $(button).attr('class') + ' ').match(' iconButton ') != null)
            $(button)
                .addClass('waitIcon')
                .attr('href', 'javascript: void(0);');
    }
}
