#!/usr/local/bin/perl

## -------------------------------------------------------------------
## COSMO NAVI v1.3 (1999/11/03)
##   (C) 1997-1999 by KENT WEB
##   E-MAIL: webmaster@kent-web.com
##   WWW: http://www.kent-web.com/

$ver = 'COSMO NAVI v1.3'; # バージョン情報（修正不要）

## ---[注意事項]------------------------------------------------------
## 1. このスクリプトはフリーソフトです。このスクリプトを使用した
##    いかなる損害に対して作者は一切の責任を負いません。
## 2. 設置に関する質問はサポート掲示板にお願いいたします。メールによる
##    質問はご遠慮ください。
## 3. 同梱の「アイコン (new.gif/recom.gif) 」は、「牛飼いとアイコンの
##    部屋 (http://www.ushikai.com/)」によるものです。
## -------------------------------------------------------------------

require './jcode.pl';

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

# タイトル名
$title = "SUGINAMI.NET LINK";

# タイトル文字の色
$t_color = "#666666";

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

# 管理用パスワード（英数字で）
$pass = 'suginaminetkanrinin';

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

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

# 戻り先 (絶対パスなら http://から)
$home = "./navi.cgi";

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

# 紹介コメントの制限文字数（全角文字）
$msg_limit = 100;

# NEWアイコンの表示日数
$newtime = 20;

# 新着情報の最新表示件数
$w_new = 20;

# 登録内容の１ページ当りの表示数
$p_view = 200;

# 人気ランキングの表示数
$p_view2 = 20;

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

# ロックファイル名（フルパスだと / から記述する）
$lockfile = "navi.lock";

# ロックファイルディレクトリ
#  --> このディレクトリのパーミッションは 777 に設定
$lockdir = ".";

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

# バックアップログ
$bkup = "./bkup.dat";

# 以下は分類（ジャンル）の指定です。
#  --> 変数のカギ括弧内は 0 から連番で続ける
$parts[0] = "ショッピング";
$parts[1] = "食事";
$parts[2] = "コンピュータ";
$parts[3] = "医療";
$parts[4] = "スポーツ";
$parts[5] = "公共施設";
$parts[6] = "タウン情報";
$parts[7] = "求人･求職";
$parts[8] = "趣味";
$parts[9] = "法人";
$parts[10] = "不動産";
$parts[11] = "スクール";
$parts[12] = "個人";
$parts[13] = "Entertainment";

# --- 環境設定
$bground = "";			# 壁紙（http://から記述）
$bgcolor = "#FFFFFF";		# 背景色
$text    = "#333333";		# 文字色
$link    = "#FFFFFF";		# リンク色（未訪問）
$vlink   = "#EEEEEE";		# リンク色（既訪問）
$alink   = "#FF0000";		# リンク色（訪問中）

# 横線の色
$obi_color = "#8698b3";

# アクティブBGの色
$obi2_color = "#000066";

# 見出しヘッダの色（■の色）
$pointer = "#FFFFFF";

# タイトルにGIF画像を使う場合 (GIFファイル名)
$t_gif = "../images/bbstitle.gif";
$t_wid = '381';		# 画像の横サイズ（ピクセル）
$t_hgt = '73';		# 　〃　縦サイズ（ピクセル）

# NEWアイコン
$newgif = "./images/new.gif";
$new_w = '22';		# 　〃　横サイズ
$new_h = '15';		# 　〃　縦サイズ

# 相互リンクアイコン
$recom  = './images/link.gif';
$rec_w = '22';		# 　〃　横サイズ
$rec_h = '15';		# 　〃　縦サイズ

# メール通知 (0=no 1=登録者のみ 2=登録者と管理者へ通知)
#  --> sendmail必須
$mailing = 2;

# sendmailのパス
$sendmail = '/usr/lib/sendmail';

# 管理者メールアドレス（メール通知する時）
$admin_mail = 'webmaster@suginami.net';

# 管理者名（メール通知する時）
$admin_name = "すぎなみネットウェブマスター";

# 管理者のURL（メール通知する時）
$admin_url = 'http://www.suginami.net/';

# 同一URLの二重登録を許可する (0=no 1=yes)
$w_url = 0;

# 登録アクセス拒否
#  --> 新規登録処理をホスト名から拒否します
@deny = (
	'ppp*.xxx.co.jp',
	'cache*.*.interlog.com',
	'anonymizer',
	'',
	'',
	'',
	'',
	''
	);

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

# ロックファイルを定義
$lockfile = "$lockdir\/$lockfile";

## メイン処理 ##
&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 ($mode eq '' && $links ne '') { &link_jump; }
&html_view;
exit;

## --- 初期画面
sub html_view {
	# バックアップ処理
	if (!$mode) { &backup; }

	# ログを読み込み
	open(IN,"$logfile") || &error("Can't open $logfile","no");
	while ($_ = <IN>) {
		($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$date,$t)
							 = split(/<>/, $_);
		foreach (0 .. $#parts) {
			if ($pt eq "$_") {
				$bunrui[$_]++;
				last;
			}
		}
	}
	close(IN);

	&header;


	&footer;
}


