function v_test_sub(condition,fld,msg,required) {
  if (condition) return (true);
  if (fld != null) fld.focus();
  alert(msg);
  return (false);
}

function v_retest_sub(re,fld,msg,required) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  if (required && /^\s*$/.test(fld.value)) return (v_test_sub(false,fld,msg));
  return (v_test_sub(re.test(fld.value),fld,msg));
}

function v_isre(fld,msg,re) { return (v_test_sub(re.test(fld.value),fld,msg)); }
function v_isnotempty(fld,msg) { return (v_test_sub(/\S/.test(fld.value),fld,msg)); }
function v_isnotselected(fld,msg) { return (v_test_sub(fld.selectedIndex != 0,fld,msg)); }
function v_isint(fld,msg,required) { return (v_retest_sub(/^\d+$/,fld,msg,required)); }
function v_isnonzeroint(fld,msg,required) { return (v_retest_sub(/^0*[1-9]\d*$/,fld,msg,required)); }
function v_issignedint(fld,msg,required) { return (v_retest_sub(/^[+-]?\d+$/,fld,msg,required)); }
function v_isreal(fld,msg,required) { return (v_retest_sub(/^\.\d+$|^\d+(\.\d*)?$/,fld,msg,required)); }
function v_issignedreal(fld,msg,required) { return (v_retest_sub(/^[+-]?\.\d+$|^[+-]?\d+(\.\d*)?$/,fld,msg,required)); }
function v_iscurrency(fld,msg,required) { return (v_retest_sub(/^(\$ *)?\.\d{1,2}$|^(\$ *)?\d+(\.\d{0,2})?$/,fld,msg,required)); }
function v_iszipcode(fld,msg,required) { return (v_retest_sub(/^\d{5}([- ]?\d{4})?$/,fld,msg,required)); }
function v_isphoneac(fld,msg,required) { return (v_retest_sub(/^\(?\d{3}\)?$/,fld,msg,required)); }
function v_isphoneprefix(fld,msg,required) { return (v_retest_sub(/^\d{3}$/,fld,msg,required)); }
function v_isphone4(fld,msg,required) { return (v_retest_sub(/^\d{4}$/,fld,msg,required)); }
function v_isphone(fld,msg,required) { return (v_retest_sub(/^\d{3}[-. ]?\d{4}$/,fld,msg,required)); }
function v_isacphone(fld,msg,required) { return (v_retest_sub(/^\(?\d{3}[).-]? ?\d{3}[-. ]?\d{4}$/,fld,msg,required)); }

function v_isintinrange(fld,msg,required,min,max) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  if (!v_test_sub(/^\d+$/.test(fld.value),fld,msg)) return (false);
  return (v_test_sub((min <= fld.value) && (fld.value <= max),fld,msg));
}

function v_radiochecked(fld,msg) {
  var i;
  for (i = 0; i < fld.length; i++)
    if (fld[i].checked)
      return (true);
  return (v_test_sub(false,fld[0],msg));
}

function _v_daysinmonth(m,y) {
  // Thirty days hath September,
  // April, June, and November,
  if ((m == 4) || (m == 6) || (m == 9) || (m == 11))
    return (30);
  // All the rest have thirty-one,
  if ((m == 1) || (m == 3) || (m == 5) || (m == 7) || (m == 8) || (m == 10) || (m == 12))
    return (31);
  // Excepting February alone,
  // Which hath but twenty-eight, in fine,
  // Till leap year gives it twenty-nine.
  if (m == 2)
    return (28 + (
                   (y %   4) ? 0 :
                   (y % 100) ? 1 :
                   (y % 400) ? 0 :
                               1
                 )
    );
  return (0);
}

function v_isdate(fld,msg,required) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  var a;
  a = /^(\d{1,2})[-\/.](\d{1,2})[-\/.](\d{2}|\d{4})$/.exec(fld.value);
  if (!v_test_sub(a,fld,msg)) return (false);
  if (a[3].length == 2) a[3] += 2000;
  if (!v_test_sub((1 <= a[1]) && (a[1] <= 12),fld,msg)) return (false);
  if (!v_test_sub((1 <= a[2]) && (a[2] <= _v_daysinmonth(a[1],a[3])),fld,msg)) return (false);
  return (!v_test_sub(1 <= a[3],fld,msg));
}

function v_fixdate_select3(mfld,dfld,yfld) {
  var m,y,n1,n2;
  m = mfld.options[mfld.selectedIndex].value;
  y = yfld.options[yfld.selectedIndex].value;
  n1 = dfld.options.length;
  n2 = _v_daysinmonth(m,y);
  with (dfld)
    if (n1 > n2) {
      if (options[selectedIndex].value > n2)
        selectedIndex = n2 - 1;
      options.length = n2;
    } else if (n1 < n2) {
      while (options.length < n2)
        options[options.length] = new Option(options.length + 1,options.length + 1)
    }
}

function v_isemailaddress(fld,msg,required) {
  var valid = "[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]";
  return (v_retest_sub(new RegExp("^" + valid + "+(\\." + valid + "+)*@" + valid + "+(\\." + valid + "+)+$"),fld,msg,required));
}