/* Form elements check 29/10/02 11:48 */ var _aFormField = new Array(); // default array, contains list of fields to check // public functions // Form checker function _fnFormCheck(sFormName, bSubmitFriendly) { var result = false; var oFormChecker = new FormChecker(sFormName); oFormChecker.Synchronize(); if(oFormChecker.Check()) { if(bSubmitFriendly) { oFormChecker.FieldsSubmitFriendly(); } result = true; } return result; } // FormField object constructor function FormField(sFormName, sInternalName, sPublicName, bIsCompulsory, iMaxLength, sFormat, sHelp) { this.FormName = sFormName; this.InternalName = sInternalName; this.PublicName = sPublicName; this.Element = null; this.IsCompulsory = bIsCompulsory; this.MaxLength = iMaxLength; this.Format = sFormat; this.Help = sHelp; } ////////////////////////// /// Form Checker ///////////////////////// // FormChecker constructor function FormChecker(sFormName) { this.FormName = sFormName; this.Element = null; this.Elements = null; this.Synchronize = FormChecker_Synchronize; this.Check = FormChecker_Check; this.CheckField = FormChecker_CheckField; this.CheckValue = FormChecker_CheckValue; this.CheckGroupValue = FormChecker_CheckGroupValue; this.Alert = FormChecker_Alert; this.IsStringLonger = FormChecker_IsStringLonger; this.IsStringFitFormat = FormChecker_IsStringFitFormat; this.IsStringEmpty = FormChecker_IsStringEmpty; this.FieldsSubmitFriendly = FormChecker_FieldsSubmitFriendly; } // check form and element existence and populate FormChecker object properties function FormChecker_Synchronize(aElem) { var result = false; var sFormName = this.FormName; if(sFormName != null) { var oForm = document.forms[sFormName]; if(oForm) { this.Element = oForm; if(!aElem || aElem.length == 0) { // get default array if(typeof(_aFormField) != "undefined") { aElem = _aFormField; } } if(aElem && aElem.length > 0) { var aFormElem = new Array(); var iCount = 0; for(var i = 0; i < aElem.length; i ++) { if(aElem[i].FormName == sFormName && oForm.elements[aElem[i].InternalName]) { aFormElem[iCount] = aElem[i]; //aFormElem[iCount].Element = oForm.elements[aElem[i].Name]; iCount++; } } if(aFormElem.length > 0) { this.Elements = aFormElem; } } result = true; } } return result; } // check function. iterates by every registered field in Elements array // resolves html form element by name and pass it to CheckField function function FormChecker_Check() { result = false; if(this.Element) { var aElem = this.Elements; var cFormElem = this.Element.elements; if(aElem) { for(var i = 0; i < aElem.length; i++) { var oOneField = aElem[i]; var oOneElem = cFormElem[oOneField.InternalName]; if(oOneElem) { if(!this.CheckField(oOneElem, oOneField)) { break; } } } } else { result = true; } } return result; } // resolves field value and passes it to CheckValue for the value check function FormChecker_CheckField(oFormElem, oFieldElem) { result = true; var sType = oFormElem.type; var bIsCollection = (oFormElem.length > 0 && typeof(oFormElem.options) == "undefined"); if(bIsCollection) { if(oFormElem[0].type == "checkbox" || oFormElem[0].type == "radio") { if(!this.CheckGroupValue(oFormElem, oFieldElem)) { this.Alert(oFormElem[0], oFieldElem); result = false; } } else { for(var i = 0; i < oFormElem.length; i++) { if(!this.CheckValue(oFormElem[i], oFieldElem)) { this.Alert(oFormElem[i], oFieldElem); result = false; break; } } } } else { if(!this.CheckValue(oFormElem, oFieldElem)) { this.Alert(oFormElem, oFieldElem); result = false; } } return result; } // function FormChecker_CheckValue(oFormElem, oFieldElem) { result = true; var sType = oFormElem.type; if(sType == "select" || sType == "select-one" || sType == "select-multiple") { if(oFieldElem.IsCompulsory) { result = false; var iSelectedIndex = oFormElem.selectedIndex; result = (iSelectedIndex > 0 || (iSelectedIndex == 0 && oFormElem.options[iSelectedIndex].value != "")); if(sType == "select-multiple" && !result) { for(var i = 0; i < oFormElem.options.length; i++) { if(oFormElem.options[i].selected) { result = true; break; } } } } } else if(sType == "text" || sType == "password" || sType == "textarea" || sType == "file") { var sValue = oFormElem.value; if((oFieldElem.IsCompulsory && this.IsStringEmpty(sValue)) || (oFieldElem.MaxLength && this.IsStringLonger(sValue, oFieldElem.MaxLength)) || (oFieldElem.Format && !this.IsStringFitFormat(sValue, oFieldElem.Format))) { result = false; } } return result; } function FormChecker_CheckGroupValue(oFormElem, oFieldElem) { result = true; if(oFormElem.length > 0) { if(oFieldElem.IsCompulsory) { result = false; for(var i = 0; i < oFormElem.length; i++) { if(oFormElem[i].checked) { result = true; break; } } } } return result; } function FormChecker_Alert(oFormElem, oFieldElem) { var result = "(!) The value is invalid.\r\n\r\n"; if(oFieldElem.Help) { result += oFieldElem.Help; } else { result += (oFieldElem.PublicName ? "\"" + oFieldElem.PublicName + "\" field" : "The field") + (oFieldElem.IsCompulsory ? " is compulsory." : "") + (oFieldElem.MaxLength ? (oFieldElem.IsCompulsory ? " The" : "") + " maximum length is " + oFieldElem.MaxLength + "." : "") + (oFieldElem.Format && !oFieldElem.IsCompulsory && !oFieldElem.MaxLength ? " format is incorrect." : ""); } alert(result); if(oFormElem && oFormElem.type != "hidden" && !oFormElem.disabled) { oFormElem.focus(); } return false; } function FormChecker_IsStringEmpty(sStr) { var result = true; var sInvalid = " \t\n\r"; for(var i = 0; i < sStr.length; i++) { if(sInvalid.indexOf(sStr.charAt(i)) < 0) { result = false; break; } } return result; } function FormChecker_IsStringFitFormat(sStr, sFormat) { var result = true; if(sStr && sStr.length > 0) { if(sFormat.indexOf("@") == 0) { //pre-defined format, e.g. @email } else { if(typeof(new RegExp()) != "undefined") { var oRegExp = new RegExp(sFormat); result = oRegExp.test(sStr); } } } return result; } function FormChecker_IsStringLonger(sStr, iMaxLength) { return(sStr.length > iMaxLength); } // reset unselected checkboxes // in order to have complete form collection function FormChecker_FieldsSubmitFriendly() { var oElements = this.Element.elements; for(var i = 0; i < oElements.length; i++) { var oElem = oElements[i]; var sType = oElem.type; if(sType == "checkbox") { if(oElem.length > 0) { // multiple var bIsChecked = false; for(var k = 0; k < oElem.length; k++) { if(oElem[k].checked) { bIsChecked = true; break; } } if(!bIsChecked) { oElem[0].value = "0"; //oElem[0].checked = true; } } else { // single if(!oElem.checked) { oElem.value = "0"; //oElem.checked = true; } } } } }