#!/usr/local/bin/perl

#┌─────────────────────────────────
#│ ROSE-BOARD v0.9  (2002/03/30)
#│ Copyright(C) CGI Kitchen 2002/02/02-
#│ http://aikon.milkcafe.to/
#└─────────────────────────────────
#┌─────────────────────────────────
#│ ROSE-BOARD v0.9  (2002/03/30)
#│ >>>ROSE-BOARD v0.8のフォーカス機能を任意設定に変更しました。
#└─────────────────────────────────
#┌─────────────────────────────────
#│  YY-BOARD v4.54 (2001/09/06)
#│  Copyright(C) Kent Web 1997-2001
#│  webmaster@kent-web.com
#│  http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'YYBBS v4.54';
#┌─────────────────────────────────
#│ このスクリプトはYY-BOARD v4.54に背景色選択機能を付加し
#│ CGI Kitchenが再配布するものです。
#│ 質問事項は当サイトのサポート掲示板で伺います。
#│ ケントさんにご迷惑をお掛けするような事は絶対にしないでくださいね。
#│ ご利用に際しては、ケントさんの利用既定もお読みいただくよう
#│ お願い申し上げます。
#│　　
#│ 画像はPearl boxさんからお借りしました。
#│ http://flap.vis.ne.jp/pxb/←こちらのアドレスです。
#│ ご利用に際しては、Pearl boxさんの利用既定もお読みいただくよう
#│ お願い申し上げます。
#└─────────────────────────────────
#
# 【ファイル構成例】
#
#  public_html (ホームディレクトリ)
#      |
#      +-- rose /  rose.cgi  [755]
#            |     rose.log  [666]
#            |     count.dat  [666]
#            |     jcode.pl   [644]
#            |     pastno.dat [666]
#            |
#            +-- img / home.gif, ...
#            |
#            +-- lock [777] /
#            |
#            +-- past [777] / 1.dat [666] ...
#
#============#
#  設定項目  #
#============#

# 文字コードライブラリ取込
require './jcode.pl';

# 戻り先のURL (index.htmlなど)
$homepage = "http://www.webdtp.com/bin/";

# スクリプトのファイル名
# → フルパスで指定する場合は http:// から記述
$script   = './rose.cgi';

# ログファイルを指定
# → フルパスで指定する場合は / から記述
$logfile  = './rose.log';

# タイトル名を指定
$title    = "ROSE-BOARD";

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

# タイトルの大きさ（ポイント数:スタイルシートで有効）
$t_size   = '14pt';

# タイトル文字のフォントタイプ
$t_face   = "Verdana";

# 本文の文字大きさ（ポイント数:スタイルシートで有効）
$b_size   = '10pt';

# 壁紙を指定する場合（http://から指定）
$backgif  = "http://www.webdtp.com/bin/Mon/bbs/img/pin.gif";

# 背景色を指定
$bgcolor  = "#FFFFFF";

# 文字色を指定
$text     = "#666666";

# リンク色を指定
$link       = "#DBE0D1";	# 未訪問
$vlink      = "#DBE0D1";	# 訪問済
$alink      = "#525252";	# 訪問中
$hovercolor = "#525252";   # リンクした時の文字の色

$t_text     = '#DBE0D1';   #フォーム内、タイトル等の文字の色
$blinkcolor = '#DBE0D1';   #リンクした時の背景色
$fbcolor    = '#DBE0D1';   #テキストエリア等の背景色　　
$f_ltcolor  = '#DBE0D1';   #フォームの枠の色
$f_lttcolor = '#525252';   #フォームの文字の色
$sacolor    = '#525252';   #スクロールバーの矢印の色
$sfcolor    = '#FFFFFF';   #スクロールバーの色
$stcolor    = '#FFFFFF';   #スクロールバーの地背景色
$hasencolor = '#DBE0D1';   #囲み線の色
$line_c     = "#DBE0D1";   #水平線の色
$table_c    = "#525252";   #入力フォームの背景色
$tblesize   = '400';       #ログ表示部のテーブルの幅（ピクセル）
$filter     = '80';        #背景を透けさせる度合いの設定です。
#設定数値が少ない程透ける程度が高くなります。透けさせたくない場合は、
#'100'にしてください。 
# 最大記事数
$max = 100;

# 管理者用マスタパスワード (英数字で８文字以内)
$pass = '0123';

# アイコン画像のある「ディレクトリ」
# → フルパスなら http:// から記述する
# → 最後は必ず / で閉じる
$imgurl = "./img/";

# アイコンモード (0=no 1=yes)
$icon_mode = 0;

# アイコンを定義（上下は必ずペアで）
@icon1 = ('1.gif','2.gif','3.gif','4.gif','5.gif','6.gif','7.gif','8.gif');
@icon2 = ('うさちゃん','ハムスター','ねこちゃん','くま','今晩のおかず','ウキウキうさ','今晩のおかず２','ドロねこ');

# 管理者専用アイコン機能 (0=no 1=yes)
# → 【使い方】記事投稿時に「管理者アイコン」を選択し、パスワードに
#             「管理用パスワード」を入力して下さい。
$my_icon = 0;

# 管理者専用アイコンの「ファイル名」を指定
$my_gif  = 'admin.gif';


# 返信がつくと親記事をトップへ移動 (0=no 1=yes)
$topsort = 1;

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

# タイトルにGIF画像を使用する時 (http://から記述)
$title_gif = "";
$tg_w = '150';	# GIF画像の幅 (ピクセル)
$tg_h = '50';	#    〃    高さ (ピクセル)

# ファイルロック形式
# → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 0;

# ロックファイル名
$lockfile = './lock/yybbs.lock';

# ミニカウンタの設置
# → 0=no 1=テキスト 2=GIF画像
$counter = 1;

# ミニカウンタの桁数
$mini_fig = 6;

# テキストのとき：ミニカウンタの色
$cnt_color = "#C0C0C0";

# ＧＩＦのとき：画像までのディレクトリ
# → 最後は必ず / で閉じる
$gif_path = "./img/";
$mini_w = 8;		# 画像の横サイズ
$mini_h = 12;		# 画像の縦サイズ

# カウンタファイル
$cntfile = './count.dat';

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

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

# 記事 [タイトル] 部の長さ (全角文字換算)
$sub_len = '12';

# 記事の [タイトル] 部の色
$sub_color = "#C0C0C0";#名前・NO.の文字色
$subt_color= "#FFFFFF";#タイトルの文字色

# 家アイコンの使用 (0=no 1=yes)
$home_icon = 1;
$home_gif = "home.gif";	# 家アイコンのファイル名
$home_wid = 16;		# 画像の横サイズ
$home_hei = 16;		#   〃  縦サイズ

# イメージ参照画面の表示形態
#  1 : JavaScript
#  2 : HTML (JavaScriptが不安定なブラザが多い場合はこちら）
$ImageView = 1;

# イメージ参照画面のサイズ (JavaScriptの場合)
$img_w = '550'; # 横幅
$img_h = '450'; # 高さ

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

# 記事の更新は method=POST 限定 (0=no 1=yes)
# → セキュリティ対策
$MethPost = 1;

# 同一IPアドレスからの連続投稿時間（秒数）
# → 連続投稿などの荒らし対策
# → 値を 0 にするとこの機能は無効になります
$wait = 0;

# １ページ当たりの記事表示数 (親記事)
$p_log = 10;

# 投稿があるとメール通知する (sendmail必須)
#  0 : 通知しない
#  1 : 通知するが、自分の投稿記事はメールしない。
#  2 : 通知する。自分の投稿記事も通知する。
$mailing = 0;

# メールアドレス(メール通知する時)
$mailto = 'xxx@xxx.xxx';

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

# 他サイトから投稿排除時に指定 (http://から書く)
$base_url = "";

# 背景色の設定。
@BCOLORS = ('#778E86','#808080','#AD4030','#86A8B7','#BD6C6A','#6B617C','#636F0D','#948C4E');
# 文字色の設定。
@FCOLORS = ('#FFFFFF','#DBE0D1','#EFEBE2','#EDF1F3','#F8F4F3','#E9DED8','#E8FFD0','#F1E0E0');