## --- 新規登録画面
sub new_url {
	# ホスト名をチェック
	&get_host;
	local($flag)=0;
	foreach (@deny) {
		if ($_ eq "") { next; }
		$_ =~ s/\*/\.\*/g;
		if ($host =~ /$_/) { $flag=1; last; }
	}
	if ($flag) { &error("現在新規登録はできません"); }

	&header;

	print <<"EOM";
<table width="430">
<tr><th bgcolor='$obi2_color'>
<font color="#FFFFFF">新規登録</font>
</th></tr></table>

<P>
<table width=430><tr><td>
<OL>
  <LI>新規登録を行います。
  <LI>下記フォームに内容を記述し、登録ボタンを押してください。
  <LI>パスワードは今後のメンテナンスに必要なので必ず記入してください。
</OL>
</td></tr></table>
<table width=430 height=3 cellspacing=0 cellpadding=0>
<tr><td bgcolor="$obi_color"><img width=1 height=3></td></tr>
</table>
<form action="$script" method="$method">
<input type=hidden name=mode value="regist">
<table border=0 width=430>
<tr><td><b>管理者名</b></td><td><input type=text name=name size=25></td></tr>
<tr><td><b>Ｅメール</b></td><td><input type=text name=email size=25></td></tr>
<tr><td><b>ＵＲＬ</b></td><td><input type=text name=url size=60 value="http://"></td></tr>
<tr><td nowrap><b>パスワード</b></td><td><input type=password name=pwd size=8 maxlength=8>
（英数字で8文字以内）</td></tr>
<tr><td colspan=2><hr size=2></td></tr>
<tr><td><b>分　類</b></td><td>
EOM

	if ($part) {
		print "<select name=part>\n";
	} else {
		print "<select name=part size=4>\n";
	}

	foreach (0 .. $#parts) {
		if ($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 center>
     <div align="center">
<input type=submit value="登録する" ><input type=reset value="リセット">
 </div>
 </td>
</tr>
</table>
</form>
EOM
	&footer;
	exit;
}

## --- 登録処理
sub regist {
	# フォームチェック
	if ($name eq '') { &error("なまえの入力がありません。","no"); }
	if ($email eq '' || $email !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です。","no"); }
	if ($url eq '') { &error("URLの入力がありません。","no"); }
	if ($pwd eq '') { &error("パスワードの入力がありません。","no"); }
	if ($pwd =~ /\W/) { &error("パスワードに全角文字が含まれています。半角の英数字で入力してください。","no"); }
	if ($part eq '') { &error("分類の指定がありません。","no"); }
	if ($sub eq '') { &error("タイトル名の入力がありません。","no"); }
	if ($msg eq '') { &error("紹介コメントの入力がありません。","no"); }
	if (length($msg) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています。","no"); }

	# 日時の取得
	&get_time;

	# ホスト名を取得
	&get_host;

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

	open(IN,"$logfile") || &error("Can't open $logfile","lock");
	$i=0;
	$cflag=0;
	while ($_ = <IN>) {
		$i++;
		# URLが既登録でないかをチェック
		local($no,$part,$sub,$hp,$name,$email,$pw,$msg,$date,$t)
							 = split(/<>/, $_);
		# 先頭行の記事Noを取得
		if ($i == 1) { $topno = $no; }

		# URLが合致すればループを解除
		if ($w_url eq '0' && $url eq "$hp") { $cflag=1; last; }
	}
	close(IN);
	if ($cflag) { &error("登録しようとするURLは既に登録済です。","lock"); }

	# 登録Noをカウントアップ
	$topno++;

	# パスワードを暗号化
	&passwd_encode;

	# テンポラリーファイルを定義
	$temp = "$$";
	if ($temp eq '') {
		srand;
		$temp = 1000000000000000 * rand;
	}
	$tmpfile = "$lockdir\/$temp\.tmp";

	# ファイルに追加
	open(IN,"$logfile") || &error("Can't open $logfile","lock");
	open(OUT,">$tmpfile") || &error("Can't write Temp File","lock");

	print OUT "$topno<>$part<>$sub<>$url<>$name<>$email<>$encode_pwd<>$msg<>$date<>$times<>0<>0<>$host<>\n";

	while ($_ = <IN>) {
		print OUT $_;
	}

	close(OUT);
	close(IN);

	rename($tmpfile,$logfile) || &error("Rename Error","lock");
	chmod (0666,$logfile);
	if (-e $tmpfile) { unlink($tmpfile); }

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

	# お礼メール通知
	if ($mailing) { &mail_to; }

	# 登録完了画面
	&header;
	print "<br><br>\n";
	print "<hr align=left size=2 color=\"$obi_color\" width=430>\n";
	print "<table width=430><tr><td align=center>\n";
	print "<b>ありがとうございます。以下の内容で登録が完了しました。</b>\n";
	print "</td></tr></table>\n";
	print "<hr align=left size=2 color=\"$obi_color\" width=430>\n";
	print "<table border=0 cellpadding=5>\n";
	print "<tr><td>管理者名</td><td>：</td><td>$name</td></tr>\n";
	print "<tr><td>Ｅメール</td><td>：</td><td>$email</td></tr>\n";
	print "<tr><td>ＵＲＬ</td><td>：</td><td>$url</td></tr>\n";
	print "<tr><td>PASSWORD</td><td>：</td><td>$pwd</td></tr>\n";
	print "<tr><td>分　類</td><td>：</td><td>$parts[$part]</td></tr>\n";
	print "<tr><td>タイトル</td><td>：</td><td>$sub</td></tr>\n";
	print "<tr><td>紹介文</td><td>：</td><td>$msg</td></tr>\n";
	print "</table>\n";
	&footer;
	exit;
}

## --- メンテ画面
sub mente {
	open(IN,"$logfile") || &error("Can't open $logfile","no");

	while ($_ = <IN>) {
		($no,$part,$sub,$hp,$name,$email,$pw,$msg,$date,$t)
							 = split(/<>/, $_);
		if ($FORM{'no'} eq "$no") { last; }
	}

	close(IN);

	&header;
	print <<"EOM";
<table width="430">
<tr><th bgcolor='$obi2_color'>
<font color="#FFFFFF">登録情報の修正・削除</font>
</th></tr></table>
<P>
<table nowrap>
<tr><td>
<OL>
<LI>下記ホームページのメンテナンスを行います。
<LI>処理内容を選択し、登録時に指定した「パスワード」を入力してください。
</OL>
</td></tr>
</table>
<P>
<table border=0 nowrap>
<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>

<table width="430" align="center">
<tr><td>

<form action="$script" method="$method" nowrap>
<input type=hidden name=mode value="do_mente">
<input type=hidden name=no value="$FORM{'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>

</td></tr>
</table>

EOM
	&footer;
	exit;
}

## --- メンテ実行
sub do_mente {
	# フォームチェック
	if ($pwd eq '') { &error("パスワードが入力されていません。","no"); }

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

	open(IN,"$logfile") || &error("Can't open $logfile","lock");

	# 修正処理実行
	if ($FORM{'action'} eq "go") {

		# フォームチェック
		if ($name eq '') { &error("なまえの入力がありません。","lock"); }
		if ($email eq '' || $email !~ /(.*)\@(.*)\.(.*)/) { &error("Eメールの入力内容が不正です。","lock"); }
		if ($url eq '') { &error("URLの入力がありません。","lock"); }
		if ($pwd eq '') { &error("パスワードの入力がありません。","lock"); }
		if ($pwd =~ /\W/) { &error("パスワードに全角文字が含まれています。半角の英数字で入力してください。","lock"); }
		if ($part eq '') { &error("分類の指定がありません。","lock"); }
		if ($sub eq '') { &error("タイトル名の入力がありません。","lock"); }
		if ($msg eq '') { &error("紹介コメントの入力がありません。","lock"); }
		if (length($msg) > $msg_limit*2) { &error("紹介コメントが$msg_limit文字以上を超えています。","lock"); }

		# テンポラリーファイルを定義
		$temp = "$$";
		if ($temp eq '') {
			srand;
			$temp = 1000000000000000 * rand;
		}
		$tmpfile = "$lockdir\/$temp\.tmp";

		open(OUT,">$tmpfile") || &error("Can't write tempfile","lock");
		while ($_ = <IN>) {
			($no,$pt,$sb,$hp,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho)
								 = split(/<>/, $_);
			if ($FORM{'no'} eq "$no") {
				# パスワード照合
				local($encode_pwd) = $pw;
				&passwd_decode;
				if ($check eq 'no') {
					last;
					&error("パスワードが違います。","lock");
				}

				print OUT "$no<>$part<>$sub<>$url<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$cnt<>$ho<>\n";
			}
			else {
				print OUT $_;
			}
		}
		close(OUT);
		close(IN);

		rename($tmpfile,$logfile) || &error("Rename Error","lock");
		chmod (0666,$logfile);
		if (-e $tmpfile) { unlink($tmpfile); }

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

		# 完了メッセージ
		&header;
		print "<P><table width=430 height=100><tr><td align=center>\n";
		print "<P><b>修正処理は完了しました。</b>\n";
		print "<P><P></td></tr></table>\n";
		&footer;
		exit;

	# 削除処理実行
	} elsif ($FORM{'action'} eq "delete") {

		# テンポラリーファイルを定義
		$temp = "$$";
		if ($temp eq '') {
			srand;
			$temp = 1000000000000000 * rand;
		}
		$tmpfile = "$lockdir\/$temp\.tmp";

		open(OUT,">$tmpfile") || &error("Can't write Temp File","lock");
		while ($_ = <IN>) {
			($no,$pt,$sb,$hp,$na,$em,$pw,$ms,$dt,$ts,$rec,$cnt,$ho)
								 = split(/<>/, $_);
			if ($FORM{'no'} eq "$no") {
				# パスワード照合
				local($encode_pwd) = $pw;
				&passwd_decode;
				if ($check eq 'no') {
					&error("パスワードが違います。","lock");
					last;
				}
			}
			else {
				print OUT $_;
			}
		}
		close(OUT);
		close(IN);

		rename($tmpfile,$logfile) || &error("Rename Error","lock");
		chmod (0666,$logfile);
		if (-e $tmpfile) { unlink($tmpfile); }

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

		# 完了メッセージ
		&header;
		print "<P><table width=430 height=100><tr><td align=center>\n";
		print "<P><h3>削除処理は完了しました。</h3>\n";
		print "<P><P></td></tr></table>\n";
		&footer;
		exit;

	}

	while ($_ = <IN>) {
		($no,$part,$sub,$hp,$name,$email,$pw,$msg,$date,$ts,$rec,$count)
			 					= split(/<>/, $_);

		$mflag=0;
		if ($FORM{'no'} eq "$no") {
			$mflag = 1;
			# パスワード照合
			local($encode_pwd) = $pw;
			&passwd_decode;
			if ($check eq 'no') { &error("パスワードが違います。","lock"); }
			last;
		}
	}
	close(IN);
	if ($mflag == 0) { &error("指定のURLが見つかりません。"); }

	# 修正用画面を表示
	&header;
	print <<"EOM";
<table width="430">
<tr><th bgcolor="$obi2_color">
<font color="#FFFFFF">登録情報の修正</font>
</th></tr></table>
<P>
<table>
<OL>
<LI>以下のフォームにて登録内容の修正を行います。
<LI>変更する部分のみ修正し、「送信する」ボタンを押してください。
</OL>
</table>
<P>
<form action="$script" method="$method">
<input type=hidden name=pwd value="$pwd">
<input type=hidden name=action value="go">
<input type=hidden name=no value="$FORM{'no'}">
<input type=hidden name=mode value="do_mente">
<input type=hidden name=part value="$FORM{'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=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>

</table>
EOM
	&footer;
	exit;
}

## --- ランキング表示
sub ranking {
	$times = time;

	# ランクファイルを読み込む
	open(IN,"$logfile") || &error("Can't open $logfile","no");

	&header;
	print "<table width=430>\n";
	print "<tr><th bgcolor=\"$obi2_color\">\n";
	print "<font color=\"#FFFFFF\">人気ランキングTOP20</font></th></tr></table>\n";
	print "<P><table border=0 width=430>\n";
	print "<tr><th width=40 bgcolor=\"$bgcolor\">順　位</th>\n";
	print "<th bgcolor=\"$bgcolor\">タイトル</th>\n";
	print "<th bgcolor=\"$bgcolor\">コメント</th>\n";
	print "<th bgcolor=$bgcolor>分　類</th>\n";
	print "<th width=40 bgcolor=\"$bgcolor\">アクセス数</th></tr>\n";
	print "<tr><td colspan=5><hr size=2></td></tr>\n";

	while ($_ = <IN>) {
		local($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$date,$ts,$rec,$count)	= split(/<>/, $_);

		$no{$no}    = $no;
		$count{$no} = $count;
		$part{$no}  = $part;
		$sub{$no}   = $sub;
		$msg{$no}   = $msg;
		$ts{$no}    = $ts;
		$rec{$no}   = $rec;
	}

	$rank1 = 0;
	$rank2 = 1;
	$count_tmp = 0;

	$i=0; $j=0;
	foreach (sort { ($count{$b} <=> $count{$a}) || ($a cmp $b) } keys(%count)) {
		$i++;
		if ($page eq "") {
			if ($i > $p_view2) { last; }
		}
		else {
			if ($i < $page) { next; }
			else {
				$j++;
				if ($j > $p_view2) { last; }
			}
		}

		($count{$_} == $count_tmp) || ($rank1 = $rank2);

		# 桁区切り
		if (length($count{$_}) > 3) {
			$count{$_} = &filler($count{$_});
		}

		$sub{$_}  = "<a href=\"$script?links=$no{$_}\" target=\"_top\">$sub{$_}</a>";
		$part{$_} = "<a href=\"$script?mode=part&part=$part{$_}\">$parts[$part{$_}]</a>";

		if ($page) { $ranking = $rank1 + $page - 1; }
		else { $ranking = $rank1; }

		print "<tr><th nowrap>第 <b>$ranking</b>位</th>\n";
		print "<td bgcolor=\"$obi_color\"><B>$sub{$_}</B>";

		# アイコンを表示
		&icons('rank');

		print "</td><td><small>$msg{$_}</small></td>\n";
		print "<td bgcolor=\"$obi_color\"><small>$part{$_}</small></td>\n";
		print "<th>$count{$_}</th></tr>\n";
		print "<tr><td colspan=5><hr size=2></td></tr>\n";

		$count_tmp = $count{$_};
		$rank2++;
	}
	close(IN);

	print "</table>\n";

	&footer;
	exit;
}

## --- 検索処理
sub search {
	# 入力内容を整理
	$cond = $FORM{'cond'};
	$word = $FORM{'word'};
	$word =~ tr/[A-Z]/[a-z]/;
	$word =~ s/　/ /g;
	$word =~ s/\t/ /g;
	@pairs = split(/ /,$word);

	# 検索処理
	open(IN,"$logfile") || &error("Can't open $logfile","no");
	@new=();
	while ($_ = <IN>) {
		$sline = $_;
		$sline =~ tr/[A-Z]/[a-z]/;
		local($no,$part,$sub,$hp,$name,
			$email,$pw,$msg,$date,$ts,$rec) = split(/<>/, $sline);

		$sflag=0;
		foreach $pair (@pairs) {
			if (index($sline,$pair) >= 0) {
				$sflag = 1;
				if ($cond eq 'or') { last; }
			} else {
				if ($cond eq 'and') { $sflag=0; last; }
			}
		}
		if ($sflag == 1) { push(@new,$_); }
	}
	close(IN);

	# 検索終了
	$total = @new;

	&header;
	print "<table width=430>\n";
	print "<tr><th bgcolor=$obi2_color>\n";
	print "<font color=#FFFFFF>ワード検索</font></th>\n";
	print "</tr></table>\n";

	# 検索でヒットのない場合のエラーメッセージ
	if ($total == 0) {
		print "<P><table><tr align='center'><td>\n";
		print "キーワード <font color=$t_color><B>$FORM{'word'}</B></font> は見つかりませんでした。\n";
		print "</td></tr></table><BR><BR><BR>\n";

		&footer;
		exit;
	}

	print "<P><blockquote><b><font color=$t_color>検索結果：$total件</font></b></blockquote>\n";
	print "<P>\n";

	foreach (@new) {
		local($no,$part,$sub,$hp,$name,
			$email,$pw,$msg,$dt,$ts,$rec) = split(/<>/,$_);

		$sub = "<a href=\"$script?links=$no\" target=\"_top\">$sub</a></font>\n";

		$times = time;

		# 結果を表示
		print "<TABLE border=1 cellSpacing=0 width=430><TR><td bgcolor='$obi_color'><b>$sub</b>";

		# アイコンを表示
		&icons;

		print "<font color=#FFFFFF>分類：</font><a href=\"$script?mode=part&part=$part\">$parts[$part]</a>\n";
		print "</td></tr>\n";
		print "<tr><td>$msg</td></tr></table><br>\n";
	}

	print "<br>\n";
	&footer;
	exit;
}

## --- 分類（カテゴリー）を表示

sub part_view {
	&header;

	print "<table width=430><th bgcolor='$obi2_color'><font color=#FFFFFF>$parts[$part]</font></th>\n";
	print "</tr></table>\n";

	if ($FORM{'k'}) {
		print "登録件数：<B>$FORM{'k'}</B>件<br>\n";
	}

	print "<small><UL><LI>タイトル部分をクリックするとそのホームページへジャンプします。<br>\n";
	print "<LI>タイトル横の数値はアクセス数、<img src=\"$newgif\" width=$new_w height=$new_h> は新着、<img src=\"$recom\" width=$rec_w height=$rec_h> は相互リンクマークです。\n";
	print "</UL></small>\n";

	open(IN,"$logfile") || &error("Can't open $logfile","no");

	$i=0; $j=0;
	while ($_ = <IN>) {
		local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs)
								 = split(/<>/, $_);
		if ($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; }
			}
		}

		$sub = "<a href=\"$script?links=$no\" target=\"_top\">$sub</a>\n";

		$times = time;

		# 結果を表示
		print "<TABLE border=1 cellSpacing=0 width=430><TBODY><TR><TD bgcolor='$obi_color'>\n";

# セルを分けるために加筆（中島）
		print "<table width=100% border=0 cellspacing=0 cellpadding=0><tr><td>";

		print "<b>$sub</b> <font color=#FFFFFF>[$axs] ";

		# アイコンを表示
		&icons;

# 登録日を掲載するのは都合が悪いのでコメントアウト（中島）
#		print " 登録日：$dt\n";

# セルを分けるために加筆（中島）
		print "</td><td align=right>\n";

		print " <small>[<a href=\"$script?mode=mente&no=$no\"><font size=1>修正・削除</font></a>]</small></td></tr></table>\n";

		print "";
		print "</TD></TR><TR><TD>\n";
		print "$msg</TD></TR></table><br>\n";
	}
	close(IN);

	# 改頁処理
	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=\"$part\">\n";
		print "<input type=hidden name=k value=\"$FORM{'k'}\">\n";
		print "<input type=submit value=\"前の$p_view件\">\n";
		print "</form></td>\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=\"$part\">\n";
		print "<input type=hidden name=k value=\"$FORM{'k'}\">\n";
		print "<input type=submit value=\"次の$p_view件\">\n";
		print "</form></td>\n";
	}
	print "</tr></table>\n";
	&footer;
	exit;
}

