﻿
// Define Namespace
Type.registerNamespace("KoComm.Pegasus.UI.Controls.AJAX");

// Define new class
KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler = function () {
    // declare private members
    this._internalControls = new Array();
    this._pageRequestManager = null;
    this._partialUpdateBeginRequestHandler = null;
    this._partialUpdateEndRequestHandler = null;
    
    // initialize inheritance
    KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler.initializeBase(this);
}

// Extend Prototype
KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler.prototype = 
{    
    // override initialize
    initialize: function() {
        
        this.registerPartialUpdateEvents();

        // call base method
        KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler.callBaseMethod (this, 'initialize');
    },
    
    registerPartialUpdateEvents : function() {
        /// <summary>
        /// Register for beginRequest and endRequest events on the PageRequestManager,
        /// (which cause _partialUpdateBeginRequest and _partialUpdateEndRequest to be
        /// called when an UpdatePanel refreshes)
        /// </summary>

        if (Sys && Sys.WebForms && Sys.WebForms.PageRequestManager)
        {
            this._pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
            
            if (this._pageRequestManager) 
            {
                this._partialUpdateBeginRequestHandler = Function.createDelegate(this, this.beginPartialPostback);
                this._pageRequestManager.add_beginRequest(this._partialUpdateBeginRequestHandler);
                this._partialUpdateEndRequestHandler = Function.createDelegate(this, this.endPartialPostback);
                this._pageRequestManager.add_endRequest(this._partialUpdateEndRequestHandler);
            }
        }
    },
    
    // override dispose
    dispose: function () { 
    
        if (this._pageRequestManager) 
        {
            if (this._partialUpdateBeginRequestHandler) 
            {
                this._pageRequestManager.remove_beginRequest(this._partialUpdateBeginRequestHandler);
                this._partialUpdateBeginRequestHandler = null;
            }
            
            if (this._partialUpdateEndRequestHandler) 
            {
                this._pageRequestManager.remove_endRequest(this._partialUpdateEndRequestHandler);
                this._partialUpdateEndRequestHandler = null;
            }
            
            this._pageRequestManager = null;
        }
        
        // call base method
        KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler.callBaseMethod (this, 'dispose');
        
    },
    
    // define property for private members
    get_internalControls: function () {
        // validate parameters
        if (arguments.length !== 0) throw Error.parameterCount();

        return this._internalControls;
    },
    
    set_internalControls: function (value) {
        // validate parameters
        var e = Function._validateParams(arguments, [{name: "value", type: Array}]);

        // for each client id in the array, convert it into a DOM Element
        var domElement;
        for (var i=0; i<value.length; i++) {

           // use shortcut for Sys.DomElement.get();
           domElement = $get(value[i]);
           if (domElement != null) {
               Array.add(this._internalControls, domElement);
           }
        }
    },
    
    // method that disables all the controls
    beginPartialPostback: function(sender, beginRequestEventArgs) {

        // disable all of the controls in the array.
        this._disableControls();
    },
 
    // method that enables all the controls
    endPartialPostback: function(sender, endRequestEventArgs) {

        this._enableControls();     
    },
    
    // disable all of the controls in the internal control array.
    _disableControls: function () {

        // validate parameters
        if (arguments.length !== 0) throw Error.parameterCount();

        Array.forEach(this._internalControls, this.disableControl);
    
        var handler = this.get_events().getHandler("controlsDisabled");
        if (handler != null) {
           handler(this, Sys.EventArgs.Empty);
        }		

    },
    
    // enable all of the controls in the internal control array.
    _enableControls: function() {
        // validate parameters
        if (arguments.length !== 0) throw Error.parameterCount();

        //Refresh the control references.
        this._refreshCollection();
        
        // using new Array BCL extension forEach syntax.
        Array.forEach(this._internalControls, this.enableControl);   
        
        var handler = this.get_events().getHandler("controlsEnabled");
        if (handler != null) {
           handler(this, Sys.EventArgs.Empty);
        }		
    },
    
    // Gets the object refrences again incase some of them were rewritten via an update panel.
    _refreshCollection: function() {
        // validate parameters
        if (arguments.length !== 0) throw Error.parameterCount();
        
        //Create a new array.
        var tempControls = new Array();

        // Validate each element.
        Array.forEach(this._internalControls, this._validateElement, tempControls);   
        
        this._internalControls = tempControls;
    },
    
    // Adds the array element to the context array if it is valid.
    _validateElement: function(element, index, array) {
        
        var domElement = $get(element.id);
        
        if (domElement != null) {
            Array.add(this, domElement);
        }	
    },
    
    // method called on each iteration of the foreach loop of beginPartialPostback.
    disableControl: function(arrayElement, index, array) {
        arrayElement.disabled = true;
    },
    
    // method called on each iteration of the foreach loop of endPartialPostback.
    enableControl: function (arrayElement, index, array) {
        arrayElement.disabled = false;
    },
    
    remove_controlDisabled: function(handler) {
        /// <summary>Removes a event handler for the controlDiabled event.</summary>
        /// <param name="handler" type="Function">The handler to remove from the event.</param>
        var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
        if (e) throw e;

		this.get_events().removeHandler("controlDisabled", handler);
	    },
	
	add_controlsDisabled: function(handler) {
	    /// <summary>Adds an event handler for the controlsDisabled event.</summary>
        /// <param name="handler" type="Function">The handler to add to the event.</param>
        var e = Function._validateParams(arguments, [{name: "handler", type: Function}]);
        if (e) throw e;

	    this.get_events().addHandler("controlsDisabled", handler);
	}
}

// Register Class and Define inheritance
KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler.registerClass('KoComm.Pegasus.UI.Controls.AJAX.PostBackDisabler', Sys.Component);

//Don't do this with embedded js.
//if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();