#!/usr/local/bin/perl
#
#記事一覧表示	info.cgi
#Programmed by Bepsu:bepsu@jan.ne.jp
########################################以下設定項目
#このＣＧＩのURL

$cgiurl = "./nikki.cgi";
$logfile= "./nikki.log";

#戻り先URL
$returl="http://www.z-lsy.co.jp/";

#ページ色設定
$bgcolor="FFFFFF";		#背景色
$textcolor="333333";		#文字色
$linkcolor="999000";		#未訪問リンク
$vlinkcolor="0000CC";		#訪問済リンク
$alinkcolor="CC0000";		#アクティブリンク

$simbol_color="3300cc";		#■や▲の記号の色

$bgimg_use=0;					#背景画像を使用	(0=使用しない、1=使用する)
$bgimg_url="nikki_bg.gif";			#背景画像

# @teachers=('みゅう','たかよし','とく','ゆりぽん');

#掲示板タイトル
#$bbstitle='***講師の日記***';

#タイトルのフォント色
$bbstitle_color="#ff0000";

#記事タイトルテーブル背景色
$subject_tbcolor="#FFFFFF";
#記事タイトル文字色
$subject_fncolor="666666";

#一度に表示する数
$displine=5;

$maxline=1000;

#管理パスワード
$adminpass="melsa0816";

#HTMLタグを有効にするか(1=タグを有効、0=タグを無効)
$htmltag=1;

#CopyRight
#$copyright="Copyright 1993-2002 Japan Arcadia Network Corporation.<br>All right reserved.";

#日本語変換ライブラリ
require 'jcode.pl';

########################################設定項目ここまで

if($bgimg_use){
	$body_setting="<body background=$bgimg_url bgcolor=$bgcolor text=$textcolor link=$linkcolor vlink=$vlinkcolor alink=$alinkcolor>";
}else{
	$body_setting="<body bgcolor=$bgcolor text=$textcolor link=$linkcolor vlink=$vlinkcolor alink=$alinkcolor>";
}

#入力された文字列を分割して解析する
if ($ENV{'REQUEST_METHOD'} eq "POST") {
        read(STDIN,$str,$ENV{'CONTENT_LENGTH'});
} else {
        $str = $ENV{'QUERY_STRING'};
}

@terms=split('&',$str);
foreach $pair (@terms) {
	($name,$value)=split('=',$pair);
	$value =~ tr/+/ /;
	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
	if(!$htmltag){
		$value =~ s/</&lt;/g;
		$value =~ s/>/&gt;/g;
	}
	$value =~ s/\r/<br>/g;
	$value =~ s/\n//g;
	&jcode'convert(*value,'sjis');
	#削除番号のみは重複するので通常配列へpush、その他は連想配列へ
	if($name eq "delnum"){ push(@delnum,$value); }else{ $QUERY{$name} = $value; }
}

$mode=$QUERY{'mode'};

if($mode eq "login"){&login;}
elsif($mode eq "write"){&write;}
elsif($mode eq "editlist"){&editlist;}
elsif($mode eq "delete"){&delete;}
elsif($mode eq "edit"){&edit;}
else{&normal_disp;}

exit;

