var gbCoreAjaxShowErrorMessage				= true;
var gbCoreAjaxShowErrorMessageInStatusBar	= false;
var gaStateDescriptions =	{
								"100" : "Continue",
								"101" : "Switching Protocols",

								"200" : "OK",
								"201" : "Created",
								"202" : "Accepted",
								"203" : "Non-Authoritative Information",
								"204" : "NNo Content",
								"205" : "Reset Content",
								"206" : "Partial Content",

								"300" : "Multiple Choices",
								"301" : "Moved Permanently",
								"302" : "Found",
								"303" : "See Other",
								"304" : "Not Modified",
								"305" : "Use Proxy",
								"306" : "Unused",
								"307" : "Temporary Redirect",

								"400" : "Bad Request",
								"401" : "Unauthorized",
								"402" : "Payment Required",
								"403" : "Forbidden",
								"404" : "URI Not Found",
								"405" : "Method Not Allowed",
								"406" : "Not Acceptable",
								"407" : "Proxy Authentication Required",
								"408" : "Request Timeout",
								"409" : "Conflict",
								"410" : "Gone",
								"411" : "Length Required",
								"412" : "Precondition Failed",
								"413" : "Request Entity Too Large",
								"414" : "Request-URI Too Long",
								"415" : "Unsupported Media Type",
								"416" : "Requested Range Not Satisfiable",
								"417" : "Expectation Failed",

								"500" : "Internal Server Error",
								"501" : "Not Implemented",
								"502" : "Bad Gateway",
								"503" : "Service Unavailable",
								"504" : "Gateway Timeout",
								"505" : "HTTP Version Not Supported",

								"999" : "Dummy"
							}

var gaStatusCategories =	{
								"1xx" : "Informational",
								"2xx" : "Successful",
								"3xx" : "Redirection",
								"4xx" : "Client Error",
								"5xx" : "Server Error",

								"xxx" : "Dummy"
							}


function coreAjaxOnReadyStateChange( oHttpRequest, sUrl, sCallbackFunction, bReturnXml, bReturnResponseText )
{
	if (undefined != oHttpRequest && null != oHttpRequest )
	{
		if ( undefined == bReturnXml )
		{
			var bReturnXml = false;
		}

		if ( undefined == bReturnResponseText )
		{
			var bReturnResponseText = false;
		}

		if (oHttpRequest.readyState == 4 && (sCallbackFunction || true === bReturnResponseText))
		{
			if (oHttpRequest.status == 200 || oHttpRequest.status == 122 )
			{
				if (bReturnXml)
				{
					if (true === bReturnResponseText)
					{
						return oHttpRequest.responseXML;
					}
					else
					{
						if ("function" === typeof(sCallbackFunction))
						{
							sCallbackFunction(oHttpRequest.responseXML);
						}
						else
						{
							eval(sCallbackFunction + '(oHttpRequest.responseXML)');
						}
					}
				}
				else
				{
					if (true === bReturnResponseText)
					{
						return oHttpRequest.responseText;
					}
					else
					{
						if ("function" === typeof(sCallbackFunction))
						{
							sCallbackFunction(oHttpRequest.responseText);
						}
						else
						{
							eval(sCallbackFunction + '(oHttpRequest.responseText)');
						}
					}
				}
			}
			else
			{
				coreAjaxErrorMessage(oHttpRequest.status, sUrl );
				return false;
			}
		}
	}
	else
	{
		return false;
	}
	return false;
}


function coreAjaxErrorMessage( iStatus, sUrl, bForcedShow )
{
	if ( undefined == iStatus )
	{
		var iStatus = false;
	}

	if ( undefined == sUrl )
	{
		var sUrl = "";
	}

	if ( undefined == bForcedShow )
	{
		var bForcedShow = false;
	}

	if ( true == gbCoreAjaxShowErrorMessage || true == bForcedShow )
	{
		var sErrorMessage = "coreAjax error\n\nThere was a problem with the request.\n";

		sErrorMessage += "Category: ";

		if ( 100 <= iStatus && 199 >= iStatus )
		{
			sErrorMessage += gaStatusCategories["1xx"];
		}
		else if ( 200 <= iStatus && 299 >= iStatus )
		{
			sErrorMessage += gaStatusCategories["2xx"];
		}
		else if ( 300 <= iStatus && 399 >= iStatus )
		{
			sErrorMessage += gaStatusCategories["3xx"];
		}
		else if ( 400 <= iStatus && 499 >= iStatus )
		{
			sErrorMessage += gaStatusCategories["4xx"];
		}
		else if ( 500 <= iStatus && 599 >= iStatus )
		{
			sErrorMessage += gaStatusCategories["5xx"];
		}

		sErrorMessage += "\nCode: " + iStatus + "\n";
		sErrorMessage += "Description: ";

		if ( gaStateDescriptions[iStatus.toString()] )
		{
			sErrorMessage += gaStateDescriptions[iStatus.toString()];
		}
		else
		{
			sErrorMessage += "Unknow";
		}

		sErrorMessage += "\nURI: " + sUrl;

		if ( false == gbCoreAjaxShowErrorMessageInStatusBar || true == bForcedShow )
		{
			alert(	sErrorMessage );
		}
		else
		{
			window.status = "coreAjax error: " + iStatus;

			if ( gaStateDescriptions[iStatus.toString()] )
			{
				window.status += " - " + gaStateDescriptions[iStatus.toString()];
			}
		}
	}

	return iStatus;
}


