#!/usr/local/bin/perl

#┌─────────────────────────────────
#│  Cosmo Navigator v2.2 (2002/08/02)
#│  Copyright(C) KENT WEB 2002
#│  webmaster@kent-web.com
#│  http://www.kent-web.com/
#└─────────────────────────────────
$ver = 'COSMO NAVI v2.2';
#┌─────────────────────────────────
#│ver C-101bana　テストバージョン
#│改造配布 Gorio Club 
#│[ 注意事項 ]
#│ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#│    いかなる損害に対して作者は一切の責任を負いません。
#│ 2. 設置に関する質問はテストバージョンの為、ご遠慮ください。
#│ 3. 同梱の「アイコン」は、Kumazo氏のものです
#│    http://homepage1.nifty.com/KUMAZO/
#│ 3. 著作権の都合上ややこしくなるので再配布は禁止します
#└─────────────────────────────────

#============#
#  基本設定  #
#============#

# コード変換ライブラリ取込
require './jcode.pl';

# 本体文字サイズ：ポイント数
#$b_size = '10pt';

# 管理用パスワード（英数字で）
$pass = 'mayumayu';

# スクリプト名
$script = './navi.cgi';

# ログファイル
$logfile = './navi.dat';

# 戻り先 (絶対パスなら http://から)
$home = "/";

# methodの形式 (POST or GET)
$method = 'POST';

# 紹介コメントの制限文字数（全角文字）
$msg_limit = 400;

# NEWアイコンの表示日数
$newtime = 20;

# 新着情報の最新表示件数
$w_new = 10;

# 登録内容の１ページ当りの表示数
$p_view = 50;

# URL登録形態
#  0 : ユーザが自由に登録
#  1 : 管理者が登録
$regtype = 1;

# ロックファイル
#  → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 0;

# ロックファイル名（フルパスだと / から記述する）
$lockfile = './lock/navi.lock';

# 画像までのディレクトリ→ 最後は必ず / で閉じない
$gif_path = "./gifimg";

# ミニカウンタの設置
# → 0=no 1=テキスト 2=GIF画像
$gcounter = 1;

# ミニカウンタの桁数
$mini_fig = 6;

# テキストのとき：ミニカウンタの色
$gcnt_color = "#8080FF";

$mini_w = 30;		# カウンタ画像の横サイズ
$mini_h = 30;		# 画像の縦サイズ

# カウンタファイル (666)
$gcntfile = './count1.dat';

# バックアップ用キーファイル
$keyfile = "./bkup.dat";

# バナーの画像(絶対パス http://から)
$gdeico="/images/banner.gif";

# バックアップファイルを置くディレクトリ
#   → naci.cgiと同一ディレクトリの場合は「.」のままでOK

$backdir = ".";

# 以下は分類（ジャンル）の指定です。
#  --> 変数のカギ括弧内は 0 から連番で続ける
$parts[0]  = '雑誌';
$parts[1]  = '書籍';
$parts[2]  = 'パソコン';
$parts[3]  = '自作パーツ';
$parts[4]  = '周辺機器';
$parts[5]  = 'ソフトウェア';
$parts[6]  = 'GPS関連';
$parts[7]  = 'モバイル機器';
$parts[8]  = 'ゲーム';
$parts[9]  = '-';
$parts[10] = '-';
$parts[11] = '-';
$parts[12] = '食品';
$parts[13] = 'その他';

# 上の分類（ジャンル）のアイコン指定です。分類の数アイコンが必要
@icon_go = ('00.png','01.png','02.png','03.png','04.png','05.png','06.png','07.png','08.png','09.png','00.png','01.png');

# 上の分類アイコンを使うyes=1 no=0
$pngter = 0;

# 上の分類ポインタの形状(□)使わない場合 no=0
$pointer = "■";

# 上の分類ポインタの色（□の色）
$pt_color = "#000080";

# --- 環境設定
$bground = "";			# 壁紙（http://から記述）
$bgcolor = "#FFFFFF";		# 背景色
$text    = "#000000";		# 文字色
$link    = "#008080";		# リンク色（未訪問）
$vlink   = "#000080";		# リンク色（既訪問）
$alink   = "#FF0000";		# リンク色（訪問中）

# 横線の色
$obi_color = "#B7B7B7";

$goa_color = "#FFFFFF";#記事の枠
$gob_color = "#B7B7B7";#記事の背景

$goc_color = "#E0FFFF";#修正・削除の文字

# 見出しの色
$goe_color = "#5A49FF";#背景
$gof_color = "#FFFFFF";#文字

# TOPのテーブルの大きさ
$gta_wid = "90%";#数値は%でも、OK　例"90%"

# タイトル名
$title = "お勧め";

# タイトル文字の色
$t_color = "#000080";

# タイトルの文字フォントタイプ
$t_face = "ＭＳ Ｐゴシック";

# タイトルサイズ：ポイント数
$t_size = '12pt';

# タイトルに画像を使う場合1
$t_gif = "";		# ""で使わない
$t_wid = 255;		# 画像の横サイズ（ピクセル）
$t_hgt = 39;		# 　〃　縦サイズ（ピクセル）

#タイトルに画像を使う場合２
$titpng = "";	# ""で使わない
$ts_wid = 400;		# 画像の横サイズ（ピクセル）
$ts_hgt = 70;		# 　〃　縦サイズ（ピクセル）

# NEWアイコン
$newgif = "new.png";
$new_w = 20;		# 　〃　横サイズ
$new_h = 8;		# 　〃　縦サイズ

# お薦めアイコン
$recom  = 'recom.png';
$rec_w = 16;		# 　〃　横サイズ
$rec_h = 16;		# 　〃　縦サイズ

# メール通知 (0=no 1=登録者のみ 2=登録者と管理者へ通知) 
#  --> sendmail必須
$mailing = 0;

# sendmailのパス
$sendmail = '/usr/lib/sendmail';

# 管理者メールアドレス（メール通知する時）
$admin_mail = 'xxx@xxx.xxx';

# 管理者名（メール通知する時）
$admin_name = "管理人";

# 管理者のURL（メール通知する時）
$admin_url = 'http://www.xxx.xxx/~xxx/';

# 同一URLの二重登録を許可する (0=no 1=yes)
$w_url = 0;

# URLジャンプ形式（Locaion関数の使えないサーバ対応）
#   0 : Locationヘッダ
#   1 : METAタグ
$meta_jump = 0;

# METAタグジャンプの待ち時間（秒数）
#   → 上記設定で「1」とした場合のみ
$wait = 1;

# タグ広告挿入オプション (FreeWebなど）
#   → <!-- 上部 --> <!-- 下部 --> の代わりに「広告タグ」を挿入する。
#   → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。
$banner1 = '<!-- 上部 -->';	# 上部に挿入
$banner2 = '<!-- 下部 -->';	# 下部に挿入

# 登録アクセス拒否
#  --> 新規登録処理をホスト名から拒否します
@deny = (
	'ppp*.xxx.co.jp',
	'cache*.*.interlog.com',
	'*.anonymizer.com',
	'',
	'',
	'',
	'',
	''
	);

#============#
#  設定完了  #
#============#

