#!/usr/bin/perl5 -I /usr/home/kmc/public_html/proj/tuitate/board
#
# むっちゃてきとーな掲示板システム 98/4/16 by hgw
# 

require 'jcode.pl';

# データの受け取り
if ($ENV{'REQUEST_METHOD'} eq "POST") {
    read(STDIN, $str, $ENV{'CONTENT_LENGTH'});
} else {
    $str = $ENV{'QUERY_STRING'};
}

# 変数のデコード
@part = split('&', $str);
foreach $i (@part) {
    $args++;
    ($variable, $value) = split('=', $i);
    $value =~ tr/+/ /;
    $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
    &jcode'convert(*value, 'euc');
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/\015\012/\012/g;
    $value =~ s/\015/\012/g;
    $cgi{$variable} = $value;
}

$mode = $cgi{"mode"};

$start = $cgi{"start"};
$title = $cgi{"title"};
$name = $cgi{"name"};
$email = $cgi{"email"};
if($cgi{"wwwpage"} ne "") {
    $wwwpage = $cgi{"wwwpage"};
} else {
    $wwwpage = "http://";
}
$text = $cgi{"text"};

# 初期化
$nkf = "/usr/local/bin/nkf -j";
$www_home = (getpwnam("kmc"))[7]."/public_html";

# for Debug
#$start = 1;

# 他の掲示板を作りたい方はここからを変更して下さい
# (余裕があったら header や footer を変えてみるといいです)

$data_file = $www_home."/proj/tuitate/board/local.boarddata";
                                                         # 内容を保存する場所
$boardtitle = "ついたて将棋掲示板";                      # 掲示板の名前
$comment = "ついたて将棋に関して御意見や御感想などを記入してもらえると嬉しいです。";
$bgcolor = "#ffcc99";                # 背景色
$textcolor = "#000000";              # 文字の色 
$linkcolor = "#0000ff";              # リンクの色
$numbercolor = "#ffffff";            # 番号の色
$titlecolor = "#ffff00";             # 題名の色
$titlebgcolor = "#000066";           # 題名の背景色
$namecolor = "#ff0000";              # 名前の色
$endterm = "</html>";                # データ終了文字列
$viewnum = "20";                     # 一度に表示する数
$elemnum = "7";                      # 要素全体の数

# 出力開始
open(BROWSE, "| $nkf");
select(BROWSE);
print "Content-type: text/html\n\n";

# 何も引数が無い場合はとりあえず表示する
$mode = "view" if($mode eq "");

# 掲示板の内容を表示
if($mode eq "view")
{
    &searchnum;
    &header(0);
    &boardview($start,$viewnum);
    &footer;
}
# 掲示板に書き込むフォームを出力
if($mode eq "form")
{
    &header(0);
    &printform;
    &footer;
}
# 掲示板に書き込むフォームを出力
if($mode eq "input")
{
    &searchnum;    
    &checkform;
}
exit(1);

# 先頭の部分を表示
sub header {
    my($param) = @_;
    print <<EOF;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>$boardtitle</title>
EOF
    print("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"5;URL=board.cgi\">") if($param == 1);
    print <<EOF;
</head>
<body bgcolor="$bgcolor" text="$textcolor" link="$linkcolor" vlink="$linkcolor">
<hr>
<center>    
<h1>
$boardtitle
</h1>
$comment
</center>
<hr>
EOF
}

# 掲示板の中身を表示
sub boardview {
    my($start, $num) = @_;
    my($tmpnum);
    print <<EOF;
<table cellspacing="10"><tr><td>
<form action="board.cgi" method="POST">
<input type="hidden" name="mode" value="form">
<input type="submit" value="新しく投稿する">
</form></td>
EOF
    $tmpnum = $start + $viewnum;
    print <<EOF if($allnum >= $start + 20);
<td><form action="board.cgi" method="POST">
<input type="hidden" name="start" value="$tmpnum">
<input type="submit" value="次の $viewnum 記事">
</form></td>
EOF
    $tmpnum = $start - $viewnum;
    print <<EOF if($start >= $viewnum);
<td><form action="board.cgi" method="POST">
<input type="hidden" name="start" value="$tmpnum">
<input type="submit" value="前の $viewnum 記事">
</form></td>
EOF
    print("</tr></table><hr>");
    &skipdata($allnum - $start - $num);
    &getdata($num,$allnum - $start - $num);
    &viewdata($num);
}

# 必要のある場所まで飛ばす
sub skipdata {
    my($skip) = @_;
    my $count;
    unless(open(DATA, $data_file)) {
	print "<b>ERROR : データファイルが開けません !!</b>";
	return;
    }
    return if($skip <= 0);
    $count = 0;
    while(<DATA>) {
	chomp;
	$count++ if($_ eq "</html>");
	return if($count == $skip);
    }
}

