#!/usr/local/bin/perl

#┌─────────────────────────────────
#│  YY-BOARD v4.51 (2001/07/04)
#│  Copyright(C) Kent Web 1997-2001
#│  webmaster@kent-web.com
#│  http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'YYBBS v4.51';
#┌─────────────────────────────────
#│ [注意事項]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#│    直接メールによる質問は一切お受けいたしておりません。
#│ 3. 添付の home.gif は L.O.V.E の mayuRin さんによる画像です。
#└─────────────────────────────────
##
## 01.7.13 同報メール処理まで改造終了
## 次の予定は削除報告と修正報告用の改造。これらは「何がいつ削除修正されたか」のみ報告
## 後、使い方の説明文の精査。それからIEで空き過ぎの点。とmodified表示の再検討。
## 後、外部カウンタ設置してそれでGOかな。メール送信の書式も再検討の余地あり。
## 03.4.3 KEFに移動(旧KEFをKEF2002にしたので、そこからダウンして再アップしかないの)
## それでやりました。
## 05.3.31削除報告もリストにすることにしました。
## 06.7.18リードオンリーにしました。
##
# 【ファイル構成例】
#
#  public_html (ホームディレクトリ)
#      |
#      +-- yybbs / yybbs.cgi  [755]
#            |     yybbs.log  [666]
#            |     count.dat  [666]
#            |     jcode.pl   [644]
#            |     pastno.dat [666]
#            |     list.dat   [644]
#            |
#            +-- img / home.gif, bear.gif, ...
#            |
#            +-- lock [777] /
#            |
#            +-- past [777] / 1.dat [666] ...

#============#
#  設定項目  #
#============#


require './jcode.pl';			# 文字コードライブラリ取込
$title = "KEF-BBS";			# タイトル名を指定
$t_color = "#008080";			# タイトルの色
$t_size = '18pt';				# タイトルの大きさ（ポイント数:スタイルシートで有効）
$t_face = "ＭＳ Ｐゴシック";	# タイトル文字のフォントタイプ
$b_size = '10pt';				# 本文の文字大きさ（ポイント数:スタイルシートで有効）
$backgif = "";					# 壁紙を指定する場合（http://から指定）
$bgcolor = "#f0ffff";			# 背景色を指定
$text = "#000000";				# 文字色を指定

$link  = "#0000FF";	# 未訪問	# リンク色を指定
$vlink = "#800080";	# 訪問済
$alink = "#FF0000";	# 訪問中


$homepage = "../index.html";	# 戻り先のURL (index.htmlなど)
$max = 100;						# 最大記事数
$pass = 'K0e4f';					# 管理者用マスタパスワード (英数字で８文字以内)

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

# アイコンを定義（上下は必ずペアで）
@icon1 = ('bear.gif','cat.gif','cow.gif','dog.gif','fox.gif','hituji.gif',
		'monkey.gif','zou.gif','mouse.gif','panda.gif','pig.gif','usagi.gif');
@icon2 = ('くま','ねこ','うし','いぬ','きつね','ひつじ',
		'さる','ぞう','ねずみ','パンダ','ぶた','うさぎ');

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

$my_gif  = 'admin.gif';			# 管理者専用アイコンの「ファイル名」を指定
$icon_mode = 0;					# アイコンモード (0=no 1=yes)
$topsort = 1;					# 返信がつくと親記事をトップへ移動 (0=no 1=yes)

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

# タイトルにGIF画像を使用する時 (http://から記述)
$title_gif = "http://www.arunet.co.jp/~hsk/KEF/image/bbstt.gif";
$tg_w = '150';	# GIF画像の幅 (ピクセル)
$tg_h = '100';	#    〃    高さ (ピクセル)

# ファイルロック形式
$lockkey = 1;						# → 0=no 1=symlink関数 2=mkdir関数
$lockfile = './lock/KEFbbs.lock';	# ロックファイル名

# ミニカウンタの設置
$counter = 0;					# → 0=no 1=テキスト 2=GIF画像
$mini_fig = 6;					# ミニカウンタの桁数
$cnt_color = "#DD0000";			# テキストのとき：ミニカウンタの色

# カウンタ外部処理をする(0=no 1=yes)
$extcount = 1;
$countername = 'KEFtalk';
$countgif = "5";
$countfig = "4";
$countwid ="76";
$countheig ="16";

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

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

