#! /usr/local/bin/perl

use strict;
use warnings;

use lib qw(./lib);
use CGI;
use CGI::Session;
use utf8;
use Encode;
use Unicode::Japanese;
use Data::Dumper;

my $mail   = 'sunnet@sun-net.cc';
my @mailto = (
    'sunnet@sun-net.cc',         'yamamoto@sun-net.cc',
    'allegro2015@i.softbank.jp', 'kameya@aone-web.net',
    'kanno@aone-web.net'
);
my $password    = 'rule110';
my $session_dir = 'private/.session';
my $cookie_name = 'jitensha';
my $cookie_path = '/rule';
my $sendmail    = '/usr/sbin/sendmail';

my $rate   = '0';      # 消費税（％）
my $hontai = '100';    # 価格

$CGI::POST_MAX = 10 * 1024 * 1024;
my $query = CGI->new();

# ログイン状態のチェック
my $logged = &login_check();
if ( defined $logged ) {
    my $mode = $query->param('mode') || undef;

    # フォームの処理
    if ( defined $mode ) {
        if ( $mode eq 'confirm' ) {
            &form('confirm');
        }
        elsif ( $mode eq 'send' ) {
            &mailsend();
        }
        elsif ( $mode eq 'finish' ) {
            &finish();
        }
        else {
            &form();
        }
    }
    else {
        &form();
    }
}
else {
    # ログインフォーム
    &login();
}

exit;

sub html_header {

    my $title = '申し込みログインページ';
    if ( defined $logged ) {
        $title = '申し込みフォーム';
    }

    my $html = qq|
      <!DOCTYPE html>
      <html lang="ja">
      <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta name="format-detection" content="telephone=no">

        <!-- タイトル・キーワード・説明文 -->
        <title>「自転車交通ルールを学ぼう！」（合本）$title｜自転車駐車場整備センター</title>
        <meta name="description" content="">
        <meta name="keywords" content="">

        <!-- stylesheet -->
        <link rel="stylesheet" href="css/ress.min.css">
        <link rel="stylesheet" href="css/style.css?v5">

        <!-- javascript -->
      </head>
      <body>
        <header>
          <h1><img src="img/logo.png" alt=""></h1>
          <h2>「自転車交通ルールを学ぼう！」<span>（合本）</span><br>$title</h2>
      |;
    if ( !defined $logged ) {
        $html .= '<div class="extend_attention">受付期間は終了しました。</div>';
    }
    $html .= qq|
        </header>
        <main>
      |;

    return $html;
}

sub html_footer {
    my $html = qq|
        </main>
        <footer>
          <div class="copyright">
            &copy;（公財）自転車駐車場整備センター
          </div>
        </footer>
        <script src="js/common.js?v2"></script>
      </body>
      </html>
      |;
    return $html;
}

sub login {

    my $contents = qq|
      <section>
        <div class="login">
          <form action="" method="post">
            <p>
              パスワード<br>
            </p>
            <p>
              <input type="password" name="pass"><br>
            </p>
            <p>
              <input type="submit" value="ログイン">
            </p>
            <p class="login_text">
              ※パスワードは、当センターからご案内した団体等のみにお知らせしています。<br>
              それ以外の方でご希望ある方は下記お問合せ先にご連絡ください。<br>
              1部100円（税込）で頒布しております。基本的には10冊単位でのお申し込みをお願いします。<br>
              送料無料<br>
            </p>
            <p class="login_text">
              発送管理及び発送代行<br>
              (有)サン・ネット　TEL.03-3269-6696<br>
              〒162-0808 東京都新宿区天神町22-3 ルート神楽坂5F<br>
            </p>

          </form>
        </div>
      </section>
      |;

    # 20200120 受付終了に伴いログインを封鎖
    $contents = '';

    $contents = &html_header . $contents;
    $contents .= &html_footer;

    $contents = Encode::encode( 'utf8', $contents );

    print $query->header( -charset => 'utf8' );
    print $contents;
    exit;
}

