﻿Type.registerNamespace("Infragistics.Web.UI");

/******************************************Callback Request Handler*********************************/
$IG.CallbackRequestHandler = function(manager, callbackObject, async)
{
    var me = this;
    this._callbackObject = callbackObject;
    this._manager = manager;
    this._async = async;
	
	this._responseComplete = function () 
	{
	    if(me._request.readyState === 4 && me._request.status == "200")
	    {
	        window.clearTimeout(me._timerId);
	        var response = me._request.responseText;
	        if(response != null && response.length > 0)
	        {
	            var obj = Sys.Serialization.JavaScriptSerializer.deserialize(response)
	            document.getElementById("__VIEWSTATE").value = obj[0];
	            var eventValidation = document.getElementById("__EVENTVALIDATION");
	            if(eventValidation)
	                eventValidation.value = obj[1];
	            me._manager._requestCompleted(me, me._callbackObject, obj[2]);
	            for(var i in obj[3])
	            {
	                var id = obj[3][i][0];
	                var ctrlObj = $find(id);
	                if(ctrlObj && ctrlObj.dispose)
	                    ctrlObj.dispose();
	                var x = eval(obj[3][i][1]);
	            }
	        }
	        else
	        {
	            me._timedOut();
	        }
	    }
	}
}

$IG.CallbackRequestHandler.prototype =
{
    execute:function()
    {
        this._request = null;
        if(typeof XMLHttpRequest != "undefined") 
	        this._request = new XMLHttpRequest();
	    else if(typeof ActiveXObject != "undefined"){
	       try{ this._request = ig_createActiveXFromProgIDs(["MSXML2.XMLHTTP","Microsoft.XMLHTTP"]);}catch(e){}
	    }
	    
	    if(this._request)
	    {
	         this._request.open(this._manager.getHttpVerb(), this._manager.getUrl(), this._async);
	         this._request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	         this._request.onreadystatechange = this._responseComplete;
	         this._timerId = window.setTimeout(Function.createDelegate(this, this._timedOut), this._manager.getTimeout());
	         this._request.send(this.getArgs());
	    }
    }, 
    
    getArgs:function()
    {
        var form = this._manager.getForm();
        if(!form) return;
        
        // Ensures that all Infragistics Controls have their PostData set.
        if(ig_controls)
        for(var id in ig_controls)
            ig_controls[id]._onSubmitOtherHandler();
        
        var count = form.elements.length;
        var element;
        for (var i = 0; i < count; i++) {
            element = form.elements[i];
            if (element.tagName.toLowerCase() == "input" && (element.type == "hidden" || element.type == 'password' || element.type == 'text' || ((element.type == "checkbox"|| element.type =='radio')&& element.checked))) 
               this.addCallbackField(element.name, element.value);
            else if(element.tagName.toLowerCase() == "textarea")
				this.addCallbackField(element.name, element.value);
			else if(element.tagName.toLowerCase() == "select")
			{
				var o = element.options.length;
				while(o-- > 0)
				{
					if(element.options[o].selected)
						this.addCallbackField(element.name, element.options[o].value);
				}
			}
        }
        
        var args =  this._postdata + "__EVENTTARGET=&__EVENTARGUMENT=&__IGCallback_" + this._manager._control._id + "=";
        args += Sys.Serialization.JavaScriptSerializer.serialize(this._callbackObject.getServerData());
        return args; 
    },
    
     addCallbackField:function(name, value) 
    {
        if(!this._postdata)
            this._postdata = "";
        this._postdata += name + "=" + this.encodeValue(value) + "&";
    },
    
    encodeValue:function(uri) 
    {
        if(encodeURIComponent != null) 
            return encodeURIComponent(uri);
        else
            return escape(parameter);
    }, 
    
    _timedOut:function()
    {
         window.clearTimeout(this._timerId);
         this._manager._requestFailed(this, this._callbackObject);
         this._request.abort();        
         this._request = null;
    }
};
$IG.CallbackRequestHandler.registerClass("Infragistics.Web.UI.CallbackRequestHandler");
/******************************************END Callback Request Handler*****************************/

/******************************************Control Callback Manager*********************************/
$IG.ControlCallbackManager = function(control)
{
    this._control = control;
    this._httpVerb = "POST"
    this._async = true;
    this._timeout = 20000;
    this._url = this.getForm().action;
    
    this._currentRequests = 0;
	this._callbackQueue = [];
}

