//***************************************************************************
//
// □モジュール名
//	パラメータチェックJavaScriptファイル
//
// □更新情報
//	日付		更新者名	更新情報
//	2001.06.13	熊谷		新規作成
//	2001.06.22	熊谷		電話番号チェック追加
//	2001.06.27	吉見		整数値チェックを追加
//	2001.07.03	熊谷		日付チェックFIX
//	2001.07.09	三原				指定桁チェックを追加
//	2001.08.14	三原		移動確認を追加（confirmEditExit2())
//	2001.08.16	三原		実行チェック確認ダイアログ表示を追加
//	2001.8.30	三原		時間チェックFIX
//	2001.09.07	三原		年月整合性チェック(isYM)追加
//	2001.09.11	熊谷		日付チェックで必須チェックと不足チェックのエラーメッセージ
//							が同時に表示してくどいので減らした
//							整数値チェックで' 'が数値の0と解釈されてしまう問題を修正
//	2004.04.01	熊谷		ソースを掃除
//							EMAILチェックを強化
//							パスワード確認チェック,独自チェック関数呼び出し追加
//	2004.08.31	熊谷		独自チェック関数がキチンと動作していなかったのをFIX
//	2004.10.06	熊谷		郵便番号チェックがキチンと動作していなかったのをFIX
//	2005.04.04	熊谷		パスワードチェック廃止、確認項目チェックに移行
//	2005.07.11	熊谷		年月日チェックが全角でエラーにならなかったのをFIX
//							関数名/コメント見直し
//	2006.10.03	熊谷		全角ひらがなチェックを追加
//	2007.10.17	熊谷		checkFormParameter()の引数に配列を利用可能に変更
//							checkFormParameter()のcommandに配列を利用可能に変更
//	2007.10.25	熊谷		MM_findObj()をFormCheck.findObj()に変更
//							正規表現実装
//	2008.11.06	熊谷		isTimeStamp,isHMS追加
//	2009.02.05	熊谷		FormCheck.getParameterErrors(), checkParameter_Function(),
//							checkParameter_innerHTML()追加
//
// □備考
//	"<script type="text/javascript" src="<パス>formchek.js"></script>"で使用
//
// □ToDo
//	日付期間チェックが稼動していない
//	時間期間チェックが稼動していない
//	タイムスタンプチェックが甘い
//
//
//***************************************************************************


//******************************************************
// 機能：日本語対応文字数チェック
// Ｉ／Ｏ：入力テキスト（Ｉ）
// 戻り値：文字数
//******************************************************
function jstrlen(_str) {
	var i,len = 0;
	var strTmp = escape(_str);
	for (i = 0; i < strTmp.length; i++, len++) {
		if (strTmp.charAt(i) == "%") {
			if (strTmp.charAt(++i) == "u") {
				i += 3;
				len++;
			}
			i++;
		}
	}
	return len;
}

//******************************************************
// 機能：半角英数字チェック
// Ｉ／Ｏ：入力テキスト（Ｉ）
// 戻り値：OK:true NG:false
//******************************************************
function isHankaku(inpText) {
	// 半角以外が存在する場合
	return !(/[^\w\-\.\/@\*]/).test(inpText);
/*
	var str = inpText;
	for(var i=0; i<str.length; i++) {
		if ((str.charAt(i) < "a" || str.charAt(i) > "z") &&
			(str.charAt(i) < "A" || str.charAt(i) > "Z") &&
			(str.charAt(i) < "0" || str.charAt(i) > "9") &&
			(str.charAt(i) != "_") && (str.charAt(i) != "-") && (str.charAt(i) != ".")) {
			return false;
		}
	}
	return true;
*/
}

//******************************************************
// 機能：全角チェック
// Ｉ／Ｏ：入力テキスト（Ｉ）
// 戻り値：OK:true NG:false
//******************************************************
function isZenkaku(inpText) {
	return !(/[\w\-\.]/).test(inpText);
}

//******************************************************
// 機能：電話番号チェック
// Ｉ／Ｏ：入力テキスト（Ｉ）
// 戻り値：OK:true NG:false
//******************************************************
function isTel(inpText) {
	// 「0～9」「-」「(」「)」以外があったらエラー
	return !(/[^0-9\-\(\)]/).test(inpText);
/*
	var str = inpText;
	for(var i=0; i<str.length; i++) {
		if ((str.charAt(i) < "0" || str.charAt(i) > "9") &&
			(str.charAt(i) != "-") && (str.charAt(i) != "(") && (str.charAt(i) != ")")) {
			return false;
		}
	}
	return true;
*/
}

