/*--------------------------------------------------------------------------

FormValidator (Version 1.0)

작업자 : 강현석(Corestone H. Kang)

[ Sample Code ]

autoValidation("formID")

모든 값이 정상이면 true 하나라도 값에 이상이 있으면 false를 리턴하며 alert 창과 함께 해당 폼의 클래스에 invalidForm을 추가함

form에서는 formID하부의 모든 폼 오브젝트 중에서 class명 check인 것을 자동으로 찾아서 체크해 주며 체크 방법은 해당 태그의 check속성으로 지정한다

check 속성의 사용법

check는 3~5개의 값을 || 구분자로 입력을 한다.
1 : 값의 타이틀(alert을 띄울 때 필요한 값이다)
2 : "R" or "O"의 값 R은 필수입력 O는 선택입력을 뜻한다. 만약 필수입력 값에 입력값이 없으면 false를 반환하고 선택입력값에 값이 없으면 검사를 건너뛴다.
3 : 검사방법
	length : 값을 길이를 체크
	number : 숫자값의 범위를 체크
	equals : 값이 특정 폼의 값과 같은지를 체크
	regexp : 정규표현식으로 완전히 일치하는지를 체크
	email : 이메일 주소 형식이 맞는지를 체크
	juminno : 주민등록번호가 형식에 맞는지를 체크
	fgnno : 외국인등록번호가 형식에 맞는지를 체크
	saeupno : 자업자번호가 형식에 맞는지를 체크
	time : 시간 값이 온전한 값인지를 체크
4 : 검사방법에 따른 인자값
	검사방법이 length 일 때 : [최소길이],[최대길이]
	검사방법이 number 일 때 : [최소값],[최대값]
	검사방법이 equals 일 때 : [비교할 폼의 아이디],[비교할 폼의 명칭]
	검사방법이 regexp 일 때 : [정규표현식]
	검사방법이 나머지일 때 : 없음
5 : 만약 체크에 걸렸을 경우 포커스 이동 전에 호출할 함수가 있다면 함수명을 적는다

-------------------------------------------------------------------------*/
function autoValidation(formID)
{
	var returnValue = true;
	jQuery("form#" + formID + " .check:input").each(function (index)
	{
		var checkVal = jQuery.trim(jQuery(this).removeClass("invalidForm").val());
		var checkArgs = jQuery.trim(jQuery(this).attr("check").split("||", 5));
		if (checkArgs[1] == "R" && checkVal == "")
		{
			return invalidMessage(checkArgs[0] + "은(는) 필수 입력입니다. 공백을 제외한 문자를 입력해 주십시오.", this, checkArgs[4]);
		}
		if (jQuery(this).attr("type").toUpperCase() == "TEXT" && jQuery(this).attr("maxlength") == "")
		{
			return invalidMessage(checkArgs[0] + "에 대한 maxlength 속성값이 정의되어 있지 않습니다. 관리자에게 문의하세요.", this, checkArgs[4]);
		}
		if (checkVal)
		{
			switch (checkArgs[2])
			{
// 길이 체크
				case "length" :
					var args = checkArgs[3].split(",", 2);
					var strLength = 0;
					for (var i = 0; i < checkVal.length; i++)
					{
						var temp = checkVal.charAt(i);
						if (escape(temp).length > 4)
						{
							strLength += 2;
						}
						else if (temp!='\r')
						{
							strLength++;
						}
						if(strLength > args[1])
						{
							return invalidMessage(checkArgs[0] + "의 입력값이 한글 " + args[1]/2 + "자, 영문 " + args[1] + "자까지만 입력하실 수 있습니다", this, checkArgs[4]);
						}
					}
					if (strLength < args[0])
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 한글 " + args[0]/2 + "자, 영문 " + args[0] + "자 이상 입력하셔야 합니다.", this, checkArgs[4]);
					}
					break;
// 숫자범위 체크
				case "number" :
					var args = checkArgs[3].split(",", 2);
					var regExp = new RegExp("^-?(d+)|(d+\.d+)$", "gi");
					if (!regExp.test(value))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 숫자 형식으로 입력하셔야 합니다.", this, checkArgs[4]);
					}
					if (parseFloat(checkVal) > parseFloat(args[1]))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 " + args[1] + "보다 작은 값을 입력해야 합니다.", this, checkArgs[4]);
					}
					if (parseFloat(checkVal) < parseFloat(args[0]))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 " + args[1] + "보다 큰 값을 입력해야 합니다.", this, checkArgs[4]);
					}
					break;
// 값 일치 체크
				case "equals" :
					var args = checkArgs[3].split(",", 2);
					if (checkVal != jQuery("#" + args[0]).val())
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 " + args[1] + "와 값이 일치해야 합니다.", this, checkArgs[4]);
					}
					break;