########## 通常表示 ##########
sub normal_disp {

	#データ読み込み
	if(!open(LOG,"$logfile")) { &error('Log file open error!!'); }
	while(<LOG>){
		#(非表示の記事は読み込まない)
		next unless /^\d+<>1/;
		push(@log,$_);
	}
	close(LOG);

	$maxline = @log;

	&html_header("$windowtitle");

#	print "<font color=$simbol_color><b>▲</b></font><a href=$returl><b>Home</b></a>";
#	print " <font color=$simbol_color><b>■</b></font><a href=$cgiurl?mode=search><b>Search</b></a>";
#	print "<br>\n";
#	print "<center>";
#	print "<font size=5><b>$bbstitle</b></font><br><br>\n";
#	print "ここは私たちが講習の様子やポイントなどを徒然なるままに？<br>書いている講師の日記ページ。ぜひご覧ください♪";
#	print "<hr width=100%>\n";

	###### 開始番号と終了番号計算
	$startnum=$QUERY{'startnum'}-1;
	if($startnum <= 0 || $startnum eq ""){$startnum=0; $topflag=1;}
	$endnum=$startnum+$displine;
	if($endnum>=$maxline){$endnum=$maxline;$endflag=1;}

#	print "<div style=font-size:12px;>開始番号:$startnum 終了番号:$endnum 表\示記事数：$displine</div><br>\n";

	for($i=$startnum; $i<$endnum; $i++){
		($num,$dispflag,$date,$title,$teacher,$comment,$host)=split(/<>/,$log[$i]);

		if(!$htmltag){
			$comment =~ s/(http)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
		}

		print "<table border=0 cellpadding=0><tr><td bgcolor=$subject_tbcolor width=520>";
		print "<font color=$simbol_color>■</font><font color=$subject_fncolor><b><span style=font-size:14px>$title</span></b></font></td></tr>";
		print "<tr><td align=right><span style=font-size:12px>【$date】</span></td></tr>";
		print "<tr><td width=520>$comment</td></tr></table><hr>";
	}
		print "</center>\n";

	##### ページ下部(ページ番号表示)
	print "<table border=0><tr>\n";
	if(!$topflag){
		$fwnum=$startnum-$displine;
		print "<td align=left><form action=$cgiurl method=post><input type=hidden name=mode value=view><input type=hidden name=startnum value=$fwnum><input type=submit value=新しい$displine件></form></td>";
	}

	if(!$endflag){
		$fwnum=$endnum+1;
		print "<td align=left><form action=$cgiurl method=post><input type=hidden name=mode value=view><input type=hidden name=startnum value=$fwnum><input type=submit value=古い$displine件> </form></td>\n";
	}

	print "</tr></table>\n";
	print "</body></html>\n";

}

########## パスワード入力画面 ##########
sub login {
	&html_header("パスワード入力");
	print <<"_EOT_";
	<center>
	<P><br><br><br><br><br><br>
	<table width=400 border=1 cellpadding=20><tr><td><center>
	<form action=$cgiurl method=post><br><br>
	<h3>管理パスワードを入力してください</h3><br>
	<input type=passwd name=pass size=20>　<input type=submit value=ログイン><br>
	<input type=hidden name=mode value=editlist><br>
	</form></center>
	</td></tr>
	</body></html>

_EOT_
}

