/* By Jakarta Struts Validator, http://jakarta.apache.org/struts/ */



		function val_validateRequired(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRequired = new required();

                for (x in oRequired) {
                    if ((form[oRequired[x][0]].type == 'text' || form[oRequired[x][0]].type == 'textarea' || form[oRequired[x][0]].type == 'select-one' || form[oRequired[x][0]].type == 'radio' || form[oRequired[x][0]].type == 'password') && form[oRequired[x][0]].value == '') {
                       if (i == 0)
                          focusField = form[oRequired[x][0]];

                       fields[i++] = oRequired[x][1];

                       bValid = false;
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateMinLength(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMinLength = new minlength();

                for (x in oMinLength) {
                    if (form[oMinLength[x][0]].type == 'text' || form[oMinLength[x][0]].type == 'textarea') {
                       var iMin = parseInt(oMinLength[x][2]("minlength"));

                       if (!(form[oMinLength[x][0]].value.length >= iMin)) {
                          if (i == 0)
                             focusField = form[oMinLength[x][0]];

                          fields[i++] = oMinLength[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateMaxLength(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMaxLength = new maxlength();

                for (x in oMaxLength) {
                    if (form[oMaxLength[x][0]].type == 'text' || form[oMaxLength[x][0]].type == 'textarea') {
                       var iMax = parseInt(oMaxLength[x][2]("maxlength"));

                       if (!(form[oMaxLength[x][0]].value.length <= iMax)) {
                          if (i == 0)
                             focusField = form[oMaxLength[x][0]];

                          fields[i++] = oMaxLength[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateMask(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oMasked = new mask();

                for (x in oMasked) {
                    if ((form[oMasked[x][0]].type == 'text' || form[oMasked[x][0]].type == 'textarea' || form[oMasked[x][0]].type == 'password') && form[oMasked[x][0]].value.length > 0) {
                       if (!matchPattern(form[oMasked[x][0]].value, oMasked[x][2]("mask"))) {
                          if (i == 0)
                             focusField = form[oMasked[x][0]];

                          fields[i++] = oMasked[x][1];
                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }

            function matchPattern(value, mask) {
               var bMatched = mask.exec(value);

               if(!bMatched) {
                  return false;
               }

               return true;
            }
            function val_validateByte(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oByte = new ByteValidations();

                for (x in oByte) {
                    if ((form[oByte[x][0]].type == 'text' || form[oByte[x][0]].type == 'textarea' || form[oByte[x][0]].type == 'select-one' || form[oByte[x][0]].type == 'radio') && form[oByte[x][0]].value.length > 0) {
                       var iValue = parseInt(form[oByte[x][0]].value);

                       if (!iValue || !(iValue >= -128 && iValue <= 127)) {
                          if (i == 0)
                             focusField = form[oByte[x][0]];

                          fields[i++] = oByte[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateShort(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oShort = new ShortValidations();

                for (x in oShort) {
                    if ((form[oShort[x][0]].type == 'text' || form[oShort[x][0]].type == 'textarea' || form[oShort[x][0]].type == 'select-one' || form[oShort[x][0]].type == 'radio') && form[oShort[x][0]].value.length > 0) {
                       var iValue = parseInt(form[oShort[x][0]].value);

                       if (!iValue || !(iValue >= -32768 && iValue <= 32767)) {
                          if (i == 0)
                             focusField = form[oShort[x][0]];

                          fields[i++] = oShort[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateInteger(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oInteger = new IntegerValidations();

                for (x in oInteger) {
                    if ((form[oInteger[x][0]].type == 'text' || form[oInteger[x][0]].type == 'textarea' || form[oInteger[x][0]].type == 'select-one' || form[oInteger[x][0]].type == 'radio') && form[oInteger[x][0]].value.length > 0) {
                       var iValue = parseInt(form[oInteger[x][0]].value);

                       if (!iValue || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                          if (i == 0)
                             focusField = form[oInteger[x][0]];

                          fields[i++] = oInteger[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateFloat(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oFloat = new FloatValidations();

                for (x in oFloat) {
                    if ((form[oFloat[x][0]].type == 'text' || form[oFloat[x][0]].type == 'textarea' || form[oFloat[x][0]].type == 'select-one' || form[oFloat[x][0]].type == 'radio') && form[oFloat[x][0]].value.length > 0) {
                       var iValue = parseFloat(form[oFloat[x][0]].value);

                       if (!iValue) {
                          if (i == 0)
                             focusField = form[oFloat[x][0]];

                          fields[i++] = oFloat[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateDate(form) {
               var bValid = true;
               var focusField = null;
               var i = 0;
               var fields = new Array();
               oDate = new DateValidations();

               for (x in oDate) {
                  var value = form[oDate[x][0]].value;
                  var datePattern = oDate[x][2]("datePatternStrict");

                  if ((form[oDate[x][0]].type == 'text' || form[oDate[x][0]].type == 'textarea') && value.length > 0 && datePattern.length > 0) {
                     var MONTH = "MM";
                     var DAY = "dd";
                     var YEAR = "yyyy";

                     var orderMonth = datePattern.indexOf(MONTH);
                     var orderDay = datePattern.indexOf(DAY);
                     var orderYear = datePattern.indexOf(YEAR);

                     if ((orderDay < orderYear && orderDay > orderMonth)) {
                        var iDelim1 = orderMonth + MONTH.length;
                        var iDelim2 = orderDay + DAY.length;
                        var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                        var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                        if (iDelim1 == orderDay && iDelim2 == orderYear) {
                           dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                        } else if (iDelim1 == orderDay) {
                           dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                        } else if (iDelim2 == orderYear) {
                           dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                        } else {
                           dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                        }

                        var matched = dateRegexp.exec(value);

                        if(matched != null) {
                           if (!isValidDate(matched[2], matched[1], matched[3])) {
                              if (i == 0)
                                 focusField = form[oDate[x][0]];

                              fields[i++] = oDate[x][1];
                              bValid =  false;
                           }
                        } else {
                           if (i == 0)
                              focusField = form[oDate[x][0]];

                           fields[i++] = oDate[x][1];
                           bValid =  false;
                        }
                     } else if ((orderMonth < orderYear && orderMonth > orderDay)) {
                        var iDelim1 = orderDay + DAY.length;
                        var iDelim2 = orderMonth + MONTH.length;
                        var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                        var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                        if (iDelim1 == orderMonth && iDelim2 == orderYear) {
                           dateRegexp = new RegExp("^(\\d{2})(\\d{2})(\\d{4})$");
                        } else if (iDelim1 == orderMonth) {
                           dateRegexp = new RegExp("^(\\d{2})(\\d{2})[" + delim2 + "](\\d{4})$");
                        } else if (iDelim2 == orderYear) {
                           dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})(\\d{4})$");
                        } else {
                           dateRegexp = new RegExp("^(\\d{2})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{4})$");
                        }

                        var matched = dateRegexp.exec(value);

                        if(matched != null) {
                           if (!isValidDate(matched[1], matched[2], matched[3])) {
                              if (i == 0)
                                 focusField = form[oDate[x][0]];

                              fields[i++] = oDate[x][1];
                              bValid =  false;
                           }
                        } else {
                           if (i == 0)
                              focusField = form[oDate[x][0]];

                           fields[i++] = oDate[x][1];
                           bValid =  false;
                        }
                     } else if ((orderMonth > orderYear && orderMonth < orderDay)) {
                        var iDelim1 = orderYear + YEAR.length;
                        var iDelim2 = orderMonth + MONTH.length;
                        var delim1 = datePattern.substring(iDelim1, iDelim1 + 1);
                        var delim2 = datePattern.substring(iDelim2, iDelim2 + 1);

                        if (iDelim1 == orderMonth && iDelim2 == orderDay) {
                           dateRegexp = new RegExp("^(\\d{4})(\\d{2})(\\d{2})$");
                        } else if (iDelim1 == orderMonth) {
                           dateRegexp = new RegExp("^(\\d{4})(\\d{2})[" + delim2 + "](\\d{2})$");
                        } else if (iDelim2 == orderDay) {
                           dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})(\\d{2})$");
                        } else {
                           dateRegexp = new RegExp("^(\\d{4})[" + delim1 + "](\\d{2})[" + delim2 + "](\\d{2})$");
                        }

                        var matched = dateRegexp.exec(value);

                        if(matched != null) {

                           if (!isValidDate(matched[3], matched[2], matched[1])) {
                              if (i == 0)
                                 focusField = form[oDate[x][0]];

                              fields[i++] = oDate[x][1];
                              bValid =  false;
                           }
                        } else {
                           if (i == 0)
                              focusField = form[oDate[x][0]];

                           fields[i++] = oDate[x][1];
                           bValid =  false;
                        }
                     } else {
                        if (i == 0)
                           focusField = form[oDate[x][0]];

                        fields[i++] = oDate[x][1];
                        bValid =  false;
                     }

                  }
               }

               if (fields.length > 0) {
                  focusField.focus();
                  alert(fields.join('\n'));
               }

               return bValid;
            }

	    function isValidDate(day, month, year) {
	       if (month < 1 || month > 12)
	          return false;

	       if (day < 1 || day > 31)
	          return false;

	       if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31)
	          return false;

	       if (month == 2) {
	          var leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
	          if (day>29 || (day == 29 && !leap))
	             return false;
	       }

	       return true;
            }
            function val_validateRange(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oRange = new range();

                for (x in oRange) {
                    if ((form[oRange[x][0]].type == 'text' || form[oRange[x][0]].type == 'textarea') && form[oRange[x][0]].value.length > 0) {
                       var iMin = parseInt(oRange[x][2]("min"));
                       var iMax = parseInt(oRange[x][2]("max"));
                       var iValue = parseInt(form[oRange[x][0]].value);

                       if (!(iValue >= iMin && iValue <= iMax)) {
                          if (i == 0)
                             focusField = form[oRange[x][0]];

                          fields[i++] = oRange[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }
            function val_validateCreditCard(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oCreditCard = new creditCard();

                for (x in oCreditCard) {
                    if ((form[oCreditCard[x][0]].type == 'text' || form[oCreditCard[x][0]].type == 'textarea') && form[oCreditCard[x][0]].value.length > 0) {
                       if (!luhnCheck(form[oCreditCard[x][0]].value)) {
                          if (i == 0)
                             focusField = form[oCreditCard[x][0]];

                          fields[i++] = oCreditCard[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }

            /**
             * Reference: http://www.ling.nwu.edu/~sburke/pub/luhn_lib.pl
            */
            function luhnCheck(cardNumber) {
                if (isLuhnNum(cardNumber)) {
                    var no_digit = cardNumber.length;
                    var oddoeven = no_digit & 1;
                    var sum = 0;
                    for (var count = 0; count < no_digit; count++) {
                        var digit = parseInt(cardNumber.charAt(count));
                        if (!((count & 1) ^ oddoeven)) {
                            digit *= 2;
                            if (digit > 9) digit -= 9;
                        };
                        sum += digit;
                    };
                    if (sum == 0) return false;
                    if (sum % 10 == 0) return true;
                };
                return false;
            }

            function isLuhnNum(argvalue) {
                argvalue = argvalue.toString();
                if (argvalue.length == 0)
                   return false;
                for (var n = 0; n < argvalue.length; n++)
                   if (argvalue.substring(n, n+1) < "0" || argvalue.substring(n,n+1) > "9")
                      return false;

                return true;
            }
            function val_validateEmail(form) {
                var bValid = true;
                var focusField = null;
                var i = 0;
                var fields = new Array();
                oEmail = new email();

                for (x in oEmail) {
                    if ((form[oEmail[x][0]].type == 'text' || form[oEmail[x][0]].type == 'textarea') && form[oEmail[x][0]].value.length > 0) {
                       if (!checkEmail(form[oEmail[x][0]].value)) {
                          if (i == 0)
                             focusField = form[oEmail[x][0]];

                          fields[i++] = oEmail[x][1];

                          bValid = false;
                       }
                    }
                }

                if (fields.length > 0) {
                   focusField.focus();
                   alert(fields.join('\n'));
                }

                return bValid;
            }

            /**
             * Reference: Sandeep V. Tamhankar (stamhankar@hotmail.com),
             * http://javascript.internet.com
            */
            function checkEmail(emailStr) {
               if (emailStr.length == 0)
                  return true;
               var emailPat=/^(.+)@(.+)$/;
               var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
               var validChars="\[^\\s" + specialChars + "\]";
               var quotedUser="(\"[^\"]*\")";
               var ipDomainPat=/^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
               var atom=validChars + '+';
               var word="(" + atom + "|" + quotedUser + ")";
               var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
               var domainPat=new RegExp("^" + atom + "(\\." + atom + ")*$");
               var matchArray=emailStr.match(emailPat);

               if (matchArray == null)
                  return false;

               var user=matchArray[1];
               var domain=matchArray[2];

               if (user.match(userPat) == null)
                   return false;

               var IPArray = domain.match(ipDomainPat);
               if (IPArray != null) {
                   for (var i = 1; i <= 4; i++) {
                      if (IPArray[i] > 255)
                         return false;
                   }

                   return true;
               }

               var domainArray=domain.match(domainPat);
               if (domainArray == null)
                   return false;

               var atomPat=new RegExp(atom,"g");
               var domArr=domain.match(atomPat);
               var len=domArr.length;

               if (domArr[domArr.length-1].length < 2 || domArr[domArr.length-1].length > 3)
                  return false;

               if (len < 2)
                  return false;

               return true;
            }
