/* Copyright 2007 Codevendor.com */

// For registering namespaces
var Namespace = {
    
    Register : function(_Name)
    {
        var o = window;
        var x = false;
        for (var a = _Name.split("."); a.length > 0;)
        {
            var s = a.shift();
            if(a.length==0){ if(o[s]){x=true;} }
            if(!o[s]){o[s]={};}
            o = o[s];
        }
        
        if(x){ return 1; }
    }
}

//Create Namespaces----------------------------------------
Namespace.Register("System.Net.Ajax");
//---------------------------------------------------------

//Enumeration-----------------
System.Net.Ajax.RequestMethod = { Get:"GET", Post:"POST" };
//----------------------------

//Handles page requests in a collection----------------
System.Net.Ajax.PageRequests = function(){ return {

    Requests : null,
    
    //Gets the type of object---------------------------------------------
    GetType : function(){ return "System.Net.Ajax.PageRequests"; },
    //--------------------------------------------------------------------
    
    //Initializer---------------------------------------------------------
    Init : function()
    {
        this.Requests = new Array();
        if(arguments[0].length==1){ this.Requests.push(arguments[0][0]); }
        return this; 
    },
    //--------------------------------------------------------------------
    
    //Adds Requests to the collection
    AddRequest : function()
    {
        if(arguments.length==0 || arguments[0].GetType()!="System.Net.Ajax.Request"){ return; }
        this.Requests.push(arguments[0]);            
    }
    
}.Init(arguments);}

//Single Page Request
System.Net.Ajax.Request = function(){ return {

    Method : null,
    URL : null,
    Params : null,
    Callback : null,
    Async : false,
    UserObject : null,
    MimeType : null,
    
    //Gets the type of object---------------------------------------------
    GetType : function(){ return "System.Net.Ajax.Request"; },
    //--------------------------------------------------------------------
    
    //Initializer---------------------------------------------------------
    Init : function()
    {
        switch(arguments[0].length)
        {
            case 1 : this.Method = arguments[0][0]; break;
            case 2 : this.Method = arguments[0][0]; this.URL = arguments[0][1]; break;
            case 3 : this.Method = arguments[0][0]; this.URL = arguments[0][1]; this.Callback = arguments[0][2]; break;
            case 4 : this.Method = arguments[0][0]; this.URL = arguments[0][1]; this.Callback = arguments[0][2]; this.Async = arguments[0][3]; break;
            case 5 : this.Method = arguments[0][0]; this.URL = arguments[0][1]; this.Callback = arguments[0][2]; this.Async = arguments[0][3]; this.UserObject = arguments[0][4]; break;
            case 6 : this.Method = arguments[0][0]; this.URL = arguments[0][1]; this.Callback = arguments[0][2]; this.Async = arguments[0][3]; this.UserObject = arguments[0][4]; this.MimeType = arguments[0][5]; break;
        }
        
        this.Params = new Array();
        return this; 
    },
    //--------------------------------------------------------------------
    
    //Adds Parameters to the parameter array collection
    AddParam : function()
    {
        switch(arguments.length)
        {
            case 1 : this.Params.push(arguments[0]); break;
            case 2 : this.Params.push(new System.Net.Ajax.Parameter(arguments[0], arguments[1])); break;
        }
    }
    
}.Init(arguments);}

//Page Request Parameter Object
System.Net.Ajax.Parameter = function(){ return {

    Name : null,
    Value : null,

    //Gets the type of object---------------------------------------------
    GetType : function(){ return "System.Net.Ajax.Parameter"; },
    //--------------------------------------------------------------------
    
    //Initializer---------------------------------------------------------
    Init : function()
    { 
        if(arguments[0].length==2){ this.Name = arguments[0][0]; this.Value = arguments[0][1]; }
        return this; 
    }
    //--------------------------------------------------------------------

}.Init(arguments);}

System.Net.Ajax.ActiveObject = 0; //For knowing what type of active X object.

