

function swap(a, i, j)
{
	tmp = a[i];
	a[i] = a[j];
	a[j] = tmp;
}

function format(n, decimals)
{
	var i, d;
	
	n = String(Math.round(n * Math.pow(10, decimals)) * Math.pow(10, -decimals));
	
	d = n.indexOf(".");
	
	if (d == -1)
	{
		n += ".";
		for(i = 0; i < decimals; i++) n += "0";
		return n;
	}
	
	if (d == 0)
	{
		n = "0" + n;
		d++;
	}
	
	if (d == 1 && n.substring(0, 1) == "-")
	{
		n = "-0" + n.substring(1, n.length);
		d++;
	}
	
	n = n.substring(0, d + decimals + 1);
	
	while (n.length <= d + decimals) n += "0";
	return n;
}

function print_percent(n)
{
	if (isNaN(n)) return n;
	return format(n, 2) + "%";
}

function n0(n)
{
	return Math.round(n);
}

function n1(n)
{
	return format(n, 1);
}

function get_event_src(event)
{
	var src_elem;
	
	if (!event) event = window.event;
	src_elem = (event.currentTarget) ? event.currentTarget : event.srcElement;
	if (src_elem.nodeType == 3) src_elem = src_elem.parentNode;
	
	return src_elem;
}

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

function doc_create(elem_type)
{
	return document.createElement(elem_type);
}

function dbg(text)
{
	var elem;
	
	elem = document.createElement("P");
	elem.innerHTML = text;
	document.body.appendChild(elem);
}

function empty(v)
{
	var i, type;
	
	type = typeof(v);
	switch (type)
	{
		case ("string"): return (v.match(/^\s*$/gi) != null);
		case ("number"): return (v == 0);
		case ("boolean"): return !v;
		case ("undefined"): return true;
		case ("object"):
			for (i in v) return false;
			return true;
	}
	
	// some unknown type, return false
	return false;
}

function filicide(parent)
{
	while (parent.childNodes.length > 0) parent.removeChild(parent.childNodes[0]);
}

function add_class(elem, class_name)
{
	var classes, i;
	
	classes = (typeof(class_name) == "object") ? class_name : [class_name];
	for (i = 0; class_name = classes[i]; ++i)
	{
		if (empty(elem.className)) elem.className = class_name;
		else elem.className += " "+class_name;
	}
}

function safe_divide(x, y)
{
	return ((y == 0) ? 0 : (x / y));
}

function obj_to_str(o)
{
	var s, i;
	
	s = "";
	for (i in o)
		s += i+"="+o[i]+"<br />\n";
	return s;
}

function obj_copy(o)
{
	var clone, i;
	
	clone = {};
	for (i in o)
		clone[i] = o[i];
	return clone;
}

function remove_class(elem, class_name)
{
	var re;
	
	re = new RegExp("(\\s|)"+class_name);
	elem.className = elem.className.replace(re, "");
}

function replace_class(elem, old_class, new_class)
{
	var re;
	
	re = new RegExp("(\\s|)"+old_class);
	elem.className = elem.className.replace(re, "\1"+new_class);
}

function has_class(elem, class_test)
{
	var re;
	
	re = new RegExp("\\b"+class_test+"\\b");
	return (elem.className && re.test(elem.className));
}

function add_onload_func(new_func)
{
	var cur_func;
	
	cur_func = window.onload;
	window.onload = function() {
		if (cur_func) cur_func();
		new_func();
	}
}

