    function smartcheck(form)
      {
        //notnull
	//isdate:mdy or isdate:ymd or isdate:dmy
        //email
        //phone       
        //minlength:n
        //maxlength:n
        //numeric
        //integer
        //decimal:n
        //minsize:n
        //maxsize:n
        //selected
        for (j=0;j<form.length;j++)
          {
            if (eval('form.' + form[j].name + '_validate'))
              {
                valobj = eval('form.' + form[j].name + '_validate')
              }
            else
              {
                continue;
              }
            if (valobj.value != "")
              {
                validate = valobj.value
                curval = form[j].value;

                selval = "";
                if (form[j].options)
                  {
                    if (form[j].selectedIndex > -1)
                      {
                        if (form[j].options[form[j].selectedIndex].value)
                          {
                            selval = form[j].options[form[j].selectedIndex].value;
                          }
                      }
                  }
                  
                if (form[j].title != '' && typeof form[j].title != 'undefined') 
                  {                    
                    question = "\"" + form[j].title + "\"";
                  }
                else
                  {
                    question = form[j].name; 
                  }
              
                validate = validate.split(";");
                for (k=0;k<validate.length;k++)
                  {
                    validate[k] = validate[k].split(":");
                    switch (validate[k][0])
                      {
                      case "notnull":
                        if  (curval == "")
                          {
                            alert("You must enter a value for " + question + "\n");
                            return false;
                          }                                                                       
                        break;

					  case "isdate":
					  	if (isDate(curval.toString(), validate[k][1]) == false)
						{
							alert("You must enter a valid date for " + question + "\n");
							return false;
						}
						break;
						
                      case "email":
                        if  (curval.search(/^[\w\.\-_]*[^\.]{1}@{1}[^\.\-]{1}[\w\.\-]*[^\.]{1}\.{1}[\w]{2,4}$/) == -1 || curval.search(/.*\.\..*/) != -1)
                          {
                            alert("You must enter a valid email address for " + question + "\n");                          
                            return false;
                          }                                                                       
                        break;                        

                      case "phone":
                        if  (curval.search(/^\D?\d{3}\D{1,3}\d{3}\D{1,3}\d{4}.*$/) != 0)
                          {
                            alert("You must enter a valid phone number for " + question + "\n");                          
                            return false;
                          }                                                                       
                        break;                        
                        
                      case "minlength":
                        if  (curval.length < validate[k][1])
                          {
                            alert("You must enter a value at least " + validate[k][1] +  " characters for " + question + "\n");
                            return false;
                          }                                                                       
                        break;                        

                      case "maxlength":
                        if  (curval.length > validate[k][1])
                          {
                            alert("You must enter a value of no more than " + validate[k][1] +  " characters for " + question + "\n");
                            return false;
                          }                                                                       
                        break;                         
                        
                      case "numeric":
                        if  (curval != Number(curval))
                          {
                            alert("You must enter a numeric value for " + question + "\n");
                            return false;
                          }                                                                       
                        break;                        

                      case "integer":
                        if  (curval != parseInt(curval))
                          {
                            alert("You must enter an integer value for " + question + "\n");
                            return false;
                          }                                                                       
                        break;
                        
                      case "decimal":
                        if  (curval != Number(curval))
                          {
                            alert("You must enter a numeric value for " + question + "\n");
                            return false;
                          }    
                        if  (curval.search(/\./) == -1)
                          {
                            alert("You must enter an decimal value for " + question + "\n");
                            return false;                         
                          }

                        if (curval.split(".")[1].length > validate[k][1])                          
                          {
                            alert("You must enter a value with no more than " + validate[k][1] + " decimal places for " + question + "\n");
                            return false;                            
                          }
                                                                       
                        break;                             

                      case "minsize":
                        if  (Number(curval) < Number(validate[k][1]))
                          {
                            alert("You must enter a value of at least " + validate[k][1] +  " for " + question + "\n");
                            return false;
                          }                                                                       
                        break; 
                        
                      case "maxsize":
                        if  (Number(curval) > Number(validate[k][1]))
                          {
                            alert("You must enter a value no greater than " + validate[k][1] +  " for " + question + "\n");
                            return false;
                          }                                                                       
                        break;                                                 

                      case "sum":
                        digits = validate[k][1].split(",");
                        sum = 0
                        for (l=0;l<digits.length;l++)
                          {                   
                            sum = Number(sum) + Number(form[digits[l]].value);
                          }
                         if (curval != sum)
                          {
                            alert("The sums of " + validate[k][1] +  " must equal " + question + "\n");
                            return false;                          
                          }                  
                        break;       

                      case "difference":
                        digits = validate[k][1].split(",");
                        difference = Number(form[digits[0]].value)
                        for (l=1;l<digits.length;l++)
                          {                  
                            difference = Number(difference) - Number(form[digits[l]].value);
                          }
                         if (curval != difference)
                          {
                            alert("The difference of " + validate[k][1] +  " must equal " + question + "\n");
                            return false;                          
                          }                  
                        break;                           
                        
                      case "product":
                        digits = validate[k][1].split(",");
                        product = 1
                        for (l=0;l<digits.length;l++)
                          {                   
                            product = Number(product) * Number(form[digits[l]].value);
                          }
                         if (curval != product)
                          {
                            alert("The product of " + validate[k][1] +  " must equal " + question + "\n");
                            return false;                          
                          }                  
                        break;                           

                      case "quotient":
                        digits = validate[k][1].split(",");
                        quotient = Number(form[digits[0]].value)
                        for (l=1;l<digits.length;l++)
                          {                               
                            quotient = Number(quotient) / Number(form[digits[l]].value);
                          }
                         if (curval != quotient)
                          {
                            alert("The quotient of " + validate[k][1] +  " must equal " + question + "\n");
                            return false;                          
                          }                  
                        break;                          

                      case "selected":
                        if  (selval == "")
                          {
                            alert("You must select a value for " + question + "\n");
                            return false;
                          }                                                                       
                        break;
                      }                      
                  }
              }
          }
        return true;
      } 

