#!/usr/local/bin/perl

## ----------------------------------------------------------------------------+
## YY-BOARD v2.1
## by おいどん (99/01/30) 
## E-MAIL: oidon@iod.co.jp
## WWW: http://www.iod.co.jp/~oidon/

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

## ---[注意事項ほか]-----------------------------------------------------------+
## 1.削除キーの暗号化には Crypt関数を使用しています。プロバイダがCrypt関数に対応
##   していない場合は、コメント削除機能は使用できません。
## 2.投稿があるとメール通知したい場合($mailing=1;)、プロバイダがsendmailを許可
## 　している場合のみです。（例：BIGLOBE,SO-NETは可能、InfoWeb,RIMNETは不可）
## 3.このスクリプトはフリーソフトです。このスクリプトを使用したいかなる損害に
##   対して作者は一切の責任を負いません。
## 4.設置に関する質問はサポート掲示板にお願いいたします。メールによる質問には
##   お答えできません。
## ----------------------------------------------------------------------------+

require './jcode.pl';			# jcode.plが同一ディレクトリにある場合

### --- 基本設定 --- ###
$title = "掲示板";			# タイトル名
$t_color = "9900cc";			# タイトルの色
$t_size  = 7;				# タイトルの大きさ(font size)
$t_face  = "ＭＳ Ｐゴシック";		# タイトル文字の種類(font face)
$backgif = "";				# 壁紙を指定
$bgcolor = "#faeaff";			# 背景色を指定
$text    = "#000000";			# 文字色を指定
$link    = "#0000FF";			# リンク色を指定（未リンク）
$vlink   = "#800080";			# リンク色を指定（既リンク）
$alink   = "#FF0000";			# リンク色を指定（リンク中）
$homepage = 'http://contest.thinkquest.gr.jp/tqj1998/10098/frame/mokuji.html';		# 戻り先のURL(index.htmlなど)
$homepage2 = 'http://contest.thinkquest.gr.jp/tqj1998/10098/noframe/mokuji.html';		# 戻り先のURL(index.htmlなど)
$max = 100;				# 親記事最大数 (あまり多くすると危険)
$pass = 'jom578';				# 管理者用マスタパスワード(英数字)

### --- 応用設定（ここからは場合に応じての設定内容）--- ###
$icon_mode = 0;				# アイコンモード (0=no 1=yes)
$res_sort = 0;				# 返信がつくと親記事をトップへ移動 (0=no 1=yes)
$title_gif = '.';			# タイトルにGIF画像を使用する時 (http://から記述)
$tg_w = '150';				# 上記タイトルGIF画像の幅(ピクセル)
$tg_h = '50';				#             〃       高さ(ピクセル)
$lockkey = 0;				# ファイルロック形式(0=no 1=symlink関数 2=open関数)
$lockfile = './yybbs.lock';		# ロックファイル名
$counter  = 0;				# ミニカウンタの設置 (0=no 1=yes)
$mini_fig = 5;				# ミニカウンタの桁数
$cnt_color = "#dd0000";			# テキストのとき：ミニカウンタの色
$gif_path = ".";			# ＧＩＦのとき　：画像までのディレクトリ
$mini_w = 8;				#       〃    　：画像の横サイズ
$mini_h = 12;				#       〃    　：画像の縦サイズ
$countfile = './count.dat';		# カウンタファイル
$tagkey = 0;				# タグの許可(0=no 1=yes)
$script  = './yybbs.cgi';		# スクリプトファイル
$logfile = './yybbs.log';		# ログファイル
$sbj_color = "#9933ff";			# 記事の[タイトル]部の色
$nam_color = "#9933ff";			# 記事の[名前]部の色
$tbl_color = "#FFFFFF";			# 記事表示部の下地の色
$obi_color = "#660099";			# 使い方説明/ワード検索画面のタイトルバックの色
$home_wid = 25;				# home.gifの画像横サイズ
$home_hei = 22;				#      〃       縦サイズ
$method = 'POST';			# methodの形式 (POST/GET)
$pagelog = 10;				# １ページ当たりの記事表示数 (親記事)
$mailing = 0;				# 投稿があるとメール通知する(0=no 1=yes)
$mailto = 'yumiko@sa2.son-net.or.jp';		# メールアドレス(メール通知する時)
$sendmail = '/usr/lib/sendmail';	# sendmailパス（メール通知する時）
$base_url = ".";			# 他サイトから投稿排除時に指定(http://から書く)
					# ↓文字色の設定。
@COLORS = ('000000','DF0000','008040','0000FF','C100C1','FF80C0','FF8040','000080');
$wrap = 'soft';				# 投稿フォーム改行形式 (soft=手動 hard=強制)
$autolink = 1;				# 自動リンク (0=no 1=yes)
$pastkey = 0;				# 過去ログ生成 (0=no 1=yes)
$nofile  = "./pastno.dat";		# 過去ログ用NOファイル
$past_dir = ".";			# 過去ログのディレクトリ
$log_line = '150';			# 過去ログ１ファイルの行数
$yybbs2 = "./yybbs2.cgi";		# 過去ログ管理ファイル
## 設定ここまで

### --- メイン処理 --- ###
	&form_decode;
	if ($mode eq "howto") { &howto; }
	if ($mode eq "find") { &find; }
	if ($mode eq "usr_del") { &usr_del; }
	if ($mode eq "msg_del") { &msg_del; }
	if ($mode eq "msg") { &regist; }
	if ($mode eq "res_msg") { &res_msg; }
	if ($mode eq "admin") { &admin; }
	if ($mode eq "admin_del") { &admin_del; }
	if ($mode eq "image") { &image; }
	&html_log;

