#!/usr/local/bin/perl

## -----------------------------------------------------------------------------+
## WEB FORUM v2.2
## (C)1997-1999 (1999/12/05)
## E-MAIL: webmaster@kent-web.com
## WWW: http://www.kent-web.com/
## -----------------------------------------------------------------------------+

$ver = 'Web Forum v2.2'; # バージョン情報（修正不要）

## -----------------------------------------------------------------------------+
## [注意事項・合意事項]
## 1.このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に
##   対して作者はその責任を一切負いません。
## 2.設置に関する質問はサポート掲示板にお願いいたします。メールによる質問には
##   お答えできません。
## -----------------------------------------------------------------------------+
## [設置例] かっこ内はパーミッション
##
##    public_html / index.html (ホームページ)
##       |
##       +-- bbs [777] / wforum.cgi   [755]
##                       wforum.log   [666]
##                       wf_admin.cgi [755]
##                       jcode.pl     [644]
##                       fold.pl      [644]
##                       index.html
##                       title.gif
##                       index.cgi    [755] .. (過去ログ用)
##                       1.html       [666] .. (過去ログ用)
##                       pastno.dat   [666] .. (過去ログ用)
##
## -----------------------------------------------------------------------------+

#============#
#  基本設定  #
#============#

require '../jcode.pl';	# 文字コードライブラリ
require '../fold.pl';	# 行折り返しライブラリ

# 掲示板タイトル名
$html_title = "SUGINAMI.NET COMPUTER&INTERNET BBS";

# タイトルの色
$t_color = "#FF66FF";

# タイトルの大きさ（スタイルシートポイント指定）
$t_point = '18pt';

# タイトル文字のタイプ
$t_face = 'ＭＳ Ｐゴシック';

# タイトル画像を使用するとき
$t_gif = "../../images/bbs-pc.gif";	
$t_wid = 486;		# 画像の横サイズ（ピクセル）
$t_hgt = 60;		# 画像の縦サイズ（ピクセル）

# 2段目画像広告_左
$l_gif = "../../images/7.gif";
$l_gifn = '会社名入れます';	# 会社名
$l_gifc = 210;		# URLnavigatorのLink No.
$l_wid = 224;		# 画像の横サイズ（ピクセル）
$l_hgt = 33;		# 画像の縦サイズ（ピクセル）


# 2段目画像広告_右
$r_gif = "../../images/amho1029.gif";
$r_gifn = '会社名入れます';	# 会社名
$r_gifc = 150;		# URLnavigatorのLink No.
$r_wid = 224;		# 画像の横サイズ（ピクセル）
$r_hgt = 33;		# 画像の縦サイズ（ピクセル）

# 3段目一行広告_左
$l_navn = '根本特殊化学';	# 会社名
$l_navi = 351;		# URLnavigatorのLink No.
$l_navc = '世界一企業蛍光塗料の根本特殊化学';	# キャッチコピー

# 3段目一行広告_右
$r_navn = '富士商会株式会社';	# 会社名
$r_navi = 248;		# URLnavigatorのLink No.
$r_navc = '窓のリフォームは';	# キャッチコピー


# 本文の文字大きさ（スタイルシート）
$pt = '12pt';

# 最大記事数
$max  = 150;

# 戻り先のＵＲＬ(index.htmlなど)
$home = "../../pc.htm";

# 説明ページ
$howto = "./index.html";

# 壁紙・背景色・文字色など
$bground = "";		# 壁紙の指定
$bgcolor = "#b8e6b8";	# バックの色
$text    = "#008080";	# 文字色
$link    = "#3333CC";	# リンク色（未訪問）
$vlink   = "#3399CC";	# リンク色（既訪問）
$alink   = "#FF00FF";	# リンク色（訪問中）

# 管理ファイル
$admin = "./wf_admin.cgi";

# スクリプト名
$script = "./wforum.cgi";

# ログファイル名
$logfile = "./wforum555.log";

# タグの許可 (0=no 1=yes)
$tagkey  = 0;

# ロックファイル機構
# (0=no 1=yes:symlink関数 2=yes:open関数
$lockkey = 0;

# ロックファイル名
#  ---> このディレクトリのパーミッションは777にすること
$lockfile  = "./wforum.lock";

# URL自動リンク (0=no 1=yes)
$autolink  = 1;

# 記事の [題名] の色
$sub_color = "#FF0099";

# 記事にNEWマークを付ける時間
$new_time  = 24;

# NEWマークの色
$new_color = "#FF80FF";

# 記事NOの色
$no_color = "#800000";

# 新着記事一括の記事数
$sortcnt = 15;

# 頁あたりツリー表示数
$p_tree = 10;

# リストに表示する「記事タイトル」の長さ（文字数：半角文字換算）
$sub_length = 32;

# メールアドレスの入力を必須 (0=no 1=yes)
$in_email = 0;

# レスがついたらツリー毎トップへ移動 (0=no 1=yes)
$top_sort = 1;

# methodの形式 (POST/GET)
$method = 'POST';

# 投稿があるとメール通知する (0=no 1=yes) : sendmail必須
$mailing = 1;

# メール通知する際のメールアドレス
$mailto  = 'webmaster@suginami.net';

# sendmailパス（メール通知する時）
$sendmail = '/usr/lib/sendmail';

# 自分の記事をメール送信する (0=no 1=yes)
$mail_me  = 1;

# ツリーのヘッダー
$treehead = "★";

# レス記事のヘッダー
$msghead = "+";

# ホスト名取得モード
#  --> 0 : $ENV{'REMOTE_HOST'} で取得できる場合
#  --> 1 : gethostbyaddr で取得できる場合
$get_remotehost = 0;

# 過去ログ機能 (0=no 1=yes)
$pastkey = 1;

# 過去ログ用補助ファイル
$hojofile = "./index.cgi";

# 過去ログカウントファイル
$past_num = "./pastno555.dat";

# 過去ログのディレクトリ
$past_dir = ".";

# 過去ログ１ページ当りの最大行数
$max_line = 180;

# アクセス制限（ホスト名を記述）
@deny = (
	'*.hogehoge.ne.jp',
	'xxx.proxy.com',
	'',
	'',
	'',
	'',
	'');

#============#
#  設定完了  #
#============#

# bodyタグの定義
if ($bground) {
  $body = "<body background=\"$bground\" bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>\n";
} else {
  $body =  "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>\n";
}

