/*
* 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 valAlphaNumDash	= "alphaNumDash";
var valAlphaNumEtc	= "alphaNumEtc";
var valPhone = "phone";
var valMobile = "mobile";
var valPrice = "price";
var valEmail = "email";
var valDate = "date";
var valImage = "image";
var valGana = "gana";
var valHira = "hiragana";
var valKata = "katagana";
var valLetter = "letter";		/* alphaNum + 2byteChar */
var valMemId = "memId";
var valAdd = "add";
var valBlogId = "blogId";

/* 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 + "は「半角数字」や「.」（ピリオド）のみ入力してください。");
				return false;
			}
		}	else if (dataType == valDate)	{
			if (!(isNumeric(checkStr.replace(/-/g, "")))) {
				alert(name + "を数字で入力して下さい。");
				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 == valAlphaNumDash)	{
			if (!(isAlphaNumericDash(checkStr))) {
				alert(name + "は英字、数字、英数字、ハイフン｢-｣の組み合わせで入力して下さい。");
				return false;
			}
		}	else if (dataType == valAlphaNumEtc)	{
			if (!(isAlphaNumericEtc(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 == valPrice) {
			if (!(isPrice(checkStr))) {
				alert(errMsg);
				return false;
			}
		}	else if (dataType == valImage) {
			if (!(isImageExt(checkStr))) {
				alert(name + "は次のイメージファイルのみ有効です。（拡張子名：gif、png、jpg、jpeg）");
				return false;
			}
		}	else if (dataType == valMemId)	{
			if (!(isAlphaNumericDash(checkStr)) && !(isEmail(checkStr))) {
				alert(name + "は半角英数字の組合せで入力してください。");
				return false;
			}
		}	else if (dataType == valBlogId)	{
			if (!(isAlphaNumeric(checkStr))) {
				alert(name + "は半角英数字の組合せで入力してください。");
				return false;
			}
		}	else if (dataType == valGana) {
			if( checkStr.match( /[^ぁ-んァ-ン　ー\s]+/ ) ) {
				alert(name + "を正確に入力してください。");
				return false;
			}
		}	else if (dataType == valHira) {
			if( checkStr.match( /[^ぁ-ん　　ー\s]+/ ) ) {				// hiragana & half space & full space
				alert(name + "を正確に入力してください。");
				return false;
			}
		}	else if (dataType == valKata) {
			if( checkStr.match( /[^ァ-ン　ー\s]+/ ) ) {
				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));}

function isAlphaNumericDash(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-Za-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) {
	if (checkStr.length < 5) {return false;}
	if (checkStr.charCodeAt(checkStr) > 255) {return false;}
	return checkStr.search(/^\s*[\w\-\.]+\@[0-9a-zA-Z\-]+(\.[0-9a-zA-Z\-]+)+\s*$/g)>=0;
}
*/
function isEmail(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 checkStr.search(/(\.[0-9a-zA-Z\-]+)+\s*$/g)>=0;
}

/* check BlogId */
function isBlogEmail(checkStr) {
	for (i = 0; i < checkStr.length; i++) {
		if (checkStr.charAt(i) == '@') {
			return false;
		} else {
			return true;
		}
	}
}

/* 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) {
	if(value.length > 8){return false;}
	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;
}
