#!/usr/local/bin/perl


#┌─────────────────────────────────
#│ Honey Board
#│ honey.cgi - 2007/10/30
#│ Copyright (c) KentWeb
#│ webmaster@kent-web.com
#│ http://www.kent-web.com/
#└─────────────────────────────────

# 外部ファイル取り込み
require './init.cgi';
require $jcode;

&parse_form;
&axscheck;
if ($mode eq 'find') { &find; }
elsif ($mode eq 'howto') { &howto; }
elsif ($mode eq 'admin') { &admin; }
elsif ($mode eq 'image') { &image; }
elsif ($mode eq 'res') { &res_form; }
elsif ($mode eq 'check') { &check; }
&html_log;

#-------------------------------------------------
#  記事表示
#-------------------------------------------------
sub html_log {
	# 記事繰越
	my $page = 0;
	foreach ( keys(%in) ) {
		if (/^page:(\d+)$/) {
			$page = $1;
			last;
		}
	}

	# ヘッダ
	&header;
	print qq|<div align="center">\n|;
	if ($banner1 ne "<!-- 上部 -->") { print "<p>$banner1</p>\n"; }

	# タイトル部
	if ($ImgT) {
		print qq|<img src="$ImgT" width="$ImgW" height="$ImgH" alt="$title">\n|;
	} else {
		print qq|<b style="color:$ttl_col; font-family:$ttl_face; font-size:$ttl_size">$title</b>\n|;
	}

	print <<EOM;
<hr width="80%">
[<a href="$home" target="_top">トップに戻る</a>]
[<a href="$bbscgi?mode=howto">留意事項</a>]
[<a href="$bbscgi?mode=find">ワード検索</a>]
[<a href="$admincgi">管理用</a>]
<hr width="80%">
EOM

	# フォームを表示
	&form_view();

	# １マスの大きさ
	my $pix = 18;

	my $i = 0;
	open(IN,"$logfile") || &error("Open Error: $logfile");
	my $top = <IN>;
	while (<IN>) {
		my ($no,$reno,$date,$name,$eml,$sub,$icon,$icon2,$com,$color,$url,$host,$pw) = split(/<>/);

		if ($reno eq "") { $i++; }
		if ($i < $page + 1) { next; }
		if ($i > $page + $pglog) { last; }

		if ($eml) { $name = "<a href=\"mailto:$eml\">$name</a>"; }
		if ($url) {
			if ($url !~ /^http/i) { $url = "http://$url"; }
			$url = qq|<a href="$url" target="_blank"><img src="$imgurl/home.gif" border="0" align="top" alt="home"></a>|;
		}

		my ($wide, $iro, @gif);

		# レス記事
		if ($reno) {
			$wide = $resWid;
			$iro  = $resCol;
			@gif  = ("",@resCol);

		# 親記事
		} else {
			$wide = $oyaWid;
			$iro  = $oyaCol;
			@gif  = ("",@oyaCol);
		}

		# 記事を表示
		if (!$reno) { print "<br><br>\n"; }
		print qq|<table border="0"><tr>\n|;

		# 反転対象部分1
		if (!$flg) {
			print qq|<td><img src="$imgurl/$icon" alt=""></TD>\n|;
			print qq|<td><table border="0" cellpadding="0" cellspacing="0"><tr>\n|;
			print qq|<td width="$pix"><br></td>\n|;
		} else {
			print qq|<td><table border="0" cellpadding="0" cellspacing="0"><tr>\n|;
		}

		print qq|<td><img src="$imgurl/$gif[1]" width="$pix" height="$pix" alt=""></td>\n|;
		print qq|<td width="$wide" bgcolor="$iro"><br></td>\n|;
		print qq|<td><img src="$imgurl/$gif[2]" width="$pix" height="$pix" alt=""></td>\n|;

		# 反転対象部分2
		if ($flg == 0) {
			print qq|</tr>\n|;
			print qq|<tr><td><img src="$imgurl/$gif[5]" width="$pix" height="$pix" alt=""></td>\n|;
		} else {
			print qq|<td width="$pix"><br></td></tr>\n<tr>\n|;
		}

		print "<td bgcolor=\"$iro\"><br></td>\n";
		print "<td width=\"$wide\" bgcolor=\"$iro\">\n";
		print "<font color=\"$onepnt\"><b>$sub</b></font><br>\n";
		if (!$reno) { print "投稿者："; }
		print "<b>$name</b> - $date <font color=\"$onepnt\">No\.$no</font> ";

		if (!$reno) {
			print "[<a href=\"$bbscgi?mode=res&no=$no\">返信</a>] &nbsp; \n";
		}

		print "$url<br>\n";
		print "<blockquote><font color=\"$color\">$com</font></blockquote>\n";
		print "</td><td bgcolor=\"$iro\"><br></td>\n";

		if ($flg == 1) {
			print qq|<td><img src="$imgurl/$gif[6]" width="$pix" height="$pix" alt=""></td>\n|;
		}
		print "</tr><tr>\n";

		# 反転対象部分3
		if ($flg == 0) {
			print qq|<td width="$pix"><br></td>\n|;
		}

		print qq|<td><img src="$imgurl/$gif[4]" width="$pix" height="$pix" alt=""></td>\n|;
		print qq|<td width="$wide" bgcolor="$iro"><br></td>\n|;
		print qq|<td><img src="$imgurl/$gif[3]" width="$pix" height="$pix" alt=""></td>\n|;

		if ($flg == 1) { print qq|<td width="$pix"><br></td>\n|; }
		print "</tr></table>\n";

		if ($flg == 1) {
			print qq|</td><td><img src="$imgurl/$icon" alt="">\n|;
		}
		print "</td></tr></table>\n";

		if (!$reno) {
			if ($flg == 0) { $flg = 1; } else { $flg = 0; }
		}
	}
	close(IN);

	my $next = $page + $pglog;
	my $back = $page - $pglog;

	# ページ繰越ボタン
	if ($back >= 0 || $next < $i) {
		print qq|<form action="$bbscgi" method="post">\n|;
	}

	if ($back >= 0) {
		print qq|<input type="submit" name="page:$back" value="前の$pglog件">\n|;
	}
	if ($next < $i) {
		print qq|<input type="submit" name="page:$next" value="次の$pglog件">\n|;
	}

	if ($back >= 0 || $next < $i) {
		print qq|</form>\n|;
	}

	print <<EOM;
</div>
<div align="right">
<form action="$registcgi" method="post">
記事No <input type="text" name="no" size="3">
削除キー <input type="password" name="pwd" size="4" maxlength="8">
<input type="submit" name="del_log" value="削除">
</form>
</div>
<div align="center">
EOM

	print qq|<p>$banner2</p>\n| if ($banner2 ne '<!-- 下部 -->');

	print <<EOM;
<!-- 著作権表\示：削除不可 ($ver) -->
<span style="font-size:85%; font-family:Verdana,Helvetica,Arial">
- <a href="http://www.kent-web.com/" target="_top">Honey Board</a> -
</span>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  ワード検索
#-------------------------------------------------
sub find {
	&header;
	print <<"EOM";
[<a href="$bbscgi?">戻る</a>]
<ul>
<li>検索したい<b>キーワード</b>を入力し「検索」を押してください。
<li>キーワードは「半角スペース」で区切って複数指定することができます。
<form action="$bbscgi" method="post">
<input type="hidden" name="mode" value="find">
キーワード <input type="text" name="word" size="35" value="$in{'word'}">
検索条件 <select name="cond">
EOM

	foreach ("AND", "OR") {
		if ($in{'cond'} eq $_) {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}

	print <<EOM;
</select>
<input type="submit" value="検索">
</form>
</ul>
EOM

	# ワード検索の実行と結果表示
	if ($in{'word'} ne "") {

		# 入力内容を整理
		$in{'word'} =~ s/　/ /g;
		my @wd = split(/\s+/, $in{'word'});

		# 検索処理
		print "<dl>\n";
		my $i = 0;
		open(IN,"$logfile") || &error("Open Error : $logfile");
		my $top = <IN>;
		while (<IN>) {
			my ($no,$reno,$date,$name,$mail,$sub,$icon,$icon2,$com,$res,$url) = split(/<>/);

			foreach $wd (@wd) {
				my $flg;
				if (index("$name $mail $sub $com $url", $wd) >= 0) {
					$flg = 1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flg = 0; last; }
				}
			}
			next if (!$flg);

			# 結果を表示
			$i++;
			if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
			if ($url) {
				if ($url !~ /^http/i) { $url = "http://$url"; }
				$url = "[<a href=\"$url\" target=\"_blank\">HOME</a>]";
			}

			print "<dt><hr>[<b>$no</b>] <b>$sub</b> ";
			print "投稿者：<b>$name</b> 投稿日：$date $url<br><br>\n";
			print "<dd>$com<br>\n";
		}
		close(IN);

		print "<dt><hr>検索結果は <b>$i</b>件です。\n";
	}
	print "<dt><hr></dl>\n</body>\n</html>\n";
	exit;
}

#-------------------------------------------------
#  返信レスフォーム
#-------------------------------------------------
sub res_form {
	&header;
	print <<EOM;
[<a href="javascript:history.back()">掲示板に戻る</a>]
<hr>
<blockquote>
EOM

	open(IN,"$logfile") || &error("Open Error : $logfile");
	my $top = <IN>;
	while (<IN>) {
		my ($no,$reno,$date,$name,$mail,$sub,$icon,$icon2,$com,$color,$url,$host,$pw) = split(/<>/);

		if ($in{'no'} eq $no || $in{'no'} eq $reno) {

			if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
			if ($url) {
				if ($url =~ /^http/i) {
					$url  = "&lt;<a href=\"$url\" target=\"_top\">Home</a>&gt;";
				} else {
					$url  = "&lt;<a href=\"http://$url\" target=\"_top\">Home</a>&gt;";
				}
			}
			# レス題名用
			if ($reno eq "") { $res_sub = "Re: $sub"; }

			print "<font color=\"$onepnt\"><b>$sub</b></font> <b>$name</b> - $date $url<p>\n";
			print "<blockquote>$com</blockquote><hr>\n";
		}
	}
	close(IN);

	if ($flg) { &error("不正な返信要求です"); }

	&form_view($in{'no'});

	print "</blockquote>\n";
	print "</body>\n</html>\n";
	exit;
}

#-------------------------------------------------
#  留意事項
#-------------------------------------------------
sub howto {
	&header;
	print <<EOM;
<br><br>
<div align="center">
<table border="1" cellpadding="10" align="center" width="90%">
<tr><td bgcolor="#FFFFFF">
<font color="#000000">
<h3 style="color:$ttl_col">留意事項</h3>
<ol>
<li>この掲示板は<b>クッキー対応</b>です。１度記事を投稿いただくと、おなまえ、Ｅメール、ＵＲＬ、削除キーの情報は２回目以降は自動入力されます。（ただし利用者のブラウザがクッキー対応の場合）
<li>投稿記事には、<b>タグは一切使用できません。</b>
EOM

	if ($in_email) {
		print "<li>記事を投稿する上での必須入力項目は<b>「おなまえ」「メッセージ」「Ｅメール」</b>です。ＵＲＬと削除キーは任意です。\n";
	} else {
		print "<li>記事を投稿する上での必須入力項目は<b>「おなまえ」</b>と<b>「メッセージ」</b>です。Ｅメール、ＵＲＬ、削除キーは任意です。\n";
	}

	print <<EOM;
<li>記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。
<li>記事の投稿時に<b>「削除キー」</b>にパスワード（英数字で8文字以内）を入れておくと、その記事は次回<b>削除キー</b>によって削除することができます。
<li>記事の保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。
<li>過去の投稿記事から<b>「キーワード」によって簡易検索ができます。</b>トップメニューの<a href="$bbscgi?mode=find">「ワード検索」</a>のリンクをクリックすると検索モードとなります。
<li>管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は予\告なく削除することがあります。また当サイトに無関係の投稿は禁止させていただきます。違反者には警察に通報や法的措置をとらせていただきます。
</ol>
</font>
</td></tr>
</table>
<p>
<form>
<input type="button" value="前画面に戻る" onclick="history.back()">
</form>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  イメージ表示
#-------------------------------------------------
sub image {
	&header;
	print <<EOM;
<div align="center">
<h3>画像イメージ</h3>
<table border="1" cellpadding="5" cellspacing="0">
EOM

	my $n = 0;
	foreach $i (0 .. $#icon1) {

		$n++;
		if ($n % 5 == 1) { print "<tr>\n"; }

		print qq|<td align="center" valign="top">|;
		print qq|<img src="$imgurl/$icon1[$i]" alt="$icon1[$i]"><br>$icon2[$i]</td>\n|;

		if ($n % 5 == 0) { print "</tr>\n"; }
	}

	while ( $n % 5 ) {
		print "<td>&nbsp;</td>\n";
		$n++;
	}

	print <<EOM;
</tr>
</table>
<form>
<input type="button" value="閉じる" onclick="top.close();">
</form>
</div>
</body>
</html>
EOM
	exit;
}

#-------------------------------------------------
#  投稿フォーム
#-------------------------------------------------
sub form_view {
	my $resno = shift;

	# クッキー情報を取得
	local($cnam,$ceml,$curl,$cpwd,$ccol,$cico) = &get_cookie;
	if ($curl eq "") { $curl = 'http://'; }

	print "<form action=\"$registcgi\" method=\"post\">\n";

	if ($resno > 0) {
		print qq|<input type="hidden" name="reno" value="$resno">\n|;
	}

	print <<"EOM";
<input type="hidden" name="mode" value="regist">
<table>
<tr>
  <td><b>おなまえ</b></td>
  <td><input type="text" name="name" size="28" value="$cnam"></td>
</tr>
<tr>
  <td><b>Ｅメール</b></td>
  <td><input type="text" name="email" size="28" value="$ceml"></td>
</tr>
<tr>
  <td><b>タイトル</b></td>
  <td>
    <input type="text" name="sub" size="34" value="$res_sub">
    &nbsp;
    <input type="submit" value="送信する"><input type="reset" value="リセット">
  </td>
</tr>
<tr>
  <td colspan="2">
    <b>メッセージ</b><br>
    <textarea name="comment" cols="55" rows="7"></textarea>
  </td>
</tr>
<tr>
<tr>
  <td><b>参照先</b></td>
  <td><input type="text" name="url" size="50" value="$curl"></td>
</tr>
<tr>
  <td><b>イメージ</b></td>
  <td><select name="icon">
EOM

	# イメージの選択フォームを表示
	push(@icon1,"$mgr_icon");
	push(@icon2,"管理者用");
	foreach (0 .. $#icon1) {
		if ($icon1[$_] eq $cico) {
			print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
		} else {
			print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
		}
	}

	print <<"EOM";
    </select> [<a href="$bbscgi?mode=image" target="_blank">アイコン参照</a>]
  </td>
</tr>
EOM

	# 投稿キー
	if ($regist_key) {
		require $regkeypl;
		my ($str_plain,$str_crypt) = &pcp_makekey;

		print qq|<tr><td><b>投稿キー</b></td>|;
		print qq|<td><input type="text" name="regikey" size="6" style="ime-mode:inactive" value="">\n|;
		print qq|（投稿時 <img src="$registkeycgi?$str_crypt" align="absmiddle" alt="投稿キー"> を入力してください）</td></tr>\n|;
		print qq|<input type="hidden" name="str_crypt" value="$str_crypt">\n|;
	}

	print <<EOM;
<tr>
  <td><b>削除キー</b></td>
  <td><input type="password" name="pwd" size="6" maxlength="8" value="$cpwd">
    <small>(記事の削除時に使用)</small>
  </td>
</tr>
<tr>
  <td><b>文字色</b></td>
  <td>
EOM

	if ($ccol eq "") { $ccol = $colors[0]; }
	foreach (0 .. $#colors) {
		if ($ccol eq $colors[$_]) {
			print qq|<input type="radio" name="color" value="$colors[$_]" checked>|;
			print qq|<font color="$colors[$_]">■</font>\n|;
		} else {
			print qq|<input type="radio" name="color" value="$colors[$_]">|;
			print qq|<font color="$colors[$_]">■</font>\n|;
		}
	}

	print <<EOM;
  </td>
</tr>
<tr>
  <td></td>
  <td><input type="checkbox" name="cook" value="on" checked>
	クッキーを保存
  </td>
</tr>
</table>
</form>
EOM
}

#-------------------------------------------------
#  クッキー取得
#-------------------------------------------------
sub get_cookie {
	# クッキーを取得
	my $cook = $ENV{'HTTP_COOKIE'};

	# 該当IDを取り出す
	my %cook;
	foreach ( split(/;/, $cook) ) {
		my ($key, $val) = split(/=/);
		$key =~ s/\s//g;
		$cook{$key} = $val;
	}

	# データをURLデコードして復元
	@cook;
	foreach ( split(/<>/, $cook{'HoneyBoard'}) ) {
		s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg;

		push(@cook,$_);
	}
	return @cook;
}

#-------------------------------------------------
#  チェックモード
#-------------------------------------------------
sub check {
	&header;
	print "<h2>Check Mode</h2>\n";
	print "<ul>\n";

	# ログパス
	if (-e $logfile) {
		print "<li>ログファイルのパス：OK\n";

		# ログパーミッション
		if (-r $logfile && -w $logfile) {
			print "<li>ログファイルのパーミッション：OK\n";
		} else {
			print "<li>ログファイルのパーミッション：NG\n";
		}
	} else {
		print "<li>ログファイルのパス：NG → $logfile\n";
	}

	print "</ul>\n</body>\n</html>\n";
	exit;
}