# 投稿フォーム改行形式 (soft=手動 hard=強制)
$wrap = 'soft';

# URLの自動リンク (0=no 1=yes)
#  --> タグ許可の場合は no とすること。
$autolink = 1;

# タグ広告挿入オプション (FreeWebなど）
#   → <!-- 上部 --> <!-- 下部 --> の代わりに「広告タグ」を挿入する。
#   → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。
$banner1 = '<!-- 上部 -->';	# 掲示板上部に挿入
$banner2 = '<!-- 下部 -->';	# 掲示板下部に挿入

# アクセス制限（ホスト名、IPアドレスを記述）
@deny = (
	"anonymizer.com",
	"cache*.*.interlog.com",
	"211.154.120.*",
	"",
	"",
	"",
	"",
	"",
	""
	);

#---(以下は「過去ログ」機能を使用する場合の設定です)---#
#
# 過去ログ生成 (0=no 1=yes)
$pastkey = 1;

# 過去ログ用NOファイル
$nofile  = './pastno.dat';

# 過去ログのディレクトリ
# → フルパスなら / から記述（http://からではない）
# → 最後は必ず / で閉じる
$pastdir = './past/';

# 過去ログ１ファイルの行数
# → この行数を超えると次ページを自動生成します
$log_line = '600';

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

# メイン処理
&decode;
&axs_check;
if ($mode eq "howto") { &howto; }
elsif ($mode eq "find") { &find; }
elsif ($mode eq "usr_del") { &usr_del; }
elsif ($mode eq "usr_edt") { &usr_edt; }
elsif ($mode eq "regist") { &regist; }
elsif ($mode eq "res") { &res_form; }
elsif ($mode eq "admin") { &admin; }
elsif ($mode eq "image") { &image; }
elsif ($mode eq "past") { &past; }
elsif ($mode eq "check") { &check; }
&html_log;

#----------------#
#  アクセス制限  #
#----------------#
sub axs_check {
	# ホスト名を取得
	&get_host;

	local($flag)=0;
	foreach (@deny) {
		if (!$_) { next; }
		$_ =~ s/\*/\.\*/g;
		if ($host =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("アクセスを許可されていません"); }
}

#--------------#
#  記事表示部  #
#--------------#
sub html_log {
	local($no,$reno,$date,$name,$mail,
		$sub,$comment,$url,$host,$pw,$fcolor,$icon,$p_flag);

	# クッキーを取得
	&get_cookie;

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

	# ヘッダを出力
	if ($ImageView == 1) { &header('ImageUp'); }
	else { &header; }

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

	# タイトル部
	print "<center>\n";
	if ($banner1 ne "<!-- 上部 -->") { print "$banner1<P>\n"; }
	if ($title_gif eq '') {
		print "<font color=\"$t_color\" size=6 face=\"$t_face\"><b><SPAN>$title</SPAN></b></font>\n";
	} else {
		print "<img src=\"$title_gif\" width=\"$tg_w\" height=\"$tg_h\" alt=\"$title\"><BR>\n";
	}

	print "<TABLE BORDER=0 CELLPADDING=2 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter ) BGCOLOR=\"$table_c\" width=$tblesize><TR><TD>\n";
        print "<TABLE BORDER=0 width=\"100%\" class=TC><TR><TD align=center>\n";
	print "<font face=Verdana>*<a href=\"$homepage\" target='_top'>HOME</a>*\n";
	print " *<a href=\"$script?mode=howto\">HELP</a>*\n";
	print " *<a href=\"$script?mode=find\">SEARCH</a>* \n";

	# 過去ログのリンク部を表示
	if ($pastkey) {	print " *<a href=\"$script?mode=past\">PAST</a>* </font>\n"; }

	print <<"EOM";
*<a href="$script?mode=admin"><font face=Verdana>ADMIN</a>* 
</td></tr></table></td></tr></table>

<form method="$method" action="$script">
<input type=hidden name=mode value="regist">
<TABLE BGCOLOR="$table_c" CELLPADDING=2 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter) width=$tblesize><TR><TD>
<TABLE WIDTH=100% class=TC><TR><TD>
<table border=0 cellspacing=0>
<tr>
  <td nowrap><font face=Verdana>Name</td>
  <td><input type=text name=name size="$nam_wid" value="$c_name"></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>Mail</td>
  <td><input type=text name=email size="$nam_wid" value="$c_email"></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>Title</b></td>
  <td nowrap><input type=text name=sub size="$sub_wid">
  </td>
</tr>
<tr>
  <td nowrap valign=top>
    <font face=Verdana>Message</b></td><td nowrap>
    <textarea cols=$com_wid rows=5 name=comment wrap="$wrap"></textarea>
  </td>
</tr>
<tr>
  <td nowrap><font face=Verdana>URL</b></td>
  <td><input type=text size="$sub_wid" name=url value="http://$c_url"></td>
</tr>
EOM

	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}
	if ($icon_mode) {
		print "<tr><td nowrap><font face=Verdana>Icon</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";

		# イメージ参照のリンク
		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\"><font face=Verdana>Icon image</a>]";
		} else {
			print "<b><font face=Verdana>[<a href=\"$script?mode=image\" target=\"_blank\"><font face=Verdana>Icon image</a>]";
		}
		print "</td></tr>\n";
	}

	print "<tr><td nowrap><font face=Verdana>Password</b></td>\n";
	print "<td><font face=Verdana><input type=password name=pwd size=8 maxlength=8 value=\"$c_pwd\">\n";
	print "<small>(英数字で8文字以内です)</small></td></tr>\n";
	print "<tr><td nowrap><font face=Verdana>Back color</b></td><td nowrap>\n";
	# クッキーの色情報がない場合
	if ($c_bcolor eq "") { $c_bcolor = $BCOLORS[0]; }

	foreach (0 .. $#BCOLORS) {
		if ($c_bcolor eq "$BCOLORS[$_]") {
			print "<input type=radio name=bcolor value=\"$BCOLORS[$_]\" checked>";
			print "<font color=\"$BCOLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=bcolor value=\"$BCOLORS[$_]\">";
			print "<font color=\"$BCOLORS[$_]\">■</font>\n";
		}
	}
        print "</td></tr>\n";
	print "<tr><td nowrap><font face=Verdana>Font color</b></td><td nowrap>\n";

	# クッキーの色情報がない場合
	if ($c_fcolor eq "") { $c_fcolor = $FCOLORS[0]; }

	foreach (0 .. $#FCOLORS) {
		if ($c_fcolor eq "$FCOLORS[$_]") {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\" checked>";
			print "<font color=\"$FCOLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\">";
			print "<font color=\"$FCOLORS[$_]\">■</font>\n";
		}
	}
        print "</td></tr>\n";

	print "<tr><td colspan=2 align=center><input type=submit value=\"WRITE\" class=BOT>&nbsp;<input type=reset value=\"RESET\" class=BOT>";
	print "</td></tr></table></TD></TR></TABLE></TD></TR></TABLE></form>\n";
	print "</blockquote><center>\n";

	# ページ区切り処理
	$start = $page + 1;
	$end   = $page + $p_log;

	# 記事を展開
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;
	$i=0;
	$flag=0;
	while (<IN>) {
		($no,$reno,$date,$name,$mail,$sub,
			$comment,$url,$host,$pw,$fcolor,$bcolor,$icon) = split(/<>/);
		if ($reno eq "") { $i++; }
		if ($i < $start) { next; }
		if ($i > $end) { next; }

		# 題名の長さ
		if (length($sub) > $sub_len*2) {
			$sub = substr($sub,0,$sub_len*2);
			$sub .= "...";
		}

		if ($mail) { $name = "<a href=\"mailto:$mail\">$name</a>"; }
		if ($home_icon && $url) { $url = "<a href=\"http://$url\" target='_blank'><img src=\"$imgurl$home_gif\" border=0 align=top alt='HomePage' width=\"$home_wid\" height=\"$home_hei\"></a>"; }
		elsif (!$home_icon && $url) { $url = "&lt;<a href=\"http://$url\" target='_blank'>HOME</a>&gt;"; }
		if (!$icon_mode) { $comment = "$comment"; }

		if (!$reno && $flag) {
			print "</TD></TR></TABLE></TD></TR></TABLE><br>\n";
			$flag=1;
		}
		if (!$reno) {
		print "<TABLE WIDTH=$tblesize BGCOLOR=\"$bcolor\" CELLPADDING=2 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter)><TR><TD>\n";
			print "<TABLE WIDTH='100%' class=TC><TR><TD>\n";
			$flag=1;
		}

		if ($reno) { print "<tr><td align=right colspan=2><hr noshade size=1 width='85%' color=\"$line_c\"></td></tr>\n"; }
		print "<tr><td><table border=0 cellpadding=2 width=100%><tr>\n";
		if ($reno) { print "<td rowspan=2 width=40><br></td>"; }

		print "<td nowrap><font color=\"$subt_color\">$sub</font>　";

		if (!$reno) { print "<font class=sf>by</font>&nbsp;<font color=\"$fcolor\">$name</font>"; }
		else { print "<font class=sf>by</font>&nbsp;<font color=\"$fcolor\">$name</font>  "; }
		print "</td>";
		print "<td nowrap><div align=right>$url&nbsp;</div>\n";
		if (!$reno) {
			print "</td><td align=right width=5%><form action=\"$script\" method=$method>\n";
			print "<input type=hidden name=mode value=res>\n";
			print "<input type=hidden name=no value=$no>\n";
			print "<input type=submit value='RES' class=BOT></td></div></form>\n";
		} else {
			print "</td>\n";		}

		print "</tr></TD></TR></TABLE><table border=0 cellpadding=5 width=100%><tr>\n";
		if ($reno) { print "<td width=40><BR></td>\n"; }
		# アイコンモード
		if ($icon_mode) { print "<td><table><tr><td><img src=\"$imgurl$icon\" alt=\"$icon\"></td></tr></table></td>"; }
	print "<td><font color=\"$fcolor\">$comment</font>\n";
	print "<div align=right><small>Date：$date<font color=\"$sub_color\"><small>No\.$no</small></font></small>\n";
	print "</TD></TR></TABLE>\n";
	}
	close(IN);
	print "</TD></TR></TABLE></TD></TR></TABLE></center>\n";

	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	$p_flag=0;
	print "<BR><blockquote><table cellpadding=10 STYLE=filter:Alpha(opacity=$filter,enabled=$filter)><tr><td><table class=TC width=\"100%\" BGCOLOR=\"$table_c\"><tr>\n";
	if ($back_page >= 0) {
		$p_flag=1;
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=submit value=\"BACK\" class=BOT>\n";
		print "</td></form>\n";
	}
	if ($next_page < $i) {
		$p_flag=1;
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=submit value=\"NEXT\" class=BOT>\n";
		print "</td></form>\n";
	}

	# ページ移動ボタン表示
	if ($p_flag) {
		print "<td width=10></td><td>\n";
		$x=1;
		$y=0;
		while ($i > 0) {
			if ($page == $y) { print "<font face=Verdana>+<b>$x</b>++\n"; }
			else { print "<a href=\"$script?page=$y\">$x</a>+\n"; }
			$x++;
			$y = $y + $p_log;
			$i = $i - $p_log;
		}
		print "</td>\n";
	}
	print "</tr></table></td></tr></table></blockquote>\n<div align=center>\n";
        print "<table CELLPADDING=2 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter) BGCOLOR=\"$table_c\" width=$tblesize><tr><td align=center>\n";
        print "<table class=TC width=\"100%\"><tr><td align=center nowrap>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<br>* 記事を修正・削除することができます *<br><BR>\n";
	print "<font face=Verdana>Processing <select name=mode>\n";
	print "<option value=usr_edt>Edit\n";
	print "<option value=usr_del>Delete</select>\n";
	print "<font face=Verdana>No. <input type=text name=no size=3>\n";
	print "<font face=Verdana>Password <input type=password name=pwd size=4 maxlength=8>\n";
	print "<input type=submit value=\"Update\" class=BOT></form></td></tr></table></td></tr></table>\n";

	# 著作権表示部
	# MakiMakiさんの画像使用の有無に関わらずこの2箇所のリンク部の
	# 削除改変を禁止します
   print "<BR><div align=center><table CELLPADDING=2 class=TA width='250' STYLE=filter:Alpha(opacity=$filter,enabled=$filter) BGCOLOR=\"$table_c\"><tr><td align=center>\n";
        print "<table class=TC width=\"100%\"><tr><td align=center>\n";
	print "<font face=veradana>- <a href='http://www.kent-web.com/' target='_top'><font face=Verdana>KENT</a> -";

	print "<br>- edit by <a href='http://aikon.milkcafe.to/' target='_top'><font face=Verdana>Aikon</a> -</tr></table></td></tr></table>\n";
	print "</small></div>\n</body>\n</html>\n";
	exit;
}

