/// 에러메시지 포멧 정의 ///
var NO_BLANK = "请输入{name}";
var NO_CHECK = "请选择{name}";
var NOT_VALID = "{name} 有错吴，请确认";
var TOO_LONG = "{name}超过了长度(最长{maxbyte}Byte)";
var SPACE = (navigator.appVersion.indexOf("MSIE")!=-1) ? "          " : "";

// form.js 버젼 표기
var form_js = {
	Version: '1.0 r090506'
};

/// 스트링 객체에 메소드 추가 ///
String.prototype.space = function(str) {
	str = this != window ? this : str; 
	var strTemp = '';
	str.split('\n').each(function(line) { strTemp += line+(navigator.userAgent.match(/MSIE/)?'          ':'')+'\n'});
	return strTemp;
}

String.prototype.alert = function(str) {
	str = this != window ? this : str; 
	alert(str.space());
}

String.prototype.confirm = function(str) {
	str = this != window ? this : str; 
	return confirm(str.space());
}

String.prototype.trim = function(str) { 
	str = this != window ? this : str; 
	return str.replace(/^\s+/g,'').replace(/\s+$/g,''); 
}

String.prototype.hasFinalConsonant = function(str) {
	str = this != window ? this : str; 
	var strTemp = str.substr(str.length-1);
	return ((strTemp.charCodeAt(0)-16)%28!=0);
}

String.prototype.bytes = function(str) {
	str = this != window ? this : str;
	for(var i=0, len=0; i<str.length; i++) {
		var chr = str.charAt(i);
		if(escape(chr).length > 4) len += 2;
		else if(chr != '\r') len++;
	}
	return len;
}

String.prototype.number_format = function() {
	var num = this.replace(/,/g,'');
	return num.replace(/(\d)(?=(?:\d{3})+(?!\d))/g,'$1,');
}

String.prototype.number_format_replace = function() {
	var num = this.replace(/,/g,'');
	return num.replace(/(\d)(?=(?:\d{3})+(?!\d))/g,'$1');
}

Array.prototype.shuffle = function() { 
	return this.concat().sort(function() {
		return Math.random() - Math.random();
	});
}

function in_array(value, array, similar) {
	for(var i=0; i<array.length; i++) {
		if(similar==true) {
			if(value.indexOf(array[i]) != -1) return true; // 비슷한 값
		} else {
			if(array[i]==value) return true; // 동일한 값
		}
	}
	return false;
}

function josa(str,tail) {
	return (str.hasFinalConsonant()) ? tail.substring(0,1) : tail.substring(1,2);
}

function checkMultiBox(el) {
	var obj = document.getElementsByName(el.name);
	for (var i=0; i<obj.length; i++) if(obj[i].checked==true) return true;
	return false;
}

