﻿//#########################################################
//#########################################################
//---- AJAX Static object
//#########################################################
//#########################################################

function $DXAJAX(){} // creates object container for adding static methods

$DXAJAX.PostToObject = function(TargetObject, strURL, strParams)
{
    var ResponseDelegate = function(AjaxResponse)   
                            {
                               TargetObject.innerHTML = AjaxResponse;                  
                            };
    
    var A = new DXAJAXObject(ResponseDelegate);
        A.GetPage(strURL,strParams);
};

$DXAJAX.GetToObject = function(TargetObject, strURL)
{
    var ResponseDelegate = function(AjaxResponse)   
                            {
                               TargetObject.innerHTML = AjaxResponse;                  
                            };
                    
    var A = new DXAJAXObject(ResponseDelegate);
        A.GetPage(strURL);
};

$DXAJAX.GetForDelegate = function(ResponseDelegate, strURL)
{
    var A = new DXAJAXObject(ResponseDelegate);
        A.GetPage(strURL);
};

$DXAJAX.PostForDelegate = function(ResponseDelegate, strURL, strParams)
{
    var A = new DXAJAXObject(ResponseDelegate);
        A.GetPage(strURL, strParams);
};

$DXAJAX.GetAlertResponse = function(strURL)
{
    var A = new DXAJAXObject(function(AjaxResponse)
    {
        window.alert(AjaxResponse);
    });
        A.GetPage(strURL);
};

$DXAJAX.PostAlertResponse = function(strURL, strParams)
{
    var A = new DXAJAXObject(function(AjaxResponse)
    {
        window.alert(AjaxResponse);
    });
        A.GetPage(strURL, strParams);
};

//#########################################################
//#########################################################
//---- AJAX Object
//#########################################################
//#########################################################


function DXAJAXObject(ResponseDelegate)
{
	this.ResponseDelegate = ResponseDelegate;
	
	//====================================================
	//	ResponseDelegate = Return Function
	//	The Return Function must handle the HTTP response
	//	as a single parameter
	//	ex. HandleHTTP(responseText)
	//====================================================
	
	DXAJAXObject.prototype.resetHandler = function(NewResponseDelegate)
	{
		this.ResponseDelegate = NewResponseDelegate;
	};
	
	//====================================================
	//	GetPage
	//====================================================
	DXAJAXObject.prototype.GetPage = function(URL,PostData)
	{
		var My = this; // to overcome scope, and pass 'this' into functions
		var http_request = this.createXMLHttpRequest();

		if (!http_request) 
		{
			alert('Cannot create an XML HTTP instance');
			return false;
		}
		
		http_request.onreadystatechange = function()
		{
		    
			if (http_request.readyState == 4) 
			{
				//0 = uninitialized
				//1 = loading
				//2 = loaded
				//3 = interactive
				//4 = complete
				if (http_request.status == 200) 
				{
                    //200: OK 
                    //204: No Content 
                    //400: Bad Request 
                    //401: Unauthorized 
                    //403: Forbidden 
                    //404: Not Found 
                    //405: Method Not Allowed 
                    //500: Internal Server Error 
                    //501: Not Implemented 
                    //503: Service Unavailable 
                    /*
                    responseXML or responseText is determined by the MIME type 
                    of the responding document... needs to be set on that end
                    7/24/07
                    
                    OK, IE is of course different.
                    Mozilla automatically detects the MIME type based on content...
                    IE apparently does is soley on the header.
                    So, I have parsed the header, and it works as expected now.
                    7/24/07
                    
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    for debugging
                    alert(http_request.getAllResponseHeaders());
                    alert(http_request.getResponseHeader("Content-Type"));
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    */
                    
                    if (http_request.getResponseHeader("Content-Type").toLowerCase().indexOf("text/xml") > -1)
                    {
                        My.ResponseDelegate(http_request.responseXML);
                    }
                    else
                    {
                        My.ResponseDelegate(http_request.responseText);
                    }
				}
				else
				{
				    window.alert("The server returned response: " + http_request.status);
				    return;
				}
			}
		};
                
		if (PostData == undefined)
		{
			http_request.open('GET', URL, true);
			http_request.send(null);
		}
		else
		{
			http_request.open('POST', URL, true);
            http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            http_request.setRequestHeader("Content-length", PostData.length);
            http_request.setRequestHeader("Connection", "close");
			http_request.send(PostData);		
		}
	};
	//====================================================
	//	createXMLHttpRequest
	//	creates necessary object for AJAX transport
	//====================================================
	DXAJAXObject.prototype.createXMLHttpRequest = function()
	{
		var types = [
		'Microsoft.XMLHTTP',
		'MSXML2.XMLHTTP.5.0',
		'MSXML2.XMLHTTP.4.0',
		'MSXML2.XMLHTTP.3.0',
		'MSXML2.XMLHTTP'
		];
		
		for (var i = 0; i < types.length; i++) 
		{
			try 
			{
				return new ActiveXObject(types[i]);
			}	 
			catch(e) { /* do nothing */ } 
		}
		
		try 
		{
			return new XMLHttpRequest();
		} 
		catch(e) { /* do nothing */ } 
		
		return false; // XMLHttpRequest not supported
	};
	
}
