	var isFancyAlertSet = false;
	var isFancyAlertLocal = true;

	/**
	 * alertÀ» À§ÇÑ modal dialog¸¦ È°¼ºÈ­ÇÑ´Ù.
	 * ¿À¸®Áö³¯ÀÇ alertÀ» »ç¿ëÇÏ±â À§ÇØ¼­´Â isFancyAlert º¯¼ö¸¦ false·Î ¼³Á¤ÇÏ¸é µÈ´Ù.
	 *
	 * var isFancyAlert = false;
	 *
	 * isFancyAlert º¯¼ö°¡ ¼³Á¤µÇÁö ¾ÊÀ¸¸é µðÆúÆ®·Î true·Î ¼³Á¤µÈ´Ù. 
	 *
	 * @param msg Ãâ·ÂÇÒ ¸Þ½ÃÁö ¹®ÀÚ¿­
	 * @mode alert¸Þ½ÃÁöÃ¢(alert)°ú confirm ¸Þ½ÃÁöÃ¢(confirm)À» ±¸ºÐÇÑ´Ù.
	 * @return '¿¹'¸¦ ¼±ÅÃÇÏ¸é true, '¾Æ´Ï¿À'¸¦ ¼±ÅÃÇÏ¸é false. 
	 */
	function validatorAlert(msg) {
		if (!isFancyAlertSet) {
			isFancyAlertSet = true;
			try {
				isFancyAlertLocal = isFancyAlert;
			} catch (e) {
			}
		}

		if (!isFancyAlertLocal) {
			alert(msg);
			return;
		}

		var	arg = new Array();
		arg["msg"] = msg == null ? "" : msg;
		arg["mode"] = "alert";
	
		return window.showModalDialog(
				"/common/alert.do", 
				arg, 
				"dialogWidth:10px;dialogHeight:10px;center:yes;edge:rised;status:no;help:no;scroll:no");
	}

    /**
     * Check to see if fields are a valid byte.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateByte(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");
        oByte = eval('new ' + formName.value + '_ByteValidations()');

        for (x in oByte) {
            var field = form[oByte[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'select-one' ||
                field.type == 'radio')  &&
                field.disabled == false) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else {
                    value = field.value;
                }

                if (value.length > 0) {
                    if (!isAllDigits(value)) {
                        bValid = false;
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oByte[x][1];

                    } else {

                        var iValue = parseInt(value);
                        if (isNaN(iValue) || !(iValue >= -128 && iValue <= 127)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oByte[x][1];
                            bValid = false;
                        }
                    }
                }

            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return bValid;
    }


    /**
     *  Check to see if fields are a valid short.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateShort(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oShort = eval('new ' + formName.value + '_ShortValidations()');

        for (x in oShort) {
            var field = form[oShort[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'select-one' ||
                field.type == 'radio')  &&
                field.disabled == false) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else {
                    value = field.value;
                }

                if (value.length > 0) {
                    if (!isAllDigits(value)) {
                        bValid = false;
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oShort[x][1];

                    } else {

                        var iValue = parseInt(value);
                        if (isNaN(iValue) || !(iValue >= -32768 && iValue <= 32767)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oShort[x][1];
                            bValid = false;
                        }
                   }
               }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return bValid;
    }


    /**
     * Check to see if fields are a valid integer.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateInteger(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oInteger = eval('new ' + formName.value + '_IntegerValidations()');
        for (x in oInteger) {
            var field = form[oInteger[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'select-one' ||
                field.type == 'radio') &&
                field.disabled == false) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else {
                    value = field.value;
                }

                if (value.length > 0) {

                    if (!isAllDigits(value)) {
                        bValid = false;
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oInteger[x][1];

                    } else {
                        var iValue = parseInt(value);
                        if (isNaN(iValue) || !(iValue >= -2147483648 && iValue <= 2147483647)) {
                            if (i == 0) {
                                focusField = field;
                            }
                            fields[i++] = oInteger[x][1];
                            bValid = false;
                       }
                   }
               }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return bValid;
    }

    function isAllDigits(argvalue) {
        argvalue = argvalue.toString();
        var validChars = "0123456789";
        var startFrom = 0;
        if (argvalue.substring(0, 2) == "0x") {
           validChars = "0123456789abcdefABCDEF";
           startFrom = 2;
        } else if (argvalue.charAt(0) == "0") {
           validChars = "01234567";
           startFrom = 1;
        } else if (argvalue.charAt(0) == "-") {
            startFrom = 1;
        }

        for (var n = startFrom; n < argvalue.length; n++) {
            if (validChars.indexOf(argvalue.substring(n, n+1)) == -1) return false;
        }
        return true;
    }


    /**
     * Check to see if fields are a valid float.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateFloat(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
         var formName = form.getAttributeNode("name");

        oFloat = eval('new ' + formName.value + '_FloatValidations()');
        for (x in oFloat) {
        	var field = form[oFloat[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'select-one' ||
                field.type == 'radio') &&
                field.disabled == false) {

            	var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else {
                    value = field.value;
                }

                if (value.length > 0) {
                    // remove '.' before checking digits
                    var tempArray = value.split('.');
                    //Strip off leading '0'
                    var zeroIndex = 0;
                    var joinedString= tempArray.join('');
                    while (joinedString.charAt(zeroIndex) == '0') {
                        zeroIndex++;
                    }
                    var noZeroString = joinedString.substring(zeroIndex,joinedString.length);

                    if (!isAllDigits(noZeroString)) {
                        bValid = false;
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oFloat[x][1];

                    } else {
		                var iValue = parseFloat(value);
		                if (isNaN(iValue)) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oFloat[x][1];
	                    bValid = false;
	                }
                    }
                }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return bValid;
    }


    /**
     * Check to see if fields is in a valid integer range.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateIntRange(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oRange = eval('new ' + formName.value + '_intRange()');
        for (x in oRange) {
            var field = form[oRange[x][0]];
            if (field.disabled == false)  {
                var value = '';
                if (field.type == 'hidden' ||
                    field.type == 'text' || field.type == 'textarea' ||
                    field.type == 'radio' ) {
                    value = field.value;
                }
                if (field.type == 'select-one') {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                }
                if (value.length > 0) {
                    var iMin = parseInt(oRange[x][2]("min"));
                    var iMax = parseInt(oRange[x][2]("max"));
                    var iValue = parseInt(value);
                    if (!(iValue >= iMin && iValue <= iMax)) {
                        if (i == 0) {
                            focusField = field;
                        }
                        fields[i++] = oRange[x][1];
                        isValid = false;
                    }
                }
            }
        }
        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }
        return isValid;
    }


    /**
     * Check to see if fields are in a valid float range.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateFloatRange(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oRange = eval('new ' + formName.value + '_floatRange()');
        for (x in oRange) {
            var field = form[oRange[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' || field.type == 'textarea') &&
                (field.value.length > 0)  &&
                 field.disabled == false) {

                var fMin = parseFloat(oRange[x][2]("min"));
                var fMax = parseFloat(oRange[x][2]("max"));
                var fValue = parseFloat(field.value);
                if (!(fValue >= fMin && fValue <= fMax)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRange[x][1];
                    isValid = false;
                }
            }
        }
        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }
        return isValid;
    }


    /**
     * Check to see if fields are a valid using a regular expression.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateMask(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oMasked = eval('new ' + formName.value + '_mask()');
        for (x in oMasked) {
            var field = form[oMasked[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea' ||
				 field.type == 'file') &&
                 (field.value.length > 0) &&
                 field.disabled == false) {

                if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oMasked[x][1];
                    isValid = false;
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

    function matchPattern(value, mask) {
       return mask.exec(value);
    }


    /**
     * A field is considered valid if greater than the specified minimum.
     * Fields are not checked if they are disabled.
     * <p>
     * <strong>Caution:</strong> Using <code>validateMinLength</code> on a password field in a
     *  login page gives unnecessary information away to hackers. While it only slightly
     *  weakens security, we suggest using it only when modifying a password.</p>
     * @param form The form validation is taking place on.
     */
    function validateMinLength(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");


        oMinLength = eval('new ' + formName.value + '_minlength()');

        for (x in oMinLength) {
            var field = form[oMinLength[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'password' ||
                field.type == 'textarea') &&
                field.disabled == false) {

                var iMin = parseInt(oMinLength[x][2]("minlength"));
                if ((trim(field.value).length > 0) && (field.value.length < iMin)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oMinLength[x][1];
                    isValid = false;
                }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }


    /**
     * A field is considered valid if less than the specified maximum.
     * Fields are not checked if they are disabled.
     * <p>
     * <strong>Caution:</strong> Using <code>validateMaxLength</code> on a password field in a
     *  login page gives unnecessary information away to hackers. While it only slightly
     *  weakens security, we suggest using it only when modifying a password.</p>
     * @param form The form validation is taking place on.
     */
    function validateMaxLength(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oMaxLength = eval('new ' + formName.value + '_maxlength()');
        for (x in oMaxLength) {
            var field = form[oMaxLength[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'password' ||
                field.type == 'textarea') &&
                field.disabled == false) {

                var iMax = parseInt(oMaxLength[x][2]("maxlength"));
                if (field.value.length > iMax) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oMaxLength[x][1];
                    isValid = false;
                }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }


    /*$RCSfile: validateRequired.js,v $ $Revision: 1.13 $ $Date: 2004/03/28 16:53:21 $ */
    /**
    *  Check to see if fields must contain a value.
    * Fields are not checked if they are disabled.
    * <p>
    * @param form The form validation is taking place on.
    */

    function validateRequired(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oRequired = eval('new ' + formName.value + '_required()');

        for (x in oRequired) {
            var field = form[oRequired[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'file' ||
                field.type == 'checkbox' ||
                field.type == 'select-one' ||
                field.type == 'password') &&
                field.disabled == false) {

                var value = '';
                // get field's value
                if (field.type == "select-one") {
                    var si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else if (field.type == 'checkbox') {
                    if (field.checked) {
                        value = field.value;
                    }
                } else {
                    value = field.value;
                }

                if (trim(value).length == 0) {

                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid = false;
                }
            } else if (field.type == "select-multiple") {
                var numOptions = field.options.length;
                lastSelected=-1;
                for(loop=numOptions-1;loop>=0;loop--) {
                    if(field.options[loop].selected) {
                        lastSelected = loop;
                        value = field.options[loop].value;
                        break;
                    }
                }
                if(lastSelected < 0 || trim(value).length == 0) {
                    if(i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
                isChecked=-1;
                for (loop=0;loop < field.length;loop++) {
                    if (field[loop].checked) {
                        isChecked=loop;
                        break; // only one needs to be checked
                    }
                }
                if (isChecked < 0) {
                    if (i == 0) {
                        focusField = field[0];
                    }
                    fields[i++] = oRequired[x][1];
                    isValid=false;
                }
            }
        }
        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

    // Trim whitespace from left and right sides of s.
    function trim(s) {
        return s.replace( /^\s*/, "" ).replace( /\s*$/, "" );
    }


    /**
     * Check to see if fields are a valid date.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateDate(form) {
       var bValid = true;
       var focusField = null;
       var i = 0;
       var fields = new Array();
       var formName = form.getAttributeNode("name");

       oDate = eval('new ' + formName.value + '_DateValidations()');

       for (x in oDate) {
           var field = form[oDate[x][0]];
           var value = field.value;
           var datePattern = oDate[x][2]("datePatternStrict");
           // try loose pattern
           if (datePattern == null)
               datePattern = oDate[x][2]("datePattern");
           if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea') &&
               (value.length > 0) && (datePattern.length > 0) &&
                field.disabled == false) {
                 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 = field;
                           }
                           fields[i++] = oDate[x][1];
                           bValid =  false;
                        }
                     } else {
                        if (i == 0) {
                            focusField = field;
                        }
                        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 = field;
                             }
                             fields[i++] = oDate[x][1];
                             bValid =  false;
                          }
                     } else {
                         if (i == 0) {
                             focusField = field;
                         }
                         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 = field;
                             }
                             fields[i++] = oDate[x][1];
                             bValid =  false;
                         }
                     } else {
                          if (i == 0) {
                              focusField = field;
                          }
                          fields[i++] = oDate[x][1];
                          bValid =  false;
                     }
                 } else {
                     if (i == 0) {
                         focusField = field;
                     }
                     fields[i++] = oDate[x][1];
                     bValid =  false;
                 }
          }
       }
       if (fields.length > 0) {
          if (focusField.type != "hidden") focusField.focus();
          validatorAlert(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;
    }


    /**
     * Check to see if fields are a valid creditcard number based on Luhn checksum.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateCreditCard(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        oCreditCard = eval('new ' + formName.value + '_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)  &&
                 form[oCreditCard[x][0]].disabled == false) {
                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) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }
        return bValid;
    }

    /**
     * Checks whether a given credit card number has a valid Luhn checksum.
     * This allows you to spot most randomly made-up or garbled credit card numbers immediately.
     * Reference: http://www.speech.cs.cmu.edu/~sburke/pub/luhn_lib.html
     */
    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;
    }


    /**
     * Check to see if fields are a valid email address.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateEmail(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");


        oEmail = eval('new ' + formName.value + '_email()');

        for (x in oEmail) {
            var field = form[oEmail[x][0]];
            if ((field.type == 'hidden' ||
                 field.type == 'text' ||
                 field.type == 'textarea') &&
                (field.value.length > 0) &&
                field.disabled == false) {
                if (!checkEmail(field.value)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oEmail[x][1];
                    bValid = false;
                }
            }
        }
        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(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 > 4)) {
           return false;
       }
       if (len < 2) {
           return false;
       }
       return true;
    }


    //////////////////

    /**
    * Check to see if fields are a valid double.
    * Fields are not checked if they are disabled.
    * <p>
    * @param form The form validation is taking place on.
    */
    function validateDouble(form) {
        var bValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

		var field;
		var si;
		var value;
		var tempArray;
		var zeroIndex;
		var joinedString;
		var noZeroString;
		var iValue;

        oDouble = eval('new ' + formName.value + '_DoubleValidations()');

        for (x in oDouble) {
        	field = form[oDouble[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'select-one' ||
                field.type == 'radio') &&
                field.disabled == false) {

            	value = '';

                if (field.type == "select-one") {
                    si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else {
                    value = field.value;
                }

                if (value.length <= 0) continue;

                // remove '.' before checking digits
                tempArray = value.split('.');
                //Strip off leading '0'
                zeroIndex = 0;
                joinedString = tempArray.join('');
                while (joinedString.charAt(zeroIndex) == '0') {
                    zeroIndex++;
                }

                noZeroString = joinedString.substring(zeroIndex,joinedString.length);

                if (!isAllDigits(noZeroString)) {
                    bValid = false;
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oDouble[x][1];
                } else {
	                iValue = parseFloat(value);
	                if (isNaN(iValue)) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oDouble[x][1];
	                    bValid = false;
	                }
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }

        return bValid;
    }

    /**
     * Check to see if fields are in a valid float range.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateDoubleRange(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

		var field;
		var fMin;
		var fMax;
		var fValue;

        oRange = eval('new ' + formName.value + '_doubleRange()');
        for (x in oRange) {
            field = form[oRange[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea') &&
                (field.value.length > 0)  &&
                 field.disabled == false) {

                fMin = parseFloat(oRange[x][2]("min"));
                fMax = parseFloat(oRange[x][2]("max"));
                fValue = parseFloat(field.value);

                if (!(fValue >= fMin && fValue <= fMax)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oRange[x][1];
                    isValid = false;
                }
            }
        }

        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }

        return isValid;
    }


    /**
     *  Check to see if fields must contain a value.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateValidWhen(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

		var field;
		var value;
		var si;
		var numOptions;

        oValidWhen = eval('new ' + formName.value + '_validwhen()');

        for (x in oValidWhen) {
            field = form[oValidWhen[x][0]];
            value = '';

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea' ||
                field.type == 'file' ||
                field.type == 'checkbox' ||
                field.type == 'select-one' ||
                field.type == 'password') &&
                field.disabled == false) {

                if (field.type == "select-one") {
                    si = field.selectedIndex;
                    if (si >= 0) {
                        value = field.options[si].value;
                    }
                } else if (field.type == 'checkbox') {
                    if (field.checked) {
                        value = field.value;
                    }
                } else {
                    value = field.value;
                }

                if (trim(value).length == 0) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oValidWhen[x][1];
                    isValid = false;
                }
            } else if (field.type == "select-multiple") {
                numOptions = field.options.length;
                lastSelected=-1;
                for(loop=numOptions-1;loop>=0;loop--) {
                    if(field.options[loop].selected) {
                        lastSelected = loop;
                        value = field.options[loop].value;
                        break;
                    }
                }
                if(lastSelected < 0 || trim(value).length == 0) {
                    if(i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oValidWhen[x][1];
                    isValid=false;
                }
            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
                isChecked=-1;
                for (loop=0;loop < field.length;loop++) {
                    if (field[loop].checked) {
                        isChecked=loop;
                        break; // only one needs to be checked
                    }
                }
                if (isChecked < 0) {
                    if (i == 0) {
                        focusField = field[0];
                    }
                    fields[i++] = oValidWhen[x][1];
                    isValid=false;
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }

        return isValid;
    }

    /**
     * Check to see if fields are in a valid DateTime String.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateStrDateTime(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

        var field;
        var format

        oStrDateTime = eval('new ' + formName.value + '_strDateTime()');
        for (x in oStrDateTime) {
            field = form[oStrDateTime[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea') &&
                (field.value.length > 0)  &&
                 field.disabled == false) {

                format = oStrDateTime[x][2]("format");

                if (format == null || trim(format) == "") {
                	if (field.value.length == 14) format = "yyyyMMddHHmmss";
                	else format = "yyyyMMdd";
                }

                if (!isDate(field.value, format)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oStrDateTime[x][1];
                    isValid = false;
                }
            }
        }

        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }

        return isValid;
    }


    /**
     * Check to see if fields are in a valid DateTime-Term String.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateTwoDates(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

		var field;
        var fValue;
        var type;
        var format;
        var oppositeProperty;
        var oppositeRequired;
        var oppositeFormat;
        var oppositeValue;
        var intervalField; // year, month, date, hour, minute, second
        var intervalValue; // - ÀÌ³», + ÀÌ»ó ( -30 Àº 30 ÀÌ³», 10 Àº 10 ÀÌ»óÀÇ °ª)
        var iInterval;

		var nComp;
		var sDt;
		var eDt;

        oTwoDates = eval('new ' + formName.value + '_twoDates()');
        for (x in oTwoDates) {
            field = form[oTwoDates[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                field.type == 'textarea') &&
                (field.value.length > 0)  &&
                 field.disabled == false) {

                fValue = field.value;
                type = oTwoDates[x][2]("type");
                format = oTwoDates[x][2]("format");
                oppositeProperty = oTwoDates[x][2]("oppositeProperty");
                oppositeRequired = oTwoDates[x][2]("oppositeRequired");
                oppositeFormat = oTwoDates[x][2]("oppositeFormat");
                oppositeValue = form[oppositeProperty].value;
                intervalField = oTwoDates[x][2]("intervalField");
                intervalValue = oTwoDates[x][2]("intervalValue");

				if (type == null || trim(type) == "") type = "start";
				if (oppositeRequired == null || trim(oppositeRequired) == "") oppositeRequired = "true";

		        if (oppositeValue == null || trim(oppositeValue) == "") {
		            if ("false" != oppositeRequired.toLowerCase()) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oTwoDates[x][1];
	                    isValid = false;
                    }
	                continue;
		        }

                if (format == null || trim(format) == "") format = "yyyyMMdd";
                if (oppositeFormat == null || trim(oppositeFormat) == "") oppositeFormat = "yyyyMMdd";

				if ("end" == type.toLowerCase()) {
					nComp = compareDates(oppositeValue, oppositeFormat, fValue, format);
				} else {
					nComp = compareDates(fValue, format, oppositeValue, oppositeFormat);
				}

				// 1 means that startDate is greater and -1 means that there is some error.
                if (nComp == 1 || nComp == -1) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oTwoDates[x][1];
                    isValid = false;
                    continue;
                }

                // interval
                if (intervalField != null && intervalValue != null) {
                	iInterval = parseInt(intervalValue, 10);
                	if ("end" == type.toLowerCase()) {
                		sDt = getDateFromFormat(oppositeValue, oppositeFormat);
                		eDt = getDateFromFormat(fValue, format);
	            		if (iInterval < 0) {
	            			eDt = addDateTime(eDt, intervalField, iInterval);
	            		} else {
	            			eDt = addDateTime(eDt, intervalField, (-1) * iInterval);
	            		}
                	} else {
                		sDt = getDateFromFormat(fValue, format);
                		eDt = getDateFromFormat(oppositeValue, oppositeFormat);
	            		if (iInterval < 0) {
	            			sDt = addDateTime(sDt, intervalField, (-1) * iInterval);
	            		} else {
	            			sDt = addDateTime(sDt, intervalField, iInterval);
	            		}
                	}
            		if ( (iInterval < 0 && sDt < eDt) ||
            				(iInterval >= 0 && sDt > eDt)) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
		                fields[i++] = oTwoDates[x][1];
		                isValid = false;
        			}
                }
            }
        }

        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }

        return isValid;
    }

    /**
     * Check to see if one of fields must contain a value.
     * Fields are not checked if they are disabled.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateRequiredOneOf(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var vField;
        var field;
        var value;
        var prop;
        var si;
        var formName = form.getAttributeNode("name");

        oRequiredOneOf = eval('new ' + formName.value + '_requiredOneOf()');

        for (x in oRequiredOneOf) {
            vField = form[oRequiredOneOf[x][0]];
            if ((vField.type == 'hidden' ||
            	vField.type == 'text' ||
				vField.type == 'textarea' ||
				vField.type == 'select-one' ||
				vField.type == 'radio') &&
				vField.disabled == false) {

				if (vField.type == "select-one") {
                    si = vField.selectedIndex;
                    if (si >= 0) {
                        value = vField.options[si].value;
                    }
                } else {
                    value = vField.value;
                }
				if (trim(value).length != 0) continue;
            }

            prop = oRequiredOneOf[x][2]("property1");
            if (prop != null) {
            	field = form[prop];
            	if (field != null &&
        		   (field.type == 'hidden' ||
        			field.type == 'text' ||
        			field.type == 'textarea'||
					field.type == 'select-one' ||
					field.type == 'radio') &&
        			field.disabled == false) {

					if (field.type == "select-one") {
	                    si = field.selectedIndex;
	                    if (si >= 0) {
	                        value = field.options[si].value;
	                    }
	                } else {
	                    value = field.value;
	                }
					if (trim(value).length != 0) continue;
				}
            }

            prop = oRequiredOneOf[x][2]("property2");
            if (prop != null) {
            	field = form[prop];
            	if (field != null &&
        		   (field.type == 'hidden' ||
        			field.type == 'text' ||
        			field.type == 'textarea'||
					field.type == 'select-one' ||
					field.type == 'radio') &&
        			field.disabled == false) {

					if (field.type == "select-one") {
	                    si = field.selectedIndex;
	                    if (si >= 0) {
	                        value = field.options[si].value;
	                    }
	                } else {
	                    value = field.value;
	                }
					if (trim(value).length != 0) continue;
				}
            }

            prop = oRequiredOneOf[x][2]("property3");
            if (prop != null) {
            	field = form[prop];
            	if (field != null &&
        		   (field.type == 'hidden' ||
        			field.type == 'text' ||
        			field.type == 'textarea'||
					field.type == 'select-one' ||
					field.type == 'radio') &&
        			field.disabled == false) {

					if (field.type == "select-one") {
	                    si = field.selectedIndex;
	                    if (si >= 0) {
	                        value = field.options[si].value;
	                    }
	                } else {
	                    value = field.value;
	                }
					if (trim(value).length != 0) continue;
				}
            }

            prop = oRequiredOneOf[x][2]("property4");
            if (prop != null) {
            	field = form[prop];
            	if (field != null &&
        		   (field.type == 'hidden' ||
        			field.type == 'text' ||
        			field.type == 'textarea'||
					field.type == 'select-one' ||
					field.type == 'radio') &&
        			field.disabled == false) {

					if (field.type == "select-one") {
	                    si = field.selectedIndex;
	                    if (si >= 0) {
	                        value = field.options[si].value;
	                    }
	                } else {
	                    value = field.value;
	                }
					if (trim(value).length != 0) continue;
				}
            }

			fields[i++] = oRequiredOneOf[x][1];
            focusField = vField;
            isValid = false;
        }

        if (fields.length > 0) {
            if (focusField.type != "hidden") focusField.focus();
            validatorAlert(fields.join('\n'));
        }

        return isValid;
    }

    /**
     * Æ¯Á¤ÇÑ ÇÊµå°¡ Æ¯Á¤ÇÑ °ªÀ»°¡Áö¸é ÇØ´ç ÇÊµå°¡ ÇÊ¼öÀÌ´Ù.
     * disabledÀÎ ÇÊµå´Â °Ë»çÇÏÁö ¾Ê´Â´Ù.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateRequiredWhen(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name");

		var oppositeProperty;
		var propertyCondition;
		var conditionValue;
		var isRequired = false;

		var field;
		var value;
		var si;
		var numOptions;
		var apos;

        oRequiredWhen = eval('new ' + formName.value + '_requiredWhen()');

        for (x in oRequiredWhen) {
        	isRequired = false;
            oppositeProperty = oRequiredWhen[x][2]("oppositeProperty");
            propertyCondition = oRequiredWhen[x][2]("propertyCondition");
            conditionValue = oRequiredWhen[x][2]("conditionValue");

			if (conditionValue == null 
					|| conditionValue == "" 
					|| isNaN(conditionValue)) {
				apos = "'";
			} else {
				apos = "";
			}

			if (!isNaN(conditionValue) && conditionValue.charAt(0) == '0') {
				apos = "'";
			}

			if (oppositeProperty != null) {
				isRequired = eval("document." + form.name + "['" + oppositeProperty + "'].value " + propertyCondition + " " + apos + conditionValue + apos);
			}

			if (isRequired) {
	            field = form[oRequiredWhen[x][0]];
	            value = '';

	            if ((field.type == 'hidden' ||
	                field.type == 'text' ||
	                field.type == 'textarea' ||
	                field.type == 'file' ||
	                field.type == 'checkbox' ||
	                field.type == 'select-one' ||
	                field.type == 'password') &&
	                field.disabled == false) {

	                if (field.type == "select-one") {
	                    si = field.selectedIndex;
	                    if (si >= 0) {
	                        value = field.options[si].value;
	                    }
	                } else if (field.type == 'checkbox') {
	                    if (field.checked) {
	                        value = field.value;
	                    }
	                } else {
	                    value = field.value;
	                }

	                if (trim(value).length == 0) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oRequiredWhen[x][1];
	                    isValid = false;
	                }
	            } else if (field.type == "select-multiple") {
	                numOptions = field.options.length;
	                lastSelected=-1;
	                for(loop=numOptions-1;loop>=0;loop--) {
	                    if(field.options[loop].selected) {
	                        lastSelected = loop;
	                        value = field.options[loop].value;
	                        break;
	                    }
	                }
	                if(lastSelected < 0 || trim(value).length == 0) {
	                    if(i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oRequiredWhen[x][1];
	                    isValid=false;
	                }
	            } else if ((field.length > 0) && (field[0].type == 'radio' || field[0].type == 'checkbox')) {
	                isChecked=-1;
	                for (loop=0;loop < field.length;loop++) {
	                    if (field[loop].checked) {
	                        isChecked=loop;
	                        break; // only one needs to be checked
	                    }
	                }
	                if (isChecked < 0) {
	                    if (i == 0) {
	                        focusField = field[0];
	                    }
	                    fields[i++] = oRequiredWhen[x][1];
	                    isValid=false;
	                }
	            }
	        }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }

        return isValid;
    }
    
    /**
    * Check to see if fields are a valid using a regular expression when other field is specified value.
    * Fields are not checked if they are disabled.
    * <p>
    * @param form The form validation is taking place on.
    */
    function validateMaskWhen(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name"); 

		var field;
		var isRequired = false;
		var apos;

        oMasked = eval('new ' + formName.value + '_maskWhen()');

        for (x in oMasked) {
        	isRequired = false;
            oppositeProperty = oMasked[x][2]("oppositeProperty");
            propertyCondition = oMasked[x][2]("propertyCondition");
            conditionValue = oMasked[x][2]("conditionValue");

			if (conditionValue == null 
					|| conditionValue == "" 
					|| isNaN(conditionValue)) {
				apos = "'";
			} else {
				apos = "";
			}

			if (!isNaN(conditionValue) && conditionValue.charAt(0) == '0') {
				apos = "'";
			}

			if (oppositeProperty != null) {
				isRequired = eval("document." + form.name + "['" + oppositeProperty + "'].value " + propertyCondition + " " + apos + conditionValue + apos);
			}

			if (isRequired) {
	            field = form[oMasked[x][0]];
	
	            if ((field.type == 'hidden' ||
	                field.type == 'text' ||
	                 field.type == 'textarea' ||
					 field.type == 'file') &&
	                 (field.value.length > 0) &&
	                 field.disabled == false) {
	
	                if (!matchPattern(field.value, oMasked[x][2]("mask"))) {
	                    if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oMasked[x][1];
	                    isValid = false;
	                }
	            }
	        }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

    /**
    * Check to see if fields are a valid business registration id.
    * Fields are not checked if they are disabled.
    * <p>
    * @param form The form validation is taking place on.
    */
    function validateBizRegisterId(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name"); 

		var field;

        oBiz = eval('new ' + formName.value + '_bizRegisterId()');

        for (x in oBiz) {
            field = form[oBiz[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea') &&
                 (field.value.length > 0) &&
                 field.disabled == false) {

                if (!matchBizRegisterId(field.value)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oBiz[x][1];
                    isValid = false;
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

    /**
     * »ç¾÷ÀÚµî·Ï¹øÈ£ È®ÀÎ
     *
     * 10ÀÚ¸® ¼ýÀÚ
     * µî·Ï¹øÈ£¿¡ ÀÏÁ¤ÇÑ ¹è¼ö¸¦ °öÇÏ°í 8ÀÚ¸®±îÁöÀÇ ÇÕÀ» ±¸ÇÏ°í 9ÀÚ¸® °öÀÇ °á°úÀÇ
     * ½ÊÀÚ¸®ÀÇ ¼ýÀÚ¿Í ÀÏÀÚ¸® ¼ýÀÚ¸¦ ´õÇÑ´Ù
     * ±× ÇÕ°ú ¸¶Áö¸· ¼ýÀÚ¿ÍÀÇ ÇÕÀÌ 10ÀÇ ¹è¼öÀÎ°¡?
     *
     * µî·Ï¹øÈ£      :  1  1  6  8  1  1  9  4  7  7
     * ¹è¼ö          :  1  3  7  1  3  7  1  3  5
     * °ö            :  1  3 42  8  3  7  9 12 35
     * 8ÀÚ¸®±îÁöÀÇ ÇÕ: 85
     * 9ÀÚ¸®ÇÕ       : 85 + 3 + 5 = 93
     * 10ÀÚ¸®ÇÕ       : 93 + 7 = 100
     *
     * 100 % 10 = 0
     *
     * @param id °Ë»çÇÒ »ç¾÷ÀÚµî·Ï¹øÈ£
     */
	function matchBizRegisterId(id) {
		if (isNaN(id)) return false;

		var regId = "";
		for(var i = 0; i < id.length; i++) {
			c = id.substring(i, i+1);
			if (c == "-") continue;
			if (isNaN(c)) return false;
			regId += c;
		}

		if (regId.length != 10) return false;

		var v_fix = "13713713";
		var v_total = 0;
		var v_cnt = 0;
		var v_tot9 = 0;
		var v_a = 0;
		var v_b = 0;
		var v_r = 0;
		var v_d = 0;

		for(var i = 0; i < 8; i++)
		{
			v_total = v_total + parseInt(regId.substring(v_cnt, (i+1)), 10) * parseInt(v_fix.substring(v_cnt, (i+1)), 10);
		}

		var v_tot9 = regId.substring(8 ,9) * 5;	

		v_a  = Math.floor(v_tot9 / 10, 0 );
		v_b  = v_tot9 % 10;

		v_total = v_total + v_a + v_b;

		v_r = v_total % 10;

		if( v_r == 0)
		{
			v_r = 10;
		}

		v_d = 10 - v_r;

		if( v_d == regId.substring(9, 10))
		{
			return true;
		}else{
			return false;
		}
	}

    /**
     * ÁÖ¹Îµî·Ï¹øÈ£ È®ÀÎ.
     * disabledµÈ ÇÊµå´Â È®ÀÎÇÏÁö ¾ÊÀ½.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validatePersonalId(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name"); 

		var field;

        oId = eval('new ' + formName.value + '_personalId()');

        for (x in oId) {
            field = form[oId[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea') &&
                 (field.value.length > 0) &&
                 field.disabled == false) {

                if (!matchPersonalId(field.value)) {
                    if (matchPersonalFgId(field.value) == false) {
                    	if (i == 0) {
	                        focusField = field;
	                    }
	                    fields[i++] = oId[x][1];
						isValid = false;
					}
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

	/**
	 * ÁÖ¹Îµî·Ï¹øÈ£ È®ÀÎ
	 *
	 * Ã¼Å© ¼ýÀÚ¸¦ Á¦¿ÜÇÑ ¾ÕÀÇ 12ÀÚ¸®¿¡ 2ºÎÅÍ 9±îÁöÀÇ ÀÏ·Ã ¼ýÀÚ¸¦ °öÇÏ¿© ´õÇÑ´Ù.
	 * ±× °á°ú¸¦ 11·Î ³ª´« ÈÄ ±× ³ª¸ÓÁö¸¦ 11¿¡¼­ »«¸é Ã¼Å© ¼ýÀÚ°¡ µÈ´Ù.
	 * Ã¼Å© ¼ýÀÚ°¡ 10º¸´Ù Å©°Å³ª °°´Ù¸é, ÀÌ ¼ýÀÚ¸¦ 10À¸·Î ÇÑ ¹ø ´õ ³ª´©¾î ±× ³ª¸ÓÁö¸¦ Ã¼Å© ¼ýÀÚ·Î ÇÑ´Ù.
	 *
	 *  6  5  1  0  1  4 - 2  0  5  2  0  1  8
	 *  2  3  4  5  6  7   8  9  2  3  4  5
	 * 12+15+ 4+ 0+ 6+28 +16+ 0+10+ 6+ 0+ 5 = 102
	 *
	 * 102 / 11 => ³ª¸ÓÁö = 3
	 * 11 - 3 = 8 => check bit (¸¶Áö¸· ¼ýÀÚ)
	 *
	 * @param id ÁÖ¹Îµî·Ï¹øÈ£(- ±âÈ£°¡ ÀÖ°Å³ª ¾ø°Å³ª »ó°ü ¾ø´Ù)
	 * @return ÀûÇÕÇÑ ÁÖ¹Îµî·Ï¹øÈ£¸é true, ¾Æ´Ï¸é false
	 */
	function matchPersonalId(id) {
		if (id.length != 13 && id.length != 14) return false;
		var tot = 0;
		var multi = new Array(2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5);
		var ids = new Array();
		var idsIndex = 0;
		var c;

		for(var i = 0; i < id.length; i++) {
			c = id.substring(i, i+1);
			if (c == "-") continue;
			if (isNaN(c)) return false;
			ids[idsIndex++] = parseInt(c, 10);
		}

		if (ids.length != 13) return false;

		for(var i = 0; i < 12; i++) {
			tot += ids[i] * multi[i];
		}

		var remains = tot % 11;
		var chk = 11 - remains;
		if (chk >= 10) {
			chk = chk % 10;
		}

		return (chk == ids[12]);
	}
		
	/**
	 * ¿Ü±¹ÀÎ ÁÖ¹Îµî·Ï¹øÈ£ È®ÀÎ
	 *
	 * @param id ÁÖ¹Îµî·Ï¹øÈ£(- ±âÈ£°¡ ÀÖ°Å³ª ¾ø°Å³ª »ó°ü ¾ø´Ù)
	 * @return ÀûÇÕÇÑ ÁÖ¹Îµî·Ï¹øÈ£¸é true, ¾Æ´Ï¸é false
	 */
	function matchPersonalFgId(idn_no) {
	   var sum=0;
       var odd=0;
       buf = new Array(13);
       for(i=0; i<13; i++) { buf[i]=parseInt(idn_no.charAt(i)); }
       odd = buf[7]*10 + buf[8];
       if(odd%2 != 0) { return false; }
       if( (buf[11]!=6) && (buf[11]!=7) && (buf[11]!=8) && (buf[11]!=9) ) {
               return false;
       }
       multipliers = [2,3,4,5,6,7,8,9,2,3,4,5];
       for(i=0, sum=0; i<12; i++) { sum += (buf[i] *= multipliers[i]); }
       sum = 11 - (sum%11);
       if(sum >= 10) { sum -= 10; }
       sum += 2;
       if(sum >= 10) { sum -= 10; }
       if(sum != buf[12]) { return false }
       return true;
	}

    /**
     * ½Å¿ëÄ«µå¹øÈ£ È®ÀÎ.
     * disabledµÈ ÇÊµå´Â È®ÀÎÇÏÁö ¾ÊÀ½.
     * <p>
     * @param form The form validation is taking place on.
     */
    function validateCreditCardKr(form) {
        var isValid = true;
        var focusField = null;
        var i = 0;
        var fields = new Array();
        var formName = form.getAttributeNode("name"); 

		var field;

        oCard = eval('new ' + formName.value + '_creditCardKr()');

        for (x in oCard) {
            field = form[oCard[x][0]];

            if ((field.type == 'hidden' ||
                field.type == 'text' ||
                 field.type == 'textarea') &&
                 (field.value.length > 0) &&
                 field.disabled == false) {

                if (!matchCreditCardKr(field.value)) {
                    if (i == 0) {
                        focusField = field;
                    }
                    fields[i++] = oCard[x][1];
                    isValid = false;
                }
            }
        }

        if (fields.length > 0) {
           if (focusField.type != "hidden") focusField.focus();
           validatorAlert(fields.join('\n'));
        }
        return isValid;
    }

	/**
	 * ½Å¿ëÄ«µå¹øÈ£ È®ÀÎ
	 *
	 * ¸¶½ºÅÍÄ«µå: 51 ~ 55 »çÀÌÀÇ ¼ýÀÚ·Î ½ÃÀÛÇÏ´Â 16ÀÚ¸®
	 * ºñÀÚÄ«µå: 4·Î ½ÃÀÛÇÏ´Â 13ÀÚ¸® ¶Ç´Â 16ÀÚ¸®
	 * ¾Æ¸Þ¸®Ä­ÀÍ½ºÇÁ·¹½ºÄ«µå: 34 ¶Ç´Â 37·Î ½ÃÀÛÇÏ´Â 15ÀÚ¸®
	 * Ã¼Å©ºñÆ®´Â ¸¶Áö¸· ¼ýÀÚ
	 *
	 * Ã¼Å©ºñÆ®¸¦ Á¦¿ÜÇÑ ¼ýÀÚ¿¡¼­ È¦¼ö¹øÂ° ¼ýÀÚµéÀº 2¹èÇÏ¿© ´õÇÏ°í, Â¦¼ö¹øÂ° ¼ýÀÚµéÀº ±×³É ´õÇÑ´Ù.
	 * ÀüÃ¼ ÇÕ°ú Ã¼Å©ºñÆ®¸¦ ÇÕÇÑ °ÍÀÌ 10ÀÇ ¹è¼öÀÌ¸é Ä«µå ¹øÈ£ÀÌ´Ù.
	 *
	 * ¾Æ¸Þ¸®Ä­ÀÍ½ºÇÁ·¹½ºÀÇ °æ¿ì¿¡´Â 34 ¶Ç´Â 37Àº °è»ê¿¡¼­ Á¦¿ÜÇÑ´Ù.
	 *
	 * Ä«µå¹øÈ£: 5368-2358-9683-1135
	 * È¦¼ö¹øÂ°: 5*2=10, 6*2=12, 2*2=4, 5*2=10, 9*2=18, 8*2=16, 1*2=2, 3*2=6
	 *           1+0 + 1+2 + 4 + 1+0 + 1+8 + 1+6 + 2 + 6 = 33
	 * Â¦¼ö¹øÂ°: 3 + 8 + 3 + 8 + 6 + 3 + 1 = 32
	 * ÃÑÇÕ: 65 => 10ÀÇ ¹è¼ö = 70
	 * Ã¼Å©: 5
	 *
	 * @param no ½Å¿ëÄ«µå¹øÈ£(- ±âÈ£°¡ ÀÖ°Å³ª ¾ø°Å³ª »ó°ü ¾ø´Ù)
	 * @return ÀûÇÕÇÑ ½Å¿ëÄ«µå¹øÈ£¸é true, ¾Æ´Ï¸é false
	 */
	function matchCreditCardKr(no) {
		var i = 0;
		try {
			var amChk = parseInt(no.substring(0, 2), 10);
			if (amChk == 34 || amChk == 37) i = 2;
		} catch (ex) {
			return false;
		}

		var cardNumber = "";
		var c;
		for (; i < no.length; i++) {
			c = no.charAt(i);
			if (c == "-") continue;
			cardNumber += c;
		}

        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;
	}