$script = 'http://www.arunet.co.jp/~hsk/KEF/talk/KEFbbs.cgi';		## スクリプトのファイル名 → フルパスで指定する場合は http:// から記述
$logfile = './KEFbbs.log';		## ログファイルを指定 → フルパスで指定する場合は / から記述
$in_email = 0;					# メールアドレスの入力必須 (0=no 1=yes)
$sub_len = '25';				# 記事 [タイトル] 部の長さ (全角文字換算)
$sub_color = "#006600";			# 記事の [タイトル] 部の色
$tbl_color = "#ffffff";			# 記事表示部の下地の色

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

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

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

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

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

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

# 投稿があるとメール通知する (sendmail必須)
#  0 : 通知しない
#  1 : 通知するが、自分の投稿記事はメールしない。
#  2 : 通知する。自分の投稿記事も通知する。
$mailing = 2;
$mailto = 'hsk@arunet.co.jp';		# メールアドレス(メール通知する時)
$mailto2 = 'hsk@arunet.co.jp';		# メールアドレス(メール通知する時)
$sendmail = '/usr/sbin/sendmail';	# sendmailパス（メール通知する時）
$headline = "KEF";					# メーラー名の名称
$base_url = "http://www.arunet.co.jp/~hsk/KEF/talk/KEFbbs.cgi";			# 他サイトから投稿排除時に指定 (http://から書く)

$mailing2 = 0;						# 同報BCC送信 0 : しない 1 : する
$maillist = './list.dat';			# 同報リスト

$del_mail = 1;						# 削除報告送信 0 : しない 1 : 管理者にする
$delbcomment = 'は';
$delccomment = 'に削除されました。';

$del_mail2 = 0;						# 削除同報BCC送信 0 : しない 1 : する

$edt_mail = 1;						# 修正報告送信 0 : しない 1 : 管理者にする
$edtbcomment = 'は';
$edtccomment = 'に修正されました。';

$headcommenta = <<"EOM";
<big>教文演劇フェスティバルに関心ある方のための気軽な掲示板でした。<br></big>
<!--・必須の入力項目は「おなまえ」と「コメント」です。おなまえは愛称で\構\いません。<br>
<br>
<small>・ここへの発言は、教文フェスティバルの告知広報等に編集活用する場合があることをご了承ください(連絡可\能\な場合は、できるだけ個別確認いたします)。<br></small>-->
ただいまはリードオンリーとなっております。<br>
EOM

$headcommentb = <<"EOM";
・教文演劇フェスティバル以外の公演やイベントの告知は、あなたの教文フェスへの関心を示した上でのものなら問題としません。特に他地域の「演劇フェスティバル」の話題なんかが出てくるといいなあ。<br>
という趣旨の掲示板でした。<br>
<br>
<!--<small>・誹謗や中傷、プライバシーの侵害にあたる\可\能\性があると管理者が判断した発言は、確認なしに削除します。<br>
・当掲示板の趣旨と関係ないと判断した発言についても、確認なしに削除する場合があります。<br></small>-->
EOM

$mailcomment = <<"EOM";
このE-mailは、$title(エンフェス広場)
$script
に書き込まれた発言を自動送信したものです。
EOM

# 文字色の設定。
@COLORS = ('#800000','#DF0000','#008040','#0000FF','#C100C1','#FF4080','#FF8040','#000080');

$wrap = 'soft';						# 投稿フォーム改行形式 (soft=手動 hard=強制)
$autolink = 1;						## URLの自動リンク (0=no 1=yes)  --> タグ許可の場合は no とすること。

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

@denyurl = (					# 拒否url
	"zinzaza",
	"geniralra",
	"ra-server",
	"resmus.com",
	"porn.",
	"zraza",
	"window-curtain",
	"fucks",
	"auto-sos",
	"soohra",
	"seface.com",
	"beesearch",
	"valium-med",
	"dj5566.org",
	"jyoendanyuu.web.fc2.com",
	"",
	"",
	"",
	""
);


