function $(id)
{
	return document.getElementById(id);
}

function forEach(array, action)
{
	for (var i = 0; i < array.length; ++i)
		if (action(array[i], i))
			break;
}

function toArray(list)
{
	result = [];
	for (var i = 0; i < list.length; ++i)
		result.push(list[i]);
	return result;
}

function hasWord(sentence, word)
{
	return (" " + sentence + " ").indexOf(" " + word + " ") != -1;
}

function hasClass(elt, cls)
{
	return hasWord(elt.className, cls);
}

function addClass(elt, cls)
{
	elt.className += (elt.className ? " " : "") + cls;
}

function removeClass(elt, cls)
{
	var reg = new RegExp(" ?" + cls + "\\b|\\b" + cls + " ?");
	elt.className = elt.className.replace(reg, "");
}

function addChildClass(elt, cls)
{
	var list = elt.childNodes;
	for (var i = 0; i < list.length; ++i)
		if (list[i].nodeType == 1)
			addClass(list[i], cls);
}

function removeChildClass(elt, cls)
{
	var list = elt.childNodes;
	for (var i = 0; i < list.length; ++i)
		if (list[i].nodeType == 1)
			removeClass(list[i], cls);
}

function getElementsByClass(cls, node, tag)
{
	if (node == null)
		node = document;
	if (tag == null)
		tag = "*";
	var result = [];
	var list = node.getElementsByTagName(tag);
	for (var i = 0; i < list.length; ++i)
		if (hasClass(list[i], cls))
			result.push(list[i]);
	return result;
}

function eventSrc(e)
{
	var elt = e.target;
	if (!elt)
		elt = e.srcElement;
	return elt;
}

function eventCoords(e)
{
	if (document.all) // IE
		return new Array(e.clientX + document.documentElement.scrollLeft, e.clientY + document.documentElement.scrollTop);
	else // Mozilla
		return new Array(e.pageX, e.pageY);
}

function addEvent(elt, evt, fn)
{
	if (elt.addEventListener)
		elt.addEventListener(evt, fn, false);
	else if (elt.attachEvent)
		elt.attachEvent("on" + evt, fn);
	else
		elt["on" + evt] = fn; // Doesn't stack.
}

function removeEvent(elt, evt, fn)
{
	if (elt.addEventListener)
		elt.removeEventListener(evt, fn, false);
	else if (elt.attachEvent)
		elt.detachEvent("on" + evt, fn);
	else
		elt["on" + evt] = undefined;
}

function setImage(e, src)
{
	eventSrc(e).src = src;
	return true;
}

function alternateTableRows()
{
	var tables = document.getElementsByTagName("table");
	for (var i = 0; i < tables.length; ++i)
	{
		var even = true;
		var bodies = tables[i].getElementsByTagName("tbody");
		for (var j = 0; j < bodies.length; ++j)
		{
			var rows = bodies[j].getElementsByTagName("tr");
			for (var k = 0; k < rows.length; ++k)
				addClass(rows[k], (even = !even) ? 'odd' : 'even')
		}
	}
}

function confirmDelete(what)
{
	return confirm('Are you sure you want to delete this ' + what + '?');
}

function inputField(e, name, text, initial)
{
	var result = prompt(text, initial == null ? '' : initial);
	if (result == null || result == '')
		return false;
	var elt = eventSrc(e);
	location.href = elt.href + '&' + name + '=' + encodeURIComponent(result);
	return false;
}
