/* ---------------------------------------------------- */
/*                       Setting!                       */
/* ---------------------------------------------------- */
  var form_id = ""; // 対象となるフォーム
  var mail_php = "send-mail.php"; // メール送信先 -------＞ここが空ならフォームから探すことにしよっかな。
  var flag_check = true; // メール送信内容確認画面を使用するかどうか
  var input_area = "#input-form"; // 入力項目を内包する要素名
  var check_area = "check-form"; // メール送信内容確認用フォームのID名（「#」は必要ない）
  var must_block = "tr"; // 必須項目block名（もしくはID。"> div"なども使用可能）
  var must_class = ".must"; // 必須項目class名
  var alert_block_tag = "div"; // アラート表示block名
  var alert_class = ".alert"; // アラート表示class名
  var input_error = "#input-error"; // 入力エラー表示ID
  var send_error = "#send-error"; // 送信エラー表示ID
  var send_success = "#send-success"; // 送信成功表示ID
  var next_button = "次へ（確認画面）"; // メール送信内容確認フェーズへと進むためのボタン用テキスト
  var previous_button = "再編集"; // メール送信内容編集フェーズへと戻るためのボタン用テキスト
  var check_field_tag = "span"; // 確認項目接頭辞
  var check_field_name = "check_"; // 確認項目接頭辞
  var flag_mail = "email"; // メールアドレス項目名
  var flag_phone = "phone"; // 電話番号項目名
  var flag_zip = "zip-code"; // 郵便番号項目名
/* ---------------------------------------------------- */
/* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ */

  var k = new Array(); // チェックボックスの必須フラグクラス格納用配列
  var s = "-"; // 必須フラグクラスの名前と必要数をセパレートする文字

$(document).ready(function() {
	// HTMLロード後に実行したい初期化コード
	
	if (jQuery.trim(form_id)) {form_id += " ";}
	
	$(form_id + alert_block_tag + alert_class).css("display", "none");
	
	// メール送信内容確認画面を生成するかどうか
	if (flag_check) {makeCheckFormt();}
	
	// input:submit項目の機能をjQueryでのpostメソッドに置き換える。
	/* メール送信画面を生成してから置き換えないと、clickイベントが追加されない */
	$(form_id + "input[@type=submit]").click(function() {
		$(this).attr("disabled", true); // 複数回クリックされることを防止。
		jQuery_post();
		$(this).attr("disabled", false); // クリック不可状態からの復帰。
		return false;
	});
	
	// クラス名＋ハイフン（「-」or代替の文字）＋数字（必須チェック数）をグループごとに設定。
	$(form_id + must_class + " input:checkbox").each(function() {
		var ac = "";
		// クラスを取得する。取得したものをスペースで分割⇒変数に格納。
		ac = $(this).attr("class");
		if (ac) {
			ac = ac.split(" ");
			// 格納したもの全てに対して、ハイフン（「-」or代替の文字）を探す。
			for (j in ac) {
				n = ac[j].indexOf(s,0);
				if (n != -1) {
					if (!k[ac[j]]) {
						// あれば前後を分割する
						b = ac[j].substr(n+s.length,ac[j].length-n+s.length);
						k[ac[j]] = b;
					}
				}
			}
		}
		// この関数で作ったハッシュ値を利用して最終的に0以下になればTrue、ならなければFalseを変数cに返す。
	});
}); // $(document).ready() End

 // 「check_area」生成処理
function makeCheckFormt() {
	// フォームの「input_area」を探す
	var mk_input_area = $(form_id + input_area).clone();
	
	
	/* --- 「input_area」成形処理 --- */
	
	// input:submit項目をinput:buttonに置き換える。
	$(form_id + "input[@type=submit]").each(function() {
		$(this).after('<input type="button" value="' + next_button + '" onclick="nextStep();" />');
		$(this).remove();
	});
	
	
	/* --- 「check_area」成形処理 --- */
	
	// input,select,textarea項目の兄弟要素を削除する。
	var not_siblings = check_field_tag + ",input,select,textarea,br,hr"; // 削除除外タグリスト
	function deleteSiblings(obj) {
		$(obj).siblings().not(not_siblings).each(function() {$(this).remove();});
	}
	
	// input項目を結果（確認用）出力のための要素に置き換える。
	mk_input_area.find("input:text,input:checkbox,select,textarea,input:password").each(function() {
		n = check_field_name + this.name;
		deleteSiblings($(this));
		$(this).after("<" + check_field_tag + " id='" + n + "'></" + check_field_tag + ">");
		$(this).remove();
	});
	
	// input:radio項目を結果（確認用）出力のための要素に置き換える。
	var mk_input_radio = new Array();
	mk_input_area.find("input:radio").each(function() {
		deleteSiblings($(this));
	});
	mk_input_area.find("input:radio").each(function() {
		n = check_field_name + this.name;
		// 同名の要素がない場合のみ要素を追加する
		if (!mk_input_radio[n]) {
			mk_input_radio[n] = true;
			$(this).after("<" + check_field_tag + " id='" + n + "'></" + check_field_tag + ">");
		}
		$(this).remove();
	});
	
	// input:hidden項目を予期せぬエラー防止のため削除する。
	mk_input_area.find("input:hidden").each(function() {
		deleteSiblings($(this));
		$(this).remove();
	});
	
	// input:submit項目の後ろにinput:buttonを挿入する。
	mk_input_area.find("input[@type=submit]").each(function() {
		$(this).after('<input type="button" value="' + previous_button + '" onclick="previousStep();" />');
	});
	
	
	/* --- 「check_area」出力処理 --- */
	
	// ID属性を「input_area」から「check_area」に変更する。ついでに表示も消しておく。
	mk_input_area.attr("id", check_area).css("display", "none");
	// 「check_area」出力。
	$(form_id + input_area).after($(mk_input_area));
} // makeCheckFormt() End

