/**
* project: lib.validate.js ver 0.7.0
* description: 폼 체크, 값 표준화
* author: jstoy project
* http://jstoy.sourceforge.net/bbs/
* http://sourceforge.net/projects/jstoy/
* 참고사이트 : http://laintt.net/v04/
* date: 2004-03-10
*
* 2004-03-10 ver 0.0.1
* 2004-04-21 ver 0.1.0 - lainTT (에러모드에 따른 부하최소화, trim 재구성)
* 2004-04-23 ver 0.1.1 - lainTT (체크박스 카운트 체크[mincheck, maxcheck] 추가)
* 2004-05-19		   - 하늘아부지 (사용자 체크함수를 사용할 수 있도록 수정, 내부 체크함수명 규칙 적용 func_옵션명)
* 2004-05-21 ver 0.2.0
* 2004-09-06 ver 0.6.0 - jstoy (setCheckFields, setForm, setFunc, setParam, delParam method 추가,  option map 재도입..)
* 2004-09-30 ver 0.6.1 - Tenshi (disabled 되어있는 개체는 체크시 제외)
* 2004-10-15		   - Tenshi (multi select 에서 선택된 값이 없을 때의 에러[selectedIndex == -1] 수정요청 반영 - 유림[yyi at yourim.net]님)
* 2004-11-06 ver 0.7.0 - Tenshi (multi select 선택수 체크[minselect, maxselect] 추가 - 유림[yyi at yourim.net]님 제안)
					   - 유림 (재외국인 번호 옵션 추가[foreignerno] - 강병기님 옵션명 제안)
					   - Tenshi (phone, homephone 옵션에서 070, 080, 1544 등의 전화번호 체크 가능하도록 수정 - 김영선[crane123 at naver.com]님 제안)
					   - Tenshi (이미지 파일만 입력받는 인자[imageonly]추가 - kurome님 제안)
* - 이하 RedCat 작업내용
* 2005-03-31 - getErrorFunction 추가 오류 발생후 사용자 정의 함수 호출 errfunc = "userfunction()"  - RedCat
					- errNoAlert 옵션 추가 errnoalert=1 이면 오류메세지 안보여줌 - RedCat
* 2005-10-12	 - imageonly="jpg" jpg 파일만 가능 - RedCat
* 2005-12-26 - fileonly="hwp,zip" fileonly 값만 가능 - RedCat
					- errkey=0 오류메세지 사용자정의 파일 이용시(게시판별 언어 설정 등에 사용) - RedCat
						var arr_errmsg = new Array();
						arr_errmsg['required'] = new Array("test err msg");
						위의 변수가 선언되었을때 오류메세지
					- errdesc = "errdesc" - RedCat
						오류메세지 외 설명 메세지(var arr_errdesc = new Array() 설정되어 있어야함);
* 2006-07-04 - option=jurino 법인번호체크함수 추가, 사업자번호 체크시 invalid 일때 자동으로 법인체크함,
* 2007-01-17 01:36:03 영문,중문 오류 메세지 
*/

function validate(form, fields, _lang) {
	var filetypename;
    var lang;
    _lang = typeof(_lang) == "undefined"?"kor":_lang;
    lang = _lang;
    var lah = new FormChecker(form,_lang);
	if (fields) lah.setCheckFields(fields);
	var wmf = lah.go();
    
	if (wmf == false){
		if (lah.errNoAlert != 1) {
            alert(lah.getErrorMessage());
		}
		try{
			eval(lah.getErrorFunction());
		}catch(e){
			alert(e);
		}
	}
	return wmf;
    
}