## --- 新着情報
sub new_sort {
	&header;

	print "<table width=430><tr><th bgcolor='$obi2_color'>\n";
	print "<font color=#FFFFFF>新 着 情 報</font></th></tr></table>\n";
	print "<P><blockquote><LI>以下に表\示する情報は新規登録の最新 <B>$w_new</B>件です。</blockquote>\n";
	print "<P>\n";

	open(IN,"$logfile") || &error("Can't open $logfile","no");
	$i=0;
	while ($_ = <IN>) {
		$i++;
		local($no,$part,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec)
								 = split(/<>/, $_);

		$sub = "<font size=4><a href=\"$script?links=$no\" target=\"_top\">$sub</a></font>\n";

		$times = time;

		# 結果を表示
		print "<TABLE border=1 cellSpacing=0 width=430><TBODY><TR><TD bgcolor='$obi_color'>\n";
		print "<b>$sub</b> ";

		# おすすめアイコン
		print "<img src=\"$recom\" width=$rec_w height=$rec_h> " if ($rec == 1);

		print "<font color=#FFFFFF>分類：<a href=\"$script?mode=part&part=$part\">$parts[$part]</a>\n";
		print "</td></tr><tr><td>$msg</font></td></tr></table><br>\n";

		# 規定件数でループを抜ける
		if ($i >= $w_new) { last; }
	}
	close(IN);

	print "\n";
	&footer;
	exit;
}

