	/*
	 * validator.js 사용을 위해서는 jquery-1.2.6.min.js가 필요하다.
	 */
	
	var ebill_isSubmited = false; 
	
	String.prototype.rtrim = function() {
		var i = this.length;
		
		while(i--) {
			if(this.charCodeAt(i)!=32) {
				return this.substring(0, i+1);
			}
		}

		return "";
	}

	String.prototype.ltrim = function() {
		var i = -1, l = this.length;
		
		while(i++<l) {
			if(this.charCodeAt(i)!=32) {
				return this.substring(i);
			}
		}

		return "";
	}

	String.prototype.trim = function() {
		return this.rtrim().ltrim();
	}
	
	String.prototype.cut = function(start, length) {
	    return this.substring(0, start) + this.substr(start + length);
	}
	
	String.prototype.replaceAll = function(matchStr, newStr) {
		var result = this;
		
		if(matchStr=="") return result;
		
		while(result.indexOf(matchStr)!=-1) {
			result = result.replace(matchStr, newStr);
		}
		
	    return result;
	}
	
	String.prototype.endsWith = function(str) {
		return (this.match(str+"$")==str)
	}
	
	function ValidatorMessage() {}
	
	ValidatorMessage.prototype.messages = {
		"ERR.REQUIRED":"필수 입력 항목입니다.",
		"ERR.LENGTH":"@자리수만큼 입력하십시오.",
		"ERR.MIN_LENGTH":"@자 이상으로 입력하십시오.",
		"ERR.MAX_LENGTH":"@자 이하로 입력하십시오.",
		"ERR.BYTE_LENGTH":"@자리수만큼 입력하십시오. (한글은 @자리수)",
		"ERR.MIN_BYTE_LENGTH":"@자 이상으로 입력하십시오. (한글은 @자 이상)",
		"ERR.MAX_BYTE_LENGTH":"@자 이하로 입력하십시오. (한글은 @자 이하)",
		"ERR.NUMBER":"숫자만을 입력하십시오.",
		"ERR.NUMBER_INTEGRAL":"정수부를 @자리 이하로 입력하십시오.",
		"ERR.NUMBER_DECIMAL":"소수부를 @자리로 입력하십시오.",
		"ERR.NUMBER_DECIMAL_2":"소수부를 @자리 이하로 입력하십시오.",
		"ERR.MIN_NUMBER":"@ 이상으로 입력하십시오.",
		"ERR.MAX_NUMBER":"@ 이하로 입력하십시오.",
		"ERR.IN_NUMBER":"@ 이상 @ 이하로 입력하십시오.",
		"ERR.ONLY_PLUS":"양수 값만 입력하십시오.",
		"ERR.DATE":"유효한 날짜가 아닙니다.",
		"ERR.MIN_DATE":"@ 이후이어야 합니다.",
		"ERR.MAX_DATE":"@ 이전이어야 합니다.",
		"ERR.TIME":"유효한 시간이 아닙니다.",
		"ERR.SSN":"유효한 주민등록번호가 아닙니다.",
		"ERR.BRN":"유효한 사업자등록번호가 아닙니다.",
		"ERR.BRNSSN":"유효한 사업자/주민등록번호가 아닙니다.",
		"ERR.EAN":"유효한 전자세금계산서승인번호가 아닙니다.",
		"ERR.EMAIL":"유효한 이메일 주소가 아닙니다.",		
		"ERR.FILTER":"@ 문자는 사용할 수 없습니다.",
		"ERR.INVERSE_FILTER":"@ 문자만 사용할 수 있습니다.",
		"ERR.FORMAT":"'@' 형식이어야 합니다.\n\n" +
		             "  - # : 문자 혹은 숫자\n" +
		             "  - H, h : 한글(h는 공백포함)\n" +
		             "  - A, a : 문자(a는 공백포함)\n" +
		             "  - 9, 0 : 숫자(0는 공백포함)",
		"ERR.MASK":"'@' 형식이어야 합니다.",
		"ERR.NUMBER_MASK":"'@' 형식의 숫자이어야 합니다.",
		"ERR.EXPR":"Validator 표현식이 잘못되었습니다. @",
		"ERR.EXPR_NONE":"Validator 표현식에서 해당 검사항목은 존재하지 않습니다. (@)"
	}
	
	ValidatorMessage.prototype.getMessage = function (code, arguments, separator) {
		if(code==null || code=="") {
			return null;
		}
	
		var message = this.messages[code];
		
		if(arguments!=null) {
			if(separator==null) {
				message = message.replace("@", arguments);
			} else {
				var argumentArray = arguments.split(separator);
				var index = 0;
				var count = 0;
				
				while( (index = message.indexOf("@", index)) != -1 ) {
					message = message.replace("@", argumentArray[count]);
					count++;
				}
			}
		}
		
		return message;
	}
	
	function FormValidatorUtil() {}
	
	FormValidatorUtil.prototype.getByteLength = function (param) {
		var byteLength = 0, c;
		
		for(var i = 0; i < param.length; i++) {
			c = escape(param.charAt(i));      
			
			if (c.length == 1) {
				byteLength ++;          
			} else if (c.indexOf("%u") != -1)  { 
				byteLength += 2;        
			} else if (c.indexOf("%") != -1)  {  
				byteLength += c.length/3;                
			}
		}
		
		return byteLength;   
	}
	
	FormValidatorUtil.prototype.isHangul = function (chr) {
		var cCode = chr.charCodeAt(0);
		
		if( (0xAC00 <= cCode && cCode <= 0xD7A3) || (0x3131 <= cCode && cCode <= 0x318E) ) {
			return true;
		} else {
			return false;
		}
	}
	
	FormValidatorUtil.prototype.isAlphabet = function (chr) {
		var cCode = chr.charCodeAt(0);
		
		if( (0x61 <= cCode && cCode <= 0x7A) || (0x41 <= cCode && cCode <= 0x5A) ) {
			return true;
		} else {
			return false;
		}
	}
	
	FormValidatorUtil.prototype.isNumber = function (chr) {
		if( isNaN(chr) || chr==' ' ) return false;
		else return true;
	}
	
	FormValidatorUtil.prototype.hasHangul = function (param) {
		for (var i=0; i<param.length; i++) {
			if( this.isHangul(param.charAt(i)) ) return true;
		}
		
		return false;
	}
	
	FormValidatorUtil.prototype.hasAlphabet = function (param) {
		for (var i=0; i<param.length; i++) {
			if( this.isAlphabet(param.charAt(i)) ) return true;
		}
		
		return false;
	}
	
	FormValidatorUtil.prototype.hasNumber = function (param) {
		for (var i = 0; i < param.length; i++) {
			if( !isNaN(param.charAt(i)) && param.charAt(i)!=' ' ) return true;
		}
		
		return false;
	}
	
	FormValidatorUtil.prototype.getExpressions = function (obj) {
		var result = null;
		var className = obj.className;
		
		if( className!=null && className!="" ) {
			var startInx = className.indexOf("[{");
			
			if(startInx!=-1) {
				result = eval(className.substring(startInx))[0]; // [{required:true,length=3}]
			}
		}
		
		return result;
	}
	
	FormValidatorUtil.prototype.getEventSource = function (event) {
		if(event.target) return event.target;
		else return event.srcElement;
	}
	
	function FormValidator() {}
	
	FormValidator.prototype.validatorMessage = new ValidatorMessage();
	FormValidator.prototype.formValidatorUtil = new FormValidatorUtil();
	
	// 필수 입력 체크
	FormValidator.prototype.validateRequired = function (obj) {
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["required"];
		
		if( expr==true ) {
			var checkResult = true;
			
			if( obj.value.trim()=="" ) {
				checkResult = false;
			} else if( expressions["zeroAsEmpty"] && obj.value.trim()=="0" ) {
				checkResult = false;
			}
			
			if(!checkResult) {
				if(expressions["requiredMessage"]!=null) {
					alert(expressions["requiredMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.REQUIRED"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.REQUIRED"));
					}
				}
				
				if(obj.type.indexOf("select")==-1) obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 길이 체크
	FormValidator.prototype.validateLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["length"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && obj.value.length!=expr ) {
				if(expressions["lengthMessage"]!=null) {
					alert(expressions["lengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.LENGTH", expr));
					} else {
						alert(this.validatorMessage.getMessage("ERR.LENGTH", expr));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최소 길이 체크
	FormValidator.prototype.validateMinLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["minLength"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && obj.value.length<expr ) {
				if(expressions["minLengthMessage"]!=null) {
					alert(expressions["minLengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MIN_LENGTH", expr));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MIN_LENGTH", expr));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최대 길이 체크
	FormValidator.prototype.validateMaxLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["maxLength"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && obj.value.length>expr ) {
				if(expressions["maxLengthMessage"]!=null) {
					alert(expressions["maxLengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MAX_LENGTH", expr));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MAX_LENGTH", expr));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 바이트 길이 체크
	FormValidator.prototype.validateByteLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["byteLength"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && this.formValidatorUtil.getByteLength(obj.value)!=expr ) {
				if(expressions["byteLengthMessage"]!=null) {
					alert(expressions["byteLengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.BYTE_LENGTH", expr+","+expr/2, ","));
					} else {
						alert(this.validatorMessage.getMessage("ERR.BYTE_LENGTH", expr+","+expr/2, ","));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최소 바이트 길이 체크
	FormValidator.prototype.validateMinByteLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["minByteLength"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && this.formValidatorUtil.getByteLength(obj.value)<expr ) {
				if(expressions["minByteLengthMessage"]!=null) {
					alert(expressions["minByteLengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MIN_BYTE_LENGTH", expr+","+expr/2, ","));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MIN_BYTE_LENGTH", expr+","+expr/2, ","));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최대 바이트 길이 체크
	FormValidator.prototype.validateMaxByteLength = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["maxByteLength"];
		
		if( expr!=null ) {
			if( !isNaN(expr) && this.formValidatorUtil.getByteLength(obj.value)>expr ) {
				if(expressions["maxByteLengthMessage"]!=null) {
					alert(expressions["maxByteLengthMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MAX_BYTE_LENGTH", expr+","+expr/2, ","));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MAX_BYTE_LENGTH", expr+","+expr/2, ","));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 숫자 체크
	FormValidator.prototype.validateNumber = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["number"]!=null || expressions["minNumber"]!=null ||
			expressions["maxNumber"]!=null || expressions["inNumber"]!=null ||
			expressions["notFormatedNumber"]==true ) {
			if(expressions["onlyPlus"]==true && obj.value.indexOf("-")==0) {
				alert(this.validatorMessage.getMessage("ERR.ONLY_PLUS"));
				obj.select();
				obj.focus();
				return false;
			}
			
			// "," 제거
			var tmpNumber = obj.value.replaceAll(",", "");
			
			if( isNaN(tmpNumber) ) {
				if(expressions["numberMessage"]!=null) {
					alert(expressions["numberMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.NUMBER"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.NUMBER"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 숫자 포맷 체크
	FormValidator.prototype.validateFormatNumber = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["number"] + "";
		
		var hasParenthesis = false;
		
		if(expr.indexOf("(")!=-1 && expr.indexOf(")")!=-1) {
			hasParenthesis = true;
			expr = expr.replaceAll("(", "");
			expr = expr.replaceAll(")", "");
		}
		
		if( expr!=null && !isNaN(expr) ) {
			// "," 제거
			var tmpNumber = obj.value.replaceAll(",", "");
			
			var inxDot = expr.indexOf(".");
			var integralLength = Number(expr.substring(0, inxDot));
			var decimalLength = Number(expr.substring(inxDot+1));
			
			inxDot = tmpNumber.indexOf(".");
			
			var integralValueLength = 0;
			var decimalValueLength = 0;
			
			if(inxDot==-1) {
				integralValueLength = tmpNumber.length;
			} else {
				integralValueLength = tmpNumber.substring(0, inxDot).length;
				decimalValueLength = tmpNumber.substring(inxDot+1).length;
			}

			if(integralLength<integralValueLength) {
				if(expressions["numberMessage"]!=null) {
					alert(expressions["numberMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.NUMBER_INTEGRAL", integralLength));
					} else {
						alert(this.validatorMessage.getMessage("ERR.NUMBER_INTEGRAL", integralLength));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
			
			if(hasParenthesis) {
				if(tmpNumber.indexOf(".")!=-1) {
					if(decimalLength<decimalValueLength) {
						if(expressions["numberMessage"]!=null) {
							alert(expressions["numberMessage"]);
						} else {
							if(expressions["objName"]!=null) {
								alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.NUMBER_DECIMAL_2", decimalLength));
							} else {
								alert(this.validatorMessage.getMessage("ERR.NUMBER_DECIMAL_2", decimalLength));
							}
						}
						
						obj.select();
						obj.focus();
						return false;
					}
				}
			} else {
				if(decimalLength!=decimalValueLength) {
					if(expressions["numberMessage"]!=null) {
						alert(expressions["numberMessage"]);
					} else {
						if(expressions["objName"]!=null) {
							alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.NUMBER_DECIMAL", decimalLength));
						} else {
							alert(this.validatorMessage.getMessage("ERR.NUMBER_DECIMAL", decimalLength));
						}
					}
					
					obj.select();
					obj.focus();
					return false;
				}
			}
		}
		
		return true;
	}
	
	// 최소 숫자 체크
	FormValidator.prototype.validateMinNumber = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["minNumber"];
		
		if( expr!=null ) {
			// "," 제거
			var numberValue = Number(obj.value.replaceAll(",", ""));
			
			if(expr>numberValue) {
				if(expressions["minNumberMessage"]!=null) {
					alert(expressions["minNumberMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MIN_NUMBER", (new FormFormater()).formatNumber(expr+"")));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MIN_NUMBER", (new FormFormater()).formatNumber(expr+"")));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최대 숫자 체크
	FormValidator.prototype.validateMaxNumber = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["maxNumber"];
		
		if( expr!=null ) {
			// "," 제거
			var numberValue = Number(obj.value.replaceAll(",", ""));
			
			if(expr<numberValue) {
				if(expressions["maxNumberMessage"]!=null) {
					alert(expressions["maxNumberMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MAX_NUMBER", (new FormFormater()).formatNumber(expr+"")));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MAX_NUMBER", (new FormFormater()).formatNumber(expr+"")));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최소~최대 숫자 체크
	FormValidator.prototype.validateInNumber = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["inNumber"]; // String으로 변환
		
		if( expr!=null ) {
			var inx = expr.indexOf("~");
			var minNumber = Number(expr.substring(0,inx));
			var maxNumber = Number(expr.substring(inx+1));
			// "," 제거
			var numberValue = Number(obj.value.replaceAll(",", ""));
			
			if( minNumber>numberValue || maxNumber<numberValue ) {
				if(expressions["inNumberMessage"]!=null) {
					alert(expressions["inNumberMessage"]);
				} else {
					var ff = new FormFormater();
					// seperator 주의
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.IN_NUMBER", ff.formatNumber(minNumber+"")+":"+ff.formatNumber(maxNumber+""), ":"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.IN_NUMBER", ff.formatNumber(minNumber+"")+":"+ff.formatNumber(maxNumber+""), ":"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 날짜 여부
	FormValidator.prototype.isValidDate = function (param, expressions, noMessage) {
		if( isNaN(param) || param.length!=8 ) {
			if(noMessage!=true) {
				if(expressions["dateMessage"]!=null) {
					alert(expressions["dateMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.DATE"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.DATE"));
					}
				}
			}
			
			return false;
		}
		
		var year = Number(param.substring(0, 4));
		var month = Number(param.substring(4, 6));
		var day = Number(param.substring(6, 8));
		
		if( month<1 || month>12 ) {
			if(noMessage!=true) {
				if(expressions["dateMessage"]!=null) {
					alert(expressions["dateMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.DATE"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.DATE"));
					}
				}
			}
			
			return false;
		}
		
		var maxDaysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
		var maxDay = maxDaysInMonth[month-1];
		
		// 윤년 체크
		if( month==2 &&
			( year%4==0 && year%100!=0 || year%400==0 ) ) {
			maxDay = 29;
		}
		
		if( day<=0 || day>maxDay ) {
			if(noMessage!=true) {
				if(expressions["dateMessage"]!=null) {
					alert(expressions["dateMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.DATE"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.DATE"));
					}
				}
			}
			
			return false;
		}
		
		return true;
	}
	
	// 날짜 체크
	FormValidator.prototype.validateDate = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( ( expressions["date"]==true || expressions["minDate"]!=null || expressions["maxDate"]!=null ) &&
			obj.value!="" ) {
			// "/" 제거
			var tmpDate = obj.value.replaceAll("/", "");
			
			if(!this.isValidDate(tmpDate, expressions)) {
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최소 날짜 체크
	FormValidator.prototype.validateMinDate = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["minDate"] + ""; // String 변환
		
		if( expr!=null ) {
			// "/" 제거
			var tmpDate = obj.value.replaceAll("/", "");
			
			var inputDate = new Date( Number(tmpDate.substring(0, 4)),
					                   Number(tmpDate.substring(4, 6))-1,
					                   Number(tmpDate.substring(6, 8)) );
			var minDate = new Date( Number(expr.substring(0, 4)),
	                                 Number(expr.substring(4, 6))-1,
	                                 Number(expr.substring(6, 8)) );
			
			if( inputDate < minDate ) {
				if(expressions["minDateMessage"]!=null) {
					alert(expressions["minDateMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MIN_DATE", (new FormFormater()).formatDate(expr)));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MIN_DATE", (new FormFormater()).formatDate(expr)));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 최대 날짜 체크
	FormValidator.prototype.validateMaxDate = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["maxDate"] + ""; // String 변환
		
		if( expr!=null ) {
			// "/" 제거
			var tmpDate = obj.value.replaceAll("/", "");
			
			var inputDate = new Date( Number(tmpDate.substring(0, 4)),
					                   Number(tmpDate.substring(4, 6))-1,
					                   Number(tmpDate.substring(6, 8)) );
			var maxDate = new Date( Number(expr.substring(0, 4)),
	                                 Number(expr.substring(4, 6))-1,
	                                 Number(expr.substring(6, 8)) );
			
			if( inputDate > maxDate ) {
				if(expressions["maxDateMessage"]!=null) {
					alert(expressions["maxDateMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MAX_DATE", (new FormFormater()).formatDate(expr)));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MAX_DATE", (new FormFormater()).formatDate(expr)));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 시간 체크
	FormValidator.prototype.validateTime = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["time"]==true && obj.value!="" ) {
			// ":" 제거
			var tmpTime = obj.value.replaceAll(":", "");
			
			if( isNaN(tmpTime) || tmpTime.length!=6 ||
				(parseInt(tmpTime.substring(0,2), 10)<0 || parseInt(tmpTime.substring(0,2), 10)>23) ||
				(parseInt(tmpTime.substring(2,4), 10)<0 || parseInt(tmpTime.substring(2,4), 10)>59) ||
				(parseInt(tmpTime.substring(4,6), 10)<0 || parseInt(tmpTime.substring(4,6), 10)>59) ) {
				if(expressions["timeMessage"]!=null) {
					alert(expressions["timeMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.TIME"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.TIME"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 주민등록번호 체크(내부 로직)
	FormValidator.prototype.validateSsnInner = function (obj) {
		if( obj.value!="" ) {
			// 외국인등록번호 예외 처리
			if(obj.value.substring(0, 6)==("999999")) {
				return true;
			}
			
			// "-" 제거
			var tmpSsn = obj.value.replace('-', '');
			var expressions = (new FormValidatorUtil).getExpressions(obj);
			
			if( isNaN(tmpSsn) || tmpSsn.length!=13 ) {
				if(expressions["ssnMessage"]!=null) {
					alert(expressions["ssnMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.SSN"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.SSN"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
			
			/* ----------------------------------------------------------------
			   잘못된 생년월일을 검사합니다.
			   2000년도부터 성구별 번호가 바뀌었으므로,
			   구별수가 2보다 작다면 1900년도 생이되고, 2보다 크다면 2000년도 이상생이 됩니다. 
			   단, 1800년도 생은 계산에서 제외합니다.
			---------------------------------------------------------------- */
			/* invalid 주민등록번호가 존재하므로 validation 로직 적용하지 않음 */
			/*
			var ssnSecond = tmpSsn.substring(6);
			
			var bYear = (ssnSecond.charAt(0) <= "2") ? "19" : "20";
		
			// 주민번호의 앞에서 2자리를 이어서 4자리의 생년을 저장합니다.
			bYear += tmpSsn.substr(0, 2);
		
			// 달을 구합니다. 1을 뺀것은 자바스크립트에서는 1월을 0으로 표기하기 때문입니다.
			bMonth = tmpSsn.substr(2, 2) - 1;
		
			bDate = tmpSsn.substr(4, 2);
		
			bSum = new Date(bYear, bMonth, bDate);
		
			// 생년월일의 타당성을 검사하여 거짓이 있을시 에러메세지를 나타냄
			if ( bSum.getFullYear()%100!=tmpSsn.substr(0, 2) || 
				 bSum.getMonth()!=bMonth ||
				 bSum.getDate()!=bDate ) {
				alert(this.validatorMessage.getMessage("ERR.SSN"));
				obj.select();
				obj.focus();
				return false;
			}
			
			var total = 0;
			var temp = new Array(13);
			var k = 0;
			
			for(var i=1; i<=6; i++) 
				temp[i] = tmpSsn.charAt(i-1);
				
			for(var i=7; i<=13; i++)
				temp[i] = ssnSecond.charAt(i-7);
				
			for(var i=1; i<=12; i++) {
				k = i + 1;
				// 각 수와 곱할 수를 뽑아냅니다. 곱수가 만일 10보다 크거나 같다면 계산식에 의해 2로 다시 시작하게 됩니다.
				if(k>=10) k = k % 10 + 2;
				// 각 자리수와 계산수를 곱한값을 변수 total에 누적합산시킵니다.
				total = total + (temp[i] * k);
			}
			
			// 마지막 계산식을 변수 last_num에 대입합니다.
			var last_num = (11 - (total % 11)) % 10;
			
			// laster_num이 주민번호의마지막수와 같은면 참을 틀리면 거짓을 반환합니다.
			if(last_num != temp[13]) {
				alert(this.validatorMessage.getMessage("ERR.SSN"));
				obj.select();
				obj.focus();
				return false;
			}
			*/
		}
		
		return true;
	}
	
	// 주민등록번호 체크
	FormValidator.prototype.validateSsn = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["ssn"]==true ) {
			return this.validateSsnInner(obj, expressions);
		}
		
		return true;
	}
	
	// 사업자등록번호 체크(내부 로직)
	FormValidator.prototype.validateBrnInner = function (obj) {
		if( obj.value!="" ) {
			// "-" 제거
			var tmpBrn = obj.value.replaceAll("-", "");
			var expressions = (new FormValidatorUtil).getExpressions(obj);
			
			if( isNaN(tmpBrn) || tmpBrn.length!=10 ) {
				if(expressions["brnMessage"]!=null) {
					alert(expressions["brnMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.BRN"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.BRN"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
			
			/* invalid 사업자등록번호가 존재하므로 validation 로직 적용하지 않음 */
			/*
			var sum = 0, nam = 0, checkDigit = -1;
			var checkArray = [1, 3, 7, 1, 3, 7, 1, 3, 5];
			
			for(var i=0; i<9; i++) {
				sum += tmpBrn.charAt(i) * checkArray[i];
			}
			
			sum = sum + ((tmpBrn.charAt(8) * 5) / 10);
			nam = Math.floor(sum) % 10;
			checkDigit = (nam == 0) ? 0 : 10 - nam;
			
			if (tmpBrn.charAt(9) != checkDigit) {
				alert(this.validatorMessage.getMessage("ERR.BRN"));
				obj.select();
				obj.focus();
				return false;
			}
			*/
		}
		
		return true;
	}
	
	// 사업자등록번호 체크
	FormValidator.prototype.validateBrn = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["brn"]==true && obj.value!="" ) {
			return this.validateBrnInner(obj, expressions);
		}
		
		return true;
	}
	
	// 사업자/주민등록번호 체크
	FormValidator.prototype.validateBrnSsn = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["brnssn"]==true ) {
			// "-" 제거
			var tmpVal = obj.value.replaceAll("-", "");
			
			if(tmpVal.length==10) {
				return this.validateBrnInner(obj, expressions);
			} else if(tmpVal.length==13) {
				return this.validateSsnInner(obj, expressions);
			} else {
				if(expressions["brnssnMessage"]!=null) {
					alert(expressions["brnssnMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.BRNSSN"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.BRNSSN"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// 전자세금계산서승인번호 체크
	FormValidator.prototype.validateEan = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["ean"]==true ) {
			// "-" 제거
			var tmpEan = obj.value.replaceAll("-", "");
			
			// 문자도 입력 가능하도록 수정
			if( tmpEan.length!=24 ||
				!this.isValidDate(tmpEan.substring(0, 8), expressions, true) ) {
				if(expressions["eanMessage"]!=null) {
					alert(expressions["eanMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.EAN"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.EAN"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// Email 체크
	FormValidator.prototype.validateEmail = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["email"]==true ) {
			var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;
			
			if( obj.value.search(format)==-1 ) {
				if(expressions["emailMessage"]!=null) {
					alert(expressions["emailMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.EMAIL"));
					} else {
						alert(this.validatorMessage.getMessage("ERR.EMAIL"));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// Filter 체크
	FormValidator.prototype.validateFilter = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["filter"];
		
		if( expr!=null ) {
			for(var i=0; i<expr.length; i++) {
				if(expr[i]=="\\H") {
					expr[i] = "한글";
				} else if(expr[i]=="\\A") {
					expr[i] = "영문";
				} else if(expr[i]=="\\N") {
					expr[i] = "숫자";
				} else if(expr[i]=="\\Q") {
					expr[i] = "\"";
				}
			}
			
			for(var i=0; i<expr.length; i++) {
				if( (expr[i]=="한글" && this.formValidatorUtil.hasHangul(obj.value)) ||
					(expr[i]=="영문" && this.formValidatorUtil.hasAlphabet(obj.value)) ||
					(expr[i]=="숫자" && this.formValidatorUtil.hasNumber(obj.value)) ||
					(expr[i]=="\"" && obj.value.indexOf("\"")!=-1) ||
				    (obj.value.indexOf(expr[i])!=-1) ) {
					if(expressions["filterMessage"]!=null) {
						alert(expressions["filterMessage"]);
					} else {
						if(expressions["objName"]!=null) {
							alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.FILTER", expr[i]));
						} else {
							alert(this.validatorMessage.getMessage("ERR.FILTER", expr[i]));
						}
					}
					
					obj.select();
					obj.focus();
					return false;
				}
			}
		}
		
		return true;
	}
	
	// Inverse Filter 체크
	FormValidator.prototype.validateInverseFilter = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["inverseFilter"];
		var msgStr = "";
		var comma = ", ";
		var successCount = 0;
		var errorCount = 0;
		var resultStr = obj.value;
		
		if( expr!=null ) {
			for(var i=0; i<expr.length; i++) {
				if(i!=0) msgStr += comma;
				
				if(expr[i]=="\\H") {
					expr[i] = "한글";
				} else if(expr[i]=="\\A") {
					expr[i] = "영문";
				} else if(expr[i]=="\\N") {
					expr[i] = "숫자";
				} else if(expr[i]=="\\Q") {
					expr[i] = "\"";
				}
				
				msgStr += expr[i];
			}
			
			for(var i=0; i<obj.value.length; i++) {
				for(var m=0; m<expr.length; m++) {
					if( (expr[m]=="한글" && this.formValidatorUtil.isHangul(obj.value.charAt(i))) ||
						(expr[m]=="영문" && this.formValidatorUtil.isAlphabet(obj.value.charAt(i))) ||
						(expr[m]=="숫자" && this.formValidatorUtil.isNumber(obj.value.charAt(i))) ||
						(expr[m]=="\"" && obj.value.charAt(i)=="\"") ) {
						resultStr = resultStr.replace(obj.value.charAt(i), '');
					}
				}
			}
			
			for(var m=0; m<expr.length; m++) {
				resultStr = resultStr.replaceAll(expr[m], '');
			}
			
			if(resultStr!="") {
				if(expressions["inverseFilterMessage"]!=null) {
					alert(expressions["inverseFilterMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.INVERSE_FILTER", msgStr));
					} else {
						alert(this.validatorMessage.getMessage("ERR.INVERSE_FILTER", msgStr));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * Format 체크
	 *
	 *   #    : 모든문자
	 *   H, h : 한글 (h는 공백포함)
	 *   A, a : 문자 (a는 공백포함)
	 *   9, 0 : 숫자 (0는 공백포함) 
	 */
	FormValidator.prototype.validateFormat = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		var expr = expressions["format"];
		
		if( expr!=null ) {
			if (obj.value.length != expr.length) {
				if(expressions["formatMessage"]!=null) {
					alert(expressions["formatMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.FORMAT", expr));
					} else {
						alert(this.validatorMessage.getMessage("ERR.FORMAT", expr));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
			
			var invalid = false;
			
			for(var i=0; i<expr.length; i++) {
				var chr = obj.value.charAt(i);
				var cCode = obj.value.charCodeAt(i);
				switch (expr.charAt(i)) {
					case 'H':
						if ((chr == " ") ||
						!((0xAC00 <= cCode && cCode <= 0xD7A3) || (0x3131 <= cCode && cCode <= 0x318E))) invalid = true;
						break;
						
					case 'h':
						var cCode = obj.value.charCodeAt(i);
						if ((chr != " ") &&
						!((0xAC00 <= cCode && cCode <= 0xD7A3) || (0x3131 <= cCode && cCode <= 0x318E))) invalid = true;
						break;
						
					case '9':
						if (isNaN(chr) || chr == " ") invalid = true;
						break;
						
					case '0':
						if (isNaN(chr)) {
							if (chr != " ") invalid = true;
						}
						break;
						
					case 'A':
						if ((chr == " ") || !isNaN(chr)) invalid = true;
						break;
						
					case 'a':
						if ((chr != " ") && !isNaN(chr)) invalid = true;
						break;
						
					case '#':
						break;
						
					default:
						if (chr != expr.charAt(i)) invalid = true;
				}
				
				if(invalid) {
					if(expressions["formatMessage"]!=null) {
						alert(expressions["formatMessage"]);
					} else {
						if(expressions["objName"]!=null) {
							alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.FORMAT", expr));
						} else {
							alert(this.validatorMessage.getMessage("ERR.FORMAT", expr));
						}
					}
					
					obj.select();
					obj.focus();
					return false;
				}
			}
		}
		
		return true;
	}
	
	// Mask 체크
	FormValidator.prototype.validateMask = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["mask"]!=null && expressions["mask"]!="" ) {
			var maskChar = (new FormFormater).getMaskChar(expressions["mask"]); 
			
			// Mask 문자 제거
			var tmpVal = obj.value.replaceAll(maskChar, "");
			
			if( tmpVal.length!=expressions["mask"].replaceAll(maskChar, "").length ) {
				if(expressions["maskMessage"]!=null) {
					alert(expressions["maskMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.MASK", expressions["mask"]));
					} else {
						alert(this.validatorMessage.getMessage("ERR.MASK", expressions["mask"]));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// Number Mask 체크
	FormValidator.prototype.validateNumberMask = function (obj) {
		if(obj.value=="") return true;
		
		var expressions = (new FormValidatorUtil).getExpressions(obj);
		
		if( expressions["numberMask"]!=null && expressions["numberMask"]!="" ) {
			var maskChar = (new FormFormater).getMaskChar(expressions["numberMask"]); 
			
			// Mask 문자 제거
			var tmpVal = obj.value.replaceAll(maskChar, "");
			
			if( tmpVal.length!=expressions["numberMask"].replaceAll(maskChar, "").length &&
				isNaN(tmpVal) ) {
				if(expressions["numberMaskMessage"]!=null) {
					alert(expressions["numberMaskMessage"]);
				} else {
					if(expressions["objName"]!=null) {
						alert(expressions["objName"] + "은/는 " + this.validatorMessage.getMessage("ERR.NUMBER_MASK", expressions["numberMask"]));
					} else {
						alert(this.validatorMessage.getMessage("ERR.NUMBER_MASK", expressions["numberMask"]));
					}
				}
				
				obj.select();
				obj.focus();
				return false;
			}
		}
		
		return true;
	}
	
	// File 확장자 체크
	FormValidator.prototype.validateFile = function (obj) {
		var result = true;
		
		if(obj.type=="file" && obj.value!="") {
			// FF에서는 obj.value가 파일명만 리턴하므로아래 로직 보류
			/*
			var filePathPart = obj.value.substring(1, 3);
			
			alert(filePathPart);
			
			// 경로 체크
			if( obj.value.length<4 || (filePathPart!=":/" && filePathPart!=":\\") ) {
				alert("파일 경로가 잘못되었습니다. 다시 한번 확인해 보십시오.");
				return false;
			}
			*/
			
			// 파일명 길이 체크(100바이트 이하만 가능)
			var inxFileStart = obj.value.lastIndexOf("/");			
			if(inxFileStart==-1) inxFileStart = obj.value.lastIndexOf("\\");
			if(inxFileStart==-1) inxFileStart = 0; // FF는 파일명만 리턴
			
			var fileName = obj.value.substring(inxFileStart+1);
			
			if(this.formValidatorUtil.getByteLength(fileName)>100) {
				alert("파일명은 100자(한글 50자) 이하이어야 합니다.");
				return false;
			}
			
			// 확장자 체크
			var attachFileDenyList = ["jsp", "class", "java", "sh", "js"];
			var ext = "";
			var dotInx = obj.value.lastIndexOf(".");
			
			for(var i=0; i<attachFileDenyList.length; i++) {
				ext = obj.value.substring(dotInx+1);
				
				if(attachFileDenyList[i]==ext.toLowerCase()) {
					alert("*." + ext + " 파일은 업로드할 수 없습니다.");
					result = false;
					break;
				}
			}
		}
		
		return result;
	}
	
	FormValidator.prototype.addAttribute = function (obj, attr) {
		var className = obj.className;
		
		if( className!=null && className!="" ) {
			var startInx = className.indexOf("[{");
			
			if(startInx!=-1) {
				var endInx = className.indexOf("}]");
				
				if(className.substring(startInx, endInx).indexOf(attr)==-1) {
					var comma = ",";
					
					// [{}] 처리
					if(startInx+2==endInx) comma = "";
					
					obj.className = className.substring(0, startInx)
					              + className.substring(startInx, endInx) + comma + attr + "}]";
				}
			} else {
				obj.className = obj.className + " [{" + attr + "}]";
			}
		} else {
			obj.className = "[{" + attr + "}]";
		}
		
		this.initObject(obj, false);
		
		// cfDebug(obj.className);
	}
	
	FormValidator.prototype.removeAttribute = function (obj, attr) {
		if( obj.className!=null && obj.className!="" ) {
			if( attr=="required:true" || attr=="requiredSkin:true" ) {
				obj.style.backgroundImage = "";
			} else if( attr=="readOnly:true" ) {
				obj.readOnly = false;
				obj.style.backgroundColor = "#FFFFFF";
			} else if( attr.indexOf("number")!=-1 || attr.indexOf("minNumber")!=-1 ||
				       attr.indexOf("maxNumber")!=-1 || attr.indexOf("inNumber")!=-1 ) {
				obj.value = obj.value.replaceAll(",", "");
				obj.style.textAlign = "left";
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.numberKeydownHandler);
				$(obj).unbind("keyup", this.numberKeyupHandler);
				
				if( attr.indexOf("number")!=-1 && (attr=="number:true" || attr.indexOf("(")!=-1) ) {
					$(obj).unbind("blur", this.numberBlurHandler);
				}
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if( attr.indexOf("notFormatedNumber")!=-1 ) {
				obj.style.imeMode = "auto";
				
				// 입력 방지 문자 처리
				$(obj).unbind("keydown", this.notFormatedNumberKeydownHandler);
				$(obj).unbind("keyup", this.notFormatedNumberKeyupHandler);
			} else if( attr=="date:true" || attr.indexOf("minDate")!=-1 ||
					   attr.indexOf("maxDate")!=-1 ) {
				obj.value = obj.value.replaceAll("/", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.dateKeydownHandler);
				$(obj).unbind("keyup", this.dateKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr=="time:true") {
				obj.value = obj.value.replaceAll(":", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.timeKeydownHandler);
				$(obj).unbind("keyup", this.timeKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr=="ssn:true") {
				obj.value = obj.value.replaceAll("-", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.ssnKeydownHandler);
				$(obj).unbind("keyup", this.ssnKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr=="brn:true") {
				obj.value = obj.value.replaceAll("-", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.brnKeydownHandler);
				$(obj).unbind("keyup", this.brnKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr=="brnssn:true") {
				obj.value = obj.value.replaceAll("-", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.brnssnFocusHandler);
				$(obj).unbind("keydown", this.brnssnKeydownHandler);
				$(obj).unbind("keyup", this.brnssnKeyupHandler);
				$(obj).unbind("blur", this.brnssnBlurHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr=="ean:true") {
				obj.value = obj.value.replaceAll("-", "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.eanKeydownHandler);
				$(obj).unbind("keyup", this.eanKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr.indexOf("mask")!=-1) {
				var exprs = (new FormValidatorUtil).getExpressions(obj);
				var maskChar = (new FormFormater).getMaskChar(exprs["mask"]); 
				
				obj.value = obj.value.replaceAll(maskChar, ""); 
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keyup", this.maskKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			} else if(attr.indexOf("numberMask")!=-1) {
				var exprs = (new FormValidatorUtil).getExpressions(obj);
				var maskChar = (new FormFormater).getMaskChar(exprs["numberMask"]); 
				
				obj.value = obj.value.replaceAll(maskChar, "");
				obj.style.imeMode = "auto";
				
				// Event Handler 제거
				$(obj).unbind("focus", this.focusHandler);
				$(obj).unbind("keydown", this.numberMaskKeydownHandler);
				$(obj).unbind("keyup", this.numberMaskKeyupHandler);
				
				// 포맷팅 function 제거
				obj.getOriginalValue = null;
				obj.setFormatedValue = null;
			}
			
			var className = obj.className.replaceAll(attr, "");
			
			if(className.indexOf("{,")!=-1) className = className.replace("{,", "{"); // 맨앞에 오는 경우
			else if(className.indexOf(",,")!=-1) className = className.replace(",,", ","); // 가운데 오는 경우
			else if(className.indexOf(",}")!=-1) className = className.replace(",}", "}"); // 끝에 오는 경우
			
			obj.className = className;
			
			this.initObject(obj, false);
			
			// cfDebug(obj.className);
		}
	}

	// 폼 체크
	FormValidator.prototype.validate = function (frmObj) {
		var thisObject = this;
		var result = true;
		var exprs = null;
		
		// jQuery each function 내부의 return은 each function 탈출에만 사용되므로 each function 이후의 명령도 실행됨
		// 따라서, 아래와 같이 result 변수를 이용해 처리해야 함
		$(frmObj).find(":input").each(function() {
			try {
				exprs = thisObject.formValidatorUtil.getExpressions(this);
			} catch(exception) {
				alert( thisObject.validatorMessage.getMessage("ERR.EXPR", this.className) );
				result = false;
				return false; // each 탈출
			} 
			
			if( exprs!=null ) {
				if(this.style.display!="none" && this.style.visibility!="hidden") {				
					result = thisObject.validateRequired(this)
					       & thisObject.validateLength(this)
					       & thisObject.validateMinLength(this)
					       & thisObject.validateMaxLength(this)
					       & thisObject.validateByteLength(this)
					       & thisObject.validateMinByteLength(this)
					       & thisObject.validateMaxByteLength(this)
					       & thisObject.validateNumber(this)
					       & thisObject.validateFormatNumber(this)
					       & thisObject.validateMinNumber(this)
					       & thisObject.validateMaxNumber(this)
					       & thisObject.validateInNumber(this)
					       & thisObject.validateDate(this)
					       & thisObject.validateMinDate(this)
					       & thisObject.validateMaxDate(this)
					       & thisObject.validateTime(this)
					       & thisObject.validateSsn(this)
					       & thisObject.validateBrn(this)
					       & thisObject.validateBrnSsn(this)
					       & thisObject.validateEan(this)
					       & thisObject.validateEmail(this)
					       & thisObject.validateFilter(this)
					       & thisObject.validateInverseFilter(this)
					       & thisObject.validateFormat(this)
						   & thisObject.validateMask(this)
						   & thisObject.validateNumberMask(this);
					
					if(!result) return false; // each 탈출
				} else {
					// 숨겨진 항목은 값 삭제
					if(this.type=="text") this.value = "";
				}
			}
			
			result = thisObject.validateFile(this);
				
			if(!result) return false; // each 탈출
		});
		
		return result;
	}
	
	// Form 초기화
	FormValidator.prototype.initValidator = function (frmObj) {
		var formValidatorObj = this;
		
		$(frmObj).find(":input").each(function() {
			formValidatorObj.initObject(this, true);
		});
	}
	
	FormValidator.prototype.focusHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		obj.onfocusValue = obj.value;
		obj.changed = false;
	}
	FormValidator.prototype.numberKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		// cfDebug(keyCode);
		
		if(keyCode==16) obj.shiftKey = true;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = true;
		
		// -:109(Numeric Pad)/189, .:110(Numeric Pad)/190
		if( formFormater.isNumericInput(event, obj) ||
			keyCode==109 || keyCode==110 ||
			(!obj.shiftKey && keyCode==189) || (!obj.shiftKey && keyCode==190) ) {
			return true;
		} else {
			return false;
		}
	}
	FormValidator.prototype.numberKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			// 01, -01와 입력 방지
			if( obj.value.charAt(0)=="0" && obj.value.charAt(1)!="." ) {
				obj.value = "0";
			} else if( obj.value.charAt(0)=="-" && obj.value.charAt(1)=="0" && obj.value.charAt(2)!="." ) {
				obj.value = "-0";
			}
			
			obj.value = obj.value.trim();
			
			// Ctrl+V에 의한 문자 입력 방지
			if( keyCode==86 && isNaN(obj.value.replaceAll(",", "")) ) {
				obj.value = "";
				alert("숫자 값만 입력 가능합니다.");
			}
			
			obj.value = formFormater.formatNumber(obj.value);
										
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.numberBlurHandler = function (event) {
		var fvu = new FormValidatorUtil();
		
		var obj = fvu.getEventSource(event);
		var exprs = fvu.getExpressions(obj);  
		
		if(obj.value=="" && exprs["defaultZero"]!=false) obj.value = 0;
	}
	FormValidator.prototype.notFormatedNumberKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.notFormatedNumberKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var keyCode = (new FormFormater).getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
	}
	FormValidator.prototype.dateKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.dateKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll("/", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatDate(obj.value);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.timeKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.timeKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll(":", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatTime(obj.value);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.ssnKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.ssnKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll("-", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatSsn(obj.value);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.brnKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.brnKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll("-", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatBrn(obj.value);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.brnssnFocusHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		obj.value = obj.value.replaceAll("-", "")
		obj.onfocusValue = obj.value;
		obj.changed = false;
	}
	FormValidator.prototype.brnssnKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.brnssnKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll("-", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(obj.onfocusValue!=obj.value) obj.changed = true;
		else obj.changed = false;
	}
	FormValidator.prototype.brnssnBlurHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		obj.value = obj.value.trim();
		
		// "-" 제거
		var tempVal = obj.value.replace('-', '').replace('-', '');
		
		/*
		if(tempVal.length!=0 && tempVal.length!=10 && tempVal.length!=13) {
			alert("10자리 또는 13자리의 값을 입력하십시오.");
		}
		*/
		
		obj.value = (new FormFormater).formatBrnSsn(obj.value);
	}
	FormValidator.prototype.eanKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return true; // 문자도 입력 가능하도록 수정
		// return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.eanKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		// 문자도 입력 가능하도록 수정
		/*
		if( keyCode==86 && isNaN(obj.value.replaceAll("-", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		*/
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatEan(obj.value);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.maskKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var mask = formFormater.formValidatorUtil.getExpressions(obj)["mask"];
		
		if(!formFormater.isCursorMoveKeyCode(formFormater.getEvent(event).keyCode)) {
			obj.value = formFormater.formatMask(obj.value, mask);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
	FormValidator.prototype.numberMaskKeydownHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		
		return (new FormFormater).isNumericInput(event, obj);
	}
	FormValidator.prototype.numberMaskKeyupHandler = function (event) {
		var obj = (new FormValidatorUtil).getEventSource(event);
		var formFormater = new FormFormater();
		var keyCode = formFormater.getEvent(event).keyCode;
		var mask = formFormater.formValidatorUtil.getExpressions(obj)["numberMask"];
		
		if(keyCode==16) obj.shiftKey = false;
		if(keyCode==17 || keyCode==229) obj.ctrlKey = false;
		
		// Ctrl+V에 의한 문자 입력 방지
		if( keyCode==86 && isNaN(obj.value.replaceAll("-", "")) ) {
			obj.value = "";
			alert("숫자 값만 입력 가능합니다.");
		}
		
		if(!formFormater.isCursorMoveKeyCode(keyCode)) {
			obj.value = formFormater.formatMask(obj.value, mask);
			
			if(obj.onfocusValue!=obj.value) obj.changed = true;
			else obj.changed = false;
		}
	}
		
	// Object 초기화
	FormValidator.prototype.initObject = function (obj, validateOnblur) {
		var formFormater = new FormFormater();		
		var exprs = null;
		
		try {
			exprs = formFormater.formValidatorUtil.getExpressions(obj);
		} catch(exception) {
			alert( formFormater.validatorMessage.getMessage("ERR.EXPR", obj.className) );
			return false; // each 탈출
		}
		
		if(exprs!=null) {
			if( exprs["required"]==true || exprs["requiredSkin"]==true ) {
				obj.style.backgroundImage = "url(/static/images/required.gif)";
				obj.style.backgroundPosition = "top right";
				obj.style.backgroundRepeat = "no-repeat";
			}
			if( exprs["readOnly"]==true ) {
				obj.readOnly = true;
				obj.style.backgroundColor = "#EEEEEE";
			}
			
			if( exprs["number"]!=null || exprs["minNumber"]!=null ||
				exprs["maxNumber"]!=null || exprs["inNumber"]!=null ) {
				obj.value = formFormater.formatNumber(obj.value);
				obj.style.textAlign = "right";
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.numberKeydownHandler);
				$(obj).bind("keyup", this.numberKeyupHandler);
				
				if( exprs["number"]!=null && (exprs["number"]==true || exprs["number"].indexOf("(")!=-1) ) {
					$(obj).bind("blur", this.numberBlurHandler);
				}
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll(",", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatNumber(param);
				}
			} else if( exprs["notFormatedNumber"]!=null ) {
				obj.style.imeMode = "disabled";
				
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.notFormatedNumberKeydownHandler);
				$(obj).bind("keyup", this.notFormatedNumberKeyupHandler);
			} else if( exprs["date"]==true || exprs["minDate"]!=null ||
					    exprs["maxDate"]!=null ) {
				obj.value = formFormater.formatDate(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.dateKeydownHandler);
				$(obj).bind("keyup", this.dateKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll("/", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatDate(param);
				}
			} else if( exprs["time"]==true ) {
				obj.value = formFormater.formatTime(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.timeKeydownHandler);
				$(obj).bind("keyup", this.timeKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll(":", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatTime(param);
				}
			} else if(exprs["ssn"]==true) {
				obj.value = formFormater.formatSsn(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.ssnKeydownHandler);
				$(obj).bind("keyup", this.ssnKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll("-", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatSsn(param);
				}
			} else if(exprs["brn"]==true) {
				obj.value = formFormater.formatBrn(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.brnKeydownHandler);
				$(obj).bind("keyup", this.brnKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll("-", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatBrn(param);
				}
			} else if(exprs["brnssn"]==true) {
				obj.value = formFormater.formatBrnSsn(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정(brnssn은 예외적으로 onblur 시 포맷팅)
				$(obj).bind("focus", this.brnssnFocusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.brnssnKeydownHandler);
				$(obj).bind("keyup", this.brnssnKeyupHandler);
				$(obj).bind("blur", this.brnssnBlurHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll("-", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatBrnSsn(param);
				}
			} else if(exprs["ean"]==true) {
				obj.value = formFormater.formatEan(obj.value);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				// 입력 방지 문자 처리
				$(obj).bind("keydown", this.eanKeydownHandler);
				$(obj).bind("keyup", this.eanKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll("-", "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatEan(param);
				}
			} else if(exprs["mask"]!=null) {
				var mask = exprs["mask"];
				
				obj.value = formFormater.formatMask(obj.value, mask);
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				$(obj).bind("keyup", this.maskKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll(formFormater.getMaskChar(mask), "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatMask(param, mask);
				}
			} else if(exprs["numberMask"]!=null) {
				var mask = exprs["numberMask"];
				
				obj.value = formFormater.formatMask(obj.value, mask);
				obj.style.imeMode = "disabled";
				
				// 입력 시 포맷팅을 위한 Event Handler 설정
				$(obj).bind("focus", this.focusHandler);
				$(obj).bind("keydown", this.numberMaskKeydownHandler);
				$(obj).bind("keyup", this.numberMaskKeyupHandler);
				
				// 포맷팅 function 추가
				obj.getOriginalValue = function () {
					return obj.value.replaceAll(formFormater.getMaskChar(mask), "");
				}
				obj.setFormatedValue = function (param) {
					obj.value = formFormater.formatMask(param, mask);
				}
			}
			
			if( exprs["validateOnblur"]==true && validateOnblur ) {
				$(obj).bind("blur", function () {
					formValidator.validateRequired(obj);
					formValidator.validateLength(obj);
					formValidator.validateMinLength(obj);
					formValidator.validateMaxLength(obj);
					formValidator.validateByteLength(obj);
					formValidator.validateMinByteLength(obj);
					formValidator.validateMaxByteLength(obj);
					formValidator.validateNumber(obj);
					formValidator.validateFormatNumber(obj);
					formValidator.validateMinNumber(obj);
					formValidator.validateMaxNumber(obj);
					formValidator.validateInNumber(obj);
					formValidator.validateDate(obj);
					formValidator.validateMinDate(obj);
					formValidator.validateMaxDate(obj);
					formValidator.validateTime(obj);
					formValidator.validateSsn(obj);
					formValidator.validateBrn(obj);
					formValidator.validateBrnSsn(obj);
					formValidator.validateEan(obj);
					formValidator.validateEmail(obj);
					formValidator.validateFilter(obj);
					formValidator.validateInverseFilter(obj);
					formValidator.validateFormat(obj);
					formValidator.validateMask(obj);
					formValidator.validateNumberMask(obj);
				});
			}
		}
	}
	
	var formValidator = new FormValidator();
	
	// 폼 포맷
	function FormFormater() {}
	
	FormFormater.prototype.validatorMessage = new ValidatorMessage();
	FormFormater.prototype.formValidatorUtil = new FormValidatorUtil();
	
	FormFormater.prototype.getEvent = function (event) {
		// 크로스 브라우징 처리
		if(window.event) {
			return window.event;
		} else {
			return event;
		}
	}
	
	FormFormater.prototype.isCursorMoveKeyCode = function (keyCode) {
		// cfDebug("keyCode : " + keyCode);
		
		var keyCodeArr = [9, 10, 13, 35, 36, 37, 38, 39, 40]; // Tab, LF, CR, End, Home, 좌, 상, 우, 하
		var result = false;
		
		for(var i=0; i<keyCodeArr.length; i++) {
			if(keyCode==keyCodeArr[i]) {
				result = true;
				break;
			}
		}
		
		return result;
	}
	
	FormFormater.prototype.isNumericInput = function (event, obj) {
		var keyCode = this.getEvent(event).keyCode;
		
		// cfDebug("keyCode : " + keyCode);
		
		if(keyCode==16) {
			obj.shiftKey = true;
			return false;
		}
		if(keyCode==17 || keyCode==229) {
			obj.ctrlKey = true;
			return false;
		}
		
		// Backspace:8, Delete:46
        // 0~9:48~57(Shift를 누른 상태는 제외), 0~9(Numeric Pad):96~105
		// Ctrl+C/V 처리, C:67, V:86
		if( keyCode==8 || keyCode==46 ||
			(!obj.shiftKey && keyCode>=48 && keyCode<=57) || (keyCode>=96 && keyCode<=105) ||
			(obj.ctrlKey && (keyCode==67 || keyCode==86)) ||
			this.isCursorMoveKeyCode(keyCode) ) {
			return true;
		} else {
			return false;
		}
	}
	
	FormFormater.prototype.getMaskChar = function (mask) {
		var tmp = mask.replaceAll("#", "");
		
		if(tmp!="") {
			return tmp.substring(0, 1);
		} else {
			return "";
		}
	}
	
	// 숫자
	FormFormater.prototype.formatNumber = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			var hasMinusChar = false;
			
			if(param.indexOf("-")==0) {
				hasMinusChar = true;				
			}
			
			// "-" 제거
			param = param.replaceAll("-", "");
			// "," 제거
			param = param.replaceAll(",", "");
			
			var inxDot = param.indexOf(".");			
			var integralValue = "";
			var decimalValue = "";
			
			if(inxDot!=-1) {
				integralValue = param.substring(0, inxDot);
				// "."가 두개 이상인 경우 뒤에 있는 "."는 제거
				decimalValue = param.substring(inxDot+1).replaceAll(".", "");
			} else {
				integralValue = param;
			}
			
			var count = 0;
			
			for(var i=integralValue.length-1; i>=0; i--) {
				count++;
				tmpVal = integralValue.charAt(i) + tmpVal;
				
				if((count)%3==0 && count<integralValue.length) tmpVal = "," + tmpVal;
			}
			
			if(inxDot!=-1) tmpVal += "." + decimalValue;
			
			// "-" 추가
			if(hasMinusChar==true) tmpVal = "-" + tmpVal;
		}
		
		return tmpVal;
	}
	
	// 날짜
	FormFormater.prototype.formatDate = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			// "/" 제거
			param = param.replaceAll("/", "");
			
			for(var i=0; i<param.length; i++) {
				tmpVal += param.charAt(i);
				
				if(i==3) tmpVal += "/";
				else if(i==5) tmpVal += "/";
				else if(i==8-1) break;
			}
		}
		
		return tmpVal;
	}
	
	// 시간
	FormFormater.prototype.formatTime = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			// ":" 제거
			param = param.replaceAll(":", "");
			
			for(var i=0; i<param.length; i++) {
				tmpVal += param.charAt(i);
				
				if(i==1) tmpVal += ":";
				else if(i==3) tmpVal += ":";
				else if(i==6-1) break;
			}
		}
		
		return tmpVal;
	}
	
	// 주민등록번호
	FormFormater.prototype.formatSsn = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			// "-" 제거
			param = param.replace('-', '');
			
			for(var i=0; i<param.length; i++) {
				tmpVal += param.charAt(i);
				
				if(i==5) tmpVal += "-";
				else if(i==13-1) break;
			}
		}
		
		return tmpVal;
	}
	
	// 사업자등록번호
	FormFormater.prototype.formatBrn = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			// "-" 제거
			param = param.replace('-', '').replace('-', '');
			
			for(var i=0; i<param.length; i++) {
				tmpVal += param.charAt(i);
				
				if(i==2) tmpVal += "-";
				else if(i==4) tmpVal += "-";
				else if(i==10-1) break;
			}
		}
		
		return tmpVal;
	}
	
	// 사업자/주민등록번호
	FormFormater.prototype.formatBrnSsn = function (param) {
		var tmpVal = "";
		var orginalVal = param;
		
		if(param!=null) {
			// "-" 제거
			param = param.replace('-', '').replace('-', '');
			
			if(param.length==10) {
				tmpVal = this.formatBrn(param);
			} else if(param.length==13) {
				tmpVal = this.formatSsn(param);
			} else {
				tmpVal = orginalVal;
			}
		}
		
		return tmpVal;
	}
	
	// 전자세금계산서승인번호
	FormFormater.prototype.formatEan = function (param) {
		var tmpVal = "";
		
		if(param!=null) {
			// "-" 제거
			param = param.replace('-', '').replace('-', '');
			
			for(var i=0; i<param.length; i++) {
				tmpVal += param.charAt(i);
				
				if(i==7) tmpVal += "-";
				else if(i==15) tmpVal += "-";
				else if(i==24-1) break;
			}
		}
		
		return tmpVal;
	}
	
	// Mask
	FormFormater.prototype.formatMask = function (param, mask) {
		var tmpVal = "";
		
		if(param!=null) {
			// 마스크 문자 제거
			param = param.replaceAll(this.getMaskChar(mask), "");
			
			var tmp = "";
			var j = 0;
			
			for(var i=0; i<mask.length; i++) {
				tmp = mask.substring(i, i+1);
				
				if(tmp=="#") {
					if(param.length-1>=j) {
						tmpVal += param.substring(j, j+1);
						j++;
					} else {
						break;
					}
				} else {
					tmpVal += tmp;
				}
			}
		}
		
		return tmpVal;
	}
	
	// 포맷 제거
	FormFormater.prototype.removeFormat = function (frmObj) {
		var thisObject = this;
		var exprs = null;
		
		$(frmObj).find(":input").each(function() {
			try {
				exprs = thisObject.formValidatorUtil.getExpressions(this);
			} catch(exception) {
				alert( thisObject.validatorMessage.getMessage("ERR.EXPR", this.className) );
				return false; // each 탈출
			}
			
			if(exprs!=null) {
				if( exprs["number"]!=null || exprs["minNumber"]!=null ||
					exprs["maxNumber"]!=null || exprs["inNumber"]!=null ) {
					this.value = this.value.replaceAll(",", "");
				} else if( exprs["date"]==true || exprs["minDate"]!=null ||
						    exprs["maxDate"]!=null ) {
					this.value = this.value.replaceAll("/", "");
				} else if(exprs["time"]==true) {
					this.value = this.value.replaceAll(":", "");
				} else if(exprs["ssn"]==true) {
					this.value = this.value.replaceAll("-", "");
				} else if(exprs["brn"]==true) {
					this.value = this.value.replaceAll("-", "");
				} else if(exprs["brnssn"]==true) {
					this.value = this.value.replaceAll("-", "");
				} else if(exprs["ean"]==true) {
					this.value = this.value.replaceAll("-", "");
				} else if(exprs["mask"]!=null) {
					this.value = this.value.replaceAll(thisObject.getMaskChar(exprs["mask"]), "");
				} else if(exprs["numberMask"]!=null) {
					this.value = this.value.replaceAll(thisObject.getMaskChar(exprs["numberMask"]), "");
				}
			}
		});
	}
	
	// 포맷 재설정
	FormFormater.prototype.resetFormat = function (frmObj) {
		var thisObject = this;
		var exprs = null;
		
		$(frmObj).find(":input").each(function() {
			try {
				exprs = thisObject.formValidatorUtil.getExpressions(this);
			} catch(exception) {
				alert( thisObject.validatorMessage.getMessage("ERR.EXPR", this.className) );
				return false; // each 탈출
			}
			
			if(exprs!=null) {
				if( exprs["number"]!=null || exprs["minNumber"]!=null ||
					exprs["maxNumber"]!=null || exprs["inNumber"]!=null ) {
					this.value = thisObject.formatNumber(this.value);
				} else if( exprs["date"]==true || exprs["minDate"]!=null ||
						    exprs["maxDate"]!=null ) {
					this.value = thisObject.formatDate(this.value);
				} else if(exprs["time"]==true) {
					this.value = thisObject.formatTime(this.value);
				} else if(exprs["ssn"]==true) {
					this.value = thisObject.formatSsn(this.value);
				} else if(exprs["brn"]==true) {
					this.value = thisObject.formatBrn(this.value);
				} else if(exprs["brnssn"]==true) {
					this.value = thisObject.formatBrnSsn(this.value);
				} else if(exprs["ean"]==true) {
					this.value = thisObject.formatEan(this.value);
				} else if(exprs["mask"]!=null) {
					this.value = thisObject.formatMask(this.value, exprs["mask"]);
				} else if(exprs["numberMask"]!=null) {
					this.value = thisObject.formatMask(this.value, exprs["numberMask"]);
				}
			}
		});
	}
	
	FormFormater.prototype.disableForm = function () {
		// 주의 : button 이외의 Element는 disabled=true로 설정하면 파라메터가 넘어가지 않음
		$("input[type=button]").each(function() {
			this.disabled = true;
		});		
		$(":input").each(function() {
			this.style.cursor = "wait";
		});
	}
	
	$(document).ready(function() {
		$("form").each(function() {
			// 초기화 처리
			formValidator.initValidator(this);
			
			// form의 submit 메소드 override
			this._submit = this.submit;
			
			// submit() 호출 시 onsubmit Event가 발생하지 않으므로 Event Handler로 처리하는 방식은 부적절
			// 따라서, submit 메소드를 override하는 방식으로 처리
			this.fireSubmit = function (submitByOriginal, allowDoublePosting) {
				if(!submitByOriginal) {
					var formFormater = new FormFormater();
					
					if(formValidator.validate(this)) {
						if(!allowDoublePosting) {
							// 이중 처리 방지 start
							if( ebill_isSubmited ) {
								alert("이미 처리중입니다. 잠시만 기다려 주십시오.");
								return;
							}
							
							ebill_isSubmited = true;
							
							formFormater.disableForm();
							// 이중 처리 방지 end
						}
						
						// format 문자 제거
						formFormater.removeFormat(this);
						
						if($("#callXecureSubmit") != null && $("#callXecureSubmit")[0] != null) {
							XecureSubmit(this); // 암호화
						} else {
							this._submit();
						}
						
						// 엑셀 다운로드 시 포맷 제거된 것을 재설정
						if(allowDoublePosting) formFormater.resetFormat();
					} else {
						cfRemoveSubmitImage();
					}
				} else {
					if($("#callXecureSubmit") != null && $("#callXecureSubmit")[0] != null) {
						XecureSubmit(this); // 암호화
					} else {
						this._submit();
					}
					//this._submit();
				}
			}
			
			this.submit = this.fireSubmit;
		});
	});