# メイン処理
&decode;
if ($mode eq 'howto') { &howto; }
if ($mode eq 'new_sort') { &new_sort; }
if ($mode eq 'ranking') { &ranking; }
if ($mode eq 'new_url') { &new_url; }
if ($mode eq 'regist') { &regist; }
if ($mode eq 'mente') { &mente; }
if ($mode eq 'do_mente') { &do_mente; }
if ($mode eq 'admin') { &admin; }
if ($mode eq 'admin_edit') { &admin_edit; }
if ($mode eq 'search') { &search; }
if ($mode eq 'part') { &part_view; }
if ($in{'links'} ne '') { &link_jump; }
&html_view;
exit;

#------------#
#  初期画面  #
#------------#
sub html_view {
	# バックアップ処理
	$bkup_flag=0;
	if (!$mode) {
		# キーファイルを読み込み分解
		open(BK,"$keyfile") || &error("Open Error : $keyfile");
		$BKUP = <BK>;
		close(BK);
		($today,$key) = split(/:/, $BKUP);

		# 日付が異なればバックアップ処理を行う
		&get_time;
		if ($mday ne "$today") {
			$bkup_flag=1;

			# バックアップファイルを定義
			$bakfile = "$backdir/$key\.bak";

			# ローテーションキーを定義
			if ($key eq 'A') { $newkey = 'B'; }
			elsif ($key eq 'B') { $newkey = 'C'; }
			else { $newkey = 'A'; }

			# ロック開始
			if ($lockkey) { &lock; }

			# キーファイルを更新
			open(BK,">$keyfile") || &error("Write Error : $keyfile");
			print BK "$mday\:$newkey";
			close(BK);
		}
	}

	# ログを読み込み
	open(IN,"$logfile") || &error("Open Error : $logfile");
	if ($bkup_flag) { open(OUT,">$bakfile") || &error("Open Error : $bakfile"); }
	while (<IN>) {
		print OUT $_ if ($bkup_flag);
		($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$date,$t) = split(/<>/);
		foreach (0 .. $#parts) {
			if ($pt eq "$_") {
				$bunrui[$_]++;
				last;
			}
		}
	}
	close(IN);
	close(OUT) if ($bkup_flag);

	# ロック解除
	if ($bkup_flag && $lockkey) { &unlock; }

	&header;
	print "<center>\n";
	print "$banner1<P>\n" if ($banner1 ne '<!-- 上部 -->');
if ($titpng) {	print "<img src=\"$gif_path/$titpng\" width=\"$ts_wid\" height=\"$ts_hgt\"><br>\n";
	}
	if ($t_gif) {
		print "<img src=\"$gif_path/$t_gif\" width=\"$t_wid\" height=\"$t_hgt\">\n";
	} else {
		print "<h1>$title</h1>\n";
	}
print "\n";
&get_host;
 
#print "<br>\n";
	print "<table width=$gta_wid height=2 cellspacing=0 cellpadding=0>\n";
	print "<tr><td bgcolor=$obi_color><img width=1 height=2></td></tr></table>\n";
	print "[<a href=\"$home\" target=\"_top\">ホームに戻る</a>]\n";
	print "[<a href=\"$script?mode=howto\">注意事項</a>]\n";
	if (!$regtype) { print "[<a href=\"$script?mode=new_url\">新規登録</a>]\n"; }

	print <<"EOM";
[<a href="$script?mode=new_sort">新着情報</a>]
[<a href="$script?mode=ranking">人気ランク</a>]
[<a href="$script?mode=admin">管理用</a>]
<table width=$gta_wid height=2 cellspacing=0 cellpadding=0>
<tr><td bgcolor=$obi_color><img width=1 height=2></td></tr></table>

EOM
	if ($gcounter) { &gcounter; }
else {print "<P>"}

	print "<table border=0 width=$gta_wid cellpadding=10 bgcolor=\"$gob_color\">\n";

	$flag=0;
	foreach (0 .. $#parts) {

		if ($bunrui[$_] eq '') { $bunrui[$_] = 0; }

		if ($flag == 0) {

print "<tr><td width=280 bgcolor=\"$goa_color\">\n";

if ($pointer){
print "<font color=$pt_color>$pointer</font>\n";
}
print " <B><a href=\"$script?mode=part&part=$_&k=$bunrui[$_]\">\n";
if ($pngter){
print "<img src=\"$gif_path/$icon_go[$_]\" alt=\"$parts[$_]\" border=0>\n";
}
print "$parts[$_]</a></B>($bunrui[$_])</td>\n";
			$flag=1;

		} else {
print "<td width=280 bgcolor=\"$goa_color\">\n";
if ($pointer){
print "<font color=$pt_color>$pointer</font>\n";
}
print " <B><a href=\"$script?mode=part&part=$_&k=$bunrui[$_]\">\n";
if ($pngter){
print "<img src=\"$gif_path/$icon_go[$_]\" alt=\"$parts[$_]\" border=0>\n";}
print "$parts[$_]</a></B>($bunrui[$_])</td></tr>\n";
			$flag=0;
		}
	}

	if ($flag == 1) {
		print "<td width=280></td></tr>\n";
	}

	print "</table>\n";


	print "<P><table width=$gta_wid height=2 cellspacing=0 cellpadding=0>\n";
	print "<tr><td bgcolor=$obi_color><img width=1 height=2></td></tr></table>\n";

	print <<"EOM";

<form action="$script" method="$method">
<input type=hidden name=mode value="search">
<table>
<tr>
  <td>登録リストを検索<br>
    <input type=text size=35 name=word><input type=submit value=" 検索 ">
  </td>
</tr>
<tr>
  <td>
<small>条件 <select name=cond>
<option value="AND" checked>AND
<option value="OR">OR</select>
表\示</small> <select name=view>
<option value="10">10件
<option value="15">15件
<option value="20">20件
<option value="25">25件
<option value="30">30件
</select>
</td></form>
</tr></table>
<P>
<table width=$gta_wid height=2 cellspacing=0 cellpadding=0>
<tr>
  <td bgcolor="$obi_color"><img width=1 height=2></td>
</tr>
</table>
<P>
EOM

	# 著作権表示（削除・改変を禁止します）
	print "<P>$banner2<P><small><!-- $ver -->\n";
	print "- <a href='http://www.kent-web.com/' target='_top'>Cosmo Navi</a> -<br><br>\n";
#	print "Icon:<a href='http://homepage1.nifty.com/KUMAZO/' target='_top'>Kumazo</a><br><br>\n";
	print "Edit:<a href='http://gorio.hp.infoseek.co.jp/' target='_top'>C-101bana</a>\n";
	print "</small><br></center><br>\n";
	print "</body></html>\n";
}
sub open_dat {
    open(IN,"$_[0]") || &error("$_[0]読み込みエラー:$_[0]が存在しないかパーミッションが不正です");
    local(@lines) = <IN>;
    close(IN);
    return @lines;
}
#----------------#
#  新規登録画面  #
#----------------#
sub new_url {
	# 権限チェック
	if ($regtype) {
		if ($in{'pass'} eq "") { &error("登録は管理者のみです"); }
		elsif ($in{'pass'} ne "$pass") { &error("認証エラー"); }
		$pwd_message = "<LI>パスワードは今後のメンテナンスに必要なので必ず記入してください。\n";
	}

	# ホスト名をチェック
	&get_host;
	local($flag)=0;
	foreach (@deny) {
		if (!$_) { next; }
		$_ =~ s/\*/\.\*/g;
		if ($host =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("現在新規登録はできません"); }

	&header;
	print <<"EOM";
[<a href="$script?">メニューに戻る</a>]<br>
<table width="100%"><tr><th bgcolor="$goe_color">
<font color="$gof_color">新規登録</font>
</th></tr></table>
<center>
<P>
<table><tr><td>
<OL>
  <LI>新規登録を行います。
  <LI>下記フォームに内容を記述し、登録ボタンを押してください。
$pwd_message
</OL>
</td></tr></table>
<table width=$gta_wid height=2 cellspacing=0 cellpadding=0>
<tr><td bgcolor="$obi_color"><img width=1 height=2></td></tr>
</table>
<form action="$script" method="$method">
<input type=hidden name=mode value="regist">
<input type=hidden name=pass value="$in{'pass'}">
<table border=0>
<tr><td><b>管理者名</b>〇</td><td><input type=text name=name size=25 value="tix"></td></tr>
<tr><td><b>Ｅメール</b>〇</td><td><input type=text name=email size=25 value="tix"></td></tr>
<tr><td><b>バナー</b></td><td><input type=text name=bburl size=60 value="http://"></td></tr>
<tr><td><b>ＵＲＬ</b>〇</td><td><input type=text name=url size=60 value="http://"></td></tr>
EOM

	if (!$regtype) {
		print "<tr><td><b>パスワード</b>〇</td>";
		print "<td><input type=password name=pwd size=8 maxlength=8>";
		print "（英数字で8文字以内）</td></tr>\n";
	}

	print "<tr><td colspan=2><hr size=2></td></tr>\n";
	print "<tr><td><b>分　類</b>〇</td><td>\n";

	if ($in{'part'}) {
		print "<select name=part>\n";
	} else {
		print "<select name=part size=4>\n";
	}

	foreach (0 .. $#parts) {
		if ($in{'part'} eq "$_") {
			print "<option value=\"$_\" selected>$parts[$_]\n";
		} else {
			print "<option value=\"$_\">$parts[$_]\n";
		}
	}

	print <<"EOM";
</select></td></tr>
<tr>
  <td colspan=2><b>ホームページのタイトル</b>〇<br>
  <input type=text name=sub size=60></td>
<tr>
  <td colspan=2><b>ホームページの紹介</b>〇（全角$msg_limit文字以内で）<br>
  <textarea name=msg cols=52 rows=3></textarea></td>
</tr>
<tr>
  <td colspan=2>
〇の付いた項目は必ず入力すること、
    <input type=submit value="登録する"><input type=reset value="リセット">
  </td>
</tr>
</table>
</form>
<table width=$gta_wid height=2 cellspacing=0 cellpadding=0>
<tr><td bgcolor="$obi_color"><img width=1 height=2></td></tr>
</table>
</body>
</html>
EOM
	exit;
}

#------------#
#  登録処理  #
#------------#
sub regist {
	# 権限チェック
	if ($regtype) {
		if ($in{'pass'} eq "") { &error("登録は管理者のみです"); }
		elsif ($in{'pass'} ne "$pass") { &error("認証エラー"); }
	}

	# フォームチェック
#	if ($in{'name'} eq '') { &error("なまえの入力がありません"); }
#	if ($in{'email'} !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です"); }
	if ($in{'url'} eq '') { &error("URLの入力がありません"); }
	if (!$regtype && $in{'pwd'} eq '') { &error("パスワードの入力がありません"); }
	if ($in{'pwd'} =~ /\W/) { &error("パスワードに全角文字が含まれています。半角の英数字で入力してください"); }
	if ($in{'part'} eq '') { &error("分類の指定がありません"); }
	if ($in{'sub'} eq '') { &error("タイトル名の入力がありません"); }
	if ($in{'msg'} eq '') { &error("紹介コメントの入力がありません"); }
	if (length($in{'msg'}) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています"); }

	# 日時の取得
	&get_time;

	# ホスト名を取得
	&get_host;

	# ロック開始
	if ($lockkey) { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	($no,$dmy) = split(/<>/, $lines[0]);
	$no++;

	if (!$w_url) {
		$flag=0;
		foreach (@lines) {
			# URLが既登録でないかをチェック
			local($no,$part,$sub,$hp) = split(/<>/);

			if ($in{'url'} eq "$hp") { $flag=1; last; }
		}
		if ($flag) { &error("登録しようとするURLは既に登録済です"); }
	}

	# パスワードを暗号化
	$PW = &encrypt($in{'pwd'});

	# 更新
	unshift(@lines,"$no<>$in{'part'}<>$in{'sub'}<>$in{'url'}<>$in{'name'}<>$in{'email'}<>$PW<>$in{'msg'}<>$date<>$times<>0<>0<>$host<>$in{'bburl'}<>\n");
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @lines;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }

	# お礼メール通知
	if ($mailing) { &mail_to; }

	# 登録完了画面
	&header;
	print "<br><br><center>\n";
	print "<hr size=2 color=\"$obi_color\" width=$gta_wid>\n";
	print "<h3>ありがとうございます。以下の内容で登録が完了しました</h3>\n";
	print "<hr size=2 color=\"$obi_color\" width=$gta_wid>\n";
	print "<table border=0 cellpadding=5>\n";
	print "<tr><td>管理者名</td><td>：</td><td>$in{'name'}</td></tr>\n";
	print "<tr><td>Ｅメール</td><td>：</td><td>$in{'email'}</td></tr>\n";
print "<tr><td>バナー</td><td>：</td><td>http://$in{'bburl'}</td></tr>\n";

	print "<tr><td>ＵＲＬ</td><td>：</td><td>http://$in{'url'}</td></tr>\n";
	if (!$regtype) {
		print "<tr><td>PASSWORD</td><td>：</td><td>$in{'pwd'}</td></tr>\n";
	}
	print "<tr><td>分　類</td><td>：</td><td>$parts[$in{'part'}]</td></tr>\n";
	print "<tr><td>タイトル</td><td>：</td><td>$in{'sub'}</td></tr>\n";
	print "<tr><td>紹介文</td><td>：</td><td>$in{'msg'}</td></tr>\n";
	print "</table>\n";
	print "<form action=\"$script\" method=$method>\n";
	print "<input type=submit value=\"メニューに戻る\"></form>\n";
	print "<hr size=2 color=\"$obi_color\" width=$gta_wid>\n";
	print "</body></html>\n";
	exit;
}

#--------------#
#  メンテ画面  #
#--------------#
sub mente {
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$part,$sub,$hp,$name,$email,$pw,$msg,$date,$t) = split(/<>/);
		if ($in{'no'} eq "$no") { last; }
	}
	close(IN);

	&header;
	print <<"EOM";
[<a href="$script\?">メニューに戻る</a>]<br>
<table width="100%"><tr><th bgcolor="$goe_color">
<font color="$gof_color">登録情報の修正・削除</font>
</th></tr></table>
<center>
<P>
<table>
<tr><td>
<OL>
<LI>下記ホームページのメンテナンスを行います。
<LI>処理内容を選択し、登録時に指定した「パスワード」を入力してください。
</OL>
</td></tr>
</table>
<P>
<table border=0>
<tr><td><B>タイトル</B></td><td>：</td><td><font color=$t_color size=4>$sub</font></td></tr>
<tr><td><B>ＵＲＬ</B></td><td>：</td><td><font color=$t_color size=4>http://$hp</font></td></tr>
</table>
<P>
<hr size=2 color="$obi_color" width=$gta_wid>
<form action="$script" method="$method">
<input type=hidden name=mode value="do_mente">
<input type=hidden name=no value="$in{'no'}">
<input type=radio name=action value="mente" checked>修正
<input type=radio name=action value="delete">削除
<P><B>パスワード</B>
<input type=password name=pwd size=8 maxlength=8><input type=submit value=" 認証 ">
</form>
<hr size=2 color="$obi_color" width=$gta_wid>
</center>
</body>
</html>
EOM
	exit;
}

