/*-------------------------------------------------------------------+
 * 1. 파일명: key.js
 * 2. 설  명: Key 입력을 제한하기 위한 함수를 정의한다.
 * 3. 의존성: string.js
 * 4. 작성일: 2006.10.10.
 -------------------------------------------------------------------*/



/**
 * 눌린 키가 Control Key이면 true, 아니면 false
 */
function isControlKey() {
	var key = event.keyCode;

	return (
		   key ==   8  // <BS>
		|| key ==   9  // <Tab>
		|| key ==  13  // <Enter>
		|| key ==  35  // <End>
		|| key ==  36  // <Home>
		|| key ==  37  // <←>
		|| key ==  39  // <→>
		|| key ==  46  // <Del>
		|| key == 144  // <NumLock>
	);
}


/**
 * 눌린키가 숫자키면 true, 아니면 false
 */
function isDigitKey() {
	var key = event.keyCode;

	return ( key >= 48 && key <= 57 ) || ( key >= 96 && key <= 105 );
}


/**
 * 눌린키가 특수문자키이면 true, 아니면 false;
 */
function isSpecialCharKey() {

}

/**
 * 숫자만 입력되게 한다.
 */
function limitAsDigit() {
	event.returnValue = isControlKey() || isDigitKey();
}


/**
 * 정수만 입력받고자 하는 경우의 onKeyDown이벤트 핸들러
 */
function limitAsInt(limit) {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}

	var key = event.keyCode;
	var str = event.srcElement.value;

	var intLengthValid = true;

	// 정수 자리수가 찼는지 검사하여 찼으면
	// 더 이상 입력할 수 없게 한다. 이 때 자릿수에서
	// 앞에 양음 기호(+/-)는 제한다.
	if ( limit != undefined ) {
		var intLength = removeChar(str, ',').length;
		if ( str.charAt(0) == '-' || str.charAt(0) == '+' ) {
			intLength--;
		}

		intLengthValid = intLength < limit;
	}

	event.returnValue = intLengthValid && (
		isDigitKey()
		|| key == 189 || key == 109 // <->
	);
}


/**
 * 양의 정수만 입력받고자 하는 경우의 onKeyDown이벤트 핸들러
 */
function limitAsPlusInt(limit) {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}

	var key = event.keyCode;
	var str = event.srcElement.value;

	var intLengthValid = true;

	// 정수 자리수가 찼는지 검사하여 찼으면
	// 더 이상 입력할 수 없게 한다.
	if ( limit != undefined ) {
		intLengthValid = removeChar(str, ',').length < limit;
	}

	event.returnValue = intLengthValid && isDigitKey();
}


/**
 * 실수를 입력받고자 하는 경우의 onKeyDown이벤트 핸들러
 */
function limitAsFloat(limit) {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}

	var str = event.srcElement.value;
	var key = event.keyCode;

	var dotNoValid = true;

	// 소숫점 자리수가 찼는지 검사하여 찼으면
	// 더 이상 입력할 수 없게 한다.
	if ( limit != undefined ) {
		var dotIndex = str.lastIndexOf('.');

		if ( dotIndex > -1 ) {
			dotNoValid = str.length - dotIndex - 1 < limit;
		}
	}

	var dotValid = true;

	// 소숫점이 이미 찍혔으면 소숫점은 더 찍지 못하게 한다.
	if ( str.indexOf('.') > -1 && ( key == 190 || key == 229 ) ) {
		dotValid = false;
	}

	event.returnValue = dotValid && dotNoValid && (
		isDigitKey()
		|| key == 189 || key == 109 // <->
		|| key == 190 || key == 229 || key == 110 // <.>
	);
}


/**
 * 양의 실수를 입력받고자 하는 경우의 onKeyDown이벤트
 */
function limitAsPlusFloat(limit) {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}
	var str = event.srcElement.value;
	var key = event.keyCode;

	var dotNoValid = true;

	// 소숫점 자리수가 찼는지 검사하여 찼으면
	// 더 이상 입력할 수 없게 한다.
	if ( limit != undefined ) {
		var dotIndex = str.lastIndexOf('.');

		if ( dotIndex > -1 ) {
			dotNoValid = str.length - dotIndex - 1 < limit;
		}
	}

	var dotValid = true;

	// 소숫점이 이미 찍혔으면 소숫점은 더 찍지 못하게 한다.
	if ( str.indexOf('.') > -1 && ( key == 190 || key == 229 ) ) {
		dotValid = false;
	}

	event.returnValue = dotValid && dotNoValid && (
		 isDigitKey()
		|| key == 190 || key == 229 || key == 110 // <.>
	);
}

/**
 * 한글과 스페이스 Key만 허용한다.
 */
function limitAsHangul() {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}

	var key = event.keyCode;

	event.returnValue = (
		key == 32      // 스페이스키
		|| key == 229  // 한글키. 근데 왜 한글은 무조건 229일까?
	);
}


/**
 * 한글과 숫자, 스페이스 Key만 허용한다.
 */
function limitAsHangulAndNo() {
	if ( isControlKey() ) {
		event.returnValue = true;
		return ;
	}

	var key = event.keyCode;

	event.returnValue = isDigitKey() || (
		key == 32      // 스페이스키
		|| key == 229  // 한글키. 근데 왜 한글은 무조건 229일까?
	);
}


/**
 * 특정한 Key Code 값일 때 주어진 함수를 호출한다.
 *
 * @param <int> keyCode 키코드 값.
 * @param caleeFunc 호출할 함수 혹은 함수 문자열. 문자열인 경우 eval에 의해 호출된다.
 */
function callIfKeyCodeIs(keyCode, calleeFunc) {
	event.returnValue = (event.keyCode != keyCode );

	if ( event.keyCode == keyCode ) {
		if ( typeof(calleeFunc) == "function" ) {
			calleeFunc.call();
		}
		else if ( typeof(calleeFunc) == "string" ) {
			eval(calleeFunc);
		}
		else {
			alert(calleeFunc + " 는 호출할 수 있는 함수가 아닙니다.");
		}
	}
}


/**
 * Enter 키가 눌렸을 때 주어진 함수를 호출한다.
 *
 * @param caleeFunc 호출할 함수 혹은 함수 문자열. 문자열인 경우 eval에 의해 호출된다.
 */
function callIfEnter(calleeFunc) {
	callIfKeyCodeIs(13, calleeFunc);
}

