#!/usr/bin/perl
# =================================================================== 
# ミニ更新履歴帖ＢＯＸ型　ver1.21 (2005/12/13)                         
# Copyright (C) 2001-2005 by Takaaki Sonoda.			      
# This is it! <sono_p@hotmail.com>  		　　　　　　　        
# http://www.kit.hi-ho.ne.jp/t-sonoda/index.shtml		      
# =================================================================== 
# 初期設定はここから
$pass = 'kogarasu';# 8文字の半角英数字

# ロックファイル機構
#   0 : 行なわない
#   1 : 行なう（symlink関数式）
#   2 : 行なう（mkdir関数式）
$lockkey = 2;
$lockfile = './lock/wh.lock';

$use_rss = 0;# ＲＳＳを使用するなら1

$maxmsg  = 300;# 表示行数(これ以上は削除されます)
$p_log = 10;# １ページの表示日数

$title = '';# お好きなように
$tab_width = 340;# 更新履歴帖の全体のセルの幅（ピクセル数）

# ボディタグと入力フォームのスタイル属性
$css = 'body {
		font-family : Verdana,Osaka,"MS PGothic",sans-serif;
		margin:0px;
		background:#ffffff;/* ベースとなる背景色 */
		color:#a0a0a0;/* ベースとなる文字色 */
		font-size:8pt;/* ベースとなる文字サイズ */
	}
	table {
		border-width:0px;/* 日付毎のテーブルのボーダーの幅 */
		border-bottom-width:0px;
		border-style:solid;/* 日付毎のテーブルのボーダーの種類 */
		border-color:#66ccff;/* 日付毎のテーブルのボーダーの色 */
		}
	td.message {
		font-size:9pt;/* 本文のセルの文字サイズ */
		background:#ffffff;/* 本文のセルの背景色 */
		color:#666666;/* 本文のセルの文字色 */
		line-height:140%;/* 本文のセルの行間隔 */
		padding:0.5em;
		}
	td.date {
		background:#6997CF;/* 日付のセルの背景色 */
		font-size: 14px;/* 日付のセルの文字サイズ */
		color:white;/* 日付のセルの文字色 */
		text-align:center;
		padding:0.5em;
		}
	.border{
		background-color:white;
		color:#909090;
		border-top: 1px solid #a0a0a0;
		border-right: 1px solid #a0a0a0;
		border-left: 1px solid #a0a0a0;
		border-bottom: 1px solid #a0a0a0;
}';

$thisurl   = './whatsnew2.cgi';# 特に変更の要なし
$txtfile   = './whatsnew2.txt';# 特に変更の要なし
$rsscgi    = './rssmake.cgi';# 特に変更の要なし

$method = 'POST';# 特に変更の要なし

# このＣＧＩのＵＲＬ(任意)
$base_url = '';

require './jcode.pl';
$addr = $ENV{'REMOTE_ADDR'};
&init_form;# 特に変更の要なし
# POST限定
if (!$post_flag && $kflag) { &error("不正なアクセスです"); }
$mymsg = $form{'mymsg'};
$formdate = $form{'formdate'};
$y = $form{'y'};
$m = $form{'m'};
$d = $form{'d'};
$no = $form{'no'};
$mycmd = $form{'mycmd'};
$page = $form{'page'};
$mypass = $form{'pass'};
$showtime = $form{'showtime'};
$mymsg = &norm_input($mymsg);

if($mycmd eq 'follow') { &say_msg;}
elsif($mycmd eq 'regist') { &regist;}
elsif($mycmd eq 'edit') { &edit;}
elsif($mycmd eq 'followedit') { &edit;}
elsif($mycmd eq 'editact') { &change;}
elsif($mycmd eq 'delete') { &delete;}
&display;

