1// $Id: requiredFields.js 40191 2026-07-23 08:19:49Z brendon $ 2// Just the fundamental required fields function 3 4// Variables to be populated in the HTML 5var requiredFields = new Array; //the fields' names 6var fieldNames = new Array; 7var valStrings = new Array; 8 9// On our big forms looping through all the fields is slow, so let's do it only once. 10var formElementIndex = new Array; 11var formElementIndexInitialised = false; 12 13function initFormElementIndex (formObject) { 14 if (typeof formObject == "undefined") { formObject = document.forms[0]; } 15 var lastElement = ''; 16 //alert ('Initialising'); 17 for (var i = 0; i < formObject.elements.length; i++) { 18 if (formObject.elements[i].nodeName != "LABEL" && formObject.elements[i].nodeName != "OUTPUT") { 19 // Filter label elements, which are part of elements array in BlackBerry OS 5.x, and undesired 20 if (formObject.elements[i].name != lastElement) { 21 lastElement = formObject.elements[i].name; 22 if (lastElement) { formElementIndex[lastElement] = i; } 23 //alert ('formElementIndex['+lastElement+'] = '+formElementIndex[lastElement]); 24 } 25 //status = (i+1) + '/' + formObject.elements.length; 26 } 27 } 28 formElementIndexInitialised = true; 29 return true; 30} 31 32// Check for population of required fields 33function checkRequiredFields (formObject) { 34 var fieldCheck = true; 35 var fieldFirst = ""; 36 var fieldValue, thisField, selIndex, gotFirstElement; 37 var indentation = (navigator.userAgent.indexOf("Chrome") !== -1 && navigator.userAgent.indexOf("Windows") !== -1) ? new Array(9).join(' ') : '\t'; 38 var fieldsNeeded = "\n" + valStrings["incompleteFields"] + "\n\n" + indentation; 39 var inputRadio = document.getElementsByClassName('genderRadio'); 40 41 //alert ("Checking Required Fields"); 42 //alert ('typeof(formObject) is ' + typeof(formObject)); 43 //alert ('typeof(formObject.elements) is ' + typeof(formObject.elements)); 44 if (!formElementIndexInitialised) { initFormElementIndex(formObject); } 45 // Loop through fields looking for empty or whitespace values, or their analogues in selects & checkboxes 46 for (var fieldNum = 0; fieldNum < requiredFields.length; fieldNum++) { 47 thisField = (requiredFields[fieldNum].match(/^[_~%].*/) ? requiredFields[fieldNum].substr(1) : requiredFields[fieldNum]); 48 //alert ('thisField = ' + thisField); 49 if (typeof formElementIndex[thisField] == "undefined") { 50 alert ("Error: " + thisField + " doesn't exist!"); 51 } else { 52 //alert (thisField + ' is not undefined.'); 53 } 54 if (requiredFields[fieldNum].substr(0,1) == "_" && inputRadio.length == 0) { 55 //Then we have a select box which requires a non-null value 56 //alert (thisField + ' is a select box.'); 57 selIndex = formObject.elements[formElementIndex[thisField]].selectedIndex; 58 //alert (thisField + "'s selectedIndex is "+ selIndex); 59 if (selIndex == -1) { 60 fieldValue = ""; 61 } else { 62 fieldValue = formObject.elements[formElementIndex[thisField]].options[selIndex].value; 63 } 64 // since we reset these dropdown elements to their placeholder values, need to validate selection 65 var exceptionRegex = /^(gender|mGender)$/; 66 if (thisField.match(exceptionRegex)) { 67 fieldValue = (fieldValue == "0") ? "" : fieldValue; 68 } 69 } else if (requiredFields[fieldNum].substr(0,1) == "~") { 70 //Then we have a SINGLE checkbox which must be checked 71 //Could be handled by % but the loop is slow 72 fieldValue = (formObject.elements[thisField].checked ? "T" : ""); 73 } else if (requiredFields[fieldNum].substr(0,1) == "%") { 74 //Then we have a MULTIPLE checkbox, one of which must be checked 75 gotFirstElement = fieldValue = false; 76 for (var i = formElementIndex[thisField]; i < formObject.elements.length; i++) { 77 if (formObject.elements[i].nodeName != "LABEL") { 78 // Filter label elements, which are part of elements array in BlackBerry OS 5.x, and undesired 79 if (formObject.elements[i].name == thisField) { 80 fieldValue = (fieldValue || formObject.elements[i].checked); 81 if (!gotFirstElement) { gotFirstElement = true; } 82 } else if (gotFirstElement) { 83 break; // terminate the loop when we go on to another form element. 84 } 85 } 86 } 87 fieldValue = (fieldValue ? "T" : ""); 88 } else { 89 //Then we have an ordinary input 90 fieldValue = formObject.elements[formElementIndex[thisField]].value; 91 // since we reset these dropdown elements to their placeholder values, need to validate selection 92 if (inputRadio.length) { 93 var exceptionRegex = /^(gender|mGender)$/; 94 if (thisField.match(exceptionRegex)) { 95 var isChecked = document.querySelector('input[name="gender"]:checked'); 96 if (!isChecked) { 97 fieldValue = ""; 98 } 99 } 100 } 101 } 102 //alert (requiredFields[fieldNum] + " = [" + fieldValue + "]"); 103 if ((fieldValue == "") || (fieldValue.match(/^\s*$/))) { 104 fieldsNeeded += fieldNames[fieldNum] + "\n" + indentation; 105 fieldCheck = false;
106 if (!fieldFirst) { fieldFirst = formElementIndex[thisField]; } 107 } 108 } 109 110 if (fieldCheck) { 111 return true; 112 } else { 113 alert (fieldsNeeded); 114 //alert ('About to focus formObject.elements[' + fieldFirst + ']'); 115 formObject.elements[fieldFirst].focus(); 116 return false; 117 } 118} 119 120// function for checking input field value 121// if string value fails validation, display alert, and return focus to input field 122function processInputFieldValue (formElement, alertString, numofCharacters) { 123 // if the length of the input fields value is less than the number of characters required, then clear the input field 124 if (typeof numofCharacters == 'undefined') { 125 numofCharacters = 0; 126 } 127 // prevent infinite alert popups, by introducing a short delay before returning focus to the input field 128 // we capture the input value, for those rare cases when a user either moves to another window or selects another tab 129 var tempFieldValue = formElement.value; 130 alert(alertString); 131 // field needs to be cleared, to prevent infinite alert popups, if focus is moved to another window or another tab is selected 132 // value will be restored inside the setTimeOut 133 formElement.value = ""; 134 setTimeout(function() { 135 // return focus to the validated field 136 formElement.focus(); 137 // use another setTimeOut to only restore the field value once focus is returned 138 setTimeout(function() { 139 if (tempFieldValue.length >= numofCharacters) { 140 formElement.value = tempFieldValue; 141 } 142 }, 1); 143 }, 1); 144}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.