//エラー判定時のフォームのカラー
var ErrBgColor = "#FFE1E1";

//inputフォームのデフォルト背景色
var DefaultBgColor = "#FFFFFF";

//trim処理
String.prototype.trim = function() {
	return this.replace(/^[ ]+|[ ]+$/g, '');
}
if(document.all){ // IE用
	var enc_type = document.charset;
} else { // IE以外
	var enc_type = document.characterSet;
}
if ( enc_type == "utf-8" ) {
	var countup=3;
} else {
	var countup=2;
}


//エラー文字記述
function _WriteErr ( f ,name , errStr ) {
	document.getElementById(name+'_err').innerHTML = "<br />"+errStr;
}
//エラー文字記述
function _WriteErr_Color ( f ,name ) {
	if (document.getElementById(name+'_bg') != null ) {
		document.getElementById(name+'_bg').style.backgroundColor = ErrBgColor;
	} else {
		tmpradioValue = "";
		for( i = 0 ; i < f.elements[name].length ; i++) { 
			if( f.elements[name][i].checked ) {
				tmpradioValue = f.elements[name][i].value;
				break; 
			}
		} 
		if ( tmpradioValue != "" ) { 
			document.getElementById(name+'_'+tmpradioValue+'_bg').style.backgroundColor = ErrBgColor;
		}
	}
}

//エラー文字クリア
function _ClearStr ( f, Arr , name ) {
	if ( Arr[name] == undefined ) {
		document.getElementById(name+'_err').innerHTML = "";
		if (document.getElementById(name+'_bg') != null ) {
			document.getElementById(name+'_bg').style.backgroundColor = DefaultBgColor;
		} else {
			if ( f.elements[name] != undefined ) {
				tmpradioValue = "";
				for( i = 0 ; i < f.elements[name].length ; i++) { 
					if( f.elements[name][i].checked ) {
						tmpradioValue = f.elements[name][i].value;
						break; 
					}
				} 
				if ( tmpradioValue != "" ) { 
					document.getElementById(name+'_'+tmpradioValue+'_bg').style.backgroundColor = DefaultBgColor;
				}
			}
		}
	}
}

//エラーオブジェクト削除
function _DeleteHashObj( Arr ,name ) {
	if ( Arr[name] != undefined ) {
		delete Arr[name];
	}
}
/**
 *エラーロジック処理
 *戻り値:エラー判定数
 */