#--------------#
#  メンテ実行  #
#--------------#
sub do_mente {
	# フォームチェック
	if ($in{'pwd'} eq '') { &error("パスワードが入力されていません"); }

	# ロック開始
	if ($lockkey && $in{'action'} ne 'mente') { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	# 修正処理実行
	if ($in{'action'} eq "go") {

		# フォームチェック
#		if ($in{'name'} eq '') { &error("なまえの入力がありません"); }
#		if ($in{'email'} !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です"); }
		if ($in{'url'} eq '') { &error("URLの入力がありません"); }
		if (!$regtype && $in{'pwd'} eq '') { &error("パスワードの入力がありません"); }
		if ($in{'pwd'} =~ /\W/) { &error("パスワードに全角文字が含まれています。半角の英数字で入力してください。"); }
		if ($in{'part'} eq '') { &error("分類の指定がありません"); }
		if ($in{'sub'} eq '') { &error("タイトル名の入力がありません"); }
		if ($in{'msg'} eq '') { &error("紹介コメントの入力がありません"); }
		if (length($in{'msg'}) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています"); }

		$flag=0;
		@new=();
		foreach (@lines) {
			($no,$pt,$sb,$hp,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho,$bhp)
								 = split(/<>/);
			if ($in{'no'} == $no) {
				$flag=1;

				# パスワード照合
				$check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype);

				$_ = "$no<>$in{'part'}<>$in{'sub'}<>$in{'url'}<>$in{'name'}<>$in{'email'}<>$pw<>$in{'msg'}<>$dt<>$ts<>$rec<>$cnt<>$ho<>$in{'bburl'}<>\n";
			}
			push(@new,$_);
		}
		if (!$flag) { &error("該当のデータが見つかりません"); }

		# 認証チェック
		if ((!$regtype && $check ne 'yes') || ($regtype && $in{'pwd'} ne $pass))
			{ &error("パスワードが違います"); }

		# 更新
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);

		# ロック解除
		if ($lockkey) { &unlock; }

		# 完了メッセージ
		&header;
		print "<P><hr width=400><center><h3>修正処理は完了しました</h3>\n";
		print "<P>[<a href=\"$script?\">メニューにもどる</a>]\n";
		print "<P><hr width=400>\n";
		print "</body></html>\n";
		exit;

	# 削除処理実行
	} elsif ($in{'action'} eq "delete") {

		$flag=0;
		@new=();
		foreach (@lines) {
			($no,$pt,$sb,$hp,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho,$bhp)
								 = split(/<>/);
			if ($in{'no'} != $no) { push(@new,$_); }
			else {
				$flag=1;

				# パスワード照合
				$check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype);
			}
		}
		if (!$flag) { &error("該当のデータが見つかりません"); }

		# 認証チェック
		if ((!$regtype && $check ne 'yes') || ($regtype && $in{'pwd'} ne $pass))
			{ &error("パスワードが違います"); }

		# 更新
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		print OUT @new;
		close(OUT);

		# ロック解除
		if ($lockkey) { &unlock; }

		# 完了メッセージ
		&header;
		print "<P><hr width=400><center><h3>削除処理は完了しました</h3>\n";
		print "<P>[<a href=\"$script?\">メニューにもどる</a>]\n";
		print "<P><hr width=400>\n";
		print "</body></html>\n";
		exit;

	}

	$flag=0;
	foreach (@lines) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$date,$ts,$rec,$count,$ho,$bhp)	= split(/<>/);

		if ($in{'no'} eq "$no") {
			$flag=1;

			# パスワード照合
			$check = &decrypt("$in{'pwd'}", "$pw") if (!$regtype);

			last;
		}
	}
	if (!$flag) { &error("指定のデータが見つかりません"); }

	# 認証チェック
	if (!$regtype && $check ne 'yes') { &error("パスワードが違います"); }
	elsif ($regtype && $in{'pwd'} ne "$pass") { &error("パスワードが違います"); }

	# 修正用画面を表示
	&header;
	print <<"EOM";