FormChecker = function(form,lang) {
    this.lang = lang == ""?"kor":lang;
    
	this.FUNC_MAP = {
		email	 : "this.func_email",
		hangul	: "this.func_hangul",
		engonly   : "this.func_engonly",
		number	: "this.func_number",
		residentno: "this.func_residentno",
		jumin	 : "this.func_jumin",
		foreignerno:"this.func_foreignerno",
		bizno	 : "this.func_bizno",
		jurino : "this.func_jurino",
		phone	 : "this.func_phone",
		hometel : "this.func_homephone",
		mobile : "this.func_mobile",
		userid : "this.func_userid"
	}
    
    this.ERR_MSG_FUNC_MAP_KOR = {
        func_hangul : "반드시 한글을 포함해야 합니다",
        func_userid : "숫자, 영문만 포함하여야 합니다",
        func_number : "반드시 숫자로만 입력해야 합니다"
    }
    this.ERR_MSG_FUNC_MAP_CHN = {
        func_hangul : "Please type Korean",
        func_userid : "Number, Alphabet only",
        func_number : "Number only"
    }
    this.ERR_MSG_FUNC_MAP_ENG = {
        func_hangul : "Please type Korean",
        func_userid : "Number, Alphabet only",
        func_number : "Number only"
    }

    this.ERR_MSG_KOR = {
		system   : "FormChecker Error: ",
		required : "반드시 입력하셔야 하는 사항입니다.",
		requirenum:"이 항목들 중에 {requirenum}개 이상의 항목이 입력되어야 합니다.",
		notequal : "입력된 내용이 일치하지 않습니다.",
		invalid  : "입력된 내용이 형식에 어긋납니다.",
		minbyte  : "입력된 내용의 길이가 {minbyte}Byte 이상이어야 합니다.",
		maxbyte  : "입력된 내용의 길이가 {maxbyte}Byte를 초과할 수 없습니다.",
		minstrlen : "입력된 글자수는 {minstrlen}자 이상이어야 합니다.",
		maxstrlen : "입력된 글자수는 {maxstrlen}자 미만이어야 합니다.",
		minnum  : "입력된 내용은 {minnum} 이상이어야 합니다.",
		maxnum  : "입력된 내용은 {maxnum} 이하이어야 합니다.",
		mincheck : "{mincheck}개의 항목이상으로 선택하세요.",
		maxcheck : "{maxcheck}개의 항목이하로 선택하세요.",
		minselect: "{minselect}개의 항목이상으로 선택하세요.",
		maxselect: "{maxselect}개의 항목이하로 선택하세요.",
		imageonly: "이미지 파일만 첨부할 수 있습니다.",
		imageonly_jpg: "JPG 이미지 파일만 첨부할 수 있습니다.",
		imageonly_gif: "GIF 이미지 파일만 첨부할 수 있습니다.",
		imageonly_png: "PNG 이미지 파일만 첨부할 수 있습니다.",
		fileonly : "파일만 첨부할 수 있습니다."
	}

    
    this.ERR_MSG_ENG = {
		system   : "FormChecker Error: ",
		required : "Please fill in this field.",
		requirenum:"Please fill in at least {requirenum} field(s).",
		notequal : "You have supplied incorrect details.",
		invalid  : "The information you typed has invalid format.",
		minbyte  : "{minbyte}-byte minimum.",
		maxbyte  : "{maxbyte}-byte maximum .",
		minstrlen : "{minstrlen}-character minimum.",
		maxstrlen : "{maxstrlen}-character maximum.",
		minnum  : "{minnum}-digits minimum.",
		maxnum  : "{maxnum}-digits maximum .",
		mincheck : "Please select at least {mincheck} field(s).",
		maxcheck : "Please select maximum {maxcheck} field(s).",
		minselect: "Please select at least {mincheck} field(s).",
		maxselect: "Please select maximum {maxcheck} field(s).",
		imageonly: "Image files only can be attached.",
		imageonly_jpg: "We only support JPEG.",
		imageonly_gif: "We only support GIF.",
		imageonly_png: "We only support PNG.",
		fileonly : "Files only can be attached."
	}

    this.ERR_MSG_CHN = {
		system   : "FormChecker Error: ",
		required : "&#25285&#24403&#32773&#30830&#35748&#21518&#23558&#22238&#22797&#30005&#23376&#20449&#20214&#12290",
		requirenum:"&#51060&#32&#54637&#47785&#46308&#32&#51473&#50640 {requirenum}&#20010&#20197&#19978&#39033&#30446&#12290",
		notequal : "&#36755&#20837&#20869&#23481&#19981&#19968&#33268&#12290",
		invalid  : "&#36755&#20837&#20869&#23481&#30340&#26684&#24335&#26377&#35823&#12290",
		minbyte  : "&#36755&#20837&#20869&#23481&#30340&#38271&#24230&#24212&#22823&#20110{minbyte}Byte",
		maxbyte  : "&#36755&#20837&#20869&#23481&#38271&#24230&#19981&#24471&#36229&#36807{maxbyte}Byte",
		minstrlen : "&#36755&#20837&#23383&#25968&#24212&#22823&#20110{minstrlen}&#23383&#12290",
		maxstrlen : "&#36755&#20837&#23383&#25968&#24212&#22312{maxstrlen}&#23383&#24038&#21491&#12290",
		minnum  : "&#36755&#20837&#20869&#23481&#24212&#22823&#20110{minnum}",
		maxnum  : "&#36755&#20837&#20869&#23481&#24212&#23569&#20110{maxnum}",
		mincheck : "&#36873&#25321&#39033&#30446&#24212&#36229&#36807{mincheck}&#20010",
		maxcheck : "&#36873&#25321&#39033&#30446&#24212&#23569&#20110{maxcheck}&#20010",
		minselect: "&#36873&#25321&#39033&#30446&#24212&#36229&#36807{minselect}&#20010",
		maxselect: "&#36873&#25321&#39033&#30446&#24212&#23569&#20110{maxselect}&#20010",
		imageonly: "&#21482&#33021&#21478&#38468&#22270&#20687&#25991&#20214&#12290",
		imageonly_jpg: "&#21482&#33021&#21478&#38468JPG&#25991&#20214&#12290",
		imageonly_gif: "&#21482&#33021&#21478&#38468GIF&#25991&#20214&#12290",
		imageonly_png: "&#21482&#33021&#21478&#38468PNG&#25991&#20214&#12290",
		fileonly : "&#21482&#33021&#21478&#38468&#25991&#20214&#12290"
	}

    if(this.lang == "eng") 
    {
        this.ERR_MSG = this.ERR_MSG_ENG;
        this.ERR_MSG_FUNC = {
            func_hangul : "Please type Korean",
            func_userid : "Number, Alphabet only",
            func_number : "Number only"
        }
    }else if(this.lang == "chn") 
    {
        this.ERR_MSG = this.ERR_MSG_CHN;
        this.ERR_MSG_FUNC = {
            func_hangul : "Please type Korean",
            func_userid : "Number, Alphabet only",
            func_number : "Number only"
        }
    }
    else 
    {
        this.ERR_MSG = this.ERR_MSG_KOR;
        this.ERR_MSG_FUNC = {
            func_hangul : "반드시 한글만 입력하여야 합니다",
            func_userid : "숫자, 영문만 포함하여야 합니다",
            func_number : "반드시 숫자로만 입력해야 합니다"
        }
    }
    
	this.ERR_DO = {
		text   : "select focus",
		select : "focus",
		check  : "focus",
		radio  : "focus",
		file   : "focus",
		hidden : "none"
	}
	this.ERR_SYS = '_SYSERR_';
	this.fields = form.elements;
	this.form = form;
	this.errMsg = "";
	this.errFunc = "";
}

