/*
RemoteScript 2.3
April 9, 2008
For usage details see http://yellow5.us/projects/remotescript/

Creative Commons Attribution 2.0 License
http://creativecommons.org/licenses/by/2.0/
*/

if (!window.RemoteScript)
{
	window.RemoteScript = function(sScript)
	{
		if (!sScript.toUpperCase || !arguments	|| (!encodeURIComponent && !escape)) return false;

		if (typeof(XMLHttpRequest) == 'undefined')
		{
			XMLHttpRequest = function()
			{
				try
				{
					return new ActiveXObject('Microsoft.XMLHTTP');
				}
				catch(sError)
				{
					try
					{
						return new ActiveXObject('Msxml2.XMLHTTP');
					}
					catch(sError)
					{
					}
				}

				return null;
			};
		}

		if (!escape)
		{
			escape = function(sString)
			{
				return encodeURIComponent(sString);
			};
		}

		var URLEncode = function(aQueryString)
		{
			if (typeof(aQueryString) == 'string')
			{
				var aPair, aPairs = aQueryString.split('&');
				aQueryString = {};
				for (var nPair = 0; aPairs[nPair] !== undefined; ++nPair)
				{
					if (!aPairs[nPair].length) continue;
					aPair = aPairs[nPair].split('=');
					aQueryString[aPair[0]] = (aPair.length == 1) ? '' : aPair[1];
				}
			}

			var sURLEncoded = '';
			for (var sVar in aQueryString)
			{
				sURLEncoded += aQueryString[sVar].length ? sVar + '=' + escape(aQueryString[sVar]) + '&' : sVar + '=&';
			}

			return (sURLEncoded.length > 0) ? sURLEncoded.substring(0, sURLEncoded.length - 1) : '';
		};

		var objArguments = {'QueryString' : '', 'ResponseFunction' : null, 'Method' : 'GET', 'ResponseType' : 'HTML', 'Asynchronous' : true };
		if (arguments.length > 1)
		{
			var bObject = (typeof(arguments[1]) == 'object');
			if (bObject)
			{
				for (var sKey in arguments[1])
				{
					if (objArguments[sKey] === undefined)
					{
						bObject = false;
						break;
					}
				}
			}

			if (bObject)
			{
				objArguments = arguments[1];

				objArguments.QueryString = objArguments.QueryString ? URLEncode(objArguments.QueryString) : '';
				if (typeof(objArguments.ResponseFunction) != 'function') objArguments.ResponseFunction = null;
				objArguments.Method = ((typeof(objArguments.Method) == 'string') && ((objArguments.Method.toUpperCase() == 'HEAD') || (objArguments.Method.toUpperCase() == 'POST'))) ? objArguments.Method.toUpperCase() : 'GET';
				objArguments.ResponseType = ((typeof(objArguments.ResponseType) == 'string') && (objArguments.ResponseType.toUpperCase() == 'XML')) ? 'XML' : 'HTML';
				objArguments.Asynchronous = ((objArguments.Asynchronous !== undefined) && !objArguments.Asynchronous) ? false : true;
			}
			else
			{
				objArguments.QueryString = URLEncode(arguments[1]);
				if ((arguments.length > 2) && (typeof(arguments[2]) == 'function')) objArguments.ResponseFunction = arguments[2];
				if ((arguments.length > 3) && (typeof(arguments[3]) == 'string') && ((arguments[3].toUpperCase() == 'HEAD') || (arguments[3].toUpperCase() == 'POST'))) objArguments.Method = arguments[3].toUpperCase();
				if ((arguments.length > 4) && (typeof(arguments[3]) == 'string') && (arguments[4].toUpperCase() == 'XML')) objArguments.ResponseType = 'XML';
				if ((arguments.length > 5) && !arguments[5]) objArguments.Asynchronous = false;
			}
		}

		var sSendQuery = ((objArguments.Method == 'POST') && (objArguments.QueryString.length > 0)) ? objArguments.QueryString : null;
		if ((objArguments.Method == 'GET') && (objArguments.QueryString.length)) sScript += '?' + objArguments.QueryString;

		var objRequest = new XMLHttpRequest();
		if (!objRequest) return false;

		objRequest.onreadystatechange = function()
		{
			var sResponse = false;
			var sErrorMessage = false;

			if (objRequest.readyState == 4)
			{
				try
				{
					if (objRequest.status == 200)
					{
						if (objArguments.Method == 'HEAD')
						{
							sResponse = (objArguments.QueryString.length == 0) ? objRequest.getAllResponseHeaders() : objRequest.getResponseHeader(objArguments.QueryString);
						}
						else
						{
							if ((objArguments.ResponseType == 'XML') && (typeof(objRequest.responseXML) == 'object'))
							{
								sResponse = objRequest.responseXML;
							}
							else if ((objArguments.ResponseType == 'HTML') && (typeof(objRequest.responseText) == 'string'))
							{
								sResponse = objRequest.responseText;
							}
						}
					}
				}
				catch (sError)
				{
					sResponse = false;
					sErrorMessage = sError;
				}

				if (objArguments.ResponseFunction) objArguments.ResponseFunction(sResponse, sErrorMessage);
				delete objRequest;
				objArguments.ResponseFunction = null;
				objArguments = null;
			}

			return true;
		}

		objRequest.open(objArguments.Method, sScript, objArguments.Asynchronous);
		if (objArguments.Method == 'POST') objRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		objRequest.send(sSendQuery);

		return true;
	}
}