#!/usr/bin/perl

require "jcode.pl";
$action = "join_game.cgi";
$database = "/var/www/GAS_data/web_mem_db.txt";

# --- データ取得 --- #
&getFormData;

# --- モード選択 --- #
&selectMode;

# --- 入力データをレベル２でチェック --- #
# --- 問題なければ入力データを表示 --- #
# --- 入力に問題有りならエラー表示 --- #
sub kakunin{
&head;
&checkFormData;
if($checkFlag eq "ok"){ &goTouroku; }
else{ &printError; }
&tail;
}

sub printMenu{
print <<"EOM";
<hr>
<div align="center" style="text-size:18px;color:#8888FF;">−　<a href=/">トップへ</a>　＋−＋　<a href=/about/join/">入会のご案内</a>　−</div>
EOM
}

# --- メールの詳細チェック --- #
sub checkMailAddress{
 local($str,$user,$dom);
 $str = $_[0];
 ($user, $dom) = split(/@/, $str);
 if($str =~ /[\x80-\xff]/){
  print "$str<blockquote>メールアドレスに全角文字を含んでいます</blockquote>";
  return "email2";
 }
 elsif($str !~ /^(.+)@(.+)$/){
  print "$str<blockquote>メールアドレスが不正です</blockquote>";
  return "email2";
 }
 elsif($user !~ /^[a-zA-Z0-9\._-]+$/ || length($user)<3
	|| $user =~ /^(.+)\.(.+)\.(.+)$/
	|| $user =~ /^\.(.+)/
	|| $user =~ /(.+)\.$/
	|| $user =~ /\.\./){
  print "$str<blockquote>メールアドレスが不正です</blockquote>";
  return "email2";
 }
 elsif($dom !~ /^[a-zA-Z0-9\.-]+$/ || length($dom)<4
	|| $dom !~ /(.+)\.(.+)$/
	|| $dom =~ /^\.(.+)/
	|| $dom =~ /(.+)\.$/
	|| $dom =~ /\.\./){
  print "$str<blockquote>メールアドレスが不正です</blockquote>";
  return "email2";
 }
 return "ok";
}

# --- 入力データのレベル２チェック --- #
sub checkFormData{
 $checkFlag = "ok";
 foreach $key (keys %sys){
  if($sys{$key} eq "" && $key ne "organization" && $key ne "job1" && $key ne "job2" && $key ne "interest" && $key ne "comment"){
   $checkFlag = "error";
   $errorList{$key} = $key;
  }
 }
 if($sys{'country'} eq "国名"){ $checkFlag = "country"; }
 if($sys{'state'} eq "県名"){ $checkFlag = "state"; }
 if($sys{'email'} ne $sys{'emailcheck'}){ $checkFlag = "email"; }
 if($checkFlag eq "ok"){
  foreach $key (keys %sys){
   if($sys{$key} eq ""){ $sys{$key} = "なし"; }
  }
  open(IN, "$database");
  while(<IN>){
   chomp;
    ($id,$date,$myoji,$namae,$uji,$azana,$firstname,$secondname,$email,$sex,$old,$country,$state,$organization,$job,$job2,$interest,$mailservice,$comment) = split(/,/);
    if($sys{'email'} eq $email){ $checkFlag = "double"; }
  }
  close(IN);
 }
 $checkFlag = &checkMailAddress($sys{'email'});
}

