/***
*	RedCat's FormValidator 0.1 [2008-01-03]
*	거친마루님의 작성된 validate 와 Goonoo Kim님의 Miya Validator 스크립트를 바탕으로 수정,보완되었음.
*	※ 본 주석 삭제 금지
***/

arr_err_msg_kor = new Array();
var arr_err_msg_kor = {system   : "FormChecker Error: ",
	required			: "반드시 입력하셔야 하는 사항입니다.",
	requiredstring	: "반드시 {required}(으)로 입력하셔야 하는 사항입니다.",
	match				: "입력된 내용이 {matchfield}과(와) 일치하지 않습니다.",
	invalid				: "입력된 내용이 올바르지 않습니다.",
	minbyte			: "입력된 내용의 길이가 {minbyte}Byte 이상이어야 합니다.",
	maxbyte			: "입력된 내용의 길이가 {maxbyte}Byte를 초과할 수 없습니다.",
	mincheck			: "{mincheck} 개의 항목 이상으로 선택하세요.",
	maxcheck			: "{maxcheck} 개의 항목 이하로 선택하세요.",
	minselect			: "{minselect}개의 항목 이상으로 선택하세요.",
	maxselect		: "{maxselect}개의 항목 이하로 선택하세요.",
	minstrlen			: "입력된 내용의 글자 수가 {minstrlen}자 이상이어야 합니다.",
	maxstrlen			: "입력된 내용의 글자 수가 {maxstrlen}자 이하이어야 합니다.",
	minnumber		: "{minnumber} 이상이어야 합니다.",
	maxnumber		: "{maxnumber} 이하이어야 합니다.",
	imageonly		: "이미지 파일만 첨부 할 수 있습니다.",
	fileonly				: "지정된 파일만 첨부 할 수 있습니다.\n첨부가능파일 : {fileonly}",		// fileonly : ["jpg","gif"] 형식으로 등록된 파일만.

	/* for group */
	requiremin		: "{requiremin}개 이상의 항목이 입력되어야 합니다.",
	requiremax		: "{requiremax}개 이하의 항목이 입력되어야 합니다.",

	/* for format */
	email				: "이메일 형식이 올바르지 않습니다.",
	hangul				: "반드시 한글로 입력하셔야 합니다.",
	engonly			: "영문으로만 입력하셔야 합니다.",
	number			: "숫자로만 입력하셔야 합니다.",
	alnum				: "영문과 숫자의 조합만 가능합니다.",
	residentno		: "주민등록번호 형식이 올바르지 않습니다.",
	jumin				: "주민등록번호 형식이 올바르지 않습니다.",
	foreignerno		: "외국인등록번호 형식이 올바르지 않습니다.",
	bizno				: "사업자등록번호 형식이 올바르지 않습니다.",
	phone				: "전화번호 형식이 올바르지 않습니다.",
	homephone		: "유선 전화번호(팩스) 형식이 올바르지 않습니다.",
	mobile				: "핸드폰번호 형식이 올바르지 않습니다.",
	isdate				: "날짜 형식이 올바르지 않습니다.",
	zip					: "우편번호 형식이 올바르지 않습니다.",
	jurino				: "올바른 법인번호가 아닙니다.",
	juribizno			: "올바른 사업자등록(법인)번호가 아닙니다."
}

arr_err_msg_eng = new Array();
arr_err_msg_eng = {
	required			: "Please fill in this field.",
	requiredstring	: "Please fill in this field with {required}",
	match				: "You have supplied incorrect details. ({matchfield})",
	invalid				: "The information you typed has invalid format.",
	minbyte			: "{minbyte}-byte minimum.",
	maxbyte			: "{maxbyte}-byte 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).",
	minstrlen			: "{minstrlen} characters minimum",
	maxstrlen			: "{minstrlen} characters maximum",
	minnumber		: "{minnumber} minimum.",
	maxnumber		: "{maxnumber} maximum.",
	imageonly		: "Image files only can be attached.",
	fileonly				: "Files only can be attached.\n{fileonly}",		// fileonly : ["jpg","gif"] 형식으로 등록된 파일만.

	/* for group */
	requiremin		: "Please fill in at least {requiremin} field(s)",
	requiremax		: "Please fill in limited to {requiremax} field(s)",

	/* for format */
	email				: "The information you typed has invalid format(e-mail).",
	hangul				: "Field(s) required only Korean",
	engonly			: "Field(s) required only English",
	number			: "Field(s) required only Numbers",
	alnum				: "Field(s) required only English or Numbers",
	residentno		: "The information you typed has invalid format(a resident registration number).",
	jumin				: "The information you typed has invalid format(a resident registration number).",
	foreignerno		: "The information you typed has invalid format(a foreigner registration number).",
	bizno				: "The information you typed has invalid format(a business registration number).",
	phone				: "The information you typed has invalid format(a phone number).",
	homephone		: "The information you typed has invalid format(a telephone(FAX) number).",
	mobile				: "The information you typed has invalid format(a mobile phone number).",
	isdate				: "The information is invalid a date",
	zip					: "The information is invalid a zipcode",
	jurino				: "The information you typed has invalid format(a corporation number).",
	juribizno				: "The information you typed has invalid format(a corporation number)."
}
arr_err_msg = new Array();
arr_err_msg = {kor : arr_err_msg_kor,eng:arr_err_msg_eng}


