#!/usr/bin/perl
# ↑お使いのサーバーのパスに合わせてください。
#+++++++++++++++++++++++++++++++++++++
#  Copyright (c) 2003 brassiere
#  TEACH ME ! 
$version = 'ver.1.21';
#  web：http://www.yakan.jp/brassiere/
#  mail：brassiere@yakan.jp
#このプログラムによって起きた事に責任を負いません。
#+++++++++++++++++++++++++++++++++++++
#
#------------------設置方法--------------------------------
#　１行目のperlのパスをお使いのサーバーのパスに合わせて変更してください。
#　必要に応じて下の初期設定を修正してください。
#　ダウンロードした状態のディレクトリ構成のままサーバーにアップし、
#　パーミッションの設定をしてください（ ）内がパーミッション。
#　通常サイズ用（osiete.cgi）とスモールサイズ用（osiete_s.cgi）、さらにi-mode対応版（osiete_i.cgi）の３つのスクリプトを用意しています。スモールサイズ用は文字の大きさを小さくしているだけでなく、記事の得点表記などを簡略化してスペースを稼いでいます。
#
#　  osiete.cgi--------------(755)  ※スクリプト本体
#　  osietelog.cgi ----------(666) ※記事ログファイル
#　  osietelist.cgi---------- (666) ※投稿者ログファイル
#　  osieteip.cgi ----------- (666) ※投稿者IP記録ファイル
#　  jcode.pl ----------------(644) ※文字処理ライブラリ
#　  teach_me.html--------IFRAMEでの読み込み用HTML
#　  lock --------------------(777) ※ロックディレクトリ。環境によっては(755)も可
#　  ※パーミッションは利用サーバーによって異なるのでこの限りではありません。
#
#　このプログラムはIFRAMEで読み込むことを想定しています。すでにあるページに組み込む際は、teach_me.htmlのタグを参考にosiete.cgiを読み込んでください。独立したコーナーとして設置する場合は、teach_me.htmlをそのまま使えばいいです。テーブルの大きさは下記初期設定およびIFRAMEタグの幅と高さとで調整してください。
#　また、i-mode版を使用のさいは、直接osiete_i.cgiにアクセスしてください。
#　ページ下にある「管理者メニュー」に入ると、投稿記事を任意に削除することができます。

#------------------以下、初期設定項目-------------------

# タイトル名
$title   = "<B><font face=\"Georgia\" color=\"#FFFFFF\">Teach your signal</font></B>";

#タイトルイメージ画像
$title_image = '';

# タイトルの文字サイズ（タイトルに画像を使わない場合）
$t_size = '18px';

# タイトルの色（タイトルに画像を使わない場合）
$t_color = "#ffffff";

#背景色（IFRAMEの場合、読み込み先htmlのバックに合わせてください）
$hoot_bg_color = "#608F30";

#テーブル（内容表示部分）背景色
$bg_color = "#608F30";

#タイトルの背景とテーブル枠の色
$waku_iro = "#608F30";

#投稿記事中の投稿者名の色
$toukousya = "#FFFFFF";

#投稿記事中のジャンル名の色
$janru_name = "#FFFFFF";

# 戻り先のURL (''にすればHOME表示は出ません)
$homepage = '';

# 最大保有記事数（これを超える記事は自動削除される）
$max = 300;

#呼び出し方法（IFRAMEで呼び出す場合＝0、単独なら１にする※テーブルの前に改行が入る）
$h_settei =0;
#テーブルの幅（IFRAMEで呼び出す場合、IFRAMEの幅と高さより少なくして調整してください）
$table_width = '245';
#テーブルの高さ
$table_height = '205';

#ランキング画面で選択した記事を開く場合の窓の幅と高さ
$open_width = '350';
$open_height = '450';

#投稿フォームの１行の文字数（半角で１文字）
$mozikazu = '25';

# スクリプト名 (この掲示板のファイル名)
$script = "./osiete.cgi";

# 管理者用パスワード (英数字で8文字以内）
$pass = 'yokoot01';