### --- 記事表示部 --- ###
sub html_log {
	# クッキーを取得
	&get_cookie;

	# フォーム長を調整
	&get_agent;

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

	# 記事番号をカット
	shift(@lines);

	# 親記事のみの配列データを作成
	@new = ();
	foreach $line (@lines) {
		local($num,$k,$dt,$na,$em,$sub,$com,$url,$host,$pw,$color,$icon)
						 = split(/<>/,$line);
		# 親記事を集約
		if ($k eq "") { push(@new,$line); }
	}

	# レス記事はレス順につけるため配列を逆順にする
	@lines = reverse(@lines);

	# ヘッダを出力
	&header;

	# カウンタ処理
	if ($counter) { &counter; }

	# タイトル部
	if ($title_gif eq '.' || $title_gif eq '') {
		print "<center><font color=$t_color size=$t_size face=\"$t_face\">";
		print "<b>$title</b></font>\n";
	} else {
		print "<center><img src=\"$title_gif\" width=\"$tg_w\" height=\"$tg_h\">\n";
	}

	print "<hr width=90% size=1>\n";
	print "[<a href=\"$homepage\" target=_top>目次（Normal）へ</a>]\n";
        print "[<a href=\"$homepage2\" target=_top>目次（Light）へ</a>]\n";
	print "[<a href=\"$script?mode=howto\">掲示板の使い方</a>]\n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

	if ($pastkey) {
		print "[<a href=\"$yybbs2\">過去ログ</a>]\n";
	}
        
	print <<"EOM";
[<a href="$script?mode=msg_del">記事削除</a>]
[<a href="$script?mode=admin">管理用</a>]
<hr width=90% size=1></center>
<form method="$method" action="$script">
<input type=hidden name=mode value="msg">
<blockquote><table border=0>
<tr nowrap><td><b>おなまえ</b></td>
<td><input type=text name=name size="$nam_wid" value="$c_name"></td></tr>
<tr nowrap><td><b>Ｅメール</b></td>
<td><input type=text name=email size="$nam_wid" value="$c_email"></td></tr>
<tr nowrap><td><b>題　　名</b></td>
<td><input type=text name=subj size="$subj_wid">
　<input type=submit value="投稿する"><input type=reset value="リセット"></td></tr>
<tr><td colspan=2><b>コメント</b><br>
<textarea cols="$com_wid" rows=7 name=comment wrap="$wrap"></textarea></td></tr>
<tr nowrap><td><b>ＵＲＬ</b></td>
<td><input type=text size="$url_wid" name=url value="http://$c_url"></td></tr>
EOM
	if ($icon_mode) {
		print "<tr nowrap><td><b>イメージ</b></td><td><select name=icon>\n";
		foreach(0 .. $#icon1) {
			if ($c_icon eq "$icon1[$_]") {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
			} else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
	print "</select> <small>(あなたのイメージを選択して下さい)\n";
	print "[<a href=\"$script?mode=image\" target=_blank>画像イメージ参照</a>]</small></td></tr>\n";
	}

	print "<tr nowrap><td><b>削除キー</b></td>\n";
	print "<td><input type=password name=pwd size=8 maxlength=8 value=\"$c_pwd\">\n";
	print "<small>(自分の記事を削除時に使用。英数字で8文字以内)</small></td></tr>\n";
	print "<tr nowrap><td><b>文字色</b></td><td>\n";

	# クッキーの色情報がない場合
	if ($c_color eq "") {
		print "<input type=radio name=color value=\"$COLORS[0]\" checked>\n";
		print "<font color=$COLORS[0]>■</font>\n";
		foreach (1 .. $#COLORS) {
			print "<input type=radio name=color value=\"$COLORS[$_]\">\n";
			print "<font color=$COLORS[$_]>■</font>\n";
		}

	# クッキーの色情報がある場合
	} else {
		foreach (0 .. $#COLORS) {
		  if ($c_color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked>\n";
			print "<font color=$COLORS[$_]>■</font>\n";
		  } else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">\n";
			print "<font color=$COLORS[$_]>■</font>\n";
		  }
		}
	}

	print "</td></tr></table></form></blockquote><hr>\n";

	if ($FORM{'page'} eq '') { $page = 0; } 
	else { $page = $FORM{'page'}; }

	# 記事数を取得
	$end_data = @new - 1;
	$page_end = $page + ($pagelog - 1);
	if ($page_end >= $end_data) { $page_end = $end_data; }

	foreach ($page .. $page_end) {
		($number,$k,$date,$name,$email,$subj,$comment,$url,$host,$pwd,
				$color,$icon) = split(/<>/,$new[$_]);

		if ($email) { $name = "<a href=mailto:$email>$name</a>"; }
		if ($subj eq "") { $subj = "(無題)"; }
		if ($url) { $url = "<a href=http://$url target=_top><img src=\"$icon_dir/home.gif\" border=0 align=top HSPACE=10 WIDTH=\"$home_wid\" HEIGHT=\"$home_hei\"></a>"; }

		print <<"EOM";
<center><table border=1 width=95% cellpadding=5>
<tr><td bgcolor=$tbl_color>
<table border=0><tr>
<td valign=top>[<b>$number</b>] <font color=$sbj_color><b>$subj</b></font>
　投稿者：<font color=$nam_color><b>$name</b></font>
　<small>投稿日：$date</small> $url</td>
<td><form action="$script" method="$method">
<input type=hidden name=mode value="res_msg">
<input type=hidden name=resno value="$number">
<input type=submit value="返信"></form></td>
</tr></table>
<table border=0><tr>
EOM

		$icon =~ s/\n//g;
		if ($icon ne "") { print "<td><img src=\"$icon_dir/$icon\"></td>\n"; }
		else { print "<td width=37></td>\n"; }

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

		print "<td><font color=\"$color\">$comment</font></td></tr></table>\n";

		## レスメッセージを表示
		$flag = 0;
		foreach $line (@lines) {
		  ($rnum,$rk,$rd,$rname,$rem,$rsub,$rcom,$rurl,$rho,$rp,$rc,$ri)
							 = split(/<>/,$line);

		  if ($rem) { $rname = "<a href=mailto:$rem>$rname</a>"; }
		  if ($number eq "$rk"){
			if ($flag == 0) { print "<P><hr width=85\% size=1>\n"; $flag = 1; }

			print "<table><tr><td width=37></td>\n";

			$ri =~ s/\n//g;
			if ($ri ne "") {
				print "<td><img src=\"$icon_dir\/$ri\"></td>\n";
			} else {
				print "<td width=35></td>\n";
			}

			if ($rsub eq "") { $rsub = "(無題)"; }

			print "<td><Table><TR><TD><font color=$sbj_color><b>$rsub</b></font> \n";
			print "投稿者：<font color=$nam_color><b>$rname</b></font> - \n";
			print "<small>$rd</small></TD>\n";

			if ($rurl ne "") {
				print "<TD><a href=\"http://$rurl\" target=_top><img src=\"$icon_dir\/home.gif\" border=0 width=$home_wid height=$home_hei></a></TD>\n";
			}

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

			print "</TR></Table>\n";
			print "<font color=$rc>$rcom</font></td></tr></table>\n";
		  }
		}
		print "</td></tr></table><P>\n";

	}
	print "<table border=0><tr>\n";

	# 改頁処理
	$next_line = $page_end + 1;
	$back_line = $page - $pagelog;

	# 前頁処理
	if ($back_line >= 0) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$back_line\">\n";
		print "<input type=submit value=\"前の$pagelog件\">\n";
		print "</form></td>\n";	
	}

	# 次頁処理
	if ($page_end ne "$end_data") {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$next_line\">\n";
		print "<input type=submit value=\"次の$pagelog件\">\n";
		print "</form></td>\n";
	}

	print "</tr></table><P>\n";
	&footer;
	exit;
}

