﻿/**
 * 사용자 입력항목에 대한 체크를 담당하는 자바스크립트 객체 <BR>
 *
 * @version	1.0, 2003-12-16
 * @author	namjinpark
 *@constructor
 */
function InputChecker() {
	this.isAscii		 	= isAscii_InputChecker;
	this.isValidEmail	 	= isValidEmail_InputChecker;
	this.isValidImageFile	= isValidImageFile_InputChecker;
	this.isValidXmlFile		= isValidXmlFile_InputChecker;
	this.isValidMusicFile	= isValidMusicFile_InputChecker;
	this.isValidVideoFile	= isValidVideoFile_InputChecker;
	this.isValidFileExt		= isValidFileExt_InputChecker;
	this.isNum				= isNum_InputChecker;
	this.isNumberRange		= isNumberRange_InputChecker;
	this.isNonSpecial		= isNonSpecial_InputChecker;
	this.isValidUrl			= isValidUrl_InputChecker;
	this.validate			= validate_InputChecker;
}

/**
 * 입력항목 체크의 대상이 되는 Form 상의 단위 Input 요소 및 그에 대한 속성을 나타낸다.<BR>
 * @param	pm_oObject		Form의 입력 객체
 * @param	pm_sName		입력객체의 표시이름
 * @param	pm_bRequired	필수유무
 * @param	pm_iMin			문자열 길이의 최소 값 (-1 이면 최소 값이 없음)
 * @param	pm_iMax			문자열 길이의 최대 값 (-1 이면 길이 제한 없음)
 * @param	pm_sDataType	데이터타입 ("string" : 문자열 "num" : 숫자 "email" : 이메일)
 * @version	1.0, 2003-12-17
 * @author	namjinpark
 *@constructor
 */
function CheckField(pm_oObject, pm_sName, pm_bRequired, pm_iMin, pm_iMax, pm_sDataType) {
	/** Form의 입력 객체 */
	this.im_oObject 	= pm_oObject;

	/** 입력객체의 표시이름 */
	this.im_sName 		= pm_sName;

	/** 필수유무 */
	this.im_bRequired 	= pm_bRequired;

	/** 문자열 길이의 최소 값 (-1 이면 최소 값이 없음) */
	this.im_iMin 		= pm_iMin;

	/** 문자열 길이의 최대 값 (-1 이면 길이 제한 없음) */
	this.im_iMax 		= pm_iMax;

	/** 데이터타입 */
	this.im_sDataType 	= pm_sDataType;

	/** 입력 객체 설정 값*/
	this.im_sValue		= "";

	/** Form의 입력 객체가 배열 요소인지의 변수 */
	this.im_bArray		= false;
	switch (pm_oObject.type){
		case "file":
		case "text":
		case "textarea":
		case "password":
		case "hidden":
			this.im_sValue = this.im_oObject.value;
			break;
		case "select-one":
		case "select-multiple":
			if(this.im_oObject.selectedIndex != -1)
				this.im_sValue = this.im_oObject.options[this.im_oObject.selectedIndex].value;
			break;
		case "checkbox":
		case "radio":
			this.im_sValue = (this.im_oObject.checked ? this.im_oObject.value : "");
			break;
		default:
			if(this.im_oObject.length) {
				this.im_bArray = true;
				switch (pm_oObject[0].type){
					case "file":
					case "text":
					case "textarea":
					case "password":
					case "hidden":
						this.im_sValue = this.im_oObject[0].value;
						break;
					case "checkbox":
					case "radio":
						for(var i=0; i < this.im_oObject.length; i++) {
							this.im_sValue = (this.im_oObject[i].checked ? this.im_oObject[i].value : "");
							if(this.im_sValue != "") break;
						}
				}
			}
	}
}

