﻿/// <reference path="jquery-1.3.2-vsdoc.js" />

/*
// 필수 여부 설정시 별도의 지정이 없면 기본적으로 설정값으로 지정
// 필수 여부가 false 일 경우 입력된 데이터가 있을 경우만 검사
Validation.isAllRequire = true | false

//단일 체크시
var a = {
	obj: document.getElementById('id'),
	charType: 'num en ko',
	charMsg: 'charMsg',
	dataType: '', email url ssn trim
	dataMsg: 'dataMsg',
	min: '1',
	minMsg: 'minMsg',
	max: '10',
	maxMsg: 'maxMsg',
	radioGroupName: 'ccc',
	radioMsg: 'radioMsg',
	checked: true,
	checkedMsg : 'checkedMsg',
	selected:true,
	selectedMsg : 'selectedMsg',
	isRequire : true
};

var result = Validation.Check(a);

//다중 체크시
var arrObj = new Array();
arrObj.push({
	obj: document.getElementById('id'),
	charType: 'num en ko',
	charMsg: 'charMsg',
	dataType: '', email url ssn trim
	dataMsg: 'dataMsg',
	min: '1',
	minMsg: 'minMsg',
	max: '10',
	maxMsg: 'maxMsg',
	radioGroupName: 'ccc',
	radioMsg: 'radioMsg',
	checked: true,
	checkedMsg : 'checkedMsg',
	selected:true,
	selectedMsg : 'selectedMsg',
	isRequire : true
});

arrObj.push({
	obj: document.getElementById('id'),
	charType: 'num en ko',
	charMsg: 'charMsg',
	dataType: '', email url ssn trim
	dataMsg: 'dataMsg',
	min: '1',
	minMsg: 'minMsg',
	max: '10',
	maxMsg: 'maxMsg',
	radioGroupName: 'ccc',
	radioMsg: 'radioMsg',
	checked: true,
	checkedMsg : 'checkedMsg',
	selected:true,
	selectedMsg : 'selectedMsg',
	isRequire : true
});

var result = Validation.Check(arrObj);
*/

var Validation = {};

Validation.pattern = {
	num:/[^0-9]/,
	en: /[^a-z]/i,
	ko: /[^ㄱ-힣]/,
	num_en: /[^0-9^a-z]/i,
	num_ko: /[^0-9^ㄱ-힣]/,
	en_ko: /[a-z^ㄱ-힣]/i,
	num_en_ko:/[^0-9^a-z^ㄱ-힣]/i,
	email:/^([a-z0-9_.-])+@(([a-z0-9-])+.)+([a-z0-9]{2,4})+$/i,
	url:/^https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w/_\.]*(\?\S+)?)?)?/i,
	ssn:/[0-9]{2}[01]{1}[0-9]{1}[0123]{1}[0-9]{1}-[1234]{1}[0-9]{6}$/,
	trim:/[^\s]/,
	id:/[ㄱ-힣\']/
};

Validation.isAllRequire = true;
Validation.isAllFocus = true;

Validation.Check = function(options) {
	Validation.isValid = true;
	if(typeof(options) != 'undefined' && options.length > 0){
		var isValid = true;
		var cnt = options.length;		
		for(var i = 0 ; i < cnt ; i++){
			Validation.SingleCheck(options[i]);
			if(!Validation.isValid) break;	
		}

		return Validation.isValid;
	}
	else{
		Validation.SingleCheck(options);
		return Validation.isValid;
	}
}