# --- データ登録 --- #
# ---  一応重複メールアドレスのチェックを行う --- #
sub touroku{
$mailFlag = "yes";
&head;
open(IN, "$database");
while(<IN>){
 chomp;
  ($id,$date,$myoji,$namae,$uji,$azana,$firstname,$secondname,$email,$sex,$old,$country,$state,$organization,$job,$job2,$interest,$mailservice,$comment) = split(/,/);
 if($sys{'email'} eq $email){ $checkFlag = "double"; }
}
close(IN);
if($checkFlag eq "double"){ &printError; }
else{
$ENV{'TZ'} = "JST-9";
$logtime = time;
($lsec,$lmin,$lhour,$lmday,$lmon,$lyear,$lwday,$ldmy) = localtime($logtime);
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$lyear=$lyear+1900;$lmon=$lmon+1;
$ndate = sprintf("%04d.%02d.%02d.%s.%02d.%02d.%02d",
		$lyear,$lmon,$lmday,$week[$lwday],$lhour,$lmin,$lsec);
$nid = 0;
open(IN, "$database");
while(<IN>){
 chomp;
  ($id,$date,$myoji,$namae,$uji,$azana,$firstname,$secondname,$email,$sex,$old,$country,$state,$organization,$job,$job2,$interest,$mailservice,$comment) = split(/,/);
 if($nid < $id){ $nid = $id; }
}
close(IN);
#if($sys{'mailservice'} eq "yes"){ &mail_to; }
if($sys{'mailservice'} eq "yes"){ &mail_to2; }
if($mailFlag eq "yes"){
$nid = $nid + 1;
if($nid == 0){ $nid = 1; }
open(OUT, ">>$database");
print(OUT "$nid,$ndate,$sys{'myouji'},$sys{'namae'},$sys{'uji'},$sys{'azana'},$sys{'firstname'},$sys{'secondname'},$sys{'email'},$sys{'sex'},$sys{'old'},$sys{'country'},$sys{'state'},$sys{'organization'},$sys{'job'},$sys{'job2'},$sys{'interest'},$sys{'mailservice'},$sys{'comment'}\n");
close(OUT);
print <<"EOM";
<div align="center" style="text-size:20px;">登録が完了しました．</div>
<br><br>
EOM
}
}
&tail;
}

# --- 入力情報の確認のためのページを表示 --- #
sub goTouroku{
print <<"EOM";
<div style="font-size:24px;">登録情報の確認</div><br><br>
<div style="text-decoration:blink; color:#FF0000;">これは、入力内容の確認のページです．<br>正式な登録は、ページ下の「登録」ボタンを押して下さい．</div><br>
<hr>
本人の情報：
<blockquote>
<table border="0">
<tr><td>みょうじ</td><td>　なまえ</td><td>（よみがな）</td></tr>
<tr><td>$sys{'myouji'}</td><td>　$sys{'namae'}</td><td></td></tr>
<tr><td>　</td><td></td><td></td></tr>
<tr><td>氏</td><td>　名</td><td>（漢字）</td></tr>
<tr><td>$sys{'uji'}</td><td>　$sys{'azana'}</td><td></td></tr>
<tr><td>　</td><td></td><td></td></tr>
<tr><td>First Name</td><td>　Family Name</td><td>（英語名）</td></tr>
<tr><td>$sys{'firstname'}</td><td>　$sys{'secondname'}</td><td></td></tr>
</table>
<br>
<table border="0">
<tr><td>性別：　</td><td>$sys{'sex'}</td><td>　　　年令：　</td><td>$sys{'old'}</td></tr>
</table>
</blockquote>
<hr>
メールアドレス：
<blockquote>
<table border="0">
<tr><td>$sys{'email'}</td></tr>
</table>
</blockquote>
<hr>
出身地もしくは現在お住まいの住所：
<blockquote>
<table border="0">
<tr><td>国名：　</td><td>$sys{'country'}</td></tr>
<tr><td>県名：　</td><td>$sys{'state'}</td></tr>
</table>
</blockquote>
<hr>
勤務，所属先機関：
<blockquote>
<table border="0">
<tr><td>勤務，所属機関名：　<td>$sys{'organization'}</td></tr>
<tr><td>職業：　</td><td>$sys{'job'}</td></tr>
<tr><td>業種：　</td><td>$sys{'job2'}</td></tr>
</table>
</blockquote>
<hr>
興味あるゲームの種類，分野，作品名，監督名など：
<blockquote>
<table border="0">
<tr><td>$sys{'interest'}</td></tr>
</table>
</blockquote>
<hr>
Web会員としてのメール情報サービスに登録しますか？：
<blockquote>
<table border="0">
<tr><td>
EOM
if($sys{'mailservice'} eq "yes"){ print "はい"; }
else { print "いいえ"; }
print <<"EOM";
</td></tr>
</table>
</blockquote>
<hr>
コメント（ゲーム学会に望む事等）：
<blockquote>
<table border="0">
<tr><td>
EOM
if($sys{'comment'} eq ""){ print "なし"; }
else{ print "$sys{'comment'}"; }
print <<"EOM";
</td></tr>
</table>
</blockquote>
<hr>
<br>
以上の情報に間違いが無いことを確認してから，下の「登録」ボタンを押して下さい．<br><br>
Webメール情報サービスを希望された方には，<br>
上記メール宛にWebメールが届きます．<br><br>
<form method="post" action="$action">
EOM
foreach $key (keys %sys){
 if($key ne "mode"){
  print "<input name=\"$key\" value=\"$sys{$key}\" type=\"hidden\">\n";
 }
}
print <<"EOM";
<blockquote>
<input name="mode" value="touroku" type="hidden">
<input type="submit" value=" 登録">
</form>
</blockquote>
EOM
}