@denywords = (				# 拒否ワード
	"http://site.neogen.ro",
	"a href=",
	"your web page",
	"I hope",
	"continue",
	"visit",
	"enjoyed",
	"update",
	"Very",
	"luck",
	"nice site",
	"appropriate",
	"useful",
	"exactly",
	"sentiments",
	"already",
	"Thanks",
	"porn",
	"warning",
	"cool",
	"updates",
	"thankyou",
	"webpage",
	"often",
	"pleasure",
	"content",
	"interesting",
	"built",
	"recommend",
	"useful",
	"place",
	"opportunity",
	"surf",
	"tradition",
	"excellent",
	"greet",
	"Ｓ●Ｘ",
	"",
	"",
	"",
	""
);



# アクセス制限（ホスト名、IPアドレスを記述）
@deny = (
#	"anonymizer.com",
	"cache*.*.interlog.com",
	"210.17.202.*",
	"dyn.pacific.net.hk",
	"203.144.160.*",
	"208.179.161.*",
	"210.17.238.*",
	"ap.yournet.ne.jp",
	"ip-68-178-*.ip.secureserver.net",
	"*.net*.t-com.ne.jp",
	"210.139.85.1*",
	"61.55.129.3*",
	"61.55.128.2*",
	"210.153.237.1*",
	"221.192.170.1*",
	"ip-216-69-162-*.ip.secureserver.net",
	"218.11.177.1*",
	"218.11.177.2*",
	"202.229.202.1*",
	"219.126.192.1*",
	"ip-216-69-177-*.ip.secureserver.net",
	"210.165.101.1*",
	"1*.171.12.61.ap.gmo-access.jp",
	"69.72.209.*",
	"204.113.91.1*",
	"219.121.56.2*",
	"219.137.244.1*",
	"218.20.122.1*",
	"200.30.79.1*",
	"219.137.148.*",
	"ce7*-or-mde.orbitel.net.co",
	"219.137.252.2*",
	"218.19.98.1*",
	"12.154.100.1*",
	"218.19.102.5*",
	"85.214.21.8*",
	"codergrid.de",
	"202.47.247.1*",
	"218.19.102.1*",
	"218.19.108.2*",
	"218.20.123.4*",
	"218.19.101.1*",
	"61.12.171.2*",
	"ap.gmo-access.jp",
	"202.58.85.*",
	"*.uitm.edu.my",
	"81.216.80.*",
	"204.10.221.*",
	"*.hccanet.org",
	"80.58.9.*",
	"*.proxycache.rima-tde.net",
	"216.130.157.*",
	"217.20.84.*",
	"zavarda.inf.elte.hu",
	"mail.nsbdemo.nextra.cz",
	"220.70.65.*",
	"221.163.168.*",
	"iceberg.ruf.uni-freiburg.de",
	"210.206.51.*",
	"161.53.20.*",
	"dean.mif.vu.lt",
	"195.131.190.*",
	"211.125.177.1*",
	"222.101.15.*",
	"guvendiren.registrar.umb.edu",
	"59.14.33.*",
	"218.249.239.*",
	"222.78.85.*",
	"58.22.226.*",
	"222.78.82.*",
	"200.208.35.*",
	"219.13.122.*",			# 06.4.5
	"61.23.149.*",
	"210.20.10.*",
	"200.122.153.*",
	"61.23.149.*",
	"219.27.32.*",
	"65.188.210.*",
	"219.120.27.*",
	"219.22.232.*",
	"68.87.76.*",
	"*.anjose.ca.sanfran.comcast.net",
	"60.248.35.*",
	"68.226.214.*",
	"217.219.155.*",
	"218.220.48.*",
	"68.87.66.*",
	"68.100.7.*",
	"*.dc.dc.cox.net",
	"68.84.63.*",
	"71.13.132.*",
	"196.40.43.*",
	"219.31.8.*",
	"220.11.185.*",
	"213.140.3.*",
	"24.242.222.*",
	"81.169.147.*",
	"202.56.17.*",
	"221.17.184.*",
	"213.176.161.*",
	"201.17.147.*",
	"200.118.2.*",
	"221.251.102.*",
	"24.47.57.*",
	"219.26.150.*",
	"209.248.224.*",
	"219.48.221.*",
	"221.16.40.*",
	"219.37.61.*",
	"219.41.160.*",
	"218.179.72.*",
	"218.124.122.*",
	"222.78.83.*",
	"",
	"",
	""
	);