########## 管理画面(編集･削除リスト) ##########
sub editlist {
	&checkpass;
	&html_header("記事管理画面");

	#データ読み込み
	if(!open(LOG,"$logfile")) { &error('Log file open error!!'); }
	@log=<LOG>;
	close(LOG);
	$maxline=@log;

	print "<div align=right><a href=JavaScript:window.close()><h3>このウインドウを閉じる<h3></a></div>";

	print "<center>";
	print "<hr width=100%>";
	print "<h3>新規書込みは以下のフォームから</h3>";
	print "<form action=$cgiurl method=post>\n";
	print "<input type=hidden name=pass value=$QUERY{'pass'}>";
	print "<input type=hidden name=mode value=write>";
	print "<table border=1>";
	$today=&get_date;
	print "<tr><th bgcolor=c0c0ff>掲載日付</th><td><input type=text name=date value=\"$today\" size=40>　<input type=checkbox name=dispflag value=1 checked>\表\示する　<input type=submit value=新規書込>　<input type=reset value=リセット></td></tr>\n";
	print "<tr><th bgcolor=c0c0ff>タイトル</th><td><input type=text name=title size=60> ";
#	print "<select name=teacher>";
#	foreach(@teachers){
#		print "<option>$_</option>\n";
#	}
	print "</td></tr>\n";
	print "<tr><th bgcolor=c0c0ff>内容</th><td><textarea name=comment cols=80 rows=10></textarea></td></tr>\n";
	print "</table>\n";
	print "</form>\n";

	print "<hr width=100%>";

	print "<form action=$cgiurl method=post>\n";
	print "<input type=hidden name=pass value=$QUERY{'pass'}>";
	print "<input type=hidden name=mode value=delete>";
	print "<h3>記事の編集・削除</h3>";
	print "<table border=0><tr><td>";
	print "１．\表\示/\非\表\示の切替や再編集を行う場合はタイトルをクリックして編集画面へ。<br>";
	print "２．削除を行う場合は、チェックを入れて削除実行ボタンをクリック。<p>\n";
	print "</td></tr></table>\n";

	print "<table border=1 width=640 cellpadding=3>\n";
	print "<tr bgcolor=ffc0c0><td width=30>番号</td><td width=30>削除</td><td width=30>\表\示</td><td width=230>タイトル</td><td></td><td width=100>掲載日付</td><td width=100>書込元ホスト</td></tr>\n";
	for($count=0;$count<$maxline;$count++){
		chomp($log[$count]);
		($num,$dispflag,$date,$title,$teacher,$comment,$host)=split(/<>/,$log[$count]);
		print "<tr>";
		print "<td><center>$num</center></td>";
		print "<td><input type=checkbox name=delnum value=$num></td>";
		if($dispflag){
			print "<th><font color=0000ff>○</font></th>";
		}else{
			print "<th><font color=ff0000>×</font></th>";
		}
		print "<td><a href=$cgiurl?mode=edit&pass=$QUERY{'pass'}&num=$num>$title</a></td><td>$teacher</td>";
		print "<td>$date</td>";
		print "<td>$host</td>";
		print "</tr>\n";
	}
	print "<tr bgcolor=ffc0c0><td>番号</td><td>削除</td><td>\表\示</td><td>タイトル</td><td></td><td>掲載日付</td><td>書込元ホスト</td></tr>\n";
	print "</table><br>\n";
	print "<input type=submit value=　　削除実行　　>";
	print "</form>";
	print "<div align=right><a href=JavaScript:window.close()><h3>このウインドウを閉じる<h3></a></div>";
	print "</body></html>\n";

}