# データを取り出す
sub getdata {
    my($num,$startnum) = @_;
    my $count, $element;
    $count = 0;    
    $count -= $startnum if($startnum < 0);
    while(<DATA>) {
	chomp;
	if($_ eq $endterm) {
	    $element = 0;
	    $count++;
	    $data[$elemnum * $count + $elemnum - 1] = "";
	    return if($count == $num);
	    next;
	}
	if($element != $elemnum - 1) {
	    $data[$elemnum * $count + $element] = $_;
	    $element++;
	} else {
	    $data[$elemnum * $count + $element] .= ($_."<br>\n");
	}
    }
    close(DATA);
}	

# データを表示する
sub viewdata {
    my($num) = @_;
    my $count;
    $count = 0;
    for($count = $num - 1; $count >= 0; $count--) {
	&printdata(@data[($count * $elemnum) .. ($count + 1) * $elemnum - 1]);
    }
}	

sub printdata {
    my($number, $title, $name, $email, $wwwpage, $date, $text) = @_;
    return if($text eq "");
    print <<EOF;
<table width="100%" cellpadding="5" bgcolor="$titlebgcolor">
<tr><td><font color="$numbercolor" size="-1"><b>$number</b>:</font>
<font color="$titlecolor" size="+1"><b>
$title
</b></font>
</td></tr>
</table>
<p><font color="$namecolor"><b>
$name
</b></font>
EOF
    printf("(<a href=\"mailto:$email\">\n$email\n</a>)\n") if($email ne "");
    printf(":<a href=\"$wwwpage\">\n$wwwpage\n</a>\n") if($wwwpage ne "");
    printf("<div align=\"right\">$date</div>\n");
    printf("</p>\n<blockquote><nobr>\n%s</nobr></blockquote>\n<hr>\n",$text);
}

# フォームを出力する
sub printform {
    print <<EOF;
<form action="board.cgi" method="POST">
<input type="hidden" name="mode" value="input">
題名 : <input type="text" name="title" value="$title" size="30" maxlength="50"><br>
お名前 : <input type="text" name="name" value="$name" size="30" maxlength="50"><br>
E-mail : <input type="text" name="email" value="$email" size="40" maxlength="100"><br>
WWW Page : <input type="text" name="wwwpage" value="$wwwpage" size="40" maxlength="100"><br>
御意見、御感想はこちらへ↓<br>
<textarea cols="50" rows="10" name="text">$text</textarea><br>
<input type="submit" value="投 稿">
<input type="reset" value="取 消">
</form>

<hr>

<a href="board.cgi">掲示板の内容を再び見る</a><br>
EOF
}


sub footer {
    print <<EOF;
<a href="../">ついたて将棋 WWW Site に戻る</a>
</body>    
</html>
EOF
}

sub searchnum {
    unless(open(DATA, $data_file)) {
	$allnum = 0;
	return;
    }
    while(<DATA>) {
	chomp;
	$allnum++ if($_ eq "</html>");
    }
    close(DATA);
}

sub checkform {
    if($text eq "") {
	&header(0);
	printf("<font color=\"#ff0000\"><b>意見は必ず記入して下さい</b></font>");
        &printform;
    } else {
	&writedata($number ,$title, $name, $email, $wwwpage, $text);
	&header(1);
	$text =~ s/\012/<br>\012/g;
        print <<EOF;
<font color="#0000ff"><b>ありがとうございます。以下の内容で登録されました。</b></font><hr>
EOF
        &printdata($number ,$title, $name, $email, $wwwpage, $date, $text);
	print <<EOF;
<form action="board.cgi" method="POST">
<input type="submit" value="掲示板の内容に戻る">
</form>
EOF
	    
    }
}

sub writedata {
    unless(symlink($data_file,$data_file."\.lock")) {
	&header(0);
	printf("掲示板の書き込みに失敗しました。");
	return;
    }
    $title="(no title)" if($title eq "");
    $name="(no name)" if($name eq "");
    $number = sprintf("%05d",$allnum+1);
    $wwwpage = "" if($wwwpage eq "http://");
    @datelocal = localtime;
    $date = $datelocal[5]."年".($datelocal[4]+1)."月".$datelocal[3]."日 ".$datelocal[2]."時".$datelocal[1]."分";
    open(DATA,">> $data_file");
    printf DATA "%s\n%s\n%s\n%s\n%s\n%s\n%s\n</html>\n",
           $number,$title,$name,$email,$wwwpage,$date,$text;
    close(DATA);
    chmod(0666,"$data_file");
    unlink($data_file."\.lock");
}
