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

function toggle_menu(image,id) {
	var srcs	= new Array('/images/icon_arrow_down.gif','/images/icon_arrow_up.gif');
	var src		= image.getAttribute('src');

	image.setAttribute('src',(src == srcs[0])?srcs[1]:srcs[0]);
	toggle(id);
	}

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 significantdigits(amount,2);
	}

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

	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;
	}

