function toggle(id) {
	with(document.getElementById(id).style)
		display = (display=='none') ? 'inline':'none';
	}

function toggle_graphic(id) {
	with(document.getElementById(id+'_graphic'))
		src = (preg_match(/off.png$/,src)) ? '/images/toggle_on.png':'/images/toggle_off.png';

	with(document.getElementById(id).style)
		display = (display=='none') ? 'inline':'none';
	}

function preg_match(expression,string) {
	var regex = new RegExp(expression);
	return regex.test(string);
	}

function ajax(url,target,synchronous,nospinner) {
	var done		= 4;
	var ok			= 200;
	var method		= 'GET';
	var target_type	= typeof(target);
	var request		= new XMLHttpRequest();

	if(synchronous === undefined)	synchronous = false;
	if(nospinner === undefined)		nospinner = false;

	if(target_type == 'string' && !nospinner) document.getElementById(target).innerHTML = "<table border='0' width='100%' height='100%'><tr><td align='center'><img src='/images/spinner.gif'></td></tr></table>";

	request.open(method, url, !synchronous);
	if(!synchronous) {
		request.onreadystatechange = function() {
			if(request.readyState == done && request.status == ok) {
				switch(target_type) {
					case('string'):
						document.getElementById(target).innerHTML = request.responseText;
						break;
					case('function'):
					default:
						target(request.responseText);
						break;
						//alert("I don't know what to do with target type '"+target_type+"'..."); //<-- MSIE's calling functions objects, so...
					}
				}
			}
		}
	request.send(null);
	if(synchronous) {
		// Yes, this is defined in two places. Live with it.
		switch(target_type) {
			case('string'):
				document.getElementById(target).innerHTML = request.responseText;
				break;
			case('function'):
				target(request.responseText);
				break;
			default:
				alert("I don't know what to do with target type '"+target_type+"'...");
			}
		// .
		}
	}

function money(amount) {
	return commas(significantdigits(amount,2));
	}

function commas(number) {
	// Don't look at me, I'm hideous!
	var width		= 3;
	var string		= number.toString();
	var dot			= string.indexOf('.');
	var units		= string;
	var decimals	= '';
	var final		= '';
	if(dot !== false) {
		decimals	= string.substr(dot+1);
		units		= string.substr(0,dot);
		}
	var chunks = Math.ceil(units.length/width);
	for(var i = 1; i<chunks; i++) {
		final = units.substr(-(i*width),width) + ((final)?',' + final:'');
		}
	var remaining = units.length - (width * (chunks - 1));
	if(remaining) final = units.substr(0,remaining) + ((final)?',' + final:'');
	if(decimals) final += '.' + decimals;

	return final;
	}
 
function significantdigits(value,precision) {
	value			= parseFloat(value);
	var	multiplier	= Math.pow(10,precision);
	var left		= parseInt(value/1);
	var pre			= Math.round((value*multiplier)%multiplier);
	var right		= parseInt(pre);

	// Gross...
	var padding = '';
	for(var n=1; n<precision; n++)
		if(right < Math.pow(10,n)) padding += '0';
	right = padding + right;
	// .

	return left + '.' + right;
	}

function json(url) {
	var results 	= new Array();
	var callback	= arguments[1];

	$.ajax({
		'url':		url,
		'async':	((callback)?true:false),
		'dataType': 'json',
		'success':	((callback)?callback:function(data) { results = data; })
		});

	return results;
	}

function inarray(needle,haystack) {
	for(var i in haystack)
		if(haystack[i] == needle) return true;

	return false;
	}

function ucfirst(string) {
	return string.substr(0,1).toUpperCase() + string.substr(1);
	}

var examine_counter = 0;
function examine(object) {
	var html	= '';
	var indent	= 10;

	if(object === null) return '<i>null</i>';
	switch(typeof(object)) {
		case('undefined'):
			return '<i>undefined</i>';
			break;
		case('boolean'):
			return '<i>' + ((object) ? 'true' : 'false') + '</i>';
			break;
		case('number'):
		case('string'):
			html = object;
			break;
		default:
			type	= 'Object';
			id 		= 'examine_'+(examine_counter++);
			count	= 0;
			for(key in object) ++count;

			html += "<a href=\"javascript:toggle('" + id + "');\">" + type + "</a> (" + count + ")<br>";
			html += "<div id='" + id + "' style='display: none;'><table border='0'>";
			for(key in object) {
				html += "<tr><td width='" + indent + "'></td><td class='label' valign='top'>" + key + "</td><td>";
				html += examine(object[key]);
				html += "</td></tr>";
				}
			html += "</table></div>";
		}

	if(target = arguments[1]) document.getElementById(target).innerHTML = html;
	return html;
	}

