function _v_test_sub(condition,fld,msg) {
  if (condition) return (true);
  if (fld != null) fld.focus();
  alert(msg);
  return (false);
}

function _v_test_sub2(condition,fld) {
  if (condition) return (true);
  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_retest_subWComma(re,val,fld,msg,required) {
  if (!required && /^\s*$/.test(val)) return (true);
  if (required && /^\s*$/.test(val)) return (_v_test_sub(false,fld,msg));
  return (_v_test_sub(re.test(val),fld,msg));
}

function v_iscondition(fld,msg,condition) { return (_v_test_sub(condition,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_isnotempty2(fld) { return (_v_test_sub2(/\S/.test(fld.value),fld)); }
function v_isselected(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_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));
}

function v_isemailaddressWComma(fld,msg,required) {
  var valid = "[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]";
  var vals  = fld.value;
  var eml_array = vals.split(",");
	for(i=0;i<eml_array.length;i++){
	var s   = eml_array[i];
	var val = s.replace(" ","");
	//alert(val);
	var test = (_v_retest_subWComma(new RegExp("^" + valid + "+(\\." + valid + "+)*@" + valid + "+(\\." + valid + "+)+$"),val,fld,msg,required));
	//alert(test);
	if(test==false){
	  fld.focus;
	  return(false);
	 }
	}
	return(true);
}

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_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_isurl_httpabs(fld,msg,required) {
  var reserved = "[;/?:@&=]";
  var unreserved = "[-!$'()*+,.0-9A-Z_a-z]";
  var escape = "(%[0-9A-Fa-f][0-9A-Fa-f])";
  var uchar = "(" + unreserved + "|" + escape + ")";
  var pchar = "(" + uchar + "|[:@&=])";
  return (_v_retest_sub(
      new RegExp("^http://(" + pchar + "|[;?])*(/(" + pchar + "+(/" + pchar + "*)*)?(;(" + pchar + "|/))*(\\?(" + uchar + "|" + reserved + ")*)?)?$"),
      fld,msg,required));
}

function v_istime(fld,msg,required) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  var a1 = /^(\d{1,2}(:\d{1,2}){0,2})([AaPp][Mm]?)?$/.exec(fld.value);
  if (!_v_test_sub(a1,fld,msg)) return (false);
  var a2 = a1[1].split(":");
  var h = a2[0] - 0;
  var m = (a2.length > 1) ? (a2[1] - 0) : 0;
  var s = (a2.length > 2) ? (a2[2] - 0) : 0;
  if (a1[3].length > 0) {
    if (!_v_test_sub((1 <= h) && (h <= 12),fld,msg)) return (false);
    var p = (a1[3].charAt(0).toLowerCase() == "p") ? 12 : 0;
    h = (h == 12) ? p : h + p;
  }
  return (_v_test_sub((h < 24) && (m < 60) && (s < 60),fld,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(dt,fld,msg) {
  var a = /^(\d{1,2})[-\/.](\d{1,2})[-\/.](\d{4})$/.exec(dt);
  if (!_v_test_sub(a,fld,msg)) return (false);
  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_isdate(fld,msg,required) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  return (_v_isdate(fld.value,fld,msg));
}

function v_isdate2(mfld,dfld,yfld,msg,required) {
  var m,d,y;
  m = mfld.value;
  d = dfld.value;
  y = yfld.value;
  if (!required && /^\s*$/.test(m) && /^\s*$/.test(d) && /^\s*$/.test(y)) return (true);
  return (_v_isdate(m + "/" + d + "/" + y,mfld,msg));
}

function v_isdate3(mfld,dfld,yfld,msg,required) {
  var m,d,y;
  m = (mfld.value > 0) ? mfld.value : mfld.options[mfld.selectedIndex].value;
  d = (dfld.value > 0) ? dfld.value : dfld.options[dfld.selectedIndex].value;
  y = (yfld.value > 0) ? yfld.value : yfld.options[yfld.selectedIndex].value;
  if (!required && /^\s*$/.test(m) && /^\s*$/.test(d) && /^\s*$/.test(y)) return (true);
  return (_v_isdate(m + "/" + d + "/" + y,mfld,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_ccchecksum(digits) {
  var a = "0,2,4,6,8,1,3,5,7,9".split(",");
  var p = true;
  var s = 0;
  var i,d;
  for (i = digits.length - 1; i >= 0; --i) {
    d = digits.charAt(i);
    s -= (p ? d : a[d]);
    p = !p;
  }
  return ((s % 10) == 0);
}

function v_isamex(fld,msg) {
  var ccdigits = fld.value.replace("[^0-9]","");
  if (!_v_test_sub(_v_ccchecksum(ccdigits),fld,msg)) return (false);
  return (_v_test_sub(/^3[47][0-9]{13}$/.test(ccdigits),fld,msg));
}

function v_isdiscover(fld,msg) {
  var ccdigits = fld.value.replace("[^0-9]","");
  if (!_v_test_sub(_v_ccchecksum(ccdigits),fld,msg)) return (false);
  return (_v_test_sub(/^6011[0-9]{12}$/.test(ccdigits),fld,msg));
}

function v_ismastercard(fld,msg) {
  var ccdigits = fld.value.replace("[^0-9]","");
  if (!_v_test_sub(_v_ccchecksum(ccdigits),fld,msg)) return (false);
  return (_v_test_sub(/^5[1-5][0-9]{14}$/.test(ccdigits),fld,msg));
}

function v_isvisa(fld,msg) {
  var ccdigits = fld.value.replace("[^0-9]","");
  if (!_v_test_sub(_v_ccchecksum(ccdigits),fld,msg)) return (false);
  return (_v_test_sub(/^4[0-9]{12}([0-9]{3})?$/.test(ccdigits),fld,msg));
}

function v_iscreditcard(fld,msg,ccabbr,required) {
  if (!required && /^\s*$/.test(fld.value)) return (true);
  if (ccabbr == "ax") return (v_isamex(fld,msg));
  if (ccabbr == "ds") return (v_isdiscover(fld,msg));
  if (ccabbr == "mc") return (v_ismastercard(fld,msg));
  if (ccabbr == "vs") return (v_isvisa(fld,msg));
  return (_v_test_sub(false,fld,"Unknown credit card type."));
}

function clearVal(fld,val) 
{
  if(fld.value == val)  fld.value = "";
}

function move(currentField,nextField,frm,howmany) 
{
   if (currentField.value.length == howmany) {
     var v = "document." + frm + "." + nextField + ".focus()";
     eval(v);
   }
}

function cleanPhone(phstrng)
{
    var stripped = phstrng.replace(/[\(\)\.\+\-\ ]/g, '');
    //strip out acceptable non-numeric characters
    return(stripped);
}

function SSNValidation(ssn) 
{
      var error = false;
      var matchArr = ssn.match(/^(\d{3})-?\d{2}-?\d{4}$/);
      var numDashes = ssn.split('-').length - 1;
      if (matchArr == null || numDashes == 1) {
       errormsg = "Invalid SSN. Must be 9 digits or in the form xxx-xx-xxxx.";
      }
      else 
      if (parseInt(matchArr[1],10)==0) {
       errormsg = "Invalid SSN. SSN's can't start with 000.";
      }
      else {
        errormsg = "";
      }
      return(errormsg);
 }

function validateCC(s) 
{
   var v = "0123456789";
   var w = "";
   for (var i=0; i < s.length; i++) {
   x = s.charAt(i);
   if (v.indexOf(x,0) != -1)
   w += x;
   }
   var j = w.length / 2;
   if (j < 6.5 || j > 8 || j == 7) return false;
   var k = Math.floor(j);
   var m = Math.ceil(j) - k;
   var c = 0;
   for (var i=0; i<k; i++) {
   a = w.charAt(i*2+m) * 2;
   c += a > 9 ? Math.floor(a/10 + a%10) : a;
   }
   for (var i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
   return (c%10 == 0);
}

function cleanPhone(phstrng)
{
      var stripped = phstrng.replace(/[\(\)\.\-\ ]/g, '');
      //strip out acceptable non-numeric characters
      return(stripped);
}

function checkAll(formObj){
with (formObj) { 
  for (var i=0;i < elements.length;i++){ 
    fldObj = elements[i]; 
      if(fldObj.type == "checkbox"){ 
         fldObj.checked = true; 
      }  
    } 
  } 
} 

function uncheckAll(formObj){ 
with (formObj) { 
  for (var i=0;i < elements.length;i++){ 
    fldObj = elements[i]; 
      if(fldObj.type == "checkbox"){ 
         fldObj.checked = false; 
      }  
    } 
  } 
}