[<a href="$script?">メニューに戻る</a>]<br>
<table width="100%"><tr><th bgcolor="$goe_color">
  <font color="$gof_color">登録情報の修正</font>
</th></tr></table>
<P>
<center>
<table><tr><td>
<OL>
  <LI>以下のフォームにて登録内容の修正を行います。
  <LI>変更する部分のみ修正し、「送信する」ボタンを押してください。
</OL>
</td></tr></table>
<P>
<hr size=2 color="$obi_color" width=$gta_wid>
<form action="$script" method="$method">
<input type=hidden name=pwd value="$in{'pwd'}">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=action value="go">
<input type=hidden name=no value="$in{'no'}">
<input type=hidden name=mode value="do_mente">
<input type=hidden name=part value="$part">
<table border=0>
<tr>
  <td><b>管理者名</b></td>
  <td><input type=text name=name size=25 value="$name"></td>
</tr>
<tr>
  <td><b>Ｅメール</b></td>
  <td><input type=text name=email size=25 value="$email"></td>
</tr>
<tr>
  <td><b>バナー</b></td>
  <td><input type=text name=bburl size=60 value="http://$bhp"></td>
</tr>
<tr>
  <td><b>ＵＲＬ</b></td>
  <td><input type=text name=url size=60 value="http://$hp"></td>
</tr>
<tr><td colspan=2><hr size=2></td></tr>
<tr>
  <td><b>分　類</b></td>
  <td><select name=part>
EOM

	foreach (0 .. $#parts) {
		if ($part eq "$_") {
			print "<option value=\"$_\" selected>$parts[$_]\n";
		} else {
			print "<option value=\"$_\">$parts[$_]\n";
		}
	}

	$msg =~ s/<br>/\r/g;

	print <<"EOM";
</select></td></tr>
<tr><td colspan=2><b>ホームページのタイトル</b><br>
<input type=text name=sub size=60 value="$sub"></td>
<tr><td colspan=2><b>ホームページの紹介</b>（$msg_limit文字以内）<br>
<textarea name=msg cols=52 rows=3>$msg</textarea></td></tr>
<tr><td colspan=2><input type=submit value="送信する"><input type=reset value="リセット"></td></tr>
</table>
</form>
<hr size=2 color="$obi_color" width=$gta_wid>
</table>
</body></html>
EOM
	exit;
}