### --- ログ書き込み処理 --- ###
sub regist {
	# 他サイトからのアクセスを排除
	if ($base_url ne ".") {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/\?(.|\n)*//ig;
		$ref_url =~ s/\%7E/\~/ig;
		if ($ref_url !~ $base_url) { &error("不正なアクセスです。"); }
	}

	# 名前とコメントは必須
	if ($FORM{'name'} eq "") { &error("名前が入力されていません。"); }
	if ($FORM{'comment'} eq "") { &error("コメントが入力されていません。"); }

	# ホスト名を取得
	$host  = $ENV{'REMOTE_HOST'};
	$addr  = $ENV{'REMOTE_ADDR'};
	if ($host eq "" || $host eq "$addr") {
		($p1,$p2,$p3,$p4) = split(/\./,$addr);
		$temp = pack("C4",$p1,$p2,$p3,$p4);
		$host = gethostbyaddr("$temp", 2);
		if ($host eq "") { $host = $addr; }
	}

	# クッキーを発行
	&set_cookie;

	# ファイルロック
	if ($lockkey == 1) { &lock1; }
	elsif ($lockkey == 2) { &lock2; }

	# ログを開く
	open(IN,"$logfile") || &error("Can't open $logfile");
	@lines = <IN>;
	close(IN);

	# 記事NO処理
	$oya = $lines[0];
	$oya =~ s/\n//;
	shift(@lines);

	# 二重投稿の禁止
	local($flag) = 0;
	foreach $line (@lines) {
		($knum,$kk,$kd,$kname,$kem,$ksub,$kcom) = split(/<>/,$line);
		if ($name eq "$kname" && $comment eq "$kcom") {
			$flag=1; last;
		}
	}
	if ($flag) { &error("二重投稿は禁止です"); }

	# 親記事の場合、記事Noをカウントアップ
	if ($FORM{'resno'} eq "") { $oya++; $number=$oya; }
	else { $number = $oya; }

	# 削除キーを暗号化
	if ($FORM{'pwd'} ne "") { &passwd_encode($FORM{'pwd'}); }

	# ログをフォーマット
	$new_msg = "$number<>$FORM{'resno'}<>$date<>$name<>$email<>$subj<>$comment<>$url<>$host<>$ango<>$color<>$FORM{'icon'}<>\n";

	## 自動ソート時は、レス記事投稿時は親記事はトップへ移動
	if ($res_sort && $FORM{'resno'} ne "") {
		@res_data = ();
		@new = ();
		foreach $line (@lines) {
		  $flag = 0;
		  ($num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico) = split(/<>/,$line);

		  # 親記事を抜き出す
		  if ($k eq "" && $FORM{'resno'} eq "$num") {
			$new_line = "$line";
			$flag = 1;
		  }
		  # 関連のレス記事を抜き出す
		  elsif ($k eq "$FORM{'resno'}") {
			push(@res_data,$line);
			$flag = 1;
		  }
		  if ($flag == 0) { push(@new,$line); }
		}

		# 関連レス記事をトップへ
		unshift(@new,@res_data);

		# 新規メッセージをトップへ
		unshift(@new,$new_msg);

		# 親記事をトップへ
		unshift(@new,$new_line);


	## 親記事の場合、最大記事数を超える記事をカット
	} elsif ($FORM{'resno'} eq "") {

		$i = 0;
		$stop = 0;
		foreach $line (@lines) {
		    ($num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico)=split(/<>/,$line);

		    if ($k eq "") { $i++; }
		    if ($i > $max-1) {
			$stop = 1;
			if ($pastkey == 0) { last; }
			else {
				if ($k eq "") { $kflag=1; push(@past_data,$line); }
				else { push(@past_res,$line); }
			}
		    }
		    if ($stop == 0) { push(@new,$line); }
		}

		## 過去記事生成
		if ($kflag) {
			@past_res = reverse(@past_res);
			push(@past_data,@past_res);
			&pastlog;
		}

		unshift(@new,$new_msg);

	## レス記事は記事数の調整はしない
	} else {
		@res_data = ();
		@new = ();

		foreach $line (@lines) {
		  $flag = 0;
		  ($num,$k,$d,$na,$em,$sub,$com,$u,$ho,$p,$c,$ico) = split(/<>/,$line);

		  # 親記事を抜き出す
		  if ($k eq "" && $FORM{'resno'} eq "$num") {
			$new_line = "$line";
			$flag = 2;
		  }

		  if ($flag == 0) { push(@new,$line); }
		  elsif ($flag == 2) {
			push(@new,$new_line);
			push(@new,$new_msg);
		  }
		}
	}

	# 親記事NOを付加
	unshift (@new,"$oya\n");

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

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

	# メール処理
	if ($mailing == 1 && $FORM{'email'} ne $mailto) { &mailto; }
}

