
var $j = jQuery;

//--- Popup Help ---

function observePopupHelp() {
    $j('.popupHelpContainer').map(function() {
        var $container = $(this);

        // Look for links
        $container.find('.popupHelpLink').not('.observed').addClass('observed').click(function(e) {
            e.preventDefault();
            if ($container.hasClass('showPopupHelp')) {
                // Remove this one
                $container.removeClass('showPopupHelp');
            } else {
                // Remove ALL shown popups
                $j('.popupHelpContainer.showPopupHelp').removeClass('showPopupHelp');
                // Show this one
                $container.addClass('showPopupHelp');
            }
        });

        // Wrap help text
        $container.find('.popupHelp')
            .wrapInner('<div class="helpbox2" />')
            .append('<div class="helpbox3" />')
            .prepend('<div class="helpbox1" />');

    });
}

//--- Load Indicators ---

function observeLoadIndicators() {
    // Listen for clicks
    $j('.loadIndicatorContainer').map(function() {
        var $container = $(this);
        $container.find('INPUT,A').not('.observed').addClass('observed').click(function(e) {
            // Bail out and cancel events if already showing indicator
            if ($container.hasClass('showLoadIndicator')) {
                e.preventDefault();
                return;
            }

            // If validationGroup hidden input exists, validate form before showing indicator
            var $validationGroupPlaceholders = $container.find('INPUT[name=validationGroup]');
            if ($validationGroupPlaceholders.length > 0) {
                var validationGroup = $validationGroupPlaceholders[0].value;
                if (!Page_ClientValidate(validationGroup)) {
                    return false;
                }
            }

            // Still here? Show indicator.
            $container.addClass('showLoadIndicator');
        });
    });
}

function removeLoadIndicators() {
    $j('.showLoadIndicator')
        .removeClass('showLoadIndicator');
}

//--- Dom Ready ---

$j(function() {
    observeLoadIndicators();
    observePopupHelp();
});

//--- Observe Async Requests ---

// An improvised way of checking of we're waiting for a request
var postRequestChain = new Array();
var runningRequests = 0;
function hasRunningRequests() {
    return runningRequests > 0;
}

// Run when async request starts
Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(function() {
    runningRequests++;
});

// Run after async request finishes
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function() {
    runningRequests--;
    if (runningRequests == 0) {
        // Execute and flush chained functions
        while (postRequestChain.length > 0) {
            var f = postRequestChain.pop();
            try {
                f();
            } catch (ex) { }
        }
        // Remove any active load indicators
        removeLoadIndicators();
        // Check for unobserved load containers
        observeLoadIndicators();
        // Check for unobserved help containers
        observePopupHelp();
    }
});