## --- 基本処理
&decode;
&axs_check;
if ($mode eq "regist") { &regist; }
elsif ($mode eq "form" && $pview eq "on") { &preview; }
elsif ($mode eq "form" && $pview ne "on") { &regist; }
elsif ($mode eq "msg_view") { &msg_view; }
elsif ($mode eq "all_read") { &all_read; }
elsif ($mode eq "new_sort") { &new_sort; }
elsif ($mode eq "usr_del") { &usr_del; }
elsif ($mode eq "find") { &find; }
&list_view;

## --- アクセス制限
sub axs_check {
	if ($deny[0]) {
		# ホスト名を取得
		&get_host;

		$h_flag=0;
		foreach (@deny) {
			if ($_ eq '') { last; }
			$_ =~ s/\*/\.\*/g;
			if ($host =~ /$_/) { $h_flag=1; last; }
		}
		if ($h_flag) {
			# エラー表示
			&header;
			print "<h3>ただ今閉鎖中です。</h3>\n";
			print "</body></html>\n";
			exit;
		}
	}
}

## --- デコード処理
sub decode {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。"); }
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }

	@pairs = split(/&/, $buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		&jcode'convert(*value,'sjis');

		if ($tagkey == 0) {
			$value =~ s/&/&amp;/g;
#			$value =~ s/\"/&quot;/g;
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
		} else {
			$value =~ s/<!--(.|\n)*-->//g;
			$value =~ s/<>/&lt;&gt;/g;
		}

		$FORM{$name} = $value;
	}
	$rq_no = $FORM{'no'};
	$name  = $FORM{'name'};
	$url   = $FORM{'url'};
	$url   =~ s/^http\:\/\///;
	$email = $FORM{'email'};
	$title = $FORM{'title'};
	$mode  = $FORM{'mode'};
	$pwd   = $FORM{'pwd'};
	$wrap  = $FORM{'wrap'};
	$pview = $FORM{'pview'};
	$msg   = $FORM{'msg'};

	# 強制改行処理
	if (($mode eq "form" && $pview ne "on" && $wrap eq "hard") || ($mode eq "regist" && $wrap eq "hard")) {
		&get_agent;
		$bytes = $com_wid;
		if ($FORM{'action'} eq "res_msg") { $bytes += 6; }
		local($tmp) = '';
		while (length $msg) {
			($folded, $msg) = &fold ($msg,$bytes);
			$tmp .= "$folded<br>";
		}
		$msg = $tmp;
	}
	# 改行処理
	$msg   =~ s/\r\n/<br>/g;
	$msg   =~ s/\r/<br>/g;
	$msg   =~ s/\n/<br>/g;
	while ($msg =~ /<br>$/) { $msg =~ s/<br>$//g; }
}

## --- 書き込み処理
sub regist {
	# フォームチェック
	if ($FORM{'name'} eq "" || $FORM{'msg'} eq "") {
		&error("名前又はメッセージに記入モレがあります");
	}
	# E-Mail入力
	if ($in_email && $email !~ /(.+)\@(.+)\.(.+)/) {
		&error("E-Mailの入力が不正です");
	}

	# ホスト情報を取得
	&get_host;

	if (!$title) { $title = "無題"; }

	# ロック処理
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ログファイル読み込み
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	# カウントファイルを認識
	$count = shift(@lines);
	$count =~ s/\n//;
	$count++;

	# 二重投稿の禁止
	$nflag=0;
	foreach $line (@lines) {
		($kno,$kreno,$kx,$kttl,$kem,
			$kurl,$kname,$kdate,$kmsg) = split(/<>/, $line);

		if ($name eq $kname && $msg eq $kmsg) { $nflag=1; last; }
	}
	if ($nflag) { &error("二重投稿は禁止です"); }

	# クッキーを発行
	&set_cookie;

	# パスワード暗号化
	if ($pwd) { &pass_encode($pwd); }

	# 時間を取得
	&get_time;

	# 親記事の場合
	if ($rq_no eq 'new') {
		unshift (@lines,"$count<>no<>0<>$title<>$email<>$url<>$name<>$date<>$msg<>$times<>$host<>$ango<>$wrap<>$count<>\n");
		@new = @lines;

	# レス記事の場合
	} else {

	    ## ツリーソート「あり」の場合 ##
	    if ($top_sort) {

		@new=();
		@tmp=();
		foreach (@lines) {
			local($no,$reno,$lx,$t,$e,$u,$n,$d,$m,$tm,$h,$a,$w,$OYA)
								 = split(/<>/, $_);

			if ($OYA eq "$FORM{'oya'}") { push(@new,$_); }
			else { push(@tmp,$_); }
			if ($no eq "$rq_no") {
				$lx++;
				push(@new,"$count<>$no<>$lx<>$title<>$email<>$url<>$name<>$date<>$msg<>$times<>$host<>$ango<>$wrap<>$FORM{'oya'}<>\n");
			}
		}
		push(@new,@tmp);

	    }
	    ## ツリーソート「なし」の場合 ##
	    else {
		@new = ();
		foreach (@lines) {
			($no,$reno,$lx) = split(/<>/, $_);
			push (@new,$_);

			if ($no eq "$rq_no") {
       				$lx++;
       				push (@new,"$count<>$no<>$lx<>$title<>$email<>$url<>$name<>$date<>$msg<>$times<>$host<>$ango<>$wrap<>$FORM{'oya'}<>\n");
			}
		}
	    }
	}

	# 最大記事数処理
	@PAST = ();
	if (@new > $max) {
		foreach (0 .. $#new) {
			# 最終尾ファイルを配列から抜き出す
			local($p_file) = pop(@new);

			# 過去ログ配列 @PASTに格納
			unshift(@PAST,$p_file);

			local($no,$reno,$lx) = split(/<>/, $p_file);
			if ($#new+1 <= $max && $reno eq 'no') {
				last;
			}
		}
	}

	# カウントログ付加
	unshift(@new,"$count\n");

	# ログを更新
	open(OUT,">$logfile") || &error("Can't write $logfile");
	print OUT @new;
	close(OUT);

	# 過去ログ処理
	if ($pastkey) { &past_log; }

	# ファイルロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# メール通知
	if ($mailing && $mail_me) { &mail_to; }
	elsif ($mailing && $mail_me == 0 && $email ne "$mailto") { &mail_to; }

	# 書きこみ後処理
	if ($pview ne "on") { &after; }
	else { &list_view; }
}

