var _IEObjName = null;
var _IEObjNames = 
	[
	'MSXML2.XmlHttp.5.0',
	'MSXML2.XmlHttp.4.0',
	'MSXML2.XmlHttp.3.0',
	'MSXML2.XmlHttp',
	'Microsoft.XmlHttp',
	'MSXML.XmlHttp',
	'MSXML3.XmlHttp'
	];
	   
	
function myXMLHttpRequest()
	{	
	var oHttp = null;
	var readyStateFaked = false;
	var oThis = this;
	var Text = null;
	var SyncMode = false;
	
	// user can override this;  this function is called when response is received
	this.onComplete = function(responseText, responseXML, response)
		{
		}
		
	// user can override this;  this function is called when error is received
	this.onError = function(responseText, responseXML, error)
		{
		}


	// internal callback function for the browser; it is called when a state of a request object changes
	var internalReadyStateChange = function()
		{
		if (oHttp.readyState == 4)
			{
			if (oHttp.status == 200 || oHttp.status == 304)
				{
				text = oHttp.responseText;
				if (oThis.onComplete)
					{
					oThis.onComplete(oHttp.responseText, oHttp.responseXML, oHttp.status);
					}				 
				}
			else
				{
				text = null;
				if (oThis.onError)
					{
					oThis.onError(oHttp.responseText, oHttp.responseXML, oHttp.status);
					}				 
				}
			}
		else
			{
			// we need to review other state codes for XMLHttpRequest readystatechange
			}
		}
		
	// allocate object for Microsoft browser
	var NewIEXMLHttpRequest = function()
		{
		if (_IEObjName)
			{
			try
				{
				return new ActiveXObject(_IEObjName);
				}
			catch (ex) {};
			}
		else
			{
			for (var ii = 0; ii < _IEObjNames.length; ii++)
				{
				try
					{
					_IEObjName = _IEObjNames[ii];
					return new ActiveXObject(_IEObjName);
					}
				catch (ex) {};
				}
			}
	
		_IEObjName = null;
		return null;
		}
		
	// allocate object for compliant browsers
	var NewMozXMLHttpRequest = function()
		{
		var oHttp = null;
		
		if (typeof XMLHttpRequest != "undefined")
			{
			try
				{
				oHttp = new XMLHttpRequest();
				
				// some versions of Moz do not support the readyState
				// property and the onreadystate event so patch it

                if (oHttp.overrideMimeType) // added by Tkong 07/05/06
				    {
                    oHttp.overrideMimeType('text/xml');
                    }
	
				if (oHttp.readyState == null)
					{
					readyStateFaked = true;
					oHttp.readyState = 0;
					
					var loadEventListener = function() 
						{
						oHttp.readyState = 4;
						if (oHttp.onreadystatechange && typeof oHttp.onreadystatechange == "function")
							oHttp.onreadystatechange();
						}
							
					oHttp.addEventListener("load", loadEventListener, false);
					}
				}
			catch (ex) {};
			}
		
		return oHttp;
		}
			
	// allocate the object
	var NewXMLHttpRequest = function()
		{
		if (window.XMLHttpRequest)
			{
			return NewMozXMLHttpRequest();
			}
		else if (window.ActiveXObject)
			{
			return NewIEXMLHttpRequest();
			}
			
		return null;
		}

	//  call this function to submit GET request
	this.sendGet = function(url)
		{	
		if (oHttp && oHttp.readyState != 0)
			{
			oThis.abort();
			}
		oHttp = NewXMLHttpRequest();
		
		if (oHttp)
			{

			if (readyStateFaked)
				{
				oHttp.readyState = 1;
				}

			oHttp.onreadystatechange = internalReadyStateChange;
			if (SyncMode)   //if (SyncMode = true)
				{

				oHttp.open("GET", url, false);
				}
			else
				{

				oHttp.open("GET", url, true);
				}
				
			oHttp.send(null);	

			}
		}

	this.setSyncMode = function(sync)   //var setSyncMode = function()
		{
		SyncMode = sync;
		}
	    	
	
	// call this function to abort current request
	this.abort = function()
		{
		if (oHttp)
			{
			oHttp.abort();
			if (readyStateFaked)
				{
				oHttp.readyState = 0;
				}
			}
		}	
	}