## --- リンクジャンプ処理
sub link_jump {
	# テンポラリーファイルを定義
	$temp = "$$";
	if ($temp eq '') {
		srand;
		$temp = 1000000000000000 * rand;
	}
	$tmpfile = "$lockdir\/$temp\.tmp";

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

	open(IN,"$logfile") || &error("Can't open $logfile","lock");

	$jflag = 0;
	@new = ();

	open(OUT,">$tmpfile") || &error("Can't write Temp File","lock");
	while ($_ = <IN>) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $_);

		if ($no eq "$links") {
			$jflag = 1;
			$axs++;
			print OUT "$no<>$part<>$sub<>$hp<>$name<>$email<>$pw<>$msg<>$dt<>$ts<>$rec<>$axs<>$ho<>\n";
			$url = $hp;
		}
		else {
			print OUT $_;
		}
	}
	close(OUT);
	close(IN);

	if ($jflag == 0) { &error("リンク先のURL情報が見当たりません。","lock"); }

	# ファイルをリネーム
	rename($tmpfile,$logfile) || &error("Rename Error","lock");
	chmod (0666,$logfile);
	if (-e $tmpfile) { unlink($tmpfile) }

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

	# 目的のURLへジャンプする
	if ($ENV{PERLXS} eq "PerlIS") { # IIS (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";

<table width="430">
<tr>
  <th bgcolor=\"$obi2_color\">
    <font color="#FFFFFF">注意事項と使用方法について</font>
  </th>
</tr></table>
<P>
<table cellpadding=10 border=1 width="430">
<tr><td bgcolor="#FFFFFF">
<OL>
<LI>このナビゲータは任意の「キーワード」から自由にホームページ情報を検索することが可能\です。
<LI>検索するキーワードは半角スペースで区切って、複数のキーワードを使うことができます。AND と OR をうまく使い分けて目的のホームページを検索してください。
<LI>このナビゲータにあなたのホームページを登録することができます。タイトル下の<a href="$script?mode=new_url"><font color ="red">「新規登録」</font></a>をクリックすると登録フォームが現れます。
<LI>新規に登録された情報は <B>$newtime</B>日間 <img src="$newgif" width="$new_w" height="$new_h"> マークが表\示されます。
<LI>登録時に任意のパスワード（英数字で8文字以内）を入力してください。後日そのパスワードを使って、登録内容の修正・削除等のメンテナンス作業を行うことができます。（登録情報の <b>「修正・削除」</b>をクリックするとメンテ画面が現れます）
<LI>登録されたURLをクリックされた回数はログファイルに蓄積され、ランキング表\示されます。タイトル下の<a href="$script?mode=ranking"><font color ="red">「人気ランキング」</font></a>をクリックすると現時点のランキングが表\示されます。
<LI>相互リンクされているページは、<img src="$recom" width="$rec_w" height="$rec_h"> マークを表\示します。
<LI>管理者が登録内容について、主観的にふさわしくないと判断した場合、及び登録されたURLのリンク先がなくなっている場合には、予\告なく内容を削除することがあります。
</OL>
</td></tr>
</table>
<P>
EOM
	&footer;
	exit;
}