#------------------#
#  ランキング表示  #
#------------------#
sub ranking {
	$times = time;
	&header;
	print "[<a href=\"$script?\">メニューに戻る</a>]<br>\n";
	print "<table width='100%'><tr><th bgcolor=\"$goe_color\">\n";
	print "<font color=\"$gof_color\">人気ランキング</font></th></tr></table>\n";
	print "<P><center><table border=0 width='100%' bgcolor=\"$gob_color\" cellpadding=\"4\" >\n";
	print "<tr bgcolor=\"$goa_color\"><th nowrap>順　位</th><td nowrap><b>タイトル</b></td>\n";
	print "<td nowrap><b>コメント</b></td><td nowrap><b>分　類</b></td>\n";
	print "<td nowrap><b>アクセス数</b></td></tr>\n";
#	print "<tr><td colspan=5></td></tr>\n";

	# ランクファイルを読み込む
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		local($no,$part,$sub,$hp,$name,$email,$pw,$msg,$date,$ts,$rec,$count,$ho,$bhp) = split(/<>/);
		$no{$no}    = $no;
		$count{$no} = $count;
		$part{$no}  = $part;
		$sub{$no}   = $sub;
		$msg{$no}   = $msg;
		$ts{$no}    = $ts;
		$rec{$no}   = $rec;
$bhp{$no}   = $bhp;
	}
	close(IN);

	$rank1 = 0;
	$rank2 = 1;
	$count_tmp = 0;
	$i=0; $j=0;
	foreach (sort { ($count{$b} <=> $count{$a}) || ($a cmp $b) } keys(%count)) {

		($count{$_} == $count_tmp) || ($rank1 = $rank2);
		$count_tmp = $count{$_};
		$rank2++;

		$i++;
		if ($page eq "") {
			if ($i > $p_view) { last; }
			$ranking = $rank1;
		} else {
			if ($i < $page) { $last1=$rank1; $last2=$count{$_}; next; }
			else { $j++; if ($j > $p_view) { last; } }
			if ($count{$_} == $last2) { $ranking = $last1; }
			else { $ranking = $rank1; }
		}

if (!$bhp{$_}){$bhp{$_}=$gdeico}
$xgg="<img src=http://$bhp{$_} width=88 height=31 border=0> ";
		$sub{$_} = "<a href=\"$script?links=$no{$_}\" target=\"_top\">$xgg<br>$sub{$_}</a>";

		$part{$_} = "<a href=\"$script?mode=part&part=$part{$_}\">$parts[$part{$_}]</a>";
		print "<tr bgcolor=\"$goa_color\"><th nowrap>第 <b>$ranking</b>位</th>\n";
		print "<td><B>$sub{$_}</B>";
		&icons('rank');
		$count{$_} = &filler($count{$_});
		print "</td><td><small>$msg{$_}</small></td>\n";
		print "<td><small>$part{$_}</small></td>\n";
		print "<th>$count{$_}</th></tr>\n";
#		print "<tr><td></td></tr>\n";
	}

	print "</table>\n<table><tr>\n";

	# 改頁処理
	if ($page eq '') { $page = 1; }
	$next_line = $page + $p_view;
	$back_line = $page - $p_view;

	# 前頁処理
	if ($back_line > 0) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$back_line\">\n";
		print "<input type=hidden name=mode value=\"ranking\">\n";
		print "<input type=submit value=\"前の$p_view件\">\n";
		print "</td></form>\n";
	}
	# 次頁処理
	if ($next_line <= $i) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$next_line\">\n";
		print "<input type=hidden name=mode value=\"ranking\">\n";
		print "<input type=submit value=\"次の$p_view件\">\n";
		print "</td></form>\n";
	}

	print "</tr></table><br><br>\n</body></html>\n";
	exit;
}