function validate(form, skip) { // 2009.04.01 fixed
	for (var i=0; i<form.length; i++) {
		try {
			var el = form[i]; 
			if(el.tagName.match(/fieldset/i) || el.disabled===true) continue;
			if(skip && in_array(el.name, skip.split('|'), true)===true) continue;
			if(el.type.toLowerCase() != "file" && el.getAttribute("NOTRIM")==null && el.value) el.value = el.value.trim(); // 수정 :: 파폭 보안 문제

			// 첨부파일 필터링 설정시
			if(el.type.toLowerCase() == "file" && el.value && (el.getAttribute("filter")!=null || el.getAttribute("antifilter")!=null)) {
				var file_infos = el.value.split('.');
				var _ext = file_infos[file_infos.length-1].toLowerCase();
				if(el.getAttribute("antifilter")!=null && in_array(_ext, el.getAttribute("antifilter").split(','))) {
					return doError(el,"{name}不可以附上("+el.getAttribute("antifilter")+"文件不许附上)");
				}
				else if(!in_array(_ext, el.getAttribute("filter").split(','))) {
					return doError(el,"{name}不可以附上(只"+el.getAttribute("filter")+"文件可以附上)");
				}
			}
			// 기타 필드에 필터링 설정시 - 08.03.21 추가
			if(el.getAttribute("antifilter")!=null) {
				var filters = el.getAttribute("antifilter").split(',');
				var _contents = el.value.replace(/ /g,'').replace(/&nbsp;/g,''); // 공백문자 제거
				for(var x=0; x<filters.length; x++) {
					if(_contents.indexOf(filters[x])!=-1) {
						return doError(el, "在{name}'不可输入"+filters[x]+"'");
					}
				}
			}
			var PATTERN = el.getAttribute("PATTERN");
			var minbyte = el.getAttribute("MINBYTE");
			var maxbyte = el.getAttribute("MAXBYTE");
			var minval = el.getAttribute("MINVAL");
			var maxval = el.getAttribute("MAXVAL");
			var option = el.getAttribute("OPTION");
			var ignore0 = el.getAttribute("IGNORE0");
			var match = el.getAttribute("MATCHING"); // 수정 :: Prototype JS 와 충돌하여 'MATCH' 에서 'MATCHING' 으로 변경
			var glue = el.getAttribute("GLUE");
			var unit = el.getAttribute("UNIT");
			var or = el.getAttribute("OR"); // 추가 :: 둘 중 하나의 값을 입력 받고자 하는 경우(이경우, REQUIRED 는 사용하지 말 것)
			if(unit == null) unit = '';

			if (el.getAttribute("REQUIRED") != null) {
				if(el.getAttribute('nofocus')==null && el.style.display=='none') continue; // 2009.05.06 추가
				var ERR_MSG = (el.getAttribute("MESSAGE") != null) ? el.getAttribute("MESSAGE") : null;
				if ((el.type.toLowerCase() == "radio" || el.type.toLowerCase() == "checkbox") && !checkMultiBox(el)) return (ERR_MSG) ? doError(el, ERR_MSG) : doError(el, NO_CHECK);
				if (el.tagName.toLowerCase() == "select" && (el.value == null || el.value == "")) return (ERR_MSG) ? doError(el,ERR_MSG) : doError(el,NO_CHECK);
				if (el.value == null || el.value == "" || (ignore0==null && el.value == "0") || (el.getAttribute("DEFAULT")!=null && el.value == el.getAttribute("DEFAULT"))) return (ERR_MSG) ? doError(el,ERR_MSG) : doError(el,NO_BLANK);
			}
		}
		catch(e) {
			//alert(e.message+form[i].name+":"+form[i].checked +":"+ form[i].value);
		}

		if (minbyte != null && el.value != "" && el.value.bytes() < parseInt(minbyte)) {
			if(unit=='') unit = "Byte";
			return doError(el,"{name}需要输入"+new String(minbyte).number_format()+unit+"以上");
		}
		if (maxbyte != null && el.value != "" && el.value.bytes() > parseInt(maxbyte)) {
			if(unit=='') unit = "Byte";
			return doError(el,"{name}需要输入"+new String(maxbyte).number_format()+unit+"一下");
		}

		if (minval != null && el.value != "" && el.value < parseInt(minval)) return doError(el,"{name}需要输入"+new String(minval).number_format()+unit+"以上");
		if (maxval != null && el.value != "" && el.value > parseInt(maxval)) return doError(el,"{name}需要输入"+new String(maxval).number_format()+unit+"一下");
		if (PATTERN != null && el.value != "" && !PATTERN(el,pattern)) return false;
		if (match != null && (el.value != form[match].value)) return doError(el,"{name}不符合");

		if (or != null && (el.value == null || el.value == "") && (form[or].value==null || form[or].value == "")) {
			var name2 = (hname = form[or].getAttribute("HNAME")) ? hname : form[or].getAttribute("NAME");
			return doError(el,"{name+} 或 "+name2+"，其中最少一个得输入");
		}

		if (option != null && el.value != "") {
			if (el.getAttribute('SPAN') != null) {
				var _value = new Array();
				for (var span=0; span<el.getAttribute('SPAN');span++ ) _value[span] = form[i+span].value;
				var value = _value.join(glue == null ? '' : glue);
				if (!funcs[option](el,value)) return false;
			} else {
				try{ if (!funcs[option](el)) return false; } catch(e) {} // 수정 :: 익스7에서 'runtime' 오류 발생으로 변경
			}
		}
	}
	return true;
}