FormChecker.prototype.setForm = function(form) {
	this.form = form;
}

FormChecker.prototype.setFunc = function(map, func) {
	if (typeof(this.FUNC_MAP[map]) == "string") return;
	this.FUNC_MAP[map] = func;
}

FormChecker.prototype.setCheckFields = function(fields) {
	this.fields = [];
	if(typeof(fields) == 'string') 
		this.fields = [this.form.elements[fields]];
	else
		for(var i=0, s=fields.length; i<s; i++)
			this.fields[this.fields.length] = this.form.elements[fields[i]];
}

FormChecker.prototype.setUnCheckFields = function(fields) {
	this.fields = [];
	var _isUnCheckEl;

	if(typeof(fields) == 'string')
		fields = [fields];
	for (var i=0, s=this.form.elements.length; i<s; i++) {
		_isUnCheckEl = false;
		for (var j=0, t=fields.length; j<t; j++) {
			if (this.form.elements[i] == this.form.elements[fields[j]]) {
				_isUnCheckEl = true;
				break;
			}
		}
		if (!_isUnCheckEl) this.fields[this.fields.length] = this.form.elements[i];
	}
}

FormChecker.prototype.setParam = function(el, name, value) {
	el.setAttribute(name, value);
}

FormChecker.prototype.delParam = function(el, name) {
	el.removeAttribute(name);
}

