// Remote request function
//
// Parameters:
//	methos - either "GET" or "POST"
// 	sUrl should be in the same domain as caller, otherwise request will fail
//		(subdomain may be different).
// 	sPostData can be empty.
//	fnOnComplete is defined as something like this:
// 		function OnComplete(responseText){ alert(responseText); }
// Return value: true if succeeded to start the request

function AjaxRequest(method, sUrl, sPostdata, fnOnComplete, fnOnError)
{
	var objRequest = _AjaxGetObjRequest();
	if(objRequest == null)
		return false;
	
	var fullUrl = getFullURL(sUrl);
		
	objRequest.onreadystatechange = function(){ _AjaxReadyStateChange(objRequest, fnOnComplete, fnOnError); };
	objRequest.open(method, fullUrl, true);	// true is for asynchronous
	objRequest.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
	objRequest.setRequestHeader('Connection', 'close');
	objRequest.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
	objRequest.send(sPostdata);
	return true;
}

function getFullURL(sUrl)
{
	if (sUrl.charAt(0) == '/') {
		var rand = new String(Math.random());
		rand = rand.substring(2, 11);
		
		var serverAddr = location.href;
		var lastSlashIndex = serverAddr.indexOf('/', 7);	//right after 'http://'
		var fullUrl = new String(serverAddr.substr(0,lastSlashIndex));
		fullUrl = fullUrl.concat('/ajax_services/' + rand + sUrl);
		return fullUrl;
	}
	return sUrl;
}

// Internal function!
function _AjaxGetObjRequest()
{
	// Create remote request object
	var objRequest = null;
	try
	{
		objRequest = new ActiveXObject('Msxml2.XMLHTTP');
	}
	catch(e)
	{
		try
		{
			objRequest = new ActiveXObject('Microsoft.XMLHTTP');
		}
		catch(e)
		{
			//netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
			objRequest = new XMLHttpRequest();
		}
	}
	return objRequest;
}

// Internal function!
function _AjaxReadyStateChange(objRequest, fnOnComplete, fnOnError)
{
	// If request shows "loaded"
	if(objRequest.readyState == 4){
		if(objRequest.status == 200){
			fnOnComplete(objRequest.responseText);
		}
		else if (objRequest.status == 400 && fnOnError){	// Patch for safari. Remove it (caused by the s2f - no objRequest.status)
			fnOnError(objRequest.status, objRequest.responseText);
		}
		else if (navigator.userAgent.toLowerCase().indexOf('safari') != -1){		// Patch for safari. Remove it (caused by the s2f - no objRequest.status)
			fnOnComplete(objRequest.responseText);
		}
		else {
			// Error
			if(fnOnError)
				fnOnError(objRequest.status, objRequest.responseText);
		}
	}
}
