/********************************************************* Set of JavaScript functions used for validation JavaScript Validation 2.0, 19/Mar/2001 Jake Howlett, http://www.codestore.org/ Updated on 12/Mar/2002 to allow periods (.) as date-separators Sample validations **********************************************************/ /*********************************************************** validateNumber() This function checks that the value of a field is a number and, optionally within a certain range. Arguments: val = Value to be checked min = Optional minimum allowed value max = Optional maximum allowed value ************************************************************/ function validateNumber(val, min, max){ if ( isNaN( val ) ) return false; if ( min && val < min ) return false; if ( max && val > max ) return false; return true; } /*********************************************************** dateComponents() This function splits a date in to the day, month and year components, depending on the format supplied. Used by Date Validation routine. Arguments: obj = Input whose value is to be checked format = date format, ie mm/dd or dd/mm ************************************************************/ function dateComponents(dateStr, format) { var results = new Array(); var datePat = /^(\d{1,2})(\/|-|\.)(\d{1,2})\2(\d{2}|\d{4})$/; var matchArray = dateStr.match(datePat); if (matchArray == null) { return null; } //check for two digit (20th century) years and prepend 19. matchArray[4] = (matchArray[4].length == 2) ? '19' + matchArray[4] : matchArray[4]; // parse date into variables if (format.charAt(0)=="d"){ //what format does the server use for dates? results[0] = matchArray[1]; results[1] = matchArray[3]; } else { results[1] = matchArray[1]; results[0] = matchArray[3]; } results[2] = matchArray[4]; return results; } /*********************************************************** valiDate() This function checks that the value of a date is in the correct format and, optionally, within a certain range. Arguments: obj = Input whose value is to be checked min = Optional minimum allowed value max = Optional maximum allowed value format = date format, ie mm/dd or dd/mm ************************************************************/ function valiDate(obj, min, max, format){ // alert( obj.name + " - " + obj.value ) dateBits = dateComponents(obj.value, format); if (dateBits == null) return false; //Check it is a valid date first day = dateBits[0]; month = dateBits[1]; year = dateBits[2]; if ((month < 1 || month > 12) || (day < 1 || day > 31)) { // check month range return false; } if ((month==4 || month==6 || month==9 || month==11) && day==31) { return false; } if (month == 2) { // check for february 29th var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); if (day>29 || (day==29 && !isleap)) { return false; } } //Now check whether a range is specified and if in bounds var theDate = new Date(dateBits[2], parseInt(dateBits[1]) - 1, dateBits[0]); if ( min ) { minBits = dateComponents (min, format); var minDate = new Date(minBits[2], parseInt(minBits[1]) - 1, minBits[0]); if ( minDate.getTime() > theDate.getTime() ) return false; } if ( max) { maxBits = dateComponents (max, format); var maxDate = new Date(maxBits[2], parseInt(maxBits[1]) - 1, maxBits[0]); if ( theDate.getTime() > maxDate.getTime() ) return false; } return true; } /*********************************************************** validateEmail() This function checks that the value of a field is a valid SMTP e-mail address ie x@xx.xx Arguments: obj = Input whose value is to be checked Original source: http://javascript.internet.com Author: Sandeep V. Tamhankar (stamhankar@hotmail.com) Note: Work in progress = validate SMTP OR Notes Canonical ************************************************************/ function validateEmail( obj ) { var emailStr = obj.value; var reg1 = /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/; // not valid var reg2 = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/; // valid if ( !reg1.test( emailStr ) && reg2.test( emailStr ) ) { return true; } else { return false; } } /*********************************************************** locateFileUpload() Returns a handle to the file upload control on a form. Used to get around the fact that there is no consistent way to refer to the element cross-browser. ***********************************************************/ function locateFileUpload( f ) { for(var i = 0; i < f.elements.length; i ++) if( f.elements[i].type=='file' ){ return f.elements[i]; } } /*********************************************************** validateFileType() This function checks that the type of file being uploaded is allowed Arguments: obj = The File Upload control. fTyp = Allowed file types ************************************************************/ function validateFileType( obj, fTyp ) { dots = obj.value.split("."); fType = "." + dots[dots.length-1]; if ( fTyp != null && fTyp.indexOf(fType) == -1 ) return false; return true; } /*********************************************************** validateFileLimit() This function checks that the value in a file upload Arguments: obj = The File Upload control cur = Current number of file attachments max = Limit on allowed files ************************************************************/ function validateFileLimit( obj, cur, max ) { if ( cur >= max ) return false; return true; } /*********************************************************** OnFailure() This function returns the failure message to the user and sets focus on the input in question. Arguments: obj = Input element on which to return focus lbl = Field Label to prepend on to the message msg = Array value for message to give the user ************************************************************/ function OnFailure( obj, lbl, msg ){ var msgs = new Array(); msgs["text"] = " is a required field. \n\nPlease enter a value."; msgs["textarea"] = " is a required field. \n\nPlease enter a value."; msgs["select-one"] = " is a required field. \n\nPlease select an entry."; msgs["select-multiple"] = " is a required field. \n\nPlease select an entry."; msgs["checkbox"] = " is a required field. \n\nPlease select an entry."; msgs["file"] = " is a required upload. \n\nPlease select a file."; msgs["fileType"] = " requires certain file types. \n\nPlease select a valid file type."; msgs["fileLimit"] = " is a limited file upload. \n\nPlease reduce number of attachment(s) first."; msgs["radio"] = " is a required field. \n\nPlease select an entry."; msgs["number"] = " is a numeric field. \n\nPlease enter a valid number."; msgs["date"] = " is a date field. \n\nPlease enter a valid date."; msgs["email"] = " is an address field. \n\nPlease enter a valid e-mail address."; if(msg[1] || msg[2]){ //upper/lower bound ranges have been specified if(msg[1] && msg[2]){//range term = ( msg[0] == "date" )? " ("+msg[3]+")" : ""; alert(lbl + msgs[msg[0]] + term + " between " + msg[1] + " and " + msg[2]); } else if (msg[1]) {//lower bound term = ( msg[0] == "number" ) ? " greater than " : " (" + msg[3] + ") after "; alert(lbl + msgs[msg[0]] + term + msg[1]); } else {//upper bound term = ( msg[0] == "number" )? " less than " : " (" + msg[3] + ") before "; alert(lbl + msgs[msg[0]] + term + msg[2]); } } else {//no range given alert(lbl + msgs[msg[0]]); } obj.focus(); return false; } /*********************************************************** isSomethingSelected() This function is passed an object of type radio group or check box. It then loops through all options and checks that one of them is selected, returning true if so. Arguments: obj = Reference to the parent object of the group. ************************************************************/ function isSomethingSelected( obj ){ for (var r=0; r < obj.length; r++){ if ( obj[r].checked ) return true; } } /*********************************************************** validateRequiredFields() This function is passed an array of fields that are required to be filled in and iterates through each ensuring they have been correctly entered. args: dhtml = true for dhtml forms or false ************************************************************/ function validateRequiredFields( f, a ){ for (var i=0; i < a.length; i++){ e = a[i][0]; // alert( "validating " + a[i][1] ); //checks input types: "text","select-one","select-multiple","textarea","checkbox","radio","file" switch (e.type) { case "text": if ( e.value == "" ) return OnFailure(e, a[i][1], ["text"] ); if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) return OnFailure(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]); break case "date": if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) return OnFailure(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]); break case "email": if ( !validateEmail(e) ) return OnFailure(e, a[i][1], ["email"]); break default: break } } // else alert( "No 3rd argument" ); break case "file": //make sure AT LEAST one file gets attached if ( a[i][2][1] == 0 && trim(e.value) == "" ) return OnFailure(e, a[i][1], ["file"]); if ( trim(e.value) != "") { //check type of file that is being uploaded if ( a[i][2][0] != null && validateFileType( e, a[i][2][0] ) == false ) return OnFailure(e, a[i][1], ["fileType"]); //check that file limit has not been reached if ( a[i][2][2] != null && validateFileLimit( e, a[i][2][1], a[i][2][2] ) == false ) return OnFailure(e, a[i][1], ["fileLimit"]); } break case "textarea": if ( trim(e.value) == "" ) return OnFailure(e, a[i][1], ["textarea"]); break case "select-one": if ( e.selectedIndex == 0 ) return OnFailure(e, a[i][1], ["select-one"]); break case "select-multiple": if (e.selectedIndex == -1) return OnFailure(e, a[i][1], ["select-multiple"]); break default: //must be a checkbox or a radio group if none of above if ( !e[0]) {//handle single item group first switch (e.type) { case "checkbox": if ( !e.checked ) return OnFailure(e, a[i][1], ["checkbox"]); break case "radio": if ( !e.checked ) return OnFailure(e, a[i][1], ["radio"]); break default: break } } else { //handle multi-item groups switch (e[0].type) { case "checkbox": if ( !isSomethingSelected( e ) ) return OnFailure(e[0], a[i][1], ["checkbox"]); break case "radio": if ( !isSomethingSelected( e ) ) return OnFailure(e[0], a[i][1], ["radio"]); break default: break } } break } } return true; } /*********************************************************** OnFailureDHTML() This function returns the failure message to the user and sets focus on the input in question. Arguments: obj = Input element on which to return focus lbl = Field Label to prepend on to the message msg = Array value for message to give the user ************************************************************/ function OnFailureDHTML( obj, lbl, msg ){ // new function to show the tab before moving the focus - dhtml tabs are used in formAnnual // check how we can accomodate for other forms, where there is no dhtml // alert( obj.elements.length ) // alert ( obj.value ) // alert( "OnFailureDHTML - " + lbl ); var msgs = new Array(); var returnOnFail; msgs["text"] = " is a required field. Please enter a value."; msgs["textarea"] = " is a required field. Please enter a value."; msgs["select-one"] = " is a required field. Please select an entry."; msgs["select-multiple"] = " is a required field. Please select an entry."; msgs["checkbox"] = " is a required field. Please select an entry."; msgs["file"] = " is a required upload. Please select a file."; msgs["fileType"] = " requires certain file types. Please select a valid file type."; msgs["fileLimit"] = " is a limited file upload. Please reduce number of attachment(s) first."; msgs["radio"] = " is a required field. Please select an entry."; msgs["number"] = " is a numeric field. Please enter a valid number."; msgs["date"] = " is a date field. Please enter a valid date."; msgs["email"] = " is an address field. Please enter a valid e-mail address."; var page; page = getFieldsDet( obj.name )[0]; page = " (Page " + page + ")" // alert( page ) if(msg[1] || msg[2]){ //upper/lower bound ranges have been specified if(msg[1] && msg[2]){//range term = ( msg[0] == "date" )? " ("+msg[3]+")" : ""; returnOnFail = lbl + msgs[msg[0]] + term + " between " + msg[1] + " and " + msg[2]; } else if (msg[1]) {//lower bound term = ( msg[0] == "number" ) ? " greater than " : " (" + msg[3] + ") after "; returnOnFail = lbl + msgs[msg[0]] + term + msg[1]; } else {//upper bound term = ( msg[0] == "number" )? " less than " : " (" + msg[3] + ") before "; returnOnFail = lbl + msgs[msg[0]] + term + msg[2]; } } else {//no range given // returnOnFail = lbl + msgs[msg[0]]; returnOnFail = lbl; } // obj.focus(); // alert( returnOnFail ); return returnOnFail + page; } /*********************************************************** validateRequiredFieldsDHTML() This function is passed an array of fields that are required to be filled in and iterates through each ensuring they have been correctly entered. args: dhtml = true for dhtml forms or false ************************************************************/ function validateRequiredFieldsDHTML( f, a ){ var debug = false; var isValid = false var firstObj; // on failure, capture first object to direct the focus var msgArray = new Array(); for (var i=0; i < a.length; i++) { e = a[i][0]; if ( debug ) alert( "validating " + a[i][1] + " " + e.type + " - " + e.value + " " + isValid + "\n\n"); // alert( "validating " + a[i][1] ); //checks input types: "text","select-one","select-multiple","textarea","checkbox","radio","file" switch (e.type) { case "text": if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["text"] ); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "date": if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "email": if ( !validateEmail(e) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["email"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break default: break } } // else alert( "No 3rd argument" ); break case "file": //make sure AT LEAST one file gets attached if ( a[i][2][1] == 0 && trim(e.value) == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["file"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } if ( trim(e.value) != "") { //check type of file that is being uploaded if ( a[i][2][0] != null && validateFileType( e, a[i][2][0] ) == false ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["fileType"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } //check that file limit has not been reached if ( a[i][2][2] != null && validateFileLimit( e, a[i][2][1], a[i][2][2] ) == false ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["fileLimit"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } } break case "textarea": // alert( e.name + " value = " + e.value ); if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["textarea"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "select-one": if ( e.selectedIndex == 0 ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["select-one"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "select-multiple": if (e.selectedIndex == -1) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["select-multiple"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "hidden": if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "date": // if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { // since user don't want any validation on dates, just checking for null value if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "email": if ( !validateEmail(e) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["email"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break default: break } } break default: //must be a checkbox or a radio group if none of above if ( !e[0]) {//handle single item group first switch (e.type) { case "checkbox": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["checkbox"]); if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break case "radio": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["radio"]); alert( msgArray[msgArray.length-1] ) if ( !isValid ) firstObj = e // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) isValid = true } break default: break } } else { //handle multi-item groups // alert( e[0].type + " - multiItem groups - " + a[i][1] ) switch (e[0].type) { case "checkbox": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e[0], a[i][1], ["checkbox"]); if ( !isValid ) firstObj = e[0] // toggleImage( e[0].name, false, debug ) } else { // toggleImage( e[0].name, true, debug ) isValid = true } break case "radio": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e[0], a[i][1], ["radio"]); if ( !isValid ) firstObj = e[0] // toggleImage( e[0].name, false, debug ) } else { // toggleImage( e[0].name, true, debug ) isValid = true } break default: break } } break } } var sMsg = "" if ( isValid ) { f.errorMsgString.value = sMsg return isValid; // true } else { sMsg = msgArray[0]; for (var k=1; k < msgArray.length; k++) { sMsg = sMsg + "\n" + msgArray[k] } f.errorMsgString.value = sMsg // showtab( getFieldsTab( firstObj.name ) ) showtab( getFieldsDet(firstObj.name)[0] ) if ( firstObj.type != "hidden" ) firstObj.focus() alert( "Please fill in any of the following fields to proceed.\n\n" + sMsg ) // newWin( f.thisDatabaseWithPath.value + "/formError?open", 600, 600, 50, 50, true, false ) return isValid } } /*********************************************************** validateRequiredFieldsANDDHTML() This function is passed an array of fields that are required to be filled in and iterates through each ensuring they have been correctly entered. args: dhtml = true for dhtml forms or false ************************************************************/ function validateRequiredFieldsANDDHTML( f, a ){ var debug = true; var isValid = true; var firstObj; // on failure, capture first object to direct the focus var msgArray = new Array(); for (var i=0; i < a.length; i++) { e = a[i][0]; if ( debug ) { // alert( "validating " + a[i][1] ); alert( "validating " + a[i][1] + " " + e.type + " - " + e.value + " " + isValid + "\n\n"); } //checks input types: "text","select-one","select-multiple","textarea","checkbox","radio","file" switch (e.type) { case "text": if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["text"] ); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "date": if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "email": if ( !validateEmail(e) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["email"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break default: break } } // else alert( "No 3rd argument" ); break case "file": //make sure AT LEAST one file gets attached if ( a[i][2][1] == 0 && trim(e.value) == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["file"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } if ( trim(e.value) != "") { //check type of file that is being uploaded if ( a[i][2][0] != null && validateFileType( e, a[i][2][0] ) == false ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["fileType"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } //check that file limit has not been reached if ( a[i][2][2] != null && validateFileLimit( e, a[i][2][1], a[i][2][2] ) == false ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["fileLimit"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } } break case "textarea": // alert( e.name + " value = " + e.value ); if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["textarea"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "select-one": if ( e.selectedIndex == 0 ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["select-one"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "select-multiple": if (e.selectedIndex == -1) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["select-multiple"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "hidden": if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["number", a[i][2][1], a[i][2][2]]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "date": // if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { // since user don't want any validation on dates, just checking for null value if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "email": if ( !validateEmail(e) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["email"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break default: break } } break default: //must be a checkbox or a radio group if none of above if ( !e[0]) {//handle single item group first switch (e.type) { case "checkbox": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["checkbox"]); if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break case "radio": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFailureDHTML(e, a[i][1], ["radio"]); alert( msgArray[msgArray.length-1] ) if ( isValid ) firstObj = e isValid = false // toggleImage( e.name, false, debug ) } else { // toggleImage( e.name, true, debug ) } break default: break } } else { //handle multi-item groups // alert( e[0].type + " - multiItem groups - " + a[i][1] ) switch (e[0].type) { case "checkbox": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e[0], a[i][1], ["checkbox"]); if ( isValid ) firstObj = e[0] isValid = false // toggleImage( e[0].name, false, debug ) } else { // toggleImage( e[0].name, true, debug ) } break case "radio": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFailureDHTML(e[0], a[i][1], ["radio"]); if ( isValid ) firstObj = e[0] isValid = false // toggleImage( e[0].name, false, debug ) } else { // toggleImage( e[0].name, true, debug ) } break default: break } } break } } var sMsg = "" if ( isValid ) { f.errorMsgString.value = sMsg return isValid; // true } else { sMsg = msgArray[0]; for (var k=1; k < msgArray.length; k++) { sMsg = sMsg + "\n" + msgArray[k] } f.errorMsgString.value = sMsg if ( debug ) alert( "Finished validating. Error Message string:" + sMsg ) if ( debug ) alert( show_props( firstObj, firstObj.name ) ) if ( debug ) alert( getFieldsDet(firstObj.name)[0] ) // showtab( getFieldsTab( firstObj.name ) ) showtab( getFieldsDet(firstObj.name)[0] ) if ( firstObj.type != "hidden" ) firstObj.focus() alert( "Please fill in the following fields to proceed.\n\n" + sMsg ) // newWin( f.thisDatabaseWithPath.value + "/formError?open", 600, 600, 50, 50, true, false ) return isValid } } /*********************************************************** returnChecked( obj ) This function is passed an object of type radio group or check box. It then loops through all options and checks that one of them is selected, returning true if so. Arguments: obj = Reference to the parent object of the group. ************************************************************/ function returnChecked( obj ){ for (var r=0; r < obj.length; r++){ if ( obj[r].checked ) return true; } } /*********************************************************** OnFail() This function returns the failure message to the user and sets focus on the input in question. Arguments: obj = Input element on which to return focus lbl = Field Label to prepend on to the message msg = Array value for message to give the user ************************************************************/ function OnFail( obj, lbl, msg, isDHTML ){ // new function to show the tab before moving the focus - dhtml tabs are used in formAnnual // check how we can accomodate for other forms, where there is no dhtml // alert( obj.elements.length ) // alert ( obj.value ) // alert( "OnFail - " + lbl ); var msgs = new Array(); var returnOnFail; msgs["text"] = " is a required field. Please enter a value."; msgs["textarea"] = " is a required field. Please enter a value."; msgs["select-one"] = " is a required field. Please select an entry."; msgs["select-multiple"] = " is a required field. Please select an entry."; msgs["checkbox"] = " is a required field. Please select an entry."; msgs["file"] = " is a required upload. Please select a file."; msgs["fileType"] = " requires certain file types. Please select a valid file type."; msgs["fileLimit"] = " is a limited file upload. Please reduce number of attachment(s) first."; msgs["radio"] = " is a required field. Please select an entry."; msgs["number"] = " is a numeric field. Please enter a valid number."; msgs["date"] = " is a date field. Please enter a valid date."; msgs["email"] = " is an address field. Please enter a valid e-mail address."; var page; if ( isDHTML ) { page = getFieldsDet( obj.name )[0]; page = " (Page " + page + ")" // alert( page ) } if(msg[1] || msg[2]){ //upper/lower bound ranges have been specified if(msg[1] && msg[2]){//range term = ( msg[0] == "date" )? " ("+msg[3]+")" : ""; returnOnFail = lbl + msgs[msg[0]] + term + " between " + msg[1] + " and " + msg[2]; } else if (msg[1]) {//lower bound term = ( msg[0] == "number" ) ? " greater than " : " (" + msg[3] + ") after "; returnOnFail = lbl + msgs[msg[0]] + term + msg[1]; } else {//upper bound term = ( msg[0] == "number" )? " less than " : " (" + msg[3] + ") before "; returnOnFail = lbl + msgs[msg[0]] + term + msg[2]; } } else {//no range given // returnOnFail = lbl + msgs[msg[0]]; if ( msg[0]=="email" ) returnOnFail = lbl + msgs[msg[0]]; else returnOnFail = lbl; } // obj.focus(); // alert( returnOnFail ); if ( isDHTML ) return returnOnFail + page; else return returnOnFail; } /*********************************************************** validateMandatoryFields() - This function is passed an array of fields that are required to be filled in and iterates through each ensuring they have been correctly entered. args: f = form object, a = array of field info isDHTML = true for dhtml forms or false isAND = true for AND(all fields) Validations or false for OR(any fields) Validations isToggleImage = true, when use images to toggle on validations or false, when no images are used ************************************************************/ function validateMandatoryFields( f, a, isDHTML, isAND, isToggleImage ){ var debug = false; var isValid; if ( isAND ) isValid = true; else isValid = false; var firstObj; // on failure, capture first object to direct the focus var msgArray = new Array(); for (var i=0; i < a.length; i++) { e = a[i][0]; if ( debug ) { // alert( "validating " + a[i][1] ); alert( "validating " + a[i][1] + " " + e.type + " - " + e.value + " " + isValid + "\n\n"); } //checks input types: "text","select-one","select-multiple","textarea","checkbox","radio","file" switch (e.type) { case "text": if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["text"], isDHTML ) if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["number", a[i][2][1], a[i][2][2]], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "date": if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "email": if ( !validateEmail(e) ) { if ( e.value == "" ) msgArray[ msgArray.length-1 ] = OnFail(e, a[i][1], ["email"], isDHTML ); else msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["email"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break default: break } } // else alert( "No 3rd argument" ); break case "file": //make sure AT LEAST one file gets attached if ( a[i][2][1] == 0 && trim(e.value) == "" ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["file"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } if ( trim(e.value) != "") { //check type of file that is being uploaded if ( a[i][2][0] != null && validateFileType( e, a[i][2][0] ) == false ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["fileType"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } //check that file limit has not been reached if ( a[i][2][2] != null && validateFileLimit( e, a[i][2][1], a[i][2][2] ) == false ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["fileLimit"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } } break case "textarea": // alert( e.name + " value = " + e.value ); if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["textarea"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "select-one": // alert( msgArray [ msgArray.length - 1 ] ) if ( e.selectedIndex == 0 ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["select-one"], isDHTML ); alert( msgArray [ msgArray.length - 1 ] ) if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "select-multiple": if (e.selectedIndex == -1) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["select-multiple"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "hidden": if ( a[i][2] ) { switch ( a[i][2][0] ){ case "number": if ( !validateNumber(e.value, a[i][2][1], a[i][2][2]) ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["number", a[i][2][1], a[i][2][2]], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "date": // if ( !valiDate(e, a[i][2][1], a[i][2][2], a[i][2][3]) ) { // since user don't want any validation on dates, just checking for null value if ( e.value == "" ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["date", a[i][2][1], a[i][2][2], a[i][2][3]], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "email": if ( !validateEmail(e) ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["email"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break default: break } } break default: //must be a checkbox or a radio group if none of above if ( !e[0]) {//handle single item group first switch (e.type) { case "checkbox": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["checkbox"], isDHTML ); if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "radio": if ( !e.checked ) { msgArray[ msgArray.length ] = OnFail(e, a[i][1], ["radio"], isDHTML ); alert( msgArray[msgArray.length-1] ) if ( isValid ) firstObj = e if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break default: break } } else { //handle multi-item groups // alert( e[0].type + " - multiItem groups - " + a[i][1] ) switch (e[0].type) { case "checkbox": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFail(e[0], a[i][1], ["checkbox"], isDHTML ); if ( isValid ) firstObj = e[0] if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break case "radio": if ( !isSomethingSelected( e ) ) { msgArray[ msgArray.length ] = OnFail(e[0], a[i][1], ["radio"], isDHTML ); if ( isValid ) firstObj = e[0] if ( isAND ) isValid = false if ( isToggleImage ) toggleImage( e.name, false, debug ) } else { if ( isToggleImage ) toggleImage( e.name, true, debug ) if ( !( isAND ) ) isValid = true } break default: break } } break } } var sMsg = "" if ( isValid ) { f.errorMsgString.value = sMsg return isValid; // true } else { sMsg = msgArray[0]; for (var k=1; k < msgArray.length; k++) { sMsg = sMsg + "\n" + msgArray[k] } f.errorMsgString.value = sMsg if ( debug ) alert( "Finished validating. Error Message string:" + sMsg ) if ( debug ) alert( show_props( firstObj, firstObj.name ) ) if ( debug ) alert( getFieldsDet(firstObj.name)[0] ) // showtab( getFieldsTab( firstObj.name ) ) if ( isDHTML ) showtab( getFieldsDet(firstObj.name)[0] ) if ( firstObj.type != "hidden" ) firstObj.focus() if ( isAND ) alert( "Please fill in the following fields \nand Press OK button below to return to the form.\n\n" + sMsg ) else alert( "Please fill in any one of the following fields \nand Press OK button below to return to the form.\n\n" + sMsg ) // newWin( f.thisDatabaseWithPath.value + "/formError?open", 600, 600, 50, 50, true, false ) return isValid } } /*********************************************************** getFieldsTab( sField ) This function returns the tab number under which the field exist. This tab number is used in showtab function to display the required tab before sending focus to that field. Arguments: field name ************************************************************/ function getFieldsTab( sField ){ // alert( "Inside OnFailure " + lbl ); var getTab = new Array(); getTab["aa_EmpNationality"] = 1; getTab["aa_EmpPositionStart"] = 1; getTab["aa_EmpCountry"] = 1; getTab["aa_PeriodFrom"] = 1; getTab["aa_PeriodTo"] = 1; getTab["aa_DateOfInterview"] = 1; getTab["aa_PosMissionsObjectives1"] = 1; getTab["aa_EmpMission1"] = 2; getTab["aa_EmpMission2"] = 2; getTab["aa_EmpMission3"] = 2; getTab["aa_EmpMission4"] = 2; getTab["aa_EmpMissionChoice1"] = 2; getTab["aa_EmpMissionChoice2"] = 2; getTab["aa_EmpMissionChoice3"] = 2; getTab["aa_EmpMissionChoice4"] = 2; return getTab[sField]; } function toggleImage( sFldName, vToggle, vDebug ) { // usage : toggleImage( document.forms(0).aa_OverallRemark.name, false, true ) return true var imgArray = new Array(); imgArray[0]=new Image(8,16); imgArray[1]=new Image(8,16); imgArray[2]=new Image(8,16); imgArray[3]=new Image(8,16); imgArray[0].src="/intranetgb/hr/hr_training.nsf/black_star.gif" imgArray[1].src="/intranetgb/hr/hr_training.nsf/red_star.gif" imgArray[2].src="/intranetgb/hr/hr_training.nsf/white_star.gif" imgArray[3].src="/intranetgb/hr/hr_training.nsf/blue_star.gif" if ( !vToggle ) { if ( document.images[ sFldName + "Img" ] != null ) { if ( vDebug ) alert( "Changing document.images[ " + sFldName + "Img].src" + " to " + imgArray[getFieldsDet(sFldName)[2]].src ) document.images[ sFldName + "Img" ].src = imgArray[getFieldsDet(sFldName)[2]].src // imgArray[1].src } } else { if ( document.images[ sFldName + "Img" ] != null ) { if ( vDebug ) alert( "Changing document.images[ " + sFldName + "Img].src" + " to " + imgArray[getFieldsDet(sFldName)[1]].src ) document.images[ sFldName + "Img" ].src = imgArray[getFieldsDet(sFldName)[1]].src // imgArray[0].src } } } function toggleImage_getElementByID( sFldName, vToggle, vDebug ) { // usage : toggleImage( document.forms(0).aa_OverallRemark.name, false, true ) var imgArray = new Array(); imgArray[0]=new Image(8,16); imgArray[1]=new Image(8,16); imgArray[2]=new Image(8,16); imgArray[3]=new Image(8,16); imgArray[0].src="/intranetgb/hr/hr_training.nsf/black_star.gif" imgArray[1].src="/intranetgb/hr/hr_training.nsf/red_star.gif" imgArray[2].src="/intranetgb/hr/hr_training.nsf/white_star.gif" imgArray[3].src="/intranetgb/hr/hr_training.nsf/blue_star.gif" if ( !vToggle ) { if ( document.getElementById( sFldName + "Img" ) != null ) { if ( vDebug ) alert( "Changing document.getElementById( " + sFldName + "Img).src" + " to " + imgArray[getFieldsDet(sFldName)[2]].src ) document.getElementById( sFldName + "Img" ).src = imgArray[getFieldsDet(sFldName)[2]].src // imgArray[1].src } } else { if ( document.getElementById( sFldName + "Img" ) != null ) { if ( vDebug ) alert( "Changing document.getElementById( " + sFldName + "Img).src" + " to " + imgArray[getFieldsDet(sFldName)[1]].src ) document.getElementById( sFldName + "Img" ).src = imgArray[getFieldsDet(sFldName)[1]].src // imgArray[0].src } } }