﻿/// <reference name="MicrosoftAjax.js"/>
Type.registerNamespace("AsiaAustraliaTech");

/// <summary>
/// This class helps to manage the multiple update panels on one page.
/// Typically PageRequestManager blocks the postback of the second panel 
/// when the first panel is updating. This class unblocks this update.
///</summary>
AsiaAustraliaTech.UpdatePanelRequestManager = function() {
    AsiaAustraliaTech.UpdatePanelRequestManager.initializeBase(this);

    //fields
    this._PageRequestManager = null;
    this._PostBackQueue = new Array();
    this._ArgumentsQueue = new Array();
    this._onInitializeRequest$delegate = Function.createDelegate(this, this._onInitializeRequest);
    this._onEndRequest$delegate = Function.createDelegate(this, this._onEndRequest);
}

AsiaAustraliaTech.UpdatePanelRequestManager.prototype = {
    initialize: function() {
        AsiaAustraliaTech.UpdatePanelRequestManager.callBaseMethod(this, 'initialize');
        var prm = this._getPageRequestManager();
        if (prm) {
            prm.add_initializeRequest(this._onInitializeRequest$delegate);
            prm.add_endRequest(this._onEndRequest$delegate);
        }
    },

    dispose: function() {

        var prm = this._getPageRequestManager();
        if (prm) {
            prm.remove_initializeRequest(this._onInitializeRequest$delegate);
            prm.remove_endRequest(this._onEndRequest$delegate);
        }

        AsiaAustraliaTech.UpdatePanelRequestManager.callBaseMethod(this, 'dispose');
    },

    //private methods
    _getPageRequestManager: function() {
        if (!this._PageRequestManager) {
            this._PageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
        }
        return this._PageRequestManager;
    },

    _onInitializeRequest: function(sender, args) {
        var prm = this._getPageRequestManager();
        if (prm) {
            if (prm.get_isInAsyncPostBack()) {
                args.set_cancel(true);
                this._PostBackQueue.push(args.get_postBackElement().id);
                this._ArgumentsQueue.push(document.forms[0].__EVENTARGUMENT.value);
            }
        }
    },

    _clientIDToUniqueID: function(clientId) {
        return clientId.replace(/\_/g, '$');
    },

    _onEndRequest: function(sender, args) {
        var prm = this._getPageRequestManager();
        if (prm) {
            if (this._PostBackQueue.length > 0) {
                var eventTarget = this._PostBackQueue.shift();
                var eventArgument = this._ArgumentsQueue.shift();
                if (!eventArgument) {//if it is the command button
                    prm._onFormElementClick({ target: $get(eventTarget) }); //emulate click
                    prm._onFormSubmit({ preventDefault: function() { } }); //emulate submit with fake event
                }
                else {
                    __doPostBack(this._clientIDToUniqueID(eventTarget), eventArgument); //postback form as usual
                }
            }
        }
    }

}
AsiaAustraliaTech.UpdatePanelRequestManager.registerClass('AsiaAustraliaTech.UpdatePanelRequestManager', Sys.Component);

Sys.Application.add_init(function() {
    window.$UpdatePanelRequestManager = $create(AsiaAustraliaTech.UpdatePanelRequestManager);
});

if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

