/*
* Filename	: checkValid.js
* Function	:
* Comment	:
* History		: 2003/05/09, jerry, setup
*
* Version	: 1.0
* Author		: Copyright (c) 2005 by JcomTech Corp. All Rights Reserved.
*/

/* validation data type */
var valString = "string";
var valInt = "int";
var valFloat	= "float";
var valAlphaNum = "alphaNum";
var valPhone = "phone";
var valMobile = "mobile";
var valPrice = "price";
var valEmail = "email";
var valDomain = "domain";
var valDate = "date";
var valImage = "image";
var valLetter = "letter";		/* alphaNum + 2byteChar (except special character) */
var valMemId = "memId";
var valAdd = "add";

/* check valid data */
function validData(checkStr, dataType, checkNull, checkLen, lessThanLen, moreThanLen, name, errMsg) {
	/* check null data */
	if (checkNull && (isNull(checkStr) || isAllSpace(checkStr))) {
		if (dataType == valAdd)	{
			alert(name);
			return false;
		} else {
			if (errMsg.length > 0) {
				alert(errMsg);
			} else {
				alert(name + "정보를 입력해 주세요.");
			}
			return false;
		}
	}

	if (checkStr != null && checkStr.length > 0) {
		/* data type validation */
		if (dataType == valInt)	{
			if (!(isNumeric(checkStr))) {
				alert(name + "정보를 숫자로 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valFloat) {
			if (!(isFloat(checkStr))) {
				alert(name + "정보를 숫자와 .(마침표)로 입력해 주세요.\r\n예)34.56");
				return false;
			}
		}	else if (dataType == valDate)	{
			if (!(isNumeric(checkStr.replace(/-/g, "")))) {
				alert(name + "정보를 숫자와 '-'(hyphen)로 입력해 주세요.");
				return false;
			} else if (!(isDate(checkStr.replace(/-/g, "")))) {
				alert(errMsg);
				return false;
			}
		}	else if (dataType == valAlphaNum)	{
			if (!(isAlphaNumeric(checkStr))) {
				alert(name + "정보를 영문자와 숫자로 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valPhone) {
			if (!(isPhone(checkStr))) {
				alert(name + "정보를 숫자와 -(하이픈)으로 입력해 주세요.");
				return false;
			} else if (checkStr.length > 0 && checkStr.replace(/-/g, "").length < 7) {
				alert(name + "정보를 정확히 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valMobile) {
			if (!(isPhone(checkStr))) {
				alert(name + "정보를 숫자와 -(하이픈)으로 입력해 주세요.");
				return false;
			} else if (checkStr.length > 0 && checkStr.replace(/-/g, "").length < 10) {
				alert(name + "정보를 정확히 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valEmail) {
			if (!(isEmail(checkStr))) {
				alert(name+" 정보를 정확히 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valDomain) {
			if (!(isDomain(checkStr))) {
				alert(name+" 정보를 정확히 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valPrice) {
			if (!(isPrice(checkStr))) {
				alert(errMsg);
				return false;
			}
		}	else if (dataType == valImage) {
			if (!(isImageExt(checkStr))) {
				alert(name + "정보를 이미지파일로 정확히 입력해 주세요. (JPEG, JPG, PNG, GIF)");
				return false;
			}
		}	else if (dataType == valMemId)	{
			if (!(isAlphaNumeric(checkStr)) && !(isEmail(checkStr))) {
				alert(name + "정보를 영문자와 숫자로 입력해 주세요.");
				return false;
			}
		}	else if (dataType == valLetter) {
			if( checkStr.match( /[`~!@#$%^&*()_+<>,.=-]/ ) ) {
				alert(name + "정보를 정확히 입력해 주세요.");
				return false;
			}
		}

		/* check data length */
		if (checkLen.length != 0 && checkStr.length != eval(checkLen)) {
			alert(name + "정보를 " + checkLen + "자리로 입력해 주세요.");
			return false;
		}

		/* check less than length */
		if (lessThanLen.length != 0 && checkStr.length > eval(lessThanLen))	{
			alert(name + "정보를 " + lessThanLen + "자리 이내로 입력해 주세요.");
			return false;
		}

		/* check more than length */
		if (moreThanLen.length != 0 && checkStr.length < eval(moreThanLen))	{
			alert(name + "정보를 " + moreThanLen + "자리 이상으로 입력해 주세요.");
			return false;
		}
	}
	return true;

}

/* check length */
function validLength(checkStr, lessThanLen, moreThanLen, name) {
	var strLen = getStrLength(checkStr);

	/* check less than length */
	if (lessThanLen.length != 0 && strLen > eval(lessThanLen)) {
		alert(name + "정보를 " + lessThanLen + "자리 이내로 입력해 주세요.");
		return false;
	}

	/* check more than length */
	if (moreThanLen.length != 0 && strLen < eval(moreThanLen)) {
		alert(name + "정보를 " + moreThanLen + "자리 이상으로 입력해 주세요.");
		return false;
	}

	return true;
}

function getStrLength(str) {
	var strLen = 0;

	for (i = 0; i < str.length; i++) {(str.charCodeAt(i) > 255) ? strLen += 2 : strLen++;}
	return strLen;
}

/* test regular expression (true or false) */
function testRegExp(regExpStr, checkStr) {return (new RegExp(regExpStr).test(checkStr));}

/* check Null */
function isNull(checkStr) {
	if (checkStr == null || checkStr.length == 0) {return true;}
	else {return false;}
}

/* check All Space String */
function isAllSpace(checkStr) {return !(/\S/.test(checkStr));}

/* check Alphabet & number */
function isAlphaNumeric(checkStr) {return !(/[^A-Za-z0-9]/.test(checkStr));}

/* check Lower Case Alphabet & number */
function isLAlphaNumeric(checkStr) {return !(/[^a-z0-9]/.test(checkStr));}

/* check Alphabet & number Etc */
function isAlphaNumericEtc(checkStr) {return !(/[^a-z0-9@._-]/.test(checkStr));}

/* check Alphabet */
function isAlpha(checkStr) {return !(/[^A-Za-z]/.test(checkStr));}

/* check Numeric number */
function isNumeric(checkStr) {return !(/[^0-9]/.test(checkStr));}

/* check Floating number */
function isFloat(checkStr) {
	var splitArr = checkStr.split(".");
	if (checkStr.charAt(0) == '.' || checkStr.charAt(checkStr.length - 1) == '.') {return false;}
	if (splitArr.length > 2 || (splitArr.length == 2 && splitArr[1].length > 2)) {return false;}
	return !(/[^0-9\.]/.test(checkStr));
}

/* check Phone number */
function isPhone(checkStr) {
	if (checkStr.charAt(0) == '-' || checkStr.charAt(checkStr.length - 1) == '-') {return false;}
	return !(/[^0-9\-]/.test(checkStr));
}

/* check Price */
function isPrice(checkStr) {
	var splitArr = checkStr.split(".");
	if (checkStr.charAt(0) == ',' || checkStr.charAt(checkStr.length - 1) == ',' ||
		checkStr.charAt(0) == '.' || checkStr.charAt(checkStr.length - 1) == '.') {return false;}
	if (splitArr.length > 2 || (splitArr.length == 2 && splitArr[1].length > 2)) {return false;}
	return !(/[^0-9\,\.]/.test(checkStr));
}

/* check Quantity */
function isQuantity(checkStr) {
	if (checkStr.charAt(0) == '0' || checkStr.charAt(0) == ',' || checkStr.charAt(checkStr.length - 1) == ',') {return false;}
	return !(/[^0-9\,]/.test(checkStr));
}

/* check special character */
function isSpecial(checkStr) {
	var checkOK = "`~!@#$^*()_\+-=||{}[]:;<>?/\\";

	for (i = 0;  i < checkStr.length;  i++)	{
		ch = checkStr.charAt(i);
		for (j = 0;  j < checkOK.length;  j++) {
			if (ch == checkOK.charAt(j)) {return true;}
		}
	}

	return false;
}

/* check tag(<,>) character */
function isTag(checkStr) {return /[\<\>]/.test(checkStr);}

/* check Email */
function isEmail(checkStr) {
	//	RFC 2822 token definitions for valid email - only used together to form a java Pattern object:
	var sp = "\\!\\#\\$\\%\\&\\'\\*\\+\\-\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~";
	var atext = "[a-zA-Z0-9" + sp + "]";
	var atom = atext + "+"; //one or more atext chars
	var dotAtom = "\\." + atom;
	var localPart = atom + "(" + dotAtom + ")*"; //one atom followed by 0 or more dotAtoms.

	//	RFC 1035 tokens for domain names:
	var letter = "[a-zA-Z]";
	var letDig = "[a-zA-Z0-9]";
	var letDigHyp = "[a-zA-Z0-9-]";
	var rfcLabel = letDig + letDigHyp + "{0,61}" + letDig;
	var domain = rfcLabel + "(\\." + rfcLabel + ")*\\." + letter + "{2,6}";

	//	Combined together, these form the allowed email regexp allowed by RFC 2822:
	var addrSpec = "^" + localPart + "@" + domain + "$";

	//	now compile it:
	var emailRegexp = new RegExp();
	var isOk = false;
	emailRegexp.compile(addrSpec);
	isOk = emailRegexp.test(checkStr);
	return isOk;
/*
	var regex = /^[-_.a-z0-9]+@(([-_a-z0-9]+\.)+([A-Za-z][A-Za-z]|[A-Za-z][A-Za-z][A-Za-z])|(([0-9][0-9]?|[0-1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-5]))$/i;
	return regex.test(checkStr);
*/
/*
	var atCnt = 0;
	if (checkStr.length < 5) {return false;}

	for (i = 0; i < checkStr.length; i++) {
		if (checkStr.charAt(i) == '@') {
			if (i == 0 || i == checkStr.length - 1) {return false;}
			atCnt++;
		} else if (checkStr.charCodeAt(i) > 255) {return false;} // Korean
	}

	if (atCnt != 1) {return false;}

	return true;
*/
}

/* check Domain */
function isDomain(checkStr) {
	//	RFC 1035 tokens for domain names:
	var letter = "[a-zA-Z]";
	var letDig = "[a-zA-Z0-9]";
	var letDigHyp = "[a-zA-Z0-9-]";
	var rfcLabel = letDig + letDigHyp + "{0,61}" + letDig;
	var domain = "^" + rfcLabel + "(\\." + rfcLabel + ")*\\." + letter + "{2,6}" + "$";

	//	now compile it:
	var domainRegexp = new RegExp();
	var isOk = false;
	domainRegexp.compile(domain);
	isOk = domainRegexp.test(checkStr);
	return isOk;
}

/* check positive number */
function isPositive(chekStr) {
	if (parseFloat(chekStr) > 0) {return true;}
	else {return false;}
}

/* check Date setting for fromDate vs toDate comparison */
function isDate(value) {
	var year  = value.substring(0, 4);
	var month = value.substring(4, 6);
	var day   = value.substring(6, 8);
	return (isYYYY(year) && isMM(month) && isDD(year,month,day));
}

/* check fromDate vs toDate comparison */
function compareDate(fromDate, toDate) {
	if (isDate(fromDate.replace(/-/g, "")) && isDate(toDate.replace(/-/g, ""))) {
		if (fromDate > toDate) {return false;}
		else {return true;}
	} else {return false;}
}

/* check Year */
function isYYYY(value) {
	return ((value.length == 4) && (isNumeric(value)) && (eval(value) > 1900));
}

/* check Month */
function isMM(value) {
	return ((value.length > 0) && (isNumeric(value)) && (0 < eval(value)) && (eval(value) < 13));
}

/* check Day */
function isDD(yyyy, mm, value) {
	var result = false;
	var monthDD = new month_array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	var index = eval(mm) - 1;
	if (value.length != 2) { return false; }
	if (!isNumeric(value)) { return false; }
	if (((yyyy % 4 == 0) && (yyyy % 100 != 0)) || (yyyy % 400 == 0)) { monthDD[1] = 29; }

	var dd = eval(value);
	if ((0 < dd) && (dd <= monthDD[index])) {result = true;}

	return result;
}

/* check Month array for day */
function month_array(m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11) {
	this[0] = m0;
	this[1] = m1;
	this[2] = m2;
	this[3] = m3;
	this[4] = m4;
	this[5] = m5;
	this[6] = m6;
	this[7] = m7;
	this[8] = m8;
	this[9] = m9;
	this[10] = m10;
	this[11] = m11;
}

/* check img */
function isImageExt(value) {
	var result = false;

	if (value.indexOf(".gif") > 0 || value.indexOf(".png") > 0 || value.indexOf(".jpg") > 0 || value.indexOf(".jpeg") > 0) {
		result = true;
	}
	return result;
}

/* trim */
function trimString(str) {
	if (str.length == 0) {return str;}
	str = ltrim(str);
	return rtrim(str);
}

function ltrim(str) {return str.indexOf(' ') == 0 ? str.replace(/\s+/, '') : str;}

function rtrim(str) {return str.replace(/\s+$/, '');}