//For handling ajax connections
System.Net.Ajax.Connection = function(){ return {
    
    ActiveXObject : null,
    PageRequests : null,
    Current : null,
    
    //Gets the type of object---------------------------------------------
    GetType : function(){ return "System.Net.Ajax.Connection"; },
    //--------------------------------------------------------------------
    
    //Initializer---------------------------------------------------------
    Init : function()
    { 
        if(arguments[0].length==1){ this.PageRequests = arguments[0][0]; }
        return this; 
    },
    //--------------------------------------------------------------------
    
    //Creates the active x object for use
    Create : function()
    {
    		//alert(System.Net.Ajax.ActiveObject);
        switch(System.Net.Ajax.ActiveObject)
        {
            case 0:
                if(window.ActiveXObject)
                {
                    try 
                    { 
                        System.Net.Ajax.ActiveObject = 2;
                        //alert(System.Net.Ajax.ActiveObject);
                        return new ActiveXObject("Msxml2.XMLHTTP");        
                    } 
                    catch(e) 
                    {  
                        System.Net.Ajax.ActiveObject = 3;
                        //alert(System.Net.Ajax.ActiveObject);
                        return new ActiveXObject("Microsoft.XMLHTTP");
                    }
                }
                else
                {
                    if(window.XMLHttpRequest)
                    {
                       System.Net.Ajax.ActiveObject = 1;
										   /*  
										   Tried following code, but still not working correctly in FF
										   ** Due to security, use full path including http:// to the xml file and must be local
										   See http://www.captain.at/howto-ajax-permission-denied-xmlhttprequest.php
										   
										   try {
										    netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
										   } catch (e) {
										    alert("Permission UniversalBrowserRead denied.");
										   }
										   */
									     var http_request = new XMLHttpRequest();
									     var mimetype = 'xml';
									     if (http_request.overrideMimeType) {
                       		//alert(http_request.overrideMimeType);
									        http_request.overrideMimeType('text/'+mimetype);
									     }
                        return http_request;
                    }
                }
            
            //case 1: return new XMLHttpRequest(); 
            case 1:    
											var http_request = new XMLHttpRequest();
											var mimetype = 'xml';
											if (http_request.overrideMimeType) {
												//alert(http_request.overrideMimeType);
											  http_request.overrideMimeType('text/'+mimetype);
											}
											return http_request;
        
            case 2: return new ActiveXObject("Msxml2.XMLHTTP");           
            case 3: return new ActiveXObject("Microsoft.XMLHTTP");
            default: break;
        }
        
        //No Ajax Object Found-----------
        System.Net.Ajax.ActiveObject = -1;
        throw "Missing a required ajax object.";
        return false;
        //-------------------------------
    },
    
    Open : function()
    {
        //Check if page requests has something------
        if(this.PageRequests==null){ return; }
        //------------------------------------------
        
        //Create Variables--------------------------
        var obj = this;
        var Data = "";
        //------------------------------------------
        
        //Create ActiveX----------------------------
        this.ActiveXObject = this.Create();
        //------------------------------------------
        
        //Get Request-------------------------------
        this.Current = this.PageRequests.Requests.shift();
        //------------------------------------------
        
        //Open Connection---------------------------
        this.ActiveXObject.open(this.Current.Method, this.Current.URL, this.Current.Async);
        //------------------------------------------
        
        //Create ActiveX Callback-------------------
        this.ActiveXObject.onreadystatechange = function() {obj.OnReadyStateChange();}
        //------------------------------------------
        
        //Open Ajax Request-------------------------------------------------------------------
        if(this.Current.Method=="POST")
        {
            this.ActiveXObject.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
               
            if(this.Current.Params!=null && this.Current.Params.length!=0)
            {
                for(var Param in this.Current.Params) 
                {
                    Data += (Data=="") ? this.Current.Params[Param].Name + "=" + this.Current.Params[Param].Value : "&" + this.Current.Params[Param].Name + "=" + this.Current.Params[Param].Value;
                }
            }
            this.ActiveXObject.send(encodeURI(Data));
        }
        else
        {
            this.ActiveXObject.send(null);
        }
        //------------------------------------------------------------------------------------
    },
    
    //ActiveXObject callback
    OnReadyStateChange : function()
    {
        //Get Ajax objects for return-----------------
        var r = {};
        r.ReadyState = this.ActiveXObject.readyState;
        r.MimeType = this.Current.MimeType;
        //alert(this.ActiveXObject.responseXML)
        r.ResponseText = (this.ActiveXObject.readyState==4) ? (r.MimeType=='xml'?this.ActiveXObject.responseXML:this.ActiveXObject.responseText):null;
        r.Status = (this.ActiveXObject.readyState==4)?this.ActiveXObject.status:null;
        r.URL = this.Current.URL;
        r.UserObject = this.Current.UserObject;
        //alert(r.UserObject.id);
        r.Complete = (this.ActiveXObject.readyState==4 && this.PageRequests.Requests.length==0) ? true : false;
        //--------------------------------------------
        
        //Call Callback Method---------------
        //alert(this.ActiveXObject.responseText);
        if(this.Current.Callback!=null){this.Current.Callback(r);}
        //-----------------------------------
        
        //Loop For Many URLS
        if(this.ActiveXObject.readyState==4)
        { 
            if(r.Complete){ this.PageRequests=null; this.ActiveXObject.abort(); this.Current=null; }
            else{ this.Open();}
        }
    }
      
}.Init(arguments);}