/**
 * form validator
 * @version 0.9.1
 * @author incree@increeworks.com
 * 0.9.1 수정사항
 * submitted 변수 추가로 form이 submit 되었는지 체크
 * validator()을 validate()로 변경함
 * validator instance를 저장할 변수 validator 선언 및 instance 생성
 * clearOption() 추가 - 지정된 option을 모두 clear 한다
 * 생성자 호출시 formObj가 안 넘어오는 경우 document의 첫번째 폼을 지정한다
 */

var validator;

String.prototype.trim = function() {   
      return this.replace(/^\s+|\s+$/g,"");   
}

function getWordsNum(str) {
	if(str == "") return 0;

	var resultArr = new Array();
	var strArr = str.split(" ");
	for(var i = 0; i < strArr.length; ++i) {
		var subArr1 = strArr[i].split("\n");
		for(var j = 0; j < subArr1.length; ++j) {
			var subArr2 = subArr1[j].split(".");
			for(var k = 0; k < subArr2.length; ++k) {
				var subArr3 = subArr2[k].split(",");
				for(var l = 0; l < subArr3.length; ++l) {
					if(subArr3[l] != "") resultArr.push(subArr3[l]);
				}
			}
		}
	}

	return resultArr.length;
}

var iwtFormValidator = function(formObj) {
	this.submitted = '';

	if(typeof(formObj) != "object") {
		formObj = document.forms[0];
	}

	this.formObj = formObj;
    this.options = [];
}

iwtFormValidator.prototype.addOption = function(option) {
	this.options.push(option);
}

iwtFormValidator.prototype.clearOption = function() {
	this.options = [];
}

iwtFormValidator.prototype.getElement = function(elementName) {
	var fElementObj = this.formObj[elementName];
	var fElements = [];
	if(typeof(fElementObj) == 'undefined') {
		alert('폼에 요소가 없습니다.' + elementName);
		return false;
	}

	if(typeof(fElementObj.length) == 'undefined') {
		fElements[0] = fElementObj;
	}
	else {
		var fType = fElementObj.type ? fElementObj.type.toUpperCase() : "";
		if(fElementObj.type) {
			fElements[0] = fElementObj;
		}
		else if(fElementObj[0].type) {
			if(fType == "RADIO" || fType == "CHECKBOX") {
				fElements[0] = fElementObj[0];
			}
			else {
				for(var i = 0; i < fElementObj.length; ++i) {
					fElements.push(fElementObj[i]);
				}
			}
		}
	}
	
	return fElements;
}

iwtFormValidator.prototype.validate = iwtFormValidator.prototype.validator = function() {
	if(typeof(this.options) == "undefined" || this.options.length == 0) {
		return true;
	}

	for(var i = 0; i < this.options.length; ++i) {
		var chkOption = this.options[i];
		if(typeof(chkOption.name) == 'undefined') {
			alert('입력정보가 정확하지 않습니다');
			return false;
		}

		var fElements = this.getElement(chkOption.name);
		for(var j = 0; j < fElements.length; ++j) {
			result = this.checkValidate(fElements[j], chkOption);
			if(result == false) return false;
		}
	}

	return true;
}