FormChecker.prototype.go = function() {
	for (var i=0,s=this.fields.length; i<s; i++) {
		var el = this.fields[i];
		if (!this.isValidElement(el)) continue;

		var elType = this.getType(el);
		var trim = el.getAttribute("TRIM");
		var required = el.getAttribute("REQUIRED");
		var requirenum = el.getAttribute("REQUIRENUM");
		var minbyte = parseInt(el.getAttribute("MINBYTE"),10);
		var maxbyte = parseInt(el.getAttribute("MAXBYTE"),10);
		var minstrlen = parseInt(el.getAttribute("MINSTRLEN"),10);
		var maxstrlen = parseInt(el.getAttribute("MAXSTRLEN"),10);
		var mincheck = parseInt(el.getAttribute("MINCHECK"),10);
		var maxnum = parseInt(el.getAttribute("MAXNUM"),10);
		var minnum = parseInt(el.getAttribute("MINNUM"),10);
		var maxcheck = parseInt(el.getAttribute("MAXCHECK"),10);
		var minselect = parseInt(el.getAttribute("MINSELECT"),10);
		var maxselect = parseInt(el.getAttribute("MAXSELECT"),10);
		var option = el.getAttribute("OPTION");
		var match = el.getAttribute("MATCH");
		var span = el.getAttribute("SPAN");
		var glue = el.getAttribute("GLUE");
		var pattern = el.getAttribute("PATTERN");
		var imageonly = el.getAttribute("IMAGEONLY");
		var fileonly = el.getAttribute("FILEONLY");
		var errkey = el.getAttribute("ERRKEY");
		var errdesc = el.getAttribute("ERRDESC");

		if (trim != null && (elType == "text" || elType == "hidden")) {
			switch (trim) {
			case "trim":
				el.value = el.value.replace(/^\s+/, "").replace(/\s+$/, "");
				break;
			case "compress":
				el.value = el.value.replace(/\s+/, "");
				break;
			case "ltrim":
				el.value = el.value.replace(/^\s+/, "");
				break;
			case "rtrim":
				el.value = el.value.replace(/\s+$/, "");
				break;
			}
		}

		var elEmpty = this.isEmpty(el, elType);

		if (required != null) {
			if (required == "required") {
				if (elEmpty) return this.raiseError(el, "required");
			} else {
				requirenum = parseInt(requirenum, 10);
				var _num = 0;
				var _name = [];
				if (requirenum > 0) {
					for (var j=0; j<this.form.elements.length; j++) {
						var _el = this.form.elements[j];
						if (required == _el.getAttribute("REQUIRED")) {
							if(!this.isEmpty(_el, this.getType(_el))) _num++;
							_name[_name.length] = this.getName(_el);
						}
					}
					if(_num < requirenum)
						return this.raiseError(el, "requirenum", _name.join(", "));
				}
			}
		}
		if ((minbyte > 0 || maxbyte > 0) && (elType == "text" || elType == "hidden")) {
			var _tmp = el.value;
			var _len = el.value.length;
			for (j=0; j<_tmp.length; j++) {
				if (_tmp.charCodeAt(j) > 128) _len++;
			}
			if (minbyte > 0 && _len < minbyte) return this.raiseError(el, "minbyte");
			if (maxbyte > 0 && _len > maxbyte) return this.raiseError(el, "maxbyte");
		}

		if ((minstrlen > 0 || maxstrlen > 0) && (elType == "text" || elType == "hidden")) {
			var _tmp = el.value;
			var _len = el.value.length;
			
			if (minstrlen > 0 && _len < minstrlen) return this.raiseError(el, "minstrlen");
			if (maxstrlen > 0 && _len > maxstrlen) return this.raiseError(el, "maxstrlen");
		}

		
		if ((minnum > 0 || maxnum > 0) && (elType == "text" || elType == "hidden")) {
			var _tmp = el.value;
			if (minnum > 0 && _tmp < minnum) return this.raiseError(el, "minnum");
			if (maxnum > 0 && _tmp > maxnum) return this.raiseError(el, "maxnum");
		}
		if (match != null && elType != "file") {
			if (typeof this.form.elements[match] == "undefined")
				return this.raiseError(this.ERR_SYS, "Element '"+ match +"' is not found.");
			else if (el.value != this.form.elements[match].value)
				return this.raiseError(el, "notequal");
		}
		if (option != null && !elEmpty && elType != "file") {
			var _options = option.split(" ");
			for (var j in _options) {
                
				var _func = eval(this.FUNC_MAP[_options[j]]);
                
				if (span != null) {
					var _value = [];
					for (var k=0; k<parseInt(span,10); k++) {
						try {
							_value[k] = this.fields[i+k].value;
						} catch (e) {
							return this.raiseError(this.ERR_SYS,  (i+k) +"th Element is not found.");
						}
					}
					try {
						var _result = _func(el, _value.join(glue == null ? "" : glue));
					} catch (e) {
						return this.raiseError(this.ERR_SYS,  "function map '"+ _options[j] +"' is not exist.");
					}
					if (_result !== true) return this.raiseError(el, _result);
				} else {
                    
					try {
                        var _result = _func(el);
					} catch (e) {
						alert("adf");
                        return this.raiseError(this.ERR_SYS,  "function map '"+ _options[j] +"' is not exist.",el.name);
					}
                    
					if (_result !== true) return this.raiseError(el, _result,el.name);
				}
			}
		}
		if (pattern != null && !elEmpty && elType != "file") {
			try {
				pattern = new RegExp(pattern);
			} catch (e) {
				return this.raiseError(this.ERR_SYS, "Invalid Regular Expression '"+ pattern +"'");
			}
			if (!pattern.test(el.value)) return this.raiseError(el, "invalid");
		}
		if ((mincheck > 0 || maxcheck > 0) && elType == "check") {
			var _checks = this.form.elements[el.name];
			var _num = 0;
			if (typeof _checks.length != "undefined") {
				for (var j=0; j<_checks.length; j++) {
					if (_checks[j].checked) _num++;
				}
			} else {
				if (_checks.checked) _num++;
			}
			if (mincheck > 0 && _num < mincheck) return this.raiseError(el, "mincheck");
			if (maxcheck > 0 && _num > maxcheck) return this.raiseError(el, "maxcheck");
		}
		if ((minselect > 0 || maxselect > 0) && elType == "multiselect") {
			var _num = 0;
			for (var j=0; j<el.options.length; j++) {
				if (el.options[j].selected) _num++;
			}
			if (minselect > 0 && _num < minselect) return this.raiseError(el, "minselect");
			if (maxselect > 0 && _num > maxselect) return this.raiseError(el, "maxselect");
		}
		if(elType=="file") 
		{
			var fn = el.value;
			if(fn != "") 
			{
				var dotIndex = fn.lastIndexOf(".");
				var ext = fn.substring(dotIndex+1).toLowerCase();
				if(imageonly != null) 
				{
					if(imageonly != "") 
					{
						if(ext != imageonly.toLowerCase())
						{
							return this.raiseError(el, "imageonly_"+imageonly);
						}
					}else 
					{
						if(ext != "jpg" && ext != "jpeg" && ext != "gif" && ext != "png")
						{
							return this.raiseError(el, "imageonly");
						}
					}
				}
			}
		}
		if(fileonly != null && fileonly != '') 
		{
			var fn = el.value;
			if(fn != '') 
			{
				var dotIndex = fn.lastIndexOf(".");
				var ext = fn.substring(dotIndex+1).toLowerCase();
				var arr_fileonly = fileonly.split(",");
				var isfileok = 0;
				for(fi=0; fi<arr_fileonly.length; fi++) 
				{
					if(ext == arr_fileonly[fi].toLowerCase()){
						isfileok = 1;
						break;
					}
				}
				if(isfileok == 0) 
				{
					filetypename = fileonly;
					return this.raiseError(el,"fileonly");
				}
			}
		}
	}
	return true;
}

