<?php
/*
 * PHPフォーム処理
 *
 * 複数添付ファイル対応
 * XHTML対応（XML宣言の処理）
 * 入力のエスケープ処理 20190411
 * キャプチャ機能追加
 *
 * 2011-2023 (c) Crytus
 */

ini_set("short_open_tag", "0");
ini_set("magic_quotes_gpc", "0");
ini_set("mbstring.encoding_translation", "0");

// HTMLやプログラムの漢字コード（SJISにする場合は、HTMLを含めコードの変更が必要です）
//define("SCRIPT_ENCODING", "SJIS");
define("SCRIPT_ENCODING", "UTF-8");
// メール自体の漢字コードの指定です（英語・日本語の場合はJISを、それ以外の言語はUTF8にしてください）
define("MAIL_ENCODING", "JIS");
//define("MAIL_ENCODING", "UTF8");

// セッションを使用します（セッションが有効で無いとキャプチャは動作しません）
session_start();

// キャプチャ用画像処理
if (isset($_REQUEST["act"]) && ($_REQUEST["act"] == "captcha")) {
	captcha();
}

// キャプチャ画像出力URL
$ary = explode("/", $_SERVER["REQUEST_URI"]);
$ary[count($ary)-1] = basename(__FILE__);
$captcha = $_SERVER["REQUEST_SCHEME"] . "://" . $_SERVER["HTTP_HOST"] . implode("/", $ary) . "?act=captcha";

