/*globals ActiveXObject */
var XMLHttpFactories = [
	function () {return new XMLHttpRequest();},
	function () {return new ActiveXObject("Msxml2.XMLHTTP");},
	function () {return new ActiveXObject("Msxml3.XMLHTTP");},
	function () {return new ActiveXObject("Microsoft.XMLHTTP");}
];

function createXMLHTTPObject() {
	var xmlhttp = false;
	for (var i=0;i<XMLHttpFactories.length;i++) {
		try {
			xmlhttp = XMLHttpFactories[i]();
		}
		catch (e) {
			alert(e);
			continue;
		}
		break;
	}
	return xmlhttp;
}

function sendRequest(url,callback,async,postData) {
	if(typeof(async) == 'undefined') {
		async = true;
	}

	var req = createXMLHTTPObject();

	if (!req) {
		return;
	}

	var method = (postData) ? "POST" : "GET";
	req.open(method,url,async);
	req.setRequestHeader('User-Agent','XMLHTTP/1.0');
	if (postData !== null) {
		req.setRequestHeader('Content-type','application/x-www-form-urlencoded');
	}

	req.onreadystatechange = function () {
		if (req.readyState !== 4) {
			return;
		}

		if (req.status !== 200 && req.status !== 304) {
			alert('HTTP error ' + req.status);
			return;
		}
		callback(req);
	};

	if (req.readyState === 4) {
		return;
	}

	req.send(postData);

	//if we're using synchronous mode then we need to manually call the callback function
	if(async === false) {
		callback(req);
	}

	return;
}