FormChecker.prototype.isValidElement = function(el) {
	return el.name && el.tagName.match(/^input|select|textarea$/i) && !el.disabled;
}

FormChecker.prototype.isEmpty = function(el, type) {
	switch (type) {
	case "file": case "text": case "hidden":
		if (el.value == null || el.value == "") return true;
		break;
	case "select": case "multiselect":
		if (el.selectedIndex == -1 || el[el.selectedIndex].value == null ||
				el[el.selectedIndex].value == "")
			return true;
		break;
	case "check": case "radio":
		var elCheck = this.form.elements[el.name];
		var elChecked = false;
		if (typeof elCheck.length != "undefined") {
			for (var j=0; j<elCheck.length; j++) {
				if (elCheck[j].checked == true) elChecked = true;
			}
		} else {
			if (elCheck.checked == true) elChecked = true;
		}
		if (elChecked == false) return true;
		break;
	}
	return false;
}

FormChecker.prototype.getType = function(el) {
	switch (el.tagName.toLowerCase()) {
	case "select":
		return el.multiple == true ? "multiselect" : "select";
	case "textarea": return "text";
	case "input":
		switch (el.type.toLowerCase()) {
		case "radio": return "radio";
		case "checkbox": return "check";
		case "file": return "file";
		case "text": case "password": return "text";
		case "hidden": return "hidden";
		}
		break;
	}
}

