// ========== REQUEST ====================================================================================================

var Request = new Object();

Request.send = function(url, method, callback, data, urlencoded, name) {
	var req;

	if (window.XMLHttpRequest)
	{
		req = new XMLHttpRequest();
	}
	else if (window.ActiveXObject)
	{
		req = new ActiveXObject("Microsoft.XMLHTTP");
	}

	if (typeof name == "undefined")
		name = "";
	else
		name += "\n";

	var readychange = function()
	{
		if(req.readyState == 4) // loaded
		{
			if (req.status < 400) // ok
			{
				if (method=="POST")
				{
					callback(req);
					delete callback;
					delete req;
				}
				else
				{
					callback(req,data);
					delete callback;
					delete req;
				}
			}
			else if (typeof req == "undefined" || typeof req.status == "undefined")
			{
				// don't do anything. user has navigated away
				delete callback;
			}
			else if (req.status == 401)
			{	// unauthorized
				callback(req);
				delete callback;
			}
			else if (req.status == 404)
			{
				// should not happen, but ignore it for now
			}
			else
			{
				//if (App.errorShowing) return false;
				//App.errorShowing = true;
				switch(req.status)
				{
					// windows error codes
					case 12002: // server timeout
					case 12029: case 12030: case 12031: // dropped connection
					case 12152: // connection closed by server
					case 13030:
						//log(name + "There was a network problem. Please reload the page.");
						break;
					case 500: case 503:
						//log(name + "There was an internal server error. Please try later.");
						break;
					default:
						//log("There was a problem loading data:" + "\nstatus: " + req.status+ "/" + req.statusText + "\n" + url);
				//App.errorShowing = false;
				}
				delete callback;
			}
		}
	};

	function do_request()
	{
		if (method=="POST")
		{
			req.open("POST", url, true);
			if (urlencoded) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			req.onreadystatechange = readychange;
			req.send(data);
		}
		else
		{
			req.open("GET", url, true);
			req.onreadystatechange = readychange;
			req.send(null);
		}
	};

	do_request();

	//req = null;

}

Request.sendRawPOST = function(url, data, callback, name) {
	Request.send(url, "POST", callback, data, false, name);
}
Request.sendPOST = function(url, data, callback, name) {
	Request.send(url, "POST", callback, data, true, name);
}
Request.sendGET = function(url, callback, args, name) {
	Request.send(url, "GET", callback, args, name);
}