#----------------#
#  ログ書込処理  #
#----------------#
sub regist {
	local(@lines,@new,@tmp,$top,$no,$ip,$time2,$no2,$reno2,
		$date2,$name2,$mail2,$sub2,$com2,$flag,$ango,$stop,$match);

	# フォーム入力チェック
	&form_check;

	# 時間を取得
	&get_time;

	# クッキーを発行
	&set_cookie;

	# ファイルロック
	if ($lockkey) { &lock; }

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

	# 記事NO処理
	$top = shift(@lines);
	($no,$ip,$time2) = split(/<>/, $top);
	$no++;

	# 連続投稿チェック
	if ($addr eq $ip && $wait > $times - $time2)
		{ &error("連続投稿はもうしばらく時間をおいて下さい"); }

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

	# 重複チェック
	$flag=0;
	foreach (@lines) {
		($no2,$reno2,$date2,$name2,$mail2,$sub2,$com2) = split(/<>/);

		if ($in{'name'} eq $name2 && $in{'comment'} eq $com2) {
			$flag=1; last;
		}
	}
	if ($flag) { &error("重複投稿のため処理を中断しました"); }

	# パスワードを暗号化
	if ($in{'pwd'} ne "") { $ango = &encrypt($in{'pwd'}); }

	# 親記事の場合
	if ($in{'reno'} eq "") {

		$i=0;
		$stop=0;
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);
			$i++;
			if ($i > $max-1 && $reno2 eq "") { $stop=1; }
			if (!$stop) { push(@new,$_); }
			elsif ($stop && $pastkey) { push(@data,$_); }
		}
		unshift(@new,"$no<><>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'fcolor'}<>$in{'bcolor'}<>$in{'icon'}<>\n");
		unshift(@new,"$no<>$addr<>$times<>\n");

		# 過去ログ更新
		if ($data[0]) { &pastlog; }

		# 更新
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);
	}
	# レス記事の場合：トップソートあり
	elsif ($in{'reno'} && $topsort) {

		$match=0;
		@new=();
		@tmp=();
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);

			if ($in{'reno'} eq "$no2") {
				$match=1;
				push(@new,$_);
			}
			elsif ($in{'reno'} eq "$reno2") {
				push(@new,$_);
			}
			elsif ($match == 1 && $in{'reno'} ne "$reno2") {
				$match=2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'fcolor'}<>$in{'bcolor'}<>$in{'icon'}<>\n");
				push(@tmp,$_);
			}
			else { push(@tmp,$_); }
		}

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'fcolor'}<>$in{'bcolor'}<>$in{'icon'}<>\n");
		}
		push(@new,@tmp);

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);

	}
	# レス記事の場合：トップソートなし
	else {
		$match=0;
		@new=();
		foreach (@lines) {
			($no2,$reno2) = split(/<>/);

			if ($match == 0 && $in{'reno'} eq "$no2") { $match=1; }
			elsif ($match == 1 && $in{'reno'} ne "$reno2") {
				$match=2;
				push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'fcolor'}<>$in{'bcolor'}<>$in{'icon'}<>\n");
			}
			push(@new,$_);
		}

		if ($match == 1) {
			push(@new,"$no<>$in{'reno'}<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$ango<>$in{'fcolor'}<>$in{'bcolor'}<>$in{'icon'}<>\n");
		}

		# 更新
		unshift(@new,"$no<>$addr<>$times<>\n");
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);
	}

	# ロック解除
	if ($lockkey) { &unlock; }

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