/*******************************************************
*	指定の桁数・整数値チェック
*
* @param	_inpText	入力テキスト
* @param	_len		桁数
*
* @return	1:指定の桁数エラー:false
*			2:整数値false
*			3:OK
*
*******************************************************/
function checkIntegerNum(_inpText, _len) {
	var str = _inpText;
	if( str.length != _len){
		return 1;
	}
	for(var i=0; i<str.length; i++) {
		if (str.charAt(i) < "0" || str.charAt(i) > "9") {
			return 2;
		}
	}
	return 3;
}


/*******************************************************
*	整数チェック
*
* @param	_value	値
*
* @return	OK:true NG:false
*
*******************************************************/
function isInteger(_value){
	return (!(isNaN(_value) ) || (_value.indexOf(' ') != -1) || (_value.indexOf('.') != -1));
}


/*******************************************************
*	年月日整合性チェック
*
* @param	_year	年
* @param	_month	月
* @param	_day	日
*
* @return	OK:true NG:false
*
*******************************************************/
function isDate(_year, _month, _day) {
	//==========================
	// 年範囲チェック
	//==========================
	if(_year < 1900 || 9999 < _year){
		return false;
	}
	//==========================
	// 月範囲チェック
	//==========================
	if(_month < 1 || 12 < _month){
		return false;
	}
	//==========================
	// 日範囲チェック
	//==========================
	// 最小値
	if(_day < 1){
		return false;
	}
	// 最大値
	var arrMaxMonth = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	// 2月うるう年補正
	if((_year % 4 == 0 && _year % 100 != 0) || _year % 400 == 0){
		arrMaxMonth[1] = 29;
	}
	if(arrMaxMonth[_month-1] < _day){
		return false;
	}
	return true;
}


/*******************************************************
*	時分整合性チェック
*
* @param	_hour	時
* @param	_minute	分
* @param	_second	秒(null=未チェック)
*
* @return	OK:true NG:false
*
*******************************************************/
function isTime(_hour, _minute, _second){
	//====================
	//	時範囲チェック
	//====================
	if(_hour < 0 || 24 <= _hour){
		return false;
	}
	//=====================
	//	分範囲チェック
	//=====================
	if(_minute < 0 || 60 <= _minute){
		return false;
	}
	//=====================
	//	秒範囲チェック
	//=====================
	if(_second !== null && (_second < 0 || 60 <= _second)){
		return false;
	}
	return true;
}


/*******************************************************
*	全角カタカナチェック
*
* @param	_inpText	文字列
*
* @return	OK:true NG:false
*
*******************************************************/
function isAllkana(_inpText){
	for(i=0; i<_inpText.length; i++){
		//if(_inpText.charAt(i) < 'ア' || _inpText.charAt(i) > 'ン'){
		if(_inpText.charAt(i) < 'ァ' || _inpText.charAt(i) > 'ヶ'){
			if(_inpText.charAt(i) != 'ー' && _inpText.charAt(i) != ' ' && _inpText.charAt(i) != '　'){
				return false;
			}
		}
	}
	return true;
}

/*******************************************************
*	全角ひらがなチェック
*
* @param	_inpText	文字列
*
* @return	OK:true NG:false
*
*******************************************************/
function isAllHiragana(_inpText){
	for(i=0; i<_inpText.length; i++){
		if(_inpText.charAt(i) < 'ぁ' || _inpText.charAt(i) > 'ん'){
			if(_inpText.charAt(i) != 'ー' && _inpText.charAt(i) != ' ' && _inpText.charAt(i) != '　'){
				return false;
			}
		}
	}
	return true;
}


/*******************************************************
*	バイト数チェック関数
*
* @param	_value	チェックデータ
*
* @return	バイト数
*
*******************************************************/
function getLength(_value){
	var i,nCnt=0;

	for(i=0; i<_value.length; i++){
		if(escape(_value.charAt(i)).length >= 4 ){
			nCnt+=2;
		}else{
			nCnt++;
		}
		return nCnt;
	}
}


/*******************************************************
*	EMailチェック
*
* @param	_strAddr	EMAIL
*
* @return	""	エラー無し
*			""以外	エラー
*
*******************************************************/
function xIsEmail( _strAddr) {
	var emailStr = _strAddr;
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");

	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

	// 最初の「@」で分割
	var matchArray=emailStr.match(emailPat);

	// 「@」がない
	if(matchArray==null) {
		return("メールアドレスが正しくありません(@).");
	}

	// ユーザーとドメインとして格納
	var user=matchArray[1];
	var domain=matchArray[2];

// KUMA:携帯用パッチ
/*
	// ユーザー部が無い
	if (user.match(userPat)==null) {
		return("メールアドレスが正しくありません(USER)."+userPat);
	}
*/
	// ドメイン名のIPパターンチェック
	var IPArray=domain.match(ipDomainPat);
	if ( IPArray != null ) {
		for ( var i=1; i <= 4; i++ ) {
			if ( IPArray[i] > 255 ) {
				return("メールアドレスが正しくありません(IP).");
			}
		}
	}

	// ドメイン名パターンチェック
	var domainArray=domain.match(domainPat);
	if (domainArray==null) {
		return("ドメイン名がありません(DMAIN).");
	}

	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;

	// 最後のドメインが2文字か3文字の以外のとき、エラー
	// ex) jp,comはOK
	if (domArr[domArr.length-1].length < 2 || 4 < domArr[domArr.length-1].length) {
		return("メールアドレスが正しくありません(LCALE).");
	}

	if (len<2) {
		return("メールアドレスにドメイン名がありません.");
	}
	return "";
}