## --- 管理モード
sub admin {
	if ($FORM{'action'}) {
		if ($pwd ne "$pass") { &error("パスワードが違います。","no"); }
	}

	&header;
	print "[<a href=\"$script\?\">メニューに戻る</a>]\n";
	print "<table width='100%'><tr><th bgcolor=\"#008080\">\n";
	print "<font color=\"#FFFFFF\">管理用画面</font>\n";
	print "</th></tr></table><P>\n";

	# 入室画面
	if ($FORM{'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";
		print "<P><input type=password name=pwd size=8>";
		print "<input type=submit value=\" 認証 \">\n";
		print "</form><br><br>\n";
		&footer;
		exit;
	}

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

	# ログ容量を算出
	$size = -s $logfile;

	print "<P><table><tr><td>\n";
	print "■ログ容量：<B>$size</B>Bytes<br>\n";

	if ($FORM{'do'} eq 'del') {
		print "■削除用チェックボックスにチェックを入れ、処理ボタンを押してください。<br>\n";
	}
	elsif ($FORM{'do'} eq 'rec') {
		print "■推奨マークを付加する場合にはチェックボックスにチェックを入れてください。<br>\n";
	}

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

	print "<form action=\"$script\" method=$method>\n";
	print "<input type=hidden name=pwd value=\"$pwd\">\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=\"$FORM{'do'}\">\n";
	print "<select name=part>\n";

	foreach (0 .. $#parts) {
		if ($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=pwd value=\"$pwd\">\n";
	print "<input type=hidden name=action value=\"del\">\n";
	print "<input type=hidden name=do value=\"$FORM{'do'}\">\n";
	print "<input type=hidden name=part value=\"$FORM{'part'}\">\n";
	print "<table border=1>\n";

	if ($FORM{'do'} eq 'del') { print "<th>削除</th>\n"; }
	elsif ($FORM{'do'} eq 'rec') { print "<th>推奨</th>\n"; }

	print "<th>タイトル<th>コメント<th>アクセス<th>管理者<th>ホスト名<th>登録日</tr>\n";

	if ($part eq "") { $part = 0; }
	foreach $line (@lines) {
		($no,$lpart,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $line);

		if ($part ne "$lpart") { next; }

		($dt,$dmy) = split(/\(/, $dt);
		$name = "<a href=\"mailto:$email\">$name</a>";
		$sub2 = $sub;
		if (length($sub) > 20) { $sub2 = substr($sub2,0,18); $sub2 = $sub2 . '..'; }
		$sub  = "<a href=\"http://$hp\" target='_top'>$sub2</a>";
		if (length($msg) > 40) { $msg = substr($msg,0,38); $msg = $msg . '..'; }
		$msg  =~ s/<br>/ /g;

		print "<tr><th><input type=checkbox name=$FORM{'do'} value=\"$no\">\n";
		print "<td>$sub ";

		if ($rec) {
			print "<img src=\"$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><hr>\n";
	&footer;
	exit;
}

## --- 管理者一括削除／推奨マーク付加処理
sub admin_edit {
	if ($pwd ne "$pass") { &error("パスワードが違います。","no"); }

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

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

	## 削除処理
	if ($FORM{'do'} eq 'del') {
	  @new=();
	  foreach $line (@lines) {
		$dflag=0;
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho) = split(/<>/, $line);

		foreach $del (@delete) {
			if ($no eq "$del") { $dflag=1; last; }
		}

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

	## 推奨マーク付加処理
	} elsif ($FORM{'do'} eq 'rec') {
	  @new=();
	  foreach $line (@lines) {
		($no,$part,$sub,$hp,$name,$email,
			$pw,$msg,$dt,$ts,$rec,$axs,$ho) = 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<>\n";
				last;
			}
		}

		push(@new,$line);
	  }
	}

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

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

	# 初期画面に戻る
	&admin;
}

## --- フォームからのデータ処理
sub decode {
	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます。","no"); }
		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/\"/&quot;/g;
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;

		# 削除／推奨マーク処理
		if ($name eq 'del') { push(@delete,$value); }
		elsif ($name eq 'rec') { push(@recs,$value); }

		$FORM{$name} = $value;
	}
	$name  = $FORM{'name'};
	$msg   = $FORM{'msg'};
	$msg   =~ s/\r\n/<br>/g;
	$msg   =~ s/\r|\n/<br>/g;
	$email = $FORM{'email'};
	$url   = $FORM{'url'};
	$url   =~ s/^http\:\/\///;
	$mode  = $FORM{'mode'};
	$pwd   = $FORM{'pwd'};
	$sub   = $FORM{'sub'};
	$part  = $FORM{'part'};
	$links = $FORM{'links'};
	$page  = $FORM{'page'};
}

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

	if ($bground) {
		print "<body background=\"$bground\" bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink leftMargin=0 topMargin=0 marginheight=0 marginwidth=0>\n";
	}
	else {
		print "<body bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink leftMargin=0 topMargin=0 marginheight=0 marginwidth=0>\n";

# 将来的にここのスクリプトは書き換えます（中島2000.04.14）
#	print "<table bgcolor='$obi_color' border=0 cellPadding=1 cellSpacing=1 width=430><tr>\n";
#
#	$flag=0;
#	foreach (0 .. $#parts) {
#
#		if ($bunrui[$_] eq '') { $bunrui[$_] = 0; }
#
#		if ($flag == 0) {
#			print "<td><a href=\"$script?mode=part&part=$_&k=$bunrui[$_]\">$parts[$_]</a></td>\n";
#			$flag=1;
#
#		} else {
#			print "<td><a href=\"$script?mode=part&part=$_&k=$bunrui[$_]\">$parts[$_]</a></td>\n";
#			$flag=0;
#		}
#	}
#
#	if ($flag == 1) {
#		print "<td></td></tr>\n";
#	}
#
#	print "</tr></table>\n";


## 将来的にここのスクリプトは、削除します（中島2000.04.14）
	print <<"EOM";

<table bgcolor='$obi_color' border=0 cellPadding=1 cellSpacing=1 width=430>
<tr align=center>
<td><a href="$script?mode=part&part=0&k=0">ショッピング</a></td>
<td><a href="$script?mode=part&part=1&k=0">食事</a></td>
<td><a href="$script?mode=part&part=2&k=0">コンピュータ</a></td>
<td><a href="$script?mode=part&part=3&k=0">医療</a></td>
<td><a href="$script?mode=part&part=4&k=0">スポーツ</a></td>
<td><a href="$script?mode=part&part=5&k=0">公共施設</a></td>
<td><a href="$script?mode=part&part=6&k=0">タウン情報</a></td>
</tr></table>
<table bgcolor='$obi_color' border=0 cellPadding=1 cellSpacing=1 width=430>
<tr align=center>
<td><a href="$script?mode=part&part=7&k=0">求人･求職</a></td>
<td><a href="$script?mode=part&part=8&k=0">趣味</a></td>
<td><a href="$script?mode=part&part=9&k=0">法人</a></td>
<td><a href="$script?mode=part&part=10&k=0">不動産</a></td>
<td><a href="$script?mode=part&part=11&k=0">スクール</a></td>
<td><a href="$script?mode=part&part=12&k=0">個人</a></td>
<td><a href="$script?mode=part&part=13&k=0">Entertainment</a></td>
</tr></table>

EOM

	print <<"EOM";
<table width=430 border=0 cellPadding=0 cellSpacing=1><tr>

<td width=100 bgcolor='$obi_color'><font color=$pointer nowrap>■</font><a href="$script?mode=new_url">新規登録</a></td>


<td rowspan="2" valign="bottom" align="center">
<form action="$script" method="$method">
<input type=hidden name=mode value="search">
<input type=text size=25 name=word><input type=submit value="検索"><br>
<input type=radio name=cond value="and" checked>AND
<input type=radio name=cond value="or">OR
</form></td>


<td width=100 bgcolor='$obi_color' nowrap ><font color=$pointer>■</font><a href="$script?mode=new_sort">新着情報</a></td>



</tr>
<tr>


<td bgcolor='$obi_color'><font color=$pointer nowrap>■</font><a href="$script?mode=howto">注意事項</a></td>

<td bgcolor='$obi_color'><font color=$pointer nowrap>■</font><a href="$script?mode=ranking">人気ランキング</a></td>


</tr></table>

EOM


	}
}


## --- HTMLのフッタ
sub footer {
	# 著作権表示（絶対に削除しないでください）
	print "<p><table width=430 border=0 cellspacing=0 cellpadding=0>\n";
	print "<tr align=center><td bgcolor='$obi_color'>\n";
	print "<small><font color=#FFFFFF><!-- $ver -->\n";
	print "- Script by <a href=\"http://www.kent-web.com/\" target=\"_top\">kent</a> -</font>\n";
	print "</small></td></tr></table>\n";
	print "</body></html>\n";
}

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

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

	$check = "no";
	if (crypt($pwd, substr($encode_pwd,$crptkey,2)) eq "$encode_pwd") {
	  $check = "yes";
	}
}

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

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

## --- エラー処理
sub error {
	if ($_[1] eq "lock" && -e $lockfile) { unlink($lockfile); }
	if (-e $tmpfile) { unlink($tmpfile); }

	&header;
	print "<P><table width=430 height=100><tr><td align=center>\n";
	print "<P><h3>ERROR !</h3>\n";
	print "<P><font color=red><B>$_[0]</B></font>\n";
	print "</td></tr></table></body></html>\n";
	exit;
}

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

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

## --- メール送信処理
sub mail_to {
	unless (-e $sendmail) { &error("sendmailのパスが不正です。","no"); }

	# メールタイトル
	$mail_sub = "すぎなみネット 登録完了通知";

	# メール本文
	$mail_msg = <<"EOM";
$nameさま

この度は、$title への登録をありがとうございました。
登録内容は以下のとおりですので、ご確認ください。

■登録日時： $date
■ホスト名： $host
■管理者名： $name
■Ｅメール： $email
■タイトル： $sub
■ＵＲＬ　： http://$url
■管理パスワード：$pwd
■紹介コメント
$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;
	$mail_msg =~ s/&quot;/\"/g;
	$mail_msg =~ s/&lt;/</g;
	$mail_msg =~ s/&gt;/>/g;

	# メール処理
	if ($mailing == 2) { $mailto = "$email" . ',' . "$admin_mail"; }
	else { $mailto = $email; }

	if (open(MAIL,"| $sendmail $mailto")) {
	print MAIL "To: $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_sub\n";
	print MAIL "--------------------------------------------------------\n";
	print MAIL "$mail_msg\n";
	close(MAIL);
	}
}

## --- アイコンの定義および表示
sub icons {
	if ($_[0] eq 'rank') {
		if ($times - $ts{$_} < $newtime*24*60*60) {
	  	  print " <img src=\"$newgif\" width=\"$new_w\" height=\"$new_h\">";
		}
		if ($rec{$_} == 1) {
	  	  print " <img src=\"$recom\" width=\"$rec_w\" height=\"$rec_h\">";
		}

	}
	else {
		if ($times - $ts < $newtime*24*60*60) {
	  	  print " <img src=\"$newgif\" width=\"$new_w\" height=\"$new_h\">";
		}
		if ($rec == 1) {
	  	  print " <img src=\"$recom\" width=\"$rec_w\" height=\"$rec_h\">";
		}
	}
}

## --- 時間の取得
sub get_time {
	$ENV{'TZ'} = "JST-9"; # タイムゾーンを日本時間へ
	$times = time;
	($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy,$dmy) = 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 backup {
	# キーファイルを読み込み分解
	open(BK,"$bkup") || &error("Can't open $bkup","no");
	$BKUP = <BK>;
	close(BK);
	($today,$key) = split(/\:/, $BKUP);

	# 時間を取得
	&get_time;

	# 日付が異なればバックアップ処理を行う
	if ($mday ne "$today") {

		# テンポラリーファイルを定義
		$temp = "$$";
		if ($temp eq '') {
			srand;
			$temp = 1000000000000000 * rand;
		}
		$tmpfile = "$lockdir\/$temp\.tmp";

		# バックアップファイル
		$bakfile = "$key\.bak";

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

		# 一時ファイルに書き出し
		open(IN,"$logfile") || &error("Can't open $logfile","lock");
		open(OUT,">$tmpfile") || &error("Can't write Temp File","lock");
		while ($_ = <IN>) {
			print OUT $_;
		}
		close(OUT);
		close(IN);

		# 一時ファイルからバックアップファイルにリネーム
		rename($tmpfile,$bakfile) || &error("Rename Error","lock");
		chmod (0666,$bakfile);
		if (-e $tmpfile) { unlink($tmpfile); }

		# ローテーションキーを定義
		if ($key eq 'A') { $newkey = 'B'; }
		elsif ($key eq 'B') { $newkey = 'C'; }
		else { $newkey = 'A'; }

		# キーファイルを更新
		open(BK,">$bkup") || &error("Can't write $bkup","lock");
		print BK "$mday\:$newkey";
		close(BK);

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

## --- 桁区切り処理
sub filler {
	local($_) = $_[0];
	1 while s/(.*\d)(\d\d\d)/$1,$2/;
	return $_;
}