var ErrArr = new Array();
function _CheckForm( f , name , tandoku ,msg ) {
	errchk = 0;
	if ( tandoku != undefined && tandoku == "1" ) {
		for ( var key in FormObj[name] ) {
			/***************************************
			必須Check 
			***************************************/
			if ( key == "hissu" ) {
				if ( f.elements[name] == undefined || f.elements[name].value.trim() == "" ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は必須です。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			CheckBoxの必須Check 
			***************************************/
			if ( key == "check_hissu" ) {
				if ( f.elements[name] == undefined || !f.elements[name].checked ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'を入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 
			/***************************************
			CheckBoxの必須Check※ユニーク 
			***************************************/
			if ( key == "check_hissu_hi" ) {
				if ( f.elements[name] == undefined || !f.elements[name].checked ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'に同意をして下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			Radioの必須Check 
			***************************************/
			if ( key == "radio_hissu" ) {
				tmpradioValue = "";
				for( i = 0 ; i < f.elements[name].length ; i++) { 
					if( f.elements[name][i].checked ) {
						tmpradioValue = f.elements[name][i].value;
						break; 
					}
				} 
				if ( f.elements[name] == undefined || tmpradioValue.trim() == "" ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は必須です。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 
			/***************************************
			最大文字数桁数Check 半角表記
			***************************************/
			if (  key == "kettaMax_hankaku" ) {
				tmpLength = textbyte(f.elements[name].value);
				if( f.elements[name].value != "" && tmpLength > FormObj[name][key] ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は'+FormObj[name][key]+'文字以内です。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			最大文字数桁数Check 
			***************************************/
			if (  key == "kettaMax" ) {
				tmpLength = textbyte(f.elements[name].value);
				errbyte = parseInt((FormObj[name][key]/countup));
				if( f.elements[name].value != "" && tmpLength > FormObj[name][key] ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は全角'+errbyte+'文字以内です。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			フォーム値の差異Check 
			***************************************/
			if (  key == "FormDiff" ) {
				if( f.elements[name].value != "" && f.elements[name].value != f.elements[FormObj[name][key]].value ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'が違います。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			最小-最大文字数桁数Check ※半角英数のみ
			***************************************/
			if (  key == "HankakuMinkettaMax" ) {
				tmpLength = textbyte(f.elements[name].value);
				minmax = FormObj[name][key].split(":");
				if( f.elements[name].value != "" && 
				  ( tmpLength < minmax[0] || tmpLength > minmax[1] ) || (!/^[a-zA-Z0-9]+$/.test( f.elements[name].value )) ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は半角英数で'+minmax[0]+'～'+minmax[1]+'文字の範囲で入力下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			最小-最大文字数桁数Check 
			***************************************/
			if (  key == "MinkettaMax" ) {
				tmpLength = textbyte(f.elements[name].value);
				minmax = FormObj[name][key].split(":");
				errbyte1 = parseInt((minmax[0]/countup));
				errbyte2 = parseInt((minmax[1]/countup));
				if( f.elements[name].value != "" && tmpLength < minmax[0] || tmpLength > minmax[1]) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は全角'+errbyte1+'文字以上'+errbyte2+'文字以下で入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			固定文字数の制限Check 
			***************************************/
			if (  key == "FixLen" ) {
				tmpLength = textbyte(f.elements[name].value);
				if( f.elements[name].value != "" && tmpLength != FormObj[name][key] ) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は'+FormObj[name][key]+'文字で入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			MailアドレスCheck 
			***************************************/
			if (  key == "MailForm" ) {
				if ( f.elements[name].value != "" && !jsMailAddrIsPropper( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'を正しく入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			電話番号形式Check 
			***************************************/
			if (  key == "TelForm" ) {
				if ( f.elements[name].value != "" && !checkIsTelNumber( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'を正しく入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			URLCheck 
			***************************************/
			if (  key == "UrlForm" ) {
				if ( f.elements[name].value != "" && !urlcheck( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'を正しく入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			DATECheck 
			***************************************/
			if (  key == "DateForm" ) {
				if ( f.elements[name].value != "" && !CheckDate( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'はyyyy/mm/ddの形式で正しく入力して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
					_DeleteHashObj( ErrArr , "same" );
				}
			} 
			/***************************************
			YearCheck 
			***************************************/
			if (  key == "YearForm" ) {
				if ( f.elements[name].value != "" && !CheckYear( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は西暦半角数字４桁で入力ください。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
				} else {
					_DeleteHashObj( ErrArr , name );
					_DeleteHashObj( ErrArr , "same" );
				}
			} 			/***************************************
			MonthCheck 
			***************************************/
			if (  key == "MonthForm" ) {
				if ( f.elements[name].value != "" && !CheckMonth( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は半角数字２桁で正しい月を入力ください。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
				} else {
					_DeleteHashObj( ErrArr , name );
					_DeleteHashObj( ErrArr , "same" );
				}
			} 			/***************************************
			DayCheck 
			***************************************/
			if (  key == "DayForm" ) {
				if ( f.elements[name].value != "" && !CheckDay( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'は半角数字２桁で正しい日を入力ください。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
				} else {
					_DeleteHashObj( ErrArr , name );
					_DeleteHashObj( ErrArr , "same" );
				}
			} 			/***************************************
			3つフォーマットのDATECheck 
			***************************************/
			if (  key == "DateForm_Same" ) {
				keyarr = FormObj[name][key].split(":");				todate = new Date();
				// 時間を0:00にする
				todate.setHours(0);
				todate.setMinutes(0);
				todate.setSeconds(0);
				todate.setMilliseconds(0);
				inputdate = new Date( (parseInt(  f.elements[keyarr[0]].value,10)), (parseInt( f.elements[keyarr[1]].value,10 ) -1), (parseInt( f.elements[keyarr[2]].value,10 )) );				if( f.elements[keyarr[0]].value != "" && f.elements[keyarr[1]].value != "" && f.elements[keyarr[2]].value != "" 
				  && !CheckDate( f.elements[keyarr[0]].value+"/"+_FormatNum(2,f.elements[keyarr[1]].value)+"/"+_FormatNum(2,f.elements[keyarr[2]].value))
				  || inputdate.getTime() >= todate.getTime() 
				) {
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, "same" , '日付を正しく入力して下さい。'  );
					}
					errchk++;
					ErrArr["same"] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , "same" );
				}
			} 
			/***************************************
			半角英数字Check 
			***************************************/
			if (  key == "NumStr" ) {
				if ( f.elements[name].value != "" && !/^[a-zA-Z0-9]+$/.test( f.elements[name].value ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'には半角英数字のみ記述して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			全角カナCheck 
			***************************************/
			if (  key == "KanaStr" ) {
				//if ( f.elements[name].value != "" && !/^[ア-ンァ-ョー]+$/.test(f.elements[name].value) ){
				if ( f.elements[name].value != "" && !/^[ア-ンァ-ヶー・(（）) 　ヴ]+$/.test(f.elements[name].value) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'はカタカナで入力下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			全角ひらがなカタカナCheck 
			***************************************/
			if (  key == "KanaStr_kai" ) {
				//if ( f.elements[name].value != "" && !/^[ぁ-んァ-ンー]+$/.test(f.elements[name].value) ){
				if ( f.elements[name].value != "" && !/^[ぁ-んー・(（）) 　]+$/.test(f.elements[name].value) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'はひらがなで入力下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			数値のみCheck 
			***************************************/
			if (  key == "NumberStr" ) {
				if ( f.elements[name].value != "" && isNaN(f.elements[name].value) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'には数値のみ記述して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 			/***************************************
			数値のみCheck先頭の0許さん 
			***************************************/
			if (  key == "NumberStrOut0" ) {
				if ( f.elements[name].value != "" && (isNaN(f.elements[name].value) || f.elements[name].value.substr(0,1) == 0 ) ){
					if ( msg == undefined || msg == "" ) {
						_WriteErr ( f, name , FormObj[name]['keyname']+'には適切な数値のみ記述して下さい。'  );
					}
					_WriteErr_Color ( f, name );
					errchk++;
					ErrArr[name] = "1";
					break;
				} else {
					_DeleteHashObj( ErrArr , name );
				}
			} 
		} 
	} else {
		/***************************************
		設定エレメントの全てのエラーをCheck 
		***************************************/
		for ( var namesub in FormObj ) {
			if ( name == "NoMessage" ) {
				errchk += _CheckForm( f ,namesub , 1 , 'no' );
			} else {
				errchk += _CheckForm( f ,namesub , 1 );
			}
		}
	}
	for ( var key in FormObj ) {
		_ClearStr ( f, ErrArr , key ) ;
	}	return errchk;
}
function urlcheck ( objValue ) {
	if( objValue ){
		if( objValue.match(/(http|ftp):\/\/[!#-9A-~]+\.+[a-z0-9]/i)){
			return true;
		}else{
			return false;
		}
	}
	return true;
}
function _FormatNum(keta, num) {
	var src = new String(num);
	var cnt = keta - src.length;
	if (cnt <= 0) return src;
	while (cnt-- > 0) src = "0" + src; return src;
}
function jsMailAddrIsPropper(objValue){
	var str;
	var AtPos;
	var bDotAfterAtMark;
	str = objValue;
	AtPos =  str.indexOf("@");
	if( AtPos <=  0){
		return false;
	}
	if( str.indexOf(".") == -1){
		return false;
	}
	bDotAfterAtMark = false;
	for( i = 0 ; i < str.length ; i ++ ){
		var c = str.charAt( i );
		if(c == "." && (i == 0 || i == str.length-1) ){
			return false;
		}
		if(c == "." && i > AtPos ){
			bDotAfterAtMark =true;
		}
		if(c == "@" && i > AtPos ){
			return false;
		}
		if( ( "a" <= c && c <= "z" ) || ( "A" <= c && c <= "Z" ) || ( "0" <= c && c <= "9" ) || c == "."|| c == "@" || c == "-" || c == "_" ){
			continue;
		} else {
			return false;
		}
	}	if (!bDotAfterAtMark){
		return false;
	}
	return true;
}
//日付チェック
function CheckDate(str) {
	if (! str.match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)) {
		return false;
	}
	var s=str.split("/")
	var y=s[0];
	var m=s[1];
	var d=s[2];
	if ( isNaN(y) || isNaN(m) || isNaN(d) ) {
		return false;
	} else {
		if ( y.length != 4) {
			return false;
		} else {
			if ( m < 1 || m > 12 ) {
				return false;
			} else {
				if ( d <= 0 || d > 30+ (( m == 4 || m == 6 || m == 9 || m ==11 )?0:1) || ( m==2 && d > 28 + (((y%4==0&&y%100!=0)||y%400==0)?1:0) ) ) {
					return false;
				}
			}
		}
	}
	return true;
}
//年チェック
function CheckYear(str) {
	if (! str.match(/^[0-9]{4}$/)) {
		return false;
	}
	if ( str.length != 4) {
		return false;
	}
	return true;
}
//月チェック
function CheckMonth(str) {
	if (! str.match(/^[0-9]{2}$/)) {
		return false;
	}
	if ( str.length != 2) {
		return false;
	}
	if ( str < 1 || str > 12 ) {
		return false;
	}
	return true;
}
//日チェック
function CheckDay(str) {
	if (! str.match(/^[0-9]{2}$/)) {
		return false;
	}
	if ( str.length != 2) {
		return false;
	}
	if ( str <= 0 || str > 31 ) {
		return false;
	}
	return true;
}
/**
* 電話番号かチェックします。
* 
* @param チェックする値
* @return true : 電話番号形式  false : 電話番号形式でない
*/
function checkIsTelNumber(value) {
	if ((value.match(/^[0-9]+\-[0-9]+\-[0-9]+$/) == null)) {
		return false;
	}
	return true;
}
function textbyte(str){
	count=0;
	for(i=0;i<str.length;i++) {
		if (str.charAt(i).match(/[ｱ-ﾝ]/) || escape(str.charAt(i)).length< 4) {
			count++;
		} else {
			count+=countup;
		}
	}
	return count;
}
//-----サブミット関数(仮)
function _GoSubmit( f ) {
	errchk = _CheckForm(f);
	if ( errchk > 0 ) {
		alert("入力フォームに誤りがあります。");
		return;
	} else {
		f.submit();
	}
}

