//	◇スクリプトをコピーされる方へ。
//	あなたの JavaScript のスキルアップになれば幸いです。
//	なお、このスクリプトは以下の文献を参考にして作りました。
//	技術評論社刊　　JavaScript例文活用辞典
//	秀和システム刊　HTML&JavaScript辞典

var	hiragana  = "あいうえおかきくけこさしすせそたちつてとなにぬねの";
	hiragana += "はひふへほまみむめもやゆよらりるれろわをん";
	hiragana += "ぁぃぅぇぉっゃゅょー、。゛゜（）「」・ヽヾゝゞ";
	hiragana += "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゐゑぶ";
var	katakana  = "アイウエオカキクケコサシスセソタチツテトナニヌネノ";
	katakana += "ハヒフヘホマミムメモヤユヨラリルレロワヲン";
	katakana += "ァィゥェォッャュョー、。゛゜（）「」・ヽヾゝゞ";
	katakana += "ガギグゲゴザジズゼゾダヂヅデドバビブベボパピプペポヰヱヴ";
var	hankata   = "ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝ";
var	hankata1  = "ｧｨｩｪｫｯｬｭｮｰ､｡ﾞﾟ()｢｣･";
var	hankata2  = "ｱｲｳｴｵﾂﾔﾕﾖｰ､｡ﾞﾟ()｢｣･";
var	hankata3  = "    ｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾊﾋﾌﾍﾎﾊﾋﾌﾍﾎｲｴｳ";

var	hsuji  = "0123456789";
var	zsuji  = "０１２３４５６７８９";
var	heiji  = hsuji;
	heiji += "abcdefghijklmnopqrstuvwxyz";
	heiji += "ABCDEFGHIJKLMNOPQRSTUVWXYZ_";
var	zeiji  = zsuji;
	zeiji += "ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ";
	zeiji += "ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ＿";
var	henzn  = ".-+*/%()";
var zenzn  = "．－＋＊／％（）";
var	hkigo  = ",@!#=[]{}<>?:;~$ ";
var	zkigo  = "，＠！＃＝［］｛｝＜＞？：；～＄　";
var	hsusu  = hsuji + ".-";
var	hsuen  = hsuji + henzn;
var	zsusu  = zsuji + "．－";
var	zsuen  = zsuji + zenzn;
var	hseek  = heiji + henzn + hkigo;
var	zseek  = zeiji + zenzn + zkigo;

/*
	仮名の変換
	org:	原文
	sel:	0 ひらがな⇒カタカナ	1 カタカナ⇒ひらがな
	mode:	0 修整と誤字消去  1 修正のみ
	Ex. onChange="this.value=cnv_kana(this.value);"
*/
function cnv_kana(org, sel, mode)
{
	var tbl1, tbl2, str = "";
	if (sel)
	{
		tbl1 = hiragana+"　 "; tbl2 = katakana;
	}
	else
	{
		tbl1 = katakana+"　 "; tbl2 = hiragana;
	}
	var tbl3 = hankata + hankata1;
	var i, c, n;
	for (i = 0; i < org.length; ++i)
	{
		c = org.charAt(i);
		n = tbl3.indexOf(c, 0);
		if (n < 0)  { str += c; }
		if (n >= 0) { str += tbl1.charAt(n); }
	}
	org = str;

	return _cnv_common(org, mode, tbl1, tbl2);
}

function _cnv_common(org, mode, tbl1, tbl2)
{
	var str = '';
	var i, c, n;
	for (i = 0; i < org.length; ++i)
	{
		c = org.charAt(i);
		n = tbl2.indexOf(c, 0);
		if (n < 0)  { n = tbl1.indexOf(c, 0); }
		if (mode)
		{
			if (n >= 0) { c = tbl1.charAt(n); }
			str += c;
		}
		else
		{
			if (n >= 0) { str += tbl1.charAt(n); }
		}
	}
	return str;
}


