﻿
/* Generic AJAX div contents update from http_request */
function updateContents(http_request, div_id) 
{
	if (http_request.readyState == 4) 
	{
		if (http_request.status == 200) 
		{
			document.getElementById(div_id).innerHTML=(http_request.responseText);
		} 
		else if (http_request.status != 0) 
		{
			var msg = 'There was a problem with the request:'+http_request.status;
			if (div_id=="popup")
			{
				document.getElementById(div_id).innerHTML='<div class="gabrielsPopupInterior"><div class="gabrielsPopupTitle" align="right"><a href="javascript:closePopup()">Close</a></div><BR><div id="popupContents">'+msg+'</div></div>';
			}				
			else
			{
				document.getElementById(div_id).innerHTML=msg;
			}
		}
	}
}

/* Generic AJAX for populating a div with content from a URL */
    function makeRequest(url, div_id) {
        var http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/html');
                // See note below about this line
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        re = new RegExp("[?]")
        if (re.exec(url))
			qsChar="&";
		else
			qsChar="?";
        
//        alert(qsChar);
        
        http_request.onreadystatechange = function() { updateContents(http_request, div_id); };
        http_request.open('GET', url + qsChar + "live=" + new Date().getTime(), true);
        http_request.send(null);

    }

/* Generic AJAX for populating a div with content posted from a form */   
   function makePOSTRequest(url, div_id, parameters) {
      http_request = false;
      if (window.XMLHttpRequest) { // Mozilla, Safari,...
         http_request = new XMLHttpRequest();
         if (http_request.overrideMimeType) {
            http_request.overrideMimeType('text/html');

         }
      } else if (window.ActiveXObject) { // IE
         try {
            http_request = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
            try {
               http_request = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
         }
      }
      if (!http_request) {
         alert('Cannot create XMLHTTP instance');
         return false;
      }
      
      http_request.onreadystatechange = function() { updateContents(http_request, div_id); }
      http_request.open('POST', url, true);
      http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      http_request.setRequestHeader("Content-length", parameters.length);
      http_request.setRequestHeader("Connection", "close");
      http_request.send(parameters);
   }
   
   
/* Generic AJAX for populating a div with content from a URL */
    function bodyStyleRequest(url, div_id) {
        var http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/html');
                // See note below about this line
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
        }
        re = new RegExp("[?]")
        if (re.exec(url))
			qsChar="&";
		else
			qsChar="?";
        
//        alert(qsChar);
        
        http_request.onreadystatechange = function() { updateContents(http_request, div_id); };
        http_request.open('GET', url + qsChar + "live=" + new Date().getTime(), true);
        http_request.send(null);

    }
    
    

function hardcodeContents(txt, div_id)
{
	document.getElementById(div_id).innerHTML=(txt);
}



//#########################################################
//#########################################################
//---- AJAX Static object
//#########################################################
//#########################################################

function $AJAX(){} // creates object container for adding static methods

$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);
};

$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);
    });
        A.GetPage(strURL);
};

$AJAX.PostAlertResponse = function(strURL, strParams)
{
    var A = new AJAXObject(function(AjaxResponse)
    {
        window.alert(AjaxResponse);
    });
        A.GetPage(strURL, strParams);
};

//#########################################################
//#########################################################
//---- 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)
	{
		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
				{
					My.ResponseDelegate("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 */ } 
		
		return false; // XMLHttpRequest not supported
	};
	
}