FormValidator = function (form,lang,alerttype)
{
	this.lang = lang?lang:"kor";
	this.form = FormValidator.getForm(form);
	if (!this.form){
		return false;
	}
	this.errmsg = arr_err_msg[this.lang];
	this.arr_options_keygroup = [];
	this.arr_options = [];
	this.arr_options_len = 0;
	this.arr_groupoptions = {}
	this.errorlabel = null;
	this.errorobj = null;
	this.errortype = null;
	this.errmsgfield = $("formvalidate_errmsg");
	
	this.scrollobj = document.body;
	this.scrolltopmargin = 0;
	
	this.alerttype = alerttype?alerttype:0;

	this.ERR_DO = {
		1	: "select focus",
		2	: "focus",
		3	: "focus",
		4	: "focus",
		5	: "focus",
		6	: "focus",
		7	: ""
	}
	
	if(this.oerrmsgfield == null || typeof(this.oerrmsgfield) == "undefined") 
	{
		div = document.createElement("div");
		document.body.appendChild(div);
		div.id = "formvalidate_errmsg";
		div.style.position = "absolute";
		div.style.display = "none";
		div.style.zIndex = "2000";
		div.noWrap = true;
		this.errmsgfield = $("formvalidate_errmsg");
	}
	
	var t = this;
	_errmsgfield = this.errmsgfield
	var errmsgvutime;
	errmsghide = function (obj) 
	{
		clearTimeout(errmsgvutime)
		t.errmsgfield.hide();
	}
	FormFunc.addEvent(_errmsgfield,"mouseover",function ()
	{
		clearTimeout(errmsgvutime)
		errmsgvutime = setTimeout(errmsghide,1000)
	})
	
	FormFunc.addEvent(_errmsgfield,"mousedown",function ()
	{
			/*
		clearTimeout(errmsgvutime)
		_errmsgfield.hide();	 
		*/
		clearTimeout(errmsgvutime)
		errmsgvutime = setTimeout(errmsghide,0)
	})
		
	FormFunc.addEvent(_errmsgfield,"keyup",function ()
	{
		/*
		clearTimeout(errmsgvutime)
		_errmsgfield.hide();	 
		*/
		clearTimeout(errmsgvutime)
		errmsgvutime = setTimeout(errmsghide,500)
	})
}

FormValidator.getForm = function (form)
{
	if (form.tagName)
		return form;
	else if (document.getElementById
			&& document.getElementById(form))
		return document.getElementById(form);
	else if (document.forms
			&& document.forms[form])
		return document.forms[form];
	else
		return false;
}
/*
FormValidator.FUNCTIONS_MAP = {
	email			: "FormFunc.email"
	,hangul		: "FormFunc.hangul"
	,engonly		: "FormFunc.engonly"
	,number		: "FormFunc.number"
	,alnum			: "FormFunc.alnum"
	,residentno	: "FormFunc.residentno"
	,jumin			: "FormFunc.jumin"
	,foreignerno: "FormFunc.foreignerno"
	,bizno			: "FormFunc.bizno"
	,phone			: "FormFunc.phone"
	,homephone: "FormFunc.homephone"
	,mobile			: "FormFunc.mobile"
	,isdate			: "FormFunc.isdate"
	,zip				: "FormFunc.zip"
	,fileonly		: "FormFunc.fileonly"
	,jurino			: "FormFunc.jurino"
	,required		: "FormFunc.required"
	,pattern		: "FormFunc.pattern"
	,selectlimit		: "FormFunc.selectlimit"
	,checklimit		: "FormFunc.checklimit"
	,strlenlimit		: "FormFunc.strlenlimit"
	,numberlimit		: "FormFunc.numberlimit"
	,imageonly		: "FormFunc.imageonly"
	,fileonly		: "FormFunc.fileonly"
	,match		: "FormFunc.match"
}
*/

FormValidator.ERROR_MESSAGE_PATTERN = "[{label}] {message}";

FormValidator.TEXT = 1;
FormValidator.SELECT = 2;
FormValidator.MULTI_SELECT = 3;
FormValidator.CHECK = 4;
FormValidator.RADIO = 5;
FormValidator.FILE = 6;
FormValidator.HIDDEN = 7;

/***
* 제약조건 추가
***/
/*adfa
*/
//