### --- 返信フォーム --- ###
sub res_msg {
	# ログを読み込み
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# 親記事NOをカット
	@lines = splice(@lines,1);

	# フォーム長を定義
	&get_agent;

	# クッキーを取得
	&get_cookie;

	&header;
	print "以下は、記事NO <B>$FORM{'resno'}</B> に関する返信フォームです。<hr>\n";
	print "<center><table border=0 width=97\% cellpadding=10><tr>\n";
	print "<td bgcolor=$tbl_color>\n";

	$flag=0;
	foreach $line (@lines) {
		local($num,$k,$date,$name,$email,$sub,$com) = split(/<>/,$line);

		# 親記事を出力
		if ($k eq "" && $FORM{'resno'} eq "$num") {
			$resub = $sub;
			$flag=1;
			print "<B>【親記事】</B><P>\n";
			print "<font color=$sbj_color><B>$sub</B></font>\n";
			print "投稿者：<font color=$nam_color><B>$name</B></font>\n";
			print "<small>投稿日：$date</small><br>\n";
			print "<blockquote>$com</blockquote><P>\n";

		# レス記事を @res に格納
		} elsif ($k ne "" && $FORM{'resno'} eq "$k") {

			push(@res,$line);

		}
	}

	# レス記事を表示
	if (@res) {
		# 記事を逆順に
		@res = reverse(@res);

		$flag = 0;
		foreach $line (@res) {
			local($num,$k,$date,$name,$email,$sub,$com) = split(/<>/,$line);

			if ($flag == 0) {
				$flag=1;
				print "<hr size=1><B>【レス記事】</B><br>\n";
			}

			print "<blockquote><font color=$sbj_color><B>$sub</B></font>\n";
			print "投稿者：<font color=$nam_color><B>$name</B></font> - \n";
			print "<small>$date</small><br>\n";
			print "<blockquote>$com</blockquote></blockquote><br>\n";
		}
	}

	# タイトル名
	if ($resub eq "") { $resub = "無題"; }
	if ($resub !=~ /^Re\:/) { $resub = "Re\: $resub"; }

	print <<"EOM";
</td></tr></table></center><hr>
<form action="$script" method="$method">
<input type=hidden name=mode value="msg">
<input type=hidden name=resno value="$FORM{'resno'}">
<blockquote>
<table><tr nowrap><td><b>おなまえ</b></td>
<td><input type=text name=name value="$c_name" size=$nam_wid></td></tr>
<tr nowrap><td><b>Ｅメール</b></td>
<td><input type=text name=email value="$c_email" size=$nam_wid></td></tr>
<tr nowrap><td><b>タイトル</b></td>
<td><input type=text name=subj value="$resub" size=$subj_wid>
<input type=submit value="返信する"><input type=reset value="リセット"></td></tr>
<tr><td colspan=2><b>メッセージ</b><br>
<textarea cols=$com_wid rows=5 name=comment wrap="$wrap"></textarea></td></tr>
<tr nowrap><td><b>ＵＲＬ</b></td><td><input type=text name=url value="http://$c_url" size=$url_wid></td></tr>
EOM
	if ($icon_mode) {
		print "<tr nowrap><td><b>イメージ</b></td><td><select name=icon>\n";
		foreach(0 .. $#icon1) {
			if ($c_icon eq "$icon1[$_]") {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";
			} else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
		print "</select> <small>(あなたのイメージを選択して下さい)\n";
		print "[<a href=\"$script?mode=image\" target=_blank>イメージ画像参照</a>]</small></td></tr>\n";
	}

	print "<tr nowrap><td><b>削除キー</b>";
	print "<td><input type=password name=pwd size=8 maxlength=8 value=\"$c_pwd\">\n";
	print "<small>(自分の記事を削除時に使用。英数字で8文字以内)</small></td></tr>\n";
	print "<tr><td><b>文字色</b></td><td>\n";

	# クッキーの色情報がない場合
	if ($c_color eq "") {
		print "<input type=radio name=color value=\"$COLORS[0]\" checked><font color=$COLORS[0]>■</font>\n";
		foreach (1 .. $#COLORS) {
		print "<input type=radio name=color value=\"$COLORS[$_]\"><font color=$COLORS[$_]>■</font>\n";
		}
	# クッキーの色情報がある場合
	} else {
		foreach (0 .. $#COLORS) {
			if ($c_color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked><font color=$COLORS[$_]>■</font>\n";
			} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\"><font color=$COLORS[$_]>■</font>\n";
			}
		}
	}

	print "</td></tr></table></form>\n</blockquote><P><hr><P>\n";
	&footer;
	exit;
}