/*
	半角カタカナへの変換
	org:	原文
	sel:	0 ひらがな⇒カタカナ	1 ひらがな⇒カタカナ（促音を大きく直す）
	mode:	0 修整と誤字消去  1 修正のみ
	Ex. onChange="this.value=cnv_hanKatakana(this.value);"
*/
function cnv_hanKatakana(org, sel, mode)
{
	var str = "";
	var tbl1 = katakana+"　 ";
	var tbl2 = hiragana;
	var tbl3 = hankata + ((sel) ? hankata2 : hankata1) + hankata3;
	var i, c, n;
	for (i = 0; i < org.length; ++i)
	{
		c = org.charAt(i);
		if (hankata.indexOf(c, 0) >= 0
		||	hankata1.indexOf(c, 0) >= 0
		||	hankata3.indexOf(c, 0) >= 0
		)
		{
			if (sel)
			{
				n = hankata1.indexOf(c, 0);
				if (n >= 0)
				{
					c = hankata2.charAt(n);
				}
			}
			str += c;
			continue;
		}
		n = tbl1.indexOf(c, 0);
		if (n < 0)  { n = tbl2.indexOf(c, 0); }
		if (mode)
		{
			if (n >= 0)
			{
				c = tbl3.charAt(n);
				if (n >= 97) {}
				else if (n >= 96) { c += 'ﾞ'; }
				else if (n >= 94) {}
				else if (n >= 89) { c += 'ﾟ'; }
				else if (n >= 69) { c += 'ﾞ'; }
			}
			str += c;
		}
		else
		{
			if (n >= 0)
			{
				str += tbl3.charAt(n);
				if (n >= 97) {}
				else if (n >= 96) { str += 'ﾞ'; }
				else if (n >= 94) {}
				else if (n >= 89) { str += 'ﾟ'; }
				else if (n >= 69) { str += 'ﾞ'; }
			}
		}
	}
	return str;
}

/*
	半角数字への変換
	org:	原文
	sel:	0 数字のみ  1 小数点とマイナスも許可  2 数字関係の記号も許可
	mode:	0 修整と誤字消去  1 修正のみ
	Ex. onChange="this.value=cnv_hanSuji(this.value);"
*/
function cnv_hanSuji(org, sel, mode)
{
	var tbl1, tbl2, str = "";
	org = '' + org;
	switch (sel)
	{
	case 1:
		tbl1 = hsusu; tbl2 = zsusu;
		break;
	case 2:
		tbl1 = hsuen; tbl2 = zsuen;
		break;
	default:
		tbl1 = hsuji; tbl2 = zsuji;
	}
	return _cnv_common(org, mode, tbl1, tbl2);
}

/*
	半角英字への変換
	org:	原文
	sel:	0	英数字のみ	1	英数字と記号	-1	数字のみ
	mode:	0 修整と誤字消去	1 修正のみ
	Ex. onChange="this.value=cnv_hanEiji(this.value);"
*/
function cnv_hanEiji(org, sel, mode)
{
	var tbl1, tbl2, str = "";
	switch (sel)
	{
	case -1:
		tbl1 = hsusu; tbl2 = zsusu;
		break;
	case 1:
		tbl1 = hseek; tbl2 = zseek;
		break;
	default:
		tbl1 = heiji; tbl2 = zeiji;
	}
	return _cnv_common(org, mode, tbl1, tbl2);
}

/*
	半角英字への変換
	org:	原文
	sel:	0	英数字のみ	1	英数字と記号	-1	数字のみ
	mode:	0 修整と誤字消去	1 修正のみ
	Ex. onChange="this.value=cnv_hanEiji(this.value);"
*/
function cnv_zenEiji(org, sel, mode)
{
	var tbl1, tbl2, str = "";
	switch (sel)
	{
	case -1:
		tbl1 = zsusu; tbl2 = hsusu;
		break;
	case 1:
		tbl1 = zseek; tbl2 = hseek;
		break;
	default:
		tbl1 = zeiji; tbl2 = heiji;
	}
	return _cnv_common(org, mode, tbl1, tbl2);
}