// 送信処理
function jQuery_post() {
	jQuery.post(
		// 送信先
		mail_php,
		// 送信パラメータ。
		$(form_id + input_area).find("input:text,input:checkbox,input:radio:checked,select,textarea,input:password,input:hidden").serialize(),
		// 読み込み後に実行されるコールバック関数
		function(responseText, status, response) {
			if (status == "success") {
				// 完了
				if (responseText) {
					// success
					previousStep();
					$(form_id + send_success).slideDown();
					// $(form_id + send_success).after(responseText);
				}else{
					// failure
					previousStep();
					// エラー表示
					$(form_id + send_error).slideDown();
				}
			} else {
				// failure
				previousStep();
				// エラー表示
				$(form_id + send_error).slideDown();
			}
	});
} // jQuery_post() End

// ページ遷移（進む）
function nextStep() {
	a = check();
	if (a) {
		$(form_id + alert_class).animate({opacity: "hide", height: "hide"},"fast",function() {
				$(form_id + input_area).fadeOut("slow",function() {
					$(form_id + "#" + check_area).fadeIn("fast");}
		);});
	}
} // nextStep() End

// ページ遷移（戻る）
function previousStep() {
	$(form_id + "#" + check_area).fadeOut("fast",function() {$(form_id + input_area).fadeIn("fast");});
} // previousStep() End

// チェック結果を確認フォームに出力、及びエラー表示を非表示に
function checkResult(o,tex) {
	n = check_field_tag + "#" + check_field_name + $(o).attr("name");
	tex = tex.replace(/&/g,"&amp;");
	tex = tex.replace(/</g,"&lt;");
	tex = tex.replace(/>/g,"&gt;");
	tex = tex.replace(/\n\r|\n|\r/g,"<br />");
	if (tex) {$(form_id + "#" + check_area).find(n).html(tex);}
	else {$(form_id + "#" + check_area).find(n).empty();}
	$(o).parent().find(alert_block_tag + alert_class).animate({opacity: "hide", height: "hide"}, "fast");
} // checkResult() End

// エラーを出力する
function checkError(o) {
	//確認フォームのデータ消去
	checkResult($(o),"");
	// エラーを出力する
	$(form_id + input_error).slideDown("slow",function() {$(o).parent().find(alert_block_tag + alert_class).slideDown();});
} // checkError() End

