function setValid(field)
{
	var v;

	if ((field.getAttribute('val')) && (v = document.getElementById(field.getAttribute('val'))))
		v.style.display = "none";
	else
	{
		field.style.backgroundColor = "#ffffff";
		field.style.color = "#000000";
	}
}

function setInvalid(field)
{
	var v;

	if ((field.getAttribute('val')) && (v = document.getElementById(field.getAttribute('val'))))
	{
		v.style.display = "";
		v.style.backgroundColor = "#cc0000";
		v.style.color = "#ffffff";
		v.style.fontWeight = "bold";
	}
	else
	{
		field.style.backgroundColor = "#cc0000";
		field.style.color = "#ffffff";
	}
}

function doValidate(frm)
{
	var inputs = frm.getElementsByTagName("INPUT");
	var textareas = frm.getElementsByTagName("TEXTAREA");
	var selects = frm.getElementsByTagName("SELECT");
	var secinputs;
	var classes, types, t, r;
	var matchfield;
	var result = true;
	var found;
	var i, j, k;

	try {
	secinputs = [];
	for (i=0; i<inputs.length; i++)
		secinputs.push(inputs[i]);

	for (i=0; i<textareas.length; i++)
		secinputs.push(textareas[i]);

	inputs = secinputs;

	// First initialize fields
	for (i=0; i<selects.length; i++)
	{
		if ((selects[i].className) && ("" != selects[i].className))
		{
			classes = selects[i].className.split(" ");
			for (j=0; j<classes.length; j++)
			{
				types = classes[j].split(":");

				switch(types[0].toLowerCase())
				{
					case "v_required":
					case "v_custom":
						setValid(selects[i]);
						break;
					default:
						break;
				}
			}
		}
	}

	for (i=0; i<inputs.length; i++)
	{
		if ((inputs[i].className) && ("" != inputs[i].className))
		{
			classes = inputs[i].className.split(" ");
			for (j=0; j<classes.length; j++)
			{
				types = classes[j].split(":");

				switch(types[0].toLowerCase())
				{
					case "v_required":
					case "v_minlength":
					case "v_numeric":
					case "v_integer":
					case "v_email":
					case "v_custom":
						setValid(inputs[i]);
						break;
					case "v_match":
						eval("matchfield = frm." + types[1]);
						setValid(inputs[i]);
						setValid(matchfield);
						break;
					default:
						break;
				}
			}
		}
	}

	for (i=0; i<selects.length; i++)
	{
		if ((selects[i].className) && ("" != selects[i].className))
		{
			classes = selects[i].className.split(" ");
			for (j=0; j<classes.length; j++)
			{
				types = classes[j].split(":");

				switch(types[0].toLowerCase())
				{
					case "v_required":
						if ("" == selects[i].options[selects[i].selectedIndex].value)
						{
							result = false;
							setInvalid(selects[i]);
						}
						break;
					case "v_custom":
						function v_custom_select_parm() { return selects[i]; }

						r = eval(String(types[1]) + "(v_custom_select_parm())");
						if (!r)
						{
							result = false;
							setInvalid(selects[i]);
						}
						break;
					default:
						break;
				}
			}
		}
	}

	for (i=0; i<inputs.length; i++)
	{
		if ((inputs[i].className) && ("" != inputs[i].className))
		{
			classes = inputs[i].className.split(" ");
			for (j=0; j<classes.length; j++)
			{
				types = classes[j].split(":");

				switch(types[0].toLowerCase())
				{
					case "v_required":
						if (inputs[i].type)
							t = inputs[i].type.toLowerCase();
						else
							t = "";

						switch (t)
						{
							case "radio":
								eval("secinputs = frm." + inputs[i].name);
								found = false;
								for (k=0; k<secinputs.length; k++)
								{
									if (secinputs[k].checked)
									{
										found = true;
										break;
									}
								}
								if (!found)
								{
									result = false;
									setInvalid(inputs[i]);
								}
								break;
							case "checkbox":
								if (!inputs[i].checked)
								{
									result = false;
									setInvalid(inputs[i]);
								}
								break;
							default:
								if ("" == inputs[i].value)
								{
									result = false;
									setInvalid(inputs[i]);
								}
								break;
						}
						break;
					case "v_minlength":
						if (types[1])
						{
							if (inputs[i].value.length < Number(types[1]))
							{
								result = false;
								setInvalid(inputs[i]);
							}
						}
						else
						{
							result = false;
							setInvalid(inputs[i]);
						}
						break;
					case "v_numeric":
						if (String(parseFloat(inputs[i].value)) != inputs[i].value)
						{
							result = false;
							setInvalid(inputs[i]);
						}
						break;
					case "v_integer":
						if (String(parseInt(inputs[i].value)) != inputs[i].value)
						{
							result = false;
							setInvalid(inputs[i]);
						}
						break;
					case "v_match":
						eval("matchfield = frm." + types[1]);
						if (inputs[i].value != matchfield.value)
						{
							result = false;
							setInvalid(inputs[i]);
							setInvalid(matchfield);
						}
						break;
					case "v_email":
						r = /^[-_.a-z0-9]+@(([-_a-z0-9]+\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5])))$/i;
						if (!r.test(inputs[i].value))
						{
							result = false;
							setInvalid(inputs[i]);
						}
						break;
					case "v_custom":
						function v_custom_parm() { return inputs[i]; }

						r = eval(String(types[1]) + "(v_custom_parm())");
						if (!r)
						{
							result = false;
							setInvalid(inputs[i]);
						}
						break;
					default:
						break;
				}
			}
		}
	}
	} catch(err)
	{
		alert(err);
		return false;
	}

	return result;
}