/*-------------------------------------------------------------------+
 * 1. 파일명: valid.js
 * 2. 설  명: 필수항목여부 및 길이에 대한 유효성 점검을
 *            위한 함수를 정의한다.
 * 3. 의존성: ui.utf8.js
 * 4. 작성자: 강신원
 * 5. 작성일: 2006.10.10.
 -------------------------------------------------------------------*/


/**
 * 값이 비었는지 여부를 점검하여 돌려준다.
 * 주어진 값이 null이거나, undefined이거나 빈 문자열("")이면
 * 비었다고 판단한다.
 */
function isEmpty(value, afterTrim) {
	if ( value == null || typeof(value) == "undefined" ) return true;

	if ( afterTrim == undefined ) afterTrim = true;

	/* 문자열이 아니면 문자열로 변경한다. */
	if ( typeof(value) == "string" ) value = new String(value);

	if ( afterTrim ) value = trim(value);

	return ("" == value);
}


/**
 * 주어진 객체의 값이 빈 값인지 여부를 검사하여
 * 돌려준다. 빈값이면 true, 아니면 false이다.
 */
function isEmptyObj(obj, afterTrim) {
	obj = ref(obj);

	return isEmpty(obj.value, afterTrim);
}


/**
 * 주어진 값이 정수 값인지 혹은 정수로 치환될 수 있는
 * 문자열 값인지 여부를 돌려 준다.
 * 자릿수 값이 있을 경우는 자릿수 이하인지도 검사한다.
 *
 * @param cipher 제한 자릿수. 사전 찾아 보니 이 단어네요.
 */
function isInteger(value, cipher) {
	/* 일단 빈 값이면 true. */
	if ( isEmpty(value) ) return true;

	/* value 값이 String이 아니면 String으로 바꾼다. */
	var numStr = "";
	if ( typeof(value) != "string" ) numStr = new String(value);

	/* 3자리마다 컴마가 들어간 숫자일 수도 있으니 컴마를 삭제한다. */
	numStr = removeChar(numStr, ",");

	/* 숫자가 아닌가? */
	if ( isNaN(numStr) ) return false;

	/* 숫자이지만 정수인가? 소숫점을 가지고 있는가? */
	if ( numStr.indexOf(".") > -1 ) return false;

	/* 자릿수 제한이 있다면 주어진 자릿수 이하인가? */
	if ( ! isEmpty(cipher) && numStr.length > cipher ) return false;

	/* 여기까지 왔으면 합격! */
	return true;
}


/**
 * 주어진 값이 소수 값인지 혹은 소수로 치환될 수 있는
 * 문자열 값인지 여부를 돌려 준다.
 * 자릿수 값이 있을 경우는 자릿수 이하인지도 검사한다.
 *
 * @param value             소수 여부를 확인할 값.
 * @param integerPartCipher 정수부 제한 자릿수.
 * @param fractionCipher    소수부 제한 자릿수.
 */
function isFloat(value, integerPartCipher, fractionCipher) {
	/* 일단 빈 값이면 true. */
	if ( isEmpty(value) ) return true;

	/* value 값이 String이 아니면 String으로 바꾼다. */
	var numStr = "";
	if ( typeof(value) != "string" ) numStr = new String(value);

	/* 3자리마다 컴마가 들어간 숫자일 수도 있으니 컴마를 삭제한다. */
	numStr = removeChar(numStr, ",");

	/* 숫자가 아닌가? */
	if ( isNaN(numStr) ) return false;

	/* 자릿수 제한이 있다면 정수부와 소수부로 나눈다. */
	if ( ! isEmpty(integerPartCipher) || ! isEmpty(fractionCipher) ) {
		var tempArr = numStr.split(".");

		var intergerPart = tempArr[0]; // 정수부
		var fractionPart = tempArr.length > 1 ? tempArr[1] : ""; // 소수부

		/* 정수부 확인. */
		if ( ! isEmpty(integerPartCipher) && intergerPart.length > integerPartCipher ) return false;

		/* 소수부 확인. */
		if ( ! isEmpty(fractionCipher) && fractionPart.length > fractionCipher ) return false;
	}

	/* 여기까지 왔으면 합격! */
	return true;
}



/**
 * 주어진 문자열의 byte 수가 length의 값과 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param str    대상 문자열
 * @param length 비교 byte 수
 */