iwtFormValidator.prototype.checkValidate = function(fElement, chkOption) {
	var fType = fElement.type;
	if(!fType) return false;
	else fType = fType.toUpperCase();

	var fValue = '';
	if(fType == "SELECT-ONE" || fType == "SELECT-MULTIPLE") {
		fValue = fElement.options[fElement.selectedIndex].value;
	}
	else if(fType == "RADIO" || fType == "CHECKBOX") {
		fValue = checkCheckedValue(fElement);
	}
	else {
		fValue = fElement.value.trim();
	}

	fTitle = typeof(chkOption.title) == 'undefined' ? '필수 입력 필드' : chkOption.title;			// 필드명
	fMaxLen = chkOption.maxlen;					// 최대 입력글자수 제한
	fMinLen = chkOption.minlen;					// 최소 입력글자수 제한
	fFixLen = chkOption.fixlen;					// 지정된 글자수
	fMaxVal = chkOption.maxval;					// 최대 숫자 제한
	fMinVal = chkOption.minval;					// 최소 숫자 제한
	fDeChar = chkOption.dechar;					// 입력 금지 문자
	fAlChar = chkOption.alchar;					// 입력 허용 문자
	fRequire = typeof(chkOption.isRequire) == 'undefined' ? false : true;										// 필수 여부
	fNumber = typeof(chkOption.isNumber) == 'undefined' ? false : true;											// 숫자만 기입 가능하도록
	fLenType = typeof(chkOption.lentype) == 'undefined' || chkOption.lentype == 'char' ? 'char' : 'byte';		// 글자수 체크 형식
	fEmail = typeof(chkOption.isEmail) == 'undefined' ? false : true;											// 이메일 체크
	fTel = typeof(chkOption.isTel) == 'undefined' ? false : true;												// 전화번호 체크
	valueLength = fLenType == 'byte' ? getLen(fValue) : fValue.length;
	lengthString = fLenType == 'byte' ? 'Byte' : '자';

	if(fRequire == true) {
		if(fValue == '') {
			if(fType == "SELECT-ONE" || fType == "SELECT-MULTIPLE" || fType == "RADIO" || fType == "CHECKBOX") {
				msg = ' 선택해 주세요';
			}
			else {
				msg = ' 입력해 주세요';
			}
			alert(fTitle + josa(fTitle, '을를') + msg);
			if (fType != "HIDDEN") {
				fElement.focus();
			}
			return false;
		}
	}
	if (fDeChar != undefined && (fType == "TEXT" || fType == "HIDDEN" || fType == "TEXTAREA" || fType == "PASSWORD")) {
		if(checkCharDenide(fValue, fDeChar) == false) {
			alert(fTitle + "에 (" + fDeChar + ")를 입력하실 수 없습니다.");
			if (fType != "HIDDEN") {
				fElement.focus();
			}
			return false;
		}
	}
	if (fAlChar != undefined && (fType == "TEXT" || fType == "HIDDEN" || fType == "TEXTAREA" || fType == "PASSWORD")) {
		if(checkCharAllow(fValue, fAlChar) == false) {
			alert(fTitle + josa(fTitle, '은는') + ' (' + fDeChar + ')만 입력하실 수 있습니다.');
			if (fType != "HIDDEN") {
				fElement.focus();
			}
			return false;
		}
	}
	if (fNumber == true && isNaN(fValue)) {
		alert(fTitle + josa(fTitle, '은는') + ' 숫자로만 입력해 주세요');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fFixLen != undefined && fValue != '' && fFixLen != valueLength) {
		alert(fTitle + josa(fTitle, '은는') + ' 입력된 글자수가 ' + fFixLen + lengthString + '이어야 합니다.');
		if(fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fMaxLen != undefined && fValue != '' && fMaxLen < valueLength && valueLength > 0) {
		alert(fTitle + josa(fTitle, '은는') + ' 입력된 글자수가 ' + fMaxLen + lengthString + '보다 작아야합니다.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fMinLen != undefined && fValue != '' && fMinLen > valueLength && valueLength > 0) {
		alert(fTitle + josa(fTitle, '은는') + ' 입력된 글자수가 ' + fMinLen + lengthString + '보다 커야합니다.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fMaxVal != undefined && fValue != '' && parseInt(fMaxVal) < parseInt(fValue)) {
		alert(fTitle + '의 입력된 숫자는 ' + fMaxVal + '보다 작아야합니다.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fMinVal != undefined && fValue != '' && parseInt(fMinVal) > parseInt(fValue)) {
		alert(fTitle + '의 입력된 숫자는 ' + fMinVal + '보다 커야합니다.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fEmail == true && fValue != '' && checkEmail(fValue) == false && fValue != "") {
		alert(fTitle + josa(fTitle, '은는') + ' 이메일 주소 형식으로 입력해 주세요.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
	if (fTel == true && fValue != '' && checkPhoneNumber(fValue) == false && fValue != "") {
		alert(fTitle + josa(fTitle, '은는') + ' 전화번호 형식으로 입력해 주세요.');
		if (fType != "HIDDEN") {
			fElement.focus();
		}
		return false;
	}
}


//배열 요소일 경우 checked 된것이 있는지 확인
function checkChecked(obj) {
	var formObj = obj.form;
	var objName = obj.name;
	var oElem = eval("formObj." + objName);
	var ret = false;

	if (typeof(oElem.length) == "undefined") {
		if (oElem.checked) {
			ret = true;
		}
	} else {
		for (var i=0;i<oElem.length;i++) {
			if (oElem[i].checked) {
				ret = true;
			}
		}
	}

	return ret;
}

//배열 요소일 경우 checked 된것의 값 구하기
function checkCheckedValue(obj) {
	var formObj = obj.form;
	var objName = obj.name;
	var oElem = eval("formObj." + objName);
	var val = '';

	if(typeof(oElem.length) == "undefined") {
		if(oElem.checked) {
			val = oElem.value;
		}
	}
	else {
		for (var i = 0; i < oElem.length; i++) {
			if (oElem[i].checked) {
				val += (val == '' ? '' : ',') + oElem[i].value;
			}
		}
	}

	return val;
}

function jumin_number_validation(str_jumin1, str_jumin2) {   // 주민등록번호 검증
	var return_value = true;
	
	var it = str_jumin1 + "" + str_jumin2;
	var IDtot = 0;
	var IDAdd="234567892345";

	for(i=0;i<12;i++){
		IDtot=IDtot+parseInt(it.substring(i,i+1))*parseInt(IDAdd.substring(i,i+1)); 
	}

	IDtot=11-(IDtot%11);
	if(IDtot==10) {
		IDtot=0;	
	}
	else if(IDtot==11){
		IDtot=1;	
	}
	
	if(parseInt(it.substring(12,13))!=IDtot) return_value = false;
	
	return return_value;
} 

// 숫자만 입력 받기..
function keyValidCheck() {
	if (event.keyCode >= 48 && event.keyCode <= 57) {
		event.returnValue = true;
	}
	else {
		event.returnValue = false;
	}
}

// 영문, 숫자만 입력 받기..
function eng_keyValidCheck() {
	if ((event.keyCode >= 48 && event.keyCode <= 57) || 
		(event.keyCode >= 65 && event.keyCode <= 90) ||
		(event.keyCode >= 97 && event.keyCode <= 122)) {
		event.returnValue = true;
	}
	else {
		event.returnValue = false;
	}
}

function chkIDValidate(idVal) {
	var return_flag = true;
	var valid = "abcdefghijklmnopqrstuvwxyz0123456789";
	var temp;

	for (var i=0; i < idVal.length; i++) {
		temp = "" + idVal.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") return_flag = false;
	}

	return return_flag;
}
	
//문자열에 공백이 있는지 검사
function isNullInclude(str) {
	var tmpStr;
	len = str.length;

	for ( i = 0 ; i < len ; i++ ) {
		tmpStr = str.charAt(i);
		//뉴라인, 탭, 스페이스 검사
		if (tmpStr == "\n" || tmpStr == "\r" || tmpStr == "\t" || tmpStr == " ") return true;
	}
	return false;
}

//문자열이 숫자인지 검사
function isNumber(str) {
	var tmpStr;
	len = str.length;

	for ( i = 0 ; i < len ; i++ ) {
		tmpStr = str.charAt(i);
		if (tmpStr < "0" || tmpStr > "9") return false;
	}
	return true;
}
	
	function checkCharDenide(str, char) {
		for(i = 0; i <= str.length;  i++) {
			ch = str.charAt(i);
			for(j = 0; j < char.length; j++) {
				if(ch == char.charAt(j)) return false;
			}
		}
		return true;
	}

	function checkCharAllow(str, char) {
		for(i = 0; i <= str.length;  i++) {
			ch = str.charAt(i);
			for(j = 0; j < char.length; j++) {
				if(ch != char.charAt(j)) return false;
			}
		}
		return true;
	}
	
function checkPhoneNumber(str) {
	var filter = /([+]?[0-9]{1,4})?([-]?[0-9]{2,4})([-]?[0-9]{3,4})([-]?[0-9]{4})([-]?[0-9]{1,5})?/
	if (filter.test(str) == true) {
		return true;
	}
	else {
		return false;
	}
}


	// 폼에 해당하는 컨트롤들의 기본값 쉽게 셋팅해 주기
	function initForm(f)	{
		var nLen;	// form 요소의 갯수
		var ival;	// 각 요소의 default value 값 즉! 초기화하고자 하는값
		var fTyp;	// form 요소의 타입(select, radio, checkbox...)

		for (var i = 0; i < f.elements.length; i++) {
			fTyp = toUpperCase(f.elements[i].type);
			ival = f.elements[i].ival;

			if (ival && fTyp == "SELECT-ONE") {
				nLen = f.elements[i].options.length;
				for (var j = 0; j < nLen; j++) {
					if (f.elements[i].options[j].value == ival)
						f.elements[i].options[j].selected = true;
				}
			}
			if (fTyp == "SELECT-MULTIPLE") {
				nLen = f.elements[i].options.length;
				for (var j = 0; j < nLen; j++) {
					if (f.elements[i].options[j].value == f.elements[i].options[j].ival)
						f.elements[i].options[j].selected = true;
				}
			}
			if (ival && (fTyp == "RADIO" || fTyp == "CHECKBOX")) {
				if (f.elements[i].value == ival)
					f.elements[i].checked = true;
			}
		}
		return true;
	}
	
	
	// 이메일 유효성 체크
	function checkEmail(str){
	    var reg = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;
	    if (str.search(reg) != -1) {
			return true;
		}
		return false;
	}

	// 문자 길이 반환 (영문 1byte, 한글 2byte 계산)
	function getLen(str) {
		var len;
	    var temp;

	    len = str.length;
	    var tot_cnt = 0;

	    for(k=0;k < len;k++){
	    	temp = str.charAt(k);
	    	if(escape(temp).length > 4)
	    		tot_cnt += 2;
	    	else
	    		tot_cnt++;
	    }
	    return tot_cnt;
	}
	
	
	function checkMaxLen(obj,chkLen,displayId){
		var str = obj.value;
		
		if(str.length > chkLen) {
			alert(chkLen + "자 이상 입력하실 수 없습니다.");
			obj.value = str.substring(0,chkLen);
		}
		
		document.getElementById(displayId).innerText = obj.value.length;
	}

	function josa(str,josa) {
		var strTemp = str.substr(str.length-1); 
		
    	return ((strTemp.charCodeAt(0) - 16) % 28 != 0) ? josa.substring(0, 1) : josa.substring(1, 2); 
	}

