/*********************************************************************** * YAV - Yet Another Validator v2.0 * * Copyright (C) 2005-2008 * * Author: Federico Crivellaro * * WWW: http://yav.sourceforge.net * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Lesser General Public * * License as published by the Free Software Foundation; either * * version 2.1 of the License, or (at your option) any later version. * * * * This library is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * * Lesser General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this library; if not, write to the Free Software * * Foundation, Inc.,59 Temple Place,Suite 330,Boston,MA 02111-1307 USA * * * * last revision: 2 MAR 2008 * ***********************************************************************/ var yav = { //------------------------------------------------------------ PUBLIC FUNCTIONS undef: undefined, isFocusSet: undefined, internalRules: undefined, f: undefined, formEvt: undefined, fieldsEvt: new Array(), rulesEvt: new Array(), helpEvt: new Array(), mask: new Array(), onOKEvt: new Array(), onErrorEvt: new Array(), preValidationEvt: new Array(), filterByName: null, performCheck: function (formName, strRules, alertType, filterErrorsByName) { yav.filterByName = (filterErrorsByName) ? filterErrorsByName: null; for(var j=0; j0) { for(var i=0; i0 ) { if (yav.strTrim(yav_config.HEADER_MSG).length > 0) { str += yav_config.HEADER_MSG + '\n\n'; } for (var i=0; i 0) { str += '\n' + yav_config.FOOTER_MSG; } alert(str); return false; } else { return true; } }, displayInnerHtml: function (messages) { if ( messages!=null && messages.length>0 ) { var str = ''; if (yav.strTrim(yav_config.HEADER_MSG).length > 0) { str += yav_config.HEADER_MSG; } str += '
    '; for (var i=0; i'; } str += '
