var digits = "0123456789"; var lowercaseLetters = "abcdefghijklmnopqrstuvwxyz" var uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" // whitespace characters var whitespace = " \t\n\r"; // decimal point character differs by language and culture var decimalPointDelimiter = "."; // CONSTANT STRING DECLARATIONS // m is an abbreviation for "missing" var mPrefix = "You did not enter a value into the "; var mSuffix = " field. This is a required field. Please enter it now."; // i is an abbreviation for "invalid" var iEmail = "This field must be a valid email address (like myname@somewhere.com). Please reenter it now."; // p is an abbreviation for "prompt" var pEntryPrompt = "Please enter a "; var pEmail = "valid email address (like myname@mydomain.com)."; var defaultEmptyOK = false; // Check whether string s is empty. function isEmpty(s) { return ((s == null) || (s.length == 0)) } // Returns true if string s is empty or // whitespace characters only. function isWhitespace (s) { var i; // Is s empty? if (isEmpty(s)) return true; // Search through string's characters one by one // until we find a non-whitespace character. // When we do, return false; if we don't, return true. for (i = 0; i < s.length; i++) { // Check that current character isn't whitespace. var c = s.charAt(i); if (whitespace.indexOf(c) == -1) return false; } // All characters are whitespace. return true; } // Removes all characters which appear in string bag from string s. function stripCharsInBag (s, bag) { var i; var returnString = ""; // Search through string's characters one by one. // If character is not in bag, append to returnString. for (i = 0; i < s.length; i++) { // Check that current character isn't whitespace. var c = s.charAt(i); if (bag.indexOf(c) == -1) returnString += c; } return returnString; } // Removes all characters which do NOT appear in string bag // from string s. function stripCharsNotInBag (s, bag) { var i; var returnString = ""; // Search through string's characters one by one. // If character is in bag, append to returnString. for (i = 0; i < s.length; i++) { // Check that current character isn't whitespace. var c = s.charAt(i); if (bag.indexOf(c) != -1) returnString += c; } return returnString; } // Removes all whitespace characters from s. // Global variable whitespace (see above) // defines which characters are considered whitespace. function stripWhitespace (s){ return stripCharsInBag (s, whitespace) } // WORKAROUND FUNCTION FOR NAVIGATOR 2.0.2 COMPATIBILITY. // // The below function *should* be unnecessary. In general, // avoid using it. Use the standard method indexOf instead. // // However, because of an apparent bug in indexOf on // Navigator 2.0.2, the below loop does not work as the // body of stripInitialWhitespace: // // while ((i < s.length) && (whitespace.indexOf(s.charAt(i)) != -1)) // i++; // // ... so we provide this workaround function charInString // instead. // // charInString (CHARACTER c, STRING s) // // Returns true if single character c (actually a string) // is contained within string s. function charInString (c, s) { for (i = 0; i < s.length; i++) { if (s.charAt(i) == c) return true; } return false } // Removes initial (leading) whitespace characters from s. // Global variable whitespace (see above) // defines which characters are considered whitespace. function stripInitialWhitespace (s){ var i = 0; while ((i < s.length) && charInString (s.charAt(i), whitespace)) i++; return s.substring (i, s.length); } // Returns true if character c is an English letter // (A .. Z, a..z). // // NOTE: Need i18n version to support European characters. // This could be tricky due to different character // sets and orderings for various languages and platforms. 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 character c is a letter or digit. function isLetterOrDigit (c) { return (isLetter(c) || isDigit(c)) } function isInteger (s) { var i; if (isEmpty(s)) if (isInteger.arguments.length == 1) return defaultEmptyOK; else return (isInteger.arguments[1] == true); // Search through string's characters one by one // until we find a non-numeric character. // When we do, return false; if we don't, return true. for (i = 0; i < s.length; i++) { // Check that current character is number. var c = s.charAt(i); if (!isDigit(c)) return false; } // All characters are numbers. return true; } function isSignedInteger (s) { if (isEmpty(s)) if (isSignedInteger.arguments.length == 1) return defaultEmptyOK; else return (isSignedInteger.arguments[1] == true); else { var startPos = 0; var secondArg = defaultEmptyOK; if (isSignedInteger.arguments.length > 1) secondArg = isSignedInteger.arguments[1]; // skip leading + or - if ( (s.charAt(0) == "-") || (s.charAt(0) == "+") ) startPos = 1; return (isInteger(s.substring(startPos, s.length), secondArg)) } } function isPositiveInteger (s) { var secondArg = defaultEmptyOK; if (isPositiveInteger.arguments.length > 1) secondArg = isPositiveInteger.arguments[1]; // a) s must be a signed integer, AND // b) one of the following must be true: // i) s is empty and we are supposed to return true for // empty strings // ii) this is a positive, not negative, number return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg) || (parseInt (s) > 0) ) ); } // isNonnegativeInteger (STRING s [, BOOLEAN emptyOK]) // // Returns true if string s is an integer >= 0. // // For explanation of optional argument emptyOK, // see comments of function isInteger. function isNonnegativeInteger (s) { var secondArg = defaultEmptyOK; if (isNonnegativeInteger.arguments.length > 1) secondArg = isNonnegativeInteger.arguments[1]; // The next line is a bit byzantine. What it means is: // a) s must be a signed integer, AND // b) one of the following must be true: // i) s is empty and we are supposed to return true for // empty strings // ii) this is a number >= 0 return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg) || (parseInt (s) >= 0) ) ); } // isNegativeInteger (STRING s [, BOOLEAN emptyOK]) // // Returns true if string s is an integer < 0. // // For explanation of optional argument emptyOK, // see comments of function isInteger. function isNegativeInteger (s) { var secondArg = defaultEmptyOK; if (isNegativeInteger.arguments.length > 1) secondArg = isNegativeInteger.arguments[1]; // The next line is a bit byzantine. What it means is: // a) s must be a signed integer, AND // b) one of the following must be true: // i) s is empty and we are supposed to return true for // empty strings // ii) this is a negative, not positive, number return (isSignedInteger(s, secondArg) && ( (isEmpty(s) && secondArg) || (parseInt (s) < 0) ) ); } // isAlphabetic (STRING s [, BOOLEAN emptyOK]) // // Returns true if string s is English letters // (A .. Z, a..z) only. function isAlphabetic (s){ var i; if (isEmpty(s)) if (isAlphabetic.arguments.length == 1) return defaultEmptyOK; else return (isAlphabetic.arguments[1] == true); // Search through string's characters one by one // until we find a non-alphabetic character. // When we do, return false; if we don't, return true. for (i = 0; i < s.length; i++) { // Check that current character is letter. var c = s.charAt(i); if (!isLetter(c)) return false; } // All characters are letters. return true; } // isAlphanumeric (STRING s [, BOOLEAN emptyOK]) // // Returns true if string s is English letters // (A .. Z, a..z) and numbers only. // function isAlphanumeric (s){ var i; if (isEmpty(s)) if (isAlphanumeric.arguments.length == 1) return defaultEmptyOK; else return (isAlphanumeric.arguments[1] == true); for (i = 0; i < s.length; i++){ // Check that current character is number or letter. var c = s.charAt(i); if (! (isLetter(c) || isDigit(c) ) ) return false; } // All characters are numbers or letters. return true; } // isEmail (STRING s [, BOOLEAN emptyOK]) // // Email address must be of form a@b.c -- in other words: // * there must be at least one character before the @ // * there must be at least one character before and after the . // * the characters @ and . are both required function isEmail (s){ if (isEmpty(s)) if (isEmail.arguments.length == 1) return defaultEmptyOK; else return (isEmail.arguments[1] == true); // is s whitespace? if (isWhitespace(s)) return false; // there must be >= 1 character before @, so we // 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; } /* FUNCTIONS TO NOTIFY USER OF INPUT REQUIREMENTS OR MISTAKES. */ // Display prompt string s in status bar. function prompt (s) { window.status = s } // Display data entry prompt string s in status bar. function promptEntry (s) { window.status = pEntryPrompt + s } function checkString (theField, s, emptyOK){ if (checkString.arguments.length == 2) emptyOK = defaultEmptyOK; if ((emptyOK == true) && (isEmpty(theField.value))) return true; if (isWhitespace(theField.value)){ alert(mPrefix + s + mSuffix); theField.focus(); theField.select(); return false; } else return true; } function checkEmail (theField, emptyOK){ if (checkEmail.arguments.length == 1) emptyOK = defaultEmptyOK; if ((emptyOK == true) && (isEmpty(theField.value))) return true; else { if (!isEmail(theField.value, false)){ alert(iEmail); theField.focus(); theField.select(); return false; } else return true; } } function checkAlpha(theField){ if (!isAlphabetic(theField.value)) { alert("This field can only contain alphabetic characters. Please try again."); theField.focus(); theField.select(); return false; } else return true; } // Get checked value from radio button. function getRadioButtonValue (radio){ for (var i = 0; i < radio.length; i++){ if (radio[i].checked) break } return radio[i].value } // Is at least one checkbox checked? function getCheckBoxChecked(theForm) { var oneChecked = false; for (i=0; i