#----------------#
#  返信フォーム  #
#----------------#
sub res_form {
	local($no,$reno,$date,$name,$mail,$sub,$com,$url,$resub,$fcolor);

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

	# クッキーを取得
	&get_cookie;

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

	# ヘッダを出力
	if ($ImageView == 1) { &header('ImageUp'); }
	else { &header; }

	# 関連記事出力
        print "<center>\n";
	print "<BR><TABLE BORDER=0 WIDTH=500 BGCOLOR=\"$table_c\" CELLSPACING=1 CELLPADDING=1 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter)><TR><TD>\n";
	print "<TABLE BORDER=0 WIDTH=100% class=TC><TR><TD>\n";
	print "- 以下は、記事NO. <B>$in{'no'}</B> に関する<a href='#RES'>返信フォーム</a>です -<hr size=1 color=\"$line_c\">\n";

	while (<IN>) {
		($no,$reno,$date,$name,$mail,$sub,$com,$url,$fcolor) = split(/<>/);
                if (!$reno) { $com = "<blockquote>$com</blockquote>"; }

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

			if (length($sub) > $sub_len*2) {
				$sub = substr($sub,0,$sub_len*2-4);
				$sub .= "...";
			}
			if ($in{'no'} == $no) { $resub = $sub; }
			if ($url) { $url = "&lt;<a href=\"http://$url\">HOME</a>&gt;"; }
			if ($reno) { print '　　'; }
			print "<font color=$sub_color><b>$sub</b></font> 投稿者：<b>$name</b> 投稿日：$date $url <font color=$sub_color>No\.$no</font><br>\n";
			print "<blockquote>$com</blockquote><hr size=1 color=\"$line_c\">\n";
		}
	}
	close(IN);
   print "</TD></TR></TABLE></TD></TR></TABLE>\n";

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

	print <<"EOM";
<a name="RES"></a>
<BR><TABLE BORDER=0 WIDTH=470 BGCOLOR=\"$table_c\" CELLSPACING=1 CELLPADDING=1 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter)><TR><TD>
<TABLE BORDER=0 WIDTH=100% class=TC><TR><TD>\n
<form action="$script" method="$method">
<input type=hidden name=mode value="regist">
<input type=hidden name=reno value="$in{'no'}">
<blockquote>
<table>
<tr>
  <td nowrap><font face=Verdana>Name</b></td>
  <td><input type=text name=name value="$c_name" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>Mail</b></td>
  <td><input type=text name=email value="$c_email" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>Title</b></td>
  <td nowrap><input type=text name=sub value="$resub" size=$nam_wid>
  <input type=submit value="Submit" class=BOT>&nbsp;<input type=reset value="Reset" class=BOT></td>
</tr>
<tr>
  <td colspan=2><font face=Verdana>Message</b><br>
  <textarea cols=$com_wid rows=5 name=comment wrap="$wrap"></textarea></td>
</tr>
<tr>
  <td nowrap>URL</b></td>
  <td><input type=text name=url value="http://$c_url" size=$sub_wid></td>
</tr>
EOM

	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}

	if ($icon_mode) {
		print "<tr><td nowrap><font face=Verdana>Icon</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>\n";

		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\"><font face=Verdana>Icon Sample</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\"><font face=Verdana>Icon sample</a>]";
		}
		print "</td></tr>\n";
	}

	print "<tr><td nowrap><font face=Verdana>Password</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 nowrap><font face=Verdana>Font color</b></td><td nowrap>\n";

	# クッキーの色情報がない場合
	if ($c_fcolor eq "") { $c_fcolor = $FCOLORS[0]; }

	foreach (0 .. $#FCOLORS) {
		if ($c_fcolor eq "$FCOLORS[$_]") {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\" checked>";
			print "<font color=\"$FCOLORS[$_]\">■</font>\n";

		} else {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\">";
			print "<font color=$FCOLORS[$_]>■</font>\n";
		}
     
	}
        
	print "</td></tr></table></form></TD></TR></TABLE></TD></TR></TABLE>\n";
	print "</blockquote>\n</body>\n</html>\n";
	exit;
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	local($buffer, @pairs, $name, $value);
	$post_flag=0;
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		$post_flag=1;
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }
	@pairs = split(/&/, $buffer);
	foreach (@pairs) {
		($name,$value) = split(/=/);

		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		# 文字コードをシフトJIS変換
		&jcode'convert(*value, "sjis", "", "z");

		# タグ処理
		if ($tagkey) { $value =~ s/<>/&lt;&gt;/g; }
		else {
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/\"/&quot;/g;
		}

		# 改行等処理
		if ($name eq "comment") {
			$value =~ s/\r\n/<br>/g;
			$value =~ s/\r/<br>/g;
			$value =~ s/\n/<br>/g;
		} else {
			$value =~ s/\r//g;
			$value =~ s/\n//g;
		}

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

		$in{$name} = $value;
	}
	$mode = $in{'mode'};
	$page = $in{'page'};
	$in{'url'} =~ s/^http\:\/\///;
	if ($in{'sub'} eq "") { $in{'sub'} = "Unknown"; }
}

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

	&header;
	print <<"EOM";
* <a href="$script?">掲示板にもどる</a> *
<center>
掲示板の利用上の注意
<P><center>
<table width="90%" border=0 cellpadding=10 class=TC>
<tr><td bgcolor="$table_c">
<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>
</td></tr></table>
</center>
</body>
</html>
EOM
	exit;
}

#------------------#
#  ワード検索処理  #
#------------------#
sub find {
	local($no,$reno,$date,$name,$email,$sub,$com,$url);

	&header;
	print <<"EOM";
* <a href="$script?">掲示板にもどる</a> *
<center>
ワード検索
<P><center>
<UL>
  <LI>検索したい<b>キーワード</b>を入力し、「条件」「表\示」を選択して「検索」ボタンを押して下さい。
  <LI>キーワードは「半角スペース」で区切って複数指定することができます。</center>
<P><form action="$script" method="$method">
<input type=hidden name=mode value="find">
キーワード：<input type=text name=word size=30 value="$in{'word'}">
条件：<select name=cond>
EOM
	if (!$in{'cond'}) { $in{'cond'} = "AND"; }
	foreach ("AND", "OR") {
		if ($in{'cond'} eq "$_") {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n 表\示：<select name=view>\n";
	if ($in{'view'} eq "") { $in{'view'} = $p_log; }
	foreach (5,10,15,20) {
		if ($in{'view'} == $_) {
			print "<option value=\"$_\" selected>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n <input type=submit value='検索'></form></UL>\n";

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

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

		# ファイルを読み込み
		@new=();
		open(IN,"$logfile") || &error("Open Error : $logfile");
		$top = <IN>;
		while (<IN>) {
			$flag=0;
			foreach $pair (@pairs) {
				if (index($_,$pair) >= 0) {
					$flag=1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flag=0; last; }
				}
			}
			if ($flag) { push(@new,$_); }
		}
		close(IN);

		# 検索終了
		$count = @new;
		print "検索結果：<b>$count</b>件\n";
		if ($page eq '') { $page = 0; }
		$end_data = @new - 1;
		$page_end = $page + $in{'view'} - 1;
		if ($page_end >= $end_data) { $page_end = $end_data; }

		$next_line = $page_end + 1;
		$back_line = $page - $in{'view'};

		$eword = &url_enc($in{'word'});
		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=find&page=$back_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}\">前の$in{'view'}件</a>]\n";
		}
		if ($page_end ne "$end_data") {
			print "[<a href=\"$script?mode=find&page=$next_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}\">次の$in{'view'}件</a>]\n";
		}
		print "[<a href=\"$script?mode=find\">検索やり直し</a>]\n";

		foreach ($page .. $page_end) {
			($no,$reno,$date,$name,$email,$sub,$com,$url)
							= split(/<>/, $new[$_]);
			if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }
			if ($url) { $url = "&lt;<a href=\"http://$url\" target='_top'>HOME</a>&gt;"; }

			if ($reno) { $no = "$renoへのレス"; }

			# 結果を表示
			print "<hr noshade size=1 color=\"$line_c\">[<b>$no</b>] <font color=\"$sub_color\"><b>$sub</b></font>";
			print " 投稿者：<b>$name</b> <small>投稿日：$date</small> $url<br>\n";
			print "<blockquote>$com</blockquote>\n";
		}
		print "<hr noshade size=1 color=\"$line_c\">\n";
	}
	print "</body>\n</html>\n";
	exit;
}

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

	if ($agent =~ /MSIE 3/i) { 
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 37;
		$url_wid = 48;
		$nam_wid2 = 20;
	} elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) { 
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 37;
		$url_wid = 70;
		$nam_wid2 = 20;
	} else {
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 37;
		$url_wid = 70;
		$nam_wid2 = 20;
	}
}

