/*-------------------------------------------------------------------+
 * 1. 파일명: valid.number.js
 * 2. 설  명: 숫자에 대한 유효성 점검 함수를 정의한다.
 * 3. 의존성: ui.utf8.js, number.utf8.js
 * 4. 작성일: 2006.10.11.
 -------------------------------------------------------------------*/


/**
 * Text형 입력폼의 값이 유효한 숫자값인지 점검하여
 * 유효한 숫자이면 true를, 그렇지 않으면 false를 돌려준다.
 * 값이 빈 문자열이면 false를 돌려주는 것에 주의한다.
 *
 * @param obj Text형 입력폼 객체
 */
function checkNumberObj(obj) {
	return checkNumber(obj.value);
}


/**
 * 비축 업무에서는 숫자에 3자리마다 컴마가 들어간
 * 수치값을 사용한다. 이를 고려한 숫자여부를 점검하여
 * 유효한 숫자이면 true를, 그렇지 않으면 false를
 * 돌려준다. 값이 빈 문자열이면 false를 돌려주므로
 * 빈값이 아닌지를 점검하여 사용하는 것에 주의한다.
 *
 * @param  str  검사할 문자열
 */
function checkNumber(str) {
	return ! isNaN( removeChar(str, ',') );
}


/**
 * 주어진 객체의 값이 숫자인지 여부를 판단하여
 * 숫자이면 true를 돌려주고, 아니면 오류 메세지를 보여준 후
 * false를 돌려 준다.
 */
function validateNumberObj(obj, fieldName) {
	var valid = checkNumber(obj.value);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 숫자이어야 합니다.");
	}

	return valid;
}


/**
 * 숫자의 정수 자릿수와 소수 자릿수를 검사하여 각 자릿수가
 * 주어진 자리수 이하인지 검사하여, 둘 다 자릿수 이하이면 0을,
 * 정수부 자릿수만 이상 있으면 1을, 소수부 자릿수만 이상있으면 2를
 * 둘 모두 이상 있으면 3을 돌려 준다. 소수부의 경우 값이 넘어오지
 * 않으면(undefined이면) 무조건 유효한 것으로 한다.
 *
 * @date   2004-01-15
 * @param  no          검사할 숫자
 * @param  intFigure   정수부 유효 자릿수
 * @param  floatFigure 소수부 유효 자릿수
 */
function checkNoFigureLE(no, intFigure, floatFigure) {
	// 컴마를 제거하고 정수부와 소수부로 나눈다.
	var no = removeChar(no, ',');

	var dotIndex = no.indexOf('.');

	var intPart   = ""; // 정수부
	var floatPart = ""; // 소수점을 포함한 소수부

	if ( dotIndex == -1 ) {
		intPart = no;
	}
	else {
		intPart   = no.substring(0, dotIndex);
		floatPart = no.substring(dotIndex);
	}

	 // 정수부 유효 여부
	var intPartValid   = intPart.length <= intFigure;

	// 소수부 유효여부
	var floatPartValid = floatFigure == undefined || trim(floatFigure) == "" || ( floatPart.length - 1 <= floatFigure);

	//alert(no + ", " + intPart + ", " + floatPart + ", " + intPartValid + ", " + floatPartValid);

	return ( intPartValid ? 0 : 1 ) + ( floatPartValid ? 0 : 2 );
}


/**
 * Text형 입력폼 값의 정수 자릿수와 소수 자릿수를 검사하여 각 자릿수가
 * 주어진 자리수 이하인지 검사하여, 둘 다 자릿수 이하이면 0을,
 * 정수부 자릿수만 이상 있으면 1을, 소수부 자릿수만 이상있으면 2를
 * 둘 모두 이상 있으면 3을 돌려 준다. 소수부의 경우 값이 넘어오지
 * 않으면(undefined이면) 무조건 유효한 것으로 한다.
 *
 * @date  2004-01-15
 * @param  obj         Text형 입력폼 객체
 * @param  intFigure   정수부 유효 자릿수
 * @param  floatFigure 소수부 유효 자릿수
 */
function checkNoFigureLEObj(obj, intFigure, floatFigure) {
	return checkNoFigureLE(obj.value, intFigure, floatFigure);
}



/**
 * 주어진 수치값의 정수부 자릿수와 소수부 자릿수가 주어진 값보다
 * 작거나 같은지 검사하여 그렇다면 true를, 그렇지 않으면 오류 메세지를
 * 보여주고 false를 돌려 준다.
 *
 * @param no 확인할 값.
 * @param fieldName 항목명. 오류 메세지를 뿌려 줄 때 사용한다.
 * @param intFigure 정수부 자릿수
 * @param floatFigure 소수부 자릿수. 없으면 검사하지 않는다.
 */
