﻿	String.prototype.equals = UDF_equals;
	String.prototype.trim = UDF_trim;
	String.prototype.ltrim = UDF_ltrim;
	String.prototype.rtrim = UDF_rtrim;
	String.prototype.match = UDF_match;
	String.prototype.getByteLength = UDF_getByteLength;
	String.prototype.getFileExt = UDF_getFileExt;
	
	String.prototype.msg = VF_msg;
	String.prototype.checkPhone = VF_checkPhone;
	String.prototype.checkMobile = VF_checkMobile;
	String.prototype.checkSsn = VF_checkSsn;
	String.prototype.checkZip = VF_checkZip;
	String.prototype.checkEmail = VF_checkEmail;
	String.prototype.checkUrl = VF_checkUrl;

	//text, password 타입의 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForText = new Array(
			new Array("required", "VF_validRequired"),
			new Array("minchar", "VF_validMinChar"),
			new Array("maxchar", "VF_validMaxChar"),
			new Array("charlength", "VF_validCharLength"),
			new Array("minbyte", "VF_validMinByte"),
			new Array("maxbyte", "VF_validMaxByte"),
			new Array("bytelength", "VF_validByteLength"),
			new Array("datatype", "VF_validDataType"),
			new Array("dataform", "VF_validDataForm"),
			new Array("pattern", "VF_validPattern"),
			new Array("datatype1", "VF_validDataType1")
			);

	//textarea 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForTextArea = new Array(
			new Array("required", "VF_validRequired"),
			new Array("minchar", "VF_validMinChar"),
			new Array("maxchar", "VF_validMaxChar"),
			new Array("charlength", "VF_validCharLength"),
			new Array("minbyte", "VF_validMinByte"),
			new Array("maxbyte", "VF_validMaxByte"),
			new Array("bytelength", "VF_validByteLength")
		);

	//select 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForSelect = new Array(
			new Array("selectrequired", "VF_validSelectRequired")
		);

	//checkbox 타입의 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForCheckbox = 
		new Array(
			new Array("minchecked", "VF_validMinChecked"),
			new Array("maxchecked", "VF_validMaxChecked"),
			new Array("checkedcount", "VF_validCheckedCount")
		);

	//radio 타입의 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForRadio = 
		new Array(
			new Array("checkedrequired", "VF_validCheckedRequired")
		);

	//file 타입의 엘리먼트가 가질수 있는 어트리뷰트 배열
	var attributeForFile = 
		new Array(
			new Array("required", "VF_validRequired"),
			new Array("limitext", "VF_validLimitExt")
		);
	
	//디폴트 메세지
	var defaultMsg = new Array(
		new Array("required", "필수 입력입니다."),
		new Array("minchar", "입력한 글자수가 적습니다."),
		new Array("maxchar", "입력한 글자수가 많습니다."),
		new Array("charlength", "입력한 글자수가 맞지 않습니다."),
		new Array("minbyte", "입력한 글자수가 적습니다."),
		new Array("maxbyte", "입력한 글자수가 많습니다."),
		new Array("bytelength", "입력한 글자수가 맞지 않습니다."),
		new Array("datatype", "데이타가 유효하지 않습니다."),
		new Array("dataform", "데이타가 형식에 맞지 않습니다."),
		new Array("pattern", "데이타가 형식에 맞지 않습니다."),
		new Array("selectrequired", "선택하세요."),
		new Array("minchecked", "선택한 갯수가 적습니다."),
		new Array("maxchecked", "선택한 갯수가 많습니다.."),
		new Array("checkedcount", "선택한 갯수가 맞지 않습니다."),
		new Array("checkedrequired", "선택하세요."),
		new Array("limitext", "업로드 할수 없는 파일입니다.")
	);

	//데이타 타입 
	var dataType = new Array(
		new Array("1", "no", "0-9"),
		new Array("2", "kr", "ㄱ-힣"),
		new Array("4", "enl", "a-z"),
		new Array("8", "enu", "A-Z")
	);

	//데이타 형식
	var dataForm = new Array(
		new Array("phone", "checkPhone"),
		new Array("mobile", "checkMobile"),
		new Array("zip", "checkZip"),
		new Array("ssn", "checkSsn"),
		new Array("email", "checkEmail"),
		new Array("url", "checkUrl")
	);
	
	//엘리먼트의 타입에 맞는 어트리뷰트 배열을 저장하는 오브젝트
	function ValidAttribute(type) {	 
		switch (type) {
			case "text":
			case "password" : 
				this.attrList = attributeForText;
				break;
			case "textarea":
				this.attrList = attributeForTextArea;
				break;
			case "select-one":
				this.attrList = attributeForSelect;
				break;
			case "checkbox":
				this.attrList = attributeForCheckbox;
				break;
			case "radio":
				this.attrList = attributeForRadio;
				break;
			case "file":
				this.attrList = attributeForFile;
				break;
			case "button":
			case "submit":
			case "image":
			case "hidden":
			default :
				this.attrList = new Array();
				break;
		}
	}

	//엘리먼트 객체와 검사할 어트리뷰트를 저장하는 오브젝트
	function CheckElement(ele) {
		this.attr = new Array();
		this.ele = ele;

		this.add = function(func, value) {
			this.attr[this.attr.length] = new Array(func, value);
		}
	}
	
	//엘리먼트에 대한 유효성 검사
	function validCheck(ce) {
		var flag = true;
		for (var i = 0; i < ce.attr.length; i++) {
			var func = ce.attr[i][0];
			var arg = ce.attr[i][1];
			var attrVal = "";
			var attrMsg = "";
			
			if (arg.indexOf("!") > -1) {
				attrVal = arg.substring(0, arg.indexOf("!"));
				attrMsg = arg.substring(arg.indexOf("!") + 1);
			} else {
				attrVal = arg;
				attrMsg = "";
			}
			
			if (!eval(func + "(ce.ele, '" + attrVal.trim() + "')")) {
				flag = false;
				func.msg(attrMsg);
				ce.ele.focus();
				break;
			}
		}

		return flag;
	}
	

	//폼 유효성 검사 기본 호출 함수
	function NChecker() {
		var args = NChecker.arguments;
		var frm = null;
		if (args.length > 0) {
			frm = args[0];			
		} else {
			frm = event.srcElement;
		}
				
		var elementList = frm.elements;

		for (var i = 0; i < elementList.length; i++) {
			var ele = elementList[i];

			var validAttr = new ValidAttribute(ele.type);

			var attribute = ele.attributes;
				
			var chkAttr = new CheckElement(ele);

			for (var j = 0; j < validAttr.attrList.length; j++) {
				var tmpAttr = attribute.getNamedItem(validAttr.attrList[j][0]);

				if (tmpAttr != null) {
					chkAttr.add(validAttr.attrList[j][1], tmpAttr.nodeValue);
				}
			}

			if (chkAttr.attr.length > 0) {
				if (!validCheck(chkAttr)) {
					return false;
				}
			}
		}
		return true;
	}

	
	//문자열 비교
	function UDF_equals(val) {
		if (this == val) 
			return true;
		else
			return false;
	}

	//문자열 앞뒤 공백 제거
	function UDF_trim() { return this.replace(/^\s*/ ,"").replace(/\s*$/ ,""); }

	//문자열 앞 공백 제거
	function UDF_ltrim() { return this.replace(/^\s*/ ,""); }

	//문자열 뒤 공백 제거
	function UDF_rtrim() {return this.replace(/\s*$/ ,""); }

	//정규식 패턴 매치
	function UDF_match(pattern) { return pattern.test(this) }
	
	//2바이트 문자 길이
	function UDF_getByteLength() {
      var str;
      var cnt = 0;
      
      for(var i = 0; i < this.length; i++ ){
         str = this.charAt(i);
      
         if(escape(str).length > 4) cnt += 2; 
         else cnt++;
      }

      return cnt;
   }
	
	//파일 확장자 가져오기
   function UDF_getFileExt() {
		return this.substring(this.lastIndexOf("\.") + 1);
   }
	
   //전화번호
	function VF_checkPhone() {
		var pattern = /^0\d{1,2}-\d{3,4}-\d{4}$/;
		
		return this.match(pattern);
	}

	//핸드폰 번호 
	function VF_checkMobile() {
		var pattern = /^(010|011|016|017|018|019)-\d{3,4}-\d{4}$/

		return this.match(pattern);
	}

	//주민번호
	function VF_checkSsn() {
		return true;
	}

	//우편번호
	function VF_checkZip() {
		var pattern = /^\d{3}-\d{3}$/;

		return this.match(pattern);
	}

	//이메일주소
	function VF_checkEmail() {
		var pattern = /^[a-z0-9-]+@[a-z0-9-]+\.[a-z]+(\.[a-z]+)?$/;

		return this.match(pattern);
	}

	//URL
	function VF_checkUrl() {
		var pattern = /^(http:\/\/)?[a-z0-9-]+\.[a-z]+(\.[a-z]+)*$/;

		return this.match(pattern);
	}

	//메세지 출력
	function VF_msg(msg) { 
		if (msg.equals("")) {	 //해당 메세지가 없을경우 디폴트 메세지 출력
			for (var i = 0; i < defaultMsg.length; i++) {
				if (this.equals(defaultMsg[i][0])) {
					alert(defaultMsg[i][1]);
					break;
				}
			}
		} else {
			alert(msg);
		}
	}	
	
	//필수입력항목 체크
	function VF_validRequired(ele, attrVal) {	
		if (attrVal.trim().equals("true")) {
			if (ele.value.trim().equals(""))  return false; else return true;
		}
		
		return true;
	}

	//입력항목 문자열 최소길이 체크
	function VF_validMinChar(ele, attrVal) {	
		if (attrVal.match(/^\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (ele.value.trim().length < parseInt(attrVal)) return false; else return true
			}
		} 

		return true;
	}

	//입력항목 문자열 최대길이 체크
	function VF_validMaxChar(ele, attrVal) {	
		if (attrVal.match(/^\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (ele.value.trim().length > parseInt(attrVal)) return false; else return true;
			}
		}

		return true;
	}

	//입력항목 문자열 길이 체크
	function VF_validCharLength(ele, attrVal) {	
		if (attrVal.match(/^\d+-\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (parseInt(attrVal.substring(0, attrVal.indexOf("-"))) <= parseInt(attrVal.substring(attrVal.indexOf("-") + 1))) {
					if (ele.value.trim().length < parseInt(attrVal.substring(0, attrVal.indexOf("-"))) || ele.value.trim().length > parseInt(attrVal.substring(attrVal.indexOf("-") + 1))) {
						return false;
					} else {
						return true;
					}
				}
			}
		}

		return true;
	}

	//입력항목 문자열 최소 바이트 체크
	function VF_validMinByte(ele, attrVal) {	
		if (attrVal.match(/^\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (ele.value.trim().getByteLength() < parseInt(attrVal)) return false; else return true;
			}
		}

		return true;
	}

	//입력항목 문자열 최대바이트 체크
	function VF_validMaxByte(ele, attrVal) {	
		if (attrVal.match(/^\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (ele.value.trim().getByteLength() > parseInt(attrVal)) return false; else return true;
			}
		}

		return true;
	}
	
	//입력항목 문자열 바이트 체크
	function VF_validByteLength(ele, attrVal) {	
		if (attrVal.match(/^\d+-\d+$/)) {
			if (ele.value.trim().length > 0) {
				if (parseInt(attrVal.substring(0, attrVal.indexOf("-"))) <= parseInt(attrVal.substring(attrVal.indexOf("-") + 1))) {
					if (ele.value.trim().getByteLength() < parseInt(attrVal.substring(0, attrVal.indexOf("-"))) || ele.value.trim().getByteLength() > parseInt(attrVal.substring(attrVal.indexOf("-") + 1))) {
						return false;
					} else {
						return true;
					}
				}
			}
		}

		return true;
	}

	//데이타 타입 체크
	function VF_validDataType(ele, attrVal) {	
		
		var str = "";
		
		for (var i = 0; i < dataType.length; i++) {
			if ((parseInt(attrVal) & parseInt(dataType[i][0])) == parseInt(dataType[i][0])) {
				str += dataType[i][2];
			}
		}

		var pattern = eval("/^[" + str + "]+$/");
		
		if (ele.value.trim().length > 0) {
			if (!str.equals("")) return ele.value.match(pattern);
		}

		return true;
	}
	function VF_validDataType1(ele, attrVal) {	
		var str = "";
		
		for (var i = 0; i < dataType.length; i++) {
			if ((parseInt(attrVal) & parseInt(dataType[i][0])) == parseInt(dataType[i][0])) {
				str += dataType[i][2];
			}
		}

		var pattern = eval("/^[" + str + "]+$/");
		
		if (ele.value.trim().length > 0) {
			if (!str.equals("")) return !(ele.value.match(pattern));
		}

		return false;
	}

	//데이타 형식 체크
	function VF_validDataForm(ele, attrVal) {	
		var func = "";
		for (var i = 0; i < dataForm.length; i++) {
			if (dataForm[i][0].equals(attrVal)) {
				func = dataForm[i][1];
				break;
			}
		}
		
		if (ele.value.trim().length > 0) {
			if (!func.equals("")) return eval("ele.value." + func + "()");
		}

		return true;
	}

	//패턴 체크
	function VF_validPattern(ele, attrVal) {	
		if (ele.value.trim().length > 0) {
			if (!attrVal.equals("")) {
				var pattern = eval(attrVal);

				return ele.value.match(pattern);
			}
		}

		return true;
	}

	//셀렉트박스 선택 체크
	function VF_validSelectRequired(ele, attrVal) {
		if (attrVal.equals("true")) {
			if (ele.value.equals("")) return false; else return true;
		}

		return true;
	}

	//체크박스 선택 체크(최소갯수)
	function VF_validMinChecked(ele, attrVal) {
		if (attrVal.match(/^\d+$/)) {
			var f = event.srcElement;

			var flag = false;
			var cnt = 0;

			if (!isNaN(eval("f." + ele.name + ".length"))) {
				for (var i = 0; i < eval("f." + ele.name + ".length"); i++) {
					if (eval("f." + ele.name + "[" + i + "].checked")) {
						cnt++;
					}
				}
			} else {
				if (ele.checked) {
					cnt++;
				}
			}

			if (cnt >= parseInt(attrVal)) return true; else return false;
		}

		return true;
	}

	//체크박스 선택 체크(최대갯수)
	function VF_validMaxChecked(ele, attrVal) {
		if (attrVal.match(/^\d+$/)) {
			var f = event.srcElement;

			var flag = false;
			var cnt = 0;

			if (!isNaN(eval("f." + ele.name + ".length"))) {
				for (var i = 0; i < eval("f." + ele.name + ".length"); i++) {
					if (eval("f." + ele.name + "[" + i + "].checked")) {
						cnt++;
					}
				}
			} else {
				if (ele.checked) {
					cnt++;
				}
			}

			if (cnt <= parseInt(attrVal)) return true; else return false;
		}

		return true;
	}

	//체크박스 선택 체크(갯수지정)
	function VF_validCheckedCount(ele, attrVal) {
		if (attrVal.match(/^\d+-\d+$/)) {
			var f = event.srcElement;

			var flag = false;
			var cnt = 0;

			if (!isNaN(eval("f." + ele.name + ".length"))) {
				for (var i = 0; i < eval("f." + ele.name + ".length"); i++) {
					if (eval("f." + ele.name + "[" + i + "].checked")) {
						cnt++;
					}
				}
			} else {
				if (ele.checked) {
					cnt++;
				}
			}

			if (cnt < parseInt(attrVal.substring(0, attrVal.indexOf("-"))) || cnt > parseInt(attrVal.substring(attrVal.indexOf("-") + 1))) {
				return false;
			} else {
				return true;
			}
		}

		return true;
	}

	//라디오버튼 체크
	function VF_validCheckedRequired(ele, attrVal) {
		if (attrVal.equals("true")) {
			var f = event.srcElement;

			var flag = false;
			var cnt = 0;

			if (!isNaN(eval("f." + ele.name + ".length"))) {
				for (var i = 0; i < eval("f." + ele.name + ".length"); i++) {
					if (eval("f." + ele.name + "[" + i + "].checked")) {
						cnt++;
					}
				}
			} else {
				if (ele.checked) {
					cnt++;
				}
			}

			if (cnt >= 1) return true; else return false;
		}

		return true;
	}

	//파일 확장자 제한 체크
	function VF_validLimitExt(ele, attrVal) {
		if (ele.value.trim().length > 0) {
			if (attrVal.match(/^[a-zA-Z0-9]+(\|[a-zA-Z0-9]+)*$/)) {
				var value = ele.value;

				if (value.equals("")) { 
					return true;
				} else {
					var ext = value.getFileExt().toLowerCase();
					var pattern = eval("/^(" + attrVal.toLowerCase() + "){1}$/");
					
					if (ext.match(pattern)) return true; else return false;
				}
			}
		}

		return true;
	}
