﻿
Type.registerNamespace('Envoy.Framework.Web');

Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior = function(element) {
    Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.initializeBase(this, [element]);
    
    this._onUpdating = new AjaxControlToolkit.Animation.GenericAnimationBehavior(element);
    this._onUpdated = new AjaxControlToolkit.Animation.GenericAnimationBehavior(element);
    
    this._postBackPending = null;
    this._triggerControlID = null;
    this._triggerControlIDs = null;
}

Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.prototype = {    
    initialize : function() {
        Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.callBaseMethod(this, 'initialize');
        
        var element = this.get_element();
        var parentDiv = document.createElement("DIV");
        element.parentNode.insertBefore(parentDiv, element);
        parentDiv.appendChild(element);

        Array.remove(element._behaviors, this);
        Array.remove(element._behaviors, this._onUpdating);
        Array.remove(element._behaviors, this._onUpdated);
        if (parentDiv._behaviors) {
            Array.add(parentDiv._behaviors, this);
            Array.add(parentDiv._behaviors, this._onUpdating);
            Array.add(parentDiv._behaviors, this._onUpdated);                        
        } else {
            parentDiv._behaviors = [this, this._onUpdating, this._onUpdated];
        }
        this._element = this._onUpdating._element = this._onUpdated._element = parentDiv;
        
        this._onUpdating.initialize();
        this._onUpdated.initialize();

        this.registerPartialUpdateEvents();
    },

    _partialUpdateBeginRequest : function(sender, beginRequestEventArgs) {
        Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.callBaseMethod(this, '_partialUpdateBeginRequest', [sender, beginRequestEventArgs]);
        if (!this._postBackPending && this.isPostBackFromTriggerControlOrTriggerControlChild(beginRequestEventArgs.get_postBackElement())) {
            this._postBackPending = true;
            this._onUpdated.quit();
            this._onUpdating.play();
        }
    },

    _partialUpdateEndRequest : function(sender, endRequestEventArgs) {
        Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.callBaseMethod(this, '_partialUpdateEndRequest', [sender, endRequestEventArgs]);
        if (this._postBackPending) {
            this._postBackPending = false;
            this._onUpdating.quit();
            this._onUpdated.play();
        }
    },
    
    get_TriggerControlID : function() {
        return this._triggerControlID;
    },
    set_TriggerControlID : function(value) {
        if (this._triggerControlID != value) {
            this._triggerControlID = value;
            this._triggerControlIDs = value.split(',');
            this.raisePropertyChanged('TriggerControlID');
        }
    },
    
    get_OnUpdating : function() {
        return this._onUpdating.get_json();
    },
    set_OnUpdating : function(value) {
        this._onUpdating.set_json(value);
        this.raisePropertyChanged('OnUpdating');
    },
    
    get_OnUpdatingBehavior : function() {
        return this._onUpdating;
    },
    
    get_OnUpdated : function() {
        return this._onUpdated.get_json();
    },
    set_OnUpdated : function(value) {
        this._onUpdated.set_json(value);
        this.raisePropertyChanged('OnUpdated');
    },
    
    get_OnUpdatedBehavior : function() {
        return this._onUpdated;
    },
    
    isPostBackFromTriggerControlOrTriggerControlChild : function(postBackElement) {
		if (this._triggerControlIDs) {
			var elementToCheck = postBackElement;
			while (elementToCheck) {
				for (i = 0; i < this._triggerControlIDs.length; i++) {
					if (this._triggerControlIDs[i] == elementToCheck.id) {
						return true;
					}
				}

				if (elementToCheck.parentElement) {
					elementToCheck = elementToCheck.parentElement;
				} else if (elementToCheck.parentNode) {
					elementToCheck = elementToCheck.parentNode;
				} else {
					elementToCheck = null;
				}
			}
		}
		return false;
    }
}
Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior.registerClass('Envoy.Framework.Web.UpdatePanelTriggeredAnimationBehavior', AjaxControlToolkit.BehaviorBase);