﻿var PageRequestManagerEx =
{
    _initialized: false,

    init: function () {
        if (!PageRequestManagerEx._initialized) {
            var _prm = Sys.WebForms.PageRequestManager.getInstance();
            var _callQueue = new Array();
            var _executingElement = null;

            _prm = Sys.WebForms.PageRequestManager.getInstance();

            _prm.add_initializeRequest(initializeRequest);
            _prm.add_endRequest(endRequest);

            PageRequestManagerEx._initialized = true;

//            $(function () {
//                var oldPostBack;
//                var submitting = false;
//                oldPostBack = __doPostBack;
//                __doPostBack = overridePostBack;

//                function overridePostBack(eventTarget, eventArgument) {
//                    alert("target: " + eventTarget + "    arg:" + eventArgument);
//                    if (submitting) {
//                        alert('One request is already in progress.');
//                    }
//                    else {
//                        submitting = true;
//                        oldPostBack(eventTarget, eventArgument);
//                    }
//                }
//            });
        }

        function initializeRequest(sender, args) {

            if (_prm.get_isInAsyncPostBack()) {
                //if we are here that means there already a call pending.

                //Get the element which cause the postback
                var postBackElement = args.get_postBackElement();

                //We need to check this otherwise it will abort the request which we made from the
                //end request
                if (_executingElement != postBackElement) {
                    // Grab the event argument value
                    var evArg = $get("__EVENTARGUMENT").value;

                    //Does not match which means it is another control
                    //which request the update, so cancel it temporary and
                    //add it in the call queue
                    args.set_cancel(true);
                    Debug('initializeRequest(add to queue): ' + postBackElement.id + ' - ' + evArg);
                    Array.enqueue(_callQueue, new Array(postBackElement.id, evArg));
                }

                //Reset it as we are done with our matching
                _executingElement = null;
            }
        }

        function endRequest(sender, args) {

            //Check if we have a pending call
            if (_callQueue.length > 0) {
                //Get the first item from the call queue and setting it
                //as current executing item
                _executingElement = Array.dequeue(_callQueue);

                var _element = _executingElement[0];
                var _eventArg = _executingElement[1];

                // Update for asp.net 4.0. Need to add the ID of the master page to the element id.
                var target = "M$" + _element.replace(/_/g, '$');
                //Now Post the from which will also fire the initializeRequest
                _prm._doPostBack(target, _eventArg);
            }
        }
    }
}

if (typeof (Sys) != 'undefined') {
    Sys.Application.notifyScriptLoaded();
}