## --- 書きこみ後メッセージ
sub after {
	if ($url) { $url = 'http://' . "$url"; }

	# ツリートップ移動処理の場合は書き込み後はトップページ
	if ($top_sort) { $page = 0; }

	if ($wrap eq "pre") { $msg = "<pre>$msg</pre>"; }

	&header;
	print <<"EOM";
<center><h3>正常に書きこみが完了しました。</h3></center>
<blockquote>
<font face="ＭＳ ゴシック">
おなまえ：<b>$name</b><br>
Ｅメール：$email<br>
ＵＲＬ　：$url<br>
タイトル：<b>$title</b><br>
メッセージ<br><br></font>
<blockquote>
<font color="$t_color">$msg</font>
</blockquote>
</blockquote>
<hr><center>
<form action="$script" method="GET">
<input type=hidden name=page value="$FORM{'page'}">
<input type=submit value="リストにもどる">
</form>
</center>
</body></html>
EOM
	exit;
}

## --- リスト表示
sub list_view {

	# 時間を取得
	&get_time;

	&header;
	print "<center>";

	print "<table width=\"500\" border=\"0\">\n";
	print "<tr><td colspan=\"2\" align=\"center\"><img src=\"$t_gif\" width=$t_wid height=$t_hgt alt=\"$html_title\"></td></tr>\n";
#	print "<tr><td align=\"center\"><!--$l_gifn--><a href=\"http://suginami.net/navi/navi.cgi?links=$l_gifc\"><img src=\"$l_gif\" width=$l_wid height=$l_hgt border=\"0\"></a></td>\n";
#	print "<td align=\"center\"><!--$r_gifn--><a href=\"http://suginami.net/navi/navi.cgi?links=$r_gifc\"><img src=\"$r_gif\" width=$r_wid height=$r_hgt border=\"0\"></a></td></tr>\n";
	print "<tr><td align=\"center\" bgcolor=\"#CCCCCC\" width=\"50%\"><!--$l_navn--><a href=\"http://suginami.net/navi/navi.cgi?links=$l_navi\"><font size=\"2\">$l_navc</font></a></td>\n";
	print "<td align=\"center\" bgcolor=\"#CCCCCC\" width=\"50%\"><!--$r_navn--><a href=\"http://suginami.net/navi/navi.cgi?links=$r_navi\"><font size=\"2\">$r_navc</font></a></td></tr></table>\n";

	print "<hr width=95\%>\n";
	print "[<a href=\"$home\" target='_top'>もどる</a>]\n";
	print "[<a href=\"#msg\">メッセージを投稿</a>]\n";
	print "[<a href=\"$script?mode=new_sort&page=$FORM{'page'}\">新着記事一括</a>]\n";
	print "[<a href=\"$howto\">掲示板の使い方</a>]\n";
	print "[<a href=\"$script?mode=find&page=$FORM{'page'}\">ワード検索</a>]\n";

	if ($pastkey) { print "[<a href=\"$hojofile\">過去ログ</a>]\n"; }

	print "[<a href=\"$admin\">管理用</a>]\n";

	print "<hr width='95%'>\n<table><tr><td><small>\n";
	print "<LI>$new_time時間以内の記事は <font color=\"$new_color\"><B>NEW</B></font> で表\示されます。<br>\n";
	print "<LI>ツリー先頭部の $treehead をクリックすると関連記事を一括講読できます。<br>\n";
#	print "<LI>「改造」に関する質問にはレスを致しませんので、ご了承下さい。\n";
	print "</small></td></tr></table></center>\n<blockquote>\n";

	# リストを出力
	$x = 0;
	print "<DL>\n";

	# ページ区切り処理
	$start = $FORM{'page'} + 1;
	$end   = $FORM{'page'} + $p_tree;

	# ログを開く
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;

	$i=0; $j=0;
	while ($_ = <IN>) {

		local($no,$reno,$lx,$sub,$email,$url,
			$name,$dat,$msg,$timek,$h,$p,$w,$oya)
						 = split(/<>/, $_);

		if ($reno == 0) { $i++; $j++; }
		if ($i < $start) { next; }
		if ($i > $end) { next; }

		while ($x > $lx) { print "</DL>\n"; $x--; }
		while ($x < $lx) { print "<DL>\n"; $x++; }

		# 所定時間以内の投稿は[NEWマーク]表示
		if (($times - $timek) > $new_time*3600) { $newsign = ""; }
		else { $newsign = "<font color=$new_color><B>NEW</B></font>"; }

		if ($lx != 0) { $pointer = "$msghead"; }
		else { 
			$pointer="<a href=\"$script?mode=all_read&no=$no&page=$FORM{'page'}\">$treehead</a> - ";
		}

		# 長い題名は後半をカット
		if (length($sub) > $sub_length) {
			$sub = substr($sub,0,30);
			$sub = $sub . '...';
		}

		print "<DT>$pointer <a href=\"$script?no=$no&reno=$reno&oya=$oya&mode=msg_view&page=$FORM{'page'}\">$sub</a> - <b>$name</b> <SMALL>$dat <font color=$no_color>No\.$no</font> $refsign $newsign</SMALL>\n";

		while ($x > 0) { print "</DL>\n"; $x--; }
	}

	close(IN);

	print "</DL>\n";

	$next_page = $FORM{'page'} + $p_tree;
	$back_page = $FORM{'page'} - $p_tree;

	print "<table><tr>\n";
	if ($back_page >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=submit value=\"前の$p_tree組\">\n";
		print "</form></td>\n";
	}
	if ($next_page < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=submit value=\"次の$p_tree組\">\n";
		print "</form></td>\n";
	}
	print "</tr></table>\n";
	print "</blockquote>\n";

	# メッセージ投稿フォ−ムを表示
	&msg_form;
	exit;
}