# ジャンル（自由に設定は可能ですが、設置後に変更する場合はジャンルの順番が変わると投稿された記事とジャンルがずれてしまいます。追加する場合は最後に追加してください）
@janru=("★明日から使える環境雑学","★今日やった環境雑学","★流行りの環境言葉","★環境死語","★環境貢献を感じる瞬間","★環境に悪いことした瞬間","★お勧めの環境商品");
# ジャンルのサブ要素（アーティスト、作家名、場所など。左から順番に上で設定したジャンルと対になる形で。無い場合は空欄）
@sub_janru=("","","","","","","");

#ランキングの表示件数
$rankMax=20;

#スタイル設定
$style_settei = <<"EOM";
.sub{font-size:16px;color:#FFFF99;line-height: 130%;}		/*投稿記事のタイトル*/
.sub2{font-size:12px;color:#FFFFFF;line-height: 130%;}		/*投稿記事のサブ要素（作者、アーティスト名など）*/
.com2{font-size:11px;color:#FFFFFF;line-height: 140%;}		/*投稿記事のコメント部分*/
.small{font-size:10px;color:#FFFFFF;}		/*投稿記事の日付*/
.com{font-size:12px;color:#FFFFFF;line-height: 150%;}		/*ベースとなる本文*/
.r_title{font-size:16px;color:#FFFFFF;line-height: 22px;}		/*ランキングのタイトル*/


body {font-size:11px;color:#FFFFFF;text-decoration: none; }		/*bodyタグの基本設定*/
table {font-size:11px;color:#FFFFFF;text-decoration: none}		/*テーブルタグの基本設定*/
a {font-size:11px;color:#FFFFFF;text-decoration: none}		/*リンク文字*/
a:hover {text-decoration: underline}		/*マウスがのったときのリンク文字*/
.button{		/*OKボタン*/
	border-color: #FFFFFF;
	border-width: 1px;
	font-size:10px;
	background-color: #608F30;
	padding:4px 4px 4px 4px;
	color: #FFFFFF;
	}
select{		/*セレクト要素*/
	border-color: #ffffff;
	border-width: 1px;
	font-size:11px;
	background-color: #608F30;
	padding:2px 2px 2px 2px;
	color: #FFFFFF;
	}
	
.table_top {	/*ランキングテーブルの項目名部分*/
	font-size:12px;text-align: center;background-color: #608F30; 
	border: #000000; border-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px;
	}
.table_sub {	/*ランキングテーブル部分*/
	font-size:12px;background-color: #608F30; 
	border: #000000; border-style: solid; border-top-width: 0px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px;
	}
EOM

########################設定ここまで
# ログファイル
$logfile = './osietelog.cgi';
# 登録者リストファイル
$logfile2 = "./osietelist.cgi";
# IP記録ファイル
$logfile3 = "./osieteip.cgi";
# ロックファイルを定義
$lockfile = "./lock/osiete.lock";
require './jcode.pl';
# ######################メイン処理
&decode;
if ($in{'command'} eq "osieru") { &html(osieru_sub);}	#教える場合のリスト
if ($in{'mode'} eq "osieru_sub") { &osieru_sub; }		#教えるフォーム
if ($in{'mode'} eq "osieru_form") { &osieru_form; }		#教えるフォーム
if ($in{'mode'} eq "osieru_rank") { &osieru_rank; }	
if ($in{'mode'} eq "toukou_rank") { &toukou_rank; }	
if ($in{'mode'} eq "usr_regist") { &usr_regist; }
if ($in{'mode'} eq "regist") { &regist; }
if ($in{'mode'} eq "delete") { &delete; }
if ($in{'mode'} eq "admin") { &admin; }
if ($in{'mode'} eq "jouhou") { &jouhou; }
&html(jouhou,$in{'command'},$in{'sentaku_no'});

####### 教えるリスト出力  

sub osieru_sub {
$i=0;
foreach (@janru){
$janru_all .="<div class=com><a href=$script?mode=osieru_form&janru=$i>$_</a></div>\n";
$i++;
}
	&header(2);
	print <<"EOM";
	<table width=$table_width border="0"  cellspacing="0" cellpadding="0" align=center bgcolor=$bg_color><tr><td valign=top>
	<div class=com>教えてくれるカテゴリーを選択してください。</div><br>
	$janru_all
	</td></tr></table>
EOM
print "<br><div align=center><a href=\"javascript:history.back()\"> [前の画面に戻る] </a><br></div>\n</body></html>";
	exit;
}
#######  教える投稿フォーム
sub osieru_form {
	&header(2);
	&get_cookie;
	if($sub_janru[$in{'janru'}]){$sub_j="<br>$sub_janru[$in{'janru'}]<br><input type=text name=sub_janru size=$mozikazu>";}
	$jouhou = <<"EOM";
<form method="POST" action="$script">
<input type=hidden name=mode value="regist">
<input type=hidden name=janru value="$in{'janru'}">
	<table width=$table_width border="0"  cellspacing="0" cellpadding="0" align=center bgcolor=$bg_color>
<!--<table border=0 cellspacing=1 width=$table_width>-->
<tr>
<td>
  <br>	名前 <input type=text name=name size=14 value=$ck{'name'}> password <input type=password name=pass size=6 value=$ck{'pass'}><br>
	ホームページ（任意）<br><input type=text name=url size=$mozikazu value=http://$ck{'url'}><br>
$janru[$in{'janru'}]<br>
    <input type=text name=sub size=$mozikazu>
$sub_j
  </td>
</tr>
<tr>
  <td>
      説明（省略可）<br>
    <textarea cols=$mozikazu rows=3 name=comment wrap="soft"></textarea>
  </td>
</tr>
</table>
<div align=center><input type=submit value="これでよし" class=button border=0></div>
<br>※タグ、半角カナは使用できません。
<br><br><div align=center><a href=\"javascript:history.back()\"> [前の画面に戻る] </a><br></div>
</form>
EOM
	print "$jouhou";
	exit;
}



######################## 情報をランダムで１件表示。管理モードではリスト形式
sub jouhou {
# ログを読み込み1行づつ展開
	open(IN,"$logfile") || &error("Open Error : $logfile");
	my(@alldata,$i);
	@alldata=<IN>;
	&header(2);
	if($in{'command'} ne "kanri"){
		if($in{'command'} ne "sentaku"){
				srand(time^$$);
				$randed=rand($#alldata+1);
				@alldata=splice(@alldata,$randed,1);
		}
	}
	foreach (@alldata) {
		($num,$date,$name,$email,$sub,$com,$url,$host,$myid,$janru,$point,$sub_janru) = split(/<>/);
		if($in{'command'} eq "sentaku" && $in{'sentaku_no'} ne "$num"){next;}
		if ($point ne "no_point") {$hyouka= "$point点だよ♪";}else{$hyouka= "まだないみたい。";}
		if($sub_janru){$auther="$sub_janru[$janru]：$sub_janru";	#作者名等があれば表示
		}else{$auther="";}
	if($in{'command'} eq "kanri"){print "記事ナンバー：$num";}
	if($com ne ""){$com="■コメント：$com";}
	print <<"EOM";
<form method="POST" action="$script">
<input type=hidden name=mode value="usr_regist">
<input type=hidden name=seirino value="$num">	<!--情報の整理ナンバー-->
<input type=hidden name=u_name value="$name">	<!--情報提供者の名前-->
<table width=$table_width height=$table_height  border="0"  cellspacing="0" cellpadding="0" align=center bgcolor=$bg_color><tr><td valign=top>
<div class="com">これは<font color="$toukousya">$name</font>に教えてもらった<br><font color="$janru_name">$janru[$janru]</font>だよ♪</div>
<div class="sub">$sub</div>
<div class="sub2" align=right>$auther</div>
<div class="com2">$com</div>
<div class="small">$date</div>
</td></tr><tr><td valign=bottom align=center height=30>
<hr size=1 color=#666666>
<div class="com">この情報のみんなの評価は$hyouka<br>あなたの評価は？</div>
<select name="iizo">
  <option value="+3">ブラボー（+3点）</option>
  <option value="+1">イイ（+1点）</option>
  <option value="0" selected>評価しないで次を見る</option>
  <option value="-1">イマイチ（-1点）</option>
  <option value="-3">サイテー（-3点）</option>
</select>
<input type="submit" name="Submit" class=button value=" O K ">
</td></tr></table></form></body></html>
EOM
	}
	close(IN);
	exit;
}

########################## ランキング画面表示
sub osieru_rank {
	&header;
# ログを読み込み1行づつ展開
	open(IN,"$logfile") || &error("Open Error : $logfile");
	
	while (<IN>) {
			$data=$_;
			chop $data;
			$key=(split(/<>/,$data))[10];		#ソートする要素を選ぶ
			push @alldata,$data;
			push @keys,$key;
		}
	close(IN);

		sub bykeys{$keys[$b] <=> $keys[$a];}
		@alldata=@alldata[ sort bykeys 0..$#alldata]; 

	print <<"EOM";
	<br><br><div align=center class=r_title>評価の高い投稿ベスト$rankMax</div>
	<table border=0 width=500 align=center cellspacing="1" cellpadding="4">
	<tr class=table_top><td nowrap>順位</td><td>内容</td><td>投稿者</td><td nowrap>得点</td></tr>
EOM
$i=1;
	foreach (@alldata) {
			 ($num,$date,$name,$email,$sub,$com,$url,$host,$myid,$janru,$point,$sub_janru,$pwd) = split(/<>/);
			 		if($url){
					 $name_hyouzi="<a href=http://$url target=_blank>$name</a>";
					 }else{
					 $name_hyouzi="$name";
					 }
					print "<tr class=table_sub><td align=center>$i</td><td><a href=\"#\"  onClick=\"MM_openBrWindow('$script?command=sentaku&sentaku_no=$num&win=openwin','newwin','status=yes,scrollbars=auto,resizable=yes,width=$open_width,height=$open_height')\">$sub</a> </td><td align=center>$name_hyouzi</td><td align=right>$point</td></tr>\n";
			if($i >=$rankMax){last;}
			$i++;
	}
	print "<tr><td colspan=6>※最大投稿数は$maxです。これを超えた場合、古い投稿から削除されます。</td></tr></table>";
	&hooter;
	exit;
}

#####投稿者ランキング
sub toukou_rank {
	&header;
# ログを読み込み1行づつ展開
	open(IN,"$logfile2") || &error("Open Error : $logfile2");
	
	while (<IN>) {
			$data=$_;
			chop $data;
			$key=(split(/<>/,$data))[2];		#ソートする要素を選ぶ
#			if($key == 0){next;}
			push @alldata,$data;
			push @keys,$key;
		}
	close(IN);

		sub bykeys{$keys[$b] <=> $keys[$a];}
		@alldata=@alldata[ sort bykeys 0..$#alldata]; 

	print <<"EOM";
	<br><br><div align=center class=r_title>投稿者ランキングベスト$rankMax</div>
	<table border=0 width=500 align=center cellspacing="1" cellpadding="4">
	<tr class=table_top><td nowrap>順位</td><td>投稿者</td><td nowrap>得点</td><td nowrap>投稿数</td><td nowrap>ＨＰ</td></tr>
EOM
$i=1;
	foreach (@alldata) {
			 ($u_name,$u_toukousuu,$u_kakutoku,$u_hp_ad,$pass_w) = split(/<>/);
			 		if($u_hp_ad){
					 $hp_hyouzi="<a href=http://$u_hp_ad target=_blank>open</a>";
					 }else{
					 $hp_hyouzi="";
					 }
					print "<tr class=table_sub><td align=center>$i</td><td align=center>$u_name</td><td align=right>$u_kakutoku</td><td align=right>$u_toukousuu</td><td align=center><a href=http://$u_hp_ad target=_blank>$hp_hyouzi</a></td></tr>\n";

			if($i >=$rankMax){last;}
			$i++;
	}
	print "<tr><td colspan=6></td></tr></table>";
	&hooter;
	exit;
}

##################  教えてもらうユーザー評価のポイント加算
sub usr_regist {
	if($in{iizo} != "0"){
	local(@new,$i,@newrank);
# ロック開始
	&lock;
#同一IPからの連続評価チェック
	$addr = $ENV{'REMOTE_ADDR'};
	open(IPA,"$logfile3") || &error("Open Error : $logfile3");
	while(<IPA>){
	($saisin_ip,$saisin_taisyou)= split(/<>/);
	if ($addr eq $saisin_ip && $saisin_taisyou eq $in{'seirino'} && $in{iizo} != 0){&error("同一者から同じ記事への<br>連続評価はできません");}
	push @new_saisin_ip,$_;
	}
	close(IPA);
	
	$now_hyouka = "$addr<>$in{'seirino'}<>\n";
	push @new_saisin_ip,$now_hyouka;
	if($#new_saisin_ip > 50){shift @new_saisin_ip;}
	
	open(IPO,">$logfile3") || &error("Open Error : $logfile3");
	print IPO @new_saisin_ip;
	close(IPO);

	
#ユーザーランキングファイルへの書き込み
# ログを読み込み
	open(IN,"$logfile2") || &error("Open Error : $logfile2");
		while (<IN>) {
			 ($u_name,$u_toukousuu,$u_kakutoku,$u_hp_ad,$pass_w) = split(/<>/);
		if($in{'u_name'} eq $u_name){
				$u_kakutoku=$u_kakutoku+($in{iizo});
		}
$tmp="$u_name<>$u_toukousuu<>$u_kakutoku<>$u_hp_ad<>$pass_w<>\n";
		push(@newrank,$tmp);
		}
	close(IN);
# ログを更新
	open(OUT,">$logfile2") || &error("Write Error : $logfile2");
	print OUT @newrank;
	close(OUT);
	
# 情報ファイルへの書き込み処理
# ログを読み込み
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
	($num,$date,$name,$email,$sub,$com,$url,$host,$myid,$janru,$point,$sub_janru,$pwd) = split(/<>/);
		if($in{'seirino'} == $num){
				if($point eq "no_point"){
						$point = 0;
				}
				$point=$point+($in{iizo});
		}
		$tmp="$num<>$date<>$name<>$email<>$sub<>$com<>$url<>$host<>$myid<>$janru<>$point<>$sub_janru<>$pwd<>\n";
		push(@new,$tmp);
	}
	close(IN);

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

# ロック解除
	&unlock;
	} 
	&jouhou;
	exit;
}


################################ログ書き込み処理
sub regist {
	local($date,$host,$addr,$i,$top,@week,@new);

	# コメント本文の改行処理
	$in{'comment'} =~ s/\r\n/<br>/g;
	$in{'comment'} =~ s/\r/<br>/g;
	$in{'comment'} =~ s/\n/<br>/g;

	# URLの先頭部処理
	$in{'url'} =~ s/^http\:\/\///;

	# 題名部が記述されていない場合はエラー
	if ($in{'sub'} eq "") { &error("内容が入力されていません");}

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

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

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

	# ロック開始
	&lock;
#ユーザーランキング登録
	&listmake;
	
#ログファイル更新
	# ログを読み込み
	open(IN,"$logfile") || &error("Open Error : $logfile");

	# 先頭行を取得
	$top = <IN>;

	# 二重投稿をチェック
	local($no,$ymd,$name,$email,$sub,$com,$url,$dom) = split(/<>/, $top);
	if ($in{'name'} eq $name && $in{'comment'} eq $com) {
		close(IN);
		&error("二重投稿のため処理を中断しました");
	}

	# 新記事Noを取得
	$no++;
	# 更新配列を定義
	$new[0] = "$no<>$date<>$in{'name'}<>$in{'email'}<>$in{'sub'}<>$in{'comment'}<>$in{'url'}<>$host<>$in{'number'}<>$in{'janru'}<>no_point<>$in{'sub_janru'}<>$in{pass}<>\n";
	$new[1] = $top;

	# 最大記事数まで配列化
	$i=0;
	while (<IN>) {
		$i++;
		if ($i >= $max-1) { last; }
		push(@new,$_);
	}
	close(IN);

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

# ロック解除
	&unlock;

	# クッキーを保存
	&set_cookie;
	&header(2);
	print <<"EOM";
	<br><br><br>
	<div align=center class=com>
            教えてくれてありがとう！
            </div><br><br>
	  <div align=center><a href=$script?mode=osieru_sub>もっと投稿する</a></div><br>
	  <div align=center><a href=$script?mode=jouhou>[戻る]</a></div>
EOM
	exit;
}

sub listmake {
# ログを読み込み
	open(IN,"$logfile2") || &error("Open Error : $logfile2");
$flag=0;
	while (<IN>) {
		 ($u_name,$u_toukousuu,$u_kakutoku,$u_hp_ad,$pass_w) = split(/<>/);
		if($in{'name'} eq $u_name){
#暗号化されたパスの場合クリプト関数を通す
							if($in{'pass'} ne $pass_w){
								 $pass = crypt($in{'pass'},$pass_w );
								if($pass ne $pass_w){&error("名前とパスワードが一致しません。<br>初めての方は同じ名前の方がすでに登録されていますので<br>お手数ですが別の名前にて投稿ください。");}}
			$u_toukousuu ++;
			$flag=1;
			$u_hp_ad = $in{'url'};
		}
$tmp="$u_name<>$u_toukousuu<>$u_kakutoku<>$u_hp_ad<>$pass_w<>\n";
			push(@newList,$tmp);
	}
	close(IN);
	if($flag == 0){
		$pass_w=&make_pwd ($in{'pass'});
		$newusr="$in{'name'}<>1<>0<>$in{'url'}<>$pass_w<>\n";
		push(@newList,$newusr);
	}
# ログを更新
		open(OUT,">$logfile2") || &error("Write Error : $logfile2");
		print OUT @newList;
		close(OUT);
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	local($buf, $key, $val, @buf);

	if ($ENV{'REQUEST_METHOD'} eq "POST") {
		read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
	} else { $buf = $ENV{'QUERY_STRING'}; }
	@buf = split(/&/, $buf);
	foreach (@buf) {
		($key, $val) = split(/=/);
		$val =~ tr/+/ /;
		$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

		# 文字コード変換 (Shift-JISコード)
		&jcode'convert(*val,'sjis');

		# タグ禁止処理
#		$val =~ s/</&lt;/g;
#		$val =~ s/>/&gt;/g;

		# 削除情報を @DEL に格納
		if ($key eq "del") { push(@DEL,$val); }

		$in{$key} = $val;
	}
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	# ロックフラグがあればロックディレクトリを削除
	if ($lockflag) { &unlock; }

	&header(2);
	print "<center><hr width=400><h3>ERROR !</h3>\n";
	print "<font color='red'><B>$_[0]</B></font>\n";
	print "<br><br><a href=\"javascript:history.back()\"> [前の画面に戻る] </a><br>\n";
	print "<P><hr width=400></center>\n";
	print "</body></html>\n";
	exit;
}

#------------------#
#  HTMLのヘッダー  #
#------------------#
sub header2 {
	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";
	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<title>$title</title>\n";
	if(@_[0] == 2){$change_bg = $bg_color;
	}else{$change_bg = $hoot_bg_color;}
	print <<"EOM";
<style type="text/css">
<!--
$style_settei
-->
</style>
</head>
	<body bgcolor="$change_bg" text="#000000" link="#0000FF" vlink="#800080">
EOM
}

sub header {
	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";
	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<title>$title</title>\n";
	if(@_[0] == 2){$change_bg = $bg_color;
	}else{$change_bg = $hoot_bg_color;}
	print <<"EOM";
<script language="JavaScript">
<!--
function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}
//-->
</script>
<style type="text/css">
<!--
$style_settei
-->
</style>
</head>
	<body bgcolor="$change_bg" text="#000000" link="#0000FF" vlink="#800080" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
EOM
}

#------------------#
#  HTMLのフッター  #
#------------------#
sub hooter {
	print "<center>";
	if($in{'win'} eq "openwin"){
		print "<br><input type=button value=\" CLOSE \" onClick=\"window.close()\">";
	}
	if(@_[0] eq "mae"){
#		print "<a href=\"javascript:history.back()\"> [前の画面に戻る] </a><br>\n";
		print "<a href=$script> [戻る] </a><br>\n";
	}
	
	if($homepage){
		print "<div><a href=$homepage target=_parent>[HOME]</a></div>";
	}
		print "<div><a href=\"http://yakan.jp/brassiere/\" target=_blank>- TEACH ME $version -</a>　<a href=$script?mode=admin target=_blank>管理者メニュー</a></div>";
		print "</center></body></html>\n";
}


#------------------#
#  クッキーを取得  #
#------------------#
sub get_cookie {
	local($key, $val, @cook);

	@cook = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach (@cook) {
		($key, $val) = split(/=/);
		$key =~ s/\s//g;
		$cook{$key} = $val;
	}
	%ck = split(/<>/, $cook{'brassiere'});

	# 投稿直後にクッキー情報を表示
	if ($in{'cook'} eq "on") {
		if ($in{'name'}) { $ck{'name'} = $in{'name'}; }
		if ($in{'email'}) { $ck{'pass'} = $in{'pass'}; }
		if ($in{'url'}) { $ck{'url'} = $in{'url'}; }
	}
}

#-----------------#
# クッキーを発行  #
#-----------------#
sub set_cookie {
	local($gmt, $cook, @w, @m, @t);

	# 週、月を定義
	@w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	@m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

	# 国際標準時間をベースに保存時間は60日
	@t = gmtime(time + 60*24*60*60);
	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]);

	# クッキー情報を定義
	$cook = "name<>$in{'name'}<>pass<>$in{'pass'}<>url<>$in{'url'}<>";

	print "Set-Cookie: brassiere=$cook; expires=$gmt\n";
}

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

	# 1分以上古いロックは削除する
	if (-e $lockfile) {
		($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}

	# リトライは5回
	$retry = 5;
	while (!mkdir($lockfile, 0755)) {
		if (--$retry <= 0) { &error('LOCK is BUSY'); }
		sleep(1);
	}
	# ロックフラグを立てる
	$lockflag=1;
}

#--------------#
#  ロック解除  #
#--------------#
sub unlock {
	# ロックディレクトリ削除
	rmdir($lockfile);

	# ロックフラグを解除
	$lockflag=0;
}

#####パスワード暗号化
sub make_pwd {
	local($time,$salt);
	local($form_pw) = @_;

	# 「種」として現在の時間を取得し後ろ2文字取る
	$time = time;
	$salt = substr($time,-2,2);

	# 暗号化し結果を返す
	return crypt($form_pw,$salt);
}

###########基本HTML
sub html{
&header;
	if($in{'command'} eq "sentaku"){$table_width = $table_width;$table_height=$table_height;print "<br><br>";}
	if($title_image){
			$title_hyouzi = "$title_image";
	}else{
			$title_hyouzi = "$title";
	}
	$table_width2=$table_width+25;
	$table_height2=$table_height+15;
	if($h_settei == 1){print "<br><br>";}
print <<"EOM";
      <table width="$table_width" border="0"  height=$table_height cellspacing="0" cellpadding="5" align="center">
	  <tr bgcolor="$waku_iro"><td height=30> 
	  <div align=center style=\"font-size:$t_size ; color:$t_color; line-height:120%;\">$title_hyouzi</div>
	  <div align=left><a href="$script?command=osieru">★投稿する</a>　<a href="$script?mode=osieru_rank&win=openwin" target=_blank>★記事ランキング</a>　<a href="$script?mode=toukou_rank&win=openwin" target=_blank>★投稿者ランキング</a></div>
	  </td></tr>
	  <tr><td bgcolor="$bg_color" style="border: 4px $waku_iro solid;" height=100%> 
<IFRAME src="$script?mode=@_[0]&command=@_[1]&sentaku_no=@_[2]"  width=$table_width2 height=$table_height2  scrolling=auto marginheight=0 FRAMEBORDER=0>
</IFRAME>
				</td>
              </tr>
            </table>
EOM
	&hooter();
exit;
}

#----------------#
#  記事削除処理  #
#----------------#
sub delete {
	# 削除フォームの内容をチェック
	if ($in{'no'} eq "") { &error("記事Noが入力されていません"); }
	if ($in{'pwd'} eq "") { &error("削除キーが入力されていません"); }

	# ロック開始
	&lock;

	# ログの読み込み
	$flag=0;
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$date,$name,$email,$sub,$com,$url,$host,$pw) = split(/<>/);
		if ($in{'no'} == $no) {
			$flag=1;
			$check = &match_pwd($in{'pwd'}, $pw);
			if ($check ne "OK") {
				$flag=2;
				last;
			}
		} else {
			push(@new,$_);
		}
	}
	close(IN);

	# 照合結果
	if ($flag == 0) { &error("該当記事が見当たりません"); }
	elsif ($flag == 2) { &error("削除キーが違います"); }

	# 削除キーが合致していればログを @new にて更新
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# ロック解除
	&unlock;
}

#------------------#
#  管理者削除処理  #
#------------------#
sub admin {
	if ($in{'command'} ne "pass_ok") {
	&header2;
	print <<"EOM";
	<table width="250" border="0"  cellspacing="0" cellpadding="2" align="center"><tr><td>
	パスワードを入力してください。<br><br>
	<form action="$script" method="POST">
	<input type=hidden name=mode value="admin">
	<input type=hidden name=command value="pass_ok">  
	<input type=text size=10 name=pass>  <input type=submit value="OK">
	</form></td></tr></table></body></html>
EOM
exit;
	}

	# パスワードのチェックを行います
	if ($in{'pass'} ne $pass) { &error("パスワードが違います"); }

	# ロック開始
	if ($DEL[0]) {
		# ロック開始
		&lock;

		@new=();
		open(IN,"$logfile") || &error("Open Error : $logfile");
		while (<IN>) {
			$flag=0;
			($no) = split(/<>/);
			foreach $del (@DEL) {
				if ($del == $no) { $flag=1; last; }
			}
			if ($flag == 0) { push(@new,$_); }
		}
		close(IN);

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

		# ロック解除
		&unlock;
	}

	# 管理画面を表示
	&header2;
	print <<"EOM";
[<a href="$script?">もどる</a>]
<div class=r_title>●ユーザー削除</div>
<form action="$script" method="POST">
<input type=hidden name=mode value="usr_del">
<input type=hidden name=pass value="$in{'pass'}">
 <input type=submit value="ひとつも投稿記事が無くなったユーザーを削除"></form>
 ※こちらでユーザーを削除しないとどんどんログファイルが大きくなりますので、たまにこの作業をしてください。<hr>
 <div class=r_title>●記事個別削除</div>
※削除する記事にチェックを入れ削除ボタンを押して下さい
<form action="$script" method="POST">
<input type=hidden name=mode value="admin">
<input type=hidden name=pass value="$in{'pass'}">
	<input type=hidden name=command value="pass_ok">
<input type=submit value="削除する"><input type=reset value="リセット">
<DL>
EOM
	# ログを1件づつ分解します
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$date,$name,$email,$sub,$com,$url,$host) = split(/<>/);

		# メールアドレスがあれば名前にリンク
		if ($email) { $name = "<a href=\"mailto:$email\">$name</a>"; }

		# コメントは改行を取り除き、全角20文字を超える部分はカットする
		$com =~ s/<br>//g;
		if (length($com) > 40) { $com = substr($com,0,38); $com .= '..'; }

		# 記事はリスト形式で表示
		print "<DT> [$no] <input type=checkbox name=del value=\"$no\"> ";
		print "<font color=\"#CC0000\">$sub</font> 投稿者：<b>$name</b> - $date $com [<font color=\"$sub_color\">$host</font>]\n";
	}
	close(IN);
	print "</DL></form>\n";
	print "</body></html>\n";
	exit;
}

sub usr_del {
	&lock;
		open(IN,"$logfile2") || &error("Open Error : $logfile2");
		@usr_del_list = <IN>;
	foreach (@usr_del_list) {
		 ($u_name,$u_toukousuu,$u_kakutoku,$u_hp_ad,$pass_w) = split(/<>/);
		 &kizi_check($u_name);
		 if($return_kizi == 0){push (@deleted_usr,$u_name);next;}
		 $tmp="$u_name<>$u_toukousuu<>$u_kakutoku<>$u_hp_ad<>$pass_w<>\n";
		push(@newList,$tmp);
	}
	close(IN);
# ログを更新
		open(OUT,">$logfile2") || &error("Write Error : $logfile2");
		print OUT @newList;
		close(OUT);
		&header(2);
		print "<center><hr width=400>\n";
		print "<font color='blue'><B>ユーザー削除処理が完了しました。</B><br></font>\n";
		if(@deleted_usr){
				print "◎削除ユーザー<br>";
				foreach (@deleted_usr){
					print "$_<br>\n";
				}
		}else{print "削除対象のユーザーはいませんでした。";}
		print "<br><br><a href=$script?mode=admin&command=pass_ok&pass=$in{'pass'}> [戻る] </a><br>\n";
		print "<P><hr width=400></center>\n";
		print "</body></html>\n";
		&unlock;
		exit;
}

sub kizi_check {
	my($num,$date,$name,$email,$sub,$com,$url,$host,$myid,$janru,$point,$sub_janru,$pwd);
	open(KC,"$logfile") || &error("Open Error : $logfile");
	$return_kizi=0;
	while (<KC>) {
	($num,$date,$name,$email,$sub,$com,$url,$host,$myid,$janru,$point,$sub_janru,$pwd) = split(/<>/);
		if(@_[0] eq $name){$return_kizi = 1;last;}
	}
	close(KC);
}