/*
* 配列かどうか確認
*/
function IsArray(array){
	return !(
		!array || 
		(!array.length || array.length == 0) || 
		typeof array !== 'object' || 
		!array.constructor || 
		array.nodeType || 
		array.item 
	);
}


function getDebug(_obj, _tab) {
	var result = "";
	_tab = _tab != undefined ? _tab : "";

	if(typeof(_obj) == "object"){
		_tab = _tab += "  ";
		// 配列のとき
		if(IsArray(_obj)){
			for (var i = 0; i < _obj.length; i++) {
				result += _tab+"["+i+"]="+getDebug(_obj[i], _tab);
			}
			return _tab+"(array){\n"+result+"}\n";
		}
		// オブジェクトのとき
		else{
			for (var i in _obj) {
				result += _tab+"["+i+"]="+getDebug(_obj[i], _tab);
			}
			return _tab+"("+typeof(_obj)+"){\n"+result+"}\n";
		}
	}
	return "("+typeof(_obj)+")"+_obj+"\n";
}

function FormCheck(){};

/**
* 指定のオブジェクトを検索する
*
* @param	node	オブジェクト名
* @param	doc	ドキュメント(省略時はカレントドキュメント)
*
* @return	検索オブジェクト
*/
FormCheck.findObj = function(node, doc) {
	var p,i,x;
	if(!doc)
		doc=document;
	if((p=node.indexOf("?"))>0&&parent.frames.length)
	{
		doc=parent.frames[node.substring(p+1)].document;
		node=node.substring(0,p);
	}

	if(!(x=doc[node])&&doc.all)
		x=doc.all[node];
		
	for (i=0;!x&&i<doc.forms.length;i++)
		x=doc.forms[i][node];

	for(i=0;!x&&doc.layers&&i<doc.layers.length;i++)
		x=FormCheck.findObj(node,doc.layers[i].document);

	if(!x && doc.getElementById)
		x=doc.getElementById(node);

	return x;
}

/**
* 指定のオブジェクトを検索する(複数指定も可能)
*
* @param	nodes	オブジェクト名(配列で複数指定も可能)
* @param	doc	ドキュメント(省略時はカレントドキュメント)
*
* @return	検索オブジェクト連想配列
*			arrRetObj["オブジェクト名"] = <オブジェクト>;
*						：
*/
FormCheck.findObj2 = function(_nodes, _doc) {
	var arrRetObj = new Array();
	var arrNodes = new Array();

	if(IsArray(_nodes)) arrNodes = _nodes;
	else arrNodes.push(_nodes);

	for (var i = 0; i < arrNodes.length; i++){
		arrRetObj[arrNodes[i]] = FormCheck.findObj(arrNodes[i], _doc);
	}
	return arrRetObj;
}