# --- ヘッダー表示 --- #
sub head{
print "Content-type:text/html\n\n";
print <<"EOM";
<html>
<head>
<title>game web cgi</title>
<body bgcolor="#FFFFFF">
EOM
}

# --- 入力フォームの表示 --- #
sub printInputForm{
&head;
print <<"EOM";
<div style="font-size:24px;">ゲーム学会Web会員　登録フォーム</div>
<br>
<div style="font-size:18px;color:#FF0000;">赤色の項目は必ず入力してください．</div>
<br>
<hr>
<div style="color:#FF0000">本人の情報：</div>
<blockquote>
<form method="post" action="$action">
<table border="0">
<tr><td>みょうじ</td><td>なまえ</td><td>（よみがな）</td></tr>
<tr><td><input name="myouji" type="text"></td><td><input name="namae" type="text"></td><td></td></tr>
<tr><td>氏</td><td>名</td><td>（漢字）</td></tr>
<tr><td><input name="uji" type="text"></td><td><input name="azana" type="text"></td><td></td></tr>
<tr><td>First Name</td><td>Family Name</td><td>（英語名）</td></tr>
<tr><td><input name="firstname" type="text"></td><td><input name="secondname" type="text"></td><td></td></tr>
</table>
<br>
<table border="0">
<tr><td>性別：　</td><td><select name="sex"><option value="男性">男性<option value="女性">女性</select></td><td>　　　年令：　</td><td><input name="old" type="text" size="4">歳</td></tr>
</table>
</blockquote>
<hr>
<div style="color:#FF0000;">メールアドレス：</div>
<blockquote>
<table border="0">
<tr><td>メールアドレス　</td><td><input name="email" type="text"></td></tr>
<tr><td>メールアドレス（確認用）　</td><td><input name="emailcheck" type="text"></td></tr>
</table>
</blockquote>
<hr>
<div style="color:#FF0000;">出身地もしくは現在お住まいの住所：</div>
<blockquote>
<table border="0">
<tr><td>国名</td><td><select name="country"><option value="国名">国名
EOM
open(IN, "country.txt");
while(<IN>){
 chomp;
 print "<option value=\"$_\">$_";
}
close(IN);
print <<"EOM";
</select></td></tr>
<tr><td>県名</td><td><select name="state"><option value="県名">県名
EOM
open(IN, "state.txt");
while(<IN>){
 chomp;
 print "<option value=\"$_\">$_";
}
close(IN);
print <<"EOM";
</select></td></tr>
</table>
</blockquote>
<hr>
勤務，所属先機関情報：
<blockquote>
<table border="0">
<tr><td>勤務，所属先機関名：　</td><td><input name="organization" type="text"></td></tr>
</table>
<br>
<table border="0">
<tr><td>職業　</td><td><select name="job">
<option value="職業">職業
EOM
open(IN, "job1.txt");
while(<IN>){
 chomp;
 ($name, $value) = split(/,/);
 if($new_job eq $value){ print "<option value=\"$value\" selected>$value"; }
 else{ print "<option value=\"$value\">$value"; }
}
close(IN);
print <<"EOM";
</select></td></tr>
<tr><td>業種　</td><td><select name="job2">
<option value="業種">業種
EOM
open(IN, "job2.txt");
while(<IN>){
 chomp;
 ($name, $value) = split(/,/);
 if($new_job2 eq $value){ print "<option value=\"$value\" selected>$value"; }
 else{ print "<option value=\"$value\">$value"; }
}
close(IN);
print <<"EOM";
</select></td></tr>
</table>
</blockquote>
<hr>
興味あるゲームの種類，分野，作品名，監督名など：
<blockquote>
<table border="0">
<tr><td><textarea name="interest" cols="60" rows="4"></textarea></td></tr>
</table>
</blockquote>
<hr>
<div style="color:#FF0000;">Web会員としてのメール情報サービスに登録しますか？</div>
<blockquote>
<table border="0">
<tr><td>はい<input name="mailservice" type="radio" value="yes" checked>　　　いいえ<input name="mailservice" type="radio" value="no"></td></tr>
</table>
</blockquote>
<hr>
コメント（ゲーム学会に望む事等）：
<blockquote>
<table border="0">
<tr><td>
<textarea cols="60" rows="4" name="comment"></textarea>
</td></tr>
</table>
</blockquote>
<hr>
入力した情報を確認後，「確認」ボタンを押して下さい．
<blockquote>
<input name="mode" value="kakunin" type="hidden">
<input type="submit" value="確認">
</form>
</blockquote>
EOM
}