### --- フォームからのデータ処理 --- ###
sub form_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/</\&lt\;/g;
			$value =~ s/>/\&gt\;/g;
			$value =~ s/\"/\&quot\;/g;
		} else {
			$value =~ s/<!--(.|\n)*-->//g;
			$value =~ s/<>/&lt\;&gt\;/g;
		}

		# 一括削除用
		if ($name eq 'del') { push(@delete,$value); }

		$FORM{$name} = $value;
	}

	$name = $FORM{'name'};
	$comment = $FORM{'comment'};
	$comment =~ s/\r\n/<br>/g;
	$comment =~ s/\r|\n/<br>/g;
	$email = $FORM{'email'};
	$url  = $FORM{'url'};
	$url  =~ s/^http\:\/\///;
	$mode = $FORM{'mode'};
	$subj = $FORM{'subj'};
	$pwd  = $FORM{'pwd'};
	$icon = $FORM{'icon'};
	$color = $FORM{'color'};

	# 日時の取得
	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
	if ($year < 10) { $year = "0$year"; }
	$mon++;
	if ($mon  < 10) { $mon  = "0$mon";  }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($min  < 10) { $min  = "0$min";  }
	if ($sec  < 10) { $sec  = "0$sec";  }
	$week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];

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

### --- 掲示板の使い方メッセージ --- ###
sub howto {
	if ($tagkey == 0) { $tag_msg = "投稿内容には、<b>タグは一切使用できません。</b>\n"; }
	else { $tag_msg = "コメント欄には、<b>タグ使用をすることができます。</b>\n"; }

	&header;
	print <<"HTML";
[<a href="$script?">掲示板にもどる</a>]
<table width=100%><tr>
<th bgcolor=$obi_color>
<font color=$tbl_color>掲示板の利用上の注意</font></table><P>
<center><table width=90% border=1 cellpadding=10><td bgcolor=$tbl_color>
<OL><LI>この掲示板は<b>クッキー対応</b>です。１度記事を投稿いただくと、おなまえ、Ｅメール、ＵＲＬ、削除キーの情報は２回目以降は自動入力されます。（ただし利用者のブラウザがクッキー対応の場合）<P>
<LI>$tag_msg<P>
<LI>記事を投稿する上での必須入力項目は<b>「おなまえ」</b>と<b>「メッセージ」</b>です。Ｅメール、ＵＲＬ、題名、削除キーは任意です。<P>
<LI>記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。<P>
<LI>記事の投稿時に<b>「削除キー」</b>にパスワード（英数字で8文字以内）を入れておくと、その記事は次回<b>削除キー</b>によって削除することができます。<P>
<LI>記事の保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。<P>
<LI>既存の記事に<b>「返信」</b>をすることができます。各記事の上部にある<b>「返信」</b>ボタンを押すと返信用フォームが現れます。<P>
<LI>過去の投稿記事から<b>「キーワード」によって簡易検索ができます。</b>トップメニューの<a href="$script?mode=find">「ワード検索」</a>のリンクをクリックすると検索モードとなります。<P>
<LI>管理者が著しく不利益と判断する記事や他人を誹謗中傷する記事は\予\告\なく削除することがあります。</OL></blockquote>
</td></tr></table>
</center><hr><P>
HTML
	&footer;
	exit;
}

### --- ワード検索サブルーチン --- ###
sub find {
	&header;
	print <<"HTML";
[<a href="$script?">掲示板にもどる</a>]
<table width=100%><tr><th bgcolor=$obi_color>
<font color=$tbl_color>ワード検索</font></table><P>
<center><table cellpadding=5>
<tr><td bgcolor=$tbl_color>
  <UL>
  <LI>検索したい<b>キーワード</b>を入力し、検索領域を選択して「検索ボタン」
      を押してください。
  <LI>キーワードは「半角スペース」で区切って複数指定することができます。
  </OL>
</td></tr></table>
<P><form action="$script" method="$method">
<input type=hidden name=mode value="find">
<table border=1>
<tr><th colspan=2>キーワード <input type=text name=word size=30></th></tr>
<tr><td>検索条件</td>
<td><input type=radio name=cond value="and" checked>AND
<input type=radio name=cond value="or">OR</td></tr>
<tr><th colspan=2><input type=submit value="検索する"><input type=reset value="リセット"></th></tr>
</table>
</form></center>
HTML
	# ワード検索の実行と結果表示
	if ($FORM{'word'} ne ""){

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

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

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

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

		foreach $line (@new) {
			($num,$k,$date,$name,$email,$subj,$com,$url) = split(/<>/,$line);
			if ($subj eq "") { $subj = "no 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=$sbj_color><b>$subj</b></font>\n";
			print "投稿者：<b>$name</b> <small>投稿日：$date</small><P>\n";
			print "<blockquote>$com<P>$url</blockquote><hr size=1>\n";
		}

		print "</OL><P>\n";
	}

	&footer;
	exit;
}

### --- ブラウザを判断しフォーム幅を調整 --- ###
sub get_agent {
	# ブラウザ名を取得
	$agent = $ENV{'HTTP_USER_AGENT'};

	if ($agent =~ /MSIE 3/i) { 
		$nam_wid  = 30;
		$subj_wid = 40;
		$com_wid  = 65;
		$url_wid  = 48;
		$nam_wid2 = 20;
	} elsif ($agent =~ /MSIE 4/i) { 
		$nam_wid  = 30;
		$subj_wid = 40;
		$com_wid  = 65;
		$url_wid  = 78;
		$nam_wid2 = 20;
	} else {
		$nam_wid  = 20;
		$subj_wid = 25;
		$com_wid  = 56;
		$url_wid  = 50;
		$nam_wid2 = 10;
	}
}

### --- クッキーの発行 --- ###
sub set_cookie { 
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg)
		 			= gmtime(time + 30*24*60*60);
	if ($yearg < 10) { $yearg = "0$yearg"; }
	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 = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday',
					'Saturday')[$wdayg];
	$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
	$cook="name\:$name\,email\:$email\,url\:$url\,pwd\:$pwd\,icon\:$icon\,color\:$color";
	print "Set-Cookie: YYBBS=$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{'YYBBS'});
	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_icon  = $COOKIE{'icon'};
	$c_color = $COOKIE{'color'};

	if ($FORM{'name'})  { $c_name  = $FORM{'name'}; }
	if ($FORM{'email'}) { $c_email = $FORM{'email'}; }
	if ($FORM{'url'})   { $c_url   = $url; }
	if ($FORM{'pwd'})   { $c_pwd   = $FORM{'pwd'}; }
	if ($FORM{'icon'})  { $c_icon  = $FORM{'icon'}; }
	if ($FORM{'color'}) { $c_color = $FORM{'color'}; }
}

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

	if ($_[1] ne '0') { &header; }

	print "<center><hr width=75\%><h3>システムエラー発生！</h3>\n";
	print "<P><font color=$t_color><B>$_[0]</B></font>\n";
	print "<P><hr width=75\%></center>\n";
	&footer;
	exit;
}