## --- プレビュー画面
sub preview {
	&get_agent;

	if ($FORM{'name'} eq "" || $FORM{'msg'} eq "") {
		&error("名前又はメッセージに記入モレがあります。");
	}

	&header;
	print <<"HTML";
<center>
<table><tr><td>
<font color="$t_color" size=4>
<b>- 以下の内容でメッセージを投稿しますが、よろしいですか？ -</b></font>
<P>
<form action="$script" method="$method">
<input type=hidden name=mode value="regist">
<input type=hidden name=pwd value="$pwd">
<input type=hidden name=name value="$name">
<input type=hidden name=email value="$email">
<input type=hidden name=url value="$url">
<input type=hidden name=title value="$title">
<input type=hidden name=wrap value="$wrap">
<input type=hidden name=oya value="$FORM{'oya'}">
<input type=hidden name=pview value="$pview">
<input type=hidden name=page value="$FORM{'page'}">
HTML

	if ($FORM{'action'} eq "res_msg") {
		print "<input type=hidden name=no value=\"$rq_no\">\n";
		print "<input type=hidden name=action value=\"res_msg\">\n";
		$width = $com_wid + 2;
	} else {
		print "<input type=hidden name=no value=\"new\">\n";
		$width = $com_wid;
	}

	$FORM{'msg'} =~ s/\r\n/\r/g;
	$FORM{'msg'} =~ s/\n/\r/g;
	$FORM{'msg'} =~ s/\t//g;

	if ($url) { $url = "http://$url"; }

	print <<"HTML";
<font face="ＭＳ ゴシック">
<b>投稿者名</b> ： <B>$name</B><br>
<b>Ｅメール</b> ： $email<br>
<b>ＵＲＬ　</b> ： $url<br>
<b>タイトル</b> ： <font color="$sub_color"><B>$title</B></font></font>
<P><textarea cols="$width" rows=18 name=msg wrap="soft">$FORM{'msg'}</textarea>
<P><input type=submit value="メッセージを投稿する"></form>
</td></tr></table>
</center>
<P>[<A HREF="javascript:history.back()">投稿フォームに戻る</A>]
HTML
	&footer;
	exit;
}

## --- メッセージ内容を表示
sub msg_view {
	# ファイルを読み込む
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	$flag=0;
	@new=();
	$match=0;
	foreach (1 .. $#lines) {
		local($no,$reno,$lx,$sub,$email,$url,
			$name,$dat,$msg,$lt,$ho,$pw,$wrap,$oya)
						 = split(/<>/, $lines[$_]);

		if ($oya eq "$FORM{'oya'}") { push(@new,$lines[$_]); }
		if ($no eq "$FORM{'no'}" && $reno eq "$FORM{'reno'}") {
			$flag=1;
			$v_date=$dat; $v_name=$name; $v_email=$email;
			$v_url=$url; $v_msg=$msg; $v_sub=$sub;
			$v_oya=$oya; $v_no=$no; $v_wrap=$wrap;
		}

	}

	if ($v_email) { $v_email = "<a href=\"mailto:$v_email\">$v_email</a>"; }
	if ($v_url) { $v_url = "<a href=\"http://$v_url\" target='_top'>http://$v_url</a>"; }

	$res_msg = "> $v_msg";
	$res_msg =~ s/<br>/\r> /g;

	# レス用タイトル
	$res_sub = $v_sub;

	if ($res_sub =~ /^Re\^(\d+)\:(.*)/) {
		$renum = $1 + 1;
		$res_sub = "Re\^$renum\:$2";
	}
	elsif ($res_sub =~ /^Re\:(.*)/) { $res_sub = "Re\^2:$1"; }
	else { $res_sub = "Re: $res_sub"; }

	## HTMLを出力
	&header;
	print "<center>";

	print "<table width=\"500\" border=\"0\">\n";
	print "<tr><td colspan=\"2\" align=\"center\"><img src=\"$t_gif\" width=$t_wid height=$t_hgt alt=\"$html_title\"></td></tr>\n";
#	print "<tr><td align=\"center\"><!--$l_gifn--><a href=\"http://suginami.net/navi/navi.cgi?links=$l_gifc\"><img src=\"$l_gif\" width=$l_wid height=$l_hgt border=\"0\"></a></td>\n";
#	print "<td align=\"center\"><!--$r_gifn--><a href=\"http://suginami.net/navi/navi.cgi?links=$r_gifc\"><img src=\"$r_gif\" width=$r_wid height=$r_hgt border=\"0\"></a></td></tr>\n";
	print "<tr><td align=\"center\" bgcolor=\"#CCCCCC\" width=\"50%\"><!--$l_navn--><a href=\"http://suginami.net/navi/navi.cgi?links=$l_navi\"><font size=\"2\">$l_navc</font></a></td>\n";
	print "<td align=\"center\" bgcolor=\"#CCCCCC\" width=\"50%\"><!--$r_navn--><a href=\"http://suginami.net/navi/navi.cgi?links=$r_navi\"><font size=\"2\">$r_navc</font></a></td></tr></table>\n";

	print "<hr width=95%>\n";
	print "[<a href=\"$script\?page=$FORM{'page'}\">記事リスト</a>]\n";
	print "[メッセージを投稿]\n";
	print "[<a href=\"$script\?mode=new_sort\">新着記事一括</a>]\n";
	print "[<a href=\"$script\?mode=find\">ワード検索</a>]\n";

	if ($pastkey) { print "[<a href=\"$hojofile\">過去ログ</a>]\n"; }

	print "[<a href=\"$admin\">管理用</a>]\n";
	print "</center><hr width='95%'>\n";

	# 自動リンク
	if ($autolink) { &auto_link($v_msg); }

	# PREタグ
	if ($v_wrap eq 'pre') { $v_msg = "<pre>$v_msg</pre>"; }

	print "<P><font face=\"ＭＳ ゴシック\">\n";
	print "<b>投稿時間：</b>$v_date<br>\n";
	print "<B>投稿者名：$v_name</B><BR>\n";
	print "<B>Ｅメール：</B>$v_email<BR>\n";
	print "<B>ＵＲＬ　：</B>$v_url<BR>\n";
	print "<b>タイトル：<font color=$sub_color>$v_sub</font></font></b>\n";
	print "<P><blockquote>$v_msg</blockquote><P>\n";

	if (@new > 1) {
	print "<hr width='95%'>\n";
	print "<blockquote>\n以下は関連一覧ツリーです。\n";

	$x = 0;
	print "<UL>\n";

	foreach $line (@new) {
		local($no,$reno,$lx,$sub,$email,$url,
			$name,$dat,$msg,$lt,$ho,$p,$w,$oya) = split(/<>/, $line);

		while ($x > $lx) { print "</UL>"; $x--; }
		while ($x < $lx) { print "<UL>"; $x++; }

		# 長い題名は後半をカット
		if (length($sub) > $sub_length) {
			$sub = substr($sub,0,30);
			$sub = $sub . '...';
		}

		print "<LI><a href=\"$script?no=$no&reno=$reno&oya=$oya&mode=msg_view\">$sub</a> - <B>$name</B> $dat";

		if ($v_no eq "$no") { print " <font color=$sub_color><B>No\.$no</B></font>\n"; }
		else { print " <font color=$no_color>No\.$no</font>\n"; }

		while ($x > 0) { print "</UL>"; $x--; }

	}

	print "</UL>\n</blockquote>\n";
	}

	# 返信フォーム
	&msg_form;
	exit;
}