function checkLengthEQ(str, length) {
	if ( isEmpty(str) ) return true;

	return countByte(str) == length;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값과 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 */
function checkLengthEQObj(obj, length) {
	return checkLengthEQ(obj.value, length);
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값과 같은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param value  검사대상 값.
 * @param length 비교 byte 수.
 * @param fieldName 항목명
 */
function validateLengthEQ(value, length, fieldName) {
	if ( fieldName == undefined ) {
		fieldName = "";
	}
	else {
		fieldName += "의 ";
	}

	var valid = checkLengthEQ(value, length);

	if ( ! valid ) {
		showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)이어야 합니다.");
	}

	return valid;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값과 같지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 * @param fieldName 항목명
 */
function validateLengthEQObj(obj, length, fieldName) {
	var valid = validateLengthEQ(obj.value, length, fieldName);

	if ( ! valid ) {
		obj.focus();
	}

	return valid;
}


/**
 * 주어진 문자열의 byte 수가 length의 값보다 큰지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param str    대상 문자열
 * @param length 비교 byte 수
 */
function checkLengthGT(str, length) {
	return countByte(str) > length;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 */
function checkLengthGTObj(obj, length) {
	return checkLengthGT(obj.value, length);
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param value  검사대상 값.
 * @param length 비교 byte 수.
 * @param fieldName 항목명
 */
function validateLengthGT(value, length, fieldName) {
	if ( fieldName == undefined ) {
		fieldName = "";
	}
	else {
		fieldName += "의 ";
	}

	var valid = checkLengthGT(value, length);

	if ( ! valid ) {
		showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 커야 합니다.");
	}

	return valid;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 큰지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 * @param fieldName 항목명
 */
function validateLengthGTObj(obj, length, fieldName) {
	var valid = validateLengthGT(obj.value, length, fieldName);

	if ( ! valid ) {
		obj.focus();
	}

	return valid;
}


/**
 * 주어진 문자열의 byte 수가 length의 값보다 작은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param str    대상 문자열
 * @param length 비교 byte 수
 */
function checkLengthLT(str, length) {
	return countByte(str) < length;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 */
function checkLengthLTObj(obj, length) {
	return checkLengthLT(obj.value, length);
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param value  검사대상 값.
 * @param length 비교 byte 수.
 * @param fieldName 항목명
 */
function validateLengthLT(value, length, fieldName) {
	if ( fieldName == undefined ) {
		fieldName = "";
	}
	else {
		fieldName += "의 ";
	}

	var valid = checkLengthLT(value, length);

	if ( ! valid ) {
		showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 작아야 합니다.");
	}

	return valid;
}



/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 * @param fieldName 항목명
 */
function validateLengthLTObj(obj, length, fieldName) {
	var valid = validateLengthLT(obj.value, length, fieldName);

	if ( ! valid ) {
		obj.focus();
	}

	return valid;
}



/**
 * 주어진 문자열의 byte 수가 length의 값보다 크거나 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param str    대상 문자열
 * @param length 비교 byte 수
 */
function checkLengthGE(str, length) {
	return countByte(str) >= length;
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값과 크거나 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 */
function checkLengthGEObj(obj, length) {
	return checkLengthGE(obj.value, length);
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param value  검사대상 값.
 * @param length 비교 byte 수.
 * @param fieldName 항목명
 */
function validateLengthGE(value, length, fieldName) {
	if ( fieldName == undefined ) {
		fieldName = "";
	}
	else {
		fieldName += "의 ";
	}

	var valid = checkLengthGE(value, length);

	if ( ! valid ) {
		showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 크거나 같아야 합니다.");
	}

	return valid;
}



/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 * @param fieldName 항목명
 */
function validateLengthGEObj(obj, length, fieldName) {
	var valid = validateLengthGE(obj.value, length, fieldName);

	if ( ! valid ) {
		obj.focus();
	}

	return valid;
}



/**
 * 주어진 문자열의 byte 수가 length의 값보다 작거나 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param str    대상 문자열
 * @param length 비교 byte 수
 */
function checkLengthLE(str, length) {
	return countByte(str) <= length;
}


/**
 * 주어진 문자열의 byte 수가 length의 값보다 작거나 같은지를
 * 검사하여 같으면 true를, 다르면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 */
function checkLengthLEObj(obj, length, fieldName) {
	return checkLengthLE(obj.value, length);
}


/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작거나 같은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param value  검사대상 값.
 * @param length 비교 byte 수.
 * @param fieldName 항목명
 */
function validateLengthLE(value, length, fieldName) {
	if ( fieldName == undefined ) {
		fieldName = "";
	}
	else {
		fieldName += "의 ";
	}

	var valid = checkLengthLE(value, length);

	if ( ! valid ) {
		showMessage(fieldName + " 값은 " + length + " 글자(숫자, 영문 기준)보다 작거나 같아야 합니다.");
	}

	return valid;
}



/**
 * Text형 입력폼 값의 byte 수가 length의 값보다 작거나 같은지를
 * 검사하여 그렇다면 true를, 그렇지 않으면 false를 돌려준다.
 *
 * @param obj    Text형 입력폼 객체
 * @param length 비교 byte 수
 * @param fieldName 항목명
 */
function validateLengthLEObj(obj, length, fieldName) {
	var valid = validateLengthLE(obj.value, length, fieldName);

	if ( ! valid ) {
		obj.focus();
	}

	return valid;
}



/* 필수항목 여부를 점검하여 항목이 있으면 true를,
 * 없으면 오류 메세지를 보여주고 false를 돌려 준다.
 */
function validateMandatory(value, fieldName) {
	var isValid = ! isEmpty(value);

	if ( fieldName == undefined ) fieldName = "검사";

	if ( ! isValid ) {
		showMessage(fieldName + " 항목은 필수입력 사항입니다.");
	}

	return isValid;
}


function validateMandatoryObj(obj, fieldName) {
	var isValid = validateMandatory(obj.value, fieldName);

	if ( ! isValid ) obj.focus();

	return isValid;
}