### --- 削除画面 --- ###
sub msg_del {
	if ($FORM{'action'} eq 'admin' && $FORM{'pass'} ne "$pass") {
		&error("パスワードが違います。");
	}

	open(DB,$logfile) || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# 親記事のみの配列データを作成
	@NEW = ();
	foreach (1 .. $#lines) {
		($number,$k,$date,$name,$email,$subj,$comment,$url,$host,$pwd)
			 				= split(/<>/,$lines[$_]);
		$flag = 0;
		# レス記事を外す
		if ($k > 0) { $flag = 1; }
		if ($flag == 0) { push(@NEW,$lines[$_]); }
	}

	@lines = reverse(@lines);

	&header;
	print "[<a href=\"$script?\">掲示板へ戻る</a>]\n";
	print "<table width=100\%><tr><th bgcolor=$obi_color>\n";
	print "<font color=$tbl_color>コメント削除画面</font></th></tr></table>\n";
	print "<P><center>\n";
	print "<table border=0 cellpadding=5><tr>\n";
	print "<td bgcolor=$tbl_color>\n";

	if ($FORM{'action'} eq '') {
		print "■投稿時に記入した「削除キー」により、記事を削除します。<br>\n";
	}

	print "■削除したい記事のチェックボックスにチェックを入れ、下記フォームに「削除キー」を入力してください。<br>\n";
	print "■親記事を削除する場合、そのレスメッセージも同時に消滅してしまうことになりますので、ご注意ください。<br>\n";
	print "</td></tr></table><P>\n";
	print "<form action=\"$script\" method=$method>\n";

	if ($FORM{'action'} eq '') {
		print "<input type=hidden name=mode value=\"usr_del\">\n";
		print "<b>削除キー</b> <input type=text name=del_key size=10>\n";
	} else {
		print "<input type=hidden name=mode value=\"admin_del\">\n";
		print "<input type=hidden name=action value=\"admin\">\n";
		print "<input type=hidden name=pass value=\"$FORM{'pass'}\">\n";
	}

	print "<input type=submit value=\"削除する\"><input type=reset value=\"リセット\">\n";
	print "<P><table border=1>\n";
	print "<tr><th>削除</th><th>記事No</th><th>題名</th><th>投稿者</th><th>投稿日</th><th>コメント</th>\n";

	if ($FORM{'action'} eq 'admin') { print "<th>ホスト名</th>\n"; }

	print "</tr>\n";

	if ($FORM{'page'} eq '') { $page = 0; }
	else { $page = $FORM{'page'}; }

	# 記事数を取得
	$end_data = @NEW - 1;
	$page_end = $page + ($pagelog - 1);

	if ($page_end >= $end_data) { $page_end = $end_data; }
	foreach ($page .. $page_end) {
		($num,$k,$date,$name,$email,$sub,$com,$url,$host,$pw,$color)
			 				= split(/<>/,$NEW[$_]);
		if ($email ne "") { $name="<a href=mailto:$email>$name</a>"; }
		if ($sub eq "") { $sub = "(無題)"; }

		$com =~ s/<br>/ /g;
		if ($tagkey) { $com =~ s/</&lt;/g; $com =~ s/>/&gt;/g; }

		if (length($com) > 60) { $com = substr($com,0,58); $com = $com . '..'; }

		if ($FORM{'action'} eq 'admin') {
			print "<tr><th><input type=checkbox name=del value=\"$date\"></th>\n";

		} else {
			print "<tr><th><input type=radio name=del value=\"$date\"></th>\n";
		}

		print "<th>$num</th><td>$sub</td><td>$name</td>\n";
		print "<td><small>$date</small></td><td>$com</td>\n";

		if ($FORM{'action'} eq 'admin') { print "<td>$host</td>\n"; }

		print "</tr>\n";

		## レスメッセージを表示
		foreach (1 .. $#lines) {
			($rnum,$rk,$rd,$rname,$rem,$rsub,$rcom,$rurl,$rho,$rp,$rc)
							=split(/<>/,$lines[$_]);

			$rcom =~ s/<br>/ /g;
			if ($tagkey) { $rcom =~ s/</\&lt\;/g; $rcom =~ s/>/\&gt\;/g; }
			if (length($rcom) > 60) { $rcom=substr($rcom,0,58); $rcom=$rcom . '..'; }
			if ($num eq "$rk") {

				if ($FORM{'action'} eq 'admin') {
					print "<tr><th><input type=checkbox name=del value=\"$rd\"></th>\n";
				} else {
					print "<tr><th><input type=radio name=del value=\"$rd\"></th>\n";
				}

				print "<td colspan=2 align=center><b>$num</b>へのレス</td>\n";
				print "<td>$rname</td><td><small>$rd</small></td><td>$rcom</td>\n";

				if ($FORM{'action'} eq 'admin') { print "<td>$rho</td>\n"; }

				print "</tr>\n";
			}
		}
	}
	print "</table></form>\n";
	print "<table border=0 width=100%><tr>\n";

	# 改頁処理
	$next_line = $page_end + 1;
	$back_line = $page - $pagelog;

	# 前頁処理
	if ($back_line >= 0) {
	  print "<td><form method=\"$method\" action=\"$script\">\n";
	  print "<input type=hidden name=page value=\"$back_line\">\n";
	  print "<input type=hidden name=mode value=msg_del>\n";
	  print "<input type=submit value=\"前の親記事$pagelog件\">\n";

	  if ($FORM{'action'} eq 'admin') {
		print "<input type=hidden name=action value=\"admin\">\n";
		print "<input type=hidden name=pass value=\"$FORM{'pass'}\">\n";
	  }

	  print "</form></td>\n";
	}

	# 次頁処理
	if ($page_end ne $end_data) {
	  print "<td><form method=\"$method\" action=\"$script\">\n";
	  print "<input type=hidden name=page value=\"$next_line\">\n";
	  print "<input type=hidden name=mode value=msg_del>\n";
	  print "<input type=submit value=\"次の親記事$pagelog件\">\n";

	  if ($FORM{'action'} eq 'admin') {
		print "<input type=hidden name=action value=\"admin\">\n";
		print "<input type=hidden name=pass value=\"$FORM{'pass'}\">\n";
	  }

	  print "</form></td>\n";
	}

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

### --- 記事削除処理 --- ###
sub usr_del {
	if ($FORM{'del_key'} eq "") { &error("削除キーが入力モレです。"); }
	if ($FORM{'del'} eq "") { &error("ラジオボタンの選択がありません。"); }

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

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

	# 親記事NO
	$oya = $lines[0];
	if ($oya =~ /<>/) { &error("ログが正しくありません。");	}

	shift(@lines);
	@lines = reverse(@lines);

	## 削除キーによる記事削除 ##
	@new=();
	foreach $line (@lines) {
		$dflag = 0;
		($num,$k,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line);

		if ($FORM{'del'} eq "$dt") {
			$dflag = 1;
			$encode_pwd = $pw;
			$del_num = $num;
			if ($k eq '') { $oyaflag=1; }

		} elsif ($oyaflag && $del_num eq "$k") {
			$dflag = 1;
		}

		if ($dflag == 0) { push(@new,$line); }
	}

	if ($del_num eq '') { &error("$FORM{'del'}削除対象記事が見つかりません。"); }
	else {
		if ($encode_pwd eq '') { &error("削除キーが設定されていません。"); }
		$plain_text = $FORM{'del_key'};
		&passwd_decode($encode_pwd);
		if ($check eq 'no') { &error("パスワードが違います。"); }
	}

	# 親記事NOを付加
	@new = reverse(@new);
	unshift(@new,$oya);

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

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

	# 削除画面にもどる
	&msg_del;
}

## 管理者一括記事削除
sub admin_del {
	if ($FORM{'pass'} ne "$pass") { &error("パスワードが違います。"); }
	if ($FORM{'del'} eq "") { &error("チェックボックスの選択がありません。"); }

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

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

	# 親記事NO
	$oya = $lines[0];
	if ($oya =~ /<>/) {
		&error("ログが正しくありません。<P><small>\(v2.5以前のログの場合は変換の必要があります\)<\/small>");
	}

	shift(@lines);
	@lines = reverse(@lines);

	## 削除処理
	foreach $line (@lines) {
		$dflag=0;
		($num,$k,$dt,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/,$line);

		foreach $del (@delete) {
			if ($del eq "$dt") {
				$dflag = 1;
				$del_num = $num;
				if ($k eq '') { $oyaflag=1; }

			} elsif ($oyaflag && $del_num eq "$k") {
				$dflag = 1;
			}
		}
		if ($dflag == 0) { push(@new,$line); }
	}

	# 親記事NOを付加
	@new = reverse(@new);
	unshift(@new,$oya);

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

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

	# 削除画面にもどる
	&msg_del;
}

## 管理者入室画面
sub admin {
	&header;
	print "<center><h4>パスワードを入力してください。</h4>\n";
	print "<form action=\"$script\" method=$method>\n";
	print "<input type=hidden name=mode value=\"msg_del\">\n";
	print "<input type=hidden name=action value=\"admin\">\n";
	print "<input type=password name=pass size=8><input type=submit value=\"認証\">\n";
	print "</form></center><P><hr><P>\n";
	&footer;
	exit;
}

### --- カウンタ処理
sub counter {
	# カウントファイル読み込み
	open(NO,"$countfile") || &error("Can't open $countfile",'0');
	$cnt = <NO>;
	close(NO);

	# カウントアップ
	if ($FORM{'mode'} eq "") {
		$cnt++;

		# カウントファイル更新
		open(NO,">$countfile") || &error("Can't write $countfile",'0');
		eval 'flock(NO,2);';
		print NO $cnt;
		eval 'flock(NO,8);';
		close(NO);

	}

	# 桁数調整
	while(length($cnt) < $mini_fig) { $cnt = '0' . "$cnt"; }
	@cnts = split(//,$cnt);

	print "<table border=0 align=left><tr><td>\n";

	# カウンタ表示
	if (-e "$gif_path/0.gif") {
	  foreach (0 .. $#cnts) {
		print "<img src=\"$gif_path/$cnts[$_]\.gif\" alt=\"$cnts[$_]\" width=\"$mini_w\" height=\"$mini_h\">";
	  }
	} else {
	  print "<font color=$cnt_color face=\"verdana,Times New Roman,Arial\">$cnt</font>";
	}

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

### --- ロックファイル（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 {
			open(LOCK,">$lockfile");
			close(LOCK);
			$flag = 1;
			last;
		}
	}
	if ($flag == 0) { &error("LOCK is BUSY"); }

}