/*
	Email や URL の打ち間違いを修正
	Ex. onChange="this.value=reviseUrl(this.value);"
*/
function reviseUrl(str)
{
	str = cnv_hanEiji(str, 1);
	str = str.replace(/\,/g, '.');
	str = str.replace(/\;/g, ':');
	str = str.replace(/[\*\(\)\!\{\}\<\>\$ ]/g, '');
	return str;
}
function reviseURL(str) { return reviseUrl(str); }
function revisePhone(str)
{
	str = cnv_hanEiji(str, 1);
	str = str.replace(/[\.\+\/\%\,\@\!\=\[\]\{\}\<\>\?\:\;\~\&\$ ]/g, '');
	return str;
}

//	ＵＲＬチェック
//	間違いがある場合、エラーが帰ってくる。
//	Ex. var errmsg = checkUrl( URL );
function checkUrl(str, mode)
{
	error = "";
	if (str == "" || str == "http://")
	{
		//	mode が yes のときは空チェックする（デフォ）
		if (mode != "no")
		{
			error = "ホームページアドレス が入力されていません。";
		}
	}
	else if (!str.match(/^https?\:\/\/[0-9a-z_\.\-]{2,}\.[a-z]{2,}\//i))
	{
		error = "無効な ホームページアドレス です。";
	}
	return error;
}

//	電話番号チェック
//	間違いがある場合、エラーが帰ってくる。
//	Ex. var errmsg = checkPhone( email );
function checkPhone(str, mode)
{
	error = "";
	if (str == "")
	{
		//	mode が yes のときは空チェックする（デフォ）
		if (mode != "no")
		{
			error = "番号が入力されていません。";
		}
	}
	else
	{
		var tmp = str.split(/[ #]/);
		str = tmp[0];
		str = str.replace(/[^0-9]/g, '');
		if (!str.match(/^0[0-9]{9,10}$/))
		{
			error = "無効な番号です。";
		}
	}
	return error;
}

//	Emailチェック
//	間違いがある場合、エラーが帰ってくる。
//	Ex. var errmsg = checkEmail( email );
function checkEmail(str, mode)
{
	error = "";
	if (str == "")
	{
		//	mode が yes のときは空チェックする（デフォ）
		if (mode != "no")
		{
			error = "E-mail が入力されていません。";
		}
	}
	else if (!str.match(/^[0-9a-z_\!\+\-\*\/\%\=\.\?]+\@[0-9a-z_\-\.]{2,}\.[a-z]{2,}$/i))
	{
		error = "メールアドレスが正しくありません。";
	}
	return error;
}

/*
	Email や URL を２回入力させる
*/
var doubleCheckUrl_lock = false;
function doubleCheckUrl(OBJ, promptMessage)
{
	doubleCheckUrl_lock = true;
	var ret = "";
	OBJ.value = reviseUrl(OBJ.value);
	var Newtxt = OBJ.value;
	if (!promptMessage) { promptMessage = "確認のためもう一度ご入力ください。"; }

	if (Newtxt != "")
	{
		ret = prompt(promptMessage, "");
		if (ret) { ret = reviseUrl(ret); }

		// キャンセル
		if (ret == null)
		{
			OBJ.value = "";
			OBJ.focus();
		}

		// 入力された文字列が違う
		else if (ret != Newtxt)
		{
			OBJ.value = "";
			alert("入力内容が違いました。");
			OBJ.focus();
		}
	}
	setTimeout('doubleCheckUrl_lock = false', 1000);
}


/*	==========================================================================
*/
//	指定した formオブジェクトについて、入力内容のチェックを行う
function checkForm(frm, confirmMessage, noCheckList, options)
{
	var OBJ = new Object;

	//	チェックするフォーム
	OBJ.form = frm;

	//	フォームのエレメント
	OBJ.elements = frm.elements;

	//	エレメントの数
	OBJ.eNum = OBJ.elements.length;

	//	送信する内容をコレクトした文字列(Ajax用)
	OBJ.postData = '';

	//	エラーメッセージ
	OBJ.errorMessage = '';

	//	設定項目を記憶するプロパティ
	OBJ.substitute = new Array;

	//	確認メッセージ
	OBJ.confirmMessage = '';
	OBJ.setConfirmMessage = function(confirmMessage)
	{
		if (confirmMessage)
		{
			this.confirmMessage = confirmMessage + '　　　　　';
		}

		return true;
	};
	OBJ.setConfirmMessage(confirmMessage);

	//	Ｅメールアドレスの空入力を許可する
	OBJ.allowEmptyEmail = false;
	OBJ.setAllowEmptyEmail = function(flag)
	{
		this.allowEmptyEmail = (flag) ? true : false;
		return true;
	};
	if (typeof(options) == 'object' && !!options(allowEmptyEmail))
	{
		OBJ.setAllowEmptyEmail(options(allowEmptyEmail));
	}

	//	パスワードの最低文字数
	OBJ.passwordMinimumLength = 5;
	OBJ.setPasswordMinimumLength = function(minlength)
	{
		this.passwordMinimumLength = parseInt(minlength);
		return true;
	};
	if (typeof(options) == 'object' && !!options(passwordMinimumLength))
	{
		OBJ.setPasswordMinimumLength(options(passwordMinimumLength));
	}

	/*==- チェックしないエレメントの指定 -==*/
	OBJ.noCheckElements = '"$"';
	OBJ.setNoCheckList = function(noCheckList)
	{
		if (noCheckList)
		{
			var str = '';
			var TMP = noCheckList.split(',');
			for (var ii = TMP.length; --ii >= 0;)
			{
				str += '|'+TMP[ii].replace(/\//g, '\\/');
			}
			eval('this.noCheckElements = '+((str == '') ? '"$"' : '/^('+str.substring(1)+')$/')+';');
		}

		return true;
	};
	OBJ.setNoCheckList(noCheckList);

	//	エレメントの名前から自動でチェック情報を設定する
	OBJ.autoValidateByName = false;
	OBJ.setAutoValidateByName = function(flag)
	{
		this.autoValidateByName = (flag) ? true : false;
		return true;
	};
	if (typeof(options) == 'object' && !!options(autoValidateByName))
	{
		OBJ.setAutoValidateByName(options(autoValidateByName));
	}


	//	エレメントに名前を付ける
	OBJ.setName = function(eName, nickname)
	{
		//	エレメントがあるかどうか確認する
		if (!!this.elements[eName])
		{
			var ele = this.elements[eName];
			this._setSubstitute(ele, eName);
			this.substitute[eName]['alt'] = nickname;

			return true;
		}
		else
		{
			return false;
		}
	};

	//	設定オブジェクトの生成
	OBJ._setSubstitute = function(ele, eName)
	{
		if (this.substitute[eName] == null)
		{
			this.substitute[eName] = new Array;
			var sub = this.substitute[eName];
			sub['validate'] = '';
			if (!!ele.length)
			{
				sub['title'] = '';
				sub['alt']	 = (!!ele[0] && !!ele[0].alt) ? ele[0].alt : '';
			}
			else
			{
				sub['title'] = (!!ele[0] && !!ele[0].title) ? ele[0].title : '';
				sub['alt']	 = (!!ele[0] && !!ele[0].alt) ? ele[0].alt : '';
			}

			return true;
		}
		else
		{
			return false;
		}
	};


	//	エレメント毎に値のチェック機能を追加できるようにする
	OBJ.setValidate = function(eName, vType)
	{
		//	エレメントがあるかどうか確認する
		if (!!this.elements[eName])
		{
			var ele = this.elements[eName];
			this._setSubstitute(ele, eName);
			this._setValidate(this.substitute[eName], vType, arguments[2], arguments[3]);

			return true;
		}
		else
		{
			return false;
		}
	};


	OBJ._setValidate = function(sub, vType)
	{
		//	チェックすべき Validate情報を、Elementに追加する
		//	かぶるもの(between, lessthanなど)は、後付け優先
		vType = vType.toLowerCase();
		switch (vType)
		{
		case 'alnum':
			sub.validate += ','+vType;
			break;

		case 'alpha':
			sub.validate += ','+vType;
			break;

		case 'digits':
		case 'numeric':
		case 'number':
		case 'num':
			sub.validate += ',number';
			break;

		case 'between':
			sub.validate += ',number,compare';
			sub.minNumber = arguments[2];
			sub.maxNumber = arguments[3];
			break;
/*
		case 'date':
			sub.validate += ','+vType;
			break;
/**/
		case 'integer':
		case 'int':
			sub.validate += ',integer';
			break;
/*
		case 'float':
			sub.validate += ','+vType;
			break;
/**/
		case 'greaterthan':
			sub.validate += ',number,compare';
			sub.minNumber = arguments[2];
			break;

		case 'lessthan':
			sub.validate += ',number,compare';
			sub.maxNumber = arguments[2];
			break;
/*
		case 'inarray':
			sub.validate += ','+vType;
			sub.inarray = arguments[2];
			break;
/**/
		case 'notinarray':
			sub.validate += ','+vType;
			sub.notinarray = arguments[2];
			break;

		case 'emailaddress':
		case 'email':
		case 'mail':
			sub.validate += ',email';
			break;

		case 'url':
			sub.validate += ','+vType;
			break;
/*
		case 'ip':
			sub.validate += ','+vType;
			break;
/**//*
		case 'regex':
		case 'regexp':
			sub.validate += ',regex';
			sub.regex = arguments[2];
			break;
/**/
		case 'notempty':
		case 'selected':
		case 'checked':
			sub.validate += ',stringlength';
			sub.minstringlength = 1;
			break;

		case 'stringlength':
		case 'length':
			sub.validate += ',stringlength';
			sub.minstringlength = arguments[2];
			sub.maxstringlength = arguments[3];
			break;

		case 'sameelement':
			//	比較するエレメントがあるかどうか確認する
			if (!!this.elements[arguments[2]])
			{
				var arg2 = this.elements[arguments[2]];
				this._setSubstitute(arg2, arguments[2]);
				sub.validate += ',sameelement';
				sub.sameElement = arg2;
			}
			break;
		}

		return true;
	};


	//	エレメントをチェックし、問題があればエラーを表示する
	OBJ.checkElements = function(err)
	{
		//	エラー情報と送信する内容の初期化
		this.errorMessage = (!!err) ? err : '';
		var postData = '';
		this.postData = '';

		//	エレメントについて入力内容をチェックする
		for (var ii = this.eNum; --ii >= 0;)
		{
			var ele = this.elements[ii];
			if (ele.disabled)
			{
				continue;
			}

			if (!!ele['name'])
			{
				if (ele['name'].match(this.noCheckElements))
				{
					continue;
				}

				//	設定情報
				if (this.substitute[ele['name']] == undefined)
				{
					this.substitute[ele['name']] = new Array;
				}
				var sub = this.substitute[ele['name']];

				//	validate情報がない場合は空文字を設定する
				if (sub.validate == null || sub.validate == '')
				{
					if (this.autoValidateByName)
					{
						sub.validate = '';
					}
					else
					{
						continue;
					}
				}

				//	Element種毎に値のチェックを行う
				switch (ele['type'])
				{
				case 'password':
					if (this.autoValidateByName)
					{
						sub.validate += ',stringlength';
						sub.minstringlength = parseInt(this.passwordMinimumLength);
					}
					this._checkValidate_text(ele, sub);
					break;

				case 'text':
					if (this.autoValidateByName)
					{
						if (ele['name'].match(/mail/))
						{
							sub.validate += ',email';
							if (!this.allowEmptyEmail)
							{
								sub.validate += ',stringlength';
								sub.minstringlength = 1;
							}
						}
						else if (ele['name'].match(/passwd/))
						{
							sub.validate += ',stringlength';
							sub.minstringlength = parseInt(this.passwordMinimumLength);
						}
					}
					this._checkValidate_text(ele, sub);
					break;

				case 'textarea':
					this._checkValidate_text(ele, sub);
					break;

				case 'checkbox':
					this._checkValidate_check(ele, sub);
					break;

				case 'radio':
					this._checkValidate_check(ele, sub);
					break;

				case 'select-one':
					//	何かひとつ選択されているかをチェック
					if (sub.validate.match(',stringlength'))
					{
						if (ele.selectedIndex == 0)
						{
							this._addErrorMessage(
								this._getName(ele, sub)
							+	'を 選択してください。'
							);
							ele.focus();
						}
					}
					else if (sub.validate.match(',notinarray'))
					{
						var flag = false;
						for (var jj in sub.notinarray)
						{
							if (sub.notinarray[jj] == ele[ele.selectedIndex].value)
							{
								flag = true;
								break;
							}
						}
						if (flag)
						{
							this._addErrorMessage(
								this._getName(ele, sub)
							+	'の選択を確認してください。'
							);
							ele.focus();
						}
					}
					break;

				case 'select-multiple':
					//	何かひとつ選択されているかをチェック
					if (sub.validate.match(',stringlength'))
					{
//						if (ele.checkedIndex)
						{
						}
					}
					break;

				case 'button':
				case 'submit':
					break;

				default:
				}

				//	送信データを文字列として取得
				if (ele['type'] == 'checkbox' && !ele.checked)
				{
					continue;
				}

				postData +=
					'&' + window.encodeURIComponent(ele['name'])
				+	'=' + window.encodeURIComponent(ele['value'])
				;
			}

		}

		if (this.errorMessage != '')
		{
			alert(
				this.errorMessage+'\n入力内容をお確かめください。　　　　　'
			);
			return false;
		}
		else
		{
			//	送信データを集約する
			this.postData = postData;

			//	送信確認
			if (this.confirmMessage)
			{
				return confirm(this.confirmMessage+"\n\nよろしいですか？　　　　　");
			}
			else
			{
				return true;
			}
		}
	};

	//	テキスト入力型エレメントのチェック処理本体 (text, textarea, password)
	OBJ._checkValidate_text = function(ele, sub)
	{
		//	チェック
		//	文字数
		if (sub.validate.match(',stringlength'))
		{
			var minflag = maxflag = false;

			if (sub.minstringlength != null && sub.minstringlength != '')
			{
				if (ele.value.length < sub.minstringlength)
				{
					minflag = true;
				}
			}
			if (sub.maxstringlength != null && sub.maxstringlength != '')
			{
				if (ele.value.length > sub.maxstringlength)
				{
					maxflag = true;
				}
			}

			if (minflag || maxflag)
			{
				if (minflag && maxflag)
				{
					this._addErrorMessage(
						this._getName(ele, sub)+'を '
					+	sub.minstringlength+' 文字以上、'
					+	sub.maxstringlength+' 文字以下で入力してください。'
					);
				}
				if (minflag)
				{
					this._addErrorMessage(
						this._getName(ele, sub)+'を '
					+	((sub.minstringlength > 1) ? sub.minstringlength+' 文字以上で' : '')
					+	'入力してください。'
					);
				}
				if (maxflag)
				{
					this._addErrorMessage(
						this._getName(ele, sub)+'を '
					+	sub.maxstringlength+' 文字以下で入力してください。'
					);
				}

				ele.focus();
			}
		}

		//	半角英数字
		if (sub.validate.match(',alnum'))
		{
			if (ele.value.match(/[^0-9a-z_\-\.]/i))
			{
				this._addErrorMessage(
					this._getName(ele, sub)
				+	'には 半角英数字で入力してください。'
				);
				ele.focus();
			}
		}

		//	半角英字
		if (sub.validate.match(',alpha'))
		{
			if (ele.value.match(/[^a-z_]/i))
			{
				this._addErrorMessage(
					this._getName(ele, sub)
				+	'には 半角英字で入力してください。'
				);
				ele.focus();
			}
		}

		//	半角数字
		if (sub.validate.match(',number') && sub.validate.match(',integer')/* && sub.validate.match(',float')/**/)
		{
			if (ele.value.match(/[^0-9\-\.]/))
			{
				this._addErrorMessage(
					this._getName(ele, sub)
				+	'には 半角数字で入力してください。'
				);
				ele.focus();
			}
		}

		//	整数
		if (sub.validate.match(',integer'))
		{
			if (ele.value.match(/[^0-9\-]/))
			{
				this._addErrorMessage(
					this._getName(ele, sub)
				+	'には 整数で入力してください。'
				);
				ele.focus();
			}
		}

		//	数値比較
		if (sub.validate.match(',compare'))
		{
			if (sub.minNumber != null && sub.minNumber != '')
			{
				if (ele.value < sub.minNumber)
				{
					this._addErrorMessage(
						this._getName(ele, sub)
					+	'を '+sub.minNumber+' 以上で入力してください。'
					);
					ele.focus();
				}
			}
			if (sub.maxNumber != null && sub.maxNumber != '')
			{
				if (ele.value > sub.maxNumber)
				{
					this._addErrorMessage(
						this._getName(ele, sub)
					+	'を '+sub.maxNumber+' 以下で入力してください。'
					);
					ele.focus();
				}
			}
		}

		//	メールアドレス
		if (sub.validate.match(',email'))
		{
			var tmp = checkEmail(ele.value, 'no');
			if (tmp != '')
			{
				this._addErrorMessage(tmp);
				ele.focus();
			}
		}

		//	メールアドレス
		if (sub.validate.match(',url'))
		{
			var tmp = checkUrl(ele.value, 'no');
			if (tmp != '')
			{
				this._addErrorMessage(tmp);
				ele.focus();
			}
		}

		//	指定されたエレメントと値が合うかどうか
		if (sub.validate.match(',sameelement'))
		{
			if (typeof(sub.sameElement) && sub.sameElement.value != null)
			{
				if (sub.sameElement.value != ele.value)
				{
					this._addErrorMessage(
						this._getName(ele, sub)+'と '
					+	this._getName(sub.sameElement, this.substitute[sub.sameElement['name']])+'の '
					+	'入力内容が合いません。'
					);
					ele.focus();
				}
			}
		}

/*		//	未対応の項目
		if (sub.validate.match(',date'))	{}
		if (sub.validate.match(',float'))	{}
		if (sub.validate.match(',hex'))		{}
		if (sub.validate.match(',inarray'))	{}
		if (sub.validate.match(',ip'))		{}
		if (sub.validate.match(',regex'))	{}
/**/

		return true;
	};


	//	チェック型エレメントのチェック処理本体 (checkbox, radio)
	OBJ._checkValidate_check = function(ele, sub)
	{
		//	何かひとつ選択されているかをチェック
		if (sub.validate.match(',stringlength'))
		{
			if (sub.flaged == null)
			{
				//	チェックした証
				sub.flaged = -1;

				var OBJ = this.elements[ele['name']];
				if (!!OBJ.length)
				{
					//	チェックされている個数を数える
					var cnt = 0;
					for (var jj = 0; jj < OBJ.length; ++jj)
					{
						var obj = OBJ[jj];
						if (obj.checked)
						{
							++cnt;
						}
					}

					//	チェックされた個数を調べる
					var minflag = maxflag = false;

					if (sub.minstringlength != null && sub.minstringlength != '')
					{
						if (cnt < sub.minstringlength)
						{
							minflag = true;
						}
					}
					if (sub.maxstringlength != null && sub.maxstringlength != '')
					{
						if (cnt > sub.maxstringlength)
						{
							maxflag = true;
						}
					}

					if (minflag || maxflag)
					{
						if (minflag && maxflag)
						{
							this._addErrorMessage(
								this._getName(ele, sub)+'を '
							+	sub.minstringlength+' 個以上、'
							+	sub.maxstringlength+' 個以下でチェックしてください。'
							);
						}
						if (minflag)
						{
							this._addErrorMessage(
								this._getName(ele, sub)+'を '
							+	((sub.minstringlength > 1) ? sub.minstringlength+' 個以上 ' : '')
							+	'チェックしてください。'
							);
						}
						if (maxflag)
						{
							this._addErrorMessage(
								this._getName(ele, sub)+'を '
							+	sub.maxstringlength+' 個以下でチェックしてください。'
							);
						}

						sub.flaged = 1;
					}
				}
				else
				{
					if (!ele.checked)
					{
						sub.flaged = 1;
						this._addErrorMessage(
							this._getName(ele, sub)
						+	'を チェックしてください。'
						);
					}
				}
			}

			//	エラーが起きていた場合
			if (sub.flaged > 0)
			{
				ele.focus();
			}
		}
	};


	//	エレメントの名前を取得する
	OBJ._getName = function(ele, sub)
	{
		return (!!sub.alt) ? sub.alt : ((!!sub.title) ? sub.title : ((!!ele.alt) ? ele.alt : ((!!ele.title) ? ele.title : '"'+ele.name+'"')));
	};

	//	エラーメッセージを追加する
	OBJ._addErrorMessage = function(msg)
	{
		return (this.errorMessage = msg + "　　　　　\n" + this.errorMessage);
	};

	OBJ.getPostData = function()
	{
		return this.postData;
	};

	//	すべてのエレメントの入力内容を消去する
	OBJ.clear = function()
	{
		if (!confirm("入力内容を消去します。　　　　　　　　　　　　　　　　\n\nよろしいですか？"))
		{
			return true;
		}

		//	エレメントについて入力内容をチェックする
		for (var ii = this.eNum; --ii >= 0;)
		{
			var ele = this.elements[ii];
			if (ele.disabled)
			{
				continue;
			}
			if (!!ele['name'])
			{
				//	Element種毎に値のチェックを行う
				switch (ele['type'])
				{
				case 'password':
				case 'text':
				case 'textarea':
					ele.value = '';
					break;

				case 'checkbox':
				case 'radio':
					ele.checked = false;
					break;

				case 'select-one':
				case 'select-multiple':

					switch(ele.name)
					{
						case 'men_high':
						case 'type_high':
						case 'tochi_high':
						case 'yosan_high':
							ele.selectedIndex = ele.options.length - 1;
							break;
						default:
						ele.selectedIndex = 0;
					}
					for (var jj = 0; jj < ele.options.length; ++jj)
					{
						ele.options[jj].selected = false;
					}
					break;

				case 'button':
				case 'submit':
					break;

				default:
				}
			}
		}

		return true;
	};

	return OBJ;
}


/*	==========================================================================
*/
//	テキストフィールドに入力された計算式を計算する
//	Ex. onChange="this.value=autocalc(this.value);"
function autocalc(exp)
{
	return eval(cnv_hanSuji(exp, 2));
}

//	新しいウィンドウを開くファンクション
function openNewWindow(url, sX, sY, mX, mY, resizable)
{
	if (url != '' && url != 'http://')
	{
		var ableX = screen.availWidth - 10;
		var ableY = screen.availHeight - 29;
		if (isNaN(sX) || ableX < sX) { sX = ableX; }
		if (isNaN(sY) || ableY < sY) { sY = ableY; }
		var opt = '';
		opt+='toolbar=0,location=0,directories=0,status=0,menubar=0,';
		opt+='resizable='+(resizable?'1':'0')+',scrollbars=1,alwaysLowered=1,titlebar=0,';
		opt+='width=' + sX + 'px,height=' + sY + 'px';
		WI = window.open('/toppage/blank.html', '_blank', opt);
		WI.location.replace(url);
		if (!isNaN(mX) && !isNaN(mY))
		{
			WI.moveTo(mX, mY);
		}
	}
}

//	プルダウンを探してセレクトする
function selPulldown(ele, m)
{
	//	エレメントのタイプによって処理が分かれる
	switch (ele.type)
	{
	//	multipull の SELECT
	case 'select-one':
		var flag = 'selected';
		var onlyone = true;
		break;

	//	通常の SELECT
	case 'select':
		var flag = 'selected';
		var onlyone = false;
		break;

	//	ラジオチェック
	case 'radio':
		var flag = 'checked';
		var onlyone = true;
		break;

	//	チェックボックス
	case 'checkbox':
		var flag = 'checked';
		var onlyone = false;
		break;

	//	それ以外は false
	default:
		return false;
	}

	//	エレメントが複数ある場合
	if (!!ele.length)
	{
		var success = false;

		//	ひとつずつエレメントをチェックし、該当があればフラグを立てる
		for (ii = 0; ii < ele.length; ++ii)
		{
			if (ele[ii].value == m)
			{
				ele[ii][flag] = true;
				if (onlyone)
				{
					return m;
				}
				success = true;
			}
		}

		if (success)
		{
			return m;
		}
	}

	//	エレメントがひとつの場合
	else
	{
		if (ele.value == m)
		{
			ele[flag] = true;
			return m;
		}
	}

	return false;
}

//	End of Script;
