window.$ = function (id)
{
	if (typeof(id) == "string")
		return this.document.getElementById(id);
	else
		return id;
}

if (document.defaultView && document.defaultView.getComputedStyle)
	window.$get_style = function (obj, rule)
	{
		return document.defaultView.getComputedStyle(obj, "").getPropertyValue(rule);
	};
else
	window.$get_style = function (obj, rule)
	{
		var uc_prop = function (match, m1)
		{
			return m1.toUpperCase();
		};

		if ("currentStyle" in obj && obj.currentStyle)
		{
			rule = rule.replace(/\-([a-z])/g, uc_prop);
			if (rule in obj.currentStyle)
				return obj.currentStyle[rule];
		}

		return false;
	};

window.$get_style_num = function (obj, rule)
{
	var v = $get_style(obj, rule);
	if (typeof(v) == "string")
		v = v.replace(/px/g, "");
	else
		v = "";

	if (v == "")
		return 0;
	else if (!isNaN(parseInt(v, 10)))
		return parseInt(v, 10);
	else
		return Number(v);
};

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 xml_find_children(xml, name)
{
	var list = [];

	for (var i = 0; i < xml.childNodes.length; i++)
	{
		if (xml.childNodes[i].nodeName == name)
			list[list.length] = xml.childNodes[i];
	}

	return list;
}

function html_escape(text)
{
	text = text.replace(/&/g, '&amp;');
	text = text.replace(/"/g, '&quot;');
	text = text.replace(/</g, '&lt;');
	text = text.replace(/>/g, '&gt;');

	return text;
}

function event_queue(type, f)
{
	obj_event_queue(window, type, f);
}

function obj_event_queue(o, type, f)
{
	var typeQueue = type + "Queue";

	if (typeof(o[typeQueue]) == "undefined")
	{
		o[typeQueue] = [];
		if (o[type])
			obj_event_queue(o, type, o[type]);

		o[type] = function (ev)
		{
			if (!ev && "event" in window)
				ev = window.event;

			for (var i = o[typeQueue].length - 1; i >= 0; i--)
			{
				o.eventQueueCurrent = o[typeQueue][i];
				if (o.eventQueueCurrent)
					o.eventQueueCurrent(ev);
			}

			o.eventQueueCurrent = null;
		}
	}

	o[typeQueue][o[typeQueue].length] = f;
}
