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



//	disable all elements in a form.
//
function form_disable(o_form)
{
	for (var i = 0; i < o_form.elements.length; i++)
	{
		o_form.elements[i].disabled = true;
	}
}



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



//	enable all elements in a form.
//
function form_enable(o_form)
{
	for (var i = 0; i < o_form.elements.length; i++)
	{
		o_form.elements[i].disabled = false;
	}
}



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



//	populate a select list, and select the current option.
//
function form_select_populate(o_element, a_options, m_selected)
{
	var select_title = o_element.options[0];
	o_element.length = 0;
	o_element.options[0] = select_title;

	for (var i = 0; i < a_options.length; i++) {
		var m_value = a_options[i]['value'];

		// set new option.
		o_element.options[i + 1] = new Option(a_options[i]['description'], m_value);

		//	select current project.
		if (m_value == m_selected) {
			o_element.options[i + 1].selected = true;
		}
	}
}



//	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();
	}
}



//	replace newline characters with <br /> tags.
function linebreaksbr(s_subject)
{
	var o_re = new RegExp('(\r\n|\r|\n)', 'g');
	return s_subject.replace(o_re, '<br />$1');
}



//	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, s_options)
{
	//	add options with default.
	//
	if (typeof s_options != 'string')
	{
		s_options = 'scrollbars,status';
	}

	var timestamp = new Date();

	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(), 'width=' + i_width + ',height=' + i_height + ',left=' + i_left + ',top=' + i_top + ',' + s_options);

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



//	intelligent image rollover with preload.
//
function rollover_preload()
{
	a_preloaded_images = Array();

	var a_images = document.getElementsByTagName('img');
	var o_re = new RegExp('([^a-z])off((-trans)?.[a-z]+)$');

	for (var i = 0; i < a_images.length; i++)
	{
		var o_image = a_images[i];

		//	does the image have an 'over' state?
		//
		if (o_re.test(o_image.src))
		{
			// add onmouseout and onmouseover events.
			//
			eval('o_image.onmouseout = function() { this.src = "' + o_image.src + '"; };');
			eval('o_image.onmouseover = function() { this.src = "' + o_image.src.replace(o_re, '$1over$2') + '"; };');

			// preload the image.
			//
			a_preloaded_images[a_preloaded_images.length] = new Image;
			a_preloaded_images[a_preloaded_images.length - 1].src = o_image.src.replace(o_re, '$1over$2');
		}
	}
}



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



//	automatically add rollover_preload() to window.onload.
//
onload_add(function(){ rollover_preload(); });