## --- 一括購読機能
sub all_read {
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# HTMLを出力
	&header;
	print "[<a href=$script\?page=$FORM{'page'}>リストへもどる</a>]<br>\n";
	print "<table width='100%'><tr><th bgcolor=\"#339999\">\n";
	print "<font color=\"#FFFFFF\">一 括 購 読</font></th></tr></table>\n";

	# 親記事を出力
	$x = 0;
	print "<UL>\n";

	$flag=0;
	foreach (1 .. $#lines) {
		($no,$reno,$lx,$sub,$email,$url,
			$name,$dat,$msg,$t,$h,$p,$wrap,$oya) = split(/<>/, $lines[$_]);

		if ($FORM{'no'} eq "$oya") {
			$flag=1;
			push(@new,$lines[$_]);

			while ($x > $lx) { print "</UL>"; $x--; }
			while ($x < $lx) { print "<UL>"; $x++; }

			# 長い題名は後半をカット
			if (length($sub) > $sub_length) {
				$sub = substr($sub,0,30);
				$sub = $sub . '...';
			}

			print "<LI><a href=\"$script?no=$no&reno=$reno&oya=$oya&mode=msg_view\">$sub</a> - <B>$name</B> $dat";
			print " <font color=$no_color>No\.$no</font>\n";

			while ($x > 0) { print "</UL>"; $x--; }

		} elsif ($flag && $FORM{'no'} ne "$oya") {
			last;
		}
	}
	print "</UL>\n<hr><center>\n";


	foreach $line (@new) {
		($no,$reno,$lx,$sub,$email,$url,$name,
			$dat,$msg,$t,$h,$p,$wrap,$oya) = split(/<>/, $line);

		# 自動リンク
		if ($autolink) { &auto_link($msg); }

		if ($url) { $url="<a href=\"http://$url\" target='_top'>http://$url</a>"; }
		if ($email) { $email="<a href=\"mailto:$email\">$email</a>"; }
		if ($wrap eq 'pre') { $msg = "<pre>$msg</pre>"; }

		print "<table border=1 width='95%' cellpadding=5>\n";
		print "<tr><td bgcolor=#FFFFFF>\n";
		print "<font face=\"ＭＳ ゴシック\">\n";
		print "投稿時間：$dat<br>投稿者名：<b>$name</b><br>\n";
		print "Ｅメール：$email<br>ＵＲＬ　：$url<br>\n";
		print "タイトル：<font color=$sub_color><b>$sub</b></font><br>\n";
		print "<blockquote>$msg</blockquote>";
		print "<div align=right>\n";
		print "<form action=\"$script\#msg\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=msg_view>\n";
		print "<input type=hidden name=reno value=$reno>\n";
		print "<input type=hidden name=no value=$no>\n";
		print "<input type=hidden name=oya value=$oya>\n";
		print "<input type=hidden name=page value=\"$FORM{'page'}\">\n";
		print "<input type=submit value=\"返信する\"></form></div>\n";
		print "</td></tr></table><br>\n";

	}

	print "</center>\n";
	&footer;
	exit;
}

## --- 記事を新着順にソート表示
sub new_sort { 
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	&header;
	print "[<a href=\"$script\?page=$FORM{'page'}\">リストへもどる</a>]\n";
	print "<table width='100%'><tr><th bgcolor=\"#339999\">\n";
	print "<font color=\"#FFFFFF\">新着記事（$sortcnt件）</font></th></tr></table>\n";
	print "<br><center>\n";
	print "<font color=$sub_color><b>新着記事$sortcnt件を表\示しました。</b></font><P>\n";

	foreach (1 .. $#lines) {
		($no,$reno,$x,$title,$email,$url,$name,
			$date,$msg,$time,$h,$p,$wrap,$oya)
					 = split(/<>/, $lines[$_]);

		# 自動リンク
		if ($autolink) { &auto_link($msg); }

		$count{$no} = $time;
		$d{$no}     = $date;
		$na{$no}    = $name;
		$em{$no}    = $email;
		$url{$no}   = $url;
		$no{$no}    = $no;
		$reno{$no}  = $reno;
		$ttl{$no}   = $title;
		$oya{$no}   = $oya;

		if ($wrap eq 'pre') { $msg{$no} = "<pre>$msg</pre>"; }
		else { $msg{$no} = $msg; }

	}

	# ソート処理
	$i=0;
	foreach (sort { ($count{$b} <=> $count{$a}) || ($a cmp $b)} keys(%count)) {
		$i++;
		if ($i > $sortcnt) { last; }	# ループを抜ける

		# 新着記事を出力
		if ($em{$_}) { $em{$_} = "<a href=mailto:$em{$_}>$em{$_}</a>"; }
		if ($url{$_}) {
			$url{$_} = "<a href=\"http://$url{$_}\" target='_top'>http://$url{$_}</a>";
		}

		print "<table border=1 width='95%' cellpadding=5><tr><td bgcolor=#FFFFFF>\n";
		print "<font face=\"ＭＳ ゴシック\">\n";
		print "投稿時間：$d{$_}<br>投稿者名：<b>$na{$_}</b><br>\n";
		print "Ｅメール：$em{$_}<br>ＵＲＬ　：$url{$_}<br>\n";
		print "タイトル：<font color=$sub_color><b>$ttl{$_}</b></font>\n";
		print "<blockquote>$msg{$_}</blockquote></font>\n<div align=right>\n";
		print "<form action=\"$script\#msg\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=msg_view>\n";
		print "<input type=hidden name=reno value=$reno{$_}>\n";
		print "<input type=hidden name=no value=$no{$_}>\n";
		print "<input type=hidden name=oya value=$oya{$_}>\n";
		print "<input type=hidden name=page value=\"$FORM{'page'}\">\n";
		print "<input type=submit value=\"返信する\"></form></div>\n";
		print "</td></tr></table><br>\n";
	}
	print "</center>\n";
	&footer;
	exit;
}