// 정규표현식으로 체크
				case "regexp" :
					var regExp = new RegExp("^" + checkArgs[3] + "$", "gi");
					if (!regExp.test(checkVal))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 형식이 아닙니다.", this, checkArgs[4]);
					}
					break;
// 이메일형식 체크
				case "email" :
					var regExp = new RegExp("^(\.?[-!#$%&\'*+0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\.[a-zA-Z](-?[a-zA-Z0-9])*)+$", "gi");
					if (!regExp.test(checkVal))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 이메일 형식이 아닙니다.", this, checkArgs[4]);
					}
					break;
// 주민등록번호형식 체크
				case "juminno" :
					checkVal = checkVal.replace("-", "");
					if (checkVal.length != 13 || (checkVal.substring(6, 7) != "1" && checkVal.substring(6, 7) != "2"))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 주민등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					try
					{
						var date = new Date(parseInt("19" + checkVal.substring(0, 2), checkVal.substring(2, 4) - 1, checkVal.substring(4,6)))
					}
					catch (e)
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 주민등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					var chk = 0;
					for (i = 0; i < 13; i++)
					{
						chk += ((i % 8 + 2) * parseInt(checkVal.substring(i, i + 1)));
					}
					chk = (11 - (chk % 11)) % 10;
					if (chk != checkVal.substring(12, 13))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 주민등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					break;
// 외국인등록번호형식 체크
				case "fgnno" :
					checkVal = checkVal.replace("-", "");
					if (checkVal.length != 13 || parseInt(checkVal.substring(7,9)) % 2 != 0 || parseInt(checkVal.substring(11,12)) > 5)
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 외국인등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					var chk = 0;
					for (i = 0; i < 13; i++)
					{
						chk += ((i % 8 + 2) * parseInt(checkVal.substring(i, i + 1)));
					}
					chk = (11 - (chk % 11) + 2) % 10;
					if (chk != checkVal.substring(12, 13))
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 외국인등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					break;
// 사업자번호형식 체크
				case "saeupno" :
					checkVal = checkVal.replace("-", "");
					if (checkVal.length != 10)
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 사업자등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					var sum = 0;
					var getlist =new Array(10);
					var chkvalue =new Array("1", "3", "7", "1", "3", "7", "1", "3", "5");
					for (var i = 0; i < 10; i++)
					{
						getlist[i] = checkVal.substring(i, i + 1);
					}
					for (var i = 0; i < 9; i++)
					{
						sum += getlist[i] * chkvalue[i];
					}
					sum = sum + parseInt((getlist[8] * 5) / 10);
					sidliy = sum % 10;
					sidchk = 0;
					if (sidliy != 0)
					{
						sidchk = 10 - sidliy;
					}
					else
					{
						sidchk = 0;
					}
					if (sidchk != getlist[9])
					{
						return invalidMessage(checkArgs[0] + "의 입력값이 올바른 사업자등록번호 형식이 아닙니다.", this, checkArgs[4]);
					}
					break;
				case "time" :
					break;
			}
		}
	});
	return returnValue;
}

function invalidMessage(msg, form, func)
{
	callFunction(func)
	alert(msg);
	jQuery(form).addClass("invalidForm").focus();
	returnValue = false;
	return false;
}

