	var Validator = {
		validate : function(form) {			
    		var elements = form.elements;
    		for(var i = 0; i <elements.length;i++) {				
				var el = elements[i];				
				var classes = el.className.split(" ");
				for(var j = 0; j < classes.length; j++) {
					// 각 클래스 명
					var className = classes[j].replace(" ","");					
					// 클래스명과 일치하는 메서드가 있으면...								
    				if(Validator[className]) {
						var message = Validator[className](el.value,el);						
						// 오류가 있으면 메시지를 반환																		
						if(message) {
							Validator._handleError(message, el);
							return false;
						}
					}
				}
    		}
			return true;
		},
		/**
		 * 오류 제어
		 * @param {String} message
		 * @param {HTMLFormElement} el
		 */
		_handleError : function(message, el) {
			var title = Validator._getTitle(el);
			if(title == "입장일자(연도)") {
				alert(title +"의 " + message);
			}else if(title == "입장일자(월)"){
				alert(title +"의 " + message);
			}else if(title == "입장일자(일)"){
				alert(title +"의 " + message);
			}else if(title == "입장일자(요일)"){
				alert(title +"의 " + message);
			}else {
				alert(title +"(은)는 " + message);
			}
			el.style.backgroundColor="#fdfde4";
			el.focus();
			
		}, 
		
		"required" : function(v) {			
			return !v ? "반드시 입력하셔야 합니다." : false;
		},
		"validate-number" : function(v) {
			return isNaN(v) || /^\s+$/.test(v) ? "숫자로 입력하셔야 합니다." : false;
		},
		"validate-digits" : function(v) {
			return isNaN(v) || /[^\d]/.test(v)? "숫자만 입력하셔야 합니다." : false;			
		},
		"validate-alpha" : function(v) {
			return /^[a-zA-Z]+$/.test(v) ? "알파뱃만 입력하셔야 합니다." : false;
		},
		"validate-alpha-num" : function(v) {
			return /\W/.test(v) ? "알파뱃과 숫자만 입력하셔야 합니다." : false;
		},
		// 글자수 제한
		"validate-limit-char" : function(v) {
			var len = 0;
			var str = v.substring(0);
			
			if(str == null) return 0;
			for(var i = 0;i<str.length;i++){
				var ch = escape(str.charAt(i));
				if(ch.length == 1) len++;
				else if(ch.indexOf("%u") != -1) len += 2;
				else if(ch.indexOf("%") != -1) len += ch.length/3;
			}
			if(len > 18) {
				return "글자수가 너무 많습니다. 18자 이내 입력해주세요.";
			}
		},
		"validate-year" : function(v) {
			if(v.length != 4) {
				return "값을 정확히 입력해주세요.";
			}
		},
		"validate-month" : function(v) {
			if(v.length > 2 || v.length == 0) {
				return "값을 정확히 입력해주세요.";
			}
		},
		"validate-day" : function(v) {
			if(v.length > 2 || v.length == 0) {
				return "값을 정확히 입력해주세요.";
			}
		},
		"validate-week-day" : function(v) {
			if(v.length > 1 || v.length == 0) {
				return "값을 정확히 입력해주세요.";
			}
		},
		"validate-week-day2" : function(v) {
			if(v != "월" && v != "화" && v != "수" && v != "목" && v != "금" && v != "토" && v != "일") {
				return "값을 정확히 입력해주세요.";
			}
		},
		"validate-date" : function(v) {
			if(v) {				

				var year = parseInt(v.substring(0,4), 10);
				var month = parseInt(v.substring(4,6), 10)-1;
				var day = parseInt(v.substring(6,8), 10);
				
	    		val = v.replace(/-/g, "");
	
	    		if(isNaN(val)) {
	    			return "숫자, - 만 입력하셔야 합니다.";
	    		}
	    		
	    		var tmpArray = v.split("-");
	    		
    			if(tmpArray.length == 1) {
    				if(tmpArray[0].length > 5 || tmpArray[0].length < 5) {
    					return "연도를 정확히 입력해주세요.";
    				}else {
    					return "기간을 정확히 입력해주세요.";
    				}
    			}else if(tmpArray.length == 2) {
    				if(tmpArray[1].length == 0 || tmpArray[1].length > 2) {
    					return "달을 정확히 입력해주세요.";
    				}else {
    					return "기간을 정확히 입력해주세요.";
    				}
    			}else if(tmpArray.length == 3) {
    				if(tmpArray[2].length == 0 || tmpArray[2].length > 2) {
    					return "일을 정확히 입력해주세요.";
    				}
    			}
		    	
	    	}
	
	        return false;
		},
		//"validate-date" : function(v) {
		//	var date = new Date(v);
		//	return isNaN(v) ? "바른 날짜를 입력하셔야 합니다." : false;
		//},
		"validate-email" : function(v) {
			return !/\w{1,}[@][\w\-]{1,}([.]([\w\-]{1,})){1,3}$/.test(v) ? "바른 이메일 주소를 입력하셔야 합니다." : false;
		},
		"validate-url" : function(v) {
			return !/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i.test(v) ? "바른 URL을 입력하셔야 합니다." : false;
		},
		"validate-required-select" : function(v, elm) {
			var field_obj = document.getElementById(elm.name);

			if(field_obj.options[field_obj.selectedIndex].value != "")
				return false;

			return "항목을 선택하셔야 합니다.";

		},
		// 전화번호 유효성 체크 02-222-2222 형식 '-' 토큰으로 잘라서 검증함
        "validate-tel-num" : function(v, elm, param) {
        	if(v) {
        		val = v.replace(/-/g, "");

        		if(isNaN(val)) {
        			return "숫자, - 만 입력하셔야 합니다.";
        		}

        		var tmpArray = v.split("-");
        		if(tmpArray.length != 3) {
        			return "-를 포함하여  정확히  입력하셔야 합니다.";
        		}
        		for(i = 0; i < tmpArray.length; i++ ) {
        			if(tmpArray[i] == "") return "정확히  입력하셔야 합니다.";
        		}
        	}

            return false;
        },
		"validate-one-required" : function(v,elm) {			
			var field_obj  = document.getElementsByName(elm.name);
			if (field_obj.length > 1) {
		        for (var idx = 0; idx < field_obj.length; idx++) {
		            if (field_obj[idx].checked) return false;
		        }
		    } else {
		        if (field_obj.checked) return false;
		    }
			return "선택을 하셔야 합니다.";
		},
		// 하나라도 선택 입력(radio or checkbox)
		"validate-one-required-rnc" : function(v,elm) {
			var field_obj  = document.getElementsByName(elm.name);

			if (field_obj.length > 1) {
		        for (var idx = 0; idx < field_obj.length; idx++) {
		            if (field_obj[idx].checked) return false;
		        }
		    } else {
		        if (field_obj[0].checked) return false;
		    }
			return "항목을 선택하셔야 합니다.";
		},
		_getTitle : function (el) {
			if (el.title) {
				var elTitles = el.title.split(" ")
				return elTitles[0];
			}else{
				return el.name;
			}	
		}
	}
