//#######################################	validation pattern #############################################
/**
	Regular Expression
	. : 임의의 한 문자
	* : 바로 앞의 표현에 대한 출현횟수가 0~무한대
	+ : 바로 앞의 표현에 대한 출현횟수가 1~무한대
	? : 바로 앞의 표현에 대한 출현횟수가 0~1
	^ : 바로 뒤의 표현으로 시작
	$ : 바로 앞의 표현으로 종료
	[] : [] 안의 문자나 숫자 중 하나
	{} : 출현횟수	ex) {0,1} - 0 또는 1회 / {x} - x회 / {x,} - x회~무한대
	() : 그룹화
	[^x~z] : x~z 가 아닌 것
 	\w : 모든 영문자와 숫자
 	\W : 모든 영문자와 숫자를 제외한 나머지 문자
 	\s : 공백문자
 	\S : 공백문자가 아닌 나머지 문자
 	\d : 숫자
 	\D : 숫자가 아닌 나머지 문자
*/
	
var patternNum = new RegExp(/^[0-9]+$/);																		//숫자
var patternDecimal = new RegExp(/^[0-9]+[.]*[0-9]+$/);															//실수형식? 	123.221
var patternHangul = new RegExp(/^[가-힣]*$/); 																	//한글
var patternHangulNum = new RegExp(/^[가-힣0-9]*$/); 																//한글+숫자
var patternAlpha = new RegExp(/^[a-zA-Z]+$/); 																	//영문자
var patternHangulAlpha = new RegExp(/^[가-힣a-zA-Z]+$/); 																	//영문자
var patternId = new RegExp(/^[a-zA-Z]{1}[a-zA-Z0-9_-]{4,15}$/);													//아이디형식(4자에서 15자리 / 영문,숫자 입력가능 / 첫문자열은 영문)
var patternCellPhoneNo = new RegExp(/^(01)[016789]-?[0-9]{3,4}-?[0-9]{4}/);										//휴대폰 번호
var patternPhoneNo = new RegExp(/^(02|[0]{1}[3-7]{1}[0-9]{1})-?([0-9]{3,4})-?([0-9]{4})$/); 					//전화번호
var patternAlphaNum = new RegExp(/^[_a-zA-Z0-9]+$/);															//영문자,숫자
var patternDate = new RegExp(/^([1][9]\d{2}|[2][0]\d{2})-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[0-1])$/);			//등록일자 
var patternEmail = new RegExp(/^[_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(([0-9]{1,3})|([a-zA-Z]{2,3})|(aero|coop|info|museum|name))$/);	//이메일
var patternRRN = new RegExp(/^(?:[0-9]{2}(?:0[1-9]|1[0-2])(?:0[1-9]|[1,2][0-9]|3[0,1]))(\-|)[1-4][0-9]{6}$/);	//주민등록번호
var patternTime = new RegExp(/^(20|21|22|23|[0-1]?\d):[0-5]?\d$/);	//시간 형식 00:00


//#######################################	validation factory #############################################
//유형별 function 생성 	
function validateFactory(_pattern)
{
	var pattern = _pattern;
	return function(_obj, _msg)
	{
		if(!pattern.test(_obj.val()))
		{
			_obj.css("background-color", "#FFFFCC");
			_obj.focus();
			_obj.val("");
			alert(_msg);
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		};
		return true;
	};
}

function validateFactory2(_pattern, _pattern2)
{
	var pattern = _pattern;
	var pattern2 = _pattern2;
	return function(_obj, _msg)
	{
		if(!pattern.test(_obj.val()) && !pattern2.test(_obj.val()))
		{
			_obj.css("background-color", "#FFFFCC");
			_obj.focus();
			_obj.val("");
			alert(_msg);
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		};
		return true;
	};
}
	
//숫자 형식 체크
var validateNum = validateFactory(patternNum);

//소수점 형식 및 자리 체크 (_length 가 없으면 기본 소수점 3자리까지만 입력가능)
function validateDecimal(_obj, _msg, _length)
{
	if(!patternDecimal.test(_obj.val()))
	{
		alert(_msg);
		_obj.css("background-color", "#FFFFCC");
		_obj.focus();
		_obj.val("");
		return false;
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");
	}
	
	if(_length == undefined)
	{
		var length = 3;	//default
	}
	
	if(_obj.val().lastIndexOf(".") != -1)
	{
		if(_obj.val().split(".")[1].length > _length)
		{
			alert("소수점 자리수는 " + _length + "자리 까지만 입력 가능합니다.");
			_obj.css("background-color", "#FFFFCC");
			_obj.focus();
			_obj.val("");
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		}
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");
	}
	return true;
}

//한글 형식 체크
var validateHangul = validateFactory(patternHangul);

//한글+숫자 형식 체크
var validateHangulNum = validateFactory(patternHangulNum);

//한글+영문 형식 체크
var validateHangulAlpha = validateFactory(patternHangulAlpha);

//알파벳 형식 체크
var validateAlpha = validateFactory(patternAlpha);

//아이디 형식 체크
var validateId = validateFactory(patternId);

//길이 체크
function validateLength(_obj, _msg, _length)
{
	if(_length != undefined)
	{
		if(_obj.val().length > _length)
		{
			_obj.css("background-color", "#FFFFCC");
			_obj.val(_obj.val().substring(0, _length));
			_obj.focus();
			alert(_msg);
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		}
	}
	return true;
}

//길이 체크
function validateLength2(_obj, _msg, _length)
{
	if(_length != undefined)
	{
		if(_obj.val().length != _length)
		{
			_obj.css("background-color", "#FFFFCC");
			_obj.val("");
			_obj.focus();
			alert(_msg);
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		}
	}
	return true;
}

function validateLength3(_obj, _msg, _length)
{
	if(_length != undefined)
	{
		if(_obj.val().length < _length)
		{
			_obj.css("background-color", "#FFFFCC");
			_obj.val("");
			_obj.focus();
			alert(_msg);
			return false;
		}
		else
		{
			_obj.css("background-color", "#FFFFFF");
		}
	}
	return true;
}

//휴대폰번호 형식 체크
var validateCellPhoneNo = validateFactory(patternCellPhoneNo);   

//전화번호 형식 체크
var validatePhoneNo = validateFactory(patternPhoneNo);

//휴대폰 & 전화번호 형식 체크
var validateCellPhoneNo2 = validateFactory2(patternPhoneNo, patternCellPhoneNo);

//알파벳 또는 숫자 형식 체크
var validateAlphaNum = validateFactory(patternAlphaNum);

//등록일자 형식 체크
function validateDate(_obj, _msg)
{
	var dateFormat = _obj.val().match(patternDate);
	
	if(dateFormat == null)
	{
		_obj.css("background-color", "#FFFFCC");
		_obj.focus();
		_obj.val("");
		alert(_msg);
		return false;
	}
	
	dateFormat[1] = Number(dateFormat[1]);		//year
	var Max = 31;
	switch(Number(dateFormat[2]))				//month
	{
		case 2: Max = ((dateFormat[1]%4 == 0 && dateFormat[1]%100 != 0) || dateFormat[1]%400 == 0) ? 29 : 28; //년도가 400으로 나누어 떨어지거나 4의배수이고 100으로 나누어 떨어지지 않으면 윤년
			break;
		case 4:
		case 6:
		case 9:
		case 11:Max = 30;
			break;
		default :
			break;
	}
	
	if(Max < Number(dateFormat[3])) 			//day
	{
		_obj.css("background-color", "#FFFFCC");
		_obj.focus();
		_obj.val("");
		alert(_msg);
		return false;
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");
	}
	return true;
}

//이메일 형식 체크
var validateEmail = validateFactory(patternEmail); 

//주민번호 형식 체크
//var validateRRN = validateFactory(patternRRN);

function validateRRN(_obj, _msg)
{
	var value = _obj.val().replace('-','');
	
	if(!patternRRN.test(value))
	{
		alert(_msg);
		_obj.css("background-color", "#FFFFCC");
		_obj.focus();
		_obj.val("");
		return false;
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");
	}
	
	var rrn1 = value.substring(0,6);
	var rrn2 = value.substring(6,13);
	
	for(i=0, sum=0; i<12; i++)
	{
		sum += (((i%8)+2)*(value.charAt(i)-"0"));
	}

	sum = (11 - (sum%11))%10;
	
	if(sum != value.charAt(12))
	{
		_obj.css("background-color", "#FFFFCC");
		_obj.focus();
		_obj.val("");
		alert("주민등록번호가 유효하지 않습니다. 다시 입력하세요.");
		return false;
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");		
	}
	return true;
}

function validateEmptyCheck(_obj, _msg)
{
	if(_obj.val().length < 1)
	{
		alert(_msg);
		_obj.css("background-color", "#FFFFCC");
		_obj.val("");
		_obj.focus();
		return false;
	}
	else
	{
		_obj.css("background-color", "#FFFFFF");
		return true;
	}
}


function emptyCheck(obj, name)
{
	if(obj.val().length < 1)
	{
		alert(name + "는(은) 필수입력값 입니다.");
		obj.css("background-color", "#FFFFCC");
		obj.val("");
		obj.focus();
		return false;
	}
	else
	{
		obj.css("background-color", "#FFFFFF");
		return true;
	}
}

var validateTime = validateFactory(patternTime); 



Date.prototype.format = function(f) {

    if (!this.valueOf()) return " ";



    var weekName = ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"];

    var d = this;




    return f.replace(/(yyyy|yy|MM|dd|E|hh|mm|ss|a\/p)/gi, function($1) {

        switch ($1) {

            case "yyyy": return d.getFullYear();

            case "yy": return (d.getFullYear() % 1000).zf(2);

            case "MM": return (d.getMonth() + 1).zf(2);

            case "dd": return d.getDate().zf(2);

            case "E": return weekName[d.getDay()];

            case "HH": return d.getHours().zf(2);

            case "hh": return ((h = d.getHours() % 12) ? h : 12).zf(2);

            case "mm": return d.getMinutes().zf(2);

            case "ss": return d.getSeconds().zf(2);

            case "a/p": return d.getHours() < 12 ? "오전" : "오후";

            default: return $1;

        }

    });

};



String.prototype.string = function(len){var s = '', i = 0; while (i++ < len) { s += this; } return s;};

String.prototype.zf = function(len){return "0".string(len - this.length) + this;};

Number.prototype.zf = function(len){return this.toString().zf(len);};


