function preSubmit(event)
{
	event = event || window.event;

	var srcElement = event.target || event.srcElement;

	//
	//	Netscape trick
	//
	form = srcElement.form || srcElement;

	var elem, error;

	//
	//	check (checkbox|radio)group
	//
	var checkGroup = function(name)
	{
		var options = form.elements[name];
		var error = true;

		for (var i = 0; i < options.length; i++)
		{
			error &= !options[i].checked;
		}

		return error;
	}
	
	//
	//	walk through form elements
	//
	for (i = 0; i < form.length; i++)
	{
		elem  = form.elements[i];
		value = elem.value;

		//
		//	skip non-required fields
		//
		if (!elem.getAttribute("required"))
		{
			continue;
		}

		switch (elem.type)
		{
			case "checkbox":
			error = elem.name.match(/\[\]$/) ? checkGroup(elem.name) : !elem.checked;
			break;

			case "select-one":
			error = elem.selectedIndex == 0;
			break;

			case "radio":
			error = checkGroup(elem.name);
			break;

			case "submit":
			error = false;
			break;

			default:
			error = !value.match(/\S/);
		}
		

		if (error)
		{
			alert(messageCommon);
			elem.focus();
			return false;
		}

		//
		//	validate "email" fields
		//
		if (elem.className == "email" && !elem.value.match(/^[a-z0-9\.\-_\+]+@[a-z0-9\-_]+\.([a-z0-9\-_]+\.)*?[a-z]+$/i))
		{
			alert(messageEmail);
			elem.focus();
			return false;
		}
	}

	return true;
}