#------------#
#  検索処理  #
#------------#
sub search {
	local($file, $pair, @pairs);

	# 入力内容を整理
	$word = $in{'word'};
	$word =~ tr/[A-Z]/[a-z]/;
	$word =~ s/　/ /g;
	@pairs = split(/\s+/, $word);

	# 検索処理
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@new=();
	while (<IN>) {
		($no,$part,$sub,$hp,$name,$email,$pw,$msg) = split(/<>/);

		$file = "$sub$hp$msg";
		$file =~ tr/[A-Z]/[a-z]/;

		$flag=0;
		foreach $pair (@pairs) {
			if (index($file,$pair) >= 0) {
				$flag=1;
				if ($in{'cond'} eq 'OR') { last; }
			} else {
				if ($in{'cond'} eq 'AND') { $flag=0; last; }
			}
		}
		if ($flag == 1) { push(@new,$_); }
	}
	close(IN);

	# 検索終了
	$total = @new;

	&header;
	print "[<a href=\"$script?\">メニューに戻る</a>]<br>\n";
	print "<table width='100%'><tr><th bgcolor='$goe_color'>\n";
	print "<font color='$gof_color'>ワード検索</font></th>\n";
	print "</tr></table>\n";

	print "<center><form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=search>\n";
	print "<input type=text name=word value=\"$in{'word'}\" size=30>\n";
	print "条件 <select name=cond>\n";
	foreach ("AND", "OR") {
		if ($in{'cond'} eq "$_") {
			print "<option value=\"$_\" select>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n";
	print "表\示 <select name=view>\n";
	foreach (10,15,20,25,30) {
		if ($in{'view'} eq "$_") {
			print "<option value=\"$_\" select>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n";
	print "<input type=submit value=' 検索 '></form></center>\n";

	# 検索でヒットのない場合のエラーメッセージ
	if (!$total) {
		print "<P><center>\n";
		print "キーワード <B>$in{'word'}</B> は見つかりませんでした。\n";
		print "</body></html>\n";
		exit;
	}

	print "<P><b>検索結果：$total件</b>\n";
	print "<table border=\"0\" width=\"100%\" cellpadding=\"4\" bgcolor=\"$gob_color\">\n";
	# エンコード
	$enwd = $in{'word'};
	$enwd =~ s/([\x00-\x1F\x7F\x80-\xff])/"%" . unpack("H2", $1)/eg;

	if ($in{'page'} eq '') { $in{'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 = $in{'page'} - $in{'view'};

	foreach ($in{'page'} .. $page_end) {
		($no,$part,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp)
							= split(/<>/, $new[$_]);
		$sub = "<font size=4><a href=\"http://$hp\" target=\"_top\">$sub</a></font>\n";
		$times = time;
print "<tr><td bgcolor=\"$goa_color\">\n";
		# 結果を表示
		print "<b>$sub</b> ";
		&icons;
		print "分類：<a href=\"$script?mode=part&part=$part\">$parts[$part]</a>\n";
		print "<P>$msg\n";
print "</td></tr>\n";
	}

	# ページ繰越部
	print "</table><center>\n";
	if ($back_line >= 0) {
		print "[<a href=\"$script?mode=search&page=$back_line&word=$enwd&view=$in{'view'}&cond=$in{'cond'}\">前の$in{'view'}件</a>]\n";
	}
	if ($page_end ne "$end_data") {
		print "[<a href=\"$script?mode=search&page=$next_line&word=$enwd&view=$in{'view'}&cond=$in{'cond'}\">次の$in{'view'}件</a>]\n";
	}
	print "</center>\n";
	print "</body></html>\n";
	exit;
}

#----------------------------#
#  分類（カテゴリー）を表示  #
#----------------------------#
sub part_view {
	&header;
	print "[<a href=\"$script?\">メニューに戻る</a>]\n";
	if (!$regtype) {
		print "[<a href=\"$script?mode=new_url&part=$in{'part'}\">新規登録</a>]\n";

	}
	print "<br><table width='100%'><tr><th bgcolor='$goe_color'>\n";
	print "<font color='$gof_color'>$parts[$in{'part'}]</font></th>\n";
	print "</tr></table></center>\n<UL>\n";
	if ($in{'k'}) {	print "<LI>登録件数：<B>$in{'k'}</B>件<br>\n"; }

	print "<LI>タイトル部分をクリックするとそのホームページへジャンプします。\n";
	print "<LI>タイトル横の数値はアクセス数、<img src=\"$gif_path/$newgif\" width=$new_w height=$new_h> は新着、<img src=\"$gif_path/$recom\" width=$rec_w height=$rec_h> はおすすめマークです。\n";
	print "</UL>\n<DL>\n";
	print "<table border=\"0\" width=\"100%\" cellpadding=\"4\" bgcolor=\"$gob_color\">\n";

	open(IN,"$logfile") || &error("Open Error : $logfile");
	$i=0; $j=0;
	while (<IN>) {
		local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp) = split(/<>/);
		if ($in{'part'} ne $pt) { next; }
		$i++;
		if ($page eq "") {
			if ($i > $p_view) { last; }
		} else {
			if ($i < $page) { next; }
			else { $j++; if ($j > $p_view) { last; } }
		}
print "<tr><td bgcolor=\"$goa_color\">\n";
if (!$bhp){$bhp=$gdeico}
$xgg="<img src=http://$bhp border=0 align=\"left\"> ";
		$sub = "<a href=\"$script?links=$no\" target=\"_blank\">$xgg$sub</a>\n";
		$times = time;
		print "<DT><b><big>$sub</big></b>";
		&icons;
		print "&nbsp; [$axs] &nbsp; <a href=\"$script?mode=mente&no=$no\"><font color=\"$goc_color\"><small>修正・削除</small></font></a>";
		print "<br><br>\n<DD>$msg\n";
print "</td></tr>\n";
	}
	close(IN);
	print "</table><DT></DL>\n";

	# 改頁処理
	if ($page eq '') { $page = 1; }
	$next_line = $page + $p_view;
	$back_line = $page - $p_view;

	print "<table><tr>\n";

	# 前頁処理
	if ($back_line > 0) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$back_line\">\n";
		print "<input type=hidden name=mode value=\"part\">\n";
		print "<input type=hidden name=part value=\"$in{'part'}\">\n";
		print "<input type=hidden name=k value=\"$in{'k'}\">\n";
		print "<input type=submit value=\"前の$p_view件\">\n";
		print "</td></form>\n";
	}
	# 次頁処理
	if ($next_line <= $i) {
		print "<td><form method=\"$method\" action=\"$script\">\n";
		print "<input type=hidden name=page value=\"$next_line\">\n";
		print "<input type=hidden name=mode value=\"part\">\n";
		print "<input type=hidden name=part value=\"$in{'part'}\">\n";
		print "<input type=hidden name=k value=\"$in{'k'}\">\n";
		print "<input type=submit value=\"次の$p_view件\">\n";
		print "</td></form>\n";
	}
	print "</tr></table>\n";
	print "</blockquote><br><br>\n";
	print "</body></html>\n";
	exit;
}

#------------#
#  新着情報  #
#------------#
sub new_sort {
	&header;
	print "[<a href=\"$script?\">メニューに戻る</a>]<br>\n";
	print "<table width='100%'><tr><th bgcolor='$goe_color'>\n";
	print "<font color='$gof_color'>新着情報</font></th></tr></table>\n";
	print "<UL><LI>以下に表\示する情報は新規登録の最新 <B>$w_new</B>件です。</UL>\n";
	print "<DL>\n";
	print "<table border=\"0\" width=\"100%\" cellpadding=\"4\" bgcolor=\"$gob_color\">\n";
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$i=0;
	while (<IN>) {
		$i++;
		local($no,$part,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp) = split(/<>/);
		$times = time;
print "<tr><td bgcolor=\"$goa_color\">\n";
if (!$bhp){$bhp=$gdeico}
$xgg="<img src=http://$bhp width=88 height=31 border=0> ";
		print "<DT><a href=\"$script?links=$no\" target=\"_top\">$xgg<b>$sub</b></a>";
		print "<img src=\"$gif_path/$recom\" width=$rec_w height=$rec_h> " if ($rec == 1);
		print "分類：<a href=\"$script?mode=part&part=$part\">$parts[$part]</a>\n";
		print "登録日：$dt<br><br><DD>$msg<br><br>\n";
print "</td></tr>\n";
		# 規定件数でループを抜ける
		if ($i >= $w_new) { last; }
	}
	close(IN);
	print "</table><DT></DL><br><br>\n</body></html>\n";
	exit;
}

#----------------------#
#  リンクジャンプ処理  #
#----------------------#
sub link_jump {
	# ロック開始
	if ($lockkey) { &lock; }

	$flag = 0;
	@new = ();
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp)	= split(/<>/);

		if ($no eq "$in{'links'}") {
			$flag = 1;
			$axs++;
			$_ = "$no<>$part<>$sub<>$hp<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$axs<>$ho<>$bhp<>\n";
			$url = $hp;
		}
		push(@new,$_);
	}
	close(IN);

	if (!$flag) { &error("リンク先のURL情報が見当たりません"); }

	# 更新
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }

	# METAタグ方式
	if ($meta_jump) {
		print "Content-type: text/html\n\n";
		print "<html><head>\n";
		print "<META HTTP-EQUIV=\"refresh\" CONTENT=\"$wait\; URL=http://$url\">\n";
		print "</head>\n";
		print "<body>\n";
		print "<center><h4>- しばらくお待ちください -</h4>\n";
		print "<P>しばらく待っても移動できない場合は <a href=\"http://$url\">ここ</a> をクリックしてください\n";
		print "<center>\n</body></html>\n";
		exit;
	}

	# 目的のURLへジャンプする
	if ($ENV{'PERLXS'} eq "PerlIS") {
		print "HTTP/1.0 302 Temporary Redirection\r\n";
		print "Content-type: text/html\n";
	}
	print "Location: http://$url\n\n";
	exit;
}

#------------#
#  注意事項  #
#------------#
sub howto {
	&header;
	print <<"EOM";
[<a href="$script?">メニューに戻る</a>]<br>
<table width="100%">
<tr><th bgcolor="$goe_color">
  <font color="$gof_color">注意事項と使用方法について</font>
</th></tr></table>
<P>
<center>
<table border=0 width="90%" cellpadding="4"  bgcolor="$gob_color">
<tr><td bgcolor="$goa_color">
<OL style="line-height: 130%">
<LI>このナビゲータは任意の「キーワード」から自由にホームページ情報を検索することが可能\です。
<LI>検索するキーワードは半角スペースで区切って、複数のキーワードを使うことができます。AND と OR をうまく使い分けて目的のホームページを検索してください。
<LI>新規に登録された情報は <B>$newtime</B>日間 <img src="$gif_path/$newgif" width="$new_w" height="$new_h"> マークが表\示されます。
EOM

	if (!$regtype) {
		print <<"EOM";
<LI>このナビゲータにあなたのホームページを登録することができます。タイトル下の<a href="$script?mode=new_url">「新規登録」</a>をクリックすると登録フォームが現れます。
<LI>登録時に任意のパスワード（英数字で8文字以内）を入力してください。後日そのパスワードを使って、登録内容の修正・削除等のメンテナンス作業を行うことができます。（登録情報の <b>「修正・削除」</b>をクリックするとメンテ画面が現れます）
<LI>管理者が登録内容について、主観的にふさわしくないと判断した場合、及び登録されたURLのリンク先がなくなっている場合には、予\告なく内容を削除することがあります。
EOM
	}

	print <<"EOM";
<LI>登録されたURLをクリックされた回数はログファイルに蓄積され、ランキング表\示されます。タイトル下の<a href="$script?mode=ranking">「人気ランキング」</a>をクリックすると現時点のランキングが表\示されます。
<LI>管理者の主観で、登録されたホームページが「おすすめ」だと判断する場合、<img src="$gif_path/$recom" width="$rec_w" height="$rec_h"> マークを表\示します。
</OL>
</td></tr>
</table>
</body>
</html>
EOM
	exit;
}

#--------------#
#  管理モード  #
#--------------#
sub admin {
	if ($in{'action'}) {
		if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }
	}
	if ($in{'do'} eq "newurl") { &new_url; }

	&header;
	print "[<a href=\"$script?\">メニューに戻る</a>]\n";
	print "<center><table width='100%'><tr><th bgcolor=\"$goe_color\">\n";
	print "<font color=\"$gof_color\">管理用画面</font>\n";
	print "</th></tr></table><P>\n";

	# 入室画面
	if ($in{'action'} eq '') {
		print "<B>処理を選択しパスワードを入力してください</B>\n";
		print "<form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=\"admin\">\n";
		print "<input type=hidden name=action value=\"in\">\n";
		print "<select name=part>\n";

		foreach (0 .. $#parts) {
			print "<option value=\"$_\">$parts[$_]\n";
		}

		print "</select>\n";
		print "<P><input type=radio name=do value=\"del\" checked><B>削除</B>\n";
		print "<input type=radio name=do value=\"rec\"><B>推奨</B>\n";
		if ($regtype) {
			print "<input type=radio name=do value=\"newurl\"><B>登録</B>\n";
		}
		print "<input type=radio name=do value=\"refile\"><B>復元</B>\n";
		print "<P><input type=password name=pass size=8>";
		print "<input type=submit value=\" 認証 \"></form>\n";
		print "</body></html>\n";
		exit;
	}

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	# 復元画面
	if ($in{'do'} eq "refile") {
		print "</center><UL>\n";
		print "<LI>ただ今より記録ファイルをバックアップファイルから復元します。\n";
		print "<LI>復元するバックアップファイルを選択して復元ボタンを押して下さい。\n";
		print "<P><table border=1><tr><th>ファイル名</th><th>容量</th><th>バックアップ</th></tr>\n";
		print "<form action=\"$script\" method=\"$method\">\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=do value=\"backfile\">\n";
		print "<input type=hidden name=action value=\"in\">\n";
		foreach ("A", "B", "C") {
			$backfile = "$backdir/$_\.bak";

			$size = -s $backfile;
			$time = int (-M $backfile);

			print "<tr><td><input type=radio name=file value=\"$_\">\n";
			print "<b>$_ファイル</b></td><td align=right>$size Bytes</td>\n";
			print "<td align=right>$time日前</td></tr>\n";
		}
		print "</table><br><br>\n";
		print "<input type=submit value=' 復元する '></form>\n";
		print "</UL>\n";
		print "</body></html>\n";
		exit;
	}
	# 復元実行
	elsif ($in{'do'} eq "backfile") {
		if ($in{'file'} eq "") { &error("ファイルが選択されていません"); }
		$backfile = "$backdir/$in{'file'}\.bak";

		open(IN,"$backfile") || &error("Open Error : $backfile");
		open(OUT,">$logfile") || &error("Write Error : $logfile");
		while (<IN>) {
			print OUT $_;
		}
		close(OUT);
		close(IN);

		print "<center><h3>処理は正常に終了しました</h3>\n";
		print "<P><form action=\"$script\">\n";
		print "<input type=submit value='メニューに戻る'></form>\n";
		print "</center>\n</body></html>\n";
		exit;
	}

	# ログ容量を算出
	$size = -s $logfile;

	print "<P><table><tr><td>\n";
	print "■ログ容量：<B>$size</B>Bytes<br>\n";

	if ($in{'do'} eq 'del') {
		print "■削除用チェックボックスにチェックを入れ、処理ボタンを押してください。<br>\n";
	} elsif ($in{'do'} eq 'rec') {
		print "■推奨マークを付加する場合にはチェックボックスにチェックを入れてください。<br>\n";
	}

	print "</td></tr></table>\n";

	print "<form action=\"$script\" method=$method>\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\">\n";
	print "<input type=hidden name=do value=\"$in{'do'}\">\n";
	print "<select name=part>\n";

	foreach (0 .. $#parts) {
		if ($in{'part'} eq "$_") {
			print "<option value=\"$_\" selected>$parts[$_]\n";
		} else { print "<option value=\"$_\">$parts[$_]\n"; }
	}

	print "</select> <input type=submit value=\"カテゴリ変更\"></form>\n";

	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=\"admin_edit\">\n";
	print "<input type=hidden name=pass value=\"$in{'pass'}\">\n";
	print "<input type=hidden name=action value=\"del\">\n";
	print "<input type=hidden name=do value=\"$in{'do'}\">\n";
	print "<input type=hidden name=part value=\"$in{'part'}\">\n";
	print "<table border=1>\n";

	if ($in{'do'} eq 'del') { print "<th>削除</th>\n"; }
	elsif ($in{'do'} eq 'rec') { print "<th>推奨</th>\n"; }

	print "<th>タイトル<th>コメント<th>アクセス<th>管理者<th>ホスト名<th>登録日</tr>\n";

	if ($in{'part'} eq "") { $in{'part'} = 0; }
	foreach $line (@lines) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp) = split(/<>/, $line);

		if ($in{'part'} ne "$part") { next; }

		($dt,$dmy) = split(/\(/, $dt);
		$name = "<a href=\"mailto:$email\">$name</a>";
		$sub2 = $sub;
		if (length($sub) > 20) { $sub2 = substr($sub2,0,18); $sub2 .= '..'; }
if (!$bhp){$bhp=$gdeico}
$xgg="<img src=http://$bhp width=88 height=31 border=0> ";
		$sub  = "<a href=\"http://$hp\" target='_top'>$xgg$sub2</a>";
		if (length($msg) > 40) { $msg = substr($msg,0,38); $msg .= '..'; }
		$msg  =~ s/<br>/ /g;

		print "<tr><th><input type=checkbox name=$in{'do'} value=\"$no\">\n";
		print "<td>$sub ";

		if ($rec) {
			print "<img src=\"$gif_path/$recom\" width=\"$rec_w\" height=\"$rec_h\">";
		}

		print "<td><small>$msg</small><th>$axs<th>$name";
		print "<td><small>$ho</small><td><small>$dt</small></tr>\n";
	}

	print "</table><P>\n";
	print "<input type=submit value=\"処理する\"><input type=reset value=\"リセット\">\n";
	print "</form>\n";
	print "</body></html>\n";
	exit;
}

