//	toggle an element's display style between block and none.
//
	function element_toggle_display(s_id)
	{
		element = document.getElementById(s_id);

		if (element.style.display != 'block')
		{
			element.style.display = 'block';
		}
		else
		{
			element.style.display = 'none';
		}
	}



//	clear all form elements except for hidden, buttons, and submit types.
//
	function form_clear(o_form)
	{
		for (var i = 0; i < o_form.elements.length; i++)
		{
			if (o_form.elements[i].type != 'button' && o_form.elements[i].type != 'hidden' && o_form.elements[i].type != 'submit')
			{
				o_form.elements[i].value = '';
			}

			if (o_form.elements[i].type == 'checkbox')
			{
				o_form.elements[i].checked = false;
			}

			if (o_form.elements[i].type == 'select-multiple')
			{
				for (var j = 0; j < o_form.elements[i].length; j++)
				{
					o_form.elements[i][j].selected = false;
				}
			}
		}
	}



//	set the specified day, month, week form elements.
//
	function form_date_set(i_day, i_month, i_year, s_prefix, s_form)
	{
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'day', i_day, s_form);
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'month', i_month, s_form);
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'year', i_year, s_form);
	}



//	unset the specified day, month, week form elements.
//
	function form_date_unset(s_form, s_prefix, s_form)
	{
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'day', '', s_form);
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'month', '', s_form);
		form_element_set((is_empty(s_prefix) ? null : s_prefix + '_') + 'year', '', s_form);
	}



//	focus a form element if it exists.
//
	function form_element_focus(s_form, s_element)
	{
		var i;

		if (is_empty(s_form))
		{
			for (i = 0; i < document.forms.length; i++)
			{
				if (document.forms[i] && document.forms[i].elements[s_element] && document.forms[i].elements[s_element].type != 'hidden' && document.forms[i].elements[s_element].style.display != 'none')
				{
					document.forms[i].elements[s_element].focus();

					if (document.forms[i].elements[s_element].type == 'input' || document.forms[i].elements[s_element].type == 'textarea')
					{
						document.forms[i].elements[s_element].select();
					}
				}
			}
		}
		else if (document.forms[s_form] && document.forms[s_form].elements[s_element] && document.forms[s_form].elements[s_element].type != 'hidden')
		{
			document.forms[s_form].elements[s_element].focus();

			if (document.forms[s_form].elements[s_element].type == 'input' || document.forms[s_form].elements[s_element].type == 'textarea')
			{
				document.forms[s_form].elements[s_element].select();
			}
		}
	}



//	get a form element's value, if it exists.
//
	function form_element_get(s_element, s_form)
	{
		var i;

		if (is_empty(s_form))
		{
			for (i = 0; i < document.forms.length; i++)
			{
				if (document.forms[i] && document.forms[i].elements[s_element])
				{
					return document.forms[i].elements[s_element].value;
				}
			}
		}
		else if (document.forms[s_form] && document.forms[s_form].elements[s_element])
		{
			return document.forms[s_form].elements[s_element].value;
		}
	}



//	set a form element's value, if it exists.
//
	function form_element_set(s_element, s_value, s_form)
	{
		var i;

		if (is_empty(s_form))
		{
			for (i = 0; i < document.forms.length; i++)
			{
				if (document.forms[i] && document.forms[i].elements[s_element])
				{
					document.forms[i].elements[s_element].value = s_value;
				}
			}
		}
		else if (document.forms[s_form] && document.forms[s_form].elements[s_element])
		{
			document.forms[s_form].elements[s_element].value = s_value;
		}
	}



//	does a group of check boxes contain a particular checked value?
//
	function form_in_checkboxes(o_element, m_value)
	{
		for (var i = 0; i < o_element.length; i++)
		{
			if (o_element[i].checked && o_element[i].value == m_value)
			{
				return true;
			}
		}

		return false;
	}



//	get the selected value from a group of radio buttons.
//
	function form_radio_get(o_element)
	{
		for (var i = 0; i < o_element.length; i++)
		{
			if (o_element[i].checked)
			{
				return o_element[i].value;
			}
		}

		return false;
	}



//	submit a form, if it exists.
//
	function form_submit(s_form)
	{
		if (is_empty(s_form))
		{
			s_form = 0;
		}

		if (document.forms[s_form])
		{
			document.forms[s_form].submit();
		}
	}



//	intelligent image rollover (off state).
//
	function image_out(o_image)
	{
		var s_ext = o_image.src.substr(o_image.src.lastIndexOf('.') + 1);
		o_image.src = o_image.src.replace(new RegExp('over.' + s_ext + '$'), 'off.' + s_ext);
	}