### --- メール送信
sub mailto {
	$mail_subj = "$title に投稿がありました。";

    	&jcode'convert(*mail_subj,'jis');
    	&jcode'convert(*name,'jis');
    	&jcode'convert(*subj,'jis');
    	&jcode'convert(*comment,'jis');

	$comment =~ s/<br>/\n/g;
	$comment =~ s/&lt;/</g;
	$comment =~ s/&gt;/>/g;

	open(MAIL,"| $sendmail -t") || &error("Can't post sendmail");
	print MAIL "X-Mailer: YYBBS MAILER\n";
	print MAIL "To: $mailto\n";

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

	print MAIL "From: $email\n";
	print MAIL "Subject: $mail_subj\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "Content-type: text/plain\n";
	print MAIL "\n\n";
	print MAIL "$mail_subj\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "TIME : $date\n";
	print MAIL "NAME : $name\n";
	print MAIL "EMAIL: $FORM{'email'}\n";
	if ($url ne "") { print MAIL "URL  : http://$url\n"; }

	if ($FORM{'resno'} ne "") { $subj = "(Res Message)"; }
	elsif ($FORM{'resno'} eq "" && $subj eq "") { $subj = "no title"; }

	print MAIL "TITLE: $subj\n\n";
	print MAIL "$comment\n\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
}