#------------------#
#  クッキーの発行  #
#------------------#
sub set_cookie {
	# クッキーは60日間有効
	local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60);

	@month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec);
	$cook="name<>$in{'name'}\,email<>$in{'email'}\,url<>$in{'url'}\,pwd<>$in{'pwd'}\,icon<>$in{'icon'}\,fcolor<>$in{'fcolor'}\,bcolor<>$in{'bcolor'}";
	print "Set-Cookie: YYBBS=$cook; expires=$gmt\n";
}

#------------------#
#  クッキーを取得  #
#------------------#
sub get_cookie {
	local($key, $val, @pairs);
	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach (@pairs) {
		($key,$val) = split(/=/);
		$key =~ s/\s//g;
		$GET{$key} = $val;
	}
	@pairs = split(/,/, $GET{'YYBBS'});
	foreach (@pairs) {
		($key,$val) = split(/<>/);
		$COOK{$key} = $val;
	}
	$c_name  = $COOK{'name'};
	$c_email = $COOK{'email'};
	$c_url   = $COOK{'url'};
	$c_pwd   = $COOK{'pwd'};
	$c_icon  = $COOK{'icon'};
	$c_fcolor = $COOK{'fcolor'};
	$c_bcolor = $COOK{'bcolor'};

	if ($in{'name'})  { $c_name  = $in{'name'}; }
	if ($in{'email'}) { $c_email = $in{'email'}; }
	if ($in{'url'})   { $c_url   = $in{'url'}; }
	if ($in{'pwd'})   { $c_pwd   = $in{'pwd'}; }
	if ($in{'icon'})  { $c_icon  = $in{'icon'}; }
	if ($in{'fcolor'}) { $c_fcolor = $in{'fcolor'}; }
	if ($in{'bcolor'}) { $c_bcolor = $in{'bcolor'}; }
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	if ($lockflag) { &unlock; }

	&header if (!$head_flag);
	print "<center><hr noshade size=1 color=\"$line_c\" width=400><h3>ERROR !</h3>\n";
	print "<P><font color=red>$_[0]</font>\n";
	print "<P><hr noshade size=1 color=\"$line_c\" width=400></center>\n</body>\n</html>\n";
	exit;
}

#--------------#
#  管理モード  #
#--------------#
sub admin {
	local($dmy,$no,$reno,$date,$name,$mail,$sub,
		$com,$url,$host,$pw,$next_page,$back_page);

	if ($in{'pass'} ne "" && $in{'pass'} ne $pass) {
		&error("パスワードが違います");
	}

	&header;
	print "* <a href=\"$script?\">掲示板に戻る</a> *\n";
	print "<center>\n";
	print "管理モード\n";

	if ($in{'pass'} eq "") {
		print "<P><center>* パスワードを入力して下さい *\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"del\">\n";
		print "<input type=password name=pass size=8>";
		print " <input type=submit value=\" 認証 \"></form>\n";
	}
	else {
		# 削除処理
		if ($DEL[0]) {

			# ロック処理
			if ($lockkey) { &lock; }

			# 削除情報をマッチングし更新
			@new=();
			open(IN,"$logfile") || &error("Open Error : $logfile");
			$top = <IN>;
			while (<IN>) {
				$flag=0;
				($no,$reno,$date) = split(/<>/);
				foreach $del (@DEL) {
					if ($no == $del || $reno == $del) {
						$flag=1; last;
					}
				}
				if ($flag == 0) { push(@new,$_); }
			}
			close(IN);

			# 更新
			unshift(@new,$top);
			open(OUT,">$logfile") || &error("Write Error : $logfile");
			print OUT @new;
			close(OUT);

			# ロック解除
			if ($lockkey) { &unlock; }
		}

		# 管理を表示
		if ($page eq "") { $page = 0; }
		print "<P><center><table><tr><td>\n";
		print "<font color=$text><UL><LI>削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n";
		print "<LI>親記事を削除するとレス記事も一括して削除されます。</UL></font>\n";
		print "</td></tr></table>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"Submit\">";
		print " <input type=reset value=\"Reset\">\n";
		print "<P><table border=0 cellspacing=1>\n";
		print "<tr><th><font color=$text>DEL</th><th><font color=$text>NO.</th><th><font color=$text>Date</th><th><font color=$text>Title</th>";
		print "<th><font color=$text>Name</th><th><font color=$text>URL</th><th><font color=$text>Comment</th><th><font color=$text>Host</th></tr>\n";

		# ページ区切り処理
		$start = $page + 1;
		$end   = $page + $p_log;

		open(IN,"$logfile") || &error("Open Error : $logfile");
		$top = <IN>;
		$i=0;
		while (<IN>) {
			($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw)
								 = split(/<>/);
			if ($reno eq "") { $i++; }
			if ($i < $start) { next; }
			if ($i > $end) { last; }

			if ($mail) { $name="<a href=\"mailto:$mail\">$name</a>"; }
			($date,$dmy) = split(/\(/, $date);

			if ($url) { $url = "&lt;<a href=\"http://$url\" target='_top'>Home</a>&gt;"; }
			else { $url = '-'; }

			$com =~ s/<br>//ig;
			$com =~ s/</&lt;/g;
			$com =~ s/>/&gt;/g;
			if (length($com) > 40) {
				$com = substr($com,0,38);
				$com .= "...";
			}

			if ($reno eq "") { print "<tr><th colspan=8><hr noshade size=1 color=\"$line_c\"></th></tr>\n"; }

			# 削除チェックボックス
			print "<tr><th><input type=checkbox name=del value=\"$no\"></th>";
			print "<td align=center><font color=$text>$no</td>";
			print "<td><small><font color=$text>$date</small></td><th><font color=$text>$sub</th><th><font color=$text>$name</th>";
			print "<td align=center><font color=$text>$url</td><td><small><font color=$text>$com</small></td>";
			print "<td><small><font color=$text>$host</small></td></tr>\n";

		}
		close(IN);

print "<tr><th colspan=8><hr noshade size=1 color=\"$line_c\"></th></tr>\n";
		print "</table></form>\n";
	}

	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	print "<P><table cellspacing=0 cellpadding=0><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=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"前の$p_log組\">\n";
		print "</td></form>\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=hidden name=pass value=\"$in{'pass'}\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"$in{'action'}\">\n";
		print "<input type=submit value=\"次の$p_log組\">\n";
		print "</td></form>\n";
	}
	print "</tr></table></center>\n</body>\n</html>\n";
	exit;
}