/*
* パラメータチェック(パラメータ値有り)
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck._validExistsValue = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();

	//==========================
	// E-Mailチェック
	//==========================
	if (command.indexOf('isEmail')!=-1) {
		var email_error = xIsEmail(val)
		if (email_error != "")
			arrRetCode.push("- "+wa_name+" "+email_error);
	}
	//==========================
	// 確認項目チェック
	//==========================
	if (command.indexOf('confirm')!=-1) {
		if(val != FormCheck.findObj(name+"2").value)
			arrRetCode.push("- "+wa_name+"と確認"+wa_name+"が間違っています.");
	}
	//==========================
	// 半角
	//==========================
	else if (command.indexOf('isHankaku')!=-1) {
		if (!isHankaku(val)){
			arrRetCode.push("- "+wa_name+' は半角で入力してください.');
		}
	}
	//==========================
	// 全角
	//==========================
	else if (command.indexOf('isZenkaku')!=-1) {
		if (!isZenkaku(val)){
			arrRetCode.push("- "+wa_name+' は全角で入力してください.');
		}
	}
	//==========================
	// 全角カタカナ
	//==========================
	else if (command.indexOf('isZenKana')!=-1) {
		if (!isAllkana(val)){
			arrRetCode.push("- "+wa_name+' は全角カタカナで入力してください.');
		}
	}
	//==========================
	// 全角ひらがな
	//==========================
	else if (command.indexOf('isZenHiragana')!=-1) {
		if (!isAllHiragana(val)){
			arrRetCode.push("- "+wa_name+' は全角ひらがなで入力してください.');
		}
	}
	//==========================
	// 電話番号
	//==========================
	else if (command.indexOf('isTel')!=-1) {
		if (!isTel(val)){
			arrRetCode.push("- "+wa_name+' は数字-()で入力してください.');
		}
	}
	//==========================
	// 最大文字数
	//==========================
	else if (command.indexOf('maxLength')!=-1) {
		var max=new Number(command.substring(command.indexOf('maxLength') + 'maxLength'.length));
		if (max<jstrlen(val))
			arrRetCode.push("- "+wa_name+' は全角 '+max/2+' 文字までしか入力できません.');
	}
	//==========================
	// 日時チェック
	// [YYYY-MM-DD hh:mm:dd]または[YYYY-MM-DD]の書式でチェックする
	//==========================
	else if (command.indexOf('DateTime')!=-1) {
		var reg_exts = new RegExp("^((\\d{1,4})[/-](\\d{1,2})[/-](\\d{1,2}))( ((\\d{1,2}):(\\d{1,2}):(\\d{1,2})))?$", "g");
		// 1980/1/2 24:12:11
		//				↓
		// 1980/1/2 24:12:11,1980/1/2,1980,1,2, 24:12:11,24:12:11,24,12,11
		if(!val.match(reg_exts)){
			return '- ' + wa_name+' は[YYYY-MM-DD hh:mm:dd]書式で記述してください.';
		}
		// 年月日チェック
		if(!isDate(RegExp.$2, RegExp.$3, RegExp.$4)){
			arrRetCode.push("- "+wa_name+' は日付が間違っています.');
		}
		if(RegExp.$6 && !isTime(RegExp.$7, RegExp.$8, RegExp.$9)){
			arrRetCode.push("- "+wa_name+' は時間が間違っています.');
		}
	}
	//==========================
	// 正規表現
	//==========================
	else if (command.indexOf('regExp')!=-1) {
		var comm_param=command.indexOf(':');
		var strRegExp = command.substring(comm_param+1);
//		alert("正規表現:"+strRegExp);
		if (!eval(strRegExp+".test(val)"))
			arrRetCode.push("- "+wa_name+' は条件に満たしていません.');
	}
	else if (command != 'R') {
		//==========================
		// 数値チェック
		//==========================
		if (command.indexOf('NisNum') != -1) {
			if(isNaN(val) || (val.indexOf(' ') != -1))
				arrRetCode.push("- "+wa_name+' は数字を入力してください.');
		}
		//==========================
		// 数値チェック(範囲指定)&整数値チェック
		//==========================
		else if (command.indexOf('inRange') != -1) {
			if(!isInteger(val)) {
				arrRetCode.push("- "+wa_name+' は整数値を入力して下さい.');
			}
			var comm_param=command.indexOf(':');
			var min=new Number(command.substring(command.indexOf('inRange')+7,comm_param));
			var max=new Number(command.substring(comm_param+1));
			if (val<min || max<val)
				arrRetCode.push("- "+wa_name+' は '+min+' ～ '+max+' の数字を入力してください.');
		}
		//==========================
		// 数値指定桁チェック
		//==========================
		else if (command.indexOf('NumLen') != -1){
			var chk=new Number(command.substring(6));
			check = checkIntegerNum(val,chk)
			if(check == 1 ){
				arrRetCode.push("- "+wa_name+' は 指定桁の数字を入力してください.');
			}
			else if(check == 2){
				arrRetCode.push("- "+wa_name+' は整数値を入力して下さい.');
			}
		}
	}
	return arrRetCode;
}


/*
* パラメータチェック(パラメータ値無し)
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck._validNoValue = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();

	//------------------------------
	// 指定フィールドに値が入っていない
	//------------------------------
	//==============================
	//	ラジオボタン処理
	//==============================
	if(command.indexOf('radio')!= -1){
		var obj = FormCheck.findObj(name);
		var flg = false;
		for(var i_tmp = 0; i_tmp < obj.length; i_tmp++){
	//		alert("o=" + obj[i_tmp].value +",c="+obj[i_tmp].checked);
			if(obj[i_tmp].checked) flg = true;
		}

		if(!flg){
			arrRetCode.push("- "+wa_name+' を選択してください.');
		}
	}
	//==============================
	//	セレクトタグ処理
	//==============================
	else if(command.indexOf('select')!= -1){
		var obj = FormCheck.findObj(name);

		var flg = false;
		if(obj[obj.selectedIndex].value == ""){
			arrRetCode.push("- "+wa_name+' を選択してください.');
		}
	}
	//==========================
	// 郵便番号の4桁部分が入力された場合
	// 3桁部が入力必須になるチェック
	//==========================
	else if (command.indexOf('isZIP')!=-1) {
		zip_after = FormCheck.findObj(name+'_AFTER');
		b_after = (zip_after && (zip_after.value)!="");

		// 下4桁のみ入力されているとき
		if (val =="" && b_after){
			arrRetCode.push("- "+wa_name+' が不足しています.');
		}
	}
	//==========================
	// 必須項目チェック
	//==========================
	else if (command.charAt(0) == 'R'){
		arrRetCode.push("- "+wa_name+' は入力必須項目です.');
	}
	return arrRetCode;
}

/*
* パラメータチェック(パラメータオブジェクト無し)
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck._validNoObj = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();

	//******************************************
	// 以下、対象値が未取得の無い場合
	//******************************************
	//==========================
	// 日付整合性チェック
	//==========================
	if (command.indexOf('isYMD')!=-1) {
		arrRetCode = FormCheck.cp_YMD( name, wa_name, command, val);
	}
	//==============================
	//	年月整合性チェック
	//==============================
	else if (command.indexOf('isYM')!=-1) {
		arrRetCode = FormCheck.cp_YM( name, wa_name, command, val);
	}
	//==============================
	//	時間整合性チェック
	//==============================
	else if(command.indexOf('isHMS')!= -1){
		arrRetCode = FormCheck.cp_HMS( name, wa_name, command, val);
	}
	//==============================
	//	自分整合性チェック
	//==============================
	else if(command.indexOf('isHM')!= -1){
		arrRetCode = FormCheck.cp_HM( name, wa_name, command, val);
	}
	//==========================
	// 日時整合性チェック
	//==========================
	else if (command.indexOf('isTimeStamp')!=-1) {
		arrRetCode = FormCheck.cp_YMD( name, wa_name, command, val);
		var arrRetCodeTmp = FormCheck.cp_HMS( name, wa_name, command, val);
		arrRetCode = arrRetCode.concat(arrRetCodeTmp);
	}
	return arrRetCode;
}

/*
* パラメータチェック(強制)
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck._validOther = function(name, wa_name, command, val){
	var arrRetCode = new Array();

	//------------------------------
	// ここ以下は値の有無に関係なく
	// 指定フィールドに対してチェック機能を実装する。
	//------------------------------
	//==========================
	// 独自チェック関数
	//
	// @param	name	パラメータ名
	// @param	wa_name	パラメータ日本語名
	// @param	command	コマンド
	// @param	val		パラメータ値
	//
	// @return 	""		正常
	//			""以外	エラー(エラー要因メッセージ)
	//==========================
	if(command.indexOf('function') == 0) {
		var comm_param=command.indexOf(':')+1;
		var errors = eval(command.substring(comm_param)+"(name,wa_name,command,val)");
		if(errors){
			arrRetCode = arrRetCode.concat(errors);
		}
	}
	// 何もしない
	else if(command.indexOf('nop') == 0) {
	}
	return arrRetCode;
}


/**
* 年月日チェック
* フォーム name+"_Y", name+"_M", name+"_D"のチェックを行う
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck.cp_YMD = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();
	var FROM_DT,TO_DT;

	// 日付オブジェクト取得
	var arrObjs = FormCheck.findObj2([name+'_Y',name+'_M',name+'_D']);
	var year = arrObjs[name+'_Y'];
	var month = arrObjs[name+'_M'];
	var day = arrObjs[name+'_D'];
	var b_year = (year && (year=year.value)!="");
	var b_month = (month && (month=month.value)!="");
	var b_day = (day && (day=day.value)!="");

	// 日付必須チェック
	if (command.charAt(0) == 'R'){
		if(!b_year)
			arrRetCode.push("- "+wa_name+'(年) は入力必須項目です.');
		if(!b_month)
			arrRetCode.push("- "+wa_name+'(月) は入力必須項目です.');
		if(!b_day)
			arrRetCode.push("- "+wa_name+'(日) は入力必須項目です.');
	}
	else{
		// 日付の年月日が一部のみ入力されているとき
		if ((b_year | b_month | b_day) && !(b_year & b_month & b_day) ){
			if(!b_year)
				arrRetCode.push("- "+wa_name+'(年) が不足しています.');
			if(!b_month)
				arrRetCode.push("- "+wa_name+'(月) が不足しています.');
			if(!b_day)
				arrRetCode.push("- "+wa_name+'(日) が不足しています.');
		}
	}
	// 年数値チェック
	var val = year;
	if(!isInteger(val)) {
		arrRetCode.push("- "+wa_name+'(年)は整数値を入力して下さい.');
	}
	// 月数値チェック
	var val = month;
	if(!isInteger(val)) {
		arrRetCode.push("- "+wa_name+'(月)は整数値を入力して下さい.');
	}
	// 日数値チェック
	var val = day;
	if(!isInteger(val)) {
		arrRetCode.push("- "+wa_name+'(日)は整数値を入力して下さい.');
	}
	// すべて入力されているとき、日付範囲チェック
	if(b_year && b_month && b_day){
		// 月妥当性チェック
		if(!isDate(year , month, day)){
			arrRetCode.push("- "+wa_name+' は日付に誤りがあります.');
		}
		else{
			//FROM日付を格納
			if (command.indexOf('isYMD_FROM')!=-1) {
				FROM_DT = new Date(year,month,day);
				FROM_NAME = wa_name;
			}
			//TO日付を格納
			if (command.indexOf('isYMD_TO')!=-1) {
				TO_DT = new Date(year,month,day);
				if(FROM_DT != null && TO_DT != null){
					if (FROM_DT.getTime()>TO_DT.getTime()){
						arrRetCode.push("- "+wa_name+' は'+FROM_NAME+'以降の日付を入力して下さい.');
					}
				}
				FROM_DT = null;
				TO_DT = null;
				FROM_NAME = "";
			}
		}
	}
	return arrRetCode;
}

/**
* 年月チェック
* フォーム name+"_Y", name+"_M"のチェックを行う
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck.cp_YM = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();
	var FROM_DT,TO_DT;

	// 日付オブジェクト取得
	var arrObjs = FormCheck.findObj2([name+'_Y',name+'_M']);
	var year = arrObjs[name+'_Y'];
	var month = arrObjs[name+'_M'];
	var b_year = (year && (year=year.value)!="");
	var b_month = (month && (month=month.value)!="");

	// 日付必須チェック
	if (command.charAt(0) == 'R'){
		if(!b_year)
			arrRetCode.push("- "+wa_name+'(年) は入力必須項目です.');
		if(!b_month)
			arrRetCode.push("- "+wa_name+'(月) は入力必須項目です.');
	}
	// 日付の月のみが入力されている場合
	if(!(b_year) && (b_month)){
		arrRetCode.push("- "+wa_name+'(年) が不足しています。');
	}
	// 日付の年のみが入力されている場合
	if((b_year) && !(b_month)){
		arrRetCode.push("- "+wa_name+'(月) が不足しています。');
	}
	return arrRetCode;
}

/*
* 時分秒チェック
* フォーム name+"_H", name+"_MI", name+"_S"のチェックを行う
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck.cp_HMS = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();
	var FROM_DT,TO_DT;

	var arrObjs = FormCheck.findObj2([name+'_H', name+'_MI', name+'_S']);
	var hour = arrObjs[name+'_H'];
	var minute = arrObjs[name+'_MI'];
	var second = arrObjs[name+'_S'];
	var b_hour = (hour && (hour= hour.value)!= "");
	var b_minute = (minute && (minute = minute.value)!= "");
	var b_second = (second && (second = second.value)!= "");

	//時間必須チェック
	if(command.charAt(0) == 'R'){
		if(!b_hour)
			arrRetCode.push("- "+wa_name+'(時) は入力必須項目です。');
		if(!b_minute)
			arrRetCode.push("- "+wa_name+'(分) は入力必須項目です。');
		if(!b_second)
			arrRetCode.push("- "+wa_name+'(秒) は入力必須項目です。');
	}
	//時間が一部のみ入力されているとき
	if( (b_hour | b_minute | b_second) && !(b_hour & b_minute & b_second)){
		if(!b_hour)
			arrRetCode.push("- "+wa_name+'(時) が不足しています。');
		if(!b_minute)
			arrRetCode.push("- "+wa_name+'(分) が不足しています。');
		if(!b_second)
			arrRetCode.push("- "+wa_name+'(秒) が不足しています。');
	}
	//全て入力されているとき、時間範囲チェック
	if(b_hour && b_minute && b_second){
		if(!isTime(hour,minute,second)){
			arrRetCode.push("- "+wa_name+' は時間に誤りがあります。');
		}
	}
	return arrRetCode;
}


/*
* 時分チェック
* フォーム name+"_H", name+"_MI"のチェックを行う
*
* @param	name		パラメータ名
* @param	name		和パラメータ名
* @param	command		チェックコマンド
* @param	val			パラメータ値
*
* @return	エラー配列
*/
FormCheck.cp_HM = function(name, wa_name, command, val){
	// 変数宣言
	var arrRetCode = new Array();
	var FROM_DT,TO_DT;

	var arrObjs = FormCheck.findObj2([name+'_H', name+'_MI']);
	var hour = arrObjs[name+'_H'];
	var minute = arrObjs[name+'_MI'];
	var b_hour = (hour && (hour= hour.value)!= "");
	var b_minute = (minute && (minute = minute.value)!= "");

	//時間必須チェック
	if(command.charAt(0) == 'R'){
		if(!b_hour)
			arrRetCode.push("- "+wa_name+'(時) は入力必須項目です。');
		if(!b_minute)
			arrRetCode.push("- "+wa_name+'(分) は入力必須項目です。');
	}
	//時間が一部のみ入力されているとき
	if( (b_hour | b_minute) && !(b_hour & b_minute)){
		if(!b_hour)
			arrRetCode.push("- "+wa_name+'(時) が不足しています。');
		if(!b_minute)
			arrRetCode.push("- "+wa_name+'(分) が不足しています。');
	}
	//全て入力されているとき、時間範囲チェック
	if(b_hour && b_minute ){
		if(!isTime(hour,minute)){
			arrRetCode.push("- "+wa_name+' は時間に誤りがあります。');
		}
	}
	return arrRetCode;
}


