//###########################################################################
//# Validator.js
//###########################################################################
//# 폼의 값들이 정당한지 테스트 한다.
//# Yangkun  <yangkun7@kornet.net>
//# version 1.0
//# 2004-04-05
//###########################################################################
/******************************************************************************
- Usage
	1. INPUT 태그에 사용할 validation attribute 를 명시 한다.
	2. 폼 검사 함수에서 검사할 form object 를 인자로 Validator 객체를 만든다.
	2. Validator.test 를 호출한다. 폼 값들이 정당하면 true, 아니면 false 를 리턴한다.

	* 예1.

	<script language='javascript' src='js.Validator.js'></script>
	<script language='javascript'>
	function frmCheck(f)
	{
		var validator = new Validator(f);
		return v.test();
	}
	</script>
	<form .... onSubmit='return frmCheck(this);'>
		<input type='..' ... validation attribute>
		<input type='..' ... validation attribute>
		<input type='submit'>
	</form>

- Available attribute list
	
	notnull						: 반드시 값을 입력해야 한다.
	number						: 숫자값만 입력
	price						: 요금 형식에 맞도록 한다.
	min="number"				: 가능한 최소값
	max="number"				: 가능한 최대값
	min="number" max="number"	: 가능한 값의 범위
	desc="string"				: 해당 컨트롤의 이름을 명시. 에러를 표시할때 사용한다.
	todefault					: 해당 컨트롤에 에러가 났을때 value 속성에 명시된 값으로 복원한다.
	alpha						: 영문만입력가능하도록 한다.
	upper						: 대문자만 입력 가능
	lower						: 소문자만 입력 가능
	alphanum					: 영문과 숫자만 입력가능하도록 한다.
	uppernum					: 영문(대문자)과 숫자만 입력가능하도록 한다.
	lowernum					: 영문(소문자)과 숫자만 입력가능하도록 한다.
	equal="object_name"			: equal 에 명시한 컨트롤의 값과 같아야 한다.
	minlength="number"			: 입력값의 길이가 number 보다 길어야 한다.
	maxbyte = "number"          : 입력값의 Byte 길이가 number 보다 작아야 한다.
	email						: 입력되는 값이 email 형식에 맞아야 한다.
	url							: 입력되는 값이 URL 형식에 맞아야 한다.
	numselect="number"			: 같은 이름을 가지는 체크박스에 대해서 최소 선택수 지정, 체크 박스들 중에 하나에만 설정한다.
	minselect="number"			: 같은 이름을 가지는 체크박스에 대해서 최소 선택수 지정, 체크 박스들 중에 하나에만 설정한다.
	maxselect="number"			: 같은 이름을 가지는 체크박스에 대해서 최대 선택수 지정, 체크 박스들 중에 하나에만 설정한다.
	mobile						: 핸드폰 번호 형식에 맞도록 한다.
	tel							: 전화번호 형식에 맞도록 한다.
	fax							: 팩스번호 형식에 맞도록 한다.
	date						: 일자 형식에 맞도록 한다.
	reg="string"				: 입력값은 string 에 지정한 정규식에 부합해야 한다.	

- Available public function
	
	setBgColor("color value")	: 에러 났을때, 컨트롤 배경을 채울 색을 설정
									이함수가 불리지 않는다면 색을 채우지 않는다.
	setShowError(boolean)		: 에러가 났을때 window.alert 로 메시지를 보여줄지 여부
	string getErrorMessage()	: 에러가 났을때 에러메시지를 린턴.
	object getErrorObject()		: 에러가 났을때 해당 에러가 난 컨트롤을 리턴.
******************************************************************************/
/**
* 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 (!this.check_el(el)) return false;
	}
	return true;
}
/**
* 해당 구성요소을 validation attribute 에 의해 검사한다.
*
* return : 정당한 값이면 true, 아니면 false
*/
Validator.prototype.check_el = function(el)
{
	if (el.getAttribute("notnull")!=null) if (!this.check_notnull(el)) return false;
	if (el.getAttribute("number")!=null) if (!this.check_number(el)) return false;
	if (el.getAttribute("price")!=null) if (!this.check_price(el)) return false;
	if (el.getAttribute("min")!=null && el.getAttribute("max")!=null) if (!this.check_range(el)) return false;
	else if (el.getAttribute("min")!=null) if (!this.check_min(el)) return false;
	else if (el.getAttribute("max")!=null) if (!this.check_max(el)) return false;
	if (el.getAttribute("alpha")!=null) if (!this.check_alpha(el)) return false;
	if (el.getAttribute("upper")!=null) if (!this.check_upper(el)) return false;
	if (el.getAttribute("lower")!=null) if (!this.check_lower(el)) return false;
	if (el.getAttribute("alphanum")!=null) if (!this.check_alphanum(el)) return false;
	if (el.getAttribute("uppernum")!=null) if (!this.check_uppernum(el)) return false;
	if (el.getAttribute("lowernum")!=null) if (!this.check_lowernum(el)) return false;
	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("mobile")!=null) if (!this.check_mobile(el)) return false;
	if (el.getAttribute("tel")!=null) if (!this.check_tel(el)) return false;
	if (el.getAttribute("fax")!=null) if (!this.check_fax(el)) return false;
	if (el.getAttribute("date")!=null) if (!this.check_date(el)) return false;
	if (el.getAttribute("maxbyte")!=null) if (!this.check_maxbyte(el)) return false;
	if (el.getAttribute("filename")!=null) if (!this.check_filename(el)) return false;
	if (el.getAttribute("numselect")!=null) if (!this.check_num_select(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 (obj.value.trim() == "") return true;
	if (!this.is_number(obj.value)) return this.invalid(obj, "number");
	return true;
}
/**
* 해당 컨트롤의 값이 파일이름인지 검사한다. 파일이름이 아니면 에러.
*/
Validator.prototype.check_filename = function(obj)
{
	if (obj.value.trim() == "") return true;
	var filename = /^[a-zA-Z0-9_\.\-\+]+$/;
	var val = obj.value.trim();
	if (!filename.test(val)) return this.invalid(obj, "filename");
	return true;
}
/*
* 컨트롤의 값이 영문으로만 되었는지 검사
*/
Validator.prototype.check_alpha = function(obj)
{
	if (obj.value.trim() == "") return true;
	var alpha = /^[a-zA-Z_]*$/;
	var val = obj.value.trim();
	if (!alpha.test(val)) return this.invalid(obj, "alpha");
	return true;
}
/*
* 컨트롤의 값이 영문 대문자로만 되었는지 검사
*/
Validator.prototype.check_upper = function(obj)
{
	if (obj.value.trim() == "") return true;
	var alpha = /^[A-Z_]*$/;
	var val = obj.value.trim();
	if (!alpha.test(val)) return this.invalid(obj, "upper");
	return true;
}
/*
* 컨트롤의 값이 영문 소문자로만 되었는지 검사
*/
Validator.prototype.check_lower = function(obj)
{
	if (obj.value.trim() == "") return true;
	var alpha = /^[a-z_]*$/;
	var val = obj.value.trim();
	if (!alpha.test(val)) return this.invalid(obj, "lower");
	return true;
}
/*
* 컨트로르이 값이 영문 혹은 숫자로만 되었는지 검사
*/
Validator.prototype.check_alphanum = function(obj)
{
	if (obj.value.trim() == "") return true;
	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_uppernum = function(obj)
{
	if (obj.value.trim() == "") return true;
	var uppernum = /^[A-Z0-9_]*$/;
	var val = obj.value.trim();
	if (!uppernum.test(val)) return this.invalid(obj, "uppernum");
	return true;
}
/*
* 컨트로르이 값이 영문(소문자) 혹은 숫자로만 되었는지 검사
*/
Validator.prototype.check_lowernum = function(obj)
{
	if (obj.value.trim() == "") return true;
	var lowernum = /^[a-z0-9_]*$/;
	var val = obj.value.trim();
	if (!lowernum.test(val)) return this.invalid(obj, "lowernum");
	return true;
}
/**
* 해당 컨트롤의 값이 해당 범위에 속하는지 검사
*/
Validator.prototype.check_range = function(obj)
{
	if (obj.value.trim() == '') return true;
	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 (obj.value == '') return true;
	var val = obj.value;
	if (obj.getAttribute("price")!=null) val = val.delete_comma();
	if (!this.is_number(val) || !this.is_number(obj.getAttribute("min")))
	{
		var name = obj.name;
		if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
		alert("[" + name + "] 에는 min 속성이 설정 되어 있습니다. min 값과 입력값은 숫자여야 합니다.");
		return false;
	}
	val = parseInt(val);
	var min_value = parseInt(obj.getAttribute("min"));
	if (val < min_value) return this.invalid(obj, "min", min_value);
	return true;
}
/**
* 해당 컨트롤의 값이 해당 숫자보다 큰지 검사
*/
Validator.prototype.check_max = function(obj)
{
	if (obj.value == '') return true;
	var val = obj.value;
	if (obj.getAttribute("price")!=null) val = val.delete_comma();
	if (!this.is_number(val) || !this.is_number(obj.getAttribute("max")))
	{
		var name = obj.name;
		if (obj.getAttribute("desc")) name = obj.getAttribute("desc");
		alert("[" + name + "] 에는 max 속성이 설정 되어 있습니다. max 값과 입력값은 숫자여야 합니다.");
		return false;
	}
	val = parseInt(val);
	var max_value = parseInt(obj.getAttribute("max"));	
	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 + ";");
	// 2005-09-02, by hamhaja
	if (another.getAttribute("desc")) another_name = another.getAttribute("desc");
	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;
}
/*
* 컨트롤에 입력된 바이트 길이가 maxbyte 보다 작아야 한다.
*/
Validator.prototype.check_maxbyte = function(obj)
{
	if (obj.value.trim() == "") return true;
	var max_length = obj.getAttribute("maxbyte");
	if (obj.value.get_string_byte_length() > max_length) return this.invalid(obj, "maxbyte", max_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();|가-힣]+)","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_mobile = function(obj)
{
	if (obj.value.trim() == "") return true;
	var reg = new RegExp("^01[016789]\-[0-9]{3,4}\-[0-9]{4}$", "g");
	if (!reg.test(obj.value.trim())) return this.invalid(obj, "mobile");
	return true;
}
/*
* 컨트롤에 입력한 값이 전화번호 형식에 맞는지 검사한다.
*/
Validator.prototype.check_tel = function(obj)
{
	if (obj.value.trim() == "") return true;
	var reg = new RegExp("^0[0-9]{1,2}\-[0-9]{3,4}\-[0-9]{4}$", "g");
	if (!reg.test(obj.value.trim())) return this.invalid(obj, "tel");
	return true;
}
/*
* 컨트롤에 입력한 값이 팩스번호 형식에 맞는지 검사한다.
*/
Validator.prototype.check_fax = function(obj)
{
	if (obj.value.trim() == "") return true;
	var reg = new RegExp("^0[0-9]{1,2}\-[0-9]{3,4}\-[0-9]{4}$", "g");
	if (!reg.test(obj.value.trim())) return this.invalid(obj, "fax");
	return true;
}
/*
* 컨트롤에 입력한 값이 일자 형식에 맞는지 검사한다.
*/
Validator.prototype.check_date = function(obj)
{
	if (obj.value.trim() == "") return true;
	var reg = new RegExp("^[0-9]{4}\-[0,1]{1}[0-9]{1}\-[0-3]{1}[0-9]{1}$", "g");
	if (obj.value.trim() == '0000-00-00' || !reg.test(obj.value.trim())) return this.invalid(obj, "date");
	return true;
}
/*
* 체크 박스의 선택 항목 수를 제한한다.
*/
Validator.prototype.check_num_select = function(obj)
{
	var name = obj.name;
	var check_count = 0;
	var num_check = obj.getAttribute("numselect");
	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 != num_check) return this.invalid(obj, "numselect", num_check);
	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;
}
/**
* 해당 컨트롤의 값이 요금인지 검사한다. 요금이 아니면 에러.
*/
Validator.prototype.check_price = function(obj)
{
	if (obj.value.trim() == "") return true;
	if (!this.is_number(obj.value.delete_comma())) return this.invalid(obj, "price");
	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 == "equal")
		msg = "[" + name + "] 와 [" + add1 + "] 의 값은 같아야합니다.";
	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 == "alpha")
		msg = "[" + name + "] 에는 영문만 입력하실 수 있습니다.";
	else if (mode == "upper")
		msg = "[" + name + "] 에는 영어 대문자만 입력하실 수 있습니다.";
	else if (mode == "lower")
		msg = "[" + name + "] 에는 영어 소문자만 입력하실 수 있습니다.";	
	else if (mode == "alphanum")
		msg = "[" + name + "] 에는 영문과 숫자만 입력하실 수 있습니다.(공백이 포함될 수 없습니다.)";	
	else if (mode == "uppernum")
		msg = "[" + name + "] 에는 영문(대문자)과 숫자만 입력하실 수 있습니다.(공백이 포함될 수 없습니다.)";	
	else if (mode == "lowernum")
		msg = "[" + name + "] 에는 영문(소문자)과 숫자만 입력하실 수 있습니다.(공백이 포함될 수 없습니다.)";	
	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 + "] 에 입력한 값이 지정된 형식에 맞지 않습니다. 다음 형식에 맞아야 합니다. Format : " + add1;
	else if (mode == "numselect")
		msg = "[" + name + "] 에 대해서 " + add1 + "개를 선택해야 합니다.";
	else if (mode == "minselect")
		msg = "[" + name + "] 에 대해서 " + add1 + "개 이상을 선택하세요.";
	else if (mode == "maxselect")
		msg = "[" + name + "] 에 대해서 " + add1 + "개 까지 선택할 수 있습니다.";
	else if (mode == "mobile")
		msg = "[" + name + "] 에는 핸드폰 번호만 입력하셔야 합니다. 예)016-1234-4567 혹은 011-123-4567";
	else if (mode == "tel")
		msg = "[" + name + "] 에는 전화번호만 입력하셔야 합니다. 예)064-123-4567";
	else if (mode == "fax")
		msg = "[" + name + "] 에는 팩스번호만 입력하셔야 합니다. 예)064-123-4567";
	else if (mode == "date")
		msg = "[" + name + "] 에는 일자만 입력하셔야 합니다. 예)1977-04-17";
	else if (mode == "maxbyte")
		msg = "[" + name + "] 에는 " + add1 + " Bytes 까지 입력하실 수 있습니다.";	
	else if (mode == "filename")
		msg = "[" + name + "] 에는 파일이름만 올 수 있습니다. ( / ' \" ( ) ~ : , < > [ ] { } * 공백) 등은 파일이름에 포함될 수 없습니다.";
	else if (mode == "price")
		msg = "[" + name + "] 에는 요금 형식에 맞게 입력하셔야 합니다. 예)123000 또는 123,000";

	// 원래값으로 복원
	if (obj.getAttribute("todefault")) this.toDefault(obj);
	// 배경색 변경
	if (this.is_change_bgcolor)
	{
		obj.style.backgroundColor = this.bgcolor;
		// 키 입력이 있을때, 해당 배경색으로 지우도록 한다.
		obj.onkeypress = function(){this.style.backgroundColor = '';}
	}	
	// 에러 표시
	if (this.is_alert_error) window.alert(msg);
	// 컨트롤에 포커스 주고
	//obj.select();	
	obj.focus();
	// 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+)?$/;
	return anum.test(val);
}
/**
* 기타 함수들
* 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,"");
}
String.prototype.get_string_byte_length = function(Str)
{
	var add_len = 0;
	for (var i=0; i<Str.length; i++)
	{
		if ((Str.charCodeAt(i) < 0) || (Str.charCodeAt(i) > 127)) add_len = add_len + 1;
	}
	return (Str.length + add_len);
}
String.prototype.delete_comma = function(str)
{
	str = this != window ? this : str;
	return str.replace(/,/g, '');
}