#------------------#
#  ユーザ記事削除  #
#------------------#
sub usr_del {
	local(@lines,@new,$no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw,$top,$PW);

	# POST限定
	if ($MethPost && !$post_flag) { &error("不正なアクセスです"); }

	if ($in{'no'} eq '' || $in{'pwd'} eq '')
		{ &error("記事Noまたはパスワードが入力モレです"); }

	# ロック処理
	if ($lockkey) { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);
	$top = shift(@lines);

	$flag=0;
	foreach (@lines) {
		($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw) = split(/<>/);

		if ($flag == 0 && $in{'no'} == $no) {
			$PW = $pw;
			if ($reno eq "") { $flag=2; }
			else { $flag=1; }
		}
		elsif ($flag == 2 && $in{'no'} == $reno) { next; }
		else { push(@new,$_); }
	}

	if ($flag == 0) { &error("該当記事が見当たりません"); }
	if ($PW eq '') { &error("該当記事にはパスワードが設定されていません"); }

	# パスワードを照合
	$match = &decrypt("$in{'pwd'}","$PW");
	if ($match ne 'yes') { &error("パスワードが違います"); }

	# 更新
	unshift(@new,$top);
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }
}

#----------------#
#  記事修正処理  #
#----------------#
sub usr_edt {
	local($no,$reno,$dt,$name,$mail,$sub,$com,
		$url,$host,$pw,$fcolor,$bcolor,$icon,$flag,$top,$flag,$pattern);

	if ($in{'no'} eq '' || $in{'pwd'} eq '')
		{ &error("記事Noまたはパスワードが入力モレです"); }

	if ($in{'action'} eq "edit") {
		# フォーム入力チェック
		&form_check;

		# ロック処理
		&lock if ($lockkey);
	}

	$flag=0;
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$top = <IN>;
	while (<IN>) {
		($no,$reno,$dt,$name,$mail,$sub,$com,$url,$host,$pw,$fcolor,$bcolor,$icon)
									 = split(/<>/);
		if ($in{'no'} == $no) {
			$pw2 = $pw;
			$flag=1;
			if ($in{'action'} ne "edit") { last; }
			else {
				if ($autolink) { &auto_link($in{'comment'}); }
				$_ = "$no<>$reno<>$dt<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$pw<>$in{'fcolor'}<>$bcolor<>$in{'icon'}<>\n";
			}
		}
		if ($in{'action'} eq "edit") { push(@new,$_); }
	}
	close(IN);
	if (!$flag) { &error("該当の記事が見当たりません"); }
	if ($pw2 eq "") { &error("パスワードが設定されていません"); }
	$check = &decrypt("$in{'pwd'}", "$pw2");
	if ($check ne "yes") { &error("パスワードが違います"); }

	if ($in{'action'} eq "edit") {
		unshift(@new,$top);
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);

		&unlock if ($lockkey);
		&set_cookie;

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

		&header;
		print "<div align=center>\n";
		print "<b>- 以下のとおり修正が完了しました -</b>\n";
		print "<p><table border=0 CELLSPACING=1 cellpadding=2 width='70%' bgcolor=\"$table_c\" class=TC><tr><td>\n";
		print "<table border=0 cellpadding=3 width='100%'><tr><td><tt>\n";
		print "Name：<b>$in{'name'}</b><br>\n";
		print "Mail：$in{'email'}<br>\n";
		print "Title：<b>$in{'sub'}</b><br>\n";
		print "URL：$in{'url'}</tt><P>\n";
		print "Message：<font color=\"$in{'color'}\">$in{'comment'}</font>\n";
		print "</td></tr></table></td></tr></table>\n";
		print "<P><form action=\"$script\">\n";
		print "<input type=submit value='リストに戻る'></form>\n";
		print "</div>\n</body>\n</html>\n";
		exit;
	}

	&get_agent;
	$com =~ s/<br>/\r/g;
	$pattern = 'http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]+';
	$com =~ s/<a href="$pattern" target='_top'>($pattern)<\/a>/$1/go;
	$com =~ s/&lt;/</g;
	$com =~ s/&gt;/>/g;
	$com =~ s/&quot;/\"/g;

	if ($ImageView == 1) { &header('ImageUp'); }
	else { &header; }
	print <<"EOM";
<center>
<b>- 変更する部分のみ修正して送信ボタンを押して下さい -</b>
<P>
<BR><TABLE BORDER=0 WIDTH=450 BGCOLOR=\"$table_c\" CELLSPACING=1 CELLPADDING=1 class=TA STYLE=filter:Alpha(opacity=$filter,enabled=$filter)><TR><TD>
<TABLE BORDER=0 WIDTH=100% class=TC><TR><TD align=center>\n
<form action="$script" method="$method">
<input type=hidden name=mode value="usr_edt">
<input type=hidden name=action value="edit">
<input type=hidden name=pwd value="$in{'pwd'}">
<input type=hidden name=no value="$in{'no'}">
<table border=0 cellspacing=0 cellpadding=1>
<tr>
  <td nowrap><font face=Verdana>NAME</b></td>
  <td><input type=text name=name size="$nam_wid" value="$name"></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>MAIL</b></td>
  <td><input type=text name=email size="$nam_wid" value="$mail"></td>
</tr>
<tr>
  <td nowrap><font face=Verdana>TITLE</b></td>
  <td>
    <input type=text name=sub size="$nam_wid" value="$sub"> 
    <INPUT TYPE=submit VALUE="Submit" class=BOT> <INPUT TYPE=reset VALUE="Reset" class=BOT>
  </td>
</tr>
<tr>
  <td colspan=2>
    <font face=Verdana>MESSAGE</b><BR>
    <textarea cols="$com_wid" rows=7 name=comment wrap="$wrap">$com</textarea>
  </td>
</tr>
<tr>
  <td nowrap><font face=Verdana>URL</b></td>
  <td><input type=text size="$sub_wid" name=url value="http://$url"></td>
</tr>
EOM
	# 管理者アイコンを配列に付加
	if ($my_icon) {
		push(@icon1,"$my_gif");
		push(@icon2,"管理者用");
	}
	if ($icon_mode) {
		print "<tr><td nowrap><font face=Verdana><b>ICON</b></td><td><select name=icon>\n";
		foreach(0 .. $#icon1) {
			if ($icon eq $icon1[$_]) {
				print "<option value=\"$icon1[$_]\" selected>$icon2[$_]\n";			   } else {
				print "<option value=\"$icon1[$_]\">$icon2[$_]\n";
			}
		}
		print "</select> <small>(あなたのイメージを選択して下さい)</small>\n";
		# イメージ参照のリンク
		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\">ICON SAMPLE</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">ICON SAMPLE</a>]";
		}
		print "</td></tr>\n";
	}

	print "<tr><td nowrap><font face=Verdana>Font color</b></td><td nowrap>\n";
	foreach (0 .. $#FCOLORS) {
		if ($fcolor eq "$FCOLORS[$_]") {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\" checked>";
			print "<font color=\"$FCOLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=fcolor value=\"$FCOLORS[$_]\">";
			print "<font color=\"$FCOLORS[$_]\">■</font>\n";
		}
	}

	print "</table></td></tr></table></td></tr></table></form></center>\n</body>\n</html>\n";
	exit;
}

#------------------------#
#  フォーム入力チェック  #
#------------------------#
sub form_check {
	local($ref_url);

	# POST限定
	if ($MethPost && !$post_flag) { &error("不正なアクセスです"); }

	# 他サイトからのアクセスを排除
	if ($base_url) {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); }
	}

	# 名前とコメントは必須
	if ($in{'name'} eq "") { &error("名前が入力されていません"); }
	if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
	if ($in_email && $in{'email'} !~ /[\w\.\-]+\@[\w\.\-]+\.[a-zA-Z]{2,3}/) {
		&error("Ｅメールの入力内容が正しくありません");
	}

	# 管理アイコンのチェック
	if ($my_icon && $in{'icon'} eq $my_gif) {
		if ($in{'pwd'} ne $pass) { &error("管理用アイコンは管理者専用です"); }
	}
}

#--------------#
#  時間を取得  #
#--------------#
sub get_time {
	$ENV{'TZ'} = "JST-9";
	$times = time;
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times);
	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');

	# 日時のフォーマット
	$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
			$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);
}