#---(以下は「過去ログ」機能を使用する場合の設定です)---#
#
# 過去ログ生成 (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 || $addr =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("アクセスを許可されていません"); }

	# 時間を取得
	&get_time;
	$timesa = $times;

}

#--------------#
#  記事表示部  #
#--------------#
sub html_log {
	local($no,$reno,$date,$name,$mail,
		$sub,$comment,$url,$host,$pw,$color,$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 <<"EOM";
	<table cellpadding=5>
		<tr><td bgcolor=ff3333 align=center>
			<table cellspacing=3 cellpadding=2>
				<tr>
					<td bgcolor=ffffff width=40%>$headcommenta</td>
					<td width="$tg_w" align=center>
	<img src="$title_gif" width="$tg_w" height="$tg_h" alt="$title">
					</td>
					<td bgcolor=ffffff width=40%>$headcommentb</td>
				</tr>
			</table>
		</td></tr>
	</table>
EOM

	}

	print "<hr width='90%'>\n";
	print "<table width='90%'>\n";
	print "<tr><td>\n";
	print "[<a href=\"$homepage\" target='_top'>トップに戻る</a>]\n";
	print "[<a href=\"$script?mode=howto\">使い方</a>]\n";
	print "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

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

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

	# カウンタ処理外部
	if ($extcount) {
		print "<td align=right>\n";
		print "<img src=\"http://www.arunet.co.jp/~hsk/count/dream.cgi?id=$countername&gif=$countgif&fig=$countfig\" width=\"$countwid\" height=\"$countheig\" alt=\"count\">\n";

		print "</td>\n";

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

#	print <<"EOM";
#<hr width='90%'>
#</center>
#<blockquote>
#<form method="$method" action="$script">
#<input type=hidden name=mode value="regist">
#<input type=hidden name=checkin value="$timesa">
#<table border=0 cellspacing=0>
#<tr>
#  <td nowrap><b>おなまえ</b></td>
#  <td><input type=text name=name size="$nam_wid" value="$c_name"></td>
#</tr>
#<tr>
#  <td nowrap><b>Ｅメール</b></td>
#  <td><input type=text name=email size="$nam_wid" value="$c_email"></td>
#</tr>
#<tr>
#  <td nowrap><b>題　　名</b></td>
#  <td nowrap>
#    <input type=text name=sub size="$sub_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>
#  <td nowrap><b>ＵＲＬ</b></td>
#  <td><input type=text size="$url_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><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>(あなたのイメージを選択して下さい)</small>\n";

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

	print "<tr><td nowrap><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><td nowrap><b>文字色</b></td><td>\n";

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

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

	print "</td></tr></table></form>\n";
	print "</blockquote><center><br>\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,$color,$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 = "<blockquote>$comment</blockquote>"; }

		if (!$reno && $flag) {
			print "</TD></TR></TABLE><br>\n";
			$flag=1;
		}
		if (!$reno) {
			print "<TABLE BORDER=1 WIDTH='90%' BGCOLOR=\"$tbl_color\" CELLSPACING=0 CELLPADDING=1><TR><TD>\n";
			$flag=1;
		}

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

		print "<td valign=top nowrap><font color=\"$sub_color\"><b>$sub</b></font>　";

		if (!$reno) { print "投稿者：<b>$name</b> <small>投稿日：$date</small> "; }
		else { print "<b>$name</b> - <small>$date</small> "; }

		print "<font color=\"$sub_color\"><small>No\.$no</small></font></td>";
		print "<td valign=top nowrap> &nbsp; $url </td><td valign=top>\n";

		if (!$reno) {
			print "<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='返信'></form></td>\n";
		} else {
			print "<br></td>\n";
		}

		print "</tr></table><table border=0 cellpadding=2 width=100%><tr>\n";
		if ($reno) { print "<td width=32><br></td>\n"; }

		# アイコンモード
		if ($icon_mode) { print "<td><img src=\"$imgurl$icon\" alt=\"$icon\"></td>"; }

		print "<td><font color=\"$color\">$comment</font></td></tr></table>\n";
	}
	close(IN);
	print "</TD></TR></TABLE></center>\n";

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

	$p_flag=0;
	print "<P><blockquote><table cellpadding=0 cellspacing=0><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=\"前ページ\">\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=\"次ページ\">\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 "[<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></blockquote>\n<div align=center>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<font color=$t_color><small>- 以下のフォームから自分の投稿記事を修正・削除することができます -</small></font><br>\n";
	print "処理 <select name=mode>\n";
	print "<option value=usr_edt>修正\n";
	print "<option value=usr_del>削除</select>\n";
	print "記事No <input type=text name=no size=3>\n";
	print "パスワード <input type=password name=pwd size=4 maxlength=8>\n";
	print "<input type=submit value=\"送信\"></form>\n";

	# 著作権表示部
	# MakiMakiさんの画像使用の有無に関わらずこの2箇所のリンク部の
	# 削除改変を禁止します
	print "$banner2<P><blockquote><small><!-- $ver -->\n";
	print "- <a href='http://www.kent-web.com/' target='_top'>KENT</a> &amp; ";
	print "<a href='http://village.infoweb.ne.jp/~fwhf2602/' target='_top'>MakiMaki</a> -\n";
	print " ----- modified by <a href='http://www.arunet.co.jp/~mghj/' target='_top'>MGHJ</a></small></blockquote>\n</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;
	if ($times > $timesx + 3600) { &error("unknown reason"); }
	elsif ($times <= $timesx + 9) { &error("unknown reason"); }

	# クッキーを発行
	&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{'color'}<>$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{'color'}<>$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{'color'}<>$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{'color'}<>$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{'color'}<>$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);

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

	# クッキーを取得
	&get_cookie;

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

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

	# 関連記事出力
	print "- 以下は、記事NO. <B>$in{'no'}</B> に関する<a href='#RES'>返信フォーム</a>です -<hr>\n";

	while (<IN>) {
		($no,$reno,$date,$name,$mail,$sub,$com,$url) = split(/<>/);

		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>\n";
		}
	}
	close(IN);

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

	print <<"EOM";
