#!/usr/local/bin/perl
# examine_book.cgi --- 棋譜の検討用CGI(一種のゲストブック)
#
# KIFファイルがシフトJISになっているので、プログラムを簡単にするため、
# このファイルの 漢字コードはSHIFT_JISでなければならない。HTTPのヘッダ
# にそう指定している。
#
# $Id$

require 5.004;
require 'jcode.pl';
use CGI qw(:standard);

$query = new CGI;

$kifuId = shift or error2html('引数がありません');

$max_remark_num = 300;
$counter = 0;

if (-f "$kifuId.ki2") {
  $kiffile = "$kifuId.ki2";
} elsif (-f "$kifuId.kif") {
  $kiffile = "$kifuId.kif";
} else {
  error2html("KIFファイル \"$kifuId.ki\[f\|2\]\" が見つかりません。");
}
$htmlfile = "$kifuId.html";
$selfcomment = "$kifuId.selfcomment";
$remarkfile = "$kifuId.remark";
$tempfile = "$kifuId.$$.temp";

open KIFFILE, $kiffile
  or error2html("KIFファイル \"$kiffile\" が見つかりません。");

print $query->header(-type=>'text/html;charset=SHIFT_JIS');
print $query->start_html(-title=>'Examination Book for My Shogi Kifu',
			 -author=>'minnie@fluidlab.naoe.t.u-tokyo.ac.jp',
			 -style=>{'type'=>'text/css',
				  'src'=>'/~minnie/style/default.css'}),
  h1(img{src=>'../Gyoku.gif', alt=>'[Shogi]'},
     "棋譜検討・ご意見をお寄せ下さい ($kifuId)"),
  p,
  "棋譜の参照と検討のためのページです。",
  "CGIによる掲示板システムになっています。\n";

# HTMLファイルがある時は、それへのリンクを生成する。
if (-f $htmlfile) {
  print ul(
	   li('以下の棋譜は',
	      a({href=>'http://www02.so-net.or.jp/~kakinoki/'},
		 '柿木 義一氏'),
	      'による',
	      strong('将棋棋譜管理シリーズ'),
	      "を用いて再生することができます。\n",
	      "以下の棋譜をコピーして、棋譜管理シリーズの\"編集\"→\"棋譜、盤面の貼\り付け\"とすれば読み込まれます。\n"),
	   li(a({href=>$htmlfile, target=>'_TOP'},
		'棋譜2HTMLによる、対局の再現'),
	      br,
	      "JavaScript 1.1以降に対応したブラウザ(Netscape Navigator 3以降またはMS Internet Explorer 4以降など)が必要です。別のウィンドウが開きます\n"),
	   li(a({href=>'http://member.nifty.ne.jp/kozuma/'},
		'上妻 孝氏(棋譜2HTMLの作者)のページ'))
	  );
}

# KIFファイル埋め込み
print "\n\n<pre>\n";
while (<KIFFILE>) {
  print;
}
close KIFFILE;
print "</pre>\n";

# 自分自身による検討
if (-f $selfcomment) {
  print hr, p, h2("\n自己検討\n");

  open SELFCOMMENT, $selfcomment or die "$0: cannot open $selfcomment: $!\n";
  while (<SELFCOMMENT>) {
    &jcode'convert(\$_, 'sjis');
    print;
  }
  close SELFCOMMENT;
}

# 意見投稿用フォーム
print hr,
  h2("\nあなたのご意見ご意見をお寄せ下さい。\n"),
  start_form,
  p,
  "常識の範囲内で、いろいろ書き込んでやって下さい。どうぞよろしく。\n", br,
  'お名前:', textfield(-name=>'name', -size=>40), br,
  'E-mailアドレス:', textfield(-name=>'addr', -size=>60), br,
  'URL:', textfield(-name=>'url', -size=>60, -default=>'http://'), br,
  '内 容', br,
  textarea(-name=>'remark', -rows=>10, -columns=>70), br,
  submit, reset,
  ul(
     li('お名前と内容は必須です。'),
     li("ご投稿いただいた記事は、最大${max_remark_num}件まで保存されます。それを超えると、古い記事から順に削除されます。\n"),
     li('HTMLタグは使えません。')
    ),
  end_form, "\n\n";

# 意見が投稿された場合は、それを処理する。
# ここがもっともエラーの起こりやすい場所。気をつけよう。
# 重要!: 排他処理は行っていない。
$/ = "";			# 空行を区切りにする
if (param()) {
  ($name, $addr, $url, $remark)
    = (param('name'), param('addr'), param('url'), param('remark'));
  unless ($name eq '' or $remark eq '') {
    if (-f $remarkfile) {
      rename $remarkfile, $tempfile or die
	"$0: cannot rename $remarkfile to $tempfile: $!\n";
      open TEMP, $tempfile or die "$0: cannot open $tempfile: $!\n";
      $readtemp = 1;
      $_ = <TEMP>;		# $_は最初のレコード
      if (/^\[(\d+)\]/) {
	$counter = $1 + 1;
      }
    }
    open REMARK, ">$remarkfile" or die
      "$0: cannot create $remarkfile: $!\n";
    &jcode'convert(\$name, 'sjis');
    &jcode'convert(\$remark, 'sjis');
    $remark =~ s/\n/<br>/g;
    # 投稿内容の書き込み
    print REMARK "[$counter]\&nbsp;\n";
    if ($addr eq '') {
      print REMARK $name;
    } else {
      print REMARK a({href=>"mailto:$addr"}, $name);
    }
    print REMARK "\n";
    if ($url ne 'http://') {
      print REMARK a({href=>$url},
		     img{src=>'/icons/images/house.gif', alt=>'[URL]'});
    }
    print REMARK p, "\n$remark\n\n\n"; # 空行が区切りとなる
    if (defined $readtemp) {
      print REMARK;		# さっきの$_を書き込む。
      while (<TEMP>) {
	print REMARK;
      }
      close TEMP;
      unlink $tempfile or die "$0: cannot remove $tempfile: $!\n";
    }
    close REMARK;
  }
}

# 過去に投稿された意見を表示する。
# ちょっと無駄だけど、もう一度ファイルを開き直す。
if (-f $remarkfile) {
  open REMARK, $remarkfile or die "$0: cannot open $remarkfile: $!\n";
  while (<REMARK>) {
    print hr, "\n";
    print;
  }
  close REMARK;
} else {
  print hr, p,
  "現在のところ、この将棋に関するご感想、ご意見は投稿されていません。\n";
}

# ページの最後
print hr, p,
  a({href=>'/~minnie/Shogi/'},'戻る'),
  end_html;
exit 0;

#
sub error2html {
  my $errormes = shift;

  print $query->header(-type=>'text/html;charset=SHIFT_JIS');
  print $query->start_html(-title=>'Error of CGI',
			   -style=>{'type'=>'text/css',
				    'src'=>'/~minnie/style/default.css'}),
  h1("棋譜検討用CGIのエラー"),
  p,
  "もうしわけございません、エラーが発生しました。\n",
  p, "発生したエラー: $errormes\n\n",
  p,
  a({href=>'/~minnie/Shogi/'},'戻る'),
  end_html;
  die "$0: error: $errormes";
}
# eof