#----------------#
#  カウンタ処理  #
#----------------#
sub counter {
	local($cntup,@cnts,$cnt);

	# 閲覧時のみカウントアップ
	if ($mode eq '') { $cntup=1; } else { $cntup=0; }

	# カウントファイルを読みこみ
	open(IN,"$cntfile") || &error("Open Error : $cntfile");
	eval "flock(IN, 1);";
	$data = <IN>;
	close(IN);

	# IPチェックとログ破損チェック
	($cnt, $ip) = split(/:/, $data);
	if ($addr eq $ip || $cnt eq "") { $cntup=0; }

	# カウントアップ
	if ($cntup) {
		$cnt++;
		open(OUT,"+< $cntfile") || &error("Write Error : $cntfile");
		eval "flock(OUT, 2);";
		truncate(OUT, 0);
		seek(OUT, 0, 0);
		print OUT "$cnt\:$addr";
		close(OUT);
	}

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

	# GIFカウンタ表示
	if ($counter == 2) {
		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><br>\n";
	}
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	local($retry,$mtime);

	# 1分以上古いロックは削除する
	if (-e $lockfile) {
		($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}
	# symlink関数式ロック
	if ($lockkey == 1) {
		$retry = 5;
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) { &error('LOCK is BUSY'); }
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		$retry = 5;
		while (!mkdir($lockfile, 0755)) {
			if (--$retry <= 0) { &error('LOCK is BUSY'); }
			sleep(1);
		}
	}
	$lockflag=1;
}

#--------------#
#  ロック解除  #
#--------------#
sub unlock {
	if ($lockkey == 1) { unlink($lockfile); }
	elsif ($lockkey == 2) { rmdir($lockfile); }
	$lockflag=0;
}

#--------------#
#  メール送信  #
#--------------#
sub mail_to {
	local($MailSub,$MailBody,$email);

	# メールタイトルを定義
	$MailSub = "[$title : $no] $in{'sub'}";

	# 記事の改行・タグを復元
	$com  = $in{'comment'};
	$com =~ s/<br>/\n/g;
	$com =~ s/&lt;/</g;
	$com =~ s/&gt;/>/g;
	$com =~ s/&quot;/\"/g;

	# メール本文を定義
	$MailBody = <<"EOM";
投稿日時：$date
ホスト名：$host
ブラウザ：$ENV{'HTTP_USER_AGENT'}

投稿者名：$in{'name'}
Ｅメール：$in{'email'}
ＵＲＬ  ：$in{'url'}
タイトル：$in{'sub'}
投稿記事：

$com
EOM
	# JISコード変換
    	&jcode'convert(*MailSub,'jis');
    	&jcode'convert(*MailBody,'jis');

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

	open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました");
	print MAIL "To: $mailto\n";
	print MAIL "From: $email\n";
	print MAIL "Subject: $MailSub\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 "--------------------------------------------------------\n";
	print MAIL "$MailBody\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
}

#----------------------#
#  パスワード暗号処理  #
#----------------------#
sub encrypt {
	local($inpw) = $_[0];
	local(@SALT, $salt, $encrypt);

	@SALT = ('a'..'z', 'A'..'Z', '0'..'9', '.', '/');
	srand;
	$salt = $SALT[int(rand(@SALT))] . $SALT[int(rand(@SALT))];
	$encrypt = crypt($inpw, $salt) || crypt ($inpw, '$1$' . $salt);
	return $encrypt;
}

#----------------------#
#  パスワード照合処理  #
#----------------------#
sub decrypt {
	local($inpw, $logpw) = @_;
	local($salt, $key, $check);

	$salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2);
	$check = "no";
	if (crypt($inpw, $salt) eq $logpw || crypt($inpw, '$1$' . $salt) eq $logpw)
		{ $check = "yes"; }
	return $check;
}

#------------------#
#  HTMLのヘッダー  #
#------------------#
sub header {
	$head_flag=1;
	print "Content-type: text/html\n\n";
	print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<STYLE type="text/css">
<!--
big { font-size: 12pt }
body,tr,td { font-size: $b_size;font-family:verdana,chicago,Arial,'MS UI Gothic',Osaka,sans-serif; }
.BOT{border-top:3px double $f_lcolor;border-left:3px double $f_lcolor;border-bottom:3px double $f_lcolor;border-right:3px double $f_lcolor;background-color:$f_lcolor;color:$f_lttcolor;font-family:verdana,chicago,Arial,'MS UI Gothic',Osaka,sans-serif;font-size:8pt;}
-->
</STYLE>
EOM
	# JavaScriptヘッダー
	if ($ImageView == 1 && $_[0] eq "ImageUp") {
		print "<META http-equiv=\"Content-Script-Type\" content=\"text/javascript\">\n";
		print "<SCRIPT type=\"text/javascript\">\n";
		print "<!--\n";
		print "function ImageUp() {\n";
		print "window.open(\"$script?mode=image\",\"window1\",\"width=$img_w,height=$img_h,scrollbars=1\");\n}\n//-->\n</SCRIPT>\n";
	}
	print "<style type=\"text/css\">\n";
	print "<!--\n";
print "a:link    {text-decoration:none; color:$link }\n";	
print "a:visited {text-decoration:none; color:$vlink }\n";	
print "a:active  {text-decoration:none; color:$alink }\n";	
print "a:hover   {color:$hovercolor;background-color:$blinkcolor; }\n";
print "input,select,textarea,text {background:$fbcolor;font-size: $b_size;color:$f_lttcolor;}\n";
print "input,select,textarea,text {border-top:1px solid $f_ltcolor;border-left:1px solid $f_ltcolor;border-bottom:1px solid $f_ltcolor;border-right:1px solid $f_ltcolor }\n";
print "tr,td {color:$t_text;}\n";
print "body { BACKGROUND-attachment:fixed;BACKGROUND-image:url($backgif)}\n";
print "SPAN { font-size: $t_size; font-family:$t_face;}\n";
print ".TA { BORDER-RIGHT: $hasencolor 1px solid; BORDER-TOP: $hasencolor 1px solid; BORDER-LEFT: $hasencolor 1px solid; BORDER-BOTTOM: $hasencolor 1px solid }\n";
print ".TC { BORDER-RIGHT: $hasencolor 0.1em dotted; BORDER-TOP: $hasencolor 0.1em dotted; BORDER-LEFT: $hasencolor 0.1em dotted; BORDER-BOTTOM: $hasencolor 0.1em dotted }\n";
print"BODY { scrollbar-arrow-color:$sacolor; scrollbar-face-color: $sfcolor; scrollbar-base-color:$sfcolor;scrollbar-darkshadow-color:$sfcolor;scrollbar-shadow-color:$sacolor;scrollbar-highlight-color:$sacolor; scrollbar-track-color: $stcolor; }\n";
print".sf{font-size:8pt;}\n";

	print "-->\n";
	print "</style>\n";
	print "<title>$title</title></head>\n";
	print "<body background=\"$backgif\" bgcolor=\"$bgcolor\" text=\"$text\" link=\"$link\" vlink=\"$vlink\" alink=\"$alink\">\n";
}

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

#--------------------#
#  画像イメージ表示  #
#--------------------#
sub image {
	local($i,$j,$stop);

	&header;
	print "<center><hr noshade size=1 color=\"$line_c\" width=75%>\n";
	print "<b><big>画像イメージサンプル</big></b>\n";
	print "<P><small>- 現在登録されている画像イメージは以下のとおりです -</small>\n";
	print "<hr noshade size=1 color=\"$line_c\" width=75%>\n";
	print "<P><table border=0 cellpadding=5 cellspacing=0 class=TC><tr>\n";

	$i=0; $j=0;
	$stop = @icon1;
	foreach (0 .. $#icon1) {
		$i++; $j++;
		print "<th><img src=\"$imgurl$icon1[$_]\" ALIGN=middle alt=\"$icon1[$_]\"> $icon2[$_]</th>\n";
		if ($j != $stop && $i >= 5) { print "</tr><tr>\n"; $i=0; }
		elsif ($j == $stop) {
			if ($i == 0) { last; }
			while ($i < 5) { print "<th><br></th>"; $i++; }
		}
	}

	print "</tr></table><br>\n";
	print "<FORM><INPUT TYPE=\"button\" VALUE=\"  CLOSE  \" onClick=\"top.close();\"></FORM>\n";
	print "</center>\n</body>\n</html>\n";
	exit;
}