Validation.SingleCheck = function(params) { 	
	var options = {
		obj : '',
		trim: false,
		trimMsg : '',
		charType : '',
		charMsg : '',
		dataType : '',
		dataMsg : '',
		min : -1,
		minMsg : '',
		max : 0,
		maxMsg : '',
		radioGroupName : '',
		radioMsg : '',
		selected : false,
		selectedMsg : '',
		checked : false,
		checkedMsg : '',
		//비밀번호 확인
		compare : false,
		compareObj : '',
		compareMsg : '',
		isRequire : true,
		isFocus : false
	};

	options.isRequire = Validation.isAllRequire;
	options.isFocus = Validation.isAllFocus;

	for (key in params) {               
        options[key] = params[key];
    }	

	if(options.trim && Validation.isValid) 
		Validation.CheckTrim(options.obj, options.trimMsg, options.isRequire, options.isFocus);

	if(options.charType != '' && Validation.isValid) 
		Validation.CheckChar(options.obj, options.charType, options.charMsg, options.isRequire, options.isFocus);

	if(options.dataType != '' && Validation.isValid) 
		Validation.CheckData(options.obj, options.dataType, options.dataMsg, options.isRequire, options.isFocus);

	if(options.min > -1 && Validation.isValid) 
		Validation.CheckMin(options.obj, options.min, options.minMsg, options.isRequire, options.isFocus);

	if(options.max > 0 && Validation.isValid) 
		Validation.CheckMax(options.obj, options.max, options.maxMsg, options.isRequire, options.isFocus);

	if(options.radioGroupName != '' && Validation.isValid) 
		Validation.CheckRadio(options.radioGroupName, options.radioMsg);

	if(options.selected && Validation.isValid) 
		Validation.CheckSelected(options.obj, options.selectedMsg, options.isFocus);

	if(options.checked && Validation.isValid) 
		Validation.CheckChecked(options.obj, options.checkedMsg, options.isFocus);
		
	//비밀번호 확인
	if(options.compare && Validation.isValid)
	    Validation.CheckCompare(options.obj, options.compareObj, options.compareMsg, options.isRequire, options.isFocus);

}

Validation.CheckTrim = function(obj, msg, isRequire, isFocus){
	var objVal = typeof(obj) == 'string' ? obj : obj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && objVal.length == 0) return;
	
	if(!Validation.pattern.trim.test(objVal)){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}
}