## --- HTMLのヘッダー
sub header{
	print "Content-type: text/html\n\n";
	print <<"EOM";
<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<STYLE type="text/css">
<!--
body,tr,td {font-size: $pt}
a:link     {font-size: $pt\; color:$link }
a:visited  {font-size: $pt\; color:$vlink }
a:active   {font-size: $pt\; color:$alink }
a:hover    {font-size: $pt\; color:$alink }
span       {font-size: $t_point}
-->
</STYLE>
<title>$html_title</title></head>
$body
EOM
}

## --- HTMLのフッター
sub footer {
	# 著作権表示（削除しないで下さい）
	print "<br><br><center><small><!-- $ver -->\n";
	print "- <a href=\"http://www.kent-web.com/\" target=\"_top\">Web Forum</a> -\n";
	print "</small></center>\n";
	print "</body></html>\n";
}

## --- エラー処理
sub error {
	if (-e $lockfile) { unlink($lockfile); }

	&header;
	print "<center><hr width='75%'><h3>ERROR !</h3>\n";
	print "<P><h4><font color=red>$_[0]</font></H4>\n";
	print "<P><hr width='75%'></center><P>\n";
	&footer;
	exit;
}

## --- 投稿フォーム部
sub msg_form {
	&get_cookie;
	&get_agent;

	print "<hr width='95%'><center><a name=\"msg\"></a>\n";

	if ($mode eq 'msg_view') {
		$width = $com_wid + 2;
		print "<h4>このメッセージに返信する場合は下記フォームから投稿して下さい。</h4></center>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$FORM{'page'}\">\n";
		print "<input type=hidden name=action value=\"res_msg\">\n";
		print "<input type=hidden name=no value=\"$rq_no\">\n";
		print "<input type=hidden name=oya value=\"$v_oya\">\n";

	} else {
		$width = $com_wid;
		print "<h3>メッセージをどうぞ・・</h3></a></center>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$FORM{'page'}\">\n";
		print "<input type=hidden name=no value=\"new\">\n";
	}

	# プレビューのチェック
	if ($c_pview eq "on") { $checked = "checked"; }

	print <<"HTML";
<input type=hidden name=mode value="form">
<blockquote>
<table border=0 cellspacing=0 cellpadding=1>
<tr>
  <td nowrap><b>おなまえ</b></td>
  <td>
    <input type=text name=name size="$nam_wid" value="$c_name">
  </td>
</tr>
<tr>
  <td nowrap><b>Ｅメール</b></td>
  <td>
    <input type=text name=email size="$nam_wid" value="$c_email">
  </td>
</tr>
<tr>
  <td nowrap><b>題　　名</b></td>
  <td>
    <input type=text name=title size="$subj_wid" value="$res_sub"> 
    <INPUT TYPE=submit VALUE="投稿する"><INPUT TYPE=reset VALUE="リセット">
  </td>
</tr>
<tr>
  <td colspan=2>
    <b>メッセージ</b>　　　
    <input type=radio name=wrap value="soft" checked>手動改行
    <input type=radio name=wrap value="hard">強制改行
    <input type=radio name=wrap value="pre">図表\モード<BR>
    <textarea name=msg rows=10 cols="$width" wrap="soft">$res_msg</textarea>
  </td>
</tr>
<tr>
  <td nowrap><b>ＵＲＬ</b></td>
  <td>
    <input type=text name="url" size="$url_wid" value="http://$c_url">
  </td>
</tr>
<tr>
  <td nowrap><b>削除キー</b></td>
  <td>
    <input type=password name=pwd size=8 value="$c_pwd" maxlength=8>
    <small>(記事削除時に使用。英数字で8文字以内)</small>
  </td>
</tr>
<tr>
  <td nowrap><b>プレビュー</b></td>
  <td><input type=checkbox name=pview value="on" $checked></td>
</tr>
</table>
</form></blockquote>
<hr width='95%'>
<center><form acion="$script" method="$method">
<input type=hidden name=page value="$FORM{'page'}">
<font color="$t_color" size=2>
以下のフォームから自分の投稿した記事を削除できます</font><br>
■記事No<input type=text name=usr_no size=4>
■削除キー<input type=password name=usr_key size=6>
<input type=submit value="記事削除">
<input type=hidden name=mode value="usr_del">
</form><hr width='95%'></center>
HTML
	&footer;
}

## --- 記事削除処理
sub usr_del {
	# フォーム内容のチェック
	if ($FORM{'usr_no'} eq '' || $FORM{'usr_key'} eq '') {
		&error("記事NOまたは削除キーの記入モレがあります。");
	}

	# ロック開始
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ログを読み込む
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# カウンタ値を退避
	$cnt = shift(@lines);

	# 親記事対策のため逆順へ
	@lines = reverse(@lines);

	@new = ();
	$no_del = 0;

	## 削除キーによる記事削除 ##
	@new=();
	$oflag=0;
	foreach $line (@lines) {
		local($no,$reno,$lx,$tl,$em,$ur,$na,
			$dt,$msg,$tm,$ho,$ango,$w,$oya) = split(/<>/,$line);

		if ($no ne "$oya" && $FORM{'usr_no'} eq "$oya") { $oflag=1; }
		$flag = 0;
		if ($FORM{'usr_no'} eq "$no") {

			if ($ango eq "") { $no_del = 1; last; }

			&pass_decode($FORM{'usr_key'});

			if ($check eq "yes") {
				if ($oflag) { $line="$no<>$reno<>$lx<>(削除)<><><>(削除)<>$dt<>(削除されました)<>$tm<>$ho<><>$w<>$oya<>\n"; }
				else { $flag = 1; }
			} else { $no_del = 2; last; }
		}
		if ($flag == 0) { push(@new,$line); }
	}

	if ($no_del == 1) { &error("削除キーが設定されていません。"); }
	elsif ($no_del == 2) { &error("パスワードが違います。"); }

	# カウンタ値を付加
	@new = reverse(@new);
	unshift(@new,$cnt);

	## ログを更新 ##
	open(DB,">$logfile") || &error("Can't write $logfile");
	print DB @new;
	close(DB);

	# ロック解除
	if (-e $lockfile) { unlink($lockfile); }

	# リスト表示部にもどる
	&list_view;
}

