function jsonRequest(url, callback, errCallback, dontParse)
{
	var xmlHttp;
	var debug = true;

	if (debug) { window.status = "Initializing XMLHttp object..."; }

	// function: Firefox, Opera; object: Safari
	if ((typeof window.XMLHttpRequest === "function") || (typeof window.XMLHttpRequest === "object"))
	{
		try
		{
			xmlHttp = new XMLHttpRequest();
		}
		catch (e)
		{
			if (debug) { window.status = "Error while initializing XMLHttpRequest object."; }
			errCallback({ "url":url, "msg":"Error while initializing XMLHttpRequest object.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
			return false;
		}
	}
	else
	{
		if (debug) { window.status = "Initializing Microsoft XML HTTP component..."; }

		var progIDs = ["MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
		for (var i = 0; i < progIDs.length; i++)
		{
			try
			{
				xmlHttp = new ActiveXObject(progIDs[i]);
				break;
			}
			catch (e) {}
		}
		if (!xmlHttp)
		{
			if (debug) { window.status = "No XML HTTP component found."; }
			errCallback({ "url":url, "msg":"No XML HTTP component found.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
			return false;
		}
	}

	try
	{
		if (xmlHttp.overrideMimeType === "function")
		{
			xmlHttp.overrideMimeType("text/json");
		}
	}
	catch (e) {}

	try
	{
		if (debug) { window.status = "Setting JSON processing function..."; }

		xmlHttp.onreadystatechange = function()
		{
			if (debug)
			{
				try
				{
					window.status = "Ready state changed to " + [
						"'unsent'",
						"'opened'",
						"'headers_received' (status: " + xmlHttp.status + ")",
						"'loading' (status: " + xmlHttp.status + "; " + xmlHttp.responseText.length + " bytes transfered)",
						"'done' (status: " + xmlHttp.status + "; "+ xmlHttp.responseText.length + " bytes transfered)"
					][xmlHttp.readyState] + "...";
				}
				catch (e) { /* Unknown error in IE */ }
			}

			if (xmlHttp.readyState === 4)
			{
				switch (xmlHttp.status)
				{
					case 200:
						if (!dontParse)
						{
							if (debug) { window.status = "Parsing the JSON response (native)..."; }
							try
							{
								if ((typeof JSON === "object") && (typeof JSON.parse === "function"))
								{
									var jsObj = JSON.parse(xmlHttp.responseText);
								}
								else
								{
									throw new TypeError('JSON.parse');
								}
							}
							catch (e)
							{
								if (debug) { window.status = "Parsing the JSON response (eval())..."; }
								try
								{
									var jsObj = eval("(" + xmlHttp.responseText + ")");
								}
								catch (e)
								{
									if (debug) { window.status = "Server returned invalid data."; }
									errCallback({ "url":url, "msg":"Server returned invalid data.", "constructor":e.name, "sys_msg":e.message, "responseText":xmlHttp.responseText });
									break;
								}
							}
						}
						else
						{
							try
								{
									var jsObj = xmlHttp.responseText;
								}
								catch (e)
								{
									if (debug) { window.status = "Server returned invalid data."; }
									errCallback({ "url":url, "msg":"Server returned invalid data.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
									break;
								}
						}

						if (debug) { window.status = "Processing server response..."; }
						try
						{
							callback(jsObj);
						}
						catch (e)
						{
								if (debug) { window.status = "Error while processing the server response."; }
								errCallback({ "url":url, "msg":"Error while processing the server response.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
								break;
						}
						if (debug) { window.status = "Server response successful processed..."; }
						break;

					// IE specific status codes
					case 12029:
					case 12030:
					case 12031:
					case 12152:
					case 12159:
						jsonRequest(url, callback);
						break;

					case 0:
						break;

					default:
						if(xmlHttp.status)
						{
							if (debug) { window.status = "Server returned status code " + xmlHttp.status; }
							errCallback({ "url":url, "msg":"Server returned status code " + xmlHttp.status + (xmlHttp.statusText ? " (" + xmlHttp.statusText + ")." : "."), "constructor":"", "sys_msg":"" });
						}
						else
						{
							if (debug) { window.status = "Status code not declared"; }
							errCallback({ "url":url, "msg":"Status code not declared " + (xmlHttp.statusText ? " (" + xmlHttp.statusText + ")." : "."), "constructor":"", "sys_msg":"" });
						}
				}

				delete abort;
				xmlHttp = null;
				if (debug) { window.status = ""; }
			}
		};
	}
	catch (e)
	{
		if (debug) { window.status = "Error while initializing onReadyStateChange."; }
		errCallback({ "url":url, "msg":"Error while initializing onReadyStateChange.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
		return false;
	}

	try
	{
		if (debug) { window.status = "Opening the XML Http request..."; }
		xmlHttp.open("GET", url, true);
		if (debug) { window.status = "Setting the XML Http request header..."; }
		xmlHttp.setRequestHeader("Connection", "close");
		if (debug) { window.status = "Sending the server request..."; }
		xmlHttp.send(null);
	}
	catch (e)
	{
		if (debug) { window.status = "Error sending the server request."; }
		errCallback({ "url":url, "msg":"Error sending the server request.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
		return false;
	}

	if (debug) { window.status = "Waiting for the server response..."; }
	// return true;
	return abort;

	function abort()
	{
		try
		{
			if (xmlHttp != null && typeof xmlHttp.abort === 'function')
			{
				if (debug) { window.status = "Aborting the server request..."; }
				xmlHttp.abort();
			}
			else if (debug)
			{
				window.status = "Aborting not possible...";
			}
		}
		catch (e)
		{
			if (debug) { window.status = "Error while aborting the server request."; }
			errCallback({ "url":url, "msg":"Error while aborting the server request.", "constructor":e.name, "sys_msg":e.message, "responseText":"" });
		}
	}
}