#--------------------------------------#
#  管理者一括削除／推奨マーク付加処理  #
#--------------------------------------#
sub admin_edit {
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います"); }

	# ロック開始
	if ($lockkey) { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	## 削除処理
	if ($in{'do'} eq 'del') {
	  @new=();
	  foreach $line (@lines) {
		$dflag=0;
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp) = split(/<>/, $line);

		foreach $del (@delete) {
			if ($no eq "$del") { $dflag=1; last; }
		}

		if ($dflag == 0) { push(@new,$line); }
	  }

	## 推奨マーク付加処理
	} elsif ($in{'do'} eq 'rec') {
	  @new=();
	  foreach $line (@lines) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho,$bhp) = split(/<>/, $line);

		foreach (@recs) {
			if ($no eq "$_") {
				if ($rec == 0) { $rec = 1; } else { $rec = 0; }
				$line = "$no<>$part<>$sub<>$hp<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$axs<>$ho<>$bhp<>\n";
				last;
			}
		}

		push(@new,$line);
	  }
	}

	# ログを更新
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	if ($lockkey) { &unlock; }

	# 初期画面に戻る
	&admin;
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); }
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else { $buffer = $ENV{'QUERY_STRING'}; }

	@pairs = split(/&/, $buffer);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		# 文字コード変換
		&jcode'convert(*value,'sjis');

		# タグ処理
		$value =~ s/&/&amp;/g;
		$value =~ s/"/&quot;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;

		# 削除／推奨マーク処理
		if ($name eq 'del') { push(@delete,$value); }
		elsif ($name eq 'rec') { push(@recs,$value); }

		$in{$name} = $value;
	}
	$in{'msg'} =~ s/\r\n/<br>/g;
	$in{'msg'} =~ s/\r/<br>/g;
	$in{'msg'} =~ s/\n/<br>/g;
	$in{'url'} =~ s/^http\:\/\///;