$IG.ControlCallbackManager.prototype =
{
    createCallbackObject:function(control)
    {
        if(!control)
            control = this._control;
        return new $IG.CallbackObject(control);
    },
    
    execute:function(callback, queue, async)
    {
        if(callback)
        {
            if(async == null)
                async = this.getAsync();
            var requestHandler = new $IG.CallbackRequestHandler(this, callback, async);
            
            if(queue && this._currentRequests > 0)
                this._queueCallback(requestHandler)
            else
            {
               this._currentRequests++;
               requestHandler.execute();
            }
	    }
    },   
    
    _pushCallback:function(callback)
    {
        this._callbackQueue.push(callback);
    },
    
    _popCallback:function()
    {
        for(var i = 0; i < this._callbackQueue.length; i++)
        {
            var requestHandler = this._callbackQueue[i];
            if(requestHandler != null)
            {
                delete this._callbackQueue[i];
                this._currentRequests++;
                requestHandler.execute();
            }
        }
    },
    
    getAsync:function(){return this._async;}, 
    setAsync:function(val){return this._async;},
    
    getHttpVerb:function(){return this._httpVerb;},
    setHttpVerb:function(verb){this._httpVerb = verb;},
    
    getUrl:function(){return this._url;},
    setUrl:function(url){this._url = url;},
    
    getTimeout:function(){return this._timeout;},
    setTimeout:function(val){this._timeout = val;},
    
    getForm:function()
    {
        if(!this._form)
        {
            if(document.forms.length > 1)
            {
		    	for(var i = 0; i < document.forms.length; i++)
	    		{
	    			if(document.forms[i].method == "post" && document.forms[i].action != "")
	    			{
	    				this._form = document.forms[i];
	    				break;
	    			}
	    		}   
	    		if(!this._form)
	    			 this._form = document.forms[0]; 
            }
	    	else
	    		this._form = document.forms[0];
            if (!this._form) 
                this._form = document.form1;
        }
        return this._form
    },
    
    _endRequest:function()
    {
        this._currentRequests--;
        if(this._callbackQueue.length > 0)
            this._popCallback();
    },
    
    setResponseComplete:function(func, context)
    {
        this._responseCompleteFunction = func;
        if(!context)
            context = this._control;
        this._responseCompleteContext = context;
    },
    
    _requestFailed:function(requestHandler, callbackObject)
    {
        this._endRequest();
    },
    
    _requestCompleted:function(requestHandler, callbackObject, responseObject)
    {
        this._endRequest();
        this._recursiveResponseCompleted(callbackObject, responseObject);
    },
    
    _recursiveResponseCompleted:function(callbackObject, responseObject)
    {
        this._responseComplete(callbackObject, responseObject);
        for(var i = 0; i < callbackObject._childCallbacks.length; i++)
            this._recursiveResponseCompleted(callbackObject._childCallbacks[i], responseObject.children[i]);
    },
    
    _responseComplete:function(callbackObject, responseObject)
    {
        if(!callbackObject.responseComplete(responseObject))
        {
            if(this._responseCompleteFunction)
               this._responseCompleteFunction.apply(this._responseCompleteContext, [callbackObject,responseObject]);
        }
    }

};
$IG.ControlCallbackManager.registerClass("Infragistics.Web.UI.ControlCallbackManager");
/******************************************END Control Callback Manager*****************************/

/******************************************Callback Object******************************************/
$IG.CallbackObject = function(control)
{
    this._control = control;
    this.serverContext = {};
    this.clientContext = {};
    this._childCallbacks = [];
}

$IG.CallbackObject.prototype =
{
    createCallbackObject:function(control)
    {
         if(!control)
            control = this._control;
        var callbackObject = new $IG.CallbackObject(control);
        this._childCallbacks.push(callbackObject);            
        return callbackObject;
    },
    
    getId:function(){return this._control._id;},
    getServerContext:function(){return this.serverContext;},
    getClientContext:function(){return this.clientContext;},
    
    setResponseComplete:function(func, context)
    {
        this._responseCompleteFunction = func;
        if(!context)
            context = this._control;
        this._responseCompleteContext = context;
    },
    
    responseComplete:function(responseObj)
    {
        if(this._responseCompleteFunction)
        {
            this._responseCompleteFunction.apply(this._responseCompleteContext, [this, resposneObj]);
            return true;
        }
        else
            return false;
    },
    
    getServerData:function()
    {
        var data = {id: this._control.get_uniqueID(), context: this.serverContext, children:[]};
        for(var i = 0;i < this._childCallbacks.length; i++)
            data.children[i] = this._childCallbacks[i].getServerData();
       return data;
    }

};
$IG.CallbackObject.registerClass("Infragistics.Web.UI.CallbackObject");
/******************************************END Callback Object**************************************/

if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();