sub form {
    my $mode = shift;

    my $number = $query->param('number') || undef;
    if ( defined $mode && !defined $number ) {
        &error('冊数を入力して下さい。');
    }
    if ( defined $mode && $number !~ /^\d+$/ ) {
        &error('冊数は半角数字で入力して下さい。');
    }
    $number = Encode::decode_utf8($number) if defined $number;
    $number = &xss($number)                if defined $number;

    my $use = $query->param('use') || undef;
    if ( defined $mode && ( !defined $use || $use eq '' ) ) {
        &error('使用目的を入力して下さい。');
    }
    $use = Encode::decode_utf8($use) if defined $use;
    $use = &xss($use)                if defined $use;

    my $company = $query->param('company') || undef;
    if ( defined $mode && !defined $company ) { $company = ''; }
    $company = Encode::decode_utf8($company) if defined $company;
    $company = &xss($company)                if defined $company;
    if ( defined $mode && !defined $company ) {
        &error('団体名を入力して下さい。');
    }

    my $section = $query->param('section') || undef;

    # if ( defined $mode && !defined $section ) { $section = ''; }
    $section = Encode::decode_utf8($section) if defined $section;
    $section = &xss($section)                if defined $section;
    if ( defined $mode && !defined $section ) {
        &error('部署名を入力して下さい。');
    }

    my $name1 = $query->param('name1') || undef;
    my $name2 = $query->param('name2') || undef;
    if ( defined $mode && ( !defined $name1 || !defined $name2 ) ) {
        &error('ご担当者姓名を入力して下さい。');
    }
    $name1 = Encode::decode_utf8($name1) if defined $name1;
    $name1 = &xss($name1)                if defined $name1;
    $name2 = Encode::decode_utf8($name2) if defined $name2;
    $name2 = &xss($name2)                if defined $name2;

    my $name3 = $query->param('name3') || '';
    my $name4 = $query->param('name4') || '';
    $name3 = Encode::decode_utf8($name3) if defined $name3;
    $name3 = &xss($name3)                if defined $name3;
    $name4 = Encode::decode_utf8($name4) if defined $name4;
    $name4 = &xss($name4)                if defined $name4;

    my $zipcode  = $query->param('zipcode')  || undef;
    my $pref     = $query->param('pref')     || undef;
    my $address  = $query->param('address')  || undef;
    my $building = $query->param('building') || undef;
    if ( defined $mode && ( !defined $zipcode || !defined $pref || !defined $address ) ) {
        &error('所在地を入力して下さい。');
    }
    $zipcode  = Encode::decode_utf8($zipcode);
    $zipcode  = &xss($zipcode) if defined $zipcode;
    $pref     = Encode::decode_utf8($pref);
    $pref     = &xss($pref) if defined $pref;
    $address  = Encode::decode_utf8($address) if defined $address;
    $address  = &xss($address) if defined $address;
    $building = Encode::decode_utf8($building) if defined $building;
    $building = &xss($building) if defined $building;

    my $tel = $query->param('tel') || undef;
    if ( defined $mode && !defined $tel ) {
        &error('電話番号を入力して下さい。');
    }
    $tel = Encode::decode_utf8($tel) if defined $tel;
    $tel = &xss($tel)                if defined $tel;

    my $mail = $query->param('mail') || undef;
    if ( defined $mode && !defined $mail ) {
        &error('メールアドレスを入力して下さい。');
    }
    $mail = Encode::decode_utf8($mail) if defined $mail;
    $mail = &xss($mail)                if defined $mail;

    my $shipping_company = $query->param('shipping_company') || undef;
    if ( defined $mode && !defined $shipping_company ) { $shipping_company = ''; }
    $shipping_company = Encode::decode_utf8($shipping_company) if defined $shipping_company;
    $shipping_company = &xss($shipping_company)                if defined $shipping_company;

    my $shipping_section = $query->param('shipping_section') || undef;
    if ( defined $mode && !defined $shipping_section ) { $shipping_section = ''; }
    $shipping_section = Encode::decode_utf8($shipping_section) if defined $shipping_section;
    $shipping_section = &xss($shipping_section)                if defined $shipping_section;

    my $shipping_name1 = $query->param('shipping_name1') || undef;
    my $shipping_name2 = $query->param('shipping_name2') || undef;

    $shipping_name1 = Encode::decode_utf8($shipping_name1) if defined $shipping_name1;
    $shipping_name1 = &xss($shipping_name1)                if defined $shipping_name1;
    $shipping_name2 = Encode::decode_utf8($shipping_name2) if defined $shipping_name2;
    $shipping_name2 = &xss($shipping_name2)                if defined $shipping_name2;

    my $shipping_name3 = $query->param('shipping_name3') || undef;
    my $shipping_name4 = $query->param('shipping_name4') || undef;
    $shipping_name3 = Encode::decode_utf8($shipping_name3) if defined $shipping_name3;
    $shipping_name3 = &xss($shipping_name3)                if defined $shipping_name3;
    $shipping_name4 = Encode::decode_utf8($shipping_name4) if defined $shipping_name4;
    $shipping_name4 = &xss($shipping_name4)                if defined $shipping_name4;

    my $shipping_zipcode  = $query->param('shipping_zipcode')  || undef;
    my $shipping_pref     = $query->param('shipping_pref')     || undef;
    my $shipping_address  = $query->param('shipping_address')  || undef;
    my $shipping_building = $query->param('shipping_building') || undef;

    $shipping_zipcode  = Encode::decode_utf8($shipping_zipcode);
    $shipping_zipcode  = &xss($shipping_zipcode) if defined $shipping_zipcode;
    $shipping_pref     = Encode::decode_utf8($shipping_pref);
    $shipping_pref     = &xss($shipping_pref) if defined $shipping_pref;
    $shipping_address  = Encode::decode_utf8($shipping_address) if defined $shipping_address;
    $shipping_address  = &xss($shipping_address) if defined $shipping_address;
    $shipping_building = Encode::decode_utf8($shipping_building) if defined $shipping_building;
    $shipping_building = &xss($shipping_building) if defined $shipping_building;

    my $shipping_tel = $query->param('shipping_tel') || undef;
    $shipping_tel = Encode::decode_utf8($shipping_tel) if defined $shipping_tel;
    $shipping_tel = &xss($shipping_tel)                if defined $shipping_tel;

    my $shipping_flag;
    if (   ( defined $shipping_company && $shipping_company ne '' )
        || ( defined $shipping_name1    && $shipping_name1 ne '' )
        || ( defined $shipping_name2    && $shipping_name2 ne '' )
        || ( defined $shipping_name3    && $shipping_name3 ne '' )
        || ( defined $shipping_name4    && $shipping_name4 ne '' )
        || ( defined $shipping_zipcode  && $shipping_zipcode ne '' )
        || ( defined $shipping_pref     && $shipping_pref ne '' )
        || ( defined $shipping_address  && $shipping_address ne '' )
        || ( defined $shipping_building && $shipping_building ne '' )
        || ( defined $shipping_tel      && $shipping_tel ne '' ) )
    {
        $shipping_flag = 1;
    }

    my $message = $query->param('message') || '';
    $message = Encode::decode_utf8($message) if defined $message;
    $message = &xss($message)                if defined $message;

    my $contents;
    if ( !defined $mode ) {
        $contents = qq|
        <section>
          <div class="description">
            <ol>
              <li>
                <strong>申込に関して</strong><br>
                1冊100円（税込）<br>
                ※基本的には10冊単位でのお申込みです。難しいようでしたら、下記フォーム内よりご相談ください。また、お電話でのご相談も受付けてあります。(有)サン・ネット　TEL.03-3269-6696 まで。なお、送料は無料です。<br>
              </li>
              <li>
                <strong>申込期限</strong><br>
                令和元年12月27日（金）24時締切<br>
                <div class="extend_attention">好評につき申込期間を延長します。<br>増刷しておりますので注文からお届けまで暫くお時間をいただきます。</div>
              </li>
              <li>
                <strong>送金先口座</strong><br>
                三菱UFJ銀行　本店<br>
                （普通）７６５０８７４<br>
                （名義　公益財団法人 自転車駐車場整備センター）<br>
              </li>
              <li>
                <strong>お届けの予定時期</strong><br>
                ご入金いただいてから1か月程度を目安としております。<br>
              </li>
              <li>
                <strong>お申込みに関する問合せ先</strong><br>
                （有）サン・ネット　03-3269-6696<br>
                〒162-0808　東京都新宿区天神町22-3　ルート神楽坂5F<br>
              </li>
            </ol>
          </div>
        </section>
        |;
    }

    $contents .= qq|
<section>
<div class="form">
<form action="" method="post">
|;
    $contents .= qq|
<h1>
お申し込みフォーム<br>
</h1>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<div class="form_title">
<strong>はじめに…</strong><br>
下記にメールアドレスをご記入ください。自動返信メールが届きます。<br>
<span class="attention">sun-net.ccのドメインが受信できるように設定をお願いします。<br>
自動返信メールが届かない場合は上記電話番号からお問い合わせ下さい。</span>
</div>
|;
    }

    $contents .= qq|