function coreAjax()
{
	//oHttpRequest				= null;
	this.bInitialized				= false;
	this.bUpdateing					= false;
	this.sobjId						= false;
	this.bUseXRequestedWithHeader	= true;
	this.sFormData					= "";
	this.sLastUrl					= "";



	this.__makeHttpRequest = function (sUrl, sCallbackFunction, bReturnXml, bPost, bAsynchronCall, bReturnResponseText)
	{
		var oHttpRequest = null;

		if (window.XMLHttpRequest)
		{
			// IE/ Mozilla, Safari,...
			oHttpRequest = new XMLHttpRequest();

			if (oHttpRequest.overrideMimeType)
			{
				oHttpRequest.overrideMimeType('text/xml');
			}
		}
		else if (window.ActiveXObject)
		{
			// IE
			try
			{
				oHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (e)
			{
				try
				{
					oHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (e)
				{

				}
			}
		}

		if ( null != oHttpRequest )
		{
			this.bInitialized = true;
		}

		if (false == this.bInitialized )
		{
			alert('Unfortunately your browser doesn\'t support this feature.');
			return false;
		}

		this.sLastUrl = sUrl;

		if ( undefined == bReturnXml )
		{
			var bReturnXml = false;
		}

		if ( undefined == bReturnResponseText )
		{
			var bReturnResponseText = false;
		}

		if ( undefined == bPost )
		{
			var bPost = false;
		}

		if ( undefined == bAsynchronCall )
		{
			var bAsynchronCall = true;
		}

		//goHttpRequest.errorMessage = function ( iStatus, sUrl )
		//{
		//	coreAjaxErrorMessage( iStatus, sUrl );
		//}

		oHttpRequest.onreadystatechange = function()
		{
			return coreAjaxOnReadyStateChange( oHttpRequest, sUrl, sCallbackFunction, bReturnXml, bReturnResponseText);
		}


		if(sUrl.length > 2000)
		{
			bPost = true;
		}

		if( true == bPost )
		{
			oHttpRequest.open('POST', sUrl, bAsynchronCall);
			oHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

			if ( true == this.bUseXRequestedWithHeader )
			{
				oHttpRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			}

			oHttpRequest.send( this.sFormData );

			if( false === bAsynchronCall )
			{
				return coreAjaxOnReadyStateChange( oHttpRequest, sUrl, sCallbackFunction, bReturnXml, bReturnResponseText );
			}
		}
		else
		{
			oHttpRequest.open('GET', sUrl, bAsynchronCall);

			if ( true == this.bUseXRequestedWithHeader )
			{
				oHttpRequest.setRequestHeader("X-Requested-With", "XMLHttpRequest");
			}

			oHttpRequest.send(null);

			if(bAsynchronCall == false)
			{
				return coreAjaxOnReadyStateChange( oHttpRequest, sUrl, sCallbackFunction, bReturnXml, bReturnResponseText );
			}
		}

		return true;
	}

	this.setShowErrorMessage = function( bShow )
	{
		if ( undefined == bShow )
		{
			var bShow = false;
		}

		gbCoreAjaxShowErrorMessage = bShow;
	}


	this.setShowErrorMessageInStatusBar = function( bShow )
	{
		if ( undefined == bShow )
		{
			var bShow = false;
		}

		gbCoreAjaxShowErrorMessageInStatusBar = bShow;
	}


	this.getLastState = function( bShow )
	{
		if ( undefined == bShow )
		{
			var bShow = false;
		}

		return coreAjaxErrorMessage( oHttpRequest.status, this.sLastUrl, bShow );
	}

	this.requestGetText = function ( sUrl, sCallbackFunction )
	{
		//this.__makeHttpRequest(sUrl, sCallbackFunction, bReturnXml, bPost, bAsynchronCall)
		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, false, true, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, false, true, false );
		}

	}

	this.requestGetTextSynchrone = function ( sUrl, sCallbackFunction )
	{
		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, false, false, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, false, false, false );
		}
	}

	this.requestGetXml = function ( sUrl, sCallbackFunction )
	{
		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, false, true, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, false, true, false );
		}
	}

	this.requestGetXmlSynchrone = function ( sUrl, sCallbackFunction )
	{
		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, false, false, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, false, false, false );
		}
	}

	this.requestGetXmlSynchron = function ( sUrl, sCallbackFunction )
	{
		alert("not correct, add the letter e to your function!");
		return this.requestGetXmlSynchrone( sUrl, sCallbackFunction );
	}

	this.requestPostText = function ( sUrl, sCallbackFunction, sFormData )
	{
		if ( undefined != sFormData )
		{
			this.sFormData = sFormData;
		}

		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, true, true, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, true, true, false );
		}
	}

	this.requestPostTextSynchrone = function ( sUrl, sCallbackFunction, sFormData )
	{
		if ( undefined != sFormData )
		{
			this.sFormData = sFormData;
		}

		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, true, false, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, false, true, false, false );
		}
	}

	this.requestPostTextSynchron = function ( sUrl, sCallbackFunction, sFormData )
	{
		alert("not correct, add the letter e to your function!");
		this.requestPostTextSynchrone( sUrl, sCallbackFunction, sFormData);
	}

	this.requestPostXml = function ( sUrl, sCallbackFunction, sFormData )
	{
		if ( undefined != sFormData )
		{
			this.sFormData = sFormData;
		}

		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, true, true, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, true, true, false );
		}
	}

	this.requestPostXmlSynchrone = function ( sUrl, sCallbackFunction, sFormData )
	{
		if ( undefined != sFormData )
		{
			this.sFormData = sFormData;
		}

		if (undefined === sCallbackFunction)
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, true, false, true );
		}
		else
		{
			return this.__makeHttpRequest(sUrl, sCallbackFunction, true, true, false, false );
		}
	}

	this.requestPostXmlSynchron = function ( sUrl, sCallbackFunction, sFormData )
	{
		alert("not correct, add the letter e to your function!");
		this.requestPostXmlSynchrone( sUrl, sCallbackFunction, sFormData );
	}

}