'; if (yav.strTrim(yav_config.FOOTER_MSG).length > 0) { str += yav_config.FOOTER_MSG; } yav.get(yav_config.errorsdiv).innerHTML = str; yav.get(yav_config.errorsdiv).className = yav_config.innererror; yav.get(yav_config.errorsdiv).style.display = 'block'; return false; } else { yav.get(yav_config.errorsdiv).innerHTML = ''; yav.get(yav_config.errorsdiv).className = ''; yav.get(yav_config.errorsdiv).style.display = 'none'; return true; } }, displayInline: function (messages) { if ( messages!=null && messages.length>0 ) { var genericErrors = new Array(); var genericErrIndex = 0; for (var i=0; i0) { yav.displayInnerHtml(genericErrors); } return false; } else { return true; } }, clearAllInlineSpans: function () { var allDivs = document.getElementsByTagName("span"); for (var j=0; j0 ) { for (var i=0; i=4 && arguments[0]!=null && arguments[1]!=null; if ( !checkArguments ) { return false; } tmp = el.split(':'); nameDisplayed = ''; if (tmp.length == 2) { nameDisplayed = tmp[1]; el = tmp[0]; } this.el = el; this.nameDisplayed = nameDisplayed; this.ruleName = ruleName; this.comparisonValue = comparisonValue; this.ruleType = ruleType; if (alertMsg==yav.undef || alertMsg==null) { this.alertMsg = yav.getDefaultMessage(el, nameDisplayed, ruleName, comparisonValue)+'__inline__'+this.el; } else { this.alertMsg = alertMsg+'__inline__'+this.el; } }, checkRule: function (f, myRule) { retVal = null; if (myRule != null) { if (myRule.ruleName=='custom') { var customFunction = null; if (myRule.comparisonValue!=null) { customFunction = ' retVal = ' + myRule.comparisonValue; } else { // deprecated, maintained for back compatibility customFunction = ' retVal = ' + myRule.el; } retVal = eval(customFunction); if (myRule.comparisonValue!=null && retVal!=this.undef && retVal!=null) { retVal += '__inline__'+myRule.el; } if (retVal!=null && myRule.comparisonValue!=null) { yav.highlight(yav.getField(yav.f, myRule.el), yav_config.inputclasserror); } } else if (myRule.ruleName=='and') { var op_1 = myRule.el; var op_next = myRule.comparisonValue; if ( yav.checkRule(f, yav.internalRules[op_1])!=null ) { retVal = myRule.alertMsg; if (myRule.ruleType=='pre-condition' || myRule.ruleType=='andor-operator') { //yav.highlight(yav.getField(f, yav.internalRules[op_1].el), yav_config.inputclasserror); } } else { var op_k = op_next.split('-'); for(var k=0; k myRule.comparisonValue ) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } } else if (myRule.ruleName=='minlength') { if ( isNaN(myRule.comparisonValue) ) { yav.debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not a number'); } else if ( el.value.length < myRule.comparisonValue ) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } } else if (myRule.ruleName=='numrange') { reg = new RegExp("^[-+]{0,1}[0-9]*[.]{0,1}[0-9]*$"); if ( !reg.test(yav.unformatNumber(el.value)) ) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } else { regRange = new RegExp("^[0-9]+-[0-9]+$"); if ( !regRange.test(myRule.comparisonValue) ) { yav.debug('DEBUG: comparisonValue for rule ' + myRule.ruleName + ' not in format number1-number2'); } else { rangeVal = myRule.comparisonValue.split('-'); if (eval(yav.unformatNumber(el.value))eval(rangeVal[1])) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } } } } else if (myRule.ruleName=='regexp') { reg = new RegExp(myRule.comparisonValue); if ( !reg.test(el.value) ) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } } else if (myRule.ruleName=='integer') { err = yav.checkInteger(el, myRule); } else if (myRule.ruleName=='double') { err = yav.checkDouble(el, myRule); } else if (myRule.ruleName=='date') { err = yav.checkDate(el, myRule); } else if (myRule.ruleName=='date_lt') { err = yav.checkDateLessThan(el, myRule, false); } else if (myRule.ruleName=='date_le') { err = yav.checkDateLessThan(el, myRule, true); } else if (myRule.ruleName=='keypress') { // do nothing } else if (myRule.ruleName=='empty') { if ( el.value!=null && el.value!='' ) { yav.highlight(el, yav_config.inputclasserror); err = myRule.alertMsg; } } else { yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type); } return err; }, checkInteger: function (el, myRule) { reg = new RegExp("^[-+]{0,1}[0-9]*$"); if ( !reg.test(el.value) ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } }, checkDouble: function (el, myRule) { var sep = yav_config.DECIMAL_SEP; reg = new RegExp("^[-+]{0,1}[0-9]*[" + sep + "]{0,1}[0-9]*$"); if ( !reg.test(el.value) ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } }, checkDate: function (el, myRule) { error = null; if (el.value!='') { var dateFormat = yav_config.DATE_FORMAT; ddReg = new RegExp("dd"); MMReg = new RegExp("MM"); yyyyReg = new RegExp("yyyy"); if ( !ddReg.test(dateFormat) || !MMReg.test(dateFormat) || !yyyyReg.test(dateFormat) ) { yav.debug('DEBUG: locale format ' + dateFormat + ' not supported'); } else { ddStart = dateFormat.indexOf('dd'); MMStart = dateFormat.indexOf('MM'); yyyyStart = dateFormat.indexOf('yyyy'); } strReg = dateFormat.replace('dd','[0-9]{2}').replace('MM','[0-9]{2}').replace('yyyy','[0-9]{4}'); reg = new RegExp("^" + strReg + "$"); if ( !reg.test(el.value) ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } else { dd = el.value.substring(ddStart, ddStart+2); MM = el.value.substring(MMStart, MMStart+2); yyyy = el.value.substring(yyyyStart, yyyyStart+4); if ( !yav.checkddMMyyyy(dd, MM, yyyy) ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } } } return error; }, checkDateLessThan: function (el, myRule, isEqualAllowed) { error = null; var isDate = yav.checkDate(el, myRule)==null ? true : false; if ( isDate && el.value!='' ) { var dateFormat = yav_config.DATE_FORMAT; ddStart = dateFormat.indexOf('dd'); MMStart = dateFormat.indexOf('MM'); yyyyStart = dateFormat.indexOf('yyyy'); dd = el.value.substring(ddStart, ddStart+2); MM = el.value.substring(MMStart, MMStart+2); yyyy = el.value.substring(yyyyStart, yyyyStart+4); myDate = "" + yyyy + MM + dd; strReg = dateFormat.replace('dd','[0-9]{2}').replace('MM','[0-9]{2}').replace('yyyy','[0-9]{4}'); reg = new RegExp("^" + strReg + "$"); var isMeta = myRule.comparisonValue.indexOf('$')==0 ? true : false; var comparisonDate = ''; if (isMeta) { toSplit = myRule.comparisonValue.substr(1); tmp = toSplit.split(':'); if (tmp.length == 2) { comparisonDate = yav.getField(yav.f, tmp[0]).value; } else { comparisonDate = yav.getField(yav.f, myRule.comparisonValue.substr(1)).value; } } else { comparisonDate = myRule.comparisonValue; } if ( !reg.test(comparisonDate) ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } else { cdd = comparisonDate.substring(ddStart, ddStart+2); cMM = comparisonDate.substring(MMStart, MMStart+2); cyyyy = comparisonDate.substring(yyyyStart, yyyyStart+4); cDate = "" + cyyyy + cMM + cdd; if (isEqualAllowed) { if ( !yav.checkddMMyyyy(cdd, cMM, cyyyy) || myDate>cDate ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } } else { if ( !yav.checkddMMyyyy(cdd, cMM, cyyyy) || myDate>=cDate ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } } } } else { if ( el.value!='' ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } } return error; }, checkEqual: function (el, myRule) { error = null; var isMeta = myRule.comparisonValue.indexOf('$')==0 ? true : false; var comparisonVal = ''; if (isMeta) { toSplit = myRule.comparisonValue.substr(1); tmp = toSplit.split(':'); if (tmp.length == 2) { comparisonVal = yav.getField(yav.f, tmp[0]).value; } else { comparisonVal = yav.getField(yav.f, myRule.comparisonValue.substr(1)).value; } } else { comparisonVal = myRule.comparisonValue; } if ( el.value!=comparisonVal ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } return error; }, checkNotEqual: function (el, myRule) { error = null; var isMeta = myRule.comparisonValue.indexOf('$')==0 ? true : false; var comparisonVal = ''; if (isMeta) { toSplit = myRule.comparisonValue.substr(1); tmp = toSplit.split(':'); if (tmp.length == 2) { comparisonVal = yav.getField(yav.f, tmp[0]).value; } else { comparisonVal = yav.getField(yav.f, myRule.comparisonValue.substr(1)).value; } } else { comparisonVal = myRule.comparisonValue; } if ( el.value==comparisonVal ) { yav.highlight(el, yav_config.inputclasserror); error = myRule.alertMsg; } return error; }, checkddMMyyyy: function (dd, MM, yyyy) { retVal = true; if ( (dd<1) || (dd>31) || (MM<1) || (MM>12) || (dd==31 && (MM==2 || MM==4 || MM==6 || MM==9 || MM==11) ) || (dd >29 && MM==2) || (dd==29 && (MM==2) && ((yyyy%4 > 0) || (yyyy%4==0 && yyyy%100==0 && yyyy%400>0 )) )) { retVal = false; } return retVal; }, checkCheckbox: function (el, myRule) { if (myRule.ruleName=='required') { if ( !el.checked ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else if (myRule.ruleName=='equal') { if ( !el.checked || el.value!=myRule.comparisonValue ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else if (myRule.ruleName=='notequal') { if ( el.checked && el.value==myRule.comparisonValue ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else { yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type); } }, checkSelOne: function (el, myRule) { if (myRule.ruleName=='required') { var found = false; var inx = el.selectedIndex; if(inx>=0 && el.options[inx].value) { found = true; } if ( !found ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else if (myRule.ruleName=='equal') { var found = false; var inx = el.selectedIndex; if(inx>=0 && el.options[inx].value==myRule.comparisonValue) { found = true; } if ( !found ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else if (myRule.ruleName=='notequal') { var found = false; var inx = el.selectedIndex; if(inx>=0 && el.options[inx].value!=myRule.comparisonValue) { found = true; } if ( !found ) { yav.highlight(el, yav_config.inputclasserror); return myRule.alertMsg; } } else { yav.debug('DEBUG: rule ' + myRule.ruleName + ' not supported for ' + el.type); } }, checkSelMul: function (el, myRule) { if (myRule.ruleName=='required') { var found = false; opts = el.options; for(var i=0; i0 && clazz==yav_config.inputclasserror) { return; } if (!yav.isFocusSet && clazz==yav_config.inputclasserror) { if ( (!el.type) && (el.length>0) && (el.item(0).type=='radio') ) { el.item(0).focus(); } else { el.focus(); } yav.isFocusSet = true; } if (el!=yav.undef && yav_config.inputhighlight) { if ( yav_config.multipleclassname ) { yav.highlightMultipleClassName(el, clazz); } else { el.className = clazz; } } }, highlightMultipleClassName: function (el, clazz) { re = new RegExp("(^|\\s)("+yav_config.inputclassnormal+"|"+yav_config.inputclasserror+")($|\\s)"); el.className = yav.strTrim ( ( (typeof el.className != "undefined") ? el.className.replace(re, "") : "" ) + " " + clazz ); }, getDefaultMessage: function (el, nameDisplayed, ruleName, comparisonValue) { if (nameDisplayed.length == 0) { nameDisplayed = el; } var msg = yav_config.DEFAULT_MSG; if (ruleName=='required') { msg = yav_config.REQUIRED_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='minlength') { msg = yav_config.MINLENGTH_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue); } else if (ruleName=='maxlength') { msg = yav_config.MAXLENGTH_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue); } else if (ruleName=='numrange') { msg = yav_config.NUMRANGE_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue); } else if (ruleName=='date') { msg = yav_config.DATE_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='numeric') { msg = yav_config.NUMERIC_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='integer') { msg = yav_config.INTEGER_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='double') { msg = yav_config.DOUBLE_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='equal') { msg = yav_config.EQUAL_MSG.replace('{1}', nameDisplayed).replace('{2}', yav.getComparisonDisplayed(comparisonValue)); } else if (ruleName=='notequal') { msg = yav_config.NOTEQUAL_MSG.replace('{1}', nameDisplayed).replace('{2}', yav.getComparisonDisplayed(comparisonValue)); } else if (ruleName=='alphabetic') { msg = yav_config.ALPHABETIC_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='alphanumeric') { msg = yav_config.ALPHANUMERIC_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='alnumhyphen') { msg = yav_config.ALNUMHYPHEN_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='alnumhyphenat') { msg = yav_config.ALNUMHYPHENAT_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='alphaspace') { msg = yav_config.ALPHASPACE_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='email') { msg = yav_config.EMAIL_MSG.replace('{1}', nameDisplayed); } else if (ruleName=='regexp') { msg = yav_config.REGEXP_MSG.replace('{1}', nameDisplayed).replace('{2}', comparisonValue); } else if (ruleName=='date_lt') { msg = yav_config.DATE_LT_MSG.replace('{1}', nameDisplayed).replace('{2}', yav.getComparisonDisplayed(comparisonValue)); } else if (ruleName=='date_le') { msg = yav_config.DATE_LE_MSG.replace('{1}', nameDisplayed).replace('{2}', yav.getComparisonDisplayed(comparisonValue)); } else if (ruleName=='empty') { msg = yav_config.EMPTY_MSG.replace('{1}', nameDisplayed); } return msg; }, getComparisonDisplayed: function (comparisonValue) { comparisonDisplayed = comparisonValue; if (comparisonValue.substring(0, 1)=='$') { comparisonValue = comparisonValue.substring(1, comparisonValue.length); tmp = comparisonValue.split(':'); if (tmp.length == 2) { comparisonDisplayed = tmp[1]; } else { comparisonDisplayed = comparisonValue; } } return comparisonDisplayed; }, isKeyAllowed: function (keyCode, charsAllowed) { retval = false; var aCharCode; if (keyCode==8 || keyCode==0) { retval = true; } else { for(var i=0; i