/**
* Constructor
* 
* obj_form : °Ë»ç¸¦ ¼öÇàÇÒ form object
*/
Validator = function(obj_form)
{
	// properties
	this.form = obj_form;
	this.error_msg = "";
	this.error_object = null;
	this.bgcolor = "";
	this.is_change_bgcolor = false;
	this.is_alert_error = true;
}
/**
* set function
*/
Validator.prototype.setBgColor = function(color){this.bgcolor = color; this.is_change_bgcolor = true;}
Validator.prototype.setShowError = function(flag){this.is_alert_error = flag;}
/**
* get function
*/
Validator.prototype.getErrorMessage = function(){return this.error_msg;}
Validator.prototype.getErrorObject = function(){return this.error_object;}
/**
* ÆûÀÇ ±¸¼º¿ä¼ÒµéÀ» validation attribute ¿¡ ÀÇÇØ °Ë»çÇÑ´Ù.
* 
* return : ¸ðµÎ Á¤´çÇÑ °ªÀÌ¸é true, ¾Æ´Ï¸é false
*/
Validator.prototype.test = function()
{
	var els = this.form.elements;
	for (var i=0; i<els.length; i++)
	{
		var el = this.form.elements[i];
		if (el.getAttribute("notnull")!=null) if (!this.check_notnull(el)) return false;	// not empty
		if (el.getAttribute("number")!=null) if (!this.check_number(el)) return false;		// only number
		if (el.getAttribute("min")!=null && el.getAttribute("max")!=null) if (!this.check_range(el)) return false;		// check range
		if (el.getAttribute("min")!=null) if (!this.check_min(el)) return false;		// check min
		if (el.getAttribute("max")!=null) if (!this.check_max(el)) return false;		// check max
		if (el.getAttribute("alpha")!=null) if (!this.check_alpha(el)) return false;		// check Alphabet
		if (el.getAttribute("alphanum")!=null) if (!this.check_alphanum(el)) return false;		// check Alphabet or Number
		if (el.getAttribute("equal")!=null) if (!this.check_equal(el)) return false;
		if (el.getAttribute("minlength")!=null) if (!this.check_minlength(el)) return false;
		if (el.getAttribute("email")!=null) if (!this.check_email(el)) return false;
		if (el.getAttribute("url")!=null) if (!this.check_url(el)) return false;
		if (el.getAttribute("reg")!=null) if (!this.check_reg(el)) return false;

		if (el.getAttribute("minselect")!=null) if (!this.check_min_select(el)) return false;
		if (el.getAttribute("maxselect")!=null) if (!this.check_max_select(el)) return false;
	}
	return true;
}
/**
* ÇØ´ç ÄÁÆ®·ÑÀÇ °ªÀÌ ºñ¾îÀÖ´ÂÁö °Ë»çÇÏ°í ¿¡·¯¸¦ Ã³¸®.
*/
Validator.prototype.check_notnull = function(obj)
{
	if (obj.type == "text" || obj.type == "password" || obj.type == "textarea" || obj.type == "file")
	{
		var str = obj.value;
		if (str.trim() == "") return this.invalid(obj, "notnull");
	}
	return true;
}
/**
* ÇØ´ç ÄÁÆ®·ÑÀÇ °ªÀÌ ¼ýÀÚÀÎÁö °Ë»çÇÑ´Ù. ¼ýÀÚ°¡ ¾Æ´Ï¸é ¿¡·¯.
*/
Validator.prototype.check_number = function(obj)
{
	if (!this.is_number(obj.value)) return this.invalid(obj, "number");
	return true;
}
/*
* ÄÁÆ®·Î¸£ÀÌ °ªÀÌ ¿µ¹®À¸·Î¸¸ µÇ¾ú´ÂÁö °Ë»ç
*/
Validator.prototype.check_alpha = function(obj)
{
	var alpha = /^[a-zA-Z_]*?$/;
	var val = obj.value.trim();
	if (!alpha.test(val)) return this.invalid(obj, "alpha");
	return true;
}
/*
* ÄÁÆ®·Î¸£ÀÌ °ªÀÌ ¿µ¹® È¤Àº ¼ýÀÚ·Î¸¸ µÇ¾ú´ÂÁö °Ë»ç
*/
Validator.prototype.check_alphanum = function(obj)
{
	var alphanum = /^[a-zA-Z0-9_]*?$/;
	var val = obj.value.trim();
	if (!alphanum.test(val)) return this.invalid(obj, "alphanum");
	return true;
}
/**
* ÇØ´ç ÄÁÆ®·ÑÀÇ °ªÀÌ ÇØ´ç ¹üÀ§¿¡ ¼ÓÇÏ´ÂÁö °Ë»ç
*/
Validator.prototype.check_range = function(obj)
{
	if (!this.is_number(obj.value) || !this.is_number(obj.getAttribute("min")) || !this.is_number(obj.getAttribute("max")))
	{
		var name = obj.name;
		if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
		alert("[" + name + "] ¿¡´Â min max ¼Ó¼ºÀÌ ¼³Á¤ µÇ¾î ÀÖ½À´Ï´Ù. min °ª, max °ª, ÀÔ·Â°ªÀº ¼ýÀÚ¿©¾ß ÇÕ´Ï´Ù.");
		return false;
	}
	var min_value = parseInt(obj.getAttribute("min"));
	var max_value = parseInt(obj.getAttribute("max"));
	var val = parseInt(obj.value);
	if (val < min_value || val > max_value) return this.invalid(obj, "range", min_value, max_value);
	return true;
}
/**
* ÇØ´ç ÄÁÆ®·ÑÀÇ °ªÀÌ ÇØ´ç ¼ýÀÚº¸´Ù Å«Áö °Ë»ç
*/
Validator.prototype.check_min = function(obj)
{
	if (!this.is_number(obj.value) || !this.is_number(obj.getAttribute("min")))
	{
		var name = obj.name;
		if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
		alert("[" + name + "] ¿¡´Â min ¼Ó¼ºÀÌ ¼³Á¤ µÇ¾î ÀÖ½À´Ï´Ù. min °ª°ú ÀÔ·Â°ªÀº ¼ýÀÚ¿©¾ß ÇÕ´Ï´Ù.");
		return false;
	}
	var min_value = parseInt(obj.getAttribute("min"));
	var val = parseInt(obj.value);
	if (val < min_value) return this.invalid(obj, "min", min_value);
	return true;
}
/**
* ÇØ´ç ÄÁÆ®·ÑÀÇ °ªÀÌ ÇØ´ç ¼ýÀÚº¸´Ù Å«Áö °Ë»ç
*/
Validator.prototype.check_max = function(obj)
{
	if (!this.is_number(obj.value) || !this.is_number(obj.getAttribute("max")))
	{
		var name = obj.name;
		if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
		alert("[" + name + "] ¿¡´Â max ¼Ó¼ºÀÌ ¼³Á¤ µÇ¾î ÀÖ½À´Ï´Ù. max °ª°ú ÀÔ·Â°ªÀº ¼ýÀÚ¿©¾ß ÇÕ´Ï´Ù.");
		return false;
	}
	var max_value = parseInt(obj.getAttribute("max"));
	var val = parseInt(obj.value);
	if (val > max_value) return this.invalid(obj, "max", max_value);
	return true;
}
/*
* ´Ù¸¥ ÄÁÆ®·Ñ°ú °ªÀÌ °°ÀºÁö ºñ±³
*/
Validator.prototype.check_equal = function(obj)
{
	var another_name = obj.getAttribute("equal");
	eval("var another = this.form." + another_name + ";");
	var val1 = obj.value.trim();
	var val2 = another.value.trim();
	if (val1 != val2) return this.invalid(obj, "equal", another_name);
	return true;
}
/*
* ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ °©ÀÇ ±æÀÌ°¡ Æ¯Á¤ °ª ÀÌ»óÀÌ¾î¾ß ÇÑ´Ù.
*/
Validator.prototype.check_minlength = function(obj)
{
	if (obj.value.trim() == "") return true;
	var len = obj.value.length;
	var require_length = obj.getAttribute("minlength");
	if (len < require_length) return this.invalid(obj, "minlength", require_length);
	return true;
}
/*
* ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ °©Àº ÀÌ¸ÞÀÏ Çü½Ä¿¡ ¸Â¾Æ¾ß ÇÑ´Ù.
*/
Validator.prototype.check_email = function(obj)
{
	if (obj.value.trim() == "") return true;
	var regEmail = new RegExp("([xA1-xFEa-z0-9_-]+@[xA1-xFEa-z0-9-]+\.[a-z0-9-]+)","gi");
	//var filter=/^(\w+(?:\.\w+)*)@((?:\w+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
	if (!regEmail.test(obj.value.trim())) return this.invalid(obj, "email");
	return true;
}
/*
* ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ °©Àº URL Çü½Ä¿¡ ¸Â¾Æ¾ß ÇÑ´Ù.
*/
Validator.prototype.check_url = function(obj)
{
	if (obj.value.trim() == "") return true;
	var regURL = new RegExp("(http|https|ftp|telnet|news|irc)://([-/.a-zA-Z0-9_~#%$?&=:200-377();|°¡-ÆR]+)","gi");
	if (!regURL.test(obj.value.trim())) return this.invalid(obj, "url");
	return true;
}
/*
* ÄÁÆ®·Ñ¿¡ ÀÔ·Â °¡´ÉÇÑ Á¤±Ô½ÄÀ» Ã¼Å©ÇÑ´Ù.
*/
Validator.prototype.check_reg = function(obj)
{
	if (obj.value.trim() == "") return true;
	var reg_str = obj.getAttribute("reg");
	var reg = new RegExp(reg_str, "g");
	if (!reg.test(obj.value.trim())) return this.invalid(obj, "reg", reg_str);
	return true;
}
/*
* Ã¼Å© ¹Ú½ºÀÇ ÃÖ¼Ò ¼±ÅÃ Ç×¸ñÀ» Á¦ÇÑÇÑ´Ù.
*/
Validator.prototype.check_min_select = function(obj)
{
	var name = obj.name;
	var check_count = 0;
	var min_check = obj.getAttribute("minselect");
	var els = this.form.elements;

	for (var i=0; i<els.length; i++)
	{
		var el = els[i];
		if (el.name == name)
		{
			if (el.checked) check_count++;
		}
	}
	if (check_count < min_check) return this.invalid(obj, "minselect", min_check);
	return true;
}
/*
* Ã¼Å© ¹Ú½ºÀÇ ÃÖ´ë ¼±ÅÃ Ç×¸ñÀ» Á¦ÇÑÇÑ´Ù.
*/
Validator.prototype.check_max_select = function(obj)
{
	var name = obj.name;
	var check_count = 0;
	var max_check = obj.getAttribute("maxselect");
	var els = this.form.elements;

	for (var i=0; i<els.length; i++)
	{
		var el = els[i];
		if (el.name == name)
		{
			if (el.checked) check_count++;
		}
	}
	if (check_count > max_check) return this.invalid(obj, "maxselect", max_check);
	return true;
}
/**
* Æû ÄÁÆ®·Ñ¿¡ ¿¡·¯°¡ ³µÀ»¶§ ¿¡·¯¸¦ Ã³¸®
* 
* obj : ¿¡·¯°¡ ¹ß»ýÇÑ ÄÁÆ®·Ñ
* mode : ¿¡·¯ °Ë»ç ¹æ¹ý
* 
* return : Ç×»ó false
*/
Validator.prototype.invalid = function(obj, mode, add1, add2)
{
	var msg = "";
	// desc attribute ·Î ÄÁÆ®·Ñ ÀÌ¸§À» ¼³Á¤, ¾øÀ¸¸é name ¼Ó¼º »ç¿ë
	var name = obj.name;
	if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
	
	if (mode == "notnull")	// not empty
	{
		msg = "[" + name + "] ¿¡´Â ¹Ýµå½Ã ³»¿ëÀ» ÀÔ·ÂÇÏ¼Å¾ß ÇÕ´Ï´Ù.";
	}
	else if (mode == "number")
	{
		msg = "[" + name + "] ¿¡´Â ¼ýÀÚ¸¸ ÀÔ·ÂÇÏ¼Å¾ß ÇÕ´Ï´Ù.";
	}
	else if (mode == "range")
	{
		msg = "[" + name + "] ÀÇ °ªÀº " + add1 + " ~ " + add2 + " »çÀÌÀÇ °ªÀÌ¾î¾ß ÇÕ´Ï´Ù.";
	}
	else if (mode == "min")
	{
		msg = "[" + name + "] ÀÇ °ªÀº " + add1 + "º¸´Ù ÀÛÀ» ¼ö ¾ø½À´Ï´Ù.";
	}
	else if (mode == "max")
	{
		msg = "[" + name + "] ÀÇ °ªÀº " + add1 + "º¸´Ù Å¬ ¼ö ¾ø½À´Ï´Ù.";
	}
	else if (mode == "alphanum")
	{
		msg = "[" + name + "] ¿¡´Â ¿µ¹®°ú ¼ýÀÚ¸¸ ÀÔ·ÂÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.";
	}
	else if (mode == "alpha")
	{
		msg = "[" + name + "] ¿¡´Â ¿µ¹®¸¸ ÀÔ·ÂÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.";
	}
	else if (mode == "equal")
	{
		msg = "[" + name + "] ¿Í [" + add1 + "] ÀÇ °ªÀº °°¾Æ¾ßÇÕ´Ï´Ù.";
	}
	else if (mode == "minlength")
	{
		msg = "[" + name + "] ¿¡ ÀÔ·ÂµÇ´Â °ªÀÌ ±æÀÌ´Â " + add1 + "ÀÚ ÀÌ»óÀÌ¾î¾ß ÇÕ´Ï´Ù.";
	}
	else if (mode == "email")
	{
		msg = "[" + name + "] ¿¡ ÀÔ·ÂÇÑ °ªÀÌ ÀÌ¸ÞÀÏ Çü½Ä¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù.";
	}
	else if (mode == "url")
	{
		msg = "[" + name + "] ¿¡ ÀÔ·ÂÇÑ °ªÀÌ URL Çü½Ä¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù. http:// °¡ ºüÁöÁö ¾Ê¾Ò³ª È®ÀÎÇØÁÖ¼¼¿ä";
	}
	else if (mode == "reg")
	{
		msg = "[" + name + "] ¿¡ ÀÔ·ÂÇÑ °ªÀÌ ÁöÁ¤µÈ Çü½Ä¿¡ ¸ÂÁö ¾Ê½À´Ï´Ù. ´ÙÀ½ Çü½Ä¿¡ ¸Â¾Æ¾ß ÇÕ´Ï´Ù.\nFormat : " + add1;
	}
	else if (mode == "minselect")
	{
		msg = "[" + name + "] ¿¡ ´ëÇØ¼­ " + add1 + "°³ ÀÌ»óÀ» ¼±ÅÃÇÏ¼¼¿ä.";
	}
	else if (mode == "maxselect")
	{
		msg = "[" + name + "] ¿¡ ´ëÇØ¼­ " + add1 + "°³ ±îÁö ¼±ÅÃÇÒ ¼ö ÀÖ½À´Ï´Ù.";
	}
	// ¿ø·¡°ªÀ¸·Î º¹¿ø
	if (obj.getAttribute("todefault")) this.toDefault(obj);
	// ¹è°æ»ö º¯°æ
	if (this.is_change_bgcolor)
	{
		obj.style.backgroundColor = this.bgcolor;
		// Å° ÀÔ·ÂÀÌ ÀÖÀ»¶§, ÇØ´ç ¹è°æ»öÀ¸·Î Áö¿ìµµ·Ï ÇÑ´Ù.
		obj.onkeypress = function(){this.style.backgroundColor = '';}
	}
	// ÄÁÆ®·Ñ¿¡ Æ÷Ä¿½º ÁÖ°í
	obj.select();
	obj.focus();
	// ¿¡·¯ Ç¥½Ã
	if (this.is_alert_error) window.alert(msg);
	// property ¼³Á¤
	this.error_msg = msg;
	this.error_object = obj;
	return false;
}
/**
* ÄÁÆ®·ÑÀÇ °ªÀ» ¿ø·¡ °ªÀ¸·Î º¹¿ø.
* 
* obj : ´ë»ó ÄÁÆ®·Ñ
*/
Validator.prototype.toDefault = function(obj)
{
	if (obj.type == "text")
	{
		obj.value = obj.defaultValue;
	}
}
/*
* ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ °ªÀÌ. ¼ýÀÚÀÎÁö °Ë»ç
*/
Validator.prototype.is_number = function(val)
{
	var anum = /^(\-|\+)?\d+(\.\d+)?$/;
	if (!anum.test(val)) return false;
	return true;
}
/**
* ±âÅ¸ ÇÔ¼öµé
* from lib.validate.js by jstoy project
*/
String.prototype.trim = function(str) {
    str = this != window ? this : str;
    return str.ltrim().rtrim();
}
String.prototype.ltrim = function(str) {
    str = this != window ? this : str;
    return str.replace(/^\s+/g,"");
}
String.prototype.rtrim = function(str) {
    str = this != window ? this : str;
    return str.replace(/\s+$/g,"");
}