/*******************************************************
* パラメータエラー一覧取得
* HTML内の指定id(フォーム)名のパラメータチェック
*
* @param	パラメータチェック情報配列
*	【書式】
*	Array(param0,param1,param2, ... , param_n+0,param_n+1,param_n+2)
*
*	【配列構造】
*	以下の3項目単位で指定件数分記述する。
*	件数をn件とすると
*	n+0:入力チェックしたいフォームの項目名
*	n+1:項目名の日本語
*	n+2:チェック方法。次の文字列で指定
*
*	【チェック方法解説】
*	1文字目に'R':必須項目
*	"isEmail":E-Mailチェック
*	"confirm":フォーム項目名とフォーム項目名+"2"の値が同じかチェック
*	"isHankaku":半角入力チェック
*	"isZenkaku":全角入力チェック
*	"isZenKana":全角カタカナ入力チェック
*	"isZenHiragana":全角ひらがな入力チェック
*	"NisNum":数値のみ入力可能
*	"isTel":電話番号チェック
*	"isZIP":郵便番号チェック
*	"maxLength<max>":文字数<max>以下のみ入力可能
*	"inRange<min>:<max>":<min>～<max>の範囲の数値のみ入力可能
*	"NumLen<x>":<x>の桁数をチェック
*	"isYMD":日付チェック
*		 フォーム項目名+"_Y"=年,+"_M"=月,+"_D"=日でチェックします
*	"isYM":年月チェック
*		 フォーム項目名+"_Y"=年,+"_M"=月でチェックします
*	"isHMS":時間チェック
*		 フォーム項目名+"_H"=時,+"_MI"=分,+"_S"=秒でチェックします
*	"isHM":時分チェック
*		 フォーム項目名+"_H"=時,+"_MI"=分でチェックします
*	"isTimeStamp":タイムスタンプチェック
*		 フォーム項目名+"_Y"=年,+"_M"=月,+"_D"+
*		 	"_H"=時,+"_MI"=分,+"_S"=秒でチェックします
*	"radio":ラジオボタンチェック
*	"select":セレクトタグチェック
*	"DateTime":日時チェック
*	"regExp:<正規表現>":正規表現でチェック
*	"function:<func>":独自パラメータチェック
*		func(n+0,n+1,n+2)の形式のチェック関数を呼び出す
*	"nop:何もしない
*
*	Array(チェック方法0,チェック方法1,...):複数のパラメータチェック
*
* @return	エラーリスト配列
*		エラー時：要因文言が配列で格納
*		正常時：要素数0の配列
*
*******************************************************/
FormCheck.getParameterErrors = function(args) {
	// 変数宣言
	var arrErrors = new Array();

	//======================================
	// パラメータチェック配列を順にチェック
	//======================================
	for (var i = 0; i < (args.length-2); i+=3) {
		// 配列から1セット分のデータを取得
		// パラメータ名
		var name=args[i];
		// パラメータ和名
		var wa_name=args[i+1];
		// パラメータチェック方法
		var arrCommond = args[i+2];
		if(typeof(args[i+2]) == 'string'){
			arrCommond = new Array(args[i+2]);
		}
		// パラメータ値
		var objVal=FormCheck.findObj(name);

		for (var j = 0; j < arrCommond.length; j++) {
			var command = arrCommond[j];
			var arrRetCode;
			// パラメータが存在するとき
			if(objVal){
				// 指定フィールドに値が入っているとき
				if(objVal.value != null && objVal.value != "") {
					arrRetCode = FormCheck._validExistsValue(name, wa_name, command, objVal.value);
				}
				// 指定フィールドに値が入っていないとき
				else{
					arrRetCode = FormCheck._validNoValue(name, wa_name, command, objVal.value);
				}
			}
			else{
				arrRetCode = FormCheck._validNoObj(name, wa_name, command);
			}
			arrRetCode = arrRetCode.concat(FormCheck._validOther(name, wa_name, command, objVal ? objVal.value:undefined));

			// エラー時追加
			if(arrRetCode && 0 < arrRetCode.length){
				arrErrors = arrErrors.concat(arrRetCode);
			}
		}
	}
	return arrErrors;
}