#----------------#
#  ホスト名取得  #
#----------------#
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 pastlog {
	local($count,$pastfile,@temp,$pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho);
	local($past_flag)=0;

	# 過去NOを開く
	open(NO,"$nofile") || &error("Open Error : $nofile");
	$count = <NO>;
	close(NO);

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

	# 過去ログを開く
	open(IN,"$pastfile") || &error("Open Error : $pastfile");
	@past = <IN>;
	close(IN);

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

		# カウントファイル更新
		$count++;
		open(NO,">$nofile") || &error("Write Error : $nofile");
		print NO $count;
		close(NO);

		$pastfile = "$pastdir$count\.dat";
		@past=();
	}

	@temp=();
	foreach (@data) {
		($pno,$preno,$pdate,$pname,$pmail,$psub,$pcom,$purl,$pho)
								 = split(/<>/);
		if ($pmail) { $pname = "<a href=\"mailto:$pmail\">$pname</a>"; }
		if ($purl) { $purl = "&lt;<a href=\"http://$purl\" target='_top'>HOME</a>&gt;"; }
		if ($preno) { $pno = "$prenoへのレス"; }

		# 保存記事をフォーマット
		push(@temp,"<hr>[$pno] <font color=\"$sub_color\"><b>$psub</b></font> 投稿者：<b>$pname</b> <small>投稿日：$pdate</small> $purl<br><blockquote>$pcom</blockquote><!-- $pho -->\n");
	}

	# 過去ログを更新
	unshift(@past,@temp);
	open(OUT,">$pastfile") || &error("Write Error : $pastfile");
	print OUT @past;
	close(OUT);

	if ($past_flag) { chmod(0666,$pastfile); }
}

#------------#
#  過去ログ  #
#------------#
sub past {
	local($pastno,@new,$count,@pairs,$pair);

	open(IN,"$nofile") || &error("Open Error : $nofile");
	$pastno = <IN>;
	close(IN);

	if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; }

	&header;
	print <<"EOM";
* <a href="$script?">掲示板に戻る</a> *
<center>
過去ログ[$in{'pastlog'}]
<P><table><tr><td>
<form action="$script" method="$method">
<input type=hidden name=mode value=past>
<font color=$text>過去ログ：<select name=pastlog>
EOM

	$pastkey = $pastno;
	while ($pastkey > 0) {
		if ($in{'pastlog'} == $pastkey) {
			print "<option value=\"$pastkey\" selected>$pastkey Page\n";
		} else {
			print "<option value=\"$pastkey\">$pastkey Page\n";
		}
		$pastkey--;
	}
	print "</select>\n<input type=submit value='Movement'></td></form>\n";
	print "<td width=30></td><td>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=past>\n";
	print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
	print "<font color=$text>ワード検索：<input type=text name=word size=30 value=\"$in{'word'}\">\n";
	print "<font color=$text>条件：<select name=cond>\n";

	foreach ('AND', 'OR') {
		if ($in{'cond'} eq "$_") {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n";
	print "<font color=$text>表\示：<select name=view>\n";
	if ($in{'view'} eq "") { $in{'view'} = $p_log; }
	foreach (5,10,15,20,25,30) {
		if ($in{'view'} eq "$_") {
			print "<option value=\"$_\" selected>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n<input type=submit value='Reference'></td></form>\n";
	print "</td></tr></table>\n";

	# 表示ログを定義
	$in{'pastlog'} =~ s/\D//g;
	$file = "$pastdir$in{'pastlog'}\.dat";

	# ワード検索処理
	if ($in{'word'} ne "") {
		$in{'word'} =~ s/　/ /g;
		@pairs = split(/\s+/, $in{'word'});

		@new=();
		open(IN,"$file") || &error("Open Error : $file");
		while (<IN>) {
			$flag=0;
			foreach $pair (@pairs) {
				if (index($_,$pair) >= 0) {
					$flag=1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flag=0; last; }
				}
			}
			if ($flag) { push(@new,$_); }
		}
		close(IN);

		$count = @new;
		print "<font color=$text>検索結果：<b>$count</b>件\n";
		if ($page eq '') { $page = 0; }
		$end_data = @new - 1;
		$page_end = $page + $in{'view'} - 1;
		if ($page_end >= $end_data) { $page_end = $end_data; }

		$next_line = $page_end + 1;
		$back_line = $page - $in{'view'};

		$eword = &url_enc($in{'word'});
		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=past&page=$back_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">前の$in{'view'}件</a>]\n";
		}
		if ($page_end ne "$end_data") {
			print "[<a href=\"$script?mode=past&page=$next_line&word=$eword&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">次の$in{'view'}件</a>]\n";
		}
		print "[<a href=\"$script?mode=past&pastlog=$in{'pastlog'}\">検索やり直し</a>]\n";

		# 表示開始
		foreach ($page .. $page_end) {
			print $new[$_];
		}
		print "<hr noshade size=1 color=\"$line_c\">\n</body>\n</html>\n";
		exit;
	}

	# ページ区切り処理
	$start = $page + 1;
	$end   = $page + $p_log;

	$i=0;
	open(IN,"$file") || &error("Open Error : $file");
	while (<IN>) {
		$flag=0;
		if ($_ =~ /^\<hr\>\[\d+\]/) { $flag=1; $i++; }
		if ($i < $start) { next; }
		if ($i > $end) { last; }

		if ($flag) { print $_; }
		else {
			$_ =~ s/<hr>//ig;
			print "<blockquote>$_</blockquote>\n";
		}
	}
	close(IN);
	print "<hr noshade size=1 color=\"$line_c\">\n";

	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	print "<table>\n";
	if ($back_page >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=past>\n";
		print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=submit value=\"前の$p_log件\">\n";
		print "</td></form>\n";
	}
	if ($next_page < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=past>\n";
		print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=submit value=\"次の$p_log件\">\n";
		print "</td></form>\n";
	}
	print "</table>\n</body>\n</html>\n";
	exit;
}

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

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

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

	# カウンタログ
	print "<LI>カウンタ：";
	if ($counter) {
		print "設定あり\n";
		if (-e $cntfile) { print "<LI>カウンタログファイルのパス：OK\n"; }
		else { print "<LI>カウンタログファイルのパス：NG → $cntfile\n"; }
	}
	else { print "設定なし\n"; }

	# ロックディレクトリ
	print "<LI>ロック形式：";
	if ($lockkey == 0) { print "ロック設定なし\n"; }
	else {
		if ($lockkey == 1) { print "symlink\n"; }
		else { print "mkdir\n"; }

		($lockdir) = $lockfile =~ /(.*)[\\\/].*$/;
		print "<LI>ロックディレクトリ：$lockdir\n";

		if (-d $lockdir) { print "<LI>ロックディレクトリのパス：OK\n"; }
		else { print "<LI>ロックディレクトリのパス：NG → $lockdir\n"; }

		if (-r $lockdir && -w $lockdir && -x $lockdir) {
			print "<LI>ロックディレクトリのパーミッション：OK\n";
		} else {
			print "<LI>ロックディレクトリのパーミッション：NG → $lockdir\n";
		}
	}

	# 過去ログ
	print "<LI>過去ログ：";
	if ($pastkey == 0) { print "設定なし\n"; }
	else {
		print "設定あり\n";

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

		# ディレクトリ
		if (-d $pastdir) { print "<LI>過去ログディレクトリパス：OK\n"; }
		else { print "<LI>過去ログディレクトリのパス：NG → $pastdir\n"; }
		if (-r $pastdir && -w $pastdir && -x $pastdir) {
			print "<LI>過去ログディレクトリパーミッション：OK\n";
		} else {
			print "<LI>過去ログディレクトリパーミッション：NG → $pastdir\n";
		}
	}

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

#-----------------#
#  URLエンコード  #
#-----------------#
sub url_enc {
	local($_) = @_;

	s/(\W)/'%' . unpack('H2', $1)/eg;
	s/\s/+/g;
	$_;
}