Validation.CheckChar = function(obj, charType, msg, isRequire, isFocus){
	var objVal = typeof(obj) == 'string' ? obj : obj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && objVal.length == 0) return;

	var arrCharType = charType.toLowerCase().split(' ');

	var cnt = arrCharType.length;
	var isUseNum = false;
	var isUseEn = false;
	var isUseKo = false;
	var isId = false;

	for(var i = 0 ; i < cnt ; i++){
		switch(arrCharType[i]){
			case 'num':
				isUseNum = true;
				break;
			case 'en':
				isUseEn = true;
				break;
			case 'ko':
				isUseKo = true;
				break;
    	    case 'id':
    	        isId = true;
    	        break;
		}
	}

	var pattern = null;
	if(isUseNum && isUseEn && isUseKo)
		pattern = Validation.pattern.num_en_ko;
	else if(isUseNum && isUseEn)
		pattern = Validation.pattern.num_en;
	else if(isUseNum && isUseKo)
		pattern = Validation.pattern.num_ko;
	else if(isUseEn && isUseKo)
		pattern = Validation.pattern.en_ko;
	else if(isUseNum)
		pattern = Validation.pattern.num;
	else if(isUseEn)
		pattern = Validation.pattern.en;
	else if(isUseKo)
		pattern = Validation.pattern.ko;
	else if(isId)
	    pattern = Validation.pattern.id;

	if(pattern == null){
		Validation.SetInvalidData('charType은 num en ko 가 포함되어 있어야 합니다.', isFocus);
		return false;
	}
	else if(objVal.length == 0 || pattern.test(objVal)){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.CheckData = function(obj, dataType, msg, isRequire, isFocus){	
	var objVal = typeof(obj) == 'string' ? obj : obj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && objVal.length == 0) return;

	var pattern = null;
	switch(dataType.toLowerCase()){
		case 'email':
			pattern = Validation.pattern.email;
			break;
		case 'url':
			pattern = Validation.pattern.url;
			break;
		case 'ssn':
			pattern = Validation.pattern.ssn;
			break;
		case 'trim':
			pattern = Validation.pattern.trim;
			break;
		case 'password':
		    var cnt = 0;
		    if(/[a-zA-Z]/.test(objVal))
		        cnt += 1;
		    if(/[0-9]/.test(objVal))
		        cnt += 1;
		    if(/[\W|\s]/.test(objVal))
		        cnt += 1;
		        
		    if(cnt >= 2)
		    {
		        return true;
		    }
		    else
		    {
		        Validation.SetInvalidData(obj, msg, isFocus);
		        return false;
		    }
		    break;
		case 'nickname':
		    var cnt = 0;
		    var pattern = null;
		    pattern = Validation.pattern.num_en_ko;
		    
		     for(var i=0; i< objVal.length; i++)
		    {
		        var ch = objVal.charCodeAt(i);
		        
		        if(!(( 0xAC00 <= ch && ch <= 0xD7A3 ) || ( 0x3131 <= ch && ch <= 0x318E ) || 
		            (  0x61 <= ch && ch <= 0x7A ) || ( 0x41 <= ch && ch <= 0x5A ) || (  0x30 <= ch && ch <= 0x39 ))){
		            Validation.SetInvalidData(obj, '닉네임은 한글/영문/숫자만 사용 가능합니다.', isFocus);
		            return false;
		            break;
		       }
		    }
		    if(/[ㄱ-힣]{2,}/.test(objVal))
		        cnt += 1;
		        
		    if(cnt >= 1)
		    {
		        return true;
		    }
		    else
		    {
		        Validation.SetInvalidData(obj, msg, isFocus);
		        return false;
		    }
		    break;
	}

	if(pattern == null){
		Validation.SetInvalidData('dataType은 email url ssn trim 중 하나가 포함되어 있어야 합니다.', isFocus);
		return false;
	}
	else if(objVal.length == 0 || !pattern.test(objVal)){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.CheckMin = function(obj, min, msg, isRequire, isFocus){	
	var objVal = typeof(obj) == 'string' ? obj : obj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && objVal.length == 0) return;

	if(objVal.length < parseInt(min)){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.CheckMax = function(obj, max, msg, isRequire, isFocus){	
	var objVal = typeof(obj) == 'string' ? obj : obj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && objVal.length == 0) return;

	if(objVal.length > parseInt(max)){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.CheckRadio = function(radioGroupName, msg){
	var arrRadio = document.getElementsByName(radioGroupName);

	var isChecked = false;
	var cnt = arrRadio.length;
	for(var i = 0 ; i < cnt ; i++){
		if(arrRadio[i].checked){
			isChecked = true;
			break;
		}
	}

	if(!isChecked){
		alert(msg);
		Validation.isValid = false;
		return false;
	}
}

Validation.CheckSelected = function(obj, msg, isFocus){		
	if(obj.selectedIndex == 0){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.CheckChecked = function(obj, msg, isFocus){		
	if(!obj.checked){
		Validation.SetInvalidData(obj, msg, isFocus);
		return false;
	}				
}

Validation.SetInvalidData = function(obj, msg, isFocus){	
	alert(msg);
	Validation.isValid = false;
	if(typeof(obj) == 'object' && isFocus) obj.focus();
	return false;
}

//비밀번호 확인
Validation.CheckCompare = function(obj, compareObj, msg, isRequire, isFous){
    var objVal = typeof(obj) == 'string' ? obj : obj.value;
    var compareObjVal = typeof(obj) == 'string' ? compareObj : compareObj.value;
	if(typeof(isRequire) != 'undefined' && !isRequire && (objVal.length == 0 || compareObjVal.length == 0)) return;
	
	if(objVal != compareObjVal){
	    Validation.SetInvalidData(obj, msg, isFous);
	    return false;
	}
}


Validation.GetObjectLength = function(obj) {
    var p, len = 0;  // 한글문자열 체크를 위함
    for (p = 0; p < obj.value.length; p++) {
        (obj.value.charCodeAt(p) > 255) ? len += 2 : len++;  // 한글체크
    }
    return len;
}