<a name="RES"></a>
<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><b>おなまえ</b></td>
  <td><input type=text name=name value="$c_name" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>Ｅメール</b></td>
  <td><input type=text name=email value="$c_email" size=$nam_wid></td>
</tr>
<tr>
  <td nowrap><b>タイトル</b></td>
  <td><input type=text name=sub value="$resub" size=$sub_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>
  <td nowrap><b>ＵＲＬ</b></td>
  <td><input type=text name=url value="http://$c_url" size=$url_wid></td>
</tr>
EOM

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

	if ($icon_mode) {
		print "<tr><td nowrap><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>\n";

		if ($ImageView == 1) {
			print "[<a href=\"javascript:ImageUp()\">画像イメージ参照</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">画像イメージ参照</a>]";
		}
		print "</td></tr>\n";
	}

	print "<tr><td nowrap><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 nowrap><b>文字色</b></td><td>\n";

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

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

		} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">";
			print "<font color=$COLORS[$_]>■</font>\n";
		}
	}

	print "</td></tr></table></form>\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'};
	$timesx = $in{'checkin'};
	$in{'url'} =~ s/^http\:\/\///;
#	if ($in{'sub'} eq "") { $in{'sub'} = "無題"; }

}

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

	&header;
	print <<"EOM";
[<a href="$script?">掲示板にもどる</a>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">掲示板の利用上の注意</font>
</th></tr>
</table>
<P><center>
<table width="90%" border=1 cellpadding=10>
<tr><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>
</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>]
<table width="100%">
<tr><th bgcolor="#0000A0">
  <font color="#FFFFFF">ワード検索</font>
</th></tr></table>
<P>
<UL>
  <LI>検索したい<b>キーワード</b>を入力し、「条件」「表\示」を選択して「検索」ボタンを押して下さい。
  <LI>キーワードは「半角スペース」で区切って複数指定することができます。
<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'};

		# URLエンコード
		$word = $in{'word'};
		$word =~ s/([\x00-\x1F\x7F\x80-\xff])/"%" . unpack("H2", $1)/eg;

		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=find&page=$back_line&word=$word&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=$word&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>[<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>\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 = 65;
		$url_wid = 48;
		$nam_wid2 = 20;
	} elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 60;
		$url_wid = 70;
		$nam_wid2 = 20;
	} else {
		$nam_wid = 20;
		$sub_wid = 25;
		$com_wid = 56;
		$url_wid = 50;
		$nam_wid2 = 10;
	}
}