FormValidator.prototype.add = function (elname,eloptions,ellabel,elkey,errmsg,elattribute,elnokey,alerttype)
{
	elkey = (typeof(elkey) == "undefined" || String(elkey) == "")?"all":parseInt(elkey);
	element = this.getFormElement(elname);
	
	eltype = FormFunc.getElementType(element);
	

	if(element == false || eloptions == "undefined")
		return false;
	
	if(typeof(this.arr_options[elname]) == "undefined"){
		this.arr_options[elname] = [];
	}
	if(typeof(eloptions["movefocus"]) != "undefined")
	{
		nextelm = eloptions["movefocus"][1]?this.getFormElement(eloptions["movefocus"][1]):FormFunc.getNextElement(element);
		
		if(nextelm != null && (eltype == FormValidator.TEXT || eltype == FormValidator.SELECT || eltype == FormValidator.FILE))
		{
			if(eltype == FormValidator.TEXT){
				acttype = "keyup";
			}else
			{
				acttype = "change";
			}
			
			if(!(element == false || element.disabled == true || elname == "" || elname == "undefined" || typeof(this.arr_options[elname]) == "undefined"))
			{
				FormFunc.addEvent(element,acttype,function (e)
				{
					if(acttype == "keyup")
					{
						if(this.value.length >= eloptions["movefocus"][0])
						{
							nextelm.focus();
						}
					}else
					{
						nextelm.focus();
					}
				})
			}
		}
	}
	
	FormFunc.addEvent(element,"mousedown",function () 
	{
		_errmsgfield = $("formvalidate_errmsg");
		_errmsgfield.hide();
	})
	FormFunc.addEvent(element,"keyup",function () 
	{
		_errmsgfield = $("formvalidate_errmsg");
		_errmsgfield.hide();
	})
	
	if(typeof(this.arr_options_keygroup[elname]) == "undefined"){
		this.arr_options_keygroup[elname] = [];
	}
	this.arr_options_keygroup[elname][this.arr_options_keygroup[elname].length] = elkey;
	this.arr_options[elname][elkey] = [];
	this.arr_options[elname][elkey]["eloptions"] = eloptions;
	this.arr_options[elname][elkey]["labelname"] = ellabel?ellabel:elname;
	this.arr_options[elname][elkey]["eltype"] = eltype;
	this.arr_options[elname][elkey]["alerttype"] = (String(alerttype) == ""||typeof(alerttype)=="undefined")?this.alerttype:alerttype;
	this.arr_options[elname][elkey]["elnokey"] = (typeof(elnokey) != "undefined"||elnokey!="undefined"||String(elnokey)!="")?String(elnokey).split(","):null;
	this.arr_options[elname][elkey]["errmsg"] = (typeof(errmsg) != "undefined" && String(errmsg) != "")?errmsg:"";
	this.arr_options_len++;
	
	if (typeof(elattribute) != "undefined")
	{
		for (ea in elattribute)
		{
			element.setAttribute (ea,elattribute[ea]);
		}
	}
}

/***
* 객체반환
***/
FormValidator.prototype.getFormElement = function (elname,form)
{
	form = form?form:this.form;
	if(typeof(form[elname]) == "undefined"){
		return false;
	}

	if (form && form.elname){
		return form.elname;
	}else if(form && form[elname]){
		return form[elname];
	}else if (document.getElementById && document.getElementById(elname)){
		return document.getElementById(elname);
	} else{
		return false;
	}
}
/***
* 제약조건 호출
***/
FormValidator.prototype.getOptions = function (elname,elkey)
{
	elkey = (typeof(elkey) == "undefined" || String(elkey) == "")?"all":elkey;
	if(typeof(this.arr_options[elname][elkey]) == "undefined")
	{
		return false;
	}
	return this.arr_options[elname][elkey];
}


/***
* 제약조건 검사
***/
FormValidator.prototype.formValidate = function ()
{
	tmpobjname = "";
	resultvalidator = true;
	FormFunc.form = this.form;
	this.errmsgfield.hide();
	arr_tmpelm = new Array();

	for(var i=0; i<this.form.elements.length; i++)
	{
		elname = this.form.elements[i].name;
		if(arr_tmpelm[this.form.elements[i].name] == 1) 
		{
			continue;
		}
		arr_tmpelm[this.form.elements[i].name] = 1

		if(tmpobjname != "" && elname == tmpobjname)
		{
			continue;
		}
		
		
		tmpobjname = elname;
		elid = this.form.elements[i].id;
		if(elid != "" && elid != "undefined" && elname == "")
		{
			elname = elid;
		}
		
		element = this.getFormElement(elname);
		
		if(element == false || element.disabled == true || elname == "" || elname == "undefined" || typeof(this.arr_options[elname]) == "undefined")
		{
			continue;
		}
//		alert(this.arr_options[elname][0]["labelname"]);
		
		
		if(element.length > 0 && typeof(element.name) == "undefined")
		{
			var arr_options_keygroup_tmp = $A(this.arr_options_keygroup[elname]);


//			for(v in this.arr_options[elname]){
			var tt = this;
			var rtn = true;

			arr_options_keygroup_tmp.each(function(v) {
				/*
				if(typeof(v) != "number" && v != "all") 
				{
					return ;
				}
				if(v == "inArray" || v == "elnokey" || v == "eloptions"){return;}
				*/
				
				if(v == "elnokey") 
				{
					return true;
				}
				
				if(v == "all")
				{
					
					for(j = 0 ;j < element.length;j++)
					{
//						if(v == "inArray" || v == "elnokey" || v == "eloptions"){return true;;}
						if(v == "elnokey"){
							
							rtn = true;
						}
						if(typeof(tt.arr_options[elname][v]["elnokey"]) != "undefined" && tt.arr_options[elname][v]["elnokey"] != null)
						{
							try{
								if(inArray(tt.arr_options[elname][v]["elnokey"],String(j)) == true)
								{
									return;
								}
							}catch(e){}
						}
						
						resultvalidator = tt.exeValidate(elname,"all",element[j]);
						if(resultvalidator != true)
						{
							rtn = false;
							return;
						}
					}
					
				}else
				{
					try{element.length}catch(e){ return true;;}
					if (v > element.length)
					{
						rtn = false;
					}
					resultvalidator = tt.exeValidate(elname,v,element[v]);
					if(resultvalidator != true)
					{
						rtn = false;
						return;
					}
				}
			}
			);
			if(rtn != true) 
			{
				return false;
			}
		}else
		{
			resultvalidator = this.exeValidate(elname,"all",element)
			if(resultvalidator != true)
			{
				return false;
			}
		}
	}
	return true;
}
// 조건 검사 실행
FormValidator.prototype.exeValidate = function (elname,elkey,formobj)
{
	arr_options = this.getOptions(elname,elkey);
	arr_eloption = arr_options["eloptions"];
	
	eltype = arr_options["eltype"]?arr_options["eltype"]:FormFunc.getElementType(formobj);
	try{
		if(typeof(arr_eloption["trimvalue"]) != "undefined")
		{
			formobj.value = FormFunc.trim(formobj.value,arr_eloption["trimvalue"]);
		}
	}catch(e){
		return true;
	}
	
	objvalue = FormFunc.getValue(formobj);
	if (objvalue == null && typeof(formobj.length) != "undefined")
	{
		return true;
	}
	
	
	glue = typeof(arr_eloption["glue"])=="undefined"?"":arr_eloption["glue"];
	span = typeof(arr_eloption["span"])=="undefined"?0:arr_eloption["span"];
	if(span > 0)
	{
		var spanedValue = objvalue;
		var _elementForSpan = formobj;
		for (var j=1; j<span; j++) {
			_elementForSpan = FormFunc.getNextElement(_elementForSpan);
			if (_elementForSpan) {
				if (typeof glue == "object" && glue.length + 1 == span) {
					spanedValue += glue[j-1] + FormFunc.getValue(_elementForSpan);
				} else {
					spanedValue += glue + FormFunc.getValue(_elementForSpan);
				}
			}
		}
		objvalue = spanedValue;
	}
	if (span < 0)
	{
		span = span * -1;
		var spanedValue = objvalue;
		var _elementForSpan = formobj;
		for (var j=span; j>1; j--) {
			
			_elementForSpan = FormFunc.getBeforeElement(_elementForSpan);
			
			if (_elementForSpan) {
				if (typeof glue == "object" && glue.length + 1 == span) {
					spanedValue = FormFunc.getValue(_elementForSpan) + glue[j-1] + spanedValue;
				} else {
					spanedValue = FormFunc.getValue(_elementForSpan) + glue + spanedValue;
				}
			}
		}
		objvalue = spanedValue;
	}
	for(opt in arr_eloption){
		
		if(typeof(eval("FormFunc."+opt)) == "undefined")
		{
			
			continue;
		}
		
		if (opt != "required" && opt != "match" && (objvalue ==null || objvalue =="") && eltype == FormValidator.TEXT)
		{
			continue;
		}
		
		formfunction = eval("FormFunc."+opt);
		
		formresult = formfunction(formobj,arr_eloption[opt],objvalue,arr_options,eltype);
		
		if(formresult != true)
		{
			return this.raiseError(opt,formobj,elname,elkey,formresult);
		}
	}
	if(typeof(arr_eloption["userfunc"]) != "undefined" && String(arr_eloption["userfunc"]) != "") 
	{
		d = eval(arr_eloption["userfunc"]);
	}
	return true;
}

