/*------------------------------------------------------------------------------
' FILE				: INPCHK.JS
' PURPOSE			: 入力チェック制御
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
/*------------------------------------------------------------------------------
' PURPOSE			: フォーカス制御 (エラーフィールドへ位置付け)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: aoParts - OBJECT (ERROR CONTROL)
' RETURN VALUE		: 
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnErrSetFocus(aoParts) {

	aoParts.focus();
	if (aoParts.type != "select-one") {
		aoParts.select();
	}

}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列長取得
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	- 対象文字列
' RETURN VALUE		: 文字列長
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnGetStringByte(asVal) {

	if (asVal=="" || !asVal || asVal==null) return 0;
	var sVal=asVal.replace(/[^0-9a-zｱ-ﾝｬ-ｮｧ-ｫｯ\!\"\ \ﾞ\ﾟ\ｰ\#\$\%\&\'\(\)\-\=\^\~\\\|\@\`\[\{\;\+\:\*\]\}\,\<\.\>\/\?\_\n\t\r]/ig,"##");
	return sVal.length;

//	var iLen = 0;		//バイト数
//	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
//		if (escape(asVal.charAt(iIdx)).length >= 4) {
//			iLen += 2;
//		} else {
//			iLen++;
//		}
//	}
//	return iLen;

}
function fnTrashGomi(asVal) {
	asVal=unescape(escape(asVal).split("%00")[0]);
	return asVal;
}


/*------------------------------------------------------------------------------
' PURPOSE			: 属性検査
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	 - 検査文字列
'					  asType - 属性
'							  "string"	文字
'							  "digit"	0-9
'							  "integer"	マイナス及び正数
'							  "double"	マイナス及び小数点
'							  "alpha"	英字のみ
'							  "alpnum"	英数字
'						  	"date8"	日付(YYYYMMDD形式)
'							  "date10"	日付(YYYY/MM/DD形式)
'						 	 "email"	英数字及び - _ . @
'						 	 "telnum"	0-9及び - ( )
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 異常
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnFormatCheck(asVal, asType) {
	var sDateDelim = "/";	//日付のデリミタ
	switch (asType) {
	case "string":	// ' " < > はエラー
		var sNGWords = "\\'\"<>";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sNGWords.length; iIdx2++) {
				if (sNGWords.indexOf(asVal.charAt(iIdx1)) > 0) {
					return false;
				}
			}
		}
		return true;
	case "digit":	// 0-9
		var sOKWords = "0123456789";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
				if (sOKWords.indexOf(asVal.charAt(iIdx1)) < 0) {
					return false;
				}
			}
		}
		return true;
	case "integer":	// マイナスもOK
		var sOKWords = "0123456789-";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
				if (sOKWords.indexOf(asVal.charAt(iIdx1)) < 0) {
					return false;
				}
			}
		}
		//マイナス形式のチェック
		if (!fnNumCheckFmt(asVal, "-")) return false;
		return true;
	case "double":	// マイナスおよび小数点もOK
		sOKWords = "0123456789-.";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
				if (sOKWords.indexOf(asVal.charAt(iIdx1)) < 0) {
					return false;
				}
			}
		}
		//マイナス形式のチェック
		if (!fnNumCheckFmt(asVal, "-")) return false;
		//小数点形式のチェック
		if (!fnNumCheckFmt(asVal, ".")) return false;
		return true;
	case "alpha":	// 英字のみ
		return fnChkAlpha(asVal);
	case "alpnum":	// 英数字
		return fnChkAlphanum(asVal);
	case "date8":	// YYYY/MM/DDの場合のみチェックを行う
		if (asVal.length != 8) return false;
		var sY,sM,sD;
		sY = asVal.substring(0,4);
		sM = asVal.substring(4,6);
		sD = asVal.substring(6,8);
		return fnDateCheck(sY + sDateDelim + sM + sDateDelim + sD);
	case "date10":	// YYYY/MM/DDの場合のみチェックを行う
		if (asVal.length != 10) return false;
		return fnDateCheck(asVal);
	case "email":	// 英数字及び - _ . @
		return fnChkEmail(asVal);
	case "telnum":	// 0-9及び - ( )
		var sOKWords = "0123456789-()";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
				if (sOKWords.indexOf(asVal.charAt(iIdx1)) < 0) {
					return false;
				}
			}
		}
		return true;
	case "postnum":	// 0-9及び - ( )
		var sOKWords = "0123456789-";
		for (var iIdx1 = 0; iIdx1 < asVal.length; iIdx1++) {
			for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
				if (sOKWords.indexOf(asVal.charAt(iIdx1)) < 0) {
					return false;
				}
			}
		}
		return true;
	default:	// その他の場合はタイプ文字列を正規表現とみなす
		oReg = new RegExp(asType);
		break;
	}
	if (!oReg.test(asVal)) return true;
	return false;
}

/*------------------------------------------------------------------------------
' PURPOSE			: シンボル検査
'					  マイナスなら先頭に"-"などの形式が正しいか調べる
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	   - 対象文字列
'					  asTarget - シンボル  "-" Or "." Or Etc.
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 形式不正
'	
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnNumCheckFmt(asVal, asTarget) {
	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
		var iPos = asVal.indexOf(asTarget);
		switch (asTarget) {
		case "-":
			// "minus" must be 1st charactor in string
			if (iPos > 0) return false;
			break;
		// "period" must not be 1st or last charactor in string
		case ".":
			if (iPos == 0 || iPos == (asVal.length - 1)) return false;
			if (iPos == 1 && asVal.charAt(0) == "-") return false;
			break;
		}
	}
	var cnt = fnGetTargetCount(asVal, asTarget);
	if (cnt > 1 || (cnt == 1 && asVal.length == 1)) return false;
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: シンボル数検査
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	   - 対象文字列
'					  asTarget - シンボル  "-" Or "." Or Etc.
' RETURN VALUE		: TRIM後の文字列
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnGetTargetCount(asVal, asTarget) {
	var iCnt = 0;
	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
		if (asVal.charAt(iIdx) == asTarget) {
			iCnt++;
		}
	}
	return iCnt;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列検査 (英字)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	- 対象文字列
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 英字以外を含む
'	
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnChkAlpha(asVal) {
	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
		if ((asVal.charCodeAt(iIdx) >= 0x41 && asVal.charCodeAt(iIdx) <= 0x5a) || 
		    (asVal.charCodeAt(iIdx) >= 0x61 && asVal.charCodeAt(iIdx) <= 0x7a)) {
		// 何もしない
		} else {
		// 英字以外
			return false;
		}
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE		: 文字列検査 (英数字)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT		: asVal	- 対象文字列
' RETURN VALUE	: TRUE	: 正常
'				  FALSE	: 英数字以外を含む
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnChkAlphanum(asVal) {
	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
		// 英字以外
		if (!fnChkAlpha(asVal.charAt(iIdx))) {
			if (!fnFormatCheck(asVal.charAt(iIdx), "digit")) {
				return false;
			}
		}
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列検査 (英数字及び - _ . @)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	- 対象文字列
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 英数字及び - _ . @以外を含む
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnChkEmail(asVal) {
	for (var iIdx = 0; iIdx < asVal.length; iIdx++) {
		// 英字以外
		if (!fnChkAlpha(asVal.charAt(iIdx))) {
			if (!fnFormatCheck(asVal.charAt(iIdx), "digit")) {
				var sOKWords = "@-_.";
				for (var iIdx2 = 0; iIdx2 < sOKWords.length; iIdx2++) {
					if (sOKWords.indexOf(asVal.charAt(iIdx)) < 0) {
						return false;
					}
				}
			}
		}
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 日付妥当性検査
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asDate - 検査日付
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 日付と異なる
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnDateCheck(asDate){
	var sDateDelim = "/";	//日付のデリミタ
	var sArrData;
	
	//日付デリミタで分割し配列へ
	sArrData = asDate.split(sDateDelim);
	//配列が3つ（年・月・日）でない場合
	if (sArrData.length != 3){
		return false;
	}

	//当然整数数字であること
	for (var iIdx = 0; iIdx < sArrData.length; iIdx++){
		if (isNaN(sArrData[iIdx])){
			//数字でない
			return false;
		}
		if (!fnFormatCheck(sArrData[iIdx], "digit")){
			//数字だが整数でない。
			return false;
		}
	}

	//各月の日数
	var iArrDay = new Array();
	iArrDay[1] = 31;
	iArrDay[2] = 28;
	iArrDay[3] = 31;
	iArrDay[4] = 30;
	iArrDay[5] = 31;
	iArrDay[6] = 30;
	iArrDay[7] = 31;
	iArrDay[8] = 31;
	iArrDay[9] = 30;
	iArrDay[10] = 31;
	iArrDay[11] = 30;
	iArrDay[12] = 31;

	//年MIN,MAX
	var iYearMax = 9999;
	var iYearMin = 0;

	//各数値の代入
	var iYear = parseInt(sArrData[0] - 0);		//年
	var iMonth = parseInt(sArrData[1] - 0);		//月
	var iDay = parseInt(sArrData[2] - 0);		//日
	var xDay;		//2月の末日
	if (iMonth == 2) {

	//２月は閏年を考慮
		if ((iYear % 400) == 0) {
			//400で割り切れたらうるう年
			xDay = 29;
		} else if ((iYear % 100) == 0) {
			//100で割り切れたらうるう年でない。
			xDay = 28;
		} else if ((iYear % 4) == 0) {
			//4で割り切れたらうるう年
			xDay = 29;
		} else {
			xDay = 28;
		}

		//年のチェック
		if (fnRangeCheck(iYear, iYearMin, iYearMax) == false){
			return false;
		}
		//日のチェック
		if (fnRangeCheck(iDay, 1, xDay) == false){
			return false;
		}
	} else {
	//閏年は考慮しない
		//年のチェック
		if (fnRangeCheck(iYear, iYearMin, iYearMax) == false){
			return false;
		}
		//月のチェック
		if (fnRangeCheck(iMonth, 1, 12) == false){
			return false;
		}
		//日のチェック
		if (fnRangeCheck(iDay, 1, iArrDay[iMonth]) == false){
			return false;
		}
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 数字範囲検査
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asVal	   - 対象文字列
' 					  aiMinVal - 最小値
'					  aiMaxVal - 最大値
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 範囲外
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnRangeCheck(asVal, aiMinVal, aiMaxVal) {
	if (parseFloat(asVal) > aiMaxVal || 
		parseFloat(asVal) < aiMinVal) {
		return false;
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列検査 (全角混在)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asBuf	- 対象文字列
' RETURN VALUE		: TRUE	: 全角を含む
'					  FALSE	: 全角を含まない
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnZenkakuChk(asBuf) {
	var iIdx;		//チェック文字列の位置

	for (iIdx = 0; iIdx < asBuf.length; iIdx++) {
		if (escape(asBuf.charAt(iIdx)).length >= 4 ) {
		//全角文字がある場合
			return true;
		}
	}
	//全角文字がない場合
	return false;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列検査 (半角カナ混在)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asBuf	- 対象文字列
' RETURN VALUE		: TRUE	: 半角のみ
'					  FALSE	: 半角カナ以外を含む
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function gfnKanaChk(asBuf) {
	var iPos;		//チェック文字列の位置
	var iBufLen;	//チェック文字列の長さ
	var sWkChar;	//一文字

	iBufLen = asBuf.length;
	for (iPos = 0; iPos < iBufLen; iPos++) {
		sWkChar = asBuf.substr(iPos, 1);
		if (sWkChar >= "ｦ" && sWkChar <= "ﾟ") {
			;
		} else {
			return false;
        }
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 文字列検査 (半角カナ混在 半角スペースOK)
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asBuf	- 対象文字列
' RETURN VALUE		: TRUE	: 半角カナ及び半角スペース
'					  FALSE	: 半角カナ以外を含む
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function gfnKanaSpaceChk(asBuf) {
	var iPos;		//チェック文字列の位置
	var iBufLen;	//チェック文字列の長さ
	var sWkChar;	//一文字

	iBufLen = asBuf.length;
	for (iPos = 0; iPos < iBufLen; iPos++) {
		sWkChar = asBuf.substr(iPos, 1);
		if ((sWkChar >= "ｦ" && sWkChar <= "ﾟ") || sWkChar == " ") {
			;
		} else {
			return false;
        }
	}
	return true;
}

/*------------------------------------------------------------------------------
' PURPOSE			: 元号検査
' CREATE			: 2007.06.14
' UPDATE			: @@@@.@@.@@
' AUTHOR			: ---------
' ARGUMENT			: asEra	 - 元号
' 					: asDate - 日付
' RETURN VALUE		: TRUE	: 正常
'					  FALSE	: 元号不正
'
' COPYRIGHT(C) 2007 Creation Japan, ALL RIGHTS RESERVED.
'-------------------------------------------------------------------------------*/
function fnEraChk(aiEra, asDate) {
	if ( asDate < "19120730" ) {
		/* 明治 */
		if ( parseInt(aiEra) != 1 ) {
			return false;
		}
	} else if ( parseInt(asDate) >= "19120730" && asDate < "19261225") {
		/* 大正 */
		if ( aiEra != 2) {
			return false;
		}
	} else if ( parseInt(asDate) >= "19261225" && asDate < "19890108" ) {
		/* 昭和 */
		if ( aiEra != 3 ) {
			return false;
		}
	} else if ( parseInt(asDate) >= "19890108" ) {
		/* 平成 */
		if ( aiEra != 4 ) {
			return false;
		}
	}
	return true;
}
