// ---------------------------------------------------------------------- // Javascript form validation routines. // Author: Stephen Poley // // Simple routines to quickly pick up obvious typos. // All validation routines return true if executed by an older browser: // in this case validation must be left to the server. // // Update Aug 2004: have tested that IE 5.0 and IE 5.5 both support DOM model // sufficiently well, so innerHTML option removed (redundant). // ---------------------------------------------------------------------- var nbsp = 160; // non-breaking space char var laquo = 171; // non-breaking space char var node_text = 3; // DOM text node-type emptyString = /^\s*$/ // ----------------------------------------- // trim // Trim leading/trailing whitespace off string // ----------------------------------------- function trim(str) { return str.replace(/^\s+|\s+$/g, '') }; // ----------------------------------------- // msg // Display warn/error message in HTML element // commonCheck routine must have previously been called // ----------------------------------------- function msg(fld, // id of element to display message in msgtype, // class to give element ("warn" or "error") message) // string to display { // setting an empty string can give problems if later set to a // non-empty string, so ensure a space present. (For Mozilla and Opera one could // simply use a space, but IE demands something more, like a non-breaking space.) var dispmessage; if (emptyString.test(message)) dispmessage = String.fromCharCode(nbsp); else if (message == "«") dispmessage = String.fromCharCode(laquo); else dispmessage = message; var elem = document.getElementById(fld); elem.firstChild.nodeValue = dispmessage; elem.className = msgtype; }; // ----------------------------------------- // commonCheck // Common code for all validation routines to: // (a) check for older / less-equipped browsers // (b) check if empty fields are required // Returns true (validation passed), // false (validation failed) or // proceed (don't know yet) // ----------------------------------------- var proceed = 2; function commonCheck (vfld, // element to be validated ifld, // id of element to receive info/error msg reqd) // true if required { if (!document.getElementById) return true; // not available on this browser - leave validation to the server var elem = document.getElementById(ifld); if (!elem.firstChild) return true; // not available on this browser if (elem.firstChild.nodeType != node_text) return true; // ifld is wrong type of node if (emptyString.test(vfld.value)) { if (reqd) { msg (ifld, "error", "«"); vfld.focus(); return false; } else { msg (ifld, "warn", ""); // OK return true; } } return proceed; } // ----------------------------------------- // validatePresent // Validate if something has been entered // Returns true if so // ----------------------------------------- function validatePresent(vfld, // element to be validated ifld ) // id of element to receive info/error msg { var stat = commonCheck (vfld, ifld, true); if (stat != proceed) return stat; msg (ifld, "warn", ""); return true; }; // ----------------------------------------- // validateEmail // Validate if e-mail address // Returns true if so (and also if could not be executed because of old browser) // ----------------------------------------- function validateEmail (vfld, // element to be validated ifld, // id of element to receive info/error msg reqd) // true if required { var stat = commonCheck (vfld, ifld, reqd); if (stat != proceed) return stat; var tfld = trim(vfld.value); // value of field with whitespace trimmed off var email = /^[^@]+@[^@.]+\.[^@]*\w\w$/ if (!email.test(tfld)) { msg (ifld, "error", "«"); vfld.focus(); return false; } if((tfld.indexOf(' ')>0)||(tfld.indexOf(';')>0)||(tfld.indexOf(',')>0)) { msg (ifld, "error", "«"); vfld.focus(); return false; } var email2 = /^[A-Za-z][\w.-]+@\w[\w.-]+\.[\w.-]*[A-Za-z][A-Za-z]$/ if (!email2.test(tfld)) msg (ifld, "warn", "Unusual e-mail address - check if correct"); else msg (ifld, "warn", ""); return true; }; // ----------------------------------------- // validateTelnr // Validate telephone number // Returns true if so (and also if could not be executed because of old browser) // Permits spaces, hyphens, brackets and leading + // ----------------------------------------- function validateTelnr (vfld, // element to be validated ifld, // id of element to receive info/error msg reqd) // true if required { var stat = commonCheck (vfld, ifld, reqd); if (stat != proceed) return stat; var tfld = trim(vfld.value); // value of field with whitespace trimmed off var telnr = /^\+?[0-9 ()-]+[0-9]$/ if (!telnr.test(tfld)) { msg (ifld, "error", "«"); vfld.focus(); return false; } var numdigits = 0; for (var j=0; j='0' && tfld.charAt(j)<='9') numdigits++; if (numdigits<6) { msg (ifld, "error", "ERROR: too short"); vfld.focus(); return false; } if (numdigits>14) msg (ifld, "warn", numdigits + " digits - check if correct"); else { if (numdigits<10) msg (ifld, "warn", "Only " + numdigits + " digits - check if correct"); else msg (ifld, "warn", ""); } return true; }; // ----------------------------------------- // validateCapital // Validate number, between 4 and 9 digits long, warns if over 6 // Returns true if so (and also if could not be executed because of old browser) // Permits only numbers, no commas or points // ----------------------------------------- function validateCapital (vfld, // element to be validated ifld, // id of element to receive info/error msg reqd) // true if required { var stat = commonCheck (vfld, ifld, reqd); if (stat != proceed) return stat; var tfld = trim(vfld.value); // value of field with whitespace trimmed off var numdigits = 0; for (var j=0; j='0' && tfld.charAt(j)<='9') numdigits++; if (numdigits!=tfld.length) { msg (ifld, "error", "Numbers only, please."); vfld.focus(); return false; } if (numdigits==1 && tfld.charAt(0)=='0') { //allow people to enter a zero msg (ifld, "warn", "Are you sure you have no capital?"); return true; } if (numdigits<4) { msg (ifld, "error", "ERROR: too short"); vfld.focus(); return false; } if (tfld<1000) { msg (ifld, "error", "ERROR: Must be at least 1000"); vfld.focus(); return false; } if (numdigits>6) msg (ifld, "warn", numdigits + " digits - check if correct"); else { if (numdigits>9) { msg (ifld, "error", "Error: too long"); vfld.focus(); return false; } else msg (ifld, "warn", ""); } return true; };