<table>
<tr>
<th>メールアドレス<span class="must">（必須）</span></th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<input type="text" name="mail" placeholder="半角英数字でご記入ください">
|;
    }
    else {
        $contents .= qq|
$mail
<input type="hidden" name="mail" value="$mail">
|;
    }
    $contents .= qq|
</td>
</tr>
</table>
|;

    # 1. 機関・団体名、所在地、電話番号、所属部署、ご担当者 ──────────────────────────────────────────

    $contents .= qq|
<div class="form_title">
<strong>1. 機関・団体名、所在地、電話番号、所属部署、ご担当者</strong><br>
</div>
|;
    $contents .= qq|
<table>
|;
    $contents .= qq|
<tr>
<th>団体名<span class="must">（必須）</span></th>
<td>
|;

    if ( !defined $mode ) {
        $contents .= qq|
<input type="text" name="company">
|;
    }
    else {
        $contents .= qq|
$company
<input type="hidden" name="company" value="$company">
|;
    }
    $contents .= qq|
</td>
</tr>
|;
    $contents .= qq|
<tr>
<th>部署名<span class="must">（必須）</span></th>
<td>
|;

    if ( !defined $mode ) {
        $contents .= qq|
<input type="text" name="section">
|;
    }
    else {
        $contents .= qq|
$section
<input type="hidden" name="section" value="$section">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
<tr>
<th>所在地<span class="must">（必須）</span></th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<p>
〒 <input name="zipcode" type="text" class="short"><br>
</p>
<p>
<select name="pref">
<option value="">都道府県をお選び下さい。</option>
<option>北海道</option>
<option>青森県</option>
<option>岩手県</option>
<option>宮城県</option>
<option>秋田県</option>
<option>山形県</option>
<option>福島県</option>
<option>茨城県</option>
<option>栃木県</option>
<option>群馬県</option>
<option>埼玉県</option>
<option>千葉県</option>
<option>東京都</option>
<option>神奈川県</option>
<option>新潟県</option>
<option>富山県</option>
<option>石川県</option>
<option>福井県</option>
<option>山梨県</option>
<option>長野県</option>
<option>岐阜県</option>
<option>静岡県</option>
<option>愛知県</option>
<option>三重県</option>
<option>滋賀県</option>
<option>京都府</option>
<option>大阪府</option>
<option>兵庫県</option>
<option>奈良県</option>
<option>和歌山県</option>
<option>鳥取県</option>
<option>島根県</option>
<option>岡山県</option>
<option>広島県</option>
<option>山口県</option>
<option>徳島県</option>
<option>香川県</option>
<option>愛媛県</option>
<option>高知県</option>
<option>福岡県</option>
<option>佐賀県</option>
<option>長崎県</option>
<option>熊本県</option>
<option>大分県</option>
<option>宮崎県</option>
<option>鹿児島県</option>
<option>沖縄県</option>
</select><br>
</p>
<p>
市区町村以下<br>
<input type="text" name="address">
</p>
<p>
マンション・ビル名<br>
<input type="text" name="building">
</p>
|;
    }
    else {
        $contents .= qq|
<p>〒 $zipcode<br>$pref<br>$address<br>$building</p>
<input type="hidden" name="pref" value="$pref">
<input type="hidden" name="zipcode" value="$zipcode">
<input type="hidden" name="address" value="$address">
<input type="hidden" name="building" value="$building">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
<tr>
<th>ご連絡先電話番号<span class="must">（必須）</span></th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<input type="text" name="tel" placeholder="例)03-0000-0000">
|;
    }
    else {
        $contents .= qq|
$tel
<input type="hidden" name="tel" value="$tel">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
<tr>
<th>ご担当者様<span class="must">（必須）</span></th>
<td class="name">
|;
    if ( !defined $mode ) {
        $contents .= qq|
<p>所属 <input type="text" name="name3" class="short"> 部</p>
<p> <input type="text" name="name4" class="short"> 課<br></p>
<p>姓 <input type="text" name="name1" class="short"></p>
<p>名 <input type="text" name="name2" class="short"></p>
|;
    }
    else {
        $contents .= qq|
所属 ${name3}部 ${name4}課<br>
$name1 $name2
<input type="hidden" name="name1" value="$name1">
<input type="hidden" name="name2" value="$name2">
<input type="hidden" name="name3" value="$name3">
<input type="hidden" name="name4" value="$name4">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
</table>
|;

    # 2. 希望冊数 ──────────────────────────────────────────

    $contents .= qq|
<div class="form_title">
<strong>2. 希望冊数</strong><br>
</div>
|;

    $contents .= qq|
<table>
|;

    $contents .= qq|
<tr>
<th>ご希望冊数<span class="must">（必須）</span></th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<input type="text" name="number" class="short"> 冊　※半角数字<br>
<div class="calc"></div>
|;
    }
    else {
        $contents .= qq|
$number 冊
<input type="hidden" name="number" value="$number">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
<tr>
<th>使用目的<span class="must">（必須）</span></th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<select name="use">
<option value="">使用目的をお選びください。</option>
<option>会議資料</option>
<option>図書館架書</option>
<option>教材等</option>
</select><br>
|;
    }
    else {
        $contents .= qq|
$use
<input type="hidden" name="use" value="$use">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
</table>
|;

    # 3. 配送先 ──────────────────────────────────────────

    $contents .= qq|
<div class="form_title">
<strong>3. 配送先</strong><br>
|;

    if ( !defined $mode ) {
        $contents .= qq|
配送先が上記１と異なる場合のみご記入ください。
|;
    }
    if ( defined $mode && !defined $shipping_flag ) {
        $contents .= qq|
      上記１と同一場所
      |;
    }

    $contents .= qq|
</div>
|;

    if ( !defined $mode || ( defined $mode && defined $shipping_flag ) ) {

        $contents .= qq|
<table>
|;
        $contents .= qq|
<tr>
<th>団体名</th>
<td>
|;

        if ( !defined $mode ) {
            $contents .= qq|
<input type="text" name="shipping_company">
|;
        }
        else {
            $contents .= qq|
$shipping_company
<input type="hidden" name="shipping_company" value="$shipping_company">
|;
        }
        $contents .= qq|
</td>
</tr>
|;
        $contents .= qq|
<tr>
<th>部署名</th>
<td>
|;

        if ( !defined $mode ) {
            $contents .= qq|
<input type="text" name="shipping_section">
|;
        }
        else {
            $contents .= qq|
$shipping_section
<input type="hidden" name="shipping_section" value="$shipping_section">
|;
        }
        $contents .= qq|
</td>
</tr>
|;

        $contents .= qq|
<tr>
<th>所在地</th>
<td>
|;
        if ( !defined $mode ) {
            $contents .= qq|
<p>
〒 <input name="shipping_zipcode" type="text" class="short"><br>
</p>
<p>
<select name="shipping_pref">
<option value="">都道府県をお選び下さい。</option>
<option>北海道</option>
<option>青森県</option>
<option>岩手県</option>
<option>宮城県</option>
<option>秋田県</option>
<option>山形県</option>
<option>福島県</option>
<option>茨城県</option>
<option>栃木県</option>
<option>群馬県</option>
<option>埼玉県</option>
<option>千葉県</option>
<option>東京都</option>
<option>神奈川県</option>
<option>新潟県</option>
<option>富山県</option>
<option>石川県</option>
<option>福井県</option>
<option>山梨県</option>
<option>長野県</option>
<option>岐阜県</option>
<option>静岡県</option>
<option>愛知県</option>
<option>三重県</option>
<option>滋賀県</option>
<option>京都府</option>
<option>大阪府</option>
<option>兵庫県</option>
<option>奈良県</option>
<option>和歌山県</option>
<option>鳥取県</option>
<option>島根県</option>
<option>岡山県</option>
<option>広島県</option>
<option>山口県</option>
<option>徳島県</option>
<option>香川県</option>
<option>愛媛県</option>
<option>高知県</option>
<option>福岡県</option>
<option>佐賀県</option>
<option>長崎県</option>
<option>熊本県</option>
<option>大分県</option>
<option>宮崎県</option>
<option>鹿児島県</option>
<option>沖縄県</option>
</select><br>
</p>
<p>
市区町村以下<br>
<input type="text" name="shipping_address">
</p>
<p>
マンション・ビル名<br>
<input type="text" name="shipping_building">
</p>
|;
        }
        else {
            $contents .= qq|
<p>〒 $shipping_zipcode<br>$shipping_pref<br>$shipping_address<br>$shipping_building</p>
<input type="hidden" name="shipping_pref" value="$shipping_pref">
<input type="hidden" name="shipping_zipcode" value="$shipping_zipcode">
<input type="hidden" name="shipping_address" value="$shipping_address">
<input type="hidden" name="shipping_building" value="$shipping_building">
|;
        }
        $contents .= qq|
</td>
</tr>
|;

        $contents .= qq|
<tr>
<th>ご連絡先電話番号</th>
<td>
|;
        if ( !defined $mode ) {
            $contents .= qq|
<input type="text" name="shipping_tel" placeholder="例)03-0000-0000">
|;
        }
        else {
            $contents .= qq|
$shipping_tel
<input type="hidden" name="shipping_tel" value="$shipping_tel">
|;
        }
        $contents .= qq|
</td>
</tr>
|;

        $contents .= qq|
<tr>
<th>ご担当者様</th>
<td class="name">
|;
        if ( !defined $mode ) {
            $contents .= qq|
<p>所属 <input type="text" name="shipping_name3" class="short"> 部</p>
<p> <input type="text" name="shipping_name4" class="short"> 課<br></p>
<p>姓 <input type="text" name="shipping_name1" class="short"></p>
<p>名 <input type="text" name="shipping_name2" class="short"></p>
|;
        }
        else {
            $contents .= qq|
所属 ${shipping_name3}部 ${shipping_name4}課<br>
$shipping_name1 $shipping_name2
<input type="hidden" name="shipping_name1" value="$shipping_name1">
<input type="hidden" name="shipping_name2" value="$shipping_name2">
<input type="hidden" name="shipping_name3" value="$shipping_name3">
<input type="hidden" name="shipping_name4" value="$shipping_name4">
|;
        }
        $contents .= qq|
</td>
</tr>
|;

        $contents .= qq|
</table>
|;
    }

    # 4. お問い合わせ ──────────────────────────────────────────

    $contents .= qq|
<div class="form_title">
<strong>4. お問い合わせ</strong><br>
</div>
|;

    $contents .= qq|
<table>
|;

    $contents .= qq|
<tr>
<th>お問い合わせ内容</th>
<td>
|;
    if ( !defined $mode ) {
        $contents .= qq|
<textarea name="message"></textarea>
|;
    }
    else {
        my $view_message = $message;
        $view_message =~ s/\n/<br>/g;
        $contents .= qq|
$view_message
<input type="hidden" name="message" value="$message">
|;
    }
    $contents .= qq|
</td>
</tr>
|;

    $contents .= qq|
</table>
|;

    if ( defined $mode ) {
        my $price = $number * $hontai;
        my $tax   = $price / 100 * $rate;
        my $total = $price + $tax;

        ( my $view_price = $price ) =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
        ( my $view_total = $total ) =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
        ( my $view_tax   = $tax )   =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;

        $contents .= qq|
<div class="check_price">
合計金額：${view_total}円<br>
内訳<br>
本体価格：${view_price}円<span class="space"></span>送料：0円　※送料は無料ですが、振込手数料をご負担ください。<br>
<input type="hidden" name="price" value="$price">
<input type="hidden" name="tax" value="$tax">
<input type="hidden" name="total" value="$total">
</div>|;
    }

    $contents .= qq|
<div class="button">
|;
    if ( !defined $mode ) {
        $contents .= qq|
<input type="submit" value="確　認">
<input type="hidden" name="mode" value="confirm">
|;
    }
    else {
        $contents .= qq|
<input type="submit" value="送　信">
<input type="hidden" name="mode" value="send">
|;
    }
    $contents .= qq|
</div>
</form>
</div>
</section>
|;

    $contents = &html_header . $contents;
    $contents .= &html_footer;

    $contents = Encode::encode( 'utf8', $contents );

    print $query->header( -charset => 'utf8' );
    print $contents;
    exit;
}

sub finish {

    my $contents = qq|
        <section>
          <div class="finish">
          送信完了しました。
          <a href="/rule">お申し込みトップに戻る</a>
          </div>
        </section>
        |;

    $contents = &html_header . $contents;
    $contents .= &html_footer;

    $contents = Encode::encode( 'utf8', $contents );

    print $query->header( -charset => 'utf8' );
    print $contents;
    exit;
}

sub error {

    my $message  = shift;
    my $contents = qq|
      <section>
        <div class="error">
          $message
        </div>
      </section>
      |;

    $contents = &html_header . $contents;
    $contents .= &html_footer;

    $contents = Encode::encode( 'utf8', $contents );

    print $query->header( -charset => 'utf8' );
    print $contents;
    exit;
}

sub xss {
    my $value = shift;
    $value =~ s/&/&amp;/g;
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/\"/&quot;/g;
    $value =~ s/\'/&#39;/g;
    return ($value);
}

sub xss_rtn {
    my $value = shift;
    $value =~ s/&amp;/&/g;
    $value =~ s/&lt;/</g;
    $value =~ s/&gt;/>/g;
    $value =~ s/&quot;/\"/g;
    $value =~ s/&#39;/\'/g;
    return ($value);
}

sub login_check {

    # クッキーからログイン情報を取得する
    my $sid = $query->cookie( -name => "$cookie_name" ) || undef;
    if ( defined $sid ) {
        my $session = CGI::Session->new( undef, $sid, { Directory => $session_dir } );
        if ( $sid ne $session->id ) {
            $sid = undef;
            $session->delete;
        }
        $session->close();
        if ( defined $sid ) { return $sid; }
    }

    # フォームからの入力をチェックする
    my $pass = $query->param('pass') || undef;
    if ( defined $pass && $pass eq $password ) {

        # ログイン成功
        # セッション生成
        my $session = CGI::Session->new( undef, undef, { Directory => $session_dir } );
        $session->expire('+1d');
        $sid = $session->id;
        $session->flush;
        my $cookie = $query->cookie(
            -name  => $cookie_name,
            -value => $sid,
            -path  => $cookie_path
        );
        print $query->redirect( -url => '/rule', -cookie => $cookie );
        exit;
    }
    return undef;
}

sub mailsend {
    my $total = $query->param('total') || '';
    $total = Encode::decode_utf8($total) if defined $total;
    $total = &xss($total)                if defined $total;

    my $price = $query->param('price') || '';
    $price = Encode::decode_utf8($price) if defined $price;
    $price = &xss($price)                if defined $price;

    my $tax = $query->param('tax') || '';
    $tax = Encode::decode_utf8($tax) if defined $tax;
    $tax = &xss($tax)                if defined $tax;

    my $number = $query->param('number') || undef;
    if ( !defined $number ) {
        &error('冊数を入力して下さい。');
    }
    $number = Encode::decode_utf8($number);
    $number = &xss_rtn($number) if defined $number;

    my $use = $query->param('use') || undef;
    if ( !defined $use || $use eq '' ) {
        &error('使用目的を入力して下さい。');
    }
    $use = Encode::decode_utf8($use) if defined $use;
    $use = &xss_rtn($use)            if defined $use;

    my $company = $query->param('company') || undef;
    if ( !defined $company ) {
        &error('団体名を入力して下さい。');
    }
    $company = Encode::decode_utf8($company);
    $company = &xss_rtn($company) if defined $company;

    my $section = $query->param('section') || undef;
    if ( !defined $section ) {
        &error('部署名を入力して下さい。');
    }
    $section = Encode::decode_utf8($section);
    $section = &xss_rtn($section) if defined $section;

    my $name1 = $query->param('name1') || undef;
    my $name2 = $query->param('name2') || undef;
    if ( !defined $name1 || !defined $name2 ) {
        &error('お名前を入力して下さい。');
    }
    $name1 = Encode::decode_utf8($name1);
    $name1 = &xss_rtn($name1) if defined $name1;
    $name2 = Encode::decode_utf8($name2);
    $name2 = &xss_rtn($name2) if defined $name2;

    my $name3 = $query->param('name3') || undef;
    my $name4 = $query->param('name4') || undef;
    if ( !defined $name3 ) {
        $name3 = "";
    }
    if ( !defined $name4 ) {
        $name4 = "";
    }
    $name3 = Encode::decode_utf8($name3);
    $name3 = &xss_rtn($name3) if defined $name3;
    $name4 = Encode::decode_utf8($name4);
    $name4 = &xss_rtn($name4) if defined $name4;

    my $zipcode  = $query->param('zipcode')  || undef;
    my $pref     = $query->param('pref')     || undef;
    my $address  = $query->param('address')  || undef;
    my $building = $query->param('building') || undef;
    if ( !defined $zipcode || !defined $pref || !defined $address ) {
        &error('所在地を入力して下さい。');
    }
    $zipcode  = Encode::decode_utf8($zipcode);
    $zipcode  = &xss_rtn($zipcode) if defined $zipcode;
    $pref     = Encode::decode_utf8($pref);
    $pref     = &xss_rtn($pref) if defined $pref;
    $address  = Encode::decode_utf8($address);
    $address  = &xss_rtn($address) if defined $address;
    $building = Encode::decode_utf8($building);
    $building = &xss_rtn($building) if defined $building;

    my $tel = $query->param('tel') || undef;
    if ( !defined $tel ) {
        &error('電話番号を入力して下さい。');
    }
    $tel = Encode::decode_utf8($tel);
    $tel = &xss_rtn($tel) if defined $tel;

    my $mail = $query->param('mail') || undef;
    if ( !defined $mail ) {
        &error('メールアドレスを入力して下さい。');
    }
    $mail = Encode::decode_utf8($mail);
    $mail = &xss_rtn($mail) if defined $mail;

    my $shipping_company = $query->param('shipping_company') || '';
    if ( !defined $shipping_company ) { $shipping_company = ''; }
    $shipping_company = Encode::decode_utf8($shipping_company) if defined $shipping_company;
    $shipping_company = &xss_rtn($shipping_company)            if defined $shipping_company;

    my $shipping_section = $query->param('shipping_section') || '';
    if ( !defined $shipping_section ) { $shipping_section = ''; }
    $shipping_section = Encode::decode_utf8($shipping_section) if defined $shipping_section;
    $shipping_section = &xss_rtn($shipping_section)            if defined $shipping_section;

    my $shipping_name1 = $query->param('shipping_name1') || '';
    my $shipping_name2 = $query->param('shipping_name2') || '';

    $shipping_name1 = Encode::decode_utf8($shipping_name1) if defined $shipping_name1;
    $shipping_name1 = &xss_rtn($shipping_name1)            if defined $shipping_name1;
    $shipping_name2 = Encode::decode_utf8($shipping_name2) if defined $shipping_name2;
    $shipping_name2 = &xss_rtn($shipping_name2)            if defined $shipping_name2;

    my $shipping_name3 = $query->param('shipping_namec') || '';
    my $shipping_name4 = $query->param('shipping_name4') || '';
    $shipping_name3 = Encode::decode_utf8($shipping_name3) if defined $shipping_name3;
    $shipping_name3 = &xss_rtn($shipping_name3)            if defined $shipping_name3;
    $shipping_name4 = Encode::decode_utf8($shipping_name4) if defined $shipping_name4;
    $shipping_name4 = &xss_rtn($shipping_name4)            if defined $shipping_name4;

    my $shipping_zipcode  = $query->param('shipping_zipcode')  || '';
    my $shipping_pref     = $query->param('shipping_pref')     || '';
    my $shipping_address  = $query->param('shipping_address')  || '';
    my $shipping_building = $query->param('shipping_building') || '';

    $shipping_zipcode  = Encode::decode_utf8($shipping_zipcode);
    $shipping_zipcode  = &xss_rtn($shipping_zipcode) if defined $shipping_zipcode;
    $shipping_pref     = Encode::decode_utf8($shipping_pref);
    $shipping_pref     = &xss_rtn($shipping_pref) if defined $shipping_pref;
    $shipping_address  = Encode::decode_utf8($shipping_address) if defined $shipping_address;
    $shipping_address  = &xss_rtn($shipping_address) if defined $shipping_address;
    $shipping_building = Encode::decode_utf8($shipping_building) if defined $shipping_building;
    $shipping_building = &xss_rtn($shipping_building) if defined $shipping_building;

    my $shipping_tel = $query->param('shipping_tel') || '';
    $shipping_tel = Encode::decode_utf8($shipping_tel) if defined $shipping_tel;
    $shipping_tel = &xss_rtn($shipping_tel)            if defined $shipping_tel;

    my $shipping_flag;
    if (   ( defined $shipping_company && $shipping_company ne '' )
        || ( defined $shipping_name1    && $shipping_name1 ne '' )
        || ( defined $shipping_name2    && $shipping_name2 ne '' )
        || ( defined $shipping_name3    && $shipping_name3 ne '' )
        || ( defined $shipping_name4    && $shipping_name4 ne '' )
        || ( defined $shipping_zipcode  && $shipping_zipcode ne '' )
        || ( defined $shipping_pref     && $shipping_pref ne '' )
        || ( defined $shipping_address  && $shipping_address ne '' )
        || ( defined $shipping_building && $shipping_building ne '' )
        || ( defined $shipping_tel      && $shipping_tel ne '' ) )
    {
        $shipping_flag = 1;
    }

    my $message = $query->param('message') || '';
    $message = Encode::decode_utf8($message) if defined $message;
    $message = &xss_rtn($message)            if defined $message;

    my $subject       = 'お申し込みありがとうございます。';
    my $subject_admin = '「自転車交通ルールを学ぼう」のお申し込みがありました。';

    my $affilication = '';
    if ( $name3 ne '' || $name4 ne '' ) {
        $affilication = '所属 ';
    }
    if ( $name3 ne '' ) {
        $affilication .= qq|${name3}部|;
    }
    if ( $name4 ne '' ) {
        $affilication .= qq|${name4}課|;
    }

    my $shipping_text = "上記１と同一場所\n";
    if ($shipping_flag) {
        my $shipping_affilication = '';
        if ( $shipping_name3 ne '' || $shipping_name4 ne '' ) {
            $shipping_affilication = '所属 ';
        }
        if ( $shipping_name3 ne '' ) {
            $shipping_affilication .= qq|${shipping_name3}部|;
        }
        if ( $shipping_name4 ne '' ) {
            $shipping_affilication .= qq|${shipping_name4}課|;
        }
        $shipping_text = <<EOF;
団体名： $shipping_company
部署名： $shipping_section
所在地：
〒$shipping_zipcode
$shipping_pref
$shipping_address
$shipping_building
電話番号： $shipping_tel
ご担当者： $shipping_affilication $shipping_name1 $shipping_name2
EOF
    }

    my ( $sec, $min, $hour, $day, $month, $year ) = localtime();
    my $date = sprintf( "%04d-%02d-%02d", $year + 1900, $month + 1, $day );

    # 3桁カンマ
    $hontai =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
    $price  =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
    $total  =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;
    $tax    =~ s/(\d{1,3})(?=(?:\d{3})+(?!\d))/$1,/g;

    my $data = <<EOF;
------------------------------------------------------
　■【ご注文内容】
------------------------------------------------------
【注文日付】
$date

商品名：「自転車交通ルールを学ぼう」(合本)
小計： $hontai x ${number}冊 = ${total}円（税込）
-----------------------------------------------------------
商品合計価格 : ${total}円
-----------------------------------------------------------
請求総額 : ${total}円
※送料は無料ですが、振込手数料をご負担ください。

【お振込先】
三菱UFJ銀行　本店
（普通）７６５０８７４
（名義　公益財団法人 自転車駐車場整備センター）
※お振込確認後、1ヵ月程度で発送致します。
なお、弊社からの領収書の発行は承っておりません。
金融機関から発行される振込受領票にて代えさせていただきます。


------------------------------------------------------
　■【ご注文者情報】
------------------------------------------------------
メールアドレス： $mail

1. 機関・団体名、所在地、電話番号、所属部署、ご担当者
団体名： $company
部署名： $section
所在地：
〒$zipcode
$pref
$address
$building
電話番号： $tel
ご担当者： $affilication $name1 $name2

2. 希望冊数
ご希望冊数： $number 冊
使用目的： $use

3. 配送先
$shipping_text
4. お問い合わせ
$message
------------------------------------------------------

EOF

    my %error;
    $error{1} = &mailer( $mail, $subject, $data, 0 );

    foreach (@mailto) {
        my $rtn = &mailer( $_, $subject_admin, $data, 1 );
        push @{ $error{2} }, 1 if defined $rtn;
    }

    if ( defined $error{2} && @{ $error{2} } == @mailto ) {
        &error('担当者へのメール送信に失敗しました。<br>お手数ですが、再度送信を試みて下さい。');
    }

    print $query->redirect( -url => '?mode=finish' );
    exit;

}

sub mailer {
    my $to      = shift;
    my $subject = shift;
    my $data    = shift;
    my $admin   = shift;

    #件名、本文をJISに変換
    my $s = Unicode::Japanese->new($subject);

    # $subject = $s->jis;
    $subject = encode( 'MIME-Header-ISO_2022_JP', $subject );

    my $body;
    if ( $admin == 1 ) {
        my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
        my $week    = ( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" )[$wday];
        my $nowdate = sprintf(
            "%04d/%02d/%02d(%s) %02d:%02d:%02d",
            $year + 1900,
            $mon + 1, $mday, $week, $hour, $min, $sec
        );
        my $host    = $ENV{'REMOTE_HOST'};
        my $address = $ENV{'REMOTE_ADDR'};

        if ( !defined $host || $host eq $address ) {
            if ( $address =~ /^(\.|\d)+$/ ) {
                $host = gethostbyaddr( pack( 'C4', split( /\./, $address ) ), 2 ) || $address;
            }
            else {
                $host = '';
            }
        }

        $body = <<EOF;
「自転車交通ルールを学ぼう」のお申し込みがありました。

$data

----------------------------------------
DATE\t\t\t: $nowdate
SERVER_NAME\t\t: $ENV{'SERVER_NAME'}
HTTP_USER_AGENT\t: $ENV{'HTTP_USER_AGENT'}
REMOTE_HOST\t\t: $host
REMOTE_ADDR\t: $address
----------------------------------------

EOF
    }
    else {
        $body = <<EOF;
いつもご利用いただきまして誠にありがとうございます。
本日、以下のご注文を承りましたのでご確認をお願い致します。

このメールに心当たりのない場合や、ご不明な点がございましたら
sunnet\@sun-wet.cc までご連絡くださいませ。

$data

******************************************************
≪Web Shop≫\thttp://www.sun-net.cc/rule/
≪お問い合わせ≫\tsunnet\@sun-net.cc

■　有限会社サン・ネット　■
　　〒162-0808　東京都新宿区天神町22-3　ルート神楽坂5F
　　Tel 03-3269-6696 / Fax 03-3269-6697 / 9:00〜18:00（月〜金）
******************************************************
EOF
    }

    my $t = Unicode::Japanese->new($body);
    $body = $t->jis;

    # メール送信
    eval {
        open( MAIL, "| $sendmail $to" ) || die('open error');
        print MAIL "Return-Path: $mail\n" if $mail;
        print MAIL "X-Mailer: sendmail\n";
        print MAIL "Reply-To: $mail\n" if $mail;
        print MAIL "To: $to\n";
        print MAIL "From: $mail\n";
        print MAIL "Subject: $subject\n";
        print MAIL "Content-Transfer-Encoding: 7bit\n";
        print MAIL "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n";
        print MAIL $body;
        close MAIL;
    };
    if ($@) {
        return 1;
    }

    return undef;
}