function validateNoFigureLE(no, fieldName, intFigure, floatFigure) {
	var checkRes = checkNoFigureLE(no, intFigure, floatFigure);

	if ( checkRes > 0 ) {
		var msg = fieldName + "의 값은 ";

		if ( floatFigure == undefined || floatFigure <= 0 ) {
			/* 소수부가 없거나 혹은 0이하인 경우. */
			msg += intFigure + " 자리 이하이어야 합니다."
		}
		else {
			/* 소수부도 있는 경우. */
			msg += " 정수부가 " + intFigure + "자리 이하, 소수부가 " + floatFigure + "자리 이하이어야 합니다.";
		}

		showMessage(msg);
	}

	return checkRes == 0;
}


/**
 * 주어진 객체의 수치값의 정수부 자릿수와 소수부 자릿수가 주어진 값보다
 * 작거나 같은지 검사하여 그렇다면 true를, 그렇지 않으면 오류 메세지를
 * 보여주고 false를 돌려 준다.
 *
 * @param noObj 확인할 값을 가지고 있는 객체.
 * @param fieldName 항목명. 오류 메세지를 뿌려 줄 때 사용한다.
 * @param intFigure 정수부 자릿수
 * @param floatFigure 소수부 자릿수. 없으면 검사하지 않는다.
 */
function validateNoFigureLEObj(noObj, fieldName, intFigure, floatFigure) {
	var valid = validateNoFigureLE(noObj.value, fieldName, intFigure, floatFigure);

	if ( ! valid ) {
		noObj.focus();
	}

	return valid;
}



/**
 * 주어진 값이 비교 값과 같은지 비교하여
 * 그렇다면 true를 그렇지 않으면 false를 돌려 준다.
 *
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function checkNoEQ(no, comp) {
	/* 값이 없으면 true를 돌려 준다. */
	if ( isEmpty(no) ) return true;

	if ( ! checkParamForNo(no, comp) ) return false;

	/* 자릿수를 제거하고 수치형으로 변환한다. */
	var noValue   = parseInt(removeChar(no  , ","), 10);
	var compValue = parseInt(removeChar(comp, ","), 10);

	return noValue == compValue
}


function checkNoEQObj(obj, comp) {
	return checkNoEQ(obj.value, comp);
}


function checkParamForNo(no, comp) {
	/* 비교 값이 없으면 메세지를 보여 준다. */
	if ( isEmpty(comp) ) {
		showMessage("파라미터인 comp 값이 넘어오지 않았습니다.");
		return false;
	}

	/* 비교대상 값이 수치인지 확인한다. */
	if ( ! checkNumber(no) ) {
		showMessage("파라미터 no 의 값이 수치값이 아닙니다: " + no);
		return false;
	}

	/* 비교 값이 수치인지 확인한다. */
	if ( ! checkNumber(comp) ) {
		showMessage("파라미터 comp 의 값이 수치값이 아닙니다: " + comp);
		return false;
	}


	return true;
}


/**
 * no 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoEQ(no, fieldName, comp) {
	var valid = checkNoEQ(no, comp);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 " + comp + "과 같아야 합니다.");
	}

	return valid;
}


/**
 * noObj의 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 커서가 해당 항목에
 * 위치하게 한 다음 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param noObj 비교 대상 수치값을 가지고 있는 객체.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoEQObj(noObj, fieldName, comp) {
	var valid = validateNoEQ(noObj.value, fieldName, comp);

	if ( ! valid ) noObj.focus();

	return valid;
}


/**
 * 주어진 값이 비교 값보다 작은지 비교하여
 * 그렇다면 true를 그렇지 않으면 false를 돌려 준다.
 *
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function checkNoLT(no, comp) {
	/* 값이 없으면 true를 돌려 준다. */
	if ( isEmpty(no) ) return true;

	if ( ! checkParamForNo(no, comp) ) return false;

	/* 자릿수를 제거하고 수치형으로 변환한다. */
	var noValue   = parseInt(removeChar(no  , ","), 10);
	var compValue = parseInt(removeChar(comp, ","), 10);

	return noValue < compValue
}


function checkNoLTObj(obj, comp) {
	return checkNoLT(obj.value, comp);
}


