var res=null;
function getResponse() {
	if( res==null ) {
		if ((httpObj.readyState == 4) && (httpObj.status == 200)) {

			res=httpObj.responseText;
		}
	}
	return res;
}
function createXMLHttpRequest()
{
	var XMLhttpObject = null;
	try{
	XMLhttpObject = new XMLHttpRequest();
	}catch(e){
		try{
			XMLhttpObject = new ActiveXObject("Msxml2.XMLHTTP");
			}catch(e){
				try{
					XMLhttpObject = new ActiveXObject("Microsoft.XMLHTTP");
				}catch(e){
				return null;
			}
		}
	}
	return XMLhttpObject;
}


// 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.
//	async - true/false
//	fnOnComplete is defined as something like this:
// 		function OnComplete(responseText){ alert(responseText); }
// Return value: true if succeeded to start the request

function HttpRequest(method, sUrl, sPostdata, async, fnOnComplete, fnOnError)
{
	var objRequest = createXMLHttpRequest();
	if(objRequest == null)
		return false;
	
//	var fullUrl = getFullURL(sUrl);
	var fullUrl = sUrl;
	objRequest.onreadystatechange = function(){ _AjaxReadyStateChange(objRequest, fnOnComplete, fnOnError); };
	objRequest.open(method, fullUrl, async);	// 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)
		{
			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){
			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) && fnOnComplete){		// Patch for safari. Remove it (caused by the s2f - no objRequest.status)
			fnOnComplete(objRequest.responseText);
		}
		else {
			// Error
			if(fnOnError)
				fnOnError(objRequest.status, objRequest.responseText);
		}
	}
}

