﻿/*     
	02/04/2009
	Form Validator KLIB Javascript Library based jquery
	Copyright(C) 2009 Keon-Jun Lee(ch4feel@naver.com)

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

try {
	$k.klib;
} 
catch (e) {
	alert('Form Validator have to use kblib.core.js');
}


$k.formValidator = {
	
	// 검사항목
	validationTable : [
		'REQUIRED',			// 필수입력
		'USERID',				// USER ID (영숫자가능 첫글자는 영문자)
		'EQUAL',				// 설정된 모든 요소의 값이 일치
		'EMAIL',				// 이메일주소
		'MIN',					// 최소길이
		'MAX',					// 최대길이
		'NOSC',					// 특수문자 사용불가
		'HAN',					// 한글만 가능
		'ENG',					// 영문만 가능
		'NUM',					// 숫자만 가능
		'ENGNUM',				// 영문, 숫자만 가능
		'CHKMIN',				// 체크박스 최소 선택
		'CHKMAX'				// 체크박스 최대 선능
	],
	
	// 기본 에러 메세지 설정
	setDefaultMsg : function() {
		$k.formValidator.setMsg('REQUIRED',	'값을 입력해주세요.');
		$k.formValidator.setMsg('USERID',		'ID는 영문자로 시작해야 합니다..');
		$k.formValidator.setMsg('EQUAL',		'값이 일치하지 않습니다.');
		$k.formValidator.setMsg('EMAIL',		'올바른 이메일 주소를 입력하세요.');
		$k.formValidator.setMsg('MIN', 			'길이가 너무 짧습니다.');
		$k.formValidator.setMsg('MAX', 			'길이가 너무 깁니다.');
		$k.formValidator.setMsg('NOSC',	 		'특수문자는 사용하실 수 없습니다.');
		$k.formValidator.setMsg('HAN', 			'한글만 입력하십시오.');
		$k.formValidator.setMsg('ENG',		 	'영문만 입력하십시오.');
		$k.formValidator.setMsg('NUM', 			'숫자만 입력하십시오.');
		$k.formValidator.setMsg('ENGNUM', 	'영문과 숫자만 입력하십시오.');
		$k.formValidator.setMsg('CHKMIN', 	'너무 적게 선택하셨습니다.');
		$k.formValidator.setMsg('CHKMAX', 	'너무 많이 선택하셨습니다.');
	},	
	
	// 내부 변수
	invalidCode : null,
	invalidElement : null,
	validEQ : {},
	invalidMsg : [],
	frmElement : null,
	
	// 초기화
	init : function() {
		$k.formValidator.invalidElement = null;
		$k.formValidator.invalidCode = null;
		$k.formValidator.validEQ = {};
	},
	
	// Validator 생성자
	build : function(option) {
		
		var param = {
			confirm : false,
			confirmMsg : '등록하시겠습니까?',
			ready : null,
			success : null
		};
		
		if(option) {
			jQuery.extend(param, option);
		}
		
		$k.formValidator.setDefaultMsg();
		$k.formValidator.frmElement = jQuery(this);
		
		return jQuery(this).each(function() {
			
			jQuery(this).submit(function(){
				
				var $inputs = jQuery(this).find(':input').filter(':not(:submit)').filter(':not(:image)').filter(':not(.NOVALID)');
				
				if(param.ready != null) {
					if(!param.ready()) {
						return false;
					}
				}

				$inputs.each($k.formValidator.validate);

				if ($k.formValidator.invalidCode != null) {
					if($k.formValidator.invalidElement.attr($k.formValidator.validationTable[$k.formValidator.invalidCode])){
						alert($k.formValidator.invalidElement.attr($k.formValidator.validationTable[$k.formValidator.invalidCode]));
					} else {
						alert($k.formValidator.invalidMsg[$k.formValidator.invalidCode]);
					}
					$k.formValidator.invalidElement.focus();
					$k.formValidator.invalidElement.select();
					$k.formValidator.init();
					return false;
				}	else {
					if(param.success != null) {
						if(!param.success()) {
							return false;
						}
					}
					
					if(param.confirm) {
						if(!confirm(param.confirmMsg)) {
							return false;
						}
					}
					return true;
				}				
			});
			
		});
	},
	
	// 세부 폼 유효성검사
	validate : function(i) {
		
		if($k.formValidator.invalidCode == null) {
			
			var $val = jQuery(this).val().trim();
			
			// Test for REQUIRED
			if(jQuery(this).hasClass('REQUIRED')) {
				if(jQuery(this).attr('type').toUpperCase() == 'RADIO') {
					var isCheck = false;
					jQuery($k.formValidator.frmElement).find(':radio[name="'+ jQuery(this).attr('name') +'"]').each(function(){
						if(jQuery(this).attr('checked') == true) isCheck = true;
					});
					if(!isCheck) {
						$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'REQUIRED');
						$k.formValidator.invalidElement = jQuery(this);
					}
				} else if ($val.length == 0) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'REQUIRED');
					$k.formValidator.invalidElement = jQuery(this);
				}
			}
			
			// Test for USERID
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('USERID')) {
				if($val.length != 0 && !$val.match(/^[a-zA-z]{1}[0-9a-zA-Z]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'USERID');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for EMAIL
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('EMAIL')) {
				if($val.length != 0 && !$val.match(/\w+([-+.]\w+)*@\w+([-.]\w+)*\.[a-zA-Z]{2,4}$/)){
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'EMAIL');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for NOSC
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('NOSC')) {
				if($val.length != 0 && !$val.match(/^[가-힣a-zA-Z0-9]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'NOSC');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for HAN
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('HAN')) {
				if($val.length != 0 && !$val.match(/^[가-힣]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'HAN');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for ENG
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('ENG')) {
				if($val.length != 0 && !$val.match(/^[a-zA-Z]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'ENG');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for NUM
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('NUM')) {
				if($val.length != 0 && !$val.match(/^[0-9]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'NUM');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for ENGNUM
			if ($k.formValidator.invalidCode == null && jQuery(this).hasClass('ENGNUM')) {
				if($val.length != 0 && !$val.match(/^[0-9a-zA-Z]+$/)) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'ENGNUM');
					$k.formValidator.invalidElement = jQuery(this);
				}
	  	}
			
			// Test for MIN length
			if ($k.formValidator.invalidCode == null && $k.getClassVar(jQuery(this).attr('class'),'MIN') != null) {
				var minLength = $k.getClassVar(jQuery(this).attr('class'),'MIN');
				if($val.length != 0 && $val.bytes() < minLength) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'MIN');
					$k.formValidator.invalidElement = jQuery(this);
				}
			}
			
			// Test for MAX length
			if ($k.formValidator.invalidCode == null && $k.getClassVar(jQuery(this).attr('class'),'MAX') != null) {
				var maxLength = $k.getClassVar(jQuery(this).attr('class'),'MAX');
				if($val.length != 0 && $val.bytes() > maxLength) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'MAX');
					$k.formValidator.invalidElement = jQuery(this);
				}
			}
			
			// Test for EQUAL
			if ($k.formValidator.invalidCode == null && $k.getClassVar(jQuery(this).attr('class'),'EQUAL') != null) {
				if($val.length != 0 && eval('$k.formValidator.validEQ.'+$k.getClassVar(jQuery(this).attr('class'),'EQUAL'))) {
					if(eval('$k.formValidator.validEQ.'+$k.getClassVar(jQuery(this).attr('class'),'EQUAL')) != $val) {
						$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'EQUAL');
						$k.formValidator.invalidElement = jQuery(this);	
					}
				} else {
					eval('$k.formValidator.validEQ.'+$k.getClassVar(jQuery(this).attr('class'),'EQUAL')+'="'+$val+'";');
				}
	  	}
			
			// Test for CHKMIN
			if ($k.formValidator.invalidCode == null && $k.getClassVar(jQuery(this).attr('class'),'CHKMIN') != null) {
				var chkCount = 0;
				jQuery($k.formValidator.frmElement).find(':checkbox[name="'+ jQuery(this).attr('name') +'"]').each(function(){
					if(jQuery(this).attr('checked') == true) chkCount++;
				});
				if (chkCount < $k.getClassVar(jQuery(this).attr('class'),'CHKMIN')) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'CHKMIN');
					$k.formValidator.invalidElement = jQuery(this);	
				}
			}
			
			// Test for CHKMAX
			if ($k.formValidator.invalidCode == null && $k.getClassVar(jQuery(this).attr('class'),'CHKMAX') != null) {
				var chkCount = 0;
				jQuery($k.formValidator.frmElement).find(':checkbox[name="'+ jQuery(this).attr('name') +'"]').each(function(){
					if(jQuery(this).attr('checked') == true) chkCount++;
				});
				if (chkCount > $k.getClassVar(jQuery(this).attr('class'),'CHKMAX')) {
					$k.formValidator.invalidCode = $k.index($k.formValidator.validationTable, 'CHKMAX');
					$k.formValidator.invalidElement = jQuery(this);	
				}
			}
			
		}

	},
		
	// 에러 메세지 설정 함수
	setMsg : function(err, msg) {
		$k.formValidator.invalidMsg[$k.index($k.formValidator.validationTable, err)] = msg;
	},
	
	// 요소별 에러 메세지 설정 함수
	setElementMsg : function(err, msg) {
		jQuery(this).each(function() {
			jQuery(this).attr(err, msg);
		});
	},
	
	// 자동 포커스 이동 함수
	setNextFocus : function(nextId, maxLength) {
		jQuery(this).each(function(){
			maxLength = maxLength ? maxLength : $k.getClassVar(jQuery(this).attr('class'),'MAX');
		
			if (!maxLength) {
				alert('최대길이를 지정하세요.');
				return false;
			}
			
			jQuery(this).keyup(function(){
				if(jQuery(this).val().trim().bytes() >= maxLength)
					jQuery(nextId).focus();
			});
		})
	}
}

jQuery.fn.extend({
	setElementMsg : $k.formValidator.setElementMsg,
	formValidate : $k.formValidator.build,
	setFormMsg : $k.formValidator.setMsg,
	setNextFocus : $k.formValidator.setNextFocus
});