/**
 * no 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoLT(no, fieldName, comp) {
	var valid = checkNoLT(no, comp);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 " + comp + "보다 작아야 합니다.");
	}

	return valid;
}


/**
 * noObj의 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 커서가 해당 항목에
 * 위치하게 한 다음 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param noObj 비교 대상 수치값을 가지고 있는 객체.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoLTObj(noObj, fieldName, comp) {
	var valid = validateNoLT(noObj.value, fieldName, comp);

	if ( ! valid ) noObj.focus();

	return valid;
}


/**
 * 주어진 값이 비교 값보다 작거나 같은지 비교하여
 * 그렇다면 true를 그렇지 않으면 false를 돌려 준다.
 *
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function checkNoLE(no, comp) {
	/* 값이 없으면 true를 돌려 준다. */
	if ( isEmpty(no) ) return true;

	if ( ! checkParamForNo(no, comp) ) return false;

	/* 자릿수를 제거하고 수치형으로 변환한다. */
	var noValue   = parseInt(removeChar(no  , ","), 10);
	var compValue = parseInt(removeChar(comp, ","), 10);

	return noValue <= compValue
}


function checkNoLEObj(obj, comp) {
	return checkNoLE(obj.value, comp);
}


/**
 * no 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoLE(no, fieldName, comp) {
	var valid = checkNoLE(no, comp);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 " + comp + "보다 작거나 같아야 합니다.");
	}

	return valid;
}


/**
 * noObj의 값이 comp 값보다 작거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 커서가 해당 항목에
 * 위치하게 한 다음 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param noObj 비교 대상 수치값을 가지고 있는 객체.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoLEObj(noObj, fieldName, comp) {
	var valid = validateNoLE(noObj.value, fieldName, comp);

	if ( ! valid ) noObj.focus();

	return valid;
}


/**
 * 주어진 값이 비교 값보다 큰지 비교하여
 * 그렇다면 true를 그렇지 않으면 false를 돌려 준다.
 *
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function checkNoGT(no, comp) {
	/* 값이 없으면 true를 돌려 준다. */
	if ( isEmpty(no) ) return true;

	if ( ! checkParamForNo(no, comp) ) return false;

	/* 자릿수를 제거하고 수치형으로 변환한다. */
	var noValue   = parseInt(removeChar(no  , ","), 10);
	var compValue = parseInt(removeChar(comp, ","), 10);

	return noValue > compValue;
}


function checkNoGTObj(obj, comp) {
	return checkNoGT(obj.value, comp);
}


/**
 * no 값이 comp 값보다 큰지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoGT(no, fieldName, comp) {
	var valid = checkNoGT(no, comp);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 " + comp + "보다 커야 합니다.");
	}

	return valid;
}


/**
 * noObj의 값이 comp 값보다 큰지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 커서가 해당 항목에
 * 위치하게 한 다음 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param noObj 비교 대상 수치값을 가지고 있는 객체.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoGTObj(noObj, fieldName, comp) {
	var valid = validateNoGT(noObj.value, fieldName, comp);

	if ( ! valid ) noObj.focus();

	return valid;
}


/**
 * 주어진 값이 비교 값보다 크거나 같은지 비교하여
 * 그렇다면 true를 그렇지 않으면 false를 돌려 준다.
 *
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function checkNoGE(no, comp) {
	/* 값이 없으면 true를 돌려 준다. */
	if ( isEmpty(no) ) return true;

	if ( ! checkParamForNo(no, comp) ) return false;

	/* 자릿수를 제거하고 수치형으로 변환한다. */
	var noValue   = parseInt(removeChar(no  , ","), 10);
	var compValue = parseInt(removeChar(comp, ","), 10);

	return noValue >= compValue
}


function checkNoGEObj(obj, comp) {
	return checkNoGE(obj.value, comp);
}


/**
 * no 값이 comp 값보다 크거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param no 비교 대상 수치값. 자릿수 등이 들어간 수치형 문자열일 수도 있다.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoGE(no, fieldName, comp) {
	var valid = checkNoGE(no, comp);

	if ( ! valid ) {
		showMessage(fieldName + " 항목의 값은 " + comp + "보다 크거나 같아야 합니다.");
	}

	return valid;
}


/**
 * noObj의 값이 comp 값보다 크거나 같은지 검사하여
 * 그렇다면 true를 그렇지 않으면 오류 메세지를 보여주고 커서가 해당 항목에
 * 위치하게 한 다음 false를 돌려 준다.
 *
 * @param fieldName 검사 항목 명.
 * @param noObj 비교 대상 수치값을 가지고 있는 객체.
 * @param comp 비교 값. no 값을 이 값과 비교하여 같은지 확인한다.
 */
function validateNoGEObj(noObj, fieldName, comp) {
	var valid = validateNoGE(noObj.value, fieldName, comp);

	if ( ! valid ) noObj.focus();

	return valid;
}