function doError(el,type,action) {
	if(type==undefined) type = NO_BLANK; // fixed
	var pattern = /{([a-zA-Z0-9_]+)\+?([가-힝]{2})?}/g;
	var name = (hname = el.getAttribute("HNAME")) ? hname : el.getAttribute("NAME");
	pattern.exec(type);
	try {
		var tail = (RegExp.$2) ? josa(eval(RegExp.$1),RegExp.$2) : '';
		(type.replace(pattern,eval(RegExp.$1) + tail)).alert();
	}
	catch(e) { // checkbox 에서 오류가 발생할 가능성이 높다
		var message = el.getAttribute("message");
		if(message!=null) message.alert();
		else doError(el,NO_CHECK);
		return false;
	}
	if(action == "sel") el.select();
	else if(action == "del")	el.value = "";
	if(el.getAttribute("NOFOCUS") == null) {
		el.focus();
		if(el.getAttribute("DEFAULT")!=null) el.value = el.getAttribute("DEFAULT");
	}
	if(el.getAttribute("SETFOCUS") != null && el.getAttribute("SETFOCUS") !='') el.form[el.getAttribute("SETFOCUS")].focus();
	return false;
}

/// 특수 패턴 검사 함수 매핑 ///
var funcs = new Array();
funcs['domain'] = isValidDomain;
funcs['email'] = isValidEmail;
funcs['userid'] = isValidUserid;
funcs['userpw'] = isValidUserpw;
funcs['number'] = isNumeric;
funcs['float'] = isFloat;
funcs['engonly'] = alphaOnly;
funcs['normal'] = isSpecialCharacter;

/// 패턴 검사 함수들 ///
function isBlank(el,value) { // 2008.07.12 추가
	var value = value ? value : el.value;
	return value.trim() ? true : doError(el,NO_BLANK);
}

function isValidDomain(el,value) {
	if(el.getAttribute('required')==null) {
		var default_val = el.getAttribute('default');
		if(default_val!=null && el.value==default_val) return true;
	}
	var value = value ? value : el.value;
	var pattern = /^[_a-zA-Z가-힝0-9-]+\.[a-zA-Z가-힝0-9-\.]+[a-zA-Z]+$/;
	return (pattern.test(value.replace(/http:\/\//g, ''))) ? true : doError(el,NOT_VALID);
}

function isValidEmail(el,value) {
	var value = value ? value : el.value;
	var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
	return (pattern.test(value)) ? true : doError(el,NOT_VALID);
}

function isValidUserid(el) { // 2008.07.14 doError 수정
	var pattern = /^[a-z]{1}[a-z0-9]{3,14}$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name} 只可以使用英文小写开头的4~15字英文小写与数字之组合");
}

function isValidUserpw(el) { // 2008.07.14 doError 수정
	var pattern = /^[a-zA-Z0-9]{4,15}$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name} 只可以使用4~15字英文小写与数字之组合");
}

function alphaOnly(el) {
	var pattern = /^[a-zA-Z]+$/;
	return (pattern.test(el.value)) ? true : doError(el,NOT_VALID);
}

function isSpecialCharacter(el) {
	var pattern = /[a-zA-Z가-힝0-9]/;
	return (pattern.test(el.value)) ? true : doError(el,"{name}不可使用特殊文字");
}

function isNumeric(el) {
	var pattern = /^[0-9]+$/;
	return (pattern.test(el.value)) ? true : doError(el,"请用数字输入{name}");
}

function isFloat(el) {
	var pattern = /^[0-9]+(\.[0-9]{1,4})?$/;
	return (pattern.test(el.value)) ? true : doError(el,"{name}可以输入常数或最多小数点4位的数字");
}
