/*
Uses blockUI to create a progressUpdate 
control to be used with the MS PageRequestManager
options
wait: ms to wait before displaying progress
updatePanelId: DOM Id of the update panel.  When this is set the indicator will only show if the postback originated from a child control of the update panel
otherwise progress is for all async requests
*/
(function($) {
    $.fn.createBlockUIProgressUpdate = function(options) {
        if (typeof Sys.WebForms.PageRequestManager == 'undefined') {
            alert('createBlockUIProgressUpdate requires a script manager on page');
            return;
        }
        var rootObj = this;
        var opts = $.extend({}, $.fn.createBlockUIProgressUpdate.defaults, options);
        var timerCookie = null;
        var postbackElementId = null;
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_beginRequest(beginPostback);
        prm.add_endRequest(endPostback);
        prm.add_initializeRequest(initRequest);

        function initRequest(sender, args) {
            postbackElementId = args.get_postBackElement().id;
        };
        function beginPostback(sender, args) {
            if (opts.updatePanelId && postbackElementId) {
                //--see if the element lives in the updatepanel
                var panel = $('#' + opts.updatePanelId).find('#' + postbackElementId);
                if (panel.length <= 0)
                    return;
            }
            if (!timerCookie)
                timerCookie = setTimeout(showProgress, opts.wait);
        };
        function endPostback(sender, args) {
            if (timerCookie) {
                clearTimeout(timerCookie);
                timerCookie = null;
            }
            else
                hideProgress();
        };
        function showProgress() {
            timerCookie = null;
            $.blockUI({ message: rootObj});
        };
        function hideProgress() {
            $.unblockUI();
            timerCookie = null;
        };
    };
    // private function for debugging
    function debug(line) {
        if (window.console && window.console.log)
            window.console.log(line);
    };
    $.fn.createBlockUIProgressUpdate.defaults = {
        wait: 0,
        updatePanelId: null /* id of associated update panel */
    };
})(jQuery);

/* 
Uses blockUI to display a modal error message when an async postback returns with an error 
options:
showDetailError: boolean indicating whether to show exception message or use non-specific error text
*/
(function($) {
    $.fn.createBlockUIErrorHandler = function(options) {
        if (typeof Sys.WebForms.PageRequestManager == 'undefined') {
            alert('createBlockUIProgressUpdate requires a script manager on page');
            return;
        }
        var opts = $.extend({}, $.fn.createBlockUIErrorHandler.defaults, options);
        var rootObj = this;

        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
        function(sender, args) {
            if (args.get_error() != undefined) {
                var errorMessage = "";

                if (!opts.showDetailError) {
                    if (args.get_error().name === 'Sys.WebForms.PageRequestManagerTimeoutException')
                        errorMessage = "The application is busy right now and can't respond.";
                    else
                        errorMessage = "Application has encountered an error.";
                }
                else {
                    if (args.get_error().name === 'Sys.WebForms.PageRequestManagerTimeoutException')
                        errorMessage = "The application is busy right now and can't respond.";
                    else if (args.get_response().get_statusCode() == '200') {
                        errorMessage = args.get_error().message;
                        if (errorMessage != '')
                            errorMessage = errorMessage.replace('Sys.WebForms.PageRequestManagerServerErrorException:', '');
                    }
                    else {
                        // Error occurred somewhere other than the server page.
                        errorMessage = 'An unspecified error occurred. ';
                    }
                }
                args.set_errorHandled(true);
                $("#blockui-error").html(errorMessage);
                $.blockUI({ message: rootObj });
            }
        }
    );
    };
    // private function for debugging
    function debug(line) {
        if (window.console && window.console.log)
            window.console.log(line);
    };
    $.fn.createBlockUIErrorHandler.defaults = {
        showDetailError: false /* display exception msg */
    };
})(jQuery);