FormValidator.prototype.raiseError = function (opt,formobj,elname,elkey,formresult)
{
	
	this.errorlabel = this.arr_options[elname][elkey]["labelname"]?this.arr_options[elname][elkey]["labelname"]:elname;
	this.errorobj = formobj;
	this.errorType = formresult;
	
	alerttype = this.arr_options[elname][elkey]["alerttype"]?this.arr_options[elname][elkey]["alerttype"]:this.alerttype;
	
	this.alertErrorMessage(alerttype,this.arr_options[elname][elkey]);
	
	var _errDos = this.arr_options[elname][elkey]["eloptions"]["errdo"]? this.arr_options[elname][elkey]["eloptions"]["errdo"].split(" ") : this.ERR_DO[FormFunc.getElementType(this.errorobj)].split(" ");
	try{
		for (var i in _errDos) {
			switch (_errDos[i]) {
				case "delete": this.errorobj.value = ""; break;
				case "select": this.errorobj.select(); break;
				case "focus":  this.errorobj.focus(); break;
				case "none":break;
			}
		}
	}catch(e){}
	errfunc = this.arr_options[elname][elkey]["eloptions"]["errfunc"]
	if(typeof(errfunc) != "undefined" && String(errfunc) != "") 
	{
		eval(errfunc);
	}

	return false;
}

FormValidator.prototype.alertErrorMessage = function (alerttype,arr_erroptions,msg)
{
	if(typeof(msg) != "undefined") 
	{
		errmsg = msg
	}else 
	{
		errmsg = this.getErrorMessage(arr_erroptions);
	}
	
	if(alerttype == "1") 
	{
		return false;
	}else if(alerttype == "0")
	{
		alert("[" + this.errorlabel + "]\n\n" +errmsg);
	}else if(alerttype == "2")
	{
		el_top = FormFunc.getRealOffsetTop(this.errorobj);
		el_left = FormFunc.getRealOffsetLeft(this.errorobj);
		this.errmsgfield.innerHTML = "<b style=\"color:red\">[" + this.errorlabel + "]</b>" +errmsg;
		this.errmsgfield.style.display = "";
		this.errmsgfield.style.backgroundColor="#FFFF99";
		elwidth = this.errorobj.offsetWidth;
		emsgw = parseInt(this.errmsgfield.offsetWidth);
		if(document.body.scrollWidth > el_left+elwidth+10+emsgw) 
		{
			this.errmsgfield.style.left = el_left+elwidth+10;
		}else 
		{
			this.errmsgfield.style.left = el_left+20;
		}

		this.errmsgfield.style.top = el_top;
		this.errmsgfield.style.fontSize = "12px";
		this.errmsgfield.style.borderStyle = "solid";
		this.errmsgfield.style.borderWidth = "1px";
		this.errmsgfield.style.borderColor = "#FFCC00";
		this.errmsgfield.style.padding = "5";
		if(this.scrolltopmargin > 0)
		{
			this.scrollobj.scrollTop =  el_top - this.scrolltopmargin;
		}
		
	}
	var t = this;
	var focustime = "";
	_setfocus  = function (obj) 
	{
		try{
			t.errorobj.focus();
		}catch(e){}
	}
	try{
		clearTimeout(focustime);
		focustime = setTimeout(_setfocus,500);
//		this.errorobj.focus();
	}catch(e){}
	return false;
}



