/* ************************************************************* ** FORMVAL.JS - JS Form Validation Library ** ======================================= ** This library contains code to validate HTML form-field data. ** The bulk of this file was derived from Eric Krock's FormChek.js at ** developer.netscape.com/docs/examples/javascript/formval/overview.html ** (Many thanks, Eric!) Enjoy ... and please maintain this header. ** ** To load this library in an HTML doc, put the following ** line in the doc's HEAD (before any other SCRIPT tags): ** ** ** ** Author Ver Date Comments ** ====== === ==== ======== ** Eric Krock 1.0 2/18/97 original JS 1.0-only version ** Rick Scott 2.0 2/1/00 streamlined file by removing: ** SS check, credit-card checks, ** defaultEmptyOK, and much more; ** added stripLeadingBlanks(), ** stripTrailingBlanks(), ** stripLeadingTrailingBlanks(), ** getCheckedRadioButton(), ** getCheckedCheckboxes(), ** getCheckedSelectOptions() ** ** (c) 1997 Netscape Communications Corporation ** Copyright 2000, Rick Scott, all rights reserved. ************************************************************* */ /* ************************************************************* ** USAGE ** ===== ** Functions to Validata Form-Element Data: ** isEmpty(s) - true if string s is empty ** isBlank(s) - true if string s is empty or blank (all whitespace chars) ** isLetter(c) - true if char c is an English letter ** isDigit(c) - true if char c is a digit ** isInteger(s) - true if string s is a signed/unsigned number ** isIntegerInRange(s, a, b) - true if string s (integer) is a <= s <= b ** isFloat(s) - true if string s is a signed/unsigned floating-point number ** isAlphanumeric(s) - true if s is English letters and numbers only ** isUSPhoneNumber(s) - true if string s is a valid U.S. phone number ** isZIPCode(s) - true if string s is a valid U.S. ZIP code ** isStateCode(s) - true if string s is a valid U.S. (2-letter) state code ** isEmail(s) - true if string s is a valid email address ** getCheckedRadioButton(radioSet) - gets index checked radio button in set ** getCheckedCheckboxes(checkboxSet) - gets index(es) of checked checkboxes in set ** getCheckedSelectOptions(select) - gets index(es) of checked select options ** ** Functions to Reformat input=text Form-Field Data: ** stripCharsInBag(s, bag) - removes all chars in string bag from string s ** stripCharsNotInBag(s, bag) - removes all chars NOT in string bag from string s ** stripBlanks(s) - removes all blank chars from s ** stripLeadingBlanks(s) - removes leading blank chars from s ** stripTrailingBlanks(s) - removes trailing blank chars from s ** stripLeadingTrailingBlanks(s) - removes lead+trail blank chars from s ** reformatString(targetStr, str1, int1 [, str2, int2 [, ..., ...]]) - ** inserts formatting chars or delimiters in targetStr (see below) ************************************************************* */ /* ********************************************************** */ /* Global Variables and Constants *************************** */ /* ********************************************************** */ var digits = "0123456789"; var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz" var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" var blanks = " \t\n\r"; // aka whitespace chars // decimal point character differs by language and culture var decimalPointDelimiter = "." // non-digit characters allowed in phone numbers var phoneNumberDelimiters = "()- "; // characters allowed in US phone numbers var validUSPhoneChars = digits + phoneNumberDelimiters; // U.S. phone numbers have 10 digits, formatted as ### ### #### or (###)###-#### var digitsInUSPhoneNumber = 10; // non-digit characters which are allowed in ZIP Codes var ZIPCodeDelimiters = "-"; // our preferred delimiter for reformatting ZIP Codes var ZIPCodeDelimeter = "-" // U.S. ZIP codes have 5 or 9 digits, formatted as ##### or #####-#### var digitsInZIPCode1 = 5 var digitsInZIPCode2 = 9 // Valid U.S. Postal Codes for states, territories, armed forces, etc. // See http://www.usps.gov/ncsc/lookups/abbr_state.txt var USStateCodeDelimiter = "|"; var USStateCodes = "AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|AE|AA|AE|AE|AP|al|ak|as|az|ar|ca|co|ct|de|dc|fm|fl|ga|gu|hi|id|il|in|ia|ks|ky|la|me|mh|md|ma|mi|mn|ms|mo|mt|ne|nv|nh|nj|nm|ny|nc|nd|mp|oh|ok|or|pw|pa|pr|ri|sc|sd|tn|tx|ut|vt|vi|va|wa|wv|wi|wy|ae|aa|ae|ae|ap" /* ********************************************************** */ /* Functions ************************************************ */ /* ********************************************************** */ // Returns true if string s is empty function isEmpty(s) { return ((s == null) || (s.length == 0)); } // Returns true if string s is empty or all blank chars function isBlank(s) { var i; // Is s empty? if (isEmpty(s)) return true; // Search through string's chars one by one until we find first // non-blank char, then return false; if we don't, return true for (i=0; i= 0) && (blanks.indexOf(s.charAt(i)) != -1)) i--; return s.substring(0, i+1); } // Removes leading+trailing blank chars (as defined by blanks) from s function stripLeadingTrailingBlanks(s) { s = stripLeadingBlanks(s); s = stripTrailingBlanks(s); return s; } // Returns true if character c is an English letter (A .. Z, a..z) function isLetter(c) { return (((c >= "a") && (c <= "z")) || ((c >= "A") && (c <= "Z"))); } // Returns true if character c is a digit (0 .. 9) function isDigit(c) { return ((c >= "0") && (c <= "9")); } // Returns true if all chars in string s are numbers; // first character is allowed to be + or -; does not // accept floating point, exponential notation, etc. function isInteger(s) { if (isBlank(s)) return false; // skip leading + or - if ((s.charAt(0) == "-") || (s.charAt(0) == "+")) var i = 1; else var i = 0; // Search through string's chars one by one until we find a // non-numeric char, then return false; if we don't, return true for (i; i= 1 character before @, so we start // start looking at character position 1 (i.e. second character) var i = 1; var sLength = s.length; // look for @ while ((i < sLength) && (s.charAt(i) != "@")) i++ if ((i >= sLength) || (s.charAt(i) != "@")) return false; else i += 2; // look for . while ((i < sLength) && (s.charAt(i) != ".")) i++ // there must be at least one character after the . if ((i >= sLength - 1) || (s.charAt(i) != ".")) return false; else return true; } // Returns true if string s is an integer such that a <= s <= b function isIntegerInRange (s, a, b) { if (isBlank(s)) return false; if (!isInteger(s)) return false; var num = parseInt(s); return ((num >= a) && (num <= b)); } // Returns index of checked radio button in radio set, // or -1 if no radio buttons are checked function getCheckedRadioButton(radioSet) { for (var i=0; i 0) return arr; else return -1; } // Returns array containing index(es) of checked option(s) // in select box, or -1 if no options are selected function getCheckedSelectOptions(select) { var arr = new Array(); for (var i=0,j=0; i 0) return arr; else return -1; }