FormChecker.prototype.raiseError = function(el, type, elName) {
    if (el == this.ERR_SYS) {
		this.errMsg = this.ERR_MSG["system"] + type + " - FormName : "+elNmae;
		return false;
	}
	var pattern = /\{([a-zA-Z0-9_]+)\}/i;
	if(this.ERR_MSG[type]) 
	{
		var msg = this.ERR_MSG[type];
	}else if(this.ERR_MSG_FUNC[type]) 
	{
		var msg = this.ERR_MSG_FUNC[type];
	}else 
	{
		var msg = type;
	}
	
    if(this.lang == "chn") 
	{
		msg = this.SetHtmlcharToString(msg);
	}

	if(type == "fileonly") 
	{
		msg = "["+filetypename+"] "+msg;
	}

		
	
	var elType = this.getType(el);
	var elName = elName ? elName : this.getName(el);
	var errDo = el.getAttribute("ERRDO") ? el.getAttribute("ERRDO") : this.ERR_DO[elType];
	var errFunc = el.getAttribute("ERRFUNC") ? el.getAttribute("ERRFUNC") : "";
	var errNoAlert = el.getAttribute("ERRNOALERT") ? el.getAttribute("ERRNOALERT") : "0";
	var _errDos = errDo ? errDo.split(" ") : [];

	if(el.getAttribute("ERRKEY")!=null && arr_errmsg[type][el.getAttribute("ERRKEY")] != null) 
	{
		msg = arr_errmsg[type][el.getAttribute("ERRKEY")];
	}else 
	{
		if (el.getAttribute("ERRMSG") != null) msg = el.getAttribute("ERRMSG");
	}

	if (pattern.test(msg) == true) {
		while (pattern.exec(msg)) msg = msg.replace(pattern, el.getAttribute(RegExp.$1));
	}

	for (var i in _errDos) {
		switch (_errDos[i]) {
		case "delete": el.value = ""; break;
		case "select": el.select(); break;
		case "focus":  el.focus(); break;
		case "none":break;
		}
	}

	this.errMsg = "["+ elName +"]\n   - "+ msg +"\n";
	if(el.getAttribute("ERRDESC")!=null && arr_errdesc[el.getAttribute("ERRDESC")] != null) 
	{
		this.errMsg += arr_errdesc[el.getAttribute("ERRDESC")];
	}

	this.errFunc = errFunc;
	this.errNoAlert = errNoAlert;
	return false;
}

FormChecker.prototype.getErrorMessage = function() {
	return this.errMsg;
}