#------------------#
#  クッキーの発行  #
#------------------#
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'}\,color<>$in{'color'}";
	print "Set-Cookie: KEFBBS=$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{'KEFBBS'});
	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_color = $COOK{'color'};

	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{'color'}) { $c_color = $in{'color'}; }
}

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

	&header if (!$head_flag);
	print "<center><hr width=400><h3>ERROR !</h3>\n";
	print "<P><font color=red>$_[0]</font>\n";
	print "<P><hr 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 "<table width='100%'><tr><th bgcolor=\"#800080\">\n";
	print "<font color=\"#FFFFFF\">管理モード</font>\n";
	print "</th></tr></table>\n";

	if ($in{'pass'} eq "") {
		print "<P><center><h4>パスワードを入力して下さい</h4>\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) {
								if ($no == $del) { $papa ="father"; }
						$flag=1; $delnum = $del; 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 ($del_mail) {
				&delmail;
			}

		}

		# 管理を表示
		if ($page eq "") { $page = 0; }
		print "<P><center><table><tr><td>\n";
		print "<UL><LI>削除する記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n";
		print "<LI>親記事を削除するとレス記事も一括して削除されます。</UL>\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=\"削除する\">";
		print "<input type=reset value=\"リセット\">\n";
		print "<P><table border=0 cellspacing=1>\n";
		print "<tr><th>削除</th><th>記事NO</th><th>投稿日</th><th>タイトル</th>";
		print "<th>投稿者</th><th>URL</th><th>コメント</th><th>ホスト名</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></th></tr>\n"; }

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

		}
		close(IN);

		print "<tr><th colspan=8><hr></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 "") { $papa = "father"; $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; }
	
	# 削除メール
	if ($del_mail) {
		$delnum = $in{'no'};
		&delmail;
	}
}



#----------------#
#  記事修正処理  #
#----------------#
sub usr_edt {
	local($no,$reno,$dt,$name,$mail,$sub,$com,
		$url,$host,$pw,$color,$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,$color,$icon)
									 = split(/<>/);
		if ($in{'no'} == $no) {
			$pw2 = $pw;
			$flag=1;
			if ($reno eq "") { $papa ="father"; }
			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{'color'}<>$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=1 cellpadding=10 width='85%'><tr><td bgcolor=\"$tbl_color\"><tt>\n";
		print "お名前：<b>$in{'name'}</b><br>\n";
		print "メール：$in{'email'}<br>\n";
		print "題　名：<b>$in{'sub'}</b><br>\n";
		print "ＵＲＬ：$in{'url'}</tt><P>\n";
		print "本　文：<font color=\"$in{'color'}\">$in{'comment'}</font>\n";
		print "</td></tr></table>\n";
		print "<P><form action=\"$script\">\n";
		print "<input type=submit value='リストに戻る'></form>\n";
		print "</div>\n</body>\n</html>\n";
		
		# 修正メール
		if ($edt_mail) { $edtnum = $in{'no'}; &edtmail; }

		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;

	&header;
	print <<"EOM";
<b>- 変更する部分のみ修正して送信ボタンを押して下さい -</b>
<P>
<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><b>おなまえ</b></td>
  <td><input type=text name=name size="$nam_wid" value="$name"></td>
</tr>
<tr>
  <td nowrap><b>Ｅメール</b></td>
  <td><input type=text name=email size="$nam_wid" value="$mail"></td>
</tr>
<tr>
  <td nowrap><b>題　　名</b></td>
  <td>
    <input type=text name=sub size="$sub_wid" value="$sub">
    <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">$com</textarea>
  </td>
</tr>
<tr>
  <td nowrap><b>ＵＲＬ</b></td>
  <td><input type=text size="$url_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><b>イメージ</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()\">画像イメージ参照</a>]";
		} else {
			print "[<a href=\"$script?mode=image\" target=\"_blank\">画像イメージ参照</a>]";
		}
		print "</td></tr>\n";
	}
	print "<tr><td nowrap><b>文字色</b></td><td>\n";
	foreach (0 .. $#COLORS) {
		if ($color eq "$COLORS[$_]") {
			print "<input type=radio name=color value=\"$COLORS[$_]\" checked>";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		} else {
			print "<input type=radio name=color value=\"$COLORS[$_]\">";
			print "<font color=\"$COLORS[$_]\">■</font>\n";
		}
	}

	print "</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 (length($in{'sub'}) > $sub_len*2) { &error("タイトルが長くなりすぎました。少し削ってね"); }
	if ($in{'comment'} eq "") { &error("コメントが入力されていません"); }
	if ($in_email && $in{'email'} !~ /[\w\.\-\_]+\@[\w\.\-\_]+\.[a-zA-Z]{2,3}/) {
		&error("Ｅメールの入力内容が正しくありません");
	}

	if ($in{'sub'} eq "") { &error("タイトルがありません"); }

	local($flag)=0;
	foreach (@denywords) {
		if (!$_) { next; }
		if ($in{'comment'} =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("unknown reason"); }

	local($flag)=0;
	foreach (@denyurl) {
		if (!$_) { next; }
		if ($in{'url'} =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("unknown reason"); }

	# 管理アイコンのチェック
	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);

	# 3分以上古いロックは削除する
	if (-e $lockfile) {
		($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 180) { &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);
		}
	}
	$lock_flag=1;
}

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

