/**
* form의 요소들의 유효성 검사를 위한 스크립트
* 다국어 처리 가능
*
* @author		변진석<kalljin@nate.com>
* @since		2007-05-04 / 2008-06-16
* @version		1.0.1
*
*
* 2008-06-16
* Validator.error 수정
* : hidden 타입이나 감추어진 상태일경우 el.focus() 에러가 발생하며 이것을 try{} 처리
*
* 2009-06-23
* 영어 메시지 수정
*/


/**
사용법....

기본적으로 문서에 포함될 내용
<script type="text/javascript" language="javascript" src="[스크립트경로]/validator.js"></script>


1. 함수로 만들어서 사용할 경우
기본적인 유효성 검사외에 추가적인 사항이 있을경우
<script LANGUAGE="JavaScript">
<!--
function frmCheck(f) {
	if (Validator.check(f)) {
		if (date == today)
			return true;
		else
			return fasle;
	}
}
//-->
</script>

~~~~

<form method='~' action='~' target='~' onsubmit="return frmCheck(this)">
<input type='text' name='name1' attri(min, max, equal, notnull ...) />
<input type='text' name='name2' attri(min, max, equal, notnull ...) />
~~~

</form>


2. 바로 사용하는경우

<form method='~' action='~' target='~' onsubmit="return Validator.check(this)">
<input type='text' name='name1' attri(min, max, equal, notnull ...) />
<input type='text' name='name2' attri(min, max, equal, notnull ...) />
~~~

</form>


사용가능한 attribute list
	hname		: 한글항목명
	ename		: 영문항목명
	notnull		: 필수입력일경우
	min			: 최소값 지정 - 이값이상 입력해야됨
	max			: 최대값 지정 - 이값이하로 입력해야됨
	minlength	: 최소입력문자열의 길이 - 이값보다 입력값의 길이가 이상이어야됨
	maxbyte		: 최대입력가능 바이트수 - 입력값의 바이트(길이 아님)가 이값 이하이어야 됨
	equal		: 비교대상을 지정하고 비교대상과 값이 같아야됨
	sync		: 대상중에 입력된 항목이 있으면 자기 사진도 입력되어야함 일종의 조건절 notnull임
	pattern		: 입력값의 패턴을 체크 (이메일, 주민번호, 전화번호등..)
	msg			: 지정된 에러메시지 이외에 직접설정할경우 사용


pattern의 설정가능 요소
	num		: 숫자만 입력 가능
	phone	: 전화번호 000-000-0000, 000-0000-0000 형식 입력 가능
	phone1	: 전화번호의 지역번호 000 형식 입력 가능
	phone2	: 전화번호의 국번 000, 0000 형식 입력 가능
	phone3	: 전화번호의 마지막 4자리 입력 가능
	mobile	: 이동통신 011-000-0000, 019-000-0000 형식 입력 가능
	mobile1	: 이동통신의 국번 입력 가능
	mobile2	: 이동통신의 국번 000,0000 입력 가능
	mobile3	: 이동통신의 마지막 4자리 입력 가능
	email	: 이메일 형식 입력가능
	url		: http:// 를 제외한 url입력
	http	: http:// 를 포함한 url입력
	eng		: 알파벳만 입력 가능
	alnum	: 알파벳, 숫자만 입력 가능
	han		: 한글만 입력 가능
	haneng	: 한글과 영문만 입력 가능
	userid	: 회원아이디
	date	: 0000-00-00 날짜 형식 입력가능
	year	: 4자리 년도 입력
	passwd	: 패스워드 형태 입력가능
	jumin1	: 주민번호 앞 6자리
	jumin2	: 주민번호 뒤 7자리
	zipcode	: 000-000 형태의 우편번호 입력가능

*/


/* 단 한번만 인클루드 되게 하기위해서... */