## --- 投稿フォームを調整
sub get_agent {
	# ブラウザ情報を取得
	$agent = $ENV{'HTTP_USER_AGENT'};

	if ($agent =~ /MSIE 3/i) {
		$nam_wid  = 30;
		$subj_wid = 40;
		$com_wid  = 64;
		$url_wid  = 46;
	}
	elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
		$nam_wid  = 30;
		$subj_wid = 40;
		$com_wid  = 64;
		$url_wid  = 78;
	}
	else {
		$nam_wid  = 20;
		$subj_wid = 27;
		$com_wid  = 62;
		$url_wid  = 52;
	}

	# 返信フォームは１文字広く取る
	#if ($mode eq "msg_view") { $com_wid = $com_wid + 2; }
}

## --- ロックファイル（symlink関数）
sub lock1 { 
	local($retry) = 5;
	while (!symlink(".", $lockfile)) {
		if (--$retry <= 0) { &error("LOCK is BUSY"); }
		sleep(1);
	}
}

## --- ロックファイル（open関数）
sub lock2 {
	local($flag) = 0;
	foreach (1 .. 5) {
		if (-e $lockfile) { sleep(1); }
		else {
			$flag = 1;
			open(LOCK,">$lockfile");
			close(LOCK);
			last;
		}
	}
	if ($flag == 0) { &error("LOCK is BUSY"); }
}

## --- メール送信
sub mail_to {
	$m_msg = $msg;
	$m_msg =~ s/<br>/\n/g;
	$m_msg =~ s/&lt\;/</g;
	$m_msg =~ s/&gt\;/>/g;
#	$m_msg =~ s/&quot\;/\"/g;
	$m_msg =~ s/&amp\;/&/g;

	$m_name = $name;
	$m_sub  = $title;

	&jcode'convert(*m_sub,'jis');
	&jcode'convert(*m_name,'jis');
	&jcode'convert(*m_msg,'jis');

	# メールアドレスがない場合はダミーメールに置き換え
	if ($email eq "") { $email = 'nomail@xxx.xxx'; }

	if (open(MAIL,"| $sendmail $mailto")) {
	print MAIL "To: $mailto\n";
	print MAIL "From: $email\n";
	print MAIL "Subject: SUGINAMI.NET PC BBS \[$count\] $m_sub\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 "Name: $m_name\n";
	print MAIL "Mail: $email\n" if ($email ne 'nomail@xxx.xxx');
	print MAIL "URL:  http://$url\n" if ($url);
	print MAIL "Date: $date\n";
	print MAIL "Host: $host\n";
	print MAIL "Title:SUGINAMI PC \[$count\] $m_sub\n";
	print MAIL "http://www.suginami.net/bbs/pc/wforum.cgi\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$m_msg\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
	}
}

## --- クッキーの発行
sub set_cookie {
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg)
					 = gmtime(time + 60*24*60*60);

	$yearg += 1900;
	if ($secg  < 10) { $secg  = "0$secg";  }
	if ($ming  < 10) { $ming  = "0$ming";  }
	if ($hourg < 10) { $hourg = "0$hourg"; }
	if ($mdayg < 10) { $mdayg = "0$mdayg"; }

	$month = ('Jan','Feb','Mar','Apr','May',
			'Jun','Jul','Aug','Sep','Oct','Nov','Dec') [$mong];
	$youbi = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wdayg];

	$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
	$cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd\,pview\:$pview";
	print "Set-Cookie: WebForum=$cook; expires=$date_gmt\n";
}

## --- クッキーを取得
sub get_cookie {
	@pairs = split(/\;/, $ENV{'HTTP_COOKIE'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/\=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/\,/, $DUMMY{'WebForum'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/\:/, $pair);
		$COOKIE{$name} = $value;
	}
	$c_name  = $COOKIE{'name'};
	$c_email = $COOKIE{'email'};
	$c_url   = $COOKIE{'url'};
	$c_pwd   = $COOKIE{'pwd'};
	$c_pview = $COOKIE{'pview'};

	if ($FORM{'name'}) { $c_name = $FORM{'name'}; }
	if ($FORM{'email'}) { $c_email = $FORM{'email'}; }
	if ($url) { $c_url = "$url"; }
	if ($FORM{'pwd'}) { $c_pwd = $FORM{'pwd'}; }
	if ($FORM{'pview'}) { $c_pview = $FORM{'pview'}; }
}

## --- パスワード暗号処理
sub pass_encode {
	$times = time;
	$salt = substr($times,-2,2);
	$ango = crypt($_[0],$salt);
}

## --- パスワード照合処理
sub pass_decode {
	if ($ango =~ /^\$1\$/) { $key = 3; }
	else { $key = 0; }

	$check = "no";
	if (crypt($_[0], substr($ango,$key,2)) eq "$ango") {
		$check = "yes";
	}
}

## --- 検索機能
sub find {
	&header;
	print <<"EOM";
[<a href="$script\?page=$FORM{'page'}">リストにもどる</a>]
<table width="100%">
<tr>
  <th bgcolor="#339999">
    <font color="#FFFFFF">ワード検索</font>
  </th>
</tr>
</table>
<P><center>
<table>
<tr>
  <td nowrap>
    <UL>
    <LI>検索したい<b>キーワード</b>を入力し、検索条件を選択し「検索する」を押してください。
    <LI>複数のキーワードを入力するときは、<b>半角スペース</b>で区切って下さい。
EOM

	if ($pastkey) {
		print "<LI>過去ログは新着順に５ファイル毎に区切っています。\n";
	}

	print <<"EOM";
    </UL>
  </td>
</tr>
</table>
<P><form action="$script" method="$method">
<input type=hidden name=mode value="find">
<table border=2 cellpadding=3 cellspacing=1>
<tr>
  <th colspan=2>キーワード <input type=text name=word size=30></th>
</tr>
<tr>
  <td>検索条件</td>
  <td align=center><input type=radio name=cond value="and" checked>AND
  <input type=radio name=cond value="or">OR
  </td>
</tr>
EOM

	# 過去ログ表示
	if ($pastkey) {
		print "<tr><td>検索領域</td>\n";
		print "<td align=center>";
		print "<input type=radio name=log value=\"0\" checked><B>現行ログ</B>\n";

		open(NO,"$past_num");
		$no = <NO>;
		close(NO);

		$part = $no / 5;
		$part = int($part+1);

		$i=0;
		$j=$part;
		foreach (1 .. $part) {
			$i++;
			if ($i == 3) { print "<br>"; $i=0; }
			print "<input type=radio name=log value=\"$j\">過去ログ$j\n";
			$j--;
		}

		print "</td></tr>\n";

	} else {
		print "<input type=hidden name=log value=\"0\">\n";
	}

	print "<tr><th colspan=2><input type=submit value=\"検索する\">";
	print "<input type=reset value=\"リセット\"></th></tr>\n";
	print "</table></form></center>\n";


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

		# 入力内容を整理
		$cond = $FORM{'cond'};
		$word = $FORM{'word'};
		$word =~ s/　/ /g;
		$word =~ s/\t/ /g;
		@pairs = split(/ /,$word);

		# 現行ログのとき
		if ($FORM{'log'} == 0) {

			# ファイルを読み込み
			open(DB,"$logfile") || &error("Can't open $logfile");
			@lines = <DB>;
			close(DB);

			shift(@lines);

		# 過去ログのとき
		} else {

			# 検索領域を定義
			$start = 5 * $FORM{'log'} - 4;

			@lines = ();
			foreach ($start .. $start+5) {
				unless(-e "$past_dir\/$_\.html") { last; }

				open(DB,"$past_dir\/$_\.html");
				@temp = <DB>;
				close(DB);

				push(@lines,@temp);
			}
		}

		# 検索処理
		foreach $line (@lines) {
			$flag = 0;
			foreach $pair (@pairs){
				if (index($line,$pair) >= 0) {
					$flag = 1;
					if ($cond eq 'or') { last; }
				} else {
					if ($cond eq 'and') { $flag = 0; last; }
				}
			}
			if ($flag == 1) { push(@new,$line); }
		}

		# 検索終了
		$count = @new;
		print "<hr><b><font color=$t_color>検索結果：$count件</font></b><P>\n";
		print "<OL>\n";

		if ($FORM{'log'} == 0) {

		  foreach $line (@new) {
			($num,$reno,$x,$title,$email,$url,
				$name,$date,$msg,$time)	= split(/<>/,$line);

			if (!$title) { $title = "無題"; }
			if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
			if ($url) { $url = "<a href=\"http://$url\" target='_top'>http://$url</a>"; }

			# 結果を表示
			print "<LI>[$num] <font color=$sub_color><b>$title</b></font>\n";
			print "投稿者：<b>$name</b> <small>投稿日：$date</small>\n";
			print "<P><blockquote>$msg<P>$url</blockquote><hr>\n";
		  }

		} else {

		  foreach $line (@new) {
			($p1,$p2) = split(/<\!--T-->/,$line);
			print "<LI>$p1 \- $p2\n";
		  }

		}

	}
	print "</OL><P><hr>\n";
	&footer;
	exit;
}

