
function validateFields(frm, fields)
{
  if(typeof tinyMCE != "undefined") tinyMCE.triggerSave();
	var f, o, s = "", radios = new Array();
	for (var i = 0; i < frm.elements.length; i++)
  {
  	o = frm.elements[i];
  	if((f = fields[o.name]) && (fields[o.name].length <= 5 || checkIf()))
  	{
  		if(f[0] == "email")
  		{
  			if(!validate() || !validate("email")) continue;
  		}
  		else if(f[0] == "num")
  		{
  			if(!validate() || !validate("num")) continue;
  		}
  		else
  		{
  			if(!validate(f[0])) continue;
  		}

  		if(validate("minl") && validate("maxl") && validate("confirm_")) continue;
  	}
  }
  
  function checkIf()
  {
  	var F = o.value;
  	return eval(fields[o.name][5]+" ? true : false;");
  }

  function validate(type)
  {
  	var r;
  	switch(type)
  	{
  		case "checkbox":
  			r = o.checked;
  			break;
  		case "radio":
  			if(radios[o.name]) return true;
  			
  			var radio = new Array();
  			for(var j = 0; j < frm.elements.length; j++)
  			{
  				if(frm.elements[j].name == o.name)
  				{
  					radio[radio.length] = frm.elements[j];
  				}
  			}
  			//var radio = eval("frm."+o.name);
  			
  			r = false;
  			for(var j in radio)
  			{
  				if(radio[j].checked)
  				{
  					r = true;
  					break;
  				}
  			}
  			radios[o.name] = true;
  			break;
  		case "select":
  			r = o.selectedIndex > 0;
  			break;
  		case "email":
				var re = /.+\@.+\..+/;
				r = re.exec(o.value);
  			break;
  		case "num":
				var re = /^\d+$/;
				r = re.exec(o.value);
  			break;
  		case "confirm_":
				r = frm[o.name + "_confirm"] ? frm[o.name + "_confirm"].value == o.value : true;
  			break;
  		case "confirm":
				r = true;
  			break;
  		case "minl":
				r = f[3] && f[3] > 0 ? (f[0] == "confirm" && o.value == "" ? true : o.value.length >= f[3]) : true;
  			break;
  		case "maxl":
				r = f[4] && f[4] > 0 ? o.value.length <= f[4] : true;
  			break;
  		default:
  			r = o.value != "" ? true : false;
  	}
  	if(!r) s += status(type) + "\n";
  	return r;
  }//validate

  function status(t)
  {
  	switch(t)
  	{
  		case "select":
  		case "radio":
  			t = " is not chosen";
  			break;
  		case "confirm_":
  			t = "s do not match";
  			break;
  		case "minl":
  			t = " is too short. Min length = " + f[3];
  			break;
  		case "maxl":
  			t = " is too long. Max length = " + f[4];
  			break;
  		case "email":
  			t = " address does not appear to be valid";
  			break;
  		case "num":
  			t = " must contain only digits";
  			break;
  		default:
  			t = " is missing";
  	}
  	return f[2] && f[2] != "" ? f[2] : f[1] + t + ".";
  }//status

  if(s != "") alert("Error(s):\n\n" + s);
  return s == "";
}//validateFields