/*
RemoteScript 2.2
April 9, 2007
For usage details see http://yellow5.us/projects/remotescript/

Creative Commons Attribution 2.0 License
http://creativecommons.org/licenses/by/2.0/
*/

function RemoteScript(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 = GetResponse;
			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;
}