if (!$form_html) {
	$form_html = "mb_form.html";		// 入力フォームのファイル名
}
if (!$confirm_html) {
	$confirm_html = "mb_confirm.html";		// 確認画面のファイル名
}
if (!$finish_html) {
	$finish_html = "mb_finish.html";		// 終了画面のファイル名
}
// ユーザー向け
if (!$subject) {
	$subject = "ご登録ありがとうございます。\n";
}
if (!$body) {
	$body = "登録内容をお知らせします。
\n";
}
// 管理者向け
if (!$subject_sys) {
	$subject_sys = "登録がありました。\n";
}
if (!$body_sys) {
	$body_sys = "次の登録がありました。\n";
}
// メール本文後ろ（改行に注意）
if (!$footer) {
	$footer = "\n-----------------------
メンバー登録システム";
}
//------------------------------------------------
//
$form_input = array(
	"item1" => array("title" => "お名前", "name" => "item1", "func" => "2", "require" => "1", "check" => "1",),
	"item2" => array("title" => "メールアドレス", "name" => "item2", "func" => "2", "require" => "1", "check" => "7",),
	"item3" => array("title" => "パスワード", "name" => "item3", "func" => "15", "require" => "1", "check" => "8",),

);
// 入力値の取得
$msg = array();
$mail = array();
$mail_field = array();
$mail_title = array();
$mail_value = array();
$passwd_field = array();
$passwd_title = array();
$passwd_value = array();
//
if ($_REQUEST["mode"]) {	// フォームからの場合は、入力を反映しチェック
foreach ($form_input as $val) {
	$value = 0;
	if ($val["func"] == 6) {	// 複数行入力
		if (is_array($_REQUEST[$val["name"]])) {
			foreach ($_REQUEST[$val["name"]] as $k => $v) {
				$form[$val["name"]][$k] = htmlspecialchars($v);
				if ($v) {
					$value = 1;
				}
			}
		} else {
			$form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]);
			if ($form[$val["name"]]) {
				foreach ($form[$val["name"]] as $v) {
					if ($v != "") {
						$value = 1;
					}
				}
			}
		}
	} else if ($val["func"] == 3) {	// radio
		$form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]);
		if ($form[$val["name"]]) {
			$value = 1;
		}
		$form[$val["name"] . "_value"] = $form_input[$val["name"]]["list"][$form[$val["name"]]];
		$form[$val["name"] . "_" . $form[$val["name"]]] = "checked";
	} else if ($val["func"] == 4) {	// checkbox
		$ary = array();
		if (is_array($_REQUEST[$val["name"]])) {
			foreach ($_REQUEST[$val["name"]] as $k => $v) {
				$form[$val["name"]][$k] = htmlspecialchars($v);
				if ($v) {
					$value = 1;
					$ary[] = $form_input[$val["name"]]["list"][$v];
				}
			}
		}
		$form[$val["name"] . "_value"] = implode("・", $ary);
	} else if ($val["func"] == 5) {	// select
		$form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]);
		if ($form[$val["name"]]) {
			$value = 1;
		}
		$form[$val["name"] . "_value"] = $form_input[$val["name"]]["list"][$form[$val["name"]]];
		$form[$val["name"] . "_" . $form[$val["name"]]] = "selected";
	} else if ($val["func"] == 10) {	// 住所
		$form[$val["name"] . "_pref"] = htmlspecialchars($_REQUEST[$val["name"] . "_pref"]);
		$form[$val["name"] . "_address"] = htmlspecialchars($_REQUEST[$val["name"] . "_address"]);
		if ($form[$val["name"] . "_pref"] && $form[$val["name"] . "_address"]) {
			$value = 1;
		}
		$form[$val["name"] . "_pref_" . $form[$val["name"] . "_pref"]] = " selected";
		$form[$val["name"] . "_pref_value"] = $pref_list[$form[$val["name"] . "_pref"]];
	} else if ($val["func"] == 16) {	// 住所郵便番号入力
		$form[$val["name"] . "_zip"] = htmlspecialchars($_REQUEST[$val["name"] . "_zip"]);
		$form[$val["name"] . "_pref"] = htmlspecialchars($_REQUEST[$val["name"] . "_pref"]);
		$form[$val["name"] . "_address"] = htmlspecialchars($_REQUEST[$val["name"] . "_address"]);
		if ($form[$val["name"] . "_pref"] && $form[$val["name"] . "_address"]) {
			$value = 1;
		}
		$form[$val["name"] . "_pref_" . $form[$val["name"] . "_pref"]] = " selected";
		$form[$val["name"] . "_pref_value"] = $pref_list[$form[$val["name"] . "_pref"]];
	} else if ($val["func"] == 11) {	// 年月日
		$form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]);
		if ($form[$val["name"]]) {
			$value = 1;
		}
	} else if ($val["func"] == 12) {	// 月日
		$form[$val["name"] . "_month"] = htmlspecialchars($_REQUEST[$val["name"] . "_month"]);
		$form[$val["name"] . "_day"] = htmlspecialchars($_REQUEST[$val["name"] . "_day"]);
		if ($form[$val["name"] . "_month"] && $form[$val["name"] . "_day"]) {
			$value = 1;
		}
		$form[$val["name"] . "_month_" . $form[$val["name"] . "_month"]] = "selected";
		$form[$val["name"] . "_day_" . $form[$val["name"] . "_day"]] = "selected";
	} else if ($val["func"] == 13) {	// File
		if ($_FILES[$val["name"]]["name"]) {
			// 添付ファイルへの処理をします。
			$handle = fopen($_FILES[$val["name"]]["tmp_name"], 'r');
			$attachFile = fread($handle, filesize($_FILES[$val["name"]]["tmp_name"]));
			fclose($handle);
			$attachEncode = base64_encode($attachFile);
			$form[$val["name"] . "_value"] = $attachEncode;
			$form[$val["name"] . "_file"] = $_FILES[$val["name"]]["name"];
			$form[$val["name"] . "_type"] = $_FILES[$val["name"]]["type"];
			$value = 1;
		} else if ($_REQUEST[$val["name"] . "_value"]) {
			$form[$val["name"] . "_value"] = $_REQUEST[$val["name"] . "_value"];
			$form[$val["name"] . "_file"] = $_REQUEST[$val["name"] . "_file"];
			$form[$val["name"] . "_type"] = $_REQUEST[$val["name"] . "_type"];
			$value = 1;
		}
	} else {
		if (is_array($_REQUEST[$val["name"]])) {
			foreach ($_REQUEST[$val["name"]] as $k => $v) {
				$form[$val["name"]][$k] = htmlspecialchars($v);
				if ($v) {
					$value = 1;
				}
			}
		} else {
			$form[$val["name"]] = htmlspecialchars($_REQUEST[$val["name"]]);
			if ($form[$val["name"]]) {
				$value = 1;
			}
		}
	}
	// 入力のチェック
	if ($_REQUEST["mode"] == "form") {
		if ($val["require"] && ($value == 0)) {
			$msg[$val["name"]] = $val["title"] . "が入力されていません。";
		}
		if ($val["check"] && $value) {
			if ($val["check"] == 2) {	// 電話
				if (!preg_match("/^[0-9\-\+]+$/", $form[$val["name"]])) {
					$msg[$val["name"]] = $val["title"] . "が正しくありません";
				}
			}
			if (($val["check"] == 3)||($val["check"] == 4)||($val["check"] == 7)) {	// メール
				if (!preg_match("/^[0-9a-zA-Z_\.\-]+@[0-9a-zA-Z_\.\-]+$/", $form[$val["name"]])) {
					$msg[$val["name"]] = $val["title"] . "が正しくありません";
				} else {
					$mail_value[] = $form[$val["name"]];
					$mail_field[] = $val["name"];
					$mail_title[] = $val["title"];
				}
			}
			if ($val["check"] == 5) {	// URL
				if (!preg_match("/^(http|https):\/\/[0-9a-zA-Z_\.\-\/]+$/", $form[$val["name"]])) {
					$msg[$val["name"]] = $val["title"] . "が正しくありません";
				}
			}
			if ($val["check"] == 6) {	// キャプチャ
				if ($form[$val["name"]] != $_SESSION["captcha"]) {
					$msg[$val["name"]] = $val["title"] . "が正しくありません";
					$form[$val["name"]] = "";
				}
			}
			if (($val["check"] == 8)||($val["check"] == 9)) {	// パスワード
				// 桁数チェック
				if (($val["check"] == 8)&&(strlen($form[$val["name"]]) < $passwd_len)) {
					$msg[$val["name"]] = $val["title"] . "は{$passwd_len}桁以上必要です。";
				}
				$passwd_value[] = $form[$val["name"]];
				$passwd_field[] = $val["name"];
				$passwd_title[] = $val["title"];
			}
		}
	}
}
// メール一致
if (x_count($mail_value) == 2) {
	if ($mail_value[0] != $mail_value[1]) {
		$msg[$mail_field[0]] = $mail_title[0] . "が一致していません";
		$msg[$mail_field[1]] = $mail_title[0] . "が一致していません";
	}
}
// パスワード一致
if (x_count($passwd_value) == 2) {
	if ($passwd_value[0] != $passwd_value[1]) {
		$msg[$passwd_field[0]] = $passwd_title[0] . "が一致していません";
		$msg[$passwd_field[1]] = $passwd_title[0] . "が一致していません";
	}
}
// メールアドレス使用可能チェック
if (isset($user_mail) && $_REQUEST[$user_mail]) {
	$cond[$user_mail] = $_REQUEST[$user_mail];
	$cond["status"] = "1";
	$ret = Member::findData($cond);
	if ($ret) {
		foreach ($ret as $val) {
			$msg[$user_mail] = $email_error3;
		}
	}
}
}
if (!$_REQUEST["mode"]) {
	$mode = "form";
} else if ($_REQUEST["mode"] == "reinput") {
	$mode = "form";
} else if ($_REQUEST["mode"] != "confirm") {
	if ($msg) {
		$mode = "form";
	} else {
		$mode = "confirm";
	}
} else {
	// データベース保存
	unset($item);
	foreach ($form_input as $key => $val) {
		if ($val["func"] == 13) {	// File
			// 出力なし
		} else if ($val["func"] == 9) {	// 見出し
			// 出力なし
		} else if ($val["func"] == 14) {	// キャプチャ
			// 出力なし
		} else if ($val["func"] == 10) {	// 住所（都道府県＋住所）
			//$item[$val["name"]] = $pref_list[$form[$val["name"] . "_pref"]] . $form[$val["name"] . "_address"];
			$item[$val["name"] . "_pref"] = $pref_list[$form[$val["name"] . "_pref"]];
			$item[$val["name"]. "_address"] = $form[$val["name"] . "_address"];
		} else if ($val["func"] == 16) {	// 住所（郵便番号＋都道府県＋住所）
			//$item[$val["name"]] = $form[$val["name"] . "_zip"] . " " . $pref_list[$form[$val["name"] . "_pref"]] . $form[$val["name"] . "_address"];
			$item[$val["name"] . "_zip"] = $form[$val["name"] . "_zip"];
			$item[$val["name"] . "_pref"] = $pref_list[$form[$val["name"] . "_pref"]];
			$item[$val["name"]. "_address"] = $form[$val["name"] . "_address"];
		} else if ($val["func"] == 11) {	// 年月日
			$item[$val["name"]] = $form[$val["name"]];
		} else if ($val["func"] == 12) {	// 月日
			$item[$val["name"]] = sprintf("%02d-%02d", $form[$val["name"] . "_month"], $form[$val["name"] . "_day"]);
		} else if ($val["func"] == 3) {	// 単一選択（ラジオボタン）
			$item[$val["name"]] = $form_input[$val["name"]]["list"][$form[$val["name"]]];
		} else if ($val["func"] == 4) {	// 複数選択（チェックボックス）
			unset($ary);
			foreach ($form[$val["name"]] as $val2) {
				$ary[] = $form_input[$val["name"]]["list"][$val2];
			}
			$item[$val["name"]] = $ary;
		} else if ($val["func"] == 5) {	// 選択（プルダウン）
			$item[$val["name"]] = $form_input[$val["name"]]["list"][$form[$val["name"]]];
		} else if ($val["func"] == 6) {	// 複数個1行テキスト入力
			$item[$val["name"]] = $form[$val["name"]];
		} else {
			if (($val["check"] == 4)||($val["check"] == 9)) {
				// 一致チェックは出力なし
			} else {
				$item[$val["name"]] = $form[$val["name"]];
			}
		}
	}
	$item["status"] = "1";	// 有効、認証なし・事前メール認証
	$item["reg_date"] = date('Y-m-d H:i:s');	//time();
	if ($_REQUEST["id"]) {
		$id = $_REQUEST["id"];
		Member::updateData($id, $item);
	} else {
		$id = Member::addData($item);
	}
	// メールの送信（登録済みメール）
	// 本文へ入力値の設定
	foreach ($form_input as $key => $val) {
		if ($val["func"] == 13) {	// File
			$mail_body .= "●" . $val["title"] . "：" . $form[$val["name"] . "_file"] . "\n";
		} else if ($val["func"] == 10) {
			$mail_body .= "●" . $val["title"] . "：" . $pref_list[$form[$val["name"] . "_pref"]] . $form[$val["name"] . "_address"] . "\n";
		} else if ($val["func"] == 11) {
			if ($form[$val["name"]]) {
				$mail_body .= "●" . $val["title"] . "：" . date('Y年 m月 d日', strtotime($form[$val["name"]])) . "\n";
			} else {
				$mail_body .= "●" . $val["title"] . "：\n";
			}
		} else if ($val["func"] == 12) {
			$mail_body .= "●" . $val["title"] . "：" . $form[$val["name"] . "_month"] . "月" . $form[$val["name"] . "_day"] . "日\n";
		} else if ($val["func"] == 3) {	// 単一選択（ラジオボタン）
			$mail_body .= "●" . $val["title"] . "：" . $form_input[$val["name"]]["list"][$form[$val["name"]]] . "\n";
		} else if ($val["func"] == 4) {	// 複数選択（チェックボックス）
			if ($form[$val["name"]]) {
				$ary = array();
				foreach ($form[$val["name"]] as $val2) {
					$ary[] = $form_input[$val["name"]]["list"][$val2];
				}
				$mail_body .= "●" . $val["title"] . "：" . implode("、", $ary) . "\n";
			}
		} else if ($val["func"] == 5) {	// 選択（プルダウン）
			$mail_body .= "●" . $val["title"] . "：" . $form_input[$val["name"]]["list"][$form[$val["name"]]] . "\n";
		} else if ($val["func"] == 6) {	// 複数個1行テキスト入力
			$mail_body .= "●" . $val["title"] . "：\n";
			foreach ($form_input[$val["name"]]["list"] as $key => $val2) {
				$mail_body .= "　" . $val2 . "：" . $form[$val["name"]][$key] . "\n";
			}
		} else if ($val["func"] == 14) {	// キャプチャ
			// キャプチャが存在する場合、そのチェックが通らないとメールの送信はしない
			if (($form[$val["name"]] == "")||($_SESSION["captcha"] == "")) {
				exit;
			}
			if ($_SESSION["captcha"] != $form[$val["name"]]) {
				exit;
			}
		} else if ($val["func"] == 9) {	// 見出し
			// 出力なし
		} else if ($val["func"] == 16) {	// 住所郵便番号入力
			$mail_body .= "●" . $val["title"] . "：" . 
				$form[$val["name"] . "_zip"] . " " .
				$pref_list[$form[$val["name"] . "_pref"]] .
				$form[$val["name"] . "_address"] . "\n";
		} else {
			$mail_body .= "●" . $val["title"] . "：" . $form[$val["name"]] . "\n";
		}
	}
	unset($_SESSION["captcha"]);
	$mail_body .= $footer;
	$attach = array();
	foreach ($form_input as $val) {
		if ($val["func"] == 13) {	// File
			if ($_REQUEST[$val["name"] . "_value"]) {	// 添付ファイルあり
				$attach[] = array(
					"filebody" => $_REQUEST[$val["name"] . "_value"],
					"filename" => $_REQUEST[$val["name"] . "_file"],
					"filetype" => $_REQUEST[$val["name"] . "_type"]);
			}
		}
	}
	if ($mail_sys) {
		// 管理者向け
		sendmail($from_mail, $mail_sys, $subject_sys, $body_sys . $mail_body, $attach, $from_name);
	}
	//
	if (isset($user_mail) && $_REQUEST[$user_mail]) {
		// 利用者向け
		sendmail($from_mail, $_REQUEST[$user_mail], $subject, $body . $mail_body, $attach, $from_name);
	}
	//
	$mode = "finish";
}

$data["form"] = $form;
$data["msg"] = $msg;
$data["mode"] = $mode;
$data["mode_" . $mode] = $mode;	// モード判定用

if ($mode == "confirm") {
//	$contents = file_get_contents($confirm_html);
	htmltemplate::t_include($confirm_html, $data);
} else if ($mode == "finish") {
	// 終了の場合は、このファイルの外で出力する
	$contents = "";
//	$contents = file_get_contents($finish_html);
} else {
//	$contents = file_get_contents($form_html);
	htmltemplate::t_include($form_html, $data);
}
/*
if ($contents) {
	$head = "";
	if (mb_ereg("^<\?([^\?])+\?>", $contents, $m)) {
		// XML宣言があったら除外
		$head = $m[0];
		$contents = substr($contents, strlen($head));
	}
	// HTML出力
	echo $head;
	echo eval("?>" . $contents);
}
*/