sub say_msg{
	# 他サイトからのアクセスを排除
	if ($base_url) {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); }
	}
	if (!$mypass){ &error("パスワードを入力してください");}
	elsif ($mypass ne "" && $mypass ne $pass) {
		&error("パスワードが違います");
	}
	$formdate = "$y/$m/$d";
	local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);
	if($showtime>0) {
		if($min<10){ $min = "0".$min;}
		$time = $hour.":".$min;
	}
	$timecmp = ((($y-1900)*12+$m)*31+$d)*24;
	&lock if ($lockkey);
	open(TXT, "$txtfile")|| &error('$txtfile open error');;
	@txt = <TXT>;
	close(TXT);
	$finflag=0;
	if (@txt){
		$top = shift (@txt);
		chomp $top;
		$top++;
		$newtxt = "$formdate,$mymsg,$top,$timecmp,$time\n";
		push (@txt,$newtxt);
		@newdata = map{$_->[0]} sort{$b->[1] <=>  $a->[1] || $b->[2] <=>  $a->[2]} map{[ $_ , (split /\,/)[3], (split /\,/)[2] ]}@txt;
		$top = "$top\n";
		unshift(@newdata,$top);

	}
	else {
		$newtxt = "$formdate,$mymsg,1,$timecmp,$time\n";
		push (@newdata,$newtxt);
		$top = "1\n";
		unshift(@newdata,$top);
	}
	splice(@newdata, $maxmsg);
	open(TXT, ">$txtfile")|| &error('$txtfile open error');
	print TXT @newdata;
	close(TXT);
	&unlock if ($lockflag);
	&finish;
}
sub finish {
	&header;
	print <<"EOM";
<HTML lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<TITLE>$title</TITLE>
<STYLE type="text/css">
<!--
$css
-->
</STYLE>
</HEAD>
<BODY>



<P>処理が終了しました</P>
EOM

		print "<table summary=\"処理の分岐\"><tr><td>\n";
		print "<form action=\"$thisurl\" method=\"POST\">\n";
		print "<input type=\"submit\" value=\"完了\" class=\"border\"></form></td>\n";
		if($use_rss){
			print "<td>\n";
			print "<form action=\"$rsscgi\" method=\"POST\">\n";
			print "<input type=\"hidden\" name=\"mycmd\" value=\"rssmake\">\n";
			print "<input type=\"hidden\" name=\"pass\" value=\"$mypass\">\n";
			print "<input type=\"submit\" value=\"ＲＳＳ作成\" class=\"border\"></form></td>\n";
		}
		print "</tr></table>\n</body>\n</html>\n";
exit;
}
sub display {
	&get_cookie;
	&header;
	print <<"EOM";
<HTML lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<style type="text/css">
<!--
$css
-->
</style>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT">
<TITLE>$title</TITLE>
</HEAD>
<body>
EOM

	open(TXT, "$txtfile") || &error("$txtfileが開けません");
	@txt = <TXT>;
	close(TXT);
	# ページ区切り処理
	if(!$page) { $page=0;}
	$start = $page + 1;
	$end   = $page + $p_log;
	$count=0;
	$top = shift (@txt);
	foreach (@txt){
		($date,$txt,$no,$timecmp,$time) = split (/\,/);
		if($tmpdate eq "$date"){ $flag=0;}
		elsif($tmpdate ne "$date"){ $flag=1;}

		if($flag==1) {
			if ($count) { print "</table>\n";}
				$count++;
				$tmpdate = $date;
			if ($count < $start) { next; }
			if ($count > $end) { last; }
			print "<table cellspacing=0 cellpadding=0 width=\"$tab_width\" summary=\"記事\"><tr><td class=\"date\">$date</td></tr>";
		}
			if ($count < $start) { next; }
			if ($count > $end) { last; }
		chomp $time;
		print "<tr><td class=\"message\">$txt";
		if($time) { print "<br>($time)";}
		print "</td></tr>\n";
	}
	if($count!=0) { print "</table>\n";}
	$next_page = $page + $p_log;
	$back_page = $page - $p_log;

	if ($next_page < $count) {
		print "<form action=\"$thisurl\" method=\"post\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$next_page\">\n";
		print "<input type=\"submit\" value=\"&gt;\" class=\"border\">\n";
		print "</form>\n";
	}
	if ($back_page >= 0) {
		print "<form action=\"$thisurl\" method=\"post\">\n";
		print "<input type=\"hidden\" name=\"page\" value=\"$back_page\">\n";
		print "<input type=\"submit\" value=\"&lt;\" class=\"border\">\n";
		print "</form>\n";
	}

print <<"EOD";
<div style="text-align:left">
<form action="$thisurl" method="POST">
<input type="password" name="pass" size="3" class="border" value="$c_pass"> 
<select name="mycmd">
<option value="regist">書込み</option>
<option value="edit">編集</option>
</select>
<input type="submit" value=" &gt; " class="border">
</form>
<p>
<br></p>
</div>
</body>
</html>
EOD

exit;
}
sub init_form {
	local($query, @assocarray, $assoc, $property, $value, $charcode, $method);
	$post_flag = 0;
	$method = $ENV{'REQUEST_METHOD'};
	$method =~ tr/A-Z/a-z/;
	if ($method eq 'post') {
		read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
		$post_flag=1;
	} else {
		$query = $ENV{'QUERY_STRING'};
		if($query) { $kflag=1;}
	}
	@assocarray = split(/&/, $query);
	foreach $assoc (@assocarray) {
		($property, $value) = split(/=/, $assoc);
		$value =~ tr/+/ /;
		$value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
		&jcode'convert(*value,'sjis');
		&jcode'h2z_sjis(*value);
		$form{$property} = $value;
	}
	$ENV{'TZ'} = "JST-9";
}
sub lock {
	local($retry) = 5;
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}
	# symlink関数式ロック
	if ($lockkey == 1) {
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) { &error('LOCK is BUSY'); }
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		while (!mkdir($lockfile, 0705)) {
			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 norm_input {
	local($string) = @_;
	$string =~ s/,/&#44;/g;
	$string =~ s/\r\n/\n/g;
	$string =~ s/\r/\n/g;
	$string =~ s/\n\n/<br> <br>/g;
	$string =~ s/\n/<br>/g;
return $string;
}
sub header{
	print "Content-type: text/html\n";
    	print "\n";
    	print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";}
sub error {
	&unlock if ($lockflag);
	&header;
print <<"EOM";
<HTML lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<TITLE>$title</TITLE>
<STYLE type="text/css">
<!--
$css
-->
</STYLE>
</HEAD>
<BODY>
<H4>Error!</H4>
<P>$_[0]</P>
<P><INPUT TYPE="button" onclick="location.href='javascript:history.back()'" VALUE=" return " CLASS="border"></P>
</BODY>
</HTML>
EOM

exit;
}
sub regist {
	if (!$mypass){ &error("パスワードを入力してください");}
	elsif ($mypass ne "" && $mypass ne $pass) {
		&error("パスワードが違います");
	}
	&set_cookie;
	print "Content-type: text/html\n";
	print "Set-Cookie: whatsnew=$cook; expires=$gmt\n";
	print "\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">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript">
<TITLE>$title</TITLE>
<STYLE type="text/css">
<!--
$css
-->
</STYLE>
<script type="text/javascript">
<!--
function anc(){
document.myform.mymsg.value += '<a href="" target=top><\\/a>';
}
function mar(){
document.myform.mymsg.value += '<marquee><\\/marquee>';
}
function cle(){
document.myform.mymsg.value = '';
}
function strong(){
document.myform.mymsg.value += '<strong><\\/strong>';
}
function font(){
document.myform.mymsg.value += '<span style="color:red;font-weight:bold;"><\\/span>';
}
function imgsr(){
document.myform.mymsg.value += '<img src="" border=0 alt="">';
}
//-->
</script>
</HEAD>
<body>
<form action="$thisurl" method="POST" name="myform">
<table><tr><td>
EOM

	local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);	$year += 1900;
	$mon++;
	print <<"HTML";
<table>
<tr><td>
 <select name="y">
  <option value="$year" selected>$year</option>
 </select>年<br>
 <select name="m">
HTML

	for ($m=1; $m<=12; $m++) {
		if ($m eq "$mon") {
			print "<option value=\"$m\" selected>$m</option>\n";
		} else {
			print "<option value=\"$m\">$m</option>\n";
		}
	}
	print "</select>月<br><select name=\"d\">\n";
	
	for ($d=1; $d<=31; $d++) {
		if ($d eq "$day") {
			print "<option value=\"$d\" selected>$d</option>\n";
		} else {
			print "<option value=\"$d\">$d</option>\n";
		}
	}
		print "</select>日</td>\n";
	print "</tr></table></td></tr>\n";
	print "<tr><td><textarea cols=\"40\" rows=\"30\" name=\"mymsg\"></textarea></td></tr>\n";
	print "<tr><td><input type=\"button\" value=\" clear \" onclick=\"cle();\" class=\"border\"><input type=\"button\" value=\" anchor \" onclick=\"anc();\" class=\"border\"><br><input type=\"button\" value=\" img \" onclick=\"imgsr();\" class=\"border\"><input type=\"button\" value=\" marquee \" onclick=\"mar();\" class=\"border\"><br><input type=\"button\" value=\" strong \" onclick=\"strong();\" class=\"border\"><input type=\"button\" value=\" font \" onclick=\"font();\" class=\"border\"></td></tr>\n";
	print "<tr><td><select name=\"showtime\">\n";
	print "<option value=\"1\">時間表\示</option>\n";
	print "<option value=\"0\">時間非表\示</option>\n";
	print "</select></td></tr>\n";
	print "<tr><td><input type=\"submit\" value=\"○\" class=\"border\"><input type=\"button\" onclick=\"location.href='$thisurl'\" value=\"×\" class=\"border\"><input type=\"hidden\" name=\"mycmd\" value=\"follow\"><input type=\"hidden\" name=\"pass\" value=\"$mypass\"></td></tr>\n";
	print "</table></form>\n";
	print "</body></html>\n";

exit;
}
sub edit {
	if (!$mypass){ &error("パスワードを入力してください");}
	elsif ($mypass ne "" && $mypass ne $pass) {
		&error("パスワードが違います");
	}
	&header;
	print <<"EOM";
<HTML lang="ja">
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
<META HTTP-EQUIV="Content-Style-Type" content="text/css">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="text/javascript">
<TITLE>$title</TITLE>
<STYLE type="text/css">
<!--
$css
-->
</STYLE>
</HEAD>
<body>
<p>対象日</p>
<form action="$thisurl" method="POST">
<table>
EOM

	local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);	$year += 1900;
	$mon++;
	$lastyear = $year -1;
	print <<"HTML";
<tr><td>
<table>
<tr><td>
<select name="y">
<option value="$year" selected>$year</option>
<option value="$lastyear">$lastyear</option>
</select>年
<br>
<select name="m">
HTML

	if ($mycmd ne 'followedit') { $m_0 = $mon;$d_0 = $day;}
	elsif ($mycmd eq 'followedit') { $m_0 = $m;$d_0 = $d;}
	for ($g=1; $g<=12; $g++) {
		if ($g eq "$m_0") {
			print "<option value=\"$g\" selected>$g</option>\n";
		} else {
			print "<option value=\"$g\">$g</option>\n";
		}
	}
	print "</select>月<br><select name=\"d\">\n";
	
	for ($j=1; $j<=31; $j++) {
		if ($j eq "$d_0") {
			print "<option value=\"$j\" selected>$j</option>\n";
		} else {
			print "<option value=\"$j\">$j</option>\n";
		}
	}
	print "</select>日</td>\n";
	print "</tr></table></td></tr>\n";
	print "<tr><td><input type=\"submit\" value=\"○\" class=\"border\"><input type=\"button\" onclick=\"location.href='$thisurl'\" value=\"×\" class=\"border\"><input type=\"hidden\" name=\"mycmd\" value=\"followedit\"><input type=\"hidden\" name=\"pass\" value=\"$mypass\"></td></tr>\n";
	print "</table></form>\n";
	if($mycmd eq 'followedit') { &do_edit;}
	print "</body></html>\n";
exit;
}
sub do_edit{
	$formdate = "$y/$m/$d";
	print "<p>$formdate</p>\n";
	open(TXT, "$txtfile")|| &error('$txtfile open error');
	@txt = <TXT>;
	close(TXT);
	$match=0;
	foreach (@txt){
		chomp;
		@newstat = split (/\,/);
		if($formdate eq $newstat[0])
			{
			$newstat[1] =~ s/<br>/\r/g;
			print "<form action=\"$thisurl\" method=\"POST\"><input type=\"hidden\" name=\"no\" value=\"$newstat[2]\"><textarea cols=40 rows=10 name=\"mymsg\" class=\"border\">$newstat[1]</textarea><br>\n";
			print "<select name=\"showtime\">\n";
			print "<option value=\"1\">時間表\示</option>\n";
			print "<option value=\"0\">時間非表\示</option>\n";
			print "</select><br>\n";
			print "<input type=\"hidden\" name=\"pass\" value=\"$mypass\"><select name=\"mycmd\"><option value=\"editact\">修正</option>\n<option value=\"delete\">削除</option>\n</select><br><input type=\"submit\" value=\"実行\" class=\"border\"></form>";
			$match=1;
			}

	}
	if(!$match) { print "<p>編集内容がありません</p>";}

}
sub change {
	# 他サイトからのアクセスを排除
	if ($base_url) {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); }
	}
	if (!$mypass){ &error("パスワードを入力してください");}
	elsif ($mypass ne "" && $mypass ne $pass) {
		&error("パスワードが違います");
	}
	local($sec, $min, $hour, $day, $mon, $year, $weekday) = localtime(time);
	if($showtime>0) {
		if($min<10){ $min = "0".$min;}
		$edit_time = $hour.":".$min;
	}
	&lock if ($lockkey);
	open(TXT, "$txtfile")|| &error('$txtfile open error');
	@txt = <TXT>;
	foreach (@txt){
		chomp;
		@newstat = split (/\,/);
		if($no eq $newstat[2])
			{
			if($edit_time) { $newstat[4]=$edit_time;}
			if($showtime==0){ $newstat[4]="";}
			$newtxt = "$newstat[0],$mymsg,$newstat[2],$newstat[3],$newstat[4]\n";
			push (@new,$newtxt);
			next;
			}
		push (@new,"$_\n");

	}
	open(TXT, ">$txtfile")|| &error('$txtfile open error');
	print TXT @new;
	close(TXT);
	&unlock if ($lockflag);
	&finish;
}
sub delete {
	# 他サイトからのアクセスを排除
	if ($base_url) {
		$ref_url = $ENV{'HTTP_REFERER'};
		$ref_url =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		if ($ref_url !~ /$base_url/i) { &error("不正なアクセスです"); }
	}
	if (!$mypass){ &error("パスワードを入力してください");}
	elsif ($mypass ne "" && $mypass ne $pass) {
		&error("パスワードが違います");
	}
	&lock if ($lockkey);
	open(TXT, "$txtfile")|| &error('$txtfile open error');
	@txt = <TXT>;
	close(TXT);
	foreach (@txt){
		chomp;
		@newstat = split (/\,/);
		if($no eq $newstat[2])
			{
			next;
			}
		push (@new,"$_\n");

	}
	open(TXT, ">$txtfile")|| &error('$txtfile open error');
	print TXT @new;
	close(TXT);
	&unlock if ($lockflag);
	&finish;
}
# =================================================================== 
#   クッキーの取得
# =================================================================== 
sub get_cookie {
	local($key, $val);
	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach (@pairs) {
		($key,$val) = split(/=/);
		$key =~ s/\s//g;
		$GET{$key} = $val;
	}
	@pairs = split(/\,/, $GET{'whatsnew'});
	foreach (@pairs) {
		($key,$val) = split(/<>/);
		$COOK{$key} = $val;
	}
	$c_pass  = $COOK{'pass'};
	$c_pass =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
}

# =================================================================== 
#   クッキーの発行
# =================================================================== 
sub set_cookie {
	local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+365*24*60*60);

	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	@month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec);
	$mypass =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
	$cook="pass<>$mypass";
}