## --- 自動リンク
sub auto_link {
	$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\=\;\#\:]+)/$1<a href=\"$2\" target=\"_top\">$2<\/a>/g;
}

## --- 時間の取得
sub get_time {
	# タイムゾーンを日本時間に合わせる
	$ENV{'TZ'} = "JST-9";

	$times = time;
	($sec,$min,$hour,$day,$mon,$year,$wday) = localtime($times);
	$year += 1900;
	$mon++;
	if ($min  < 10) { $min = "0$min"; }
	if ($hour < 10) { $hour= "0$hour";}
	if ($day  < 10) { $day = "0$day"; }
	if ($mon  < 10) { $mon = "0$mon"; }

	$week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];

	# 日時のフォーマット
	$date = "$year\/$mon\/$day($week) $hour\:$min";
}

## --- ホスト名取得
sub get_host {
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};

	if ($get_remotehost) {
		if ($host eq "" || $host eq "$addr") {
			$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2);
		}
	}
	if ($host eq "") { $host = $addr; }
}

## --- 過去ログ
sub past_log {
	# カウントファイル読み込み
	open(NO,"$past_num") || &error("Can't open $past_num");
	$no = <NO>;
	close(NO);

	# 過去ログを定義
	$no =~ s/\n//;
	$pastfile = "$past_dir\/$no\.html";

	# 過去ログがない場合、新規に自動生成する
	unless(-e $pastfile) { &new_log; }

	@temp=();
	foreach (@PAST) {
		($pno,$pre,$plx,$ptitle,$pem,
			$purl,$pna,$pda,$pmsg,$pt2,$ph) = split(/<>/, $_);

		if ($pem) { $pna = "<a href=\"mailto:$pem\">$pna</a>"; }
		if ($purl) { $purl = "<a href=\"http://$purl\" target='_top'>http://$purl</a>"; }

		# 自動リンク
		if ($autolink) { &auto_link($pmsg); }

		# 記事をフォーマットし配列化
		push(@temp,"[$pno] <font color=$t_color><b>$ptitle</b></font><!--T--> 投稿者：<font color=$link><b>$pna</b></font> <small>投稿日：$pda</small><p><blockquote>$pmsg<p>$purl</blockquote><!--$ph--><hr>\n");

	}

	# HTMLログを開く
	open (DB,"$pastfile") || &error("Can't open $pastfile");
	@past = <DB>;
	close(DB);

	# 規定の行数をオーバーすると、次ファイルを自動生成する
	if ($#past > $max_line) { &next_log; }

	@news = ();
	$i = 1;
	foreach $line (@past) {
		if ($line =~ /<!--FINISH-->/i) { last; }
		push (@news,$line);
		if ($line =~ /<!--BEGIN-->/i) { push (@news,@temp); }
	}

	push (@news,"<!--FINISH-->\n</body></html>\n");

	# ログを更新
	open (DB,">$pastfile") || &error("Can't write $pastfile");
	print DB @news;
	close(DB);
}

## --- 過去ログ次ファイル生成ルーチン
sub next_log {
	# 次ファイルのためのカウントアップ
	$no++;

	# カウントファイル更新
	open(NUM,">$past_num") || &error("Can't write $past_num");
	print NUM "$no";
	close(NUM);

	$pastfile  = "$past_dir\/$no\.html";

	&new_log;
}

## --- 新規過去ログファイル生成ルーチン
sub new_log {
	$new_flag = 1;

	$past[0] = "<html><head><title>過去ログ</title></head>\n";
	$past[1] = "$body<hr>\n";
	$past[2] = "<\!--BEGIN-->\n";
	$past[3] = "<\!--FINISH-->\n";
	$past[4] = "</body></html>\n";

	# 新規過去ログファイルを生成更新
	open(DB,">$pastfile") || &error("Can't write $pastfile");
	print DB @past;
	close(DB);

	# パーミッションを666へ
	chmod(0666,"$pastfile");
}
