/** utility functions for formdata validation */ function checkText(txtField, req, message) { var s = txtField.value; if(s == "") { if(req) { alert(message); txtField.focus(); txtField.select(); return false; } } return true; } function checkSelect(txtField, req, message) { var s = txtField.value; if(s == "") { if(req) { alert(message); txtField.focus(); return false; } } return true; } function checkNumber(txtField, req, message) { var s = txtField.value; if(s == "") { if(req) { alert(message + " must be entered."); txtField.focus(); txtField.select(); return false; } } else { if(isNaN(s)) { alert(message + " must be numeric."); txtField.focus(); txtField.select(); return false; } } return true; } function checkLength(txtField, rLength, message) { var s = txtField.value; if(s.length != rLength) { alert(message + " must be " + rLength + " digits."); txtField.focus(); txtField.select(); return false; } return true; } function checkRange(txtField, min, max, message) { var s = txtField.value; if((s < min) || (s > max)) { alert(message + " must be between " + min + " and " + max + "."); txtField.focus(); txtField.select(); return false; } return true; } function checkTermLength(txtFieldTerm, txtFieldLength, rLength, message) { var s1 = txtFieldTerm.value; var s2 = txtFieldLength.value; if(s1.toLowerCase() == "annual" && s2 < 12) { alert(message + " must be " + rLength + " months."); txtFieldLength.focus(); txtFieldLength.select(); return false; } return true; } function checkYear(txtField, req, message) { var yyyy = txtField.value; if(yyyy == "") { if(req) { alert("Please enter year for " + message + "."); txtField.focus(); txtField.select(); return false; } } else { if(!(isNaN(yyyy))) { //if((yyyy >= 1000) && (yyyy <= 9999)) { return true; //} } alert("Invalid year for " + message + "."); txtField.focus(); txtField.select(); return false; } return true; } function checkMonth(txtField, req, message) { var mm = txtField.value; if(mm == "") { if(req) { alert("Please enter month for " + message + "."); txtField.focus(); txtField.select(); return false; } } else { if(!(isNaN(mm))) { if((mm >= 1) && (mm <= 12)) { return true; } } alert("Invalid month for " + message + "."); txtField.focus(); txtField.select(); return false; } return true; } function checkDay(txtField, req, message, txtMonth) { var dd = txtField.value; var mm = txtMonth.value; if(dd == "") { if(req) { alert("Please enter day for " + message + "."); txtField.focus(); txtField.select(); return false; } } else { if(!(isNaN(dd))) { var numDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if((dd > 0) && (dd <= numDays[mm - 1])) { return true; } } alert("Invalid day for " + message + "."); txtField.focus(); txtField.select(); return false; } return true; } /********************************************************************** Form validation functions involving REGEX **********************************************************************/ //If string is empty function isEmpty(frmElement, message) { if (frmElement.value.length == 0) { alert(message); frmElement.focus(); // set the focus to this input frmElement.select(); return true; } return false; } //If string matches the regular expression it is all numbers [0-9] function isNumeric(frmElement, message) { var numExp = /^[0-9]+$/; if (frmElement.value.match(numExp)) { return true; } else { alert(message); frmElement.focus(); frmElement.select(); return false; } } //If string matches the regular expression it is all letters [a-zA-Z] function isAlphabet(frmElement, message) { var alphaExp = /^[a-zA-Z]+$/; if (frmElement.value.match(alphaExp)) { return true; } else { alert(message); frmElement.focus(); frmElement.select(); return false; } } //If string matches the regular expression it is numbers [0-9] and letters [a-zA-Z] only function isAlphanumeric(frmElement, message) { var alphanumExp = /^[0-9a-zA-Z]+$/; if (frmElement.value.match(alphanumExp)) { return true; } else { alert(message); frmElement.focus(); frmElement.select(); return false; } } //If string length is within the range [min, max] specified function isLengthRange(frmElement, minLength, maxLength, message) { var strInput = frmElement.value; if (strInput.length >= minLength && strInput.length <= maxLength){ return true; } else { alert(message); frmElement.focus(); frmElement.select(); return false; } } function isEmail(frmElement, message) { var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/; if (frmElement.value.match(emailExp)) { return true; } else { alert(message); frmElement.focus(); frmElement.select(); return false; } } /***************************************************** * Functions used for validating credit cards ******************************************************/ /** public boolean isCardNumber(String cardType, String cardNumber) { */ function isCardNumber(cardType, cardNumber) { //if (! isNum(cardNumber)) { // return false; //} if (! luhnCheck(cardNumber) ) { return false; } if (! matchCardRules(cardType, cardNumber) ){ return false; } return true; } /** public boolean matchCardRules(String cardType, String cardNumber) { */ function matchCardRules(cardType, cardNumber) { var cardPrefixes = getCardPrefixes(cardType); var cardLengths = getCardLengths(cardType); //if (cardPrefixes.size == 2) return true; //if (cardLengths.size == 1) return true; for (var i = 0; i < cardLengths.length; i++) { if (cardNumber.length == cardLengths[i]) { for (var j = 0; j < cardPrefixes.length; j++) { if (cardNumber.substring(0, cardPrefixes[j].length) == cardPrefixes[j]) { return true; } } return false; } } return false; } /** public Object getCardPrefixes(String cardType) { */ function getCardPrefixes(cardType) { var visaPrefixes = ["4"]; var masterCardPrefixes = ["51", "52", "53", "54", "55"]; var discoverPrefixes = ["6011"]; var amexPrefixes = ["34", "37"]; var defaultPrefixes = ["4", "51", "52", "53", "54", "55", "6011", "34", "37"]; if (cardType.toLowerCase() == "visa") { return visaPrefixes; } if (cardType.toLowerCase() == "mastercard") { return masterCardPrefixes; } if (cardType.toLowerCase() == "discover") { return discoverPrefixes; } if (cardType.toLowerCase() == "amex" || cardType.toLowerCase() == "americanexpress") { return amexPrefixes; } return defaultPrefixes; } /** public Object getCardLengths(String cardType) { */ function getCardLengths(cardType) { var visaLengths = ["13", "16"]; var masterCardLengths = ["16"]; var discoverLengths = ["16"]; var amexLengths = ["15"]; var defaultLengths = ["13", "15", "16"]; if (cardType.toLowerCase() == "visa") { return visaLengths; } if (cardType.toLowerCase() == "mastercard") { return masterCardLengths; } if (cardType.toLowerCase() == "discover") { return discoverLengths; } if (cardType.toLowerCase() == "amex" || cardType.toLowerCase() == "americanexpress") { return amexLengths; } return defaultLengths; } /** public boolean isExpireDate(String year, String month) { */ function isExpireDate(year, month) { if (!isNum(year) || !isNum(month)) { return false; } if (year.length != 4 || month.length != 2) { return false; } var today = new Date(); //get current date and time //var expDate = new Date(parseInt(year), parseInt(month)); var expDate = new Date(year, month); if (expDate.getTime() < today.getTime()) { return false; } return true; } /** public boolean isNum(String number) { */ function isNum(number) { if (number.length == 0) { return false; } for (var i = 0; i < number.length; i++) { if (number.charAt(i) < "0" || number.charAt(i) > "9") { return false; } } return true; } /** public boolean luhnCheck(String cardNumber) { */ function luhnCheck(cardNumber) { if (! isNum(cardNumber)) { return false; } var tmpCardNumber; var digit = 0; var sum = 0; /** If cardNumber contains odd number of digits, then convert cardNumber * to even number of digits by prefixing it with a "0" (which is harmless * when used for the purpose of LuhnCheck). */ if (cardNumber.length % 2 == 0) { tmpCardNumber = cardNumber; } else { tmpCardNumber = "0" + cardNumber; } for (var i = 0; i < tmpCardNumber.length; i++) { digit = parseInt(tmpCardNumber.charAt(i)); if (i % 2 == 0) { digit = digit * 2; //digit *= 2; if (digit > 9) { digit = digit - 9; //digit -= 9; } } sum = sum + digit; //sum += digit } if (sum % 10 == 0) { return true; } return false; } /***************************************************************************************************** References for form validation involving REGEX [^a-zA-Z] [^0-9] //If the element's string matches the regular expression it is all numbers function isNumeric(elem, helperMsg){ var numericExpression = /^[0-9]+$/; if(elem.value.match(numericExpression)){ return true; }else{ alert(helperMsg); elem.focus(); return false; } } // If the element's string matches the regular expression it is all letters function isAlphabet(elem, helperMsg){ var alphaExp = /^[a-zA-Z]+$/; if(elem.value.match(alphaExp)){ return true; }else{ alert(helperMsg); elem.focus(); return false; } } // If the element's string matches the regular expression it is numbers and letters function isAlphanumeric(elem, helperMsg){ var alphaExp = /^[0-9a-zA-Z]+$/; if(elem.value.match(alphaExp)){ return true; }else{ alert(helperMsg); elem.focus(); return false; } } function lengthRestriction(elem, min, max){ var uInput = elem.value; if(uInput.length >= min && uInput.length <= max){ return true; }else{ alert("Please enter between " +min+ " and " +max+ " characters"); elem.focus(); return false; } } function emailValidator(elem, helperMsg){ var emailExp = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/; if(elem.value.match(emailExp)){ return true; }else{ alert(helperMsg); elem.focus(); return false; } } //---------------------------------- Example: I am trying to construct a reg exp for a field which can accept values from [A-Za-z0-9]. It cannot start with a number and cannot have only numbers. Its maximum length is 50. Apart from the above characters it can only include the symbols Underscore, Hyphen and spaces between words. /^[a-z][-a-z0-9_ ]{0,49}$/i Breakdown: /^ Begin match at beginning of string [a-z] Match one alpha character [-a-z0-9_ ]{0,49} Match zero to fourtynine occurences of one of the following: alpha, digit, hyphen, underscore and space $ Match end of string /i Append case insensitivity flag (Makes the regex smaller than the /^[A-Za-z][-A-Za-z0-9_ ]{0,49}$/ it would have been without case insensitivity flag) ******************************************************************************************************/