/*------------------------------------------------------------------------------
 * 1. 파일명: valid.form.utf8.js
 * 2. 설  명: Form 요소 처리와 관련된 함수를 정의한다.
 * 3. 의존성: valid.base.utf8.js, valid.number.utf8.js,
 *            valid.date.utf8.js, valid.biz.utf8.js
 * 4. 작성일: 2006.10.11.
 -----------------------------------------------------------------------------*/

/**
 * Input 객체의 값이 Select 객체의 value 항목에 있는 값인지
 * 검사하여 있으면 true를 돌려 주고, 없으면 오류 메세지를 보여주고
 * Focus를 inputObj에 준 다음 false를 돌려 준다.
 * 단 Input 객체의 값이 없으면 그냥 통과한다.
 */
function validateExistsInSelect(inputObj, selectObj) {
	inputObj  = ref(inputObj ); // ID일 경우를 대비해서
	selectObj = ref(selectObj); // ID일 경우를 대비해서

	if ( isEmptyObj(inputObj) ) {
		if ( event ) event.returnValue = true;
		return true;
	}

	var valid = true;

	/* Select 항목에 Input 항목의 값이 있는지 검사한다. */
	if ( indexOfSelect(selectObj, inputObj.value) == -1 ) {
		showMessage(inputObj.value + " 값은 선택할 목록 중에 없는 값입니다. 확인해 주십시오.");
		inputObj.focus();
		inputObj.select();

		valid = false;
	}

	if ( event ) event.returnValue = valid;
	return valid;
}


/**
 * 주어진 Form 요소에 대한 유효성을 검증한다.
 */
function validateForm(form) {
	var elemArr = form.elements;

	/* 요소 수만큼 돌면서 각 요소들을 검증한다. */
	for ( var i = 0; i < elemArr.length; i++ ) {
		var elem = elemArr[i];

		/* 요소가 disabled, readonly, type이 hidden 인 경우는 유효성 검증에서 제외한다. */
		if ( elem.disabled || elem.readOnly || elem.type == "hidden" ) continue;

		/* 점검 요소 값들을 가져온다. */
		var fieldName = elem.getAttribute("valid.label"); // 점검항목명. 없으면 name 값 사용.
		if ( isEmpty(fieldName) ) fieldName = elem.getAttribute("name");


		/* 필수 여부 점검 항목이면 점검한다. */
		var required = isEmpty(elem.getAttribute("valid.required")) ?
					false :
					elem.getAttribute("valid.required").toUpperCase() == "TRUE"; // 필수항목 점검 여부
		if ( required && ! validateMandatoryObj(elem, fieldName) ) return false;


		/* 자료형 값이 있으면 자료형에 대해 유효성을 검증한다. */
		var dataType = elem.getAttribute("valid.type"); // 자료형. 없으면 null.
		if ( ! isEmpty(dataType) && ! validateDataType(elem, fieldName, dataType) ) return false;


		/* 길이에 대한 값이 있으면 유효성을 검증한다. 일단 주어진 길이 이하 byte인지만 검사. */
		var validLength = elem.getAttribute("valid.length");
		if ( ! isEmpty(validLength) && ! validateLengthLEObj(elem, validLength, fieldName) ) return false;


		/* 수치의 자릿수에 대한 값이 있으면 유효성을 검증한다. */
		var figure = elem.getAttribute("valid.figure");
		if ( ! isEmpty(figure) ) {
			var figureArr = figure.split(",");

			if ( ! validateNoFigureLEObj(
					elem,
					fieldName,
					parseInt(figureArr[0], 10),
					parseInt(figureArr[1], 10)
				) ) return false;
		}


		/* 최소값이 있으면 유효성을 검증한다. */
		var minValue = elem.getAttribute("valid.min");
		if ( ! isEmpty(minValue) && ! validateNoGEObj(elem, fieldName, minValue) ) return false;


		/* 최대값이 있으면 유효성을 검증한다. */
		var maxValue = elem.getAttribute("valid.max");
		if ( ! isEmpty(maxValue) && ! validateNoLEObj(elem, fieldName, maxValue) ) return false;


		/* 기타 유효성 검증 함수가 있으면 호출한다. */
		var validFunc = elem.getAttribute("valid.func");
		if ( ! isEmpty(validFunc) && ! eval(validFunc).call(this, elem, fieldName) ) return false;
	}

	/* 여기까지 왔으면 이상 없음. */
	return true;
}


/* 자료형에 대한 유효성을 검증한다. */
function validateDataType(elem, fieldName, dataType) {
	dataType = dataType.toLowerCase();

	var valid = true;

	switch ( dataType ) {
		case "date"  : // 일자
			valid = validateDateObj(elem, fieldName); break;

		case "term"  : // 기간
			var rearDateName  = elem.getAttribute("valid.rearDate"); // 앞 일자 항목을 구한다.

			var allowSameDate = isEmpty(elem.getAttribute("valid.allowSameDate"))
							|| elem.getAttribute("valid.allowSameDate").toUpperCase == "TRUE";

			if ( isEmpty(rearDateName) ) {
				showMessage("기간(term)을 검증하기 위해서는 앞 일자 입력 항목(valid.rearDate)이 정의되어야 합니다.");
				valid = false;
			}
			else {
				var rearDateObj = eval("elem.form." + rearDateName);
				valid = validateTermObj(rearDateObj, elem, fieldName, allowSameDate);
			}
			break;

		case "int"   : break; //validateNoObj,
		case "float" : break; //validateNoObj,
		case "telno" : // 전화번호, 팩스번호
			valid = validateTelNoObj(elem, fieldName); break;

		case "hpno"  : // 핸드폰번호
			valid = validateHpNoObj(elem, fieldName); break;

		case "email" : // Email
			valid = validateEmailObj(elem, fieldName); break;

		case "ssn" : // 주민등록번호
			valid = validateSSNObj(elem, fieldName); break;
	}

	return valid;
}