### --- パスワード暗号処理
sub passwd_encode {
	$now = time;
	($p1, $p2) = unpack("C2", $now);
	$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
	@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
	$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
	$ango = crypt($_[0], $nsalt);
}

### --- パスワード照合処理
sub passwd_decode {
	if ($_[0] =~ /^\$1\$/) { $crptkey = 3; }	# FreeBSDサーバ対応
	else { $crptkey = 0; }

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

### --- HTMLのヘッダー --- ###
sub header { 
	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";
	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
	print "<title>$title</title></head>\n";

	# bodyタグ
	if ($backgif) { $bgkey = "background=\"$backgif\" bgcolor=$bgcolor"; }
	else { $bgkey = "bgcolor=$bgcolor"; }
	print "<body $bgkey text=$text link=$link vlink=$vlink alink=$alink>\n";
}

### --- HTMLのフッター --- ###
sub footer {
	## MakiMakiさんの画像使用の有無に関わらずこの２箇所のリンク部を
	## 削除することはできません。
	print "<br><br><center><small><!-- $ver -->\n";
	print "<a href=\"http://www.iod.co.jp/~oidon/\" target=_top>OIDON</a> &amp; \n";
	print "<a href=\"http://village.infoweb.ne.jp/~fwhf2602/\" target=_top>MakiMaki</a>\n";
	print "</small></center>\n";
	print "</body></html>\n";
}

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

### --- イメージ画像表示 --- ###
sub image {
	&header;
	print "<center><hr width=75\%>\n";
	print "<h3>イメージ画像サンプル</h3>\n";
	print "現在登録されているイメージ画像は以下のとおりです。\n";
	print "<hr width=75\%>\n";
	print "<P><table border=1 cellpadding=5>\n";

	foreach (0 .. $#icon1) {
		print "<tr><th>$icon2[$_]</th>\n";
		print "<th><img src=\"$icon_dir\/$icon1[$_]\"></th></tr>\n";
	}

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

### --- 過去ログ生成 --- ###
sub pastlog {
	$new_flag = 0;

	# 過去NOを開く
	open(NO,"$nofile") || &error("Can't open $nofile");
	$count = <NO>;
	close(NO);

	# 過去ログのファイル名を定義
	$pastfile  = "$past_dir/$count\.html";

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

	# 過去ログを開く
	if ($new_flag == 0) {
		open (IN,"$pastfile") || &error("Can't open $pastfile");
		@past = <IN>;
		close(IN);
	}

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

#	$pst_line = $lines[$max-1];
#	$pst_line =~ s/\n//g;

#	@past_data = reverse(@past_data);

	foreach $pst_line (@past_data) {
		($pnum,$pk,$pdt,$pname,$pemail,$psub,$pcom,$purl,$phost,$ppw)
		 				= split(/<>/, $pst_line);
		if ($psub eq "") { $psub = "(無題)"; }
		if ($pemail) { $pname = "<a href=mailto:$pemail>$pname</a>"; }
		if ($purl) { $purl="<a href=http://$purl target=_top>http://$purl</a>"; }
		if ($pk) { $pnum = "$pkへのレス"; }

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

		# 保存記事をフォーマット
		$html = <<"HTML";
[$pnum] <font color=$sbj_color><b>$psub</b></font><!--T--> 投稿者：<font color=$nam_color><b>$pname</b></font> <small>投稿日：$pdt</small><p><blockquote>$pcom<p>$purl</blockquote><!--$phost--><hr>
HTML
		push(@htmls,"$html");
	}

	
	@news = ();
	foreach $line (@past) {
		if ($line =~ /<!--OWARI-->/i) { last; }
		push (@news,$line);
		if ($line =~ /<!--HAJIME-->/i) { push (@news,@htmls); }
	}

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

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

}

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

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

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

	&new_log;
}

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

	if ($backgif) { $bgkey = "background=\"$backgif\" bgcolor=$bgcolor"; }
	else { $bgkey = "bgcolor=$bgcolor"; }

	$past[0] = "<html><head><title>過去ログ</title></head>\n";
	$past[1] = "<body $bgkey text=$text link=$link vlink=$vlink alink=$alink><hr size=1>\n";
	$past[2] = "<\!--HAJIME-->\n";
	$past[3] = "<\!--OWARI-->\n";
	$past[4] = "</body></html>\n";

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

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