/*******************************************************
* パラメータチェック
* チェック後に関数が指定されていれば、関数を実行
*
* @param	args	パラメータチェック情報配列
*	【書式】
*	Array(param0,param1,param2, ... , param_n+0,param_n+1,param_n+2)
* @param	func_name	関数もしくは関数名
*
* @return	true:エラーなし, false:エラーあり
*
*******************************************************/
function checkParameter_Function(args, func_name) {
	// パラメータエラー一覧取得
	var arrErrors = FormCheck.getParameterErrors(args);

	var retCode;
	//------------------------------
	// 関数指定があれば実行
	//------------------------------
	if (typeof func_name == "function") {
		retCode = func_name(arrErrors);
	}
	//------------------------------
	// 何かしらパラメータがあればeval実行
	//------------------------------
	else if(func_name){
		retCode = eval(func_name+"(arrErrors)");
	}
	//------------------------------
	// その他：単純に結果を返す
	//------------------------------
	else{
		retCode = (arrErrors.length==0);
	}

	//------------------------------
	// 戻り値
	//------------------------------
	return retCode;
}

/*******************************************************
* パラメータチェック
* 表示可能であれば指定タグ内にエラーメッセージを表示
* 表示不可の場合、alert()で表示
*
* @param	args	パラメータチェック情報配列
*	【書式】
*	Array(param0,param1,param2, ... , param_n+0,param_n+1,param_n+2)
* @param	id_name	エラー情報表示id
*					未指定時alert()で表示
* @param	class_name	表示時のクラス指定(指定があれば)
*
* @return	true:エラーなし, false:エラーあり
*
*******************************************************/
function checkParameter_innerHTML(args, id_name, class_name) {
	return checkParameter_Function(args,
		function(arrErrors){
			//------------------------------
			// 入力エラーがあればダイアログ表示
			//------------------------------
			if(0 < arrErrors.length){

				// id名が指定されており、getElementById,innnerHTMLをサポート時
				// →指定タグ以下にエラー表示
				if(id_name && document.getElementById && document.body.innerHTML){
					var tagObj = document.getElementById(id_name);
					tagObj.innerHTML = '入力に誤りがあります。<br />'+arrErrors.join('<br />');

					// class指定があれば設定
					if(class_name){
						tagObj.className=class_name;
					}
				}
				// alert()で表示
				else{
					alert('入力に誤りがあります。\n'+arrErrors.join('\n'));
				}
			}
			return (arrErrors.length==0);
		}
	);
}