# --- フッター表示 --- #
sub tail{
print <<"EOM";
</body>
</html>
EOM
}

# --- モード選択 --- #
sub selectMode{
if($sys{'mode'} eq "printInputForm"){ &printInputForm; }
elsif($sys{'mode'} eq "kakunin"){ &kakunin; }
elsif($sys{'mode'} eq "touroku"){ &touroku; }
else { &head; &printError; &tail; }
}

# --- 入力データ取得，レベル１チェック --- #
sub getFormData{
if($ENV{'REQUEST_METHOD'} eq "POST"){
 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
 $post_flag = 1;
}
else{
 $buffer = $ENV{'QUERY_STRING'};
}
@parame = split(/&/, $buffer);
foreach(@parame){
 ($name, $value) = split(/=/);
 $value =~ tr/+/ /;
 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 if ($tagkey) { $value =~ s/<>/&lt;&gt;/g; }
 else {
  $value =~ s/\&/&amp;/g;
  $value =~ s/</&lt;/g;
  $value =~ s/>/&gt;/g;
 }
 $value =~ s/\r\n/<br>/g;
 $value =~ s/\r/<br>/g;
 $value =~ s/\n/<br>/g;
 $value =~ s/,/，/g;
 &jcode'convert(*value, "euc");
 $sys{$name} = $value;
}
}

# --- 二重登録のエラーメッセージ --- #
sub printErrorOfDouble{
print <<"EOM";
記入されたメールアドレス<br>
<blockquote>
$sys{'email'}
</blockquote>
は既に登録されています．<br>
以前に登録の覚えが無い場合や，登録が上手くいかない場合はメールにてご質問ください．<br>
EOM
}

# --- 登録時のエラーメッセージ --- #
sub printError{
 if($sys{'mode'} eq ""){ print "不正なアクセスです<br>"; }
 else{
  if($checkFlag eq "email"){ print "メールアドレスが一致しません．<br>"; }
  elsif($checkFlag eq "country"){ print "国名を選択して下さい．<br>"; }
  elsif($checkFlag eq "state"){ print "県名を選択して下さい．<br>"; }
  elsif($checkFlag eq "double"){ &printErrorOfDouble; }
  elsif($checkFlag eq "email2"){  }
  else{
   print "以下の項目が未記入です<br><br>\n";
   open(IN, "./InputElements.txt");
   while(<IN>){
    chomp;
    ($value, $name) = split(/,/);
    $InputElements{$name} = $value;
    foreach $key (keys %errorList){
     if($name eq $key){ print "$InputElements{$key}<br>\n"; }
    }
   }
   close(IN);
  }
  print "<br>ブラウザの「戻る」ボタンで戻って記入してください<br>";
 }
}