//	intelligent image rollover (over state).
//
	function image_over(o_image)
	{
		var s_ext = o_image.src.substr(o_image.src.lastIndexOf('.') + 1);
		o_image.src = o_image.src.replace(new RegExp('off.' + s_ext + '$'), 'over.' + s_ext);
	}



//	intelligent image preload.
//
	function image_preload(o_image)
	{
		var s_ext = o_image.src.substr(o_image.src.lastIndexOf('.') + 1);

		var o_image_over = new Image();
		o_image_over.src = o_image.src.replace(new RegExp('off.' + s_ext + '$'), 'over.' + s_ext);
	}



//	is a variable empty? e.g. a group of check boxes with nothing checked, a group
//	of radio buttons with nothing selected, false, null, or an empty string.
//
	function is_empty(m_value)
	{
		if (typeof m_value == 'undefined')
		{
			return true;
		}
		else if (m_value == null)
		{
			return true;
		}
		else if (typeof m_value == 'object')
		{
			for (var i = 0; i < m_value.length; i++)
			{
				if (m_value[i].checked == true)
				{
					return false;
				}
			}

			return true;
		}
		else
		{
			return (typeof m_value == 'boolean' && m_value == false) || (typeof m_value == 'string' && m_value.length == 0) || m_value == null ? true : false;
		}
	}



//	round a number the specified number of decimal places.
//
	function number_format(i_number, i_decimals)
	{
	//	round the number by multiplying by 10^(decimals+1)+5 and dropping the last digit.
	//
		i_number = Math.floor(i_number * Math.pow(10, i_decimals + 1) + (i_number < 0 ? -5 : +5));
		i_number = i_number.toString();
		i_number = i_number.substr(0, i_number.length - 1) / Math.pow(10, i_decimals);
		i_number = i_number.toString();

		if (i_decimals > 0)
		{
		//	add decimal.
		//
			if (!re_match('\\.\\d+?$', 'gim', i_number))
			{
				i_number += '.';
			}

		//	append trailing 0's.
		//
			while (!re_match('\\.\\d{' + i_decimals + '}$', 'gim', i_number))
			{
				i_number += '0';
			}
		}

	//	replace digit with digit-comma if it is followed by 3 digits and a non-digit or end-of-string, based on whether or not the number has a decimal place.
	//
		return re_replace('(\\d)(?=(\\d{3})+' + (re_match('\\.\\d+?$', 'gim', i_number) ? '\\D' : '$') + ')', 'gim', '$1,', i_number);
	}



//	add a function to the window.onload event handler.
//
	function onload_add(f_onload_new)
	{
		var f_onload_old = window.onload;

		if (typeof window.onload != 'function')
		{
			window.onload = f_onload_new;
		}
		else
		{
			window.onload = function()
			{
				f_onload_old();
				f_onload_new();
			}
		}
	}



//	open a popup window (centered). ensure a new window is opened every time by
//	appending the timestamp to the window name.
//
	function popup(s_url, i_width, i_height)
	{
	//	add options with default.
	//
		var i_left = (screen.width - i_width) / 2;
		var i_top = (screen.height - i_height) / 2;

		var o_window = window.open(s_url, 'popup' + timestamp.getHours() + timestamp.getMinutes() + timestamp.getSeconds(), 'scrollbars,status,width=' + i_width + ',height=' + i_height + ',left=' + i_left + ',top=' + i_top);
		o_window.focus();
	}



//	get the value of a query string variable.
//
	function querystring_get(s_variable)
	{
		var s_query = location.search.substring(1);
		var s_query = s_query.split('&');

		for (var i = 0; i < s_query.length; i++)
		{
			var s_key = s_query[i].substring(0, s_query[i].indexOf('='));
			var s_value = s_query[i].substring(s_query[i].indexOf('=') + 1);

			if (s_key.toUpperCase() == s_variable.toUpperCase())
			{
				return s_value;
			}
		}

		return null;
	}



//	does a regular expression match against a string?
//
	function re_match(s_pattern, s_flags, s_subject)
	{
		var o_re = new RegExp(s_pattern, s_flags);
		return o_re.test(s_subject);
	}



//	replace a matched regular expression in a string.
//
	function re_replace(s_pattern, s_flags, s_replacement, s_subject)
	{
		var o_re = new RegExp(s_pattern, s_flags);
		return s_subject.replace(o_re, s_replacement);
	}



//	split a string on a regular expression and return an array.
//
	function re_split(s_pattern, s_flags, s_subject)
	{
		var o_re = new RegExp(s_pattern, s_flags);
		return s_subject.split(o_re);
	}



//	clear the browser's status bar text.
//
	function status_out()
	{
		window.status = '';
	}



//	set the browser's status bar text.
//
	function status_over(s_message)
	{
		window.status = s_message;
	}