/**
 * 입력항목 체크의 대상에 대해서 입력체크를 수행한다. <BR>
 * @param	pm_oObject		Form의 입력 객체
 * @param	pm_sName		입력객체의 표시이름
 * @param	pm_bRequired	필수유무
 * @param	pm_iMin			문자열 길이의 최소 값 (-1 이면 최소 값이 없음)
 * @param	pm_iMax			문자열 길이의 최대 값 (-1 이면 길이 제한 없음)
 * @param	pm_sDataType	테이터타입 ("num", "currency", "email", "string", "ascii", "nonspecial", "html")
 *							"html" 인 경우는 focus 처리를 수행하지 않는다.
 *@return	입력체크에 문제가 없는 경우는 true 아니면 false를 반환한다.
 */
function validate_InputChecker(pm_oObject, pm_sName, pm_bRequired, pm_iMin, pm_iMax, pm_sDataType) {
	var lm_oCheckField = new CheckField(pm_oObject, pm_sName, pm_bRequired, pm_iMin, pm_iMax, pm_sDataType);
	return validate2_InputChecker(lm_oCheckField);
}

/**
 * 입력항목 체크의 대상에 대해서 입력체크를 수행한다. <BR>
 *@param	pm_oCheckField	입력항목 객체
 *@return	입력체크에 문제가 없는 경우는 true 아니면 false를 반환한다.
 */