#--------------#
#  削除メール送信  #
#--------------#
sub delmail {

	&get_time;
	&jcode'convert(*delbcomment,'jis');
	&jcode'convert(*delccomment,'jis');
	while (length($delnum) < 3 ) { $delnum = "0$delnum"; }

	# 同報BCC送信準備
	if ($mailing2) {
		# リストを開く
		open(MLST,"$maillist") || &error("エラー,リストファイルが開けません。");
		@mlists = <MLST>;
		close(MLST);

		foreach $mlist (@mlists) {
			$mlist =~ s/\r\n/\n/g;
			$mlist =~ s/\r|\n/\,\n/g;
			push(@sendlist,$mlist);
		}
	}

	if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました。");
	}
	print MAIL "X-Mailer: $headline MAILER\n";
	print MAIL "To: $mailto\n";
	if ($del_mail2) {
		print MAIL "BCC: @sendlist"; }
	print MAIL "From: $mailto\n";
	print MAIL "Subject: [$title]$delnum DELETED!\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "Content-type: text/plain\n";
	print MAIL "\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$delnum $papa $delbcomment\n";
	print MAIL "$date $delccomment\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
	
}

#--------------#
#  修正メール送信  #
#--------------#
sub edtmail {

	&get_time;
	&jcode'convert(*edtbcomment,'jis');
	&jcode'convert(*edtccomment,'jis');
	while (length($edtnum) < 3 ) { $edtnum = "0$edtnum"; }

	if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました。");
	}
	print MAIL "X-Mailer: $headline MAILER\n";
	print MAIL "To: $mailto\n";
	print MAIL "From: $mailto\n";
	print MAIL "Subject: [$title]$edtnum EDITED!\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "Content-type: text/plain\n";
	print MAIL "\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$edtnum $papa $edtbcomment\n";
	print MAIL "$date $edtccomment\n";
	print MAIL "--------------------------------------------------------\n";
	close(MAIL);
	
}

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

	$nostyle = $no;
	while (length($nostyle) < 3 ) { $nostyle = "0$nostyle"; }
	if ($in{'reno'}) { $renostyle = $in{'reno'};
		while (length($renostyle) < 3 ) { $renostyle = "0$renostyle"; }
	} else { $renostyle = $nostyle;
	}

	# メールタイトルを定義
	$MailSub = "[$title]$renostyle/$nostyle:$in{'sub'}";
	$MailSub2 = "[$title]$nostyle:オプション";

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

	# メール本文を定義
	$MailBody = <<"EOM";
投稿日時：$date　　投稿者名：$in{'name'}
Ｅメール：$in{'email'}
タイトル：$in{'sub'}
ＵＲＬ  ：$in{'url'}
コメント：
$com
EOM

	# メール本文を定義
	$MailBody2 = <<"_EOM";