// 入力チェック処理
function check() {
	// 必須項目を探す
	var test = $(form_id + input_area + " " + must_class);
	// 可否の初期化
	c = true;

	// テキストの入力確認処理
	test.find("input:text").each(function() {
		t = $(this).val();
		// 改行や空白のみで送信されることを回避
		v = t.replace(/[\s\n\r\t　]/g,"");
		if (v == "") {
			c = false;
			// エラー表示
			checkError($(this));
		} else {
			n = this.name;
			if (n == flag_mail) {
				m = v.match(/^[a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+$/);
				if (!m) {
					c = false;
					// エラー表示
					checkError($(this));
				}else{
					dc = test.find("input#email2").val();
					if (dc) {
						if (dc == t) {
							checkResult($(this),t);
						}else{
							c = false;
							// エラー表示
							checkError($(this));
						}
					}
				}
			} else if (n == flag_phone) {
				v = toHankakuNum(v); // 全角を半角にする
				p = v.match(/^0\d{1,5}-\d{0,4}-\d{4}$/);
				if (!p) {
					c = false;
					// エラー表示
					checkError($(this));
				}else{
					checkResult($(this),v);
				}
			} else if (n == flag_zip) {
				v = toHankakuNum(v); // 全角を半角にする
				z = v.match(/^\d{3}(?:-\d{4}|-\d{2})?$/);
				if (!z) {
					c = false;
					// エラー表示
					checkError($(this));
				}else{
					checkResult($(this),v);
				}
			} else {
				; // 考える必要有り⇒何を？
				checkResult($(this),t);
			}
		}
	});

	// パスワードの入力確認処理
	test.find("input:password").each(function() {
		t = $(this).val();
		v = "";
		if (t == "") {
			c = false;
			// エラー表示
			checkError($(this));
		} else {
			for (i=0; i<t.length; i++) {
				v += "*";
			}
			checkResult($(this),v);
		}
	});

	// ラジオボタンの入力確認処理
	var r = new Array();var r_flag = 0;
	test.find("input:radio").each(function() {
		n = this.name;
		if (!r[n]) {
			if ($(this).attr("checked")) {
				r[n] = $(this);
			} else {
				r[n] = "";
			}
		}
		// 動いたフラグ
		r_flag = 1;
	});
	if (r_flag) {
		for (i in r) {
			if (!r[i]) {
				c = false;
				// エラー表示
				checkError(test.find("input[@name*='" + i + "']"));
			} else {
				checkResult($(r[i]),ValToText_rc($(r[i])));
			}
		}
	}

	// テキストエリアの入力確認処理
	test.find("textarea").each(function() {
		t = $(this).val();
		// 改行や空白のみで送信されることを回避
		v = t.replace(/[\s\n\r\t　]/g,"");
		if (v == "") {
			c = false;
			// エラー表示
			checkError($(this));
		} else {
			checkResult($(this),t);
		}
	});

	// セレクトボタンの入力確認処理
	test.find("select").each(function() {
		v = $(this).val();
		if (v == "") {
			c = false;
			// エラー表示
			checkError($(this));
		} else {
			// checkResult($(this),ValToText_rc($(this)));
			checkResult($(this),$(this).find("option[@value='" + $(this).val() + "']").text());
		}
	});

	/* チェックボックスが必須という条件がちょっと変わっているので、場合によって処理が異なる。 */
	var ck = copy_k();var ck_flag = 0;
	test.find("input:checkbox").each(function() {
		var cl = new Array();var ac = "";var ac_flag = 0;
		// クラスを取得する。取得したものをスペースで分割⇒変数に格納。
		ac = $(this).attr("class");
		if (ac) {
			ac = ac.split(" ");
			// 格納したもの全てに対して、ハイフン（「-」or代替の文字）を探す。
			for (j in ac) {
				// あれば変数cl[Array]に格納
				if (ac[j].indexOf(s,0) != -1) {
					cl.push(ac[j]);
					ac_flag += 1;
				}
			}
		}
		if ($(this).attr("checked")) {
			// 変数cl[Array]とk[Array]のマッチするものを探す
			if (ac_flag) {
				for (i in cl) {
					for (ii in ck) {
						if (cl[i] == ii) {ck[ii] -= 1}
					}
				}
			}
			//確認フォームにデータ追加
			checkResult($(this),ValToText_rc($(this)));
		} else {
			//ハイフン（「-」or代替の文字）の無い場合。（単独のチェックボックス且つ必須項目）
			if (!ac_flag) {
				c = false;
				// エラー表示
				checkError($(this));
			}
		}
		// 動いたフラグ
		ck_flag = 1;
	});
	if (ck_flag) {
		for (i in ck) {
			if (ck[i] > 0) {
				c = false;
				// エラー表示
				checkError(test.find("input[@class*='" + i + "']"));
			}
		}
	}

	// 必須以外の項目を確認欄に挿入
	pass = $(form_id + input_area + " " + must_block).not($(must_class));
	pass.find("input:text,input:radio:checked,select,textarea,input:password").each(function() {
		checkResult($(this),$(this).val());
	});
	pass.find("input:radio:checked").each(function() {
		checkResult($(this),ValToText_rc($(this)));
	});
	pass.find("select").each(function() {
		v = $(this).val();
		if (v == "") {
			checkResult($(this),"");
		} else {
			checkResult($(this),$(this).find("option[@value='" + v + "']").text());
		}
	});
	pass.find("input:checkbox").each(function() {
		if ($(this).attr("checked")) {
			checkResult($(this),ValToText_rc($(this)));
		} else {
			checkResult($(this),"");
		}
	});
	return c;
} // check() End

// input:radio,input:checkboxの.val()と表示値が違う場合に表示値の方を返す関数
function ValToText_rc(o) {
	vtt_rc = "";
	on = $(o).attr("id");
	// .html()で取得してもいいが、checkResult()でエスケープしてしまうので画像ラベルとかは使用できない。
	// 画像ラベルのためにcheckResult()の中ではエスケープしない設定にしてもいい。
	// （テキストなどの直接入力時にのみエスケープするようにすればよい）
	vtt_rc = $(o).parent().find("label[@for='" + on + "']").text();
	if (!vtt_rc) {vtt_rc = $(o).val();}
	return vtt_rc;
} // ValToText_rc() End

// 全角文字を半角に置き換える
function toHankakuNum(motoText) {
	han = "0123456789.,-+";
	zen = "０１２３４５６７８９．，－＋";
	str = "";
	for (i=0; i<motoText.length; i++) {
		cha = motoText.charAt(i);
		no = zen.indexOf(cha,0);
		if (no >= 0) cha = han.charAt(no);
		str += cha;
	}
	return jQuery.trim(str);
} // toHankakuNum() End

// 配列オブジェクトのコピー処理
function copy_k() {
	var o = new Array();
	for (i in k) {o[i] = k[i];}
	return o;
} // copy_k() End