$in{'bburl'} =~ s/^http\:\/\///;
	$mode = $in{'mode'};
	$part = $in{'part'};
	$page = $in{'page'};
$gdeico =~ s/^http\:\/\///;
}

#----------------#
#  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">
<link rel="stylesheet" type="text/css" href="../../style.css">
<title>$title</title></head>
<body background="$gif_path/$bground" bgcolor="$bgcolor" text="$text" link="$link" vlink="$vlink" alink="$alink">
EOM
}

#ソースから除去しました。
#<META HTTP-EQUIV="Content-Style-Type" content="text/css">
#<STYLE TYPE="text/css">
#<!--
#body,tr,td,th { font-size:$b_size }
#a:hover { color:$alink }
#small { font-size:9pt }
#-->
#</STYLE>


#----------------------#
#  パスワード暗号処理  #
#----------------------#
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, $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;
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	# 1分以上古いロックは削除する
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}
	local($retry) = 5;
	# symlink関数式ロック
	if ($lockkey == 1) {
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) { &error('Lock is busy'); }
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		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 error {
	if ($lockflag) { &unlock; }

	&header if (!$head_flag);
	print "<center><hr width='400'><h3>ERROR !</h3>\n";
	print "<font color=red><B>$_[0]</B></font>\n";
	print "<P><hr width='400'></center>\n";
	print "</body></html>\n";
	exit;
}

#----------------#
#  ホスト名取得  #
#----------------#
sub get_host {
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};

	if ($host eq "" || $host eq $addr) {
		$host = gethostbyaddr(pack("C4",split(/\./,$addr)),2) || $addr;
	}
}

#------------------#
#  メール送信処理  #
#------------------#
sub mail_to {
	unless (-e $sendmail) { &error("sendmailのパスが不正です"); }

	# メールタイトル
	$mail_sub = "$title 登録完了通知";

	# メール本文
	$mail_msg = <<"EOM";
$in{'name'} さま

この度は、$title への登録をありがとうございました。
登録内容は以下のとおりですので、ご確認ください。

■登録日時：$date
■ホスト名：$host
■管理者名：$in{'name'}
■Ｅメール：$in{'email'}
■タイトル：$in{'sub'}
■バナー　：http://$in{'bburl'}
■ＵＲＬ　：http://$in{'url'}
■管理パスワード：$in{'pwd'}
■紹介コメント
$in{'msg'}

なお、今後登録内容の修正や削除が発生する場合には、ご登録頂いた
パスワードにて全て行うことができますので、パスワードは大切に
保管しておいて下さい。

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
$title管理人 $admin_name
  E-Mail: $admin_mail
  Home:   $admin_url
EOM
	# JISコードへ変換
    	&jcode'convert(*mail_sub,'jis');
    	&jcode'convert(*mail_msg,'jis');

	# コメント内の改行とタグを復元
	$mail_msg =~ s/<br>/\n/ig;

	# メール処理
	open(MAIL,"| $sendmail -t") || &error("メール送信に失敗しました");
	print MAIL "To: $in{'email'}\n";
	print MAIL "From: $admin_mail\n";
	print MAIL "Bcc: $admin_mail\n" if ($mailing == 2);
	print MAIL "Subject: $mail_sub\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "X-Mailer: $ver\n\n";
	print MAIL "$mail_msg\n";
	close(MAIL);
}

#----------------------------#
#  アイコンの定義および表示  #
#----------------------------#
sub icons {
	if ($_[0] eq 'rank') {
		if ($times - $ts{$_} < $newtime*24*60*60) {
	  	    print " <img src=\"$gif_path/$newgif\" width=\"$new_w\" height=\"$new_h\">";
		}
		if ($rec{$_} == 1) {
	  	    print " <img src=\"$gif_path/$recom\" width=\"$rec_w\" height=\"$rec_h\">";
		}
	} else {
		if ($times - $ts < $newtime*24*60*60) {
	  	    print " <img src=\"$gif_path/$newgif\" width=\"$new_w\" height=\"$new_h\">";
		}
		if ($rec == 1) {
	  	    print " <img src=\"$gif_path/$recom\" width=\"$rec_w\" height=\"$rec_h\">";
		}
	}
}

#--------------#
#  時間の取得  #
#--------------#
sub get_time {
	$ENV{'TZ'} = "JST-9";
	$times = time;
	($min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[1..6];
	@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 gcounter {
	local($gcntup,@gcnts,$gcnt);

	# 閲覧時のみカウントアップ
	if ($mode eq '') { $gcntup=1; } else { $gcntup=0; }

	# カウントファイルを読みこみ
	open(IN,"$gcntfile") || &error("Open Error : $gcntfile");
	eval "flock(IN, 1);";
	$gdata = <IN>;
	close(IN);

	# IPチェックとログ破損チェック
	($gcnt, $ip) = split(/:/, $gdata);
	if ($addr eq $ip || $gcnt eq "") { $gcntup=0; }

	# カウントアップ
	if ($gcntup) {
		$gcnt++;
		open(OUT,"+< $gcntfile") || &error("Write Error : $gcntfile");
		eval "flock(OUT, 2);";
		truncate(OUT, 0);
		seek(OUT, 0, 0);
		print OUT "$gcnt\:$addr";
		close(OUT);
	}

	# 桁数調整
	while(length($gcnt) < $mini_fig) { $gcnt = '0' . $gcnt; }
	@gcnts = split(//, $gcnt);
print "<table width=$gta_wid><tr><td><div align='right'>\n";
	# GIFカウンタ表示
	if ($gcounter == 2) {
		foreach (0 .. $#gcnts) {
			print "<img src=\"$gif_path/$gcnts[$_]\.png\" alt=\"$gcnts[$_]\" width=\"$mini_w\" height=\"$mini_h\">";
		}
	}
	# テキストカウンタ表示
	else {
		print "<font color=\"$gcnt_color\" face=\"verdana,Times New Roman,Arial\">$gcnt</font><br>\n";
	}
	print "</div></td></tr></table>\n";
}



#----------------#
#  桁区切り処理  #
#----------------#
sub filler {
	local($_) = $_[0];
	1 while s/(.*\d)(\d\d\d)/$1,$2/;
	return $_;
}

__END__

