//#########################################################
//#########################################################
//---- AJAX Static object
//#########################################################
//#########################################################
/*
----------------------------------------------------------------
Usage
----------------------------------------------------------------
Let's say you wanted to call a page called "Callback.aspx" to return results, 
and display those results inside a DIV element.

================================================================
var TargetObject   = document.getElementById("MyDiv");
var strURL         = "Callback.aspx?SomeVar=1";	
$AJAX.GetToObject(TargetObject, strURL);
================================================================

Let's say you wanted Callback.aspx results to display in a javascript alert box instead.
( Your result needs to be a javascript syntax compliant string )

================================================================
$AJAX.GetAlertResponse(strURL);
================================================================

Let's say you wanted the results of Callback.aspx to be passed to a
Delegate Function. Your Delegate Function should have one variable,
Called "AjaxResponse".

================================================================
var ResponseDelegate = function(AjaxResponse)
{
// do something with AjaxResponse string
}
$AJAX.GetForDelegate(ResponseDelegate,strURL);
================================================================

There are three other options, where you can Post from a form 
instead of using Get. The variable strParams should contain a
QueryString like "A=1&B=2&c=foo"

================================================================
$AJAX.PostToObject(TargetObject, strURL, strParams);
$AJAX.PostAlertResponse(strURL, strParams);
$AJAX.PostForDelegate(ResponseDelegate, strURL, strParams);
================================================================

You can also create an instance of the AJAXObject directly.
The above methods do this for you in a simpler static format.
The object always requires a Delegate Function to return results.

================================================================
var A = new AJAXObject(ResponseDelegate);
A.GetPage(URL);                       <--- returns data to the ResponseDelegate
A.GetPage(URL,PostData);              <--- overload for sending Post Data
A.resetHandler(NewResponseDelegate);  <--- replaces ResponseDelegate with a new one
================================================================

-Jim 5/30/2007

*/

// creates object container for adding static methods
function $AJAX() { }
// shorthand
function $AJ() { }

$AJAX.PostToObject = function(TargetObject, strURL, strParams) {
    var ResponseDelegate = function(AjaxResponse) {
        TargetObject.innerHTML = AjaxResponse;
    };

    var A = new AJAXObject(ResponseDelegate);
    A.GetPage(strURL, strParams);
};

$AJAX.GetToObject = function(TargetObject, strURL) {
    var ResponseDelegate = function(AjaxResponse) {
        TargetObject.innerHTML = AjaxResponse;
    };

    var A = new AJAXObject(ResponseDelegate);
    A.GetPage(strURL);
};

// shorthand
$AJ.GD = function(ResponseDelegate, strURL) {
    $AJAX.GetForDelegate(ResponseDelegate, strURL);
};

$AJAX.GetForDelegate = function(ResponseDelegate, strURL) {
    var A = new AJAXObject(ResponseDelegate);
    A.GetPage(strURL);
};

$AJAX.PostForDelegate = function(ResponseDelegate, strURL, strParams) {
    var A = new AJAXObject(ResponseDelegate);
    A.GetPage(strURL, strParams);
};

$AJAX.GetAlertResponse = function(strURL) {
    var A = new AJAXObject(function(AjaxResponse) {
        window.alert("AjaxResponse: " + AjaxResponse);
    });
    A.GetPage(strURL);
};

$AJAX.PostAlertResponse = function(strURL, strParams) {
    var A = new AJAXObject(function(AjaxResponse) {
        window.alert("AjaxResponse: " + AjaxResponse);
    });
    A.GetPage(strURL, strParams);
};

$AJAX.GetAsync = function(strURL) {
    var A = new AJAXAsyncObject();
    A.GetPage(strURL);
};

//#########################################################
//#########################################################
//---- AJAX Object
//#########################################################
//#########################################################

function AJAXObject(ResponseDelegate) {
    this.ResponseDelegate = ResponseDelegate;

    //====================================================
    //	ResponseDelegate = Return Function
    //	The Return Function must handle the HTTP response
    //	as a single parameter
    //	ex. HandleHTTP(responseText)
    //====================================================

    AJAXObject.prototype.resetHandler = function(NewResponseDelegate) {
        this.ResponseDelegate = NewResponseDelegate;
    };

    //====================================================
    //	GetPage
    //====================================================
    AJAXObject.prototype.GetPage = function(URL, PostData) {
        // to overcome scope, and pass 'this' into functions
        var My = this;
        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"))
                    {
                    if (http_request.getResponseHeader("Content-Type").toLowerCase().indexOf("text/xml") > -1) {
                        My.ResponseDelegate(http_request.responseXML);
                    }
                    else {
                        My.ResponseDelegate(http_request.responseText);
                    }
                    }
                }
                else {
                    if (parseInt(http_request.status, 10) != 0) {
                        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
    //====================================================
    AJAXObject.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 */ }

        // XMLHttpRequest not supported
        return false;
    };

}



//#########################################################
//#########################################################
//---- AJAX Async Object - makes asyncronous call
//#########################################################
//#########################################################

function AJAXAsyncObject() {
    //====================================================
    //	GetPage
    //====================================================
    AJAXAsyncObject.prototype.GetPage = function(URL, PostData) {
        // to overcome scope, and pass 'this' into functions
        var My = this;
        var http_request = this.createXMLHttpRequest();

        if (!http_request) {
            alert('Cannot create an XML HTTP instance');
            return false;
        }
        //http_request.async = true;
        http_request.onreadystatechange = function() {
            return;
        };

        if (PostData == undefined) {
            http_request.open('GET', URL, true);
            http_request.send(null);
            return;
        }
        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);
            return;
        }
    };

    //====================================================
    //	createXMLHttpRequest
    //	creates necessary object for AJAX transport
    //====================================================
    AJAXAsyncObject.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 */ }

        // XMLHttpRequest not supported
        return false;
    };

}