function isDate(strDate, strFmt) {

  /*  Verify that a string is a valid date.
   *
   *  strDate  Required  String to verify.
   *  strFmt   Optional  Date format expected: ymd, dmy, mdy.
   *
   *  Returns true if strDate is a valid date, false otherwise.
   *
   *  Throws "Invalid date format".
   *
   */

  function isLeapYear(y) {
    return (y%4!=0) ? false : (y%100!=0) ? true : (y%400!=0) ? false : true;
  }

  strFmt = strFmt || "ymd";           // default date format

  switch (strFmt.toLowerCase()) {
    case "ymd" :
      var reDate = /^(\d{4})\/(\d{1,2})\/(\d{1,2})$/;
      var y = 1, m = 2, d = 3;
      break;
    case "dmy" :
      var reDate = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
      var y = 3, m = 2, d = 1;
      break;
    case "mdy" :
      var reDate = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
      var y = 3, m = 1, d = 2;
      break;
    default:
      // Comment out throw statement if try/catch isn't supported.
      throw new Error("Invalid date format");
      return false;
  }

  if (!reDate.test(strDate)) return false;  // date has invalid format

  var dateParts = reDate.exec(strDate)
  var year  = dateParts[y];
  var month = dateParts[m];
  var day   = dateParts[d];

  if (day < 1) return false;

  switch (parseInt(month,10)) {
    case  1:
    case  3:
    case  5:
    case  7:
    case  8:
    case 10:
    case 12:
      if (day > 31) return false;
      break;
    case  4:
    case  6:
    case  9:
    case 11:
      if (day > 30) return false;
      break;
    case  2:
      if (day > (isLeapYear(year) ? 29 : 28)) return false;
      break;
    default:
      return false;
  }

  // Put any year range checks here
  // if (year < min || year > max) return false;

  return true;
}