FormChecker.prototype.getErrorFunction = function() {
	return this.errFunc;
}


FormChecker.prototype.getName = function(el) {
	return el.getAttribute("HNAME") == null || el.getAttribute("HNAME") == ""
		? el.name : el.getAttribute("HNAME");
}
/**
* validate functions
*/
FormChecker.prototype.func_email = function(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 : "invalid";
}

FormChecker.prototype.func_hangul = function(el) {
	var ishan = true;
	str = el.value;
	for(i=0; i<str.length; i++) 
	{
		if(!((str.charCodeAt(i) > 0x3130 && str.charCodeAt(i) < 0x318F) || (str.charCodeAt(i) >= 0xAC00 && str.charCodeAt(i) <= 0xD7A3))){
			ishan = "func_hangul";
			break;
		}
	}
	alert(ishan);
	return ishan;
}

FormChecker.prototype.func_userid = function(el) {
	/*
	var pattern = /^[-_a-zA-Z0-9]/;
	return pattern.test(el.value) ? true : "숫자, 영문만 포함하여야 합니다";
	*/
	val = el.value;
	var valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ "
	var ok = "yes";
	var temp;
	for (var i=0; i<val.length; i++) {
		temp = "" + val.substring(i, i+1);
		if (valid.indexOf(temp) == "-1") ok = "no";
	}
	if (ok == "no") {
		return "func_userid";
	}else{
		return true;
	}
}

FormChecker.prototype.func_engonly = function(el) {
	var pattern = /^[a-zA-Z]+$/;
	return pattern.test(el.value) ? true : "invalid";
}

FormChecker.prototype.func_number = function(el) {
	var pattern = /^[0-9]+$/;
    
	rtn = pattern.test(el.value) ? true : "func_number";
	
    return rtn
}

FormChecker.prototype.func_residentno = function(el,value) {
	var pattern = /^(\d{6})-?(\d{5}(\d{1})\d{1})$/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "invalid";
	num = RegExp.$1 + RegExp.$2;
	if (RegExp.$3 == 7 || RegExp.$3 == 8 || RegExp.$4 == 9)
		if ((num[7]*10 + num[8]) %2) return "invalid";

	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return "invalid";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	if(RegExp.$3 == 7 || RegExp.$3 == 8 || RegExp.$4 == 9)
		return (11 - mod + 2) % 10 == last ? true : "invalid"; 
	else
		return (11 - mod) % 10 == last ? true : "invalid";
}

FormChecker.prototype.func_jumin = function(el,value) {
	var pattern = /^([0-9]{6})-?([0-9]{7})$/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "invalid";
	num = RegExp.$1 + RegExp.$2;

	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return "invalid";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	if((11 - mod) % 10 == last) 
	{
		return true;
	}else 
	{
		return FormChecker.prototype.func_jurino(el,value);
	}
//	return (11 - mod) % 10 == last ? true : "invalid";
}

FormChecker.prototype.func_foreignerno = function(el,value) {
	var pattern = /^(\d{6})-?(\d{5}[7-9]\d{1})$/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "invalid";
	num = RegExp.$1 + RegExp.$2;
	if ((num[7]*10 + num[8]) %2) return "invalid";

	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return "invalid";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return (11 - mod + 2) % 10 == last ? true : "invalid"; 
}

FormChecker.prototype.func_bizno = function(el,value) {
	var pattern = /([0-9]{3})-?([0-9]{2})-?([0-9]{5})/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "invalid";
	num = RegExp.$1 + RegExp.$2 + RegExp.$3;
	var cVal = 0;
	for (var i=0; i<8; i++) {
		var cKeyNum = parseInt(((_tmp = i % 3) == 0) ? 1 : ( _tmp  == 1 ) ? 3 : 7);
		cVal += (parseFloat(num.substring(i,i+1)) * cKeyNum) % 10;
	}
	var li_temp = parseFloat(num.substring(i,i+1)) * 5 + "0";
	cVal += parseFloat(li_temp.substring(0,1)) + parseFloat(li_temp.substring(1,2));

	if(parseInt(num.substring(9,10)) == 10-(cVal % 10)%10 == true) 
	{
		return true;
	}else 
	{
		return FormChecker.prototype.func_jurino(el,value);
	}
//	return parseInt(num.substring(9,10)) == 10-(cVal % 10)%10 ? true : "invalid";
}

