/* 
	Copyright Camelonta AB - 2007,2008
*/


function AjaxConnection(  )
{
	this.XmlHttpRequest = getXMLHttpRequest();
	this.Get = _Get;
	this.Post = _Post;
	this.GetSync = _GetSync;
}

onResponseStateChange = function(thisCall) {
	req = thisCall.req;
	if (req.readyState != 4) 
		return;
	else
	{
		callbackFunction = thisCall.callbackFunction;
		
		var content = (thisCall.responseIsXml)?req.responseXML: req.responseText;
		thisCall.callbackFunction(content, thisCall.callingContext);
		thisCall = null;
	}
}

function _GetSync( url, queryStringArgs, callbackFunction, callingContext, responseIsXml ) 
{
	// Build the querystring
	queryString = buildQueryString(queryStringArgs);
	if(queryString.length>0 && url.indexOf("?")==-1)
		url = url + "?" + queryString;
	else
		url = url + "&" + queryString;

	// Open a connection to the server
	this.XmlHttpRequest.open("GET", url, false);
	this.XmlHttpRequest.send(null);
	var serverResponse = this.XmlHttpRequest.responseText;
	return serverResponse;
}


function _Post( url, queryStringArgs, callbackFunction,  callingContext, responseIsXml, bodyType, body ) 
{
	// Build the querystring
	queryString = buildQueryString(queryStringArgs);
	if(queryString.length>0 && url.indexOf("?")==-1)
		url = url + "?" + queryString;
	else
		url = url + "&" + queryString;

	if(url.indexOf("//")>-1)
	{
		var oRegExp = new RegExp("//", "gi");
		url = url.replace(oRegExp,  "/");
	}
	
	this.XmlHttpRequest.open("POST", url, true);

	// Setup a callBack-function
	var thisCall = {req: this.XmlHttpRequest,
                callbackFunction: callbackFunction,
                callingContext: callingContext,
                responseIsXml: responseIsXml,
                url: url};
	this.XmlHttpRequest.onreadystatechange = function() { onResponseStateChange(thisCall); }

	// Open a connection to the server
    this.XmlHttpRequest.setRequestHeader('Content-Type',  bodyType);
    // Send the request
    this.XmlHttpRequest.send(body);
}

function _Get( url, queryStringArgs, callbackFunction, callingContext, responseIsXml ) 
{
	// Build the querystring
	queryString = buildQueryString(queryStringArgs);
	if(queryString.length>0 && url.indexOf("?")==-1)
		url = url + "?" + queryString;
	else
		url = url + "&" + queryString;

	// Open a connection to the server
	this.XmlHttpRequest.open("GET", url, true);

	// Setup a callBack-function
	 var thisCall = {req: this.XmlHttpRequest,
                callbackFunction: callbackFunction,
                callingContext: callingContext,
                responseIsXml: responseIsXml,
                url: url};
	this.XmlHttpRequest.onreadystatechange = function() { onResponseStateChange(thisCall); }

	// Send the request
	this.XmlHttpRequest.send(null);
	return;
}



function buildQueryString(arr)
{	
	var queryString = "&nc="+new Date().getTime();
		
	for( key in arr ) {
        var value = arr[key];
		queryString += '&' + key + '=' + encodeURIComponent(value);
	}
	return (queryString.length > 0) ? queryString.substring(1): queryString;
}

// CROSS BROWSER creation of XmlHttp-object
function getXMLHttpRequest()
{
	var xmlHttp = null;
	var clsids = ["Msxml2.XMLHTTP.6.0","Msxml2.XMLHTTP.5.0","Msxml2.XMLHTTP.4.0","Msxml2.XMLHTTP.3.0","Msxml2.XMLHTTP.2.6","Microsoft.XMLHTTP.1.0","Microsoft.XMLHTTP.1","Microsoft.XMLHTTP"];
	// Firefox and others: if we didn't get any with above we try with XmlHttpRequest.
	if (typeof XMLHttpRequest!='undefined') 
		xmlHttp = new XMLHttpRequest();
	else{
		for(var i=0; i<clsids.length && xmlHttp == null; i++) 
		{
			xmlHttp = getXmlHttpObj(clsids[i]);
			if(xmlHttp!=null)
				break;
		}
	}


	return xmlHttp;
}


// try-and-catch creation of object
function getXmlHttpObj(clsid) 
{
	var xmlHttp = null;
	try {
		xmlHttp = new ActiveXObject(clsid);
		return xmlHttp;
	} catch(ex) {}
}
