//crossbrowser instance of XMLHttpRequest
function XMLHttp() {
	try { result = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { try { result = new ActiveXObject("MSXML2.ServerXMLHTTP"); } catch (err) { result = null; } }
	if(!result && typeof XMLHttpRequest != "undefined") result = new XMLHttpRequest();
	if (!result) return null; else return result;
}

function urlencode(something) {
	return encodeURIComponent(something);
}

function __uniqueUrl(url) {
	var time = new Date().getTime();
	return (url.indexOf('?') !== -1) ? url + '&rndval='+time.toString() : url + '?rndval='+time.toString();
}

Array.prototype.addPOST = function(name, value) {
	if (name.length == 0) return;
	var data = urlencode(name).concat('=').concat(urlencode(value));
	this.push(data);
};

function $_GET(url, callback) {
	var targetURL = url;
	var callbackFunction = callback ? callback : null;
	var syncMode = callbackFunction !== null ? false : true;
	
	var HTTP = XMLHttp();
	
	if (callbackFunction) {
		HTTP.onreadystatechange = function() {
			if (HTTP.readyState == 4) {
				if (HTTP.status == 200) {
					callbackFunction(HTTP.responseText);
				} else {
					callbackFunction(null);
				}
			}
		};
	}
	
	if (!syncMode) {
		HTTP.open('GET', __uniqueUrl(targetURL), true);
		HTTP.send(null);
		return HTTP;
	} else {
		HTTP.open('GET', __uniqueUrl(targetURL), false);
		HTTP.send(null);
		return HTTP.status == 200 ? HTTP.responseText : null;
	}
}

function $_POST(url, params, callback) {
	var targetURL = url;
	var callbackFunction = callback ? callback : null;
	var syncMode = callbackFunction !== null ? false : true;
	
	var HTTP = XMLHttp();
	
	if (callbackFunction) {
		HTTP.onreadystatechange = function() {
			if ((HTTP.readyState == 4)) {
				if (HTTP.status == 200) {
					callbackFunction(HTTP.responseText);
				} else {
					callbackFunction(null);
				}
			}
		};
	}
	if (params) {
		var p = params.join('&');
	} else { var p = ''; }
	
	if (!syncMode) {
		HTTP.open('POST', targetURL, true);
		HTTP.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		HTTP.send(p);
		return HTTP;
	} else {
		HTTP.open('POST', targetURL, false);
		HTTP.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
		HTTP.send(p);
		return HTTP.status == 200 ? HTTP.responseText : null;
	}
}

function $_JSON_POST(url, params) {
	var buffer = $_POST(url, params, null);
	return (buffer === null) ? null : json_parse(buffer);
}

function $_JSON_GET(url) {
	var buffer = $_GET(url, null);
	return (buffer === null) ? null : json_parse(buffer);
}