FormChecker.prototype.func_jurino = function(el,value) {

	var sum1 = 0;
	var sum2 = 0;
	var total_sum = 0;
	var noArr = value ? value : el.value;
	
	var pattern = /^([0-9]{6})\-([0-9]{7})$/;
	if(pattern.exec(noArr)) 
	{
		noArr = noArr.substring(0,6)+noArr.substring(7);
	}
	for(i = 0; i < noArr.length - 1; i++){
		if(i % 2 == 0){  // * 1
			sum1 = parseInt(sum1,10) + (parseInt(noArr.substring(i,i+1),10) * 1);
		}else{    // * 2
			sum2 = parseInt(sum2,10) + (parseInt(noArr.substring(i,i+1),10) * 2); 
		}
	}
	total_sum = sum1 + sum2;

	mok = total_sum % 10;
	if(mok != 0){
		mok = 10 - mok;
	}
	if(mok == parseInt(noArr.substring(noArr.length-1,noArr.length),10)){
		return true;
	}else{
		return "invalid";
	}
}

FormChecker.prototype.func_phone = function(el,value) {
	var pattern = /^(0[2-8][0-5]?|01[01346-9])-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var pattern15xx = /^(1544|1566|1577|1588|1644|1688)-?([0-9]{4})$/;
	var num = value ? value : el.value;
	return pattern.exec(num) || pattern15xx.exec(num) ? true : "invalid";
} 

FormChecker.prototype.func_homephone = function(el,value) {
	var pattern = /^(0[2-8][0-5]?)-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var pattern15xx = /^(1544|1566|1577|1588|1644|1688)-?([0-9]{4})$/;
	var num = value ? value : el.value;
	return pattern.exec(num) || pattern15xx.exec(num) ? true : "invalid";
}

FormChecker.prototype.func_mobile = function(el,value) {
	var pattern = /^(01[01346-9])-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var num = value ? value : el.value;
	return pattern.exec(num) ? true : "invalid";
}

FormChecker.prototype.SetHtmlcharToString = function(code) 
{
    strcode = new String(code);
    strcode = strcode.substring(2);
	arr_strcode = strcode.split("&#");
    str = "";
    for(i=0; i<arr_strcode.length; i++) 
    {
        str += String.fromCharCode(arr_strcode[i]);
    }
    return str;
}

function chk_func_jumin(value) {
	var pattern = /^([0-9]{6})-?([0-9]{7})$/;
	var num = value;
	if (!pattern.test(num)) return "invalid";
	num = RegExp.$1 + RegExp.$2;
	var sum = 0;
	var last = num.charCodeAt(12) - 0x30;
	var bases = "234567892345";
	for (var i=0; i<12; i++) {
		if (isNaN(num.substring(i,i+1))) return "invalid";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return (11 - mod) % 10 == last ? true : "false";
}

function func_jurino (el,value) {

	var sum1 = 0;
	var sum2 = 0;
	var total_sum = 0;
	var noArr = value ? value : el.value;;
	var pattern = /^([0-9]{6})-?([1-9]{7})$/;
	if(pattern.exec(noArr)) 
	{
		noArr = noArr.substring(0,6)+noArr.substring(7);
	}

	for(i = 0; i < noArr.length - 1; i++){
		if(i % 2 == 0){  // * 1
			sum1 = parseInt(sum1,10) + (parseInt(noArr.substring(i,i+1),10) * 1);
		}else{    // * 2
			sum2 = parseInt(sum2,10) + (parseInt(noArr.substring(i,i+1),10) * 2); 
		}
	}
	total_sum = sum1 + sum2;

	mok = total_sum % 10;
	if(mok != 0){
		mok = 10 - mok;
	}
	if(mok == parseInt(noArr.substring(noArr.length-1,noArr.length),10)){
		return true;
	}else{
		return false;
	}
}