ホスト名：$host
アドレス名：$addr
ブラウザ：$ENV{'HTTP_USER_AGENT'}
PASS：$in{'pwd'}
_EOM

	# JISコード変換
    	&jcode'convert(*MailSub,'jis');
    	&jcode'convert(*MailSub2,'jis');
    	&jcode'convert(*MailBody,'jis');
    	&jcode'convert(*MailBody2,'jis');
    	&jcode'convert(*mailcomment,'jis');

	# 同報BCC送信準備
	if ($mailing2) {
		# リストを開く
		open(MLST,"$maillist") || &error("エラー,リストファイルが開けません。");
		@mlists = <MLST>;
		close(MLST);

		foreach $mlist (@mlists) {
			$mlist =~ s/\r\n/\n/g;
			$mlist =~ s/\r|\n/\,\n/g;
			push(@sendlist,$mlist);
		}
	}
	
	# メールアドレスがない場合はダミーメールに置き換え
	if ($in{'email'} eq "") { $email = 'nomail@xxx.xxx'; }
	else { $email = $in{'email'}; }

	open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました");
	print MAIL "To: $mailto\n";
	if ($mailing2) {
		print MAIL "BCC: @sendlist"; }
	print MAIL "From: $mailto2\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: $headline MAILER\n\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$renostyle/$nostyle\n";
	print MAIL "$MailBody\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$mailcomment\n";
	close(MAIL);
	
	open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました");
	print MAIL "To: $mailto\n";
	print MAIL "From: $mailto\n";
	print MAIL "Subject: $MailSub2\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: $headline MAILER\n\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$renostyle/$nostyle\n";
	print MAIL "$MailBody2\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">
<!--
body,tr,td,th { font-size: $b_size }
a:hover { color: $alink }
span { font-size: $t_size }
big  { font-size: 14pt }
small { font-size: 9pt }
-->
</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 "<title>$title</title></head>\n";
	print "<body background=\"$backgif\" bgcolor=\"$bgcolor\" text=\"$text\" link=\"$link\" vlink=\"$vlink\" alink=\"$alink\">\n";


##	# 頭のクロスリンク
##	print <<"_EOM";
##
##	<table border=0 cellpadding=0 cellspacing=0 bgcolor="#ffffff" width=100%>
##		<tr>
##			<td rowspan=2 valign=middle><img src="../image/KEF2001.gif"  width=200 height=37 alt="kef2001" border="0">
##			</td>
##			<td valign=top><a href="../"><img src="../image/topbutton.gif"  width=120 height=30 alt="top" border="0"></a>
##			</td>
##			<td valign=top><a href="../info/schedule.html"><img src="../image/schegray.gif"  width=120 height=30 alt="schedule" border="0"></a>
##			</td>
##			<td valign=top><a href="../youkou/sankaboshu.htm"><img src="../image/youkougray.gif"  width=120 height=30 alt="youkou" border="0"></a>
##			</td>
##			<td valign=top><a href="../program/index.html"><img src="../image/shubetgray.gif"  width=120 height=30 alt="shubetsu" border="0"></a>
##			</td>
##		</tr>
##		<tr>
##			<td align=center></td>
##			<td align=center><a href="../talk/KEFbbs.cgi"><img src="../image/hirobaorange.gif"  width=120 height=30 alt="hiroba" border="0"></a></td>
##			<td align=center colspan=2></td>
##<!--			<td align=center><font size=2 color=999999>フェスニュース(準備中)</font></td>
##			<td align=center><font size=2 color=999999>関係リンク集(準備中)</font></td>-->
##		</tr>
##	</table>
##<hr>
##
##_EOM
}

#-----------------#
#  自動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 width=\"75%\">\n";
	print "<b><big>画像イメージサンプル</big></b>\n";
	print "<P><small>- 現在登録されている画像イメージは以下のとおりです -</small>\n";
	print "<hr width=\"75%\">\n";
	print "<P><table border=1 cellpadding=5 cellspacing=0><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 ($host eq '') { $host = $addr; }
	if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $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>]
<table width="100%"><tr><th bgcolor="#000080">
  <font color="#FFFFFF">過去ログ[$in{'pastlog'}]</font>
</th></tr></table>
<P><table><tr><td>
<form action="$script" method="$method">
<input type=hidden name=mode value=past>
過去ログ：<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='移動'></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 "ワード検索：<input type=text name=word size=30 value=\"$in{'word'}\">\n";
	print "条件：<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 "表\示：<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='検索'></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 "検索結果：<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'};

		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=past&page=$back_line&word=$word&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=$word&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>\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>\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;
}