/*******************************************************
* パラメータチェック
* エラーメッセージをalert()で表示
*
* @param	args	パラメータチェック情報配列
*	【書式】
*	param0,param1,param2, ... , param_n+0,param_n+1,param_n+2
*		または
*	Array(param0,param1,param2, ... , param_n+0,param_n+1,param_n+2)
*
* @return	true:エラーなし, false:エラーあり
*
*******************************************************/
function checkFormParameter(_param) {
	// 引数
	var args;
	if(IsArray(_param)) args = _param;
	else args=checkFormParameter.arguments;
//	alert(getDebug(args));

	// パラメータエラー一覧取得
	var arrErrors = FormCheck.getParameterErrors(args);

	//------------------------------
	// 入力エラーがあればダイアログ表示
	//------------------------------
	if(0 < arrErrors.length){
//		alert('入力に誤りがあります。\n'+getDebug(arrErrors));
		alert('入力に誤りがあります。\n'+arrErrors.join('\n'));
	}
	return (arrErrors.length==0);
}

/**
* 指定のオブジェクトを検索する
*
* @param	node	オブジェクト名
* @param	doc	ドキュメント(省略時はカレントドキュメント)
*
* @return	検索オブジェクト
*/
function MM_findObj(node, doc) {
	return FormCheck.findObj(node, doc);
}

/**
 削除確認ダイアログ表示

 @return	true:OK false:NG
*/
function confirmDelete() {
	return confirm('削除します\nよろしいですか？');
}