if(_incValidator != true) {

	var _incValidator = true;

	Validator = new Object();

	/**
	* 폼객체나 폼객체의 이름을입력받아서 해당 폼의 요소들의 유효성검사를 하고 정상적으로 검사가 완료되면 true반환
	*
	* @param	object/string	f	폼객체나 폼객체의 이름
	* @return	boolean				유효성검사의 결과 반환
	*/
	Validator.check = function (f, pannel) {

		try {
			var el;
			this.form = typeof f == 'string' ? document.getElementById(f) : f;	//문자열이면 요소를 가져오고, 객체면 바로 대입
			if (document.getElementById(pannel))
				this.pannel = document.getElementById(pannel);

			if (this.form.tagName.toLowerCase() != 'form') {
				this.errMsg('IS_NOT_FORM');
				return false;
			}

			for (var i=0; i<this.form.elements.length; i++) {
				el = this.form.elements[i];
				if (el.tagName.toLowerCase() == 'embed') continue;
				if (el.getAttribute("notnull") != null && !this.checkNotnull(el)) return false;
				if (el.getAttribute("min")!=null && el.getAttribute("max")!=null) if (!this.checkRange(el)) return false;
				if (el.getAttribute("min")!=null) if (!this.checkMin(el)) return false;
				if (el.getAttribute("max")!=null) if (!this.checkMax(el)) return false;
				if (el.getAttribute("minlength")!=null) if (!this.checkMinLen(el)) return false;
				if (el.getAttribute("maxbyte")!=null) if (!this.checkMaxByte(el)) return false;
				if (el.getAttribute("equal")!=null) if (!this.checkEqual(el)) return false;
				if (el.getAttribute("sync")!=null) if (!this.checkSync(el)) return false;
				if (el.getAttribute("pattern")!=null) if (!this.checkPattern(el)) return false;
/*
				if ((el.type == 'text' || el.type == 'password' || el.type == 'file' || el.type == 'radio' || el.type == 'checkbox' || el.type == 'textarea') && el.getAttribute("enter") == null && !el.getAttribute('readonly')) {
					el.setAttribute('enter', true);
					el.focus();
					return false;
				}
*/
			}
			return true;
		} catch (e) {
			window.status =	'Error:	' +	e.number +'; ' + e.description +'; ' + e.name +'; '	+ e.message;
			return false;
		}
	}

	/**
	* null 체크함수..
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		null이 아니면 true, null이면 false
	*/
	Validator.checkNotnull = function(el) {
		var e_type = '';
		var i = 0;

		//텍스트형의 경우 입력된 내용이 없으면 null error
		if ((el.type == 'text' || el.type == 'textarea' || el.type == 'password' || el.type == 'file' || el.type == 'hidden') && (el.value.trim() == "")) {
			e_type = 'NOT_NULL_TEXT';

		//radio, checkbox의 경우 선택된 항목이 없으면 null error
		} else if (el.type == 'radio' || el.type == 'checkbox') {
			for (i=0; i<this.form.elements.length; i++) {
				if (this.form.elements[i].name == el.name && this.form.elements[i].checked)	return true;
			}
			e_type = 'NOT_NULL_CHECK';

		//단일선택형의 경우 맨위의 것을 제외하고 나머지에서 선택해야...
		//복수형의경우 1개이상..
		} else if ((el.type == 'select-one' && el.selectedIndex < 1) || (el.type == 'select-multiple' && el.selectedIndex < 0)) {
			e_type = 'NOT_NULL_CHECK';
		}

		if (e_type)	return this.error(e_type, el);
		return true;
	}

	/**
	* 최소값 체크함수..
	* text형의 경우 숫자형에 대해서만 처리하며 숫자가 아닐경우 에러처리
	* text형의 경우 min값보다 같거나 크면 true, 아니면 false
	* checkbox의 경우 다중선택의 갯수가 min보다 커야 true, 아니면 false
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값이 min보다 크면 true, min보다 적으면 false
	*/
	Validator.checkMin = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			if (el.value.trim() == '') return true;

			if (isNaN(el.value) || isNaN(el.getAttribute("min")))	return this.error('PTN_num', el);

			var min = parseInt(el.getAttribute("min"));
			var val = parseInt(el.value);

			if (val < min)	return this.error('UNDER_MIN', el, min);

		} else if (el.type == 'checkbox') {
			var count = 0;
			for (var i=0; i<this.form.elements.length; i++) {
				if (this.form.elements[i].name == el.name && this.form.elements[i].checked)	count++;
			}

			var min = parseInt(el.getAttribute("min"));
			if (count < min)	return this.error('UNDER_MIN_SELECT', el, min);
		}
		return true;
	}

	/**
	* 최대값 체크함수..
	* text형의 경우 숫자형에 대해서만 처리하며 숫자가 아닐경우 에러처리
	* text형의 경우 min값보다 같거나 크면 true, 아니면 false
	* checkbox의 경우 다중선택의 갯수가 max보다 적어야 true, 아니면 false
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값이 max보다 적으면 true, max보다 크면 false
	*/
	Validator.checkMax = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			if (el.value.trim() == '') return true;

			if (isNaN(el.value) || isNaN(el.getAttribute("max")))	return this.error('PTN_num', el);

			var max = parseInt(el.getAttribute("max"));
			var val = parseInt(el.value);
			if (val > max)	return this.error('OVER_MAX', el, max);

		} else if (el.type == 'checkbox') {
			var count = 0;
			for (var i=0; i<this.form.elements.length; i++) {
				if (this.form.elements[i].name == el.name && this.form.elements[i].checked)	count++;
			}

			var max = parseInt(el.getAttribute("max"));
			if (count > max)	return this.error('OVER_MAX_SELECT', el, max);
		}
		return true;
	}


	/**
	* 범위 체크 함수
	* text형의 경우 숫자형에 대해서만 처리하며 숫자가 아닐경우 에러처리
	* text형의 경우 min값과 보다 같거나 크면 true, 아니면 false
	* checkbox의 경우 다중선택의 갯수가 max보다 적어야 true, 아니면 false
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값이 min과 max사이의 값이면 true, 아니면 false
	*/
	Validator.checkRange = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			if (el.value.trim() == '') return true;

			if (isNaN(el.value) || isNaN(el.getAttribute("min")) || isNaN(el.getAttribute('max')))	return this.error('PTN_num', el);

			var min = parseInt(el.getAttribute("min"));
			var max = parseInt(el.getAttribute("max"));
			var val = parseInt(el.value);
			if (val < min || val > max)	return this.error('RANGE', el, min, max);

		} else if (el.type == 'checkbox') {
			var count = 0;
			for (var i=0; i<this.form.elements.length; i++) {
				if (this.form.elements[i].name == el.name && this.form.elements[i].checked)	count++;
			}

			var min = parseInt(el.getAttribute("min"));
			var max = parseInt(el.getAttribute("max"));
			if (count < min || count > max)	return this.error('RANGE_SELECT', el, min, max);
		}
		return true;
	}


	/**
	* 최소길이값 체크함수..
	* text형의 경우 숫자형에 대해서만 처리하며 숫자가 아닐경우 에러처리
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값의 길이가 minlength보다 크면 true, 적으면 false
	*/
	Validator.checkMinLen = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			if (el.value.trim() == '') return true;

			var min = parseInt(el.getAttribute("minlength"));
			var val = parseInt(el.value.length);

			if (val < min)	return this.error('UNDER_MIN_LEN', el, min);
		}
		return true;
	}


	/**
	* 최대바이트수 체크 = db인서트와 관련이있다.
	* 최소바이트는 의미가없서서 메소드화 하지 않았다
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값의 byte가 maxbyte보다 적으면 true, 크면 false
	*/
	Validator.checkMaxByte = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password' || el.type == 'file') {
			if (el.value.trim() == '') return true;

			var max = parseInt(el.getAttribute("maxbyte"));
			var val = parseInt(el.value.get_string_byte_length());

			if (isNaN(max))
				return this.error('IS_NOT_NUM_MAX_LEN', el);
			else if (val > max)
				return this.error('OVER_MAX_BYTE', el, max, val);
		}
		return true;
	}


	/**
	* 자기자신과 equal대상의 값이 서로 같은지 체크
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된 값이 equal로 지정된 요소의 값과 같으면 true, 아니면 false
	*/
	Validator.checkEqual = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			var target = document.getElementById(el.getAttribute("equal"));

			if (el.value == target.value)
				return true;
			else
				return this.error('NOT_EQUAL', el, this.getName(target));
		}
		return true;
	}


	/**
	* sync항목중에 값이 있는항목이 있으면 자기자신도 값을 가져야한다 일종의 조건 notnull
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		sync항목과 자기자신이 둘다 공백이거나 값이 있으면 true, 아니면 false
	*/
	Validator.checkSync = function(el) {
		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password' || el.type == 'file') {
			var target = document.getElementById(el.getAttribute("sync"));

			if (target == null) { return true; }

			var v_el = el.value.trim();
			var v_tg = target.value.trim();

			if ((v_el && v_tg) || (!v_el && !v_tg))
				return true;
			else {
				if (v_el)
					return this.error('NOT_NULL_TEXT', target);
				else
					return this.error('NOT_NULL_TEXT', el);
			}
		}
		return true;
	}


	/**
	* 패턴체크
	* 정해진 패턴에 맞는지 유효성검사를 한다
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		입력된값이 정해진 패턴과 일치하면 true, 아니면 false
	*/
	Validator.checkPattern = function(el) {

		var PTN = {
			"num"		: /^[0-9.]+$/
			, "phone"	: /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$/
			, "phone1"	: /^[0-9]{2,4}$/
			, "phone2"	: /^[0-9]{3,4}$/
			, "phone3"	: /^[0-9]{4}$/
			, "mobile"	: /^(01)[0-9]{1}-[0-9]{3,4}-[0-9]{4}$/
			, "mobile1"	: /^(01)[0-9]{1}$/
			, "mobile2"	: /^[0-9]{3,4}$/
			, "mobile3"	: /^[0-9]{4}$/
			, "email"	: /^[._a-zA-Z0-9-]+@[._a-zA-Z0-9-]+\.[a-zA-Z]+$/
			, "url"		: /^(([가-힣a-zA-Z0-9-])+\.)+([가-힣a-zA-Z0-9\.\/@~\?&=_]+)/
			, "http"	: /^(http:\/\/)(([가-힣a-zA-Z0-9-])+\.)+([가-힣a-zA-Z0-9\.\/@~\?&=_]+)/
			, "eng"		: /^[a-zA-Z]+$/
			, "alnum"	: /^[a-zA-Z0-9_-]+$/
			, "han"		: /[ㄱ-ㅎ가-힣]/
			, "haneng"	: /[ㄱ-ㅎ가-힣a-zA-Z]/
			, "userid"	: /^[a-zA-Z]{1}[a-zA-Z0-9_-]{3,15}$/
			, "date"	: /^[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}$/
			, "year"	: /^[0-9]{4}$/
			, "passwd"	: /^[!-}]{4,12}$/
			, "passwd1"	: /^[!-}]{4,12}$/
			, "jumin1"	: /^[0-9]{6}$/
			, "jumin2"	: /^(1|2|3|4)[0-9]{6}$/
			, "zipcode"	: /^[0-9]{3}-[0-9]{3}$/
		}

		if (el.type == 'text' || el.type == 'textarea' || el.type == 'password') {
			if (el.value.trim() == '') return true;

			eval('var pattern = PTN.' + el.getAttribute("pattern"));

			if (!pattern.test(el.value))	return this.error('PTN_' + el.getAttribute("pattern"), el);
			return true;
		}
		return true;
	}


	/**
	* 에러처리 메소드
	* 에러타입과 요소를 입력받아서 에러처리를 한다
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		null이 아니면 true, null이면 false
	*/
	Validator.error = function(e_type, el) {
		//속성중에 msg가 설정되어 있으면 해당 msg를 출력한다.
		if (el.getAttribute("msg") != null) e_type = el.getAttribute("msg");

		this.errMsg(e_type, this.getName(el), arguments[2], arguments[3]);

		if (Validator.pannel) {
			el.onkeydown = function() {
				if (Validator.pannel) {
					Validator.pannel.style.display = 'none';
					Validator.pannel.innerHTML = "";
				}
				this.onkeydown = function() {};
			};

//			el.addEvent('keydown', function() {
//				if (Validator.pannel) {
//					Validator.pannel.style.display = 'none';
//					Validator.pannel.innerHTML = "";
//				}
//				this.removeEvent('keydown', '');
//			});
		}
		if (el.type == 'text' || el.type == 'password' || el.type == 'file')	el.select();

		try {
			el.focus();
		} catch(e) {}

		finally {
			return false;
		}
	}


	/**
	* 에러메세지 출력
	* 에러타입과 요소를 입력받아서 에러처리를 한다
	*
	* @param	input	el	체크할 form의 엘리먼트
	* @return	boolean		null이 아니면 true, null이면 false
	*/
	Validator.errMsg = function(msgId) {

		var HMSG = {
			"IS_NOT_FORM"			: "check()함수에서 받은 인자가 폼객체가 아니거나 넘어오지 않았습니다."
			, "NOT_NULL_TEXT"		: arguments[1] + "項目を入力して下さい。"
			, "NOT_NULL_CHECK"		: arguments[1] + "項目を入力して下さい。"
			, "UNDER_MIN"			: arguments[1] + " 항목은 " + arguments[2] + " 이상이어야 합니다."
			, "OVER_MAX"			: arguments[1] + " 항목은 " + arguments[2] + " 이하이어야 합니다"
			, "RANGE"				: arguments[1] + " 항목은 " + arguments[2] + " ~ " + arguments[3] + " 사이의 값이어야 합니다."
			, "UNDER_MIN_SELECT"	: arguments[1] + " 항목은 " + arguments[2] + " 개 이상 선택해야 합니다."
			, "OVER_MAX_SELECT"		: arguments[1] + " 항목은 " + arguments[2] + " 개 이하 선택해야 합니다."
			, "RANGE_SELECT"		: arguments[1] + " 항목은 " + arguments[2] + " ~ " + arguments[3] + " 사이의 항목을 선택해야 합니다."
			, "UNDER_MIN_LEN"		: arguments[1] + " 항목은 " + arguments[2] + " 자 이상 입력하셔야 합니다."
			, "OVER_MAX_BYTE"		: arguments[1] + " 항목의 길이는 " + arguments[3]+ "byte입니다.\n" + arguments[2] + " Byte 이하로 입력하셔야 합니다.\n(영문, 숫자등은 1Byte, 한글 등은 2Byte)"
			, "NOT_EQUAL"			: arguments[1] + " 항목은 " + arguments[2] + " 항목과 같아야 합니다."

			, "PTN_num"				: arguments[1] + " 항목은 숫자를 입력해주세요."
			, "PTN_phone"			: arguments[1] + " 항목은 전화번호를 입력해주세요.\n ex) 02-123-4567"
			, "PTN_phone1"			: arguments[1] + " 항목은 지역번호를 입력해주세요\n ex) 02, 031, 064 .."
			, "PTN_phone2"			: arguments[1] + " 항목은 3,4자리 국번을 입력해주세요"
			, "PTN_phone3"			: arguments[1] + " 항목은 4자리 숫자를 입력해주세요"
			, "PTN_mobile"			: arguments[1] + " 이동통신 번호를 입력해주세요."
			, "PTN_mobile1"			: arguments[1] + " 항목은 이동통신 식별번호(011, 016, 010 ..)를 입력해주세요"
			, "PTN_mobile2"			: arguments[1] + " 항목은 3,4자리 국번을 입력해주세요"
			, "PTN_mobile3"			: arguments[1] + " 항목은 4자리 숫자를 입력해주세요"
//			, "PTN_email"			: arguments[1] + " 항목은 이메일주소를 입력해주세요\n ex) email@mail.com"
			, "PTN_email"			: "正しいメールアドレスをご入力ください。\n ex) airbusan@airbusan.com"
			, "PTN_url"				: arguments[1] + " 항목은 홈페이지주소를 입력해주세요\n ex) www.homepage.com, homepage.com \n http:// 는 제외"
			, "PTN_http"			: arguments[1] + " 항목은 http://를 포함한 홈페이지 주소를 입력해 주세요\n ex) http://www.homepage.com"
			, "PTN_eng"				: arguments[1] + " 항목은 알파벳만 입력해주세요"
			, "PTN_alnum"			: arguments[1] + " 항목은 알파벳과 숫자만 입력해주세요"
			, "PTN_han"				: arguments[1] + " 항목은 한글만 입력해주세요"
			, "PTN_haneng"			: arguments[1] + " 항목은 한글과 알파벳만 입력해주세요"
			, "PTN_userid"			: arguments[1] + " 항목은 4자이상 15자이하의 영문자,숫자만 입력가능합니다"
			, "PTN_date"			: arguments[1] + " 항목은 날짜형식을 입력해주세요\n ex)2007-05-05"
			, "PTN_year"			: arguments[1] + " 항목은 4자리 년도를 입력해주세요"
			, "PTN_passwd"			: arguments[1] + " 항목은 비밀번호를 입력해주세요"
			, "PTN_passwd1"			: arguments[1] + " 항목은 비밀번호를 일치하지 않습니다."
			, "PTN_jumin1"			: arguments[1] + " 항목은 주빈번호 앞 6자리를 입력해주세요"
			, "PTN_jumin2"			: arguments[1] + " 항목은 주민번호 뒤 7자리를 입력해주세요"
			, "PTN_zipcode"			: arguments[1] + " 항목은 우편번호를 입력해주세요\n ex)123-456"

		}

		//영문으로 바꿔야...
		var EMSG = {
			"IS_NOT_FORM"			: "No input FORM Element"
			, "NOT_NULL_TEXT"		: "Please fill the " + arguments[1]
			, "NOT_NULL_CHECK"		: "Choose the " + arguments[1]
			, "UNDER_MIN"			: arguments[1] + " must be " + arguments[2] + " or more"
			, "OVER_MAX"			: arguments[1] + " must be less than " + arguments[2]
			, "RANGE"				: arguments[1] + " over the " + arguments[2] + ", " + arguments[3] + " must be less than"
			, "UNDER_MIN_SELECT"	: "Choose the " + arguments[1] + " to more than " + arguments[2]
			, "OVER_MAX_SELECT"		: "Choose the " + arguments[1] + ", less than " + arguments[2]
			, "RANGE_SELECT"		: arguments[1] + " over the " + arguments[2] + ", " + arguments[3] + " must be less than"
			, "UNDER_MIN_LEN"		: "Enter the " + arguments[1] + " is " + arguments[2] + " characters or more"
			, "OVER_MAX_BYTE"		: arguments[1] + " 항목의 길이는 " + arguments[3]+ "byte입니다.\n" + arguments[2] + " Byte 이하로 입력하셔야 합니다.\n(영문, 숫자등은 1Byte, 한글 등은 2Byte)"
			, "NOT_EQUAL"			: arguments[1] + " 항목은 " + arguments[2] + " 항목과 같아야 합니다."

			, "PTN_num"				: "Enter the number " + arguments[1]
			, "PTN_phone"			: "Enter the phone number " + arguments[1]
			, "PTN_phone1"			: arguments[1] + " 항목은 지역번호를 입력해주세요\n ex) 02, 031, 064 .."
			, "PTN_phone2"			: arguments[1] + " 항목은 3,4자리 국번을 입력해주세요"
			, "PTN_phone3"			: arguments[1] + " 항목은 4자리 숫자를 입력해주세요"
			, "PTN_mobile"			: arguments[1] + " 이동통신 번호를 입력해주세요."
			, "PTN_mobile1"			: arguments[1] + " 항목은 이동통신 식별번호(011, 016, 010 ..)를 입력해주세요"
			, "PTN_mobile2"			: arguments[1] + " 항목은 3,4자리 국번을 입력해주세요"
			, "PTN_mobile3"			: arguments[1] + " 항목은 4자리 숫자를 입력해주세요"
			, "PTN_email"			: arguments[1] + " 항목은 이메일주소를 입력해주세요\n ex) email@mail.com"
			, "PTN_url"				: arguments[1] + " 항목은 홈페이지주소를 입력해주세요\n ex) www.homepage.com, homepage.com \n http:// 는 제외"
			, "PTN_http"			: arguments[1] + " 항목은 http://를 포함한 홈페이지 주소를 입력해 주세요\n ex) http://www.homepage.com"
			, "PTN_eng"				: arguments[1] + " 항목은 알파벳만 입력해주세요"
			, "PTN_alnum"			: arguments[1] + " 항목은 알파벳과 숫자만 입력해주세요"
			, "PTN_han"				: arguments[1] + " 항목은 한글만 입력해주세요"
			, "PTN_haneng"			: arguments[1] + " 항목은 한글과 알파벳만 입력해주세요"
			, "PTN_userid"			: arguments[1] + " 항목은 회원아이디만 입력해주세요"
			, "PTN_date"			: arguments[1] + " 항목은 날짜형식을 입력해주세요\n ex)2007-05-05"
			, "PTN_year"			: arguments[1] + " 항목은 4자리 년도를 입력해주세요"
			, "PTN_passwd"			: arguments[1] + " 항목은 비밀번호를 입력해주세요"
			, "PTN_jumin1"			: arguments[1] + " 항목은 주빈번호 앞 6자리를 입력해주세요"
			, "PTN_jumin2"			: arguments[1] + " 항목은 주민번호 뒤 7자리를 입력해주세요"
			, "PTN_zipcode"			: arguments[1] + " 항목은 우편번호를 입력해주세요\n ex)123-456"

		}


		//var MSG = (this.isKO) ? HMSG : EMSG ;
		var MSG = HMSG;

		eval('var msg = MSG["' + msgId + '"]');

		if (msg == null) msg = msgId;

		if (this.pannel) {
			this.pannel.style.display = '';
			this.pannel.innerHTML = msg;
		} else {
			alert(msg);
		}
		window.status = msg;
	}



	Validator.isIE = function() {
		return (navigator.appName.charAt(0) == 'M') ? true : false ;
	}


	Validator.isKO = function() {
		var isko = (this.isIE()) ? navigator.userLanguage : navigator.language ;

		return (isko == 'ko') ? true : false;
	}


	//해당 요소의 alias나 name을 반환한다.
	/**
		언어 로케일을 확인해서 hname이나 ename을 반환
	*/
	Validator.getName = function(el) {
		var name;
		if (this.isKO) name = "hname";
//		else			name = "ename";
		else			name = "jname";
		return (el.getAttribute(name)) ? el.getAttribute(name) : el.name ;
	}

	String.prototype.trim = function() {
		return this.replace(/(^ *)|( *$)/g, "");
	}
	String.prototype.ltrim = function() {
		return this.replace(/(^ *)/g, "");
	}
	String.prototype.rtrim = function() {
		return this.replace(/( *$)/g, "");
	}
	String.prototype.get_string_byte_length = function(Str) {
		Str = this != window ? this : Str;
		var add_len = 0;
		for (var i=1; i<Str.length; i++) {
			if ((Str.charCodeAt(i) < 0) || (Str.charCodeAt(i) > 127)) add_len++;
		}
		return (Str.length + add_len);
	}
}