function validate2_InputChecker(pm_oCheckField) {
	var lm_bFocus = true;
	if(pm_oCheckField.im_sDataType == "html") lm_bFocus=false;

	//필수입력항목 체크
	if(pm_oCheckField.im_bRequired){
		if(pm_oCheckField.im_sValue == "") {
			alert(pm_oCheckField.im_sName + " is required.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}

	//최소길이 체크
	if(pm_oCheckField.im_sValue.length != 0 && pm_oCheckField.im_iMin != -1){
		if(pm_oCheckField.im_sValue.length < pm_oCheckField.im_iMin) {
			alert(pm_oCheckField.im_sName + " may consist of "+pm_oCheckField.im_iMin+" characters or more");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}

	//최대길이 체크
	if(pm_oCheckField.im_iMax != -1){
		if(pm_oCheckField.im_sValue.length > pm_oCheckField.im_iMax) {
			alert(pm_oCheckField.im_sName + " may consist of "+pm_oCheckField.im_iMax+" characters or less");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}

	//데이터 타입에 따른 체크
	if(pm_oCheckField.im_sDataType == "num") {
		if(isNum_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Only numeric characters are available.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}
	//Currency 체크
	if(pm_oCheckField.im_sDataType == "currency") {
		if(isCurrency_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Currency seems incorrect.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}
	//이메일 체크
	if(pm_oCheckField.im_sDataType == "email") {
		if(isValidEmail_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Email address seems incorrect.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}
	//홈페이지 체크
	if(pm_oCheckField.im_sDataType == "homepage") {
		if(isValidUrl_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Homepage seems incorrect.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}
	//Ascii 문자만 입력 가능 (한글입력 불가)
	if(pm_oCheckField.im_sDataType == "ascii") {
		if(isAscii_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Only ASCII characters are available.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}

	//특수문자 입력불가
	if(pm_oCheckField.im_sDataType == "nonspecial") {
		if(isNonSpecial_InputChecker(pm_oCheckField.im_sValue) == false) {
			alert("Special characters are not available.");
			if(lm_bFocus) focusCheckField_InputChecker(pm_oCheckField);
			return false;
		}
	}

	return true;
}

/**
 * 입력항목에 포커싱을 한다. <BR>
 *@param	pm_oCheckField	입력항목 객체
 */
function focusCheckField_InputChecker(pm_oCheckField) {
	if(pm_oCheckField.im_bArray) pm_oCheckField.im_oObject[0].focus();
	else pm_oCheckField.im_oObject.focus();
}

/**
 * 모든 문자열이 Ascii 문자열인지를 확인한다. <BR>
 * 한글입력을 금지하는 경우 사용할 수 있다.
 *
 * @param	pm_sStr		문자열
 * @return	모든 문자열이 Ascii 문자열이면 true 아니면 false
 */
function isAscii_InputChecker(pm_sStr) {
	var tlength = pm_sStr.length;
	for(var i=0; i < tlength; i++) {
		if(pm_sStr.charCodeAt(i) > 256) {
			return false;
		}
	}
	return true;
}

/**
 * 올바른 URL 문자열인지를 확인한다. <BR>
 *
 * @param	lm_sStr		문자열
 * @return	올바른 URL 문자열이면 true 아니면 false
 */
function isValidUrl_InputChecker(lm_sStr) {
	var lm_sReturn = lm_sStr.match(/\w{2,}:\/{2}([-\w]+\.)+\w+\S*/g);
	if(lm_sReturn != null) return true;
	return false;
}

/**
 * E-Mail 올바른 이메일 문자열인지를 반환한다.
 *
 * @param	lm_sStr		문자열
 * @return	올바른 이메일 문자열이면 true 아니면 false
 */
function isValidEmail_InputChecker(lm_sStr) {
	if(lm_sStr == null) return false;
	var lm_iIndex = lm_sStr.indexOf('@');
	if(lm_iIndex == -1 || lm_iIndex == 0 || lm_iIndex == lm_sStr.length-1) return false;
	return true;
}

/**
 * 적절한 이미지 파일 이름인지를 반환한다. (gif, jpg, bmp)
 *
 * @param	lm_sFileName	파일이름
 * @return	확장자가 적절한 이미지 파일이면 true 아니면 false
 */
function isValidImageFile_InputChecker(lm_sFileName) {
	if(lm_sFileName == null) return false;
	var lm_iIndex = lm_sFileName.lastIndexOf('.');
	if(lm_iIndex == -1) return false;
	var lm_sExt = lm_sFileName.toLowerCase().substr(lm_iIndex+1);
	if(lm_sExt == "gif" || lm_sExt == "jpg" || lm_sExt == "jpeg" || lm_sExt == "bmp") return true;
	return false;
}

/**
 * 허용된 파일 확장자 인지를 반환한다. (gif, jpg, bmp)
 *
 * @param	lm_sFileName	파일이름
 * @param	pm_oExtArray	허용된 파일 확장자 배열
 * @return	확장자가 적절한 이미지 파일이면 true 아니면 false
 */
function isValidFileExt_InputChecker(lm_sFileName, pm_oExtArray) {
	if(lm_sFileName == null) return false;
	var lm_iIndex = lm_sFileName.lastIndexOf('.');
	if(lm_iIndex == -1) return false;
	var lm_sExt = lm_sFileName.toLowerCase().substr(lm_iIndex+1);
	var lm_bFound = false;
	for(var i=0; i < pm_oExtArray.length; i++) {
		if(pm_oExtArray[i] == lm_sExt) return true;
	}
	return false;
}

/**
 * 적절한 XML 파일 이름인지를 반환한다. (xml)
 *
 * @param	lm_sFileName	파일이름
 * @return	확장자가 적절한 XML 파일이면 true 아니면 false
 */
function isValidXmlFile_InputChecker(lm_sFileName) {
	if(lm_sFileName == null) return false;
	var lm_iIndex = lm_sFileName.lastIndexOf('.');
	if(lm_iIndex == -1) return false;
	var lm_sExt = lm_sFileName.toLowerCase().substr(lm_iIndex+1);
	if(lm_sExt == "xml") return true;
	return false;
}

/**
 * 적절한 음악 파일 이름인지를 반환한다. (wma, mp3)
 *
 * @param	lm_sFileName	파일이름
 * @return	확장자가 적절한 이미지 파일이면 true 아니면 false
 */
function isValidMusicFile_InputChecker(lm_sFileName) {
	if(lm_sFileName == null) return false;
	var lm_iIndex = lm_sFileName.lastIndexOf('.');
	if(lm_iIndex == -1) return false;
	var lm_sExt = lm_sFileName.toLowerCase().substr(lm_iIndex+1);
	if(lm_sExt == "wma" || lm_sExt == "mp3") return true;
	return false;
}

/**
 * 적절한 동영상 파일 이름인지를 반환한다. (avi, asf, mpeg)
 *
 * @param	lm_sFileName	파일이름
 * @return	확장자가 적절한 이미지 파일이면 true 아니면 false
 */
function isValidVideoFile_InputChecker(lm_sFileName) {
	if(lm_sFileName == null) return false;
	var lm_iIndex = lm_sFileName.lastIndexOf('.');
	if(lm_iIndex == -1) return false;
	var lm_sExt = lm_sFileName.toLowerCase().substr(lm_iIndex+1);
	if(lm_sExt == "avi" || lm_sExt == "asf" || lm_sExt == "mpeg") return true;
	return false;
}

/**
 * 숫자값이 low 보다 크거나 같고 high 보다 작거나 같은지 검사한다.
 *
 * @param	lm_sFileName	파일이름
 * @return	확장자가 적절한 이미지 파일이면 true 아니면 false
 */
function isNumberRange_InputChecker(val, low, high){
    if(this.isNum(val) == false) return false;
    var lm_iNum = parseInt(val);
    if ( lm_iNum >= low && lm_iNum <= high){
        return true;
    } else {
        return false;
    }
}

/**
 * 입력값이 숫자인지를 확인한다. <BR>
 *@param	name	확인하려는 문자열
 *@return  입력값이 전부 숫자일 경우 true return, 숫자가 아닌 값이 포함되었을 경우 false return
 */
function isNum_InputChecker(name) {
    var ch = "\0";
	var flag = true;

    for (var i = 0, ch = name.charAt(i);
        (i < name.length) && (flag); ch = name.charAt(++i)) {
        if ((ch >= '0') && (ch <= '9'))
        	;
        else if( (i == 0)&&(ch == '-'))
        	;
        else
            flag = false;
    }
    return flag;
}

/**
 * 입력값이 화폐인지를 확인한다. <BR>
 *@param	name	확인하려는 문자열
 *@return  입력값이 숫자, ",", "." 인 경우 true return, 그 외의 문자를 포함하는 하는 false
 */
function isCurrency_InputChecker(name) {
    var ch = "\0";
	var flag = true;

    for (var i = 0, ch = name.charAt(i);
        (i < name.length) && (flag); ch = name.charAt(++i)) {
        if ((ch >= '0') && (ch <= '9'))
        	;
        else if( (i == 0)&&(ch == '-'))
        	;
        else if(ch == ',' || ch == '.')
        	;	
        else
            flag = false;
    }
    return flag;
}

/**
 * 문자열 중에 특수문자가 포함되었는지를 파악한다.
 *@param	name 	문자열
 *@return	입력값에 특수 문자가 하나도 포함되지 않았을 경우 true return
 */
function isNonSpecial_InputChecker(name) {

    var ch = "\0";

    for (var i = 0, ch = name.charAt(i);
        i <name.length; ch = name.charAt(++i)) {
        if ( ch == ' ' || ch == '~' || ch == '`' || ch == '\\'||
             ch == '-' || ch == '_' || ch == '|' || ch == '+' ||
             ch == '=' || ch == ',' || ch == '.' || ch == '/' ||
             ch == '<' || ch == '>' || ch == '?' || ch == '!' ||
             ch == '@' || ch == '#' || ch == '$' || ch == '%' ||
             ch == '^' || ch == '&' || ch == '*' || ch == '(' ||
             ch == ')' || ch == '\"' || ch == '[' || ch == ']' ||
             ch == ':' || ch == ';' || ch == '\'' || ch == '{' ||
             ch == '}' ) {
            return false;
        }
    }
    return true;
}