FormValidator.prototype.getErrorMessage = function(errOptions) {

	if (!this.errorType)
		return null;
	optionsObj = errOptions["eloptions"];
	if(typeof(this.errorType) == "object") 
	{
		arr_errtype = this.errorType;
		this.errorType = arr_errtype[1];
		this.errorCondition = arr_errtype[0];
		optionsObj = optionsObj[this.errorCondition];
	}

	errmessage = errOptions["errmsg"]==""?arr_err_msg[this.lang][this.errorType]:errOptions["errmsg"];
	
	
	var dynamicPattern = /\{([a-z0-9_]+)\}/i;
	if (dynamicPattern.test(errmessage) == true) {
		while (dynamicPattern.exec(errmessage)) {
			if (RegExp.$1 && optionsObj[RegExp.$1]) {
				errmessage = errmessage.replace(dynamicPattern, optionsObj[RegExp.$1]);
			} else {
				break
			}
		}
	}
	if(this.errorType == "match") 
	{
		arr_match = optionsObj["match"];
		matchlabel = typeof(arr_match["matchlabel"]) != "undefined"?arr_match["matchlabel"]:arr_match["matchfield"];
		errmessage = errmessage.replace("{matchfield}",matchlabel);
	}
	return errmessage;

};

/***
* 검사함수모음
***/
var FormFunc = {}
FormFunc.inArray = function(arr,value){
	for (i=0; i < arr.length; i++) {
		if (arr[i] === value) {
			return true;
		}
	}
	return false;
}

// 이벤트등록
FormFunc.addEvent = function(o, t, f, l)
{
	var d = 'addEventListener', n = 'on' + t, rO = o, rT = t, rF = f, rL = l;
	if (o[d] && !l) return o[d](t, f, false);
	if (!o._evts) o._evts = {}
	if (!o._evts[t])
	{
		o._evts[t] = o[n] ? { b: o[n] } : {}
		o[n] = new Function('e',
		'var r = true, o = this, a = o._evts["' + t + '"], i; for (i in a) {' +
		'o._f = a[i]; r = o._f(e||window.event) != false && r; o._f = null;' +
		'} return r');
		if (t != 'unload') FormFunc.addEvent(window, 'unload', function() {
			FormFunc.removeEvent(rO, rT, rF, rL);
		});
	}
	if (!f._i) f._i = FormFunc.addEvent._i++;
	o._evts[t][f._i] = f;
}
FormFunc.addEvent._i = 1;

FormFunc.removeEvent = function(o, t, f, l)
{
	var d = 'removeEventListener';
	if (o[d] && !l) return o[d](t, f, false);
	if (o._evts && o._evts[t] && f._i) delete o._evts[t][f._i];
}

