if (!window.XMLHttpRequest && window.ActiveXObject)
	window.XMLHttpRequest = function ()
	{
		return new ActiveXObject(navigator.userAgent.indexOf("MSIE 5") != -1 ? "Microsoft.XMLHTTP" : "MSXML2.XMLHTTP");
	};

function http_get(uri, cb, fail)
{
	if (!fail)
		fail = function (reason)
		{
		}
	if (!window.XMLHttpRequest)
		fail(false);

	var request = new XMLHttpRequest();
	request.open("GET", uri);

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

		if (request.status == 200)
			cb(request);
		else
			fail(request);
	}

	request.send(null);
}

function http_post(uri, data, cb, fail)
{
	if (!fail)
		fail = function (reason)
		{
		}
	if (!window.XMLHttpRequest)
		fail(false);

	var request = new XMLHttpRequest();

	request.open("POST", uri);
	if (typeof(request.setRequestHeader) != "undefined")
		request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

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

		if (request.status == 200)
			cb(request);
		else
			fail(request);
	}

	request.send(data);
}

function xml_text_content(node)
{
	if (node.nodeType == 3)
		return node.nodeValue;

	var val = "";

	for (var i = 0; i < node.childNodes.length; i++)
	{
		if (node.childNodes[i].nodeType == 3)
			val += node.childNodes[i].nodeValue;
		else if (node.childNodes[i].nodeType == 1)
			val += xml_text_content(node.childNodes[i]);
	}

	return val;
}

function xml_first_child(xml, name)
{
	for (var i = 0; i < xml.childNodes.length; i++)
	{
		if (xml.childNodes[i].nodeName == name)
			return xml.childNodes[i];
	}

	return false;
}

function escape_html(text)
{
	text = text.replace(/"/g, '&quot;');
	text = text.replace(/&/g, '&amp;');
	text = text.replace(/</g, '&lt;');
	text = text.replace(/>/g, '&gt;');

	return text;
}