# --- メール送信 --- #
sub mail_to2 {
	local($MailSub,$MailBody,$email);

	$sendmail = '/usr/lib/sendmail';
	$mailFlag = "yes";

    # メールアドレスを定義
    $mailto = 'front@ml.gameamusementsociety.org';
    $in{'email'} = "$sys{'email'}";
	$mailfrom = 'entry001@gameamusementsociety.org';

	# メールタイトルを定義
	#$MailSub = "ゲーム学会入会の確認";
	#$MailSub = "subscribe $in{'email'}";
	$MailSub = "ゲーム学会入会の確認 $in{'email'}";
	$MailBody = "登録システムに下記アドレスのWeb会員が登録されました．\n$in{'email'}";

	# 記事の改行を復元
#$com = <<"EOM";
#subscribe $in{'email'}
#EOM

#	$com =~ s/<br>/\n/g;

	# メール本文を定義
#$MailBody = <<"EOM";
#$com
#EOM

	# JISコード変換
    &jcode'convert(*MailSub,'jis');
    &jcode'convert(*MailBody,'jis');

	# メールアドレスがない場合
	if ($in{'email'} eq "") { $email = $mailto; }
	else { $email = $in{'email'}; }

	open(MAIL,"| $sendmail -t") || &mail_error;
	print MAIL "To: $mailto\n";
	print MAIL "From: $mailfrom\n";
	print MAIL "Subject: $MailSub\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "X-Mailer: $ver\n\n";
	print MAIL "$MailBody\n";
	close(MAIL);
}

# --- メール送信 --- #
sub mail_to {
	local($MailSub,$MailBody,$email);

$sendmail = '/usr/lib/sendmail';
$mailFlag = "yes";

    # メールアドレスを定義
    $mailto = "$sys{'email'}";
    $in{'email'} = 'game-mag-ctl@dmic.org';

	# メールタイトルを定義
	#$MailSub = "ゲーム学会入会の確認";
    $MailSub = "ゲーム学会、情報配信サービス（ game-mag）のご案内について";

	# 記事の改行を復元
$com = <<"EOM";
subscribe $in{'email'}


--- ゲーム学会、情報配信サービス（game-mag）のご案内 ---

ゲーム学会Web会員にご登録いただきありがとうございます．

このメールは，
　　ゲーム学会情報配信サービス「game-mag」への
　　　　　　　　　　　　　　　　　　登録確認のメールです．

　現時点で、メールサービスに登録を希望されます場合、
下記の手順に添って、メールの送付をお願い致します。
（もし、メールサービスへの登録を希望されない場合は、
　　　　　　　このまま、このメールを破棄して下さい）


Step_1),　メールサービスへの登録メールの送信

　ゲーム学会情報配信サービスを希望されるます方は，
　このメールの最上部にあります、

　　subscribe お客様のメールアドレス

　　　　　を本文とするメールを

　　下記メールアドレスに送付下さい。
　　　　　	$in{'email'}

その後のStep)
　　ウェルカムメールが、登録メールアドレスに到着致します。
　　このメールが到着致しますと、情報サービスへの登録は完了です。

-------------------------------------------------

ゲーム学会(GAS:Game Amusement Society )ホームページ：
	http://www.GameAmusementSociety.org/
EOM
$com =~ s/<br>/\n/g;

	# メール本文を定義
$MailBody = <<"EOM";
$com
EOM

	# JISコード変換
    &jcode'convert(*MailSub,'jis');
    &jcode'convert(*MailBody,'jis');

	# メールアドレスがない場合
	if ($in{'email'} eq "") { $email = $mailto; }
	else { $email = $in{'email'}; }

	open(MAIL,"| $sendmail -t") || &mail_error;
	print MAIL "To: $mailto\n";
	print MAIL "From: $email\n";
	print MAIL "Subject: $MailSub\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "X-Mailer: $ver\n\n";
	print MAIL "$MailBody\n";
	close(MAIL);
}

# --- メールエラー --- #
sub mail_error{
$mailFlag = "no";
print <<"EOM";
メール送信に失敗しました．<br><br>
入力されたメールアドレス：
<blockquote>
$sys{'email'}
</blockquote>
ブラウザの「戻る」ボタンで入力ページ（２つ前のページ）に戻っていただき，<br>
メールアドレスを入力し直して下さい．<br>
EOM
}

# --- デバッグ用 --- #
sub debug{
foreach $key (keys %sys){ print "$key = $sys{$key}<br>"; }
}

exit;