########## 記事編集 ##########
sub edit {
	&checkpass;

	if( $QUERY{'num'} ne ""){

		#編集する記事の読み込み
		if(!open(LOG,"$logfile")) { &error('Log file open error!!'); }
		while(<LOG>){
			next unless /^$QUERY{'num'}<>/;
			($rnum,$rdispflag,$rdate,$rtitle,$rteacher,$rcomment,$rhost)=split(/<>/,$_);
		}
		close(LOG);

		&html_header("記事の修正");
		if(!$htmltag){
			$rcomment =~ s/&lt;/</g;
			$rcomment =~ s/&gt;/>/g;
		}
		$rcomment =~ s/<br>/\r/g;

		print "<center><h3>記事の修正</h3>";
		print "<form action=$cgiurl method=post>\n";
		print "<input type=hidden name=pass value=$QUERY{'pass'}>";
		print "<input type=hidden name=mode value=write>";
		print "<input type=hidden name=num value=$QUERY{'num'}>";
		print "<table border=1>";
		print "<tr><th bgcolor=c0c0ff>掲載日付</th><td><input type=text name=date value=$rdate>　";
		if($rdispflag){
			print "<input type=checkbox name=dispflag value=1 checked>\表\示する";
		}else{
			print "<input type=checkbox name=dispflag value=1>\表\示する";
		}
		print "　<input type=submit value=修正書込>　<input type=reset value=リセット></td></tr>\n";
		print "<tr><th bgcolor=c0c0ff>タイトル</th><td><input type=text name=title size=60 value=$rtitle>　講師：<input type=text name=teacher size=10 value=$rteacher></td></tr>\n";
		print "<tr><th bgcolor=c0c0ff>内容</th><td><textarea name=comment cols=80 rows=20>$rcomment</textarea></td></tr>\n";
		print "</table>\n";

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

########## 削除実行 ##########
sub delete {
	&checkpass;

	if( @delnum>0 ){
		if(!open(LOG,"$logfile")) { &error('Log file open error!!'); }
		while(<LOG>){
			$delflag=0;
			$readline=$_;
			($rnum,$rdispflag,$rdate,$rtitle,$rteacher,$rcomment,$rhost)=split(/<>/,$readline);
			foreach (@delnum){
				if( $rnum == $_){
					$delflag++;
				}
			}

			#$delflagaが0のままなら削除対象ではないので配列に保存
			if(!$delflag){
				push(@log,$readline);
			}
		}
		close(LOG);

		if(!open(LOG,">$logfile")) { &error('Log file open error!!'); }
		print LOG @log;
		close(LOG);

	}

	&editlist;
}

########## 書込み ##########
sub write {

	&checkpass;
	$host=&ip_host;

	if( ($QUERY{'date'} ne "") && ($QUERY{'title'} ne "") && ($QUERY{'comment'} ne "") ){

		if( $QUERY{'dispflag'} eq ""){ $QUERY{'dispflag'}=0; }

		##### 過去ログを読み込み
		if(!open(LOG,"$logfile")) { &error('Log file open error!!'); }
		@log=<LOG>;
		close(LOG);

		##### 番号 num の指定が無かったら新規書込みとして先頭に書き出す
		if( $QUERY{'num'} eq ""){
			#現在の最初の行から新しい記事番号を算出
			($rnum,$rdispflag,$rdate,$rtitle,$rteacher,$rcomment,$rhost)=split(/<>/,$log[0]);

			$newline="$rnum<>$QUERY{'dispflag'}<>$QUERY{'date'}<>$QUERY{'title'}<>$QUERY{'teacher'}<>$QUERY{'comment'}<>$host<>\n";
			##### 二重投稿のチェック
			if($log[0] ne $newline){
				$rnum++;
				$newline="$rnum<>$QUERY{'dispflag'}<>$QUERY{'date'}<>$QUERY{'title'}<>$QUERY{'teacher'}<>$QUERY{'comment'}<>$host<>\n";
				unshift(@log,$newline);
			}else{
				&error("二重投稿です");
		}


		##### 番号 num の指定があったら修正の書込みとして既存の同番号記事と入れ替える
		}else{

			$maxline=@log;
			$newline="$QUERY{'num'}<>$QUERY{'dispflag'}<>$QUERY{'date'}<>$QUERY{'title'}<>$QUERY{'teacher'}<>$QUERY{'comment'}<>$host<>\n";
			for( $i=0; $i<$maxline; $i++ ){
				if( $log[$i] =~ /^$QUERY{'num'}<>/ ){
					$log[$i]=$newline;
				}
			}
		}

		if(!open(LOG,">$logfile")) { &error('Log file open error!!'); }
		print LOG @log;
		close(LOG);
		&editlist;

	}else{

		&error("書込みに必要な情報が足りません");
	}

}


########## パスワード確認ルーチン ##########
sub checkpass {
	if($QUERY{'pass'} ne $adminpass){&normal_disp;exit;}
}


########## 日付作成 ##########
sub get_date{
	local($time,$sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
	$ENV{'TZ'} = "JST-9";
	$time = time;
	($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($time);
	$year +=1900; 		#西暦
	$mon ++; 			#月
	@week = ("日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"); #曜日
	$retvalue="$year年$mon月$mday日[$week[$wday]]";
	return $retvalue;
}

########## エラー表示画面
sub error{
	$msg = $_[0];
	&html_header("$msg");
	print "$msg";
	print "</body></html>\n";
exit;
}

########## HTMLヘッダー＆ページ設定部分表示
sub html_header{
	$title = $_[0];
	print "Content-type: text/html\n\n";
	print "<html><head><meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;charset=x-sjis\">";
	print "<title>$title</title></head>";
	print "<link href=style.css rel=stylesheet type=text/css>";
	print "$body_setting\n";
}


########## IPアドレスの特定
sub ip_host{
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
#	if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
	return $host;
}

