var FormCheckBrowser = new Browser() var MAXFILENAMELEN = 24 function FormCheck(fields, language) // Ctor { if (arguments.length == 2) this.language = language else this.language = 'EN' this.fields = fields this.InputCheck = FormCheck_InputCheck // Functions below are for internal use. this._reqif = FormCheck__reqif this._ext = FormCheck__ext this._dateRangeCheck = FormCheck__dateRangeCheck this._isSuspicious = FormCheck__isSuspicious this._emailok = FormCheck__emailok } function FormCheck_InputCheck(objForm) { var isOk = true var index var notfilled var fieldType var valid for (index = 0; isOk && index < this.fields.length; index++) { if (typeof(this.fields[index]) == 'undefined') { alert('FormCheck: Invalid field array.') return false } else if (typeof(objForm[this.fields[index].fld]) == 'undefined') { alert('FormCheck: Field #' + index + ' not found.') return false } // if fieldType = this.fields[index].type.toUpperCase() // When .length attribut exists this should an array of radio buttons. // We only support the required attribute for this type of field. // Errors are given if this assumption is not satisfied. if (objForm[this.fields[index].fld].length && !objForm[this.fields[index].fld].type) { if (fieldType != 'REQUIRED') { alert('Array:' + this.fields[index].fld + ' Alleen controletype ' + '"Required" is ondersteund.') isOk = false } else if (objForm[this.fields[index].fld][0].type != 'radio') { alert('Array:' + this.fields[index].fld + ' Alleen input type ' + '"radio" is ondersteund.') isOk = false } else { var nArrayLength = objForm[this.fields[index].fld].length isOk = false for (var nIdx = 0; nIdx < nArrayLength && !isOk; nIdx++) { isOk = objForm[this.fields[index].fld][nIdx].checked } // for } if ( !isOk) { if (this.language == 'EN') { alert("Please choose an option from field '" + this.fields[index].name + "'") } else { alert("Kies a.u.b een optie voor veld '" + this.fields[index].name + "'") } objForm[this.fields[index].fld][0].focus() } } // if if (isOk && !objForm[this.fields[index].fld].length) { // First determine if field to check is empty or not. if (objForm[this.fields[index].fld].type.substring(0, 6) == 'select') { if (objForm[this.fields[index].fld].selectedIndex == -1) notfilled = true else { notfilled = objForm[this.fields[index].fld].options[objForm [this.fields[index].fld].selectedIndex].value == '' } } else { notfilled = objForm[this.fields[index].fld].value == '' } // First check if there are suspicious characters (skipped for select) // and then perform the field checks. if (objForm[this.fields[index].fld].type.substring(0, 6) != 'select' && this._isSuspicious(this.fields[index].name, objForm[this.fields[index].fld].value)) { isOk = false } else if (fieldType == "REQUIRED") { if (notfilled) { isOk = false; if (this.fields[index].name.substr(0, 1) == '+') { // When name starts with a +, this field contains the // complete error message instead of just the field name. // In that case we just display this message. alert(this.fields[index].name.substr(1, 999)) } else if (this.language == 'EN') { alert("Field '" + this.fields[index].name + "' is required. Please specify.") } else { alert("Veld '" + this.fields[index].name + "' is verplicht. Specificeer a.u.b een waarde.") } objForm[this.fields[index].fld].focus(); } } else if (fieldType.substring(0, 5) == "REQIF") { if (this._reqif(objForm, this.fields[index].type.substring(5, this.fields[index].type.length))) { if (notfilled) { isOk = false; if (this.fields[index].name.substr(0, 1) == '+') { // When name starts with a +, this field contains the // complete error message instead of just the field name. // In that case we just display this message. alert(this.fields[index].name.substr(1, 999)) } else if (this.language == 'EN') { alert("Field '" + this.fields[index].name + "' is required. Please specify.") } else { alert("Veld '" + this.fields[index].name + "' is verplicht. Specificeer a.u.b een waarde.") } objForm[this.fields[index].fld].focus(); } // if } // if } else if (fieldType.substring(0, 3) == "EXT") { var typeList // List of accepted types (returned by _ext()). typeList = this._ext(objForm, this.fields[index].fld, this.fields[index].type.substring(3, this.fields[index].type.length), typeList) if (typeList != '') { isOk = false; if (this.language == 'EN') { alert("Invalid document type for field '" + this.fields[index].name + "'. (Use " + typeList + ")") } else { alert("Ongeldig documenttype voor veld '" + this.fields[index].name + "'. (Gebruik " + typeList + ")") } objForm[this.fields[index].fld].focus(); } } else if (fieldType.substring(0, 6) == "DATENL") { var ADate = new Datum(objForm[this.fields[index].fld].value, Datum.FORMAT_DDMMYY) var errorMsg if (!ADate.IsOk()) { isOk = false alert(this.fields[index].name + ': ' + ADate.FoutmeldingNL()) objForm[this.fields[index].fld].focus(); } else { errorMsg = this._dateRangeCheck(ADate, fieldType) if (errorMsg != '') { isOk = false alert(this.fields[index].name + ': ' + errorMsg) objForm[this.fields[index].fld].focus(); } // if } // if } else if (fieldType.substring(0, 6) == "DATEUK") { var errorMsg var ADate = new Datum(objForm[this.fields[index].fld].value, Datum.FORMAT_DDMMYY) if (!ADate.IsOk()) { isOk = false alert(this.fields[index].name + ': ' + ADate.FoutmeldingEN()) objForm[this.fields[index].fld].focus(); } else { errorMsg = this._dateRangeCheck(ADate, fieldType) if (errorMsg != '') { isOk = false alert(this.fields[index].name + ': ' + errorMsg) objForm[this.fields[index].fld].focus(); } // if } // if } else if (fieldType.substr(0, 6) == "MAXLEN") { var maxlen = parseInt(this.fields[index].type.substring(7, this.fields[index].type.length -1)) if (objForm[this.fields[index].fld].value.length > maxlen) { isOk = false; if (this.language == 'EN') { alert("Maximum length for field '" + this.fields[index].name + "' is " + maxlen + " characters. Please shorten your input " + " by at least " + (objForm[this.fields[index].fld].value.length - maxlen) + " characters.") } else { alert("Maximum lengte voor veld '" + this.fields[index].name + "' is " + maxlen + " tekens. Maak uw antwoord a.u.b " + " minstens " + (objForm[this.fields[index].fld].value.length - maxlen) + " tekens korter.") } objForm[this.fields[index].fld].focus(); } } else if (fieldType.substr(0, 6) == "MINLEN") { var minlen = parseInt(this.fields[index].type.substring(7, this.fields[index].type.length -1)) if (objForm[this.fields[index].fld].value.length < minlen) { isOk = false; if (this.language == 'EN') { alert("Minimum length for field '" + this.fields[index].name + "' is " + minlen + " characters.") } else { alert("Minimum lengte voor veld '" + this.fields[index].name + "' is " + minlen + " tekens.") } objForm[this.fields[index].fld].focus(); } } else if (fieldType.substr(0, 6) == "MAILTO") { // An empty field is considered ok if (objForm[this.fields[index].fld].value.length > 0) { var value = objForm[this.fields[index].fld].value var atpos, semicolonpos, questionpos semicolonpos = value.indexOf(';') atpos = value.lastIndexOf('@') isOk = false if (semicolonpos == -1 || atpos == -1 || atpos < semicolonpos) { if (this.language == 'EN') { alert("Field '" + this.fields[index].name + "' please use " + "format: John Doe;john.doe@mycompany.com.") } else { alert("Veld '" + this.fields[index].name + "' gebruik a.u.b. " + "het formaat: Jan Jansen;jan.jansen@bedrijf.nl.") } objForm[this.fields[index].fld].focus() } else isOk = true } } else if (fieldType.substr(0, 5) == "EMAIL") { // An empty field is considered ok isOk = true if (objForm[this.fields[index].fld].value.length > 0) { if (!this._emailok(objForm[this.fields[index].fld].value)) { if (this.language == 'EN') { alert("Field '" + this.fields[index].name + "' contains " + "an invalid e-mail address.") } else { alert("Veld '" + this.fields[index].name + "' bevat " + "een ongeldig e-mail adres.") } objForm[this.fields[index].fld].focus() isOk = false } } } else if (fieldType.substr(0, 7) == "NUMERIC") { // An empty field is considered ok if (objForm[this.fields[index].fld].value.length > 0) { //prohibit non numeric value var pos = objForm[this.fields[index].fld].value.search(/[^0-9,.]/) var value = parseInt(objForm[this.fields[index].fld].value) valid = !isNaN(value) && (pos == -1) if (!valid && objForm[this.fields[index].fld].value.length > 0) { isOk = false; if (this.language == 'EN') { alert("Please specify a numeric value for field '" + this.fields[index].name + "'.") } else { alert("Specificeer a.u.b. een numerieke waarde voor veld '" + this.fields[index].name + "'.") } objForm[this.fields[index].fld].focus(); } else { var curlyopen = fieldType.indexOf('{') var curlyclose = fieldType.indexOf('}') var dash = fieldType.indexOf('-', curlyopen) var minval, maxval minval = parseInt(fieldType.substring(curlyopen + 1, dash)) maxval = parseInt(fieldType.substring(dash + 1, curlyclose)) if (!isNaN(minval) && value < minval) { if (this.language == 'EN') { alert("Minimum value for field '" + this.fields[index].name + "' is " + minval + '.') } else { alert("De minimum waarde voor veld '" + this.fields[index].name + "' is " + minval + '.') } isOk = false } else if (!isNaN(maxval) && value > maxval) { if (this.language == 'EN') { alert("Maximum value for field '" + this.fields[index].name + "' is " + maxval + '.') } else { alert("De maximum waarde voor veld '" + this.fields[index].name + "' is " + maxval + '.') } isOk = false } // if if (!isOk) objForm[this.fields[index].fld].focus(); } // if } // if } else if (fieldType == "FILENAME") { if (notfilled) isOk = true else { var backslash; // position of last backslash in file name. var filename = objForm[this.fields[index].fld].value backslash = filename.lastIndexOf('\\') if (backslash == -1) backslash = filename.lastIndexOf('/') if (backslash != -1) filename = filename.substr(backslash + 1, 999) if (filename.length > MAXFILENAMELEN) { isOk = false if (this.language == 'EN') { alert("Maximum length for a filename (field '" + this.fields[index].name + "') is " + MAXFILENAMELEN + " characters. Please re-specify.") } else { alert("Maximum lengte voor een bestandsnaam (Veld '" + this.fields[index].name + "') is " + MAXFILENAMELEN + " tekens. Specificeer a.u.b een andere waarde.") } objForm[this.fields[index].fld].focus(); } // if } // if } // if } // if } // while return isOk; } // FormCheck_InputCheck // Checks to see if the condition given in the condition // parameter is actually met. The condition parameter is // of the form: {fieldname, condition} // // condition can be: checked field is a checkbox and must be checked. // unchecked field is a checkbox and must be unchecked. // empty field is empty. // filled field is not empty. // function FormCheck__reqif(objForm, condition) { var conditionmet = false var comma = condition.indexOf(',') var braceopen = condition.indexOf('{') var braceclose = condition.indexOf('}') if (comma != -1 && braceopen != -1 && braceclose != -1) { var fldname = condition.substring(1, comma) var typecheck = condition.substring(comma + 1, braceclose) var objfld = FormCheckBrowser.MMGet(fldname) var filled // First determine if field to check is empty or not. if (objfld.type.substring(0, 6) == 'select') filled = objfld.options.length != 0 else filled = objfld.value.length != 0 if (typecheck == 'checked') conditionmet = objfld.checked else if (typecheck == 'unchecked') conditionmet = !objfld.checked else if (typecheck == 'empty') conditionmet = !filled else if (typecheck == 'filled') conditionmet = filled else if (typecheck.substring(0, 7) == 'equals ') { var equalvalue = parseInt(typecheck.substring(7, braceclose)) conditionmet = (objfld.value == equalvalue) } else conditionmet = objfld } else alert('FormCheck: reqif condition spec error') return conditionmet } // FormCheck__reqif // // Controleert of de extensie van het gegeven veld voorkomt in de // lijst met extensies die zijn toegestaan. Retourneert een lege // string indien dat zo is, of een lijst met wel toegestande extensies // indien de gevonden extensie niet wordt goedgekeurd. // function FormCheck__ext(objForm, fldname, condition, typeList) { typeList = '' var index var braceopen = condition.indexOf('{') var braceclose = condition.indexOf('}') if (braceopen != -1 && braceclose != -1) { var objfld = FormCheckBrowser.MMGet(fldname) // Leeg veld wordt goedgekeurd dus alleen de controle // uitvoeren indien een waarde is ingevoerd in het te // controleren veld. if (objfld.value.length != 0) { var extList // Lijst met te checken extensies. var exts // Array met extensies uit extList (via String.split()). var period // Positie van punt in antwoordveld (-1 indien geen punt). var ok // true zodra de extensie in array exts is gevonden. var ext // de te onderzoeken extensie (of '' bij geen extensie) extList = condition.substring(braceopen + 1, braceclose) exts = extList.split(",") period = objfld.value.lastIndexOf('.') if (period == -1) ext = '' else ext = objfld.value.substring(period + 1, objfld.value.length) ok = false for (index = 0; !ok && index < exts.length; index++) ok = (ext.toUpperCase() == exts[index].toUpperCase()) if (!ok) { // Lijst aanmaken met toegestane types. for (index = 0; index < exts.length; index++) { if (typeList.length != 0) { if (index + 1 == exts.length) typeList = typeList + (this.language == 'EN' ? ' or ' : ' of ') else typeList = typeList + ', ' } typeList += '.' + exts[index] } // for } // if } // if } else alert('FormCheck: ext condition spec error') return typeList } // FormCheck__ext // Determines whether there are minimum and/or maximum limits and applies them. function FormCheck__dateRangeCheck(ADate, fieldType) { var errorMsg = '' var curlyopen = fieldType.indexOf('{') var curlyclose = fieldType.indexOf('}') var dash = fieldType.indexOf('-', curlyopen) var minval, maxval minval = parseInt(fieldType.substring(curlyopen + 1, dash)) maxval = parseInt(fieldType.substring(dash + 1, curlyclose)) errorMsg = '' if (!isNaN(minval)) { var minDate = new Datum() minDate.ParseInt(minval) if (ADate.Compare(minDate) < 0) { if (this.language == 'EN') errorMsg = "Minimum value is " + minDate.ToString() + '.' else errorMsg = "De minimum waarde is " + minDate.ToString() + '.' } } // if if (errorMsg == '' && !isNaN(maxval)) { var maxDate = new Datum() maxDate.ParseInt(maxval) if (ADate.Compare(maxDate) > 0) { if (this.language == 'EN') errorMsg = "Maximum value is " + maxDate.ToString() + '.' else errorMsg = "De maximum waarde is " + maxDate.ToString() + '.' } } // if return errorMsg } // FormCheck__dateRangeCheck function FormCheck__isSuspicious(fieldName, theValue) { var pos // Position containing suspicious character. // Any character not within the given list is considered suspicious. pos = theValue.search(/[^A-Za-z0-9 ~!@#$%^&*()_+-=\{\}\[\];:'",.\\\/<>\n\t\v\r\?]éáúíóëäüïöàèùìòÉÁÚÍÓËÄÜÏÖÈÀÙÌÒ/) if (pos != -1) { alert('Your input for "' + fieldName + '" contains special characters that may cause\n' + 'the CMS to fail. Please examine your input at position ' + (pos + 1) + ': ' + theValue.charAt(pos) + '.') } return (pos != -1) } function FormCheck__emailok(email) { var bOK = true if (email.length != 0) { var emailTest = email.match(/(.+)@(.+)\.([a-zA-Z][a-zA-Z]+)/) bOK = (emailTest != null && emailTest.length == 4) } return bOK }