#!/usr/local/bin/perl
require './jcode.pl';
$homepage = 'http://www.mis.ne.jp/~masami-t/index.html';
$datafile = 'borddata.txt';
$bg_gif = 'http://www.mis.ne.jp/~masami-t/BACK.gif';
$password = 'kumanomori';
$title = 'くまの集い';
$titlevew = 'yes';
$title_gif = '';
$top_gif = '';
$bg_color = '#FFFFBD';
$text_color = '#000000';
$link_color = '#0000FF';
$vlink_color = '#0000FF';
$form_bg_color = 'しない';
$tb_bg_color = '#FFFFDD';
$font_size = 3;
$max = 300;
$pagevew = 10;
$CookieName = 'custombbs';
$hostvew = '';
$agentvew = '';
$user_name = '名前';
$user_email = 'メール';
$email_check = '';
$user_hpaddr = 'ＵＲＬ';
$user_subject = '題名';
$window = 'center';
$form_border = '1';
$table_border = '3';
$table_line = 'yes';
$tb_line_bg_color = 'なし';
$sub_color = '#FF0000';
$table_width = 80;
$mailto = '';
$rev = 'no';
$tag_flag = 'no';
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$year = sprintf("%02d",$year + 1900);
	$month = sprintf("%02d",$mon + 1);
	$mday = sprintf("%02d",$mday);
	$hour = sprintf("%02d",$hour);
	$min = sprintf("%02d",$min);
	$youbi = ('日','月','火','水','木','金','土') [$wday];
	$date_now = "$year年$month月$mday日($youbi) $hour時$min分";

$softagent = $ENV{'HTTP_USER_AGENT'};
$softagent =~ s/\,/\./g;
$hosei = 1;
if ($softagent =~ /Mozilla\/4/i && $softagent !~ /compatible/i) { $hosei = 0.8; }
$textwidth = 70;
if ($softagent =~ /MSIE\ 3/i) { $textwidth = $textwidth * 1.5; }
$hostaddr = &domain_name;
if ($hostchange eq 'yes' && $hostaddr eq '') { $hostaddr = 'on the Internet'; }
if ($ENV{'REQUEST_METHOD'} eq "POST") {
	read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'});
} else { $QUERY_DATA = $ENV{'QUERY_STRING'}; }
@pairs = split(/&/,$QUERY_DATA);
foreach $pair (@pairs) {
	($name, $value) = split(/=/, $pair);
	$value =~ tr/+/ /;
	$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
	$value =~ s/</&lt;/g;
	$value =~ s/>/&gt;/g;
	$value =~ s/\n//g;
	$value =~ s/\,/，/g;
	&jcode'convert(*value,'sjis');
	$QUERY{$name} = $value;
}
if ($window ne 'center') { $table_width = 100; }
if ($tb_bg_color eq 'なし') { $tb_bg_color = ''; }
else { $tb_bg_color = "bgcolor=$tb_bg_color"; }
if ($tb_line_bg_color eq 'なし') { $tb_line_bg_color = $tb_bg_color; }
else { $tb_line_bg_color = "bgcolor=$tb_line_bg_color"; }

&cookie_read;