//페이지상의 Y좌표
FormFunc.getRealOffsetTop = function(o)
{
	return o ? o.offsetTop + this.getRealOffsetTop(o.offsetParent) : 0;
}
//페이지상의 X좌표
FormFunc.getRealOffsetLeft = function(o)
{
	return o ? o.offsetLeft + this.getRealOffsetLeft(o.offsetParent) : 0;
}
//폼요소의 값
FormFunc.getValue = function(element) {
	var type = FormFunc.getElementType(element);
	switch (type) {
		case FormValidator.TEXT:
		case FormValidator.HIDDEN:
		case FormValidator.FILE:
			return element.value;
			break;
		case FormValidator.SELECT:
			for (var i=0, l=element.options.length; i<l; i++) {
				if (element.options[i].selected) {
					return element.options[i].value;
				}
			}
			return "";;
			break;
		case FormValidator.MULTI_SELECT:
			var values = [];
			for (var i=0, l=element.options.length; i<l; i++) {
				if (element.options[i].selected) {
					values[values.length] = element.options[i].value;
				}
			}
//			return values.length > 0 ? values : null;
			return values;
			break;
		case FormValidator.CHECK:
			if (element.form && element.name) {
				var checkElements = element.form.elements[element.name];
				var values = [];
				if (checkElements.length) {
					for (var i=0; i<checkElements.length; i++) {
						if (checkElements[i].checked == true)
							values[values.length] = checkElements[i].value;
					}
				} else {
					if (checkElements.checked == true)
						values[values.length] = checkElements.value;
				}
				return values;
//				return values.length > 0 ? values : null;
			}
			break;
		case FormValidator.RADIO:
			if (element.form && element.name) {
				var checkElements = element.form.elements[element.name];
				if (checkElements.length) {
					for (var i=0; i<checkElements.length; i++) {
						if (checkElements[i].checked == true)
							return checkElements[i].value;
					}
				} else {
					if (checkElements.checked == true)
						return checkElements.value;
				}
			}
			break;
	}
	return null;
}
// 폼요소의 type
FormFunc.getElementType = function(element) {
	if(!element)
	{
		return false;
	}
	try {
		if (!element.tagName){
			element = element[0];
		}
	}catch(e){
		return false
	}

	var tagName = element.tagName.toLowerCase();
	var type = element.type;
	var multiple = element.multiple;
	
	if (tagName == "textarea" ||
			(tagName == "input" && (type == "text" || type == "password")))
		return FormValidator.TEXT;
	else if (tagName == "select" && multiple)
		return FormValidator.MULTI_SELECT;
	else if (tagName == "select")
		return FormValidator.SELECT;
	else if (tagName == "input" && type == "checkbox")
		return FormValidator.CHECK;
	else if (tagName == "input" && type == "radio")
		return FormValidator.RADIO;
	else if (tagName == "input" && type == "file")
		return FormValidator.FILE;
	else if (tagName == "input" && type == "hidden")
		return FormValidator.HIDDEN;
	else
		return false;
}
//다음요소
FormFunc.getNextElement = function (element)
{
	if (element.form) {
		var form = element.form;
		for (var i=0, l=form.elements.length; i<l; i++) {
			if (form.elements[i] == element) {
				var count = i;
				while (++count < form.elements.length
						&& FormFunc.isActiveFormControl(form.elements[count])) {
					return form.elements[count];
				}
			}
		}
	} else if (element.nextSibling) {
		var _nextElement = element;
		while (_nextElement = element.nextSibling) {
			if (FormFunc.isActiveFormControl(_nextElement))
				return _nextElement;
		}
	}
	return null;
}
//이전요소
FormFunc.getBeforeElement = function (element)
{
	if (element.form) {
		
		var form = element.form;
		for (var i=form.elements.length-1, l=0; i>l; i--) {
			if (form.elements[i] == element) {
				var count = i;
				while (--count > 0
						&& FormFunc.isActiveFormControl(form.elements[count])) {
					return form.elements[count];
				}
			}
		}
	} else if (element.beforeSibling) {
		var _bforElement = element;
		while (_bforElement = element.beforeSibling) {
			if (FormFunc.isActiveFormControl(_bforElement))
				return _bforElement;
		}
	}
	return null;
}
// 활성화여부
FormFunc.isActiveFormControl = function(element) {
	if(!element){
		return false;
	}
	return element.tagName && element
			&& element.tagName.match(/^input|select|textarea$/i)
			&& !element.disabled;
}

