/**
* This UDF is an extensible, easy to use pattern validator using regular expressions.
* Rewrites by rcamden.
*
* @param checkWhat Name of the pattern to use. (Required)
* @param str String to check. (Required)
* @return Returns a boolean.
* @author Chris Chay (itadept@earthlink.net)
* @version 2, January 15, 2003
*/
function CheckPattern(checkWhat, str) {
var rePattern=""; // Assign RE pattern to this variable
switch (checkWhat){
case "isEmail":
rePattern="^([\w\d\-\.]+)@{1}(([\w\d\-]{1,67})|([\w\d\-]+\.[\w\d\-]{1,67}))\.(([a-zA-Z\d]{2,4})(\.[a-zA-Z\d]{2})?)$";
break;
case "isIP":
rePattern="^(((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])\.){3,3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9]))$";
break;
case "isFloat":
rePattern="^[-+]?\d*\.?\d*$";
break;
case "isInteger":
rePattern="^[+-]?\d+$";
break;
case "isUSPhone":
rePattern="^((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$";
break;
case "isUSCurrency":
rePattern="^\$(\d{1,3}(\,\d{3})*|(\d+))(\.\d{2})?$";
break;
case "isDate":
rePattern="^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$";
break;
case "isCreditCard":
rePattern="^((4\d{3})|(5[1-5]\d{2})|(6011))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$";
break;
case "isSSN":
rePattern="^\d{3}-\d{2}-\d{4}$";
break;
case "isZipCode":
rePattern="^\d{5}-\d{4}|\d{5}|[A-Z]\d[A-Z] \d[A-Z]\d$";
break;
case "isPostalCode":
rePattern="^[[:alpha:]][[:digit:]][[:alpha:]]( |-)?[[:digit:]][[:alpha:]][[:digit:]]$";
break;
default:
return("That pattern check is not available");
break;
}
return reFindNoCase(rePattern,str);
}
/**
* Returns TRUE if the string is a valid credit card number.
* Modded by RCamden - Check for any non numeric and return false.
* Modded by Author - fixed mastercard checking
* Updated to use [:digit:] and allow spaces
*
* @param ccNo The credit card number.
* @param cardType One of: AMEX, DINERS, DISCOVER, MASTERCARD, VISA
* @return Returns a boolean.
* @author Nick de Voil (nick@devoil.com)
* @version 3, March 12, 2002
*/
function IsCreditCard(ccNo)
{
var rv = "";
var str = "";
var chk = 0;
var ccln = 0;
var strln = 0;
var i = 1;
if(reFind("[^[:digit:] ]",ccNo)) return FALSE;
ccNo = replace(ccNo," ","","ALL");
rv = Reverse(ccNo);
ccln = Len(ccNo);
if(ccln lt 12) return FALSE;
for(i = 1; i lte ccln; i = i + 1) {
if(i mod 2 eq 0) {
str = str & Mid(rv, i, 1) * 2;
} else {
str = str & Mid(rv, i, 1);
}
}
strln = Len(str);
for(i = 1; i lte strln; i = i + 1) chk = chk + Mid(str, i, 1);
if((chk neq 0) and (chk mod 10 eq 0)) {
if(ArrayLen(Arguments) lt 2) return TRUE;
switch(UCase(Arguments[2])) {
case "AMEX": if ((ccln eq 15) and (((Left(ccNo, 2) is "34")) or ((Left(ccNo, 2) is "37")))) return TRUE; break;
case "DINERS": if ((ccln eq 14) and (((Left(ccNo, 3) gte 300) and (Left(ccNo, 3) lte 305)) or (Left(ccNo, 2) is "36") or (Left(ccNo, 2) is "38"))) return TRUE; break;
case "DISCOVER": if ((ccln eq 16) and (Left(ccNo, 4) is "6011")) return TRUE; break;
case "MASTERCARD": if ((ccln eq 16) and (Left(ccNo, 2) gte 51) and (Left(ccNo, 2) lte 55)) return TRUE; break;
case "VISA": if (((ccln eq 13) or (ccln eq 16)) and (Left(ccNo, 1) is "4")) return TRUE; break;
default: return TRUE;
}
}
return FALSE;
}