if (!open(NOTE,"$datafile")) { &error(bad_file); }
@DATA = <NOTE>;
close(NOTE);
if ($QUERY{'password'} eq $password) { &deletemode; }
elsif ($QUERY{'action'} eq 'comment') { &com_html; }
elsif ($QUERY{'action'} eq 'delete') { &delete; }
elsif ($QUERY{'action'} eq 'regist') { &regist; }
&html;
exit;
sub html_head {
	print "Content-type: text/html\n\n";
	print "<html><head><title>" . $title . "</title></head>\n";
	print "<body bgcolor=$bg_color text=$text_color link=$link_color vlink=$vlink_color background=$bg_gif>\n";
}
sub comment_form {
	if ($window eq 'center') { print "<div align=center><center>\n"; }
		if ($top_gif ne '') { print "<img src=$top_gif><br>\n"; }
		print "<form name=inputform action=custombbs.cgi method=POST>\n";
		print "<input type=hidden name=action value=regist>\n";
		print "<input type=hidden name=res value=$QUERY{'res'}>\n";
		if ($form_bg_color eq 'しない') { $form_bg_color = ''; }
		else { $form_bg_color = "bgcolor=$form_bg_color"; }
		print "<table border=$form_border><tr><td $form_bg_color align=center>\n";
		if ($titlevew eq 'yes') { print "<font size=5 color=$link_color>$title</font><br>\n"; }
		if ($title_gif ne '') { print "<a href=$homepage><img src=$title_gif border=0></a>\n"; }
		print "</td><td $form_bg_color>\n";
			print "<table border=0>\n";
				print "<tr><td align=right>$user_name:</td><td><input type=text size=",35 * $hosei," name=name value=$COOKIE{'name'}></td></tr>\n";
				print "<tr><td align=right>$user_email:</td><td><input type=text size=",35 * $hosei," name=email value=$COOKIE{'email'}></td></tr>";
				if ($user_hpaddr ne '') { print "<tr><td align=right>$user_hpaddr:</td><td><input type=text size=",48 * $hosei," name=HP value=$COOKIE{'HP'}></td></tr>\n"; }
				if ($user_subject ne '') { print "<tr><td align=right>$user_subject:</td><td><input type=text size=",48 * $hosei," name=subject></td></tr>\n"; }
			print "</table>\n";
			print "</tr></table>\n";
		print "</td></tr></table>\n";
		print "<textarea name=comment rows=5 cols=$textwidth></textarea><br>";
		print "<input type=submit value=書き込み／更新>\n";
	print "</form>\n";
	if ($window eq 'center') { print "</center></div>\n"; }
}
sub html {
	foreach $line (@DATA) {
		($date,$code,$re,$name,$email,$HPtitle,$HP,$subject,$comment,$host,$agent) = split(/\,/,$line);
		if ($re < 1) { push(@MATCH,$line); }
	}
	$match = @MATCH;
	&html_head;
	if ($window eq 'center') { print "<div align=center><center>\n"; }
	&comment_form;
	&listvew;
	print "<form method=POST action=custombbs.cgi>\n";
		print "<input type=hidden name=action value=delmode>\n";
		print "<input type=password size=20 name=password>\n";
		print " <input type=submit value=管理者メンテナンス>\n";
	print "</form>\n";
	if ($window eq 'center') { print "</center></div>\n"; }
	print "<p align=right><font size=2><a href=http://www.mis.ne.jp/~masami-t/>Home</a></font></p>\n";
	print "</body></html>\n";
	exit;
}
sub com_html {
	foreach $line (@DATA) {
		($date,$code,$re,$name,$email,$HP,$subject,$comment) = split(/\,/,$line);
		if ($code == $QUERY{'res'}) { push(@MATCH,$line); last; }
	}
	&html_head;
	&comment_form;
	print "<div align=center><center>\n";
	print "<p><font size=5><b>この記事への返信です。</b></p>\n";
	&listvew;
	print "</center></div>\n";
	print "</body></html>\n";
	exit;
}
sub cookie_regist {
	$ENV{'TZ'} = "GMT"; 
	($c_sec,$c_min,$c_hour,$c_mday,$c_mon,$c_year,$c_wday,$c_yday,$c_isdst) = localtime(time + 30 * 86400);
	$c_year = sprintf("%02d",$c_year);
	$c_sec  = sprintf("%02d",$c_sec);
	$c_min  = sprintf("%02d",$c_min);
	$c_hour = sprintf("%02d",$c_hour);
	$c_mday = sprintf("%02d",$c_mday);
	$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$c_wday];
	$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$c_mon];
	$date_gmt = "$youbi, $c_mday\-$month\-$c_year $c_hour:$c_min:$c_sec GMT";
	$cook = "name\!$QUERY{'name'}\,email\!$QUERY{'email'}\,HP\!$QUERY{'HP'}";
	print "Set-Cookie: $CookieName=$cook; expires=$date_gmt\n";
	$COOKIE{'name'} = $QUERY{'name'}; $COOKIE{'email'} = $QUERY{'email'}; $COOKIE{'HP'} = $QUERY{'HP'};
}
sub cookie_read {
	$cookies = $ENV{'HTTP_COOKIE'};
	@pairs = split(/;/,$cookies);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/,$DUMMY{$CookieName});
	foreach $pair (@pairs) {
		($name, $value) = split(/\!/, $pair);
		$COOKIE{$name} = $value;
	}
}
sub listvew {
	if ($rev eq 'yes') { @DATA = reverse(@DATA); }
	if ($QUERY{'pline'} eq '') { $pline = 0; } else { $pline = $QUERY{'pline'}; }
	$end_data = @MATCH - 1;
	$page_end = $pline + ($pagevew - 1);
	if ($page_end >= $end_data) { $page_end = $end_data; }
	if ($table_border == 0) { print "<hr width=$table_width%>\n"; }
	foreach ($pline .. $page_end) {
		($date,$code,$res,$name,$email,$HP,$subject,$comment,$host,$agent) = split(/\,/,$MATCH[$_]);
		$comment = &inline_link($comment);
		$comment =~ s/\r/<br>/g;
		print "<form method=POST action=custombbs.cgi>\n";
			print "<input type=hidden name=action value=comment>\n";
			print "<input type=hidden name=res value=$code>\n";
			print "<input type=hidden name=mailto value=$email>\n";
			print "<table border=$table_border cellspacing=2 width=$table_width%>\n";
			if ($table_line eq 'yes') { print "<tr><td $tb_line_bg_color>\n"; }
			else { print "<tr><td $tb_bg_color>\n"; }
			print "<font size=4 color=$sub_color><b>$subject</b>\n";
			if ($email ne '') { print " <a href=mailto:" . $email . ">" . $name . "</a>\n"; }
			else { print " $name\n"; }
			print "</font> さん\n";
			if ($HP ne '') { print " <a href=$HP target=_top>HomePage</a>"; }
			print "<font size=-1> $date";
			if ($hostvew eq 'yes' && $agentvew ne 'yes') { print " ($host)"; }
			print "</font>\n";
			if ($QUERY{'action'} ne 'comment') { print " <input type=submit value=返信>"; }
			if ($agentvew eq 'yes') {
				print "<br><font size=2>";
				if ($hostvew eq 'yes') { print " ($host)"; }
				print " $agent</font>";
			}
			if ($table_line eq 'yes') { print "</td></tr><td $tb_bg_color>\n"; }
			print "<blockquote>\n";
			print "<p><font size=$font_size>$comment</font></p>\n";
			$i = 1;
			foreach $line (@DATA) {
				($da,$co,$re,$na,$em,$H,$su,$com,$ho,$ag) = split(/\,/,$line);
				if ($rev eq 'no' && $co <= $code) { last; }
				if ($code eq $re) {
					$com =~ s/\r/<br>/g;
					if ($i == 1) {
						$ulflag = 1;
						print "<hr>";
						print "<ul>\n";
					} else { print "<hr>\n"; }
					$com = &inline_link($com);
					print "<li>\n";
					#メールアドレスが記入されていればリンクをつける
					if ($em ne '') { print "<b><a href=mailto:" . $em . ">" . $na . "</a></b>\n"; }
					else { print "<b>" . $na . "</b>\n"; }
					print "</font> さん\n";
					if ($H ne '') { print " <a href=$H>HomePage</a>\n"; }
					print "<font size=2> 投稿日：$da";
					if ($hostvew eq 'yes' && $agentvew ne 'yes') { print " ($ho)"; }
					if ($agentvew eq 'yes') {
						print "<br>";
						if ($hostvew eq 'yes') { print " ($ho)"; }
						print " $ag";
					}
					print "</font><br>　<br>\n";
					print "<font size=$font_size>$com</font></li>\n";
					$i++;
				}
			}
			if ($ulflag == 1) { print "</ul>\n"; }
		print "</blockquote>\n";
		print "</td></tr></table></form><p>\n";
		if ($table_border == 0) { print "<hr width=$table_width%>\n"; }
	}
	$next_line = $page_end + 1;
	if ($page_end ne $end_data) {
		print "<form method=POST action=custombbs.cgi>\n";
			print "<input type=hidden name=action value=$QUERY{'action'}>\n";
			print "<input type=hidden name=key value=$QUERY{'key'}>\n";
			print "<input type=hidden name=pline value=" . $next_line . ">\n";
			print "<input type=submit value=次のページ>\n";
		print "</form>\n";
		print "<hr width=640>\n";
	}
}
sub regist {
	if ($QUERY{'comment'} ne '') {
		if ($QUERY{'name'} eq '') { &error(bad_name); }
		if ($email_check eq 'yes' && $QUERY{'email'} eq '') { &error(bad_email); }
		&cookie_regist;
		$match = 0;
		if ($tag_flag eq 'yes') { $match = 1;
		} elsif ($tag_flag eq 'member') {
			foreach $line (@TAG_MENBER) {
				if ($line eq $QUERY{'name'}) { $match = 1; last; }
			}
		}
		if ($match) { $QUERY{'comment'} = &tag_change($QUERY{'comment'}); }
		$count = @DATA;
		if ($count >= $max) { pop(@DATA); }
		if ($count < 1) {
			$new_code = 1;
		} else {
			($date,$code,$re,$name,$email,$HP,$subject,$comment,$host,$agent) = split(/\,/,$DATA[0]);
			$new_code = $code + 1;
		}
		$value = "$date_now\,$new_code\,$QUERY{'res'}\,$QUERY{'name'}\,$QUERY{'email'}\,$QUERY{'HP'}\,$QUERY{'subject'}\,$QUERY{'comment'}\,$hostaddr\,$softagent\n";
		unshift(@DATA,$value);
		if (!open(NOTE,">$datafile")) { &error(bad_file); }
		print NOTE @DATA;
		close(NOTE);
	}
	$QUERY{'res'} = '';
}
sub deletemode {
	$count = @DATA;
	if ($count < 1) { &html; }
	&html_head;
	print "<form action=custombbs.cgi method=POST>\n";
		print "<input type=hidden name=action value=delete>\n";
		print "削除コード：<input type=text size=39 name=delcode>\n";
		print " <input type=submit value=削除><br>\n";
		print "<font size=2>スペースで区切っていくつでも同時に削除することができます。</font>\n";
	print "</form>\n";
	print "<hr>\n";
	foreach $line (@DATA) {
		($date,$code,$re,$name,$email,$HP,$subject,$comment,$host,$agent) = split(/\,/,$line);
		print "<table border=0 width=100%>\n";
		print "<tr>\n";
			print "<td width=5% valign=top>[$code]</td>\n";
			print "<td valign=top>\n";
				print "<font color=$link_color size=+1><b>$subject</b></font>\n";
				print " 投稿者：\n";
				if ($email ne '') { print "<b><a href=mailto:" . $email . ">" . $name . "</a></b>\n"; }
				else { print "<b>" . $name . "</b>\n"; }
				print "<font size=-1>　投稿日：" . $date . "</font><br>\n";
				print "$comment\n";
			print "</td>\n";
		print "</tr></table>\n";
		print "<hr>\n";
	}
	print "<form action=custombbs.cgi method=POST>\n";
		print "<input type=hidden name=action value=delete>\n";
		print "削除コード：<input type=text size=39 name=delcode>\n";
		print "　<input type=submit value=削除><br>\n";
		print "<font size=2>スペースで区切っていくつでも同時に削除することができます。</font>\n";
	print "</form>\n";
	exit;
}
sub delete {
	$QUERY{'delcode'} =~ s/　/ /g;
	@CODE = split(/ /,$QUERY{'delcode'});
	$keycount = @CODE;
	#削除する番号が指定されていなければ戻る
	if ($keycount < 1) { &html; }
	foreach $line (@DATA) {
		($date,$code,$re,$name,$email,$HP,$subject,$comment,$host,$agent) = split(/\,/,$line);
		$match = 0;
		foreach $delcode (@CODE) {
			if ($delcode > 0) {
				if ($code == $delcode || $re == $delcode) { $match = 1; }
			}
		}
		if ($match == 0) { push (@DUMMY,$line); }
	}
	@DATA = @DUMMY;
	#データベースファイルを上書きする
	if (!open(DB,">$datafile")) { &error(bad_file); }
	print DB @DATA;
	close(DB);
}
sub domain_name {
	local($addr) = $ENV{'REMOTE_ADDR'};
	local($_) = gethostbyaddr(pack("C4",split(/\./,$addr)),2);
	if ($_ eq '') { $_ = $addr; }
	$_;
}
sub inline_link { 
	local($_) = $_[0]; 
	$_ =~ s/([^=^\"]|^)((http|ftp):[!#-9A-~]+)/$1<a href=$2 target=_top>ここを押して<\/a>/g; 
	$_ =~ s/([!#-9A-~\-\_]+\@[!#-9A-~\-\_\.]+)/<a href=mailto:$1>$1<\/a>/g; 
	$_; 
}
sub tag_change {
	local($_) = $_[0];
	1 while s/(.*)(&lt;(img([!-:A-~\s\=]+))&gt;)/$1<img$4>/i;
	1 while s/(.*)(&lt;(font[\s\w\=\#\"\']+)\&gt;(.*)\&lt;\/font\&gt;)/$1<$3>$4<\/font>/i;
	1 while s/(.*)(&lt;(b)&gt;(.*)&lt;\/b&gt;)/$1<b>$4<\/b>/i;
	1 while s/(.*)(&lt;(i)&gt;(.*)&lt;\/i&gt;)/$1<i>$4<\/i>/i;
	$_;
}
sub error {
	$error = $_[0];
	if ($error eq 'bad_file') { $msg = 'ファイルのオープン、入出力に失敗しました。'; }
	elsif ($error eq 'bad_name') { $msg = 'ニックネームが記入されていません。'; }
	elsif ($error eq 'bad_comment') { $msg = 'コメントが記入されていません。'; }
	elsif ($error eq 'bad_email') { $msg = 'メールアドレスが不正です。'; }
	elsif ($error eq 'bad_pass') { $msg = 'パスワードが一致しません。'; }
	elsif ($error eq 'send_mail') { $msg = 'sendmailをオープンできません。'; }
	else { $msg = '原因不明のエラーで処理を継続できません。'; }
	&html_head;
	print "<p>　</p><p>　</p><p>　</p><center><font size=6><b>ＥＲＲＯＲ</b></font><p>　</p><p>　</p>\n";
	print "<table border=5 width =70%><tr>\n";
		print "<td align=center><center><p>　</p><p>　</p>\n";
		print "<font size=6><b><i>$msg</i></b></font><p>　</p><p>　</p></td>\n";
	print "</tr></table>\n";
	print "</center></body></html>\n";
	exit;
}