// 값유무 여부
FormFunc.required = function (el,optval,value,arr_options,eltype)
{
	var value = value?value:el.value;
	
	value = FormFunc.getValue(el);
	
	if(optval == true)
	{
		value = value;
	}else{
		val = FormFunc.trim(value,optval);
		if(val == false)
		{
			if(val != value)
			{
				return "requiredstring";
			}
		}
	}
	if(value == "" || value == null)
	{
		return "required";
	}
	return true;
}
//Trim
FormFunc.trim = function (value,optval)
{
	var val = value;
	 if(optval == "compress")
	{
		val = val.replace(/\s+/g, "");
	}else if(optval == "trim")
	{
		val= val.replace(/^\s+/, "").replace(/\s+$/, "");
	}else if(optval == "rtrim")
	{
		val = val.replace(/\s+$/, "");
	}else if(optval == "ltrim")
	{
		val = val.replace(/^\s+/, "");
	}else
	{
		val= val.replace(/^\s+/, "").replace(/\s+$/, "");
	}
	return val;
}
//이메일유효성
FormFunc.email = function (el,optval,value,arr_options,eltype)
{
	var value = el.value;
	var pattern = /^[_a-zA-Z0-9-\.]+@[\.a-zA-Z0-9-]+\.[a-zA-Z]+$/;
	return pattern.test(value) ? true : "email";
}
//한글
FormFunc.hangul = function (el,optval,value,arr_options,eltype)
{
	var value = value ? value : el.value;
	var pattern = /^[ㄱ-힣]+$/;
	return pattern.test(value) ? true : "hangul";
}
//영어
FormFunc.engonly = function (el,optval,value,arr_options,eltype)
{
	var value = value ? value : el.value;
	var pattern = /^[a-zA-Z]+$/;
	return pattern.test(value) ? true : "engonly";
}
//숫자
FormFunc.number = function (el,optval,value,arr_options,eltype)
{
	var value = value ? value : el.value;
	var pattern = /^[0-9]+$/;
	return pattern.test(value) ? true : "number";
}
//영어,숫자
FormFunc.alnum = function (el,optval,value,arr_options,eltype)
{
	var value = value ? value : el.value;
	var pattern = /^[0-9a-zA-Z]+$/;
	return pattern.test(value) ? true : "number";
}
//주민등록번호
FormFunc.residentno = function (el,optval,value,arr_options,eltype) {
	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 "residentno";

	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 "residentno";
		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 : "residentno";
	else
		return (11 - mod) % 10 == last ? true : "residentno";
}
//주민등록번호
FormFunc.jumin = function (el,optval,value,arr_options,eltype) {
	var pattern = /^([0-9]{6})-?([0-9]{7})$/;
	var num = value ? value : el.value;
	
	if (!pattern.test(num)) return "jumin";
	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 "jumin";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return (11 - mod) % 10 == last ? true : "jumin";
}
//전화번호(집전화,모바일)
FormFunc.phone = function (el,optval,value,arr_options,eltype) {

	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.test(num) || pattern15xx.test(num) ? true : "phone";
}
//외국인번호
FormFunc.foreignerno = function (el,optval,value,arr_options,eltype) {
	var pattern = /^(\d{6})-?(\d{5}[7-9]\d{1})$/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "foreignerno";
	num = RegExp.$1 + RegExp.$2;
	if ((num[7]*10 + num[8]) %2) return "foreignerno";

	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 "foreignerno";
		sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
	}
	var mod = sum % 11;
	return (11 - mod + 2) % 10 == last ? true : "foreignerno";
}
//사업자등록번호
FormFunc.bizno = function (el,optval,value,arr_options,eltype) {
	var pattern = /([0-9]{3})-?([0-9]{2})-?([0-9]{5})/;
	var num = value ? value : el.value;
	if (!pattern.test(num)) return "bizno";
	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));
	return parseInt(num.substring(9,10)) == 10-(cVal % 10)%10 ? true : "bizno";
}
// 집,휴대 전화
FormFunc.phone = function (el,optval,value,arr_options,eltype) {
	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.test(num) || pattern15xx.test(num) ? true : "phone";
}
// 집전화
FormFunc.homephone = function (el,optval,value,arr_options,eltype) {
	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.test(num) || pattern15xx.test(num) ? true : "homephone";
}
// 휴대전화
FormFunc.mobile = function (el,optval,value,arr_options,eltype) {
	var pattern = /^(01[01346-9])-?([1-9]{1}[0-9]{2,3})-?([0-9]{4})$/;
	var num = value ? value : el.value;
	return pattern.test(num) ? true : "handphone";
}
// 날짜형식
FormFunc.isdate = function (el,optval,value,arr_options,eltype) {
	var value = value ? value : el.value;
	glue = typeof(arr_options["eloptions"]["glue"])=="undefined"?"-":arr_options["eloptions"]["glue"];
	var arrdate = new Array();
	tmpvalue = value.replace(/[0-9]+/g, "");
	if(tmpvalue != "")
	{
		t = value;
		for(var i=0; i<tmpvalue.length; i++)
		{
			arrdate[i] = t.substring(t.indexOf(tmpvalue.substring(i,i+1)),-2);
			t = t.substring(t.indexOf(tmpvalue.substring(i,i+1))+1);
			if(i == tmpvalue.length-1)
			{
				arrdate[i+1] = t;
			}
		}
	}else
	{
		arrdate[0] = value.substring(0,4);
		arrdate[1] = value.substring(4,6);
		arrdate[2] = value.substring(6,8);
	}
	--arrdate[1];
	var datekey = new Date(arrdate[0], arrdate[1], arrdate[2]);
	//getFullYear();는 100년 이하 검색불가
	dateformat = arrdate.join("-");
	var pattern = /^[12][0-9]{3}\-[01]?[0-9]\-[0-3]?[0-9]$/;
	if(datekey.getYear()!=arrdate[0] || datekey.getMonth()!=arrdate[1] || datekey.getDate()!=arrdate[2] || pattern.test(dateformat) != true)
	{
		return "isdate";
	}
	if(optval == "revalue")
	{
		el.value = arrdate.join(glue);
	}
	return true;
}
// 우편번호
FormFunc.zip = function (el,optval,value,arr_options,eltype) {
	var value = value ? value : el.value;
	var pattern = /^[0-9]{3}\-[0-9]{3}$/;
	return pattern.test(value) ? true : "zip";
}
//법인번호
FormFunc.jurino = function (el,optval,value,arr_options,eltype) {
	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(var 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 "jurino";
	}
}
FormFunc.juribizno = function (el,optval,value,arr_options,eltype) 
{
	if(this.jurino(el,optval,value,arr_options,eltype) != true && this.bizno(el,optval,value,arr_options,eltype) != true) 
	{
		return "juribizno";
	}else 
	{
		return true;
	}
}
// 사용자정의 패턴검사
FormFunc.pattern = function (el,optval,value,arr_options,eltype) {

	if (eltype != FormFunc.FILE) {
		patternRegExp = new RegExp(pattern);
		if (typeof value == "object") {
			for (var i=0; i<value.length; i++) {
				if (!patternRegExp.test(value[i])) {
					return "pattern";
				}
			}
		} else if (!patternRegExp.test(value)) {
			return "pattern";
		}
	}
	return true;
}
// 최소,최다선택 확인
FormFunc.selectlimit = function (el,optval,value,arr_options,eltype)
{
	if(eltype != FormValidator.MULTI_SELECT)
	{
		return true;
	}
	minselect = optval["minselect"]?optval["minselect"]:0;
	maxselect = optval["maxselect"]?optval["maxselect"]:0;
	if(minselect > 0 && value.length < minselect)
	{
		return ["selectlimit","minselect"];
	}
	if(maxselect > 0 && value.length > maxselect)
	{
		return ["selectlimit","maxselect"];
	}
	return true;
}
// 최소,최다 체크 확인
FormFunc.checklimit = function (el,optval,value,arr_options,eltype)
{
	if(arr_options["eltype"] != FormValidator.CHECK && arr_options["eltype"] != FormValidator.RADIO)
	{
		return true;
	}
	
	mincheck = optval["mincheck"]?optval["mincheck"]:0;
	maxcheck = optval["maxcheck"]?optval["maxcheck"]:0;
	
	try{
		if(mincheck > 0 && value.length < mincheck)
		{
			return ["checklimit","mincheck"];
		}
		if(maxcheck > 0 && value.length > maxcheck)
		{
			return ["checklimit","maxcheck"];
		}
	}catch(e){
		tmpel = FormFunc.getFormElement(el.name,el.form);
		if(typeof(tmpel.length) != "undefined") 
		{
			alert(tmpel.length);
			return true;
			chkcount = 0;
			for(var minci=0; minci<tmpel.length; minci++) 
			{
				if(tmpel[minci].checked) 
				{
					chkcount++;
				}
			}
			
			if(chkcount < mincheck)
			{
				return ["checklimit","mincheck"];
			}
			if(chkcount > maxcheck)
			{
				return ["checklimit","maxcheck"];
			}
		}else 
		{
			if(tmpel.checked == false) 
			{
				return ["checklimit","mincheck"];
			}
		}
		
	}
		
	
	return true;
}
// 문자제한
FormFunc.strlenlimit = function (el,optval,value,arr_options,eltype)
{
	if(arr_options["eltype"] == FormValidator.TEXT || arr_options["eltype"] == FormValidator.RADIO || arr_options["eltype"] == FormValidator.SELECT)
	{
		minstrlen = optval["minstrlen"]?optval["minstrlen"]:0;
		maxstrlen = optval["maxstrlen"]?optval["maxstrlen"]:0;
		if(minstrlen > 0 && value.length < minstrlen)
		{
			return ["strlenlimit","minstrlen"];
		}
		if(maxstrlen > 0 && value.length > maxstrlen)
		{
			return ["strlenlimit","maxstrlen"];
		}
	}
	return true;
}
// 숫자제한
FormFunc.numberlimit = function (el,optval,value,arr_options,eltype)
{
	if(arr_options["eltype"] == FormValidator.TEXT || arr_options["eltype"] == FormValidator.RADIO || arr_options["eltype"] == FormValidator.SELECT)
	{
		minnumber = optval["minnumber"]?optval["minnumber"]:null;
		maxnumber = optval["maxnumber"]?optval["maxnumber"]:null;
		if(minnumber != null && parseInt(value,10) < minnumber)
		{
			return ["numberlimit","minnumber"];
		}
		if(maxnumber !=null && parseInt(value,10) > maxnumber)
		{
			return ["numberlimit","maxnumber"];
		}
	}
	return true;
}
// byte 제한
FormFunc.bytelimit = function (el,optval,value,arr_options,eltype)
{
	if(eltype == FormValidator.TEXT || eltype == FormValidator.HIDDEN)
	{
		value = value?value:el.value;
		valueByte = 0;
		var valueByte = value.length;
		for (i=0; i<value.length; i++) {
			if (value.charCodeAt(i) > 128)
				valueByte++;
		}
		minbyte = optval["minbyte"]?optval["minbyte"]:0;
		maxbyte = optval["maxbyte"]?optval["maxbyte"]:0;
		if (minbyte > 0 && valueByte < minbyte)
			return ["bytelimit","minbyte"];
		if (maxbyte > 0 && valueByte > maxbyte)
			return ["bytelimit","maxbyte"];
	}
	return true;
}
// 이미지만 입력
FormFunc.imageonly = function (el,optval,value,arr_options,eltype)
{
	if(eltype == FormValidator.FILE)
	{
		var dotIndex = value.lastIndexOf(".");
		var ext = value.substr(dotIndex + 1).toLowerCase();
		if(ext != "jpg" && ext != "jpeg" && ext != "gif" && ext != "png")
		{
			return "imageonly";
		}
	}
	return true;
}
// 파일제한
FormFunc.fileonly = function (el,optval,value,arr_options,eltype)
{
	if(eltype == FormValidator.FILE)
	{
		if(trim(value) == "") 
		{
			return true;
		}
		var dotIndex = value.lastIndexOf(".");
		var ext = value.substr(dotIndex + 1).toLowerCase();
		if(typeof(optval) == "string")
		{
			optval = FormFunc.trim(optval,"compress");
			optval = optval.split(",");
		}
		if(optval.length == 0)
		{
			return true;
		}
		if(FormFunc.inArray(optval,ext) == false)
		{
			return "fileonly";
		}
	}
	return true;
}
// 일치여부확인
FormFunc.match = function (el,optval,value,arr_options,eltype)
{
	if(eltype != FormValidator.FILE)
	{
		value = value?value:el.value;
//		arr_optval = optval.split(",");
		arr_optval = optval;
		optval = arr_optval["matchfield"];
		matchformlabel = arr_optval["matchlabel"];
		var matchElement = FormValidator.getForm(optval, this.form);
		
		if (matchElement && value != FormFunc.getValue(matchElement))
		{
			return "match";
		}
	}
	return true;
}

FormFunc.requiredgroup = function (el,optval,value,arr_options,eltype) 
{
	try{
	frm = el.form;
	}catch(e){return true}
	if(optval == true) 
	{
		grpel = frm[el.name];
	}else 
	{
		grpel = new Array();
		arrel = optval.split(" ");
		for(var i=0; i<arrel.length; i++) 
		{
			grpel[i] = frm.arrel[i];
		}
	}
	isvalue = 0;
	for(var i=0; i<grpel.length; i++) 
	{
		if(trim(grpel[i].value) == "") 
		{
			isvalue = 1
		}
	}
	if(isvalue == 1) 
	{
		return "requiredgroup";
	}
	return true;
}
FormFunc.getFormElement = function (elname,form)
{
	if(typeof(form[elname]) == "undefined"){
		return false;
	}

	if (form && form.elname){
		return form.elname;
	}else if(form && form[elname]){
		return form[elname];
	}else if (document.getElementById && document.getElementById(elname)){
		return document.getElementById(elname);
	} else{
		return false;
	}
}



