#!/usr/local/bin/perl
# ↑のパスは設置するサーバーの環境に合わせて変更してください。

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# まろやかコラム
$version = '1.10'; # (2009/1/18 Update)
# Copyright(c) 2007-2009 tisa All rights reserved.
#
# URL  : http://mcgi.jpn.ch/
# MAIL : ari_tisa9@yahoo.co.jp
#
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ★管理者パスワード（※必ず変更してください）
$mskey = 'shinasina';

# コラムタイトル
$columtitle = "弓録";

# ホームページのURL（HOMEのリンク先）
$homeurl = '';

# 新規作成した時のタイトル順序
# 0:上から新着順 1:下から新着順
$tithr = 0;

# 改ページのアンカーがなかった場合
# 0:非表示 1:アンカーなしで表示
$anc = 1;

# 改ページマーク
$back = 'BACK';
$next = 'NEXT';

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#### ファイルパス ####
$script   = './rview.cgi';         # メインスクリプト
$datafile = '../sv/mc/records.dat';       # データファイル
$skintop  = './shina_top2.html';  # スキンファイル（トップページ）
$skinview = './shina_view2.html'; # スキンファイル（記事表示）
$style    = './shina_body.css';      # スタイルシートファイル
$jcode    = './jcode.pl';       # 日本語コードライブラリ

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
####■ 以下スクリプト ■####
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
$ENV{'TZ'} = 'JST-9';

if (!(-e $jcode)) { die "Error: $jcodeオープンエラー"; } else { require $jcode; }

&decode; # デコード
if ($FORM{'mode'} eq 'view') { &view; }
elsif ($FORM{'mode'} eq 'login') { &login; }
elsif ($FORM{'mode'} eq 'admin') {
}
else { &top; }

exit;
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ トップ
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub top {
	# スキンファイル読み込み
	my $html = join('', &file_read($skintop));

	$html =~ s/_MAIN_TITLE_/$columtitle/g;
	$html =~ s/_STYLE_/$style/g;
	$html =~ s/_ADMIN_ANCHOR_/$script?mode=login/g;
	$html =~ s/_COPY_/<div align="right"><a href="http:\/\/mcgi\.jpn\.ch\/" target="_blank"><small>まろやかコラム Ver$version<\/small><\/a><\/div>/g;

	my ($header, $body, $footer) = split(/<!--SPLIT-->/, $html);

	print "Content-type: text/html\n\n";
	print $header;

	# データファイル読み込み
	my @data = &file_read($datafile);

	if (@data) {
		# タイトル一覧
		for (my $i = 0; $i <= $#data; $i++) {
			my ($title, $dfg, $days, $txt) = split(/\t/, $data[$i]);
			if (!$dfg) {
				my $tmp = $body;
				$tmp =~ s/_TITLE_ANCHOR_/$script?mode=view&no=$i/g;
				$tmp =~ s/_TITLE_/$title/g;
				$tmp =~ s/_DAYS_/$days/g;

				print $tmp;
			}
		}
	} else {
		print "[まだタイトルはありません。]\n";
	}

	print $footer;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 内容表示
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub view {
	# データファイル読み込み
	my @data = &file_read($datafile);
	my ($title, $dfg, $days, $text) = split(/\t/, $data[$FORM{'no'}]);

	my ($aback, $nexta);
	if ($FORM{'no'} != 0) {
		my $b = $FORM{'no'} - 1;
		$aback = "<a href=\"$script?mode=view&no=$b\">$back</a>";
	} elsif ($anc) {
		$aback = "$back";
	}
	if ($FORM{'no'} != $#data) {
		my $n = $FORM{'no'} + 1;
		$anext = "<a href=\"$script?mode=view&no=$n\">$next</a>";
	} elsif ($anc) {
		$anext = "$next";
	}

	# スキンファイル読み込み
	my $html = join('', &file_read($skinview));

	$html =~ s/_MAIN_TITLE_/$columtitle/g;
	$html =~ s/_STYLE_/$style/g;
	$html =~ s/_TITLE_/$title/g;
	$html =~ s/_TEXT_/$text/g;
	$html =~ s/_DAYS_/$days/g;
	$html =~ s/_BACK_ANCHOR_/$aback/g;
	$html =~ s/_NEXT_ANCHOR_/$anext/g;
	$html =~ s/_TOP_ANCHOR_/$script?/g;
	$html =~ s/_ADMIN_ANCHOR_/$script?mode=login/g;
	$html =~ s/_COPY_/<div align="right"><a href="http:\/\/mcgi\.jpn\.ch\/" target="_blank"><small>まろやかコラム Ver$version<\/small><\/a><\/div>/g;

	print "Content-type: text/html\n\n";
	print $html;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 管理画面
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 下書きタイトル一覧
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub draft_list {
	# タイトルと説明を表示
	&header("下書きタイトル一覧−$columtitle");
	print "<p class=\"title\">下書きタイトル一覧</p>\n";

	print "<p>新規作成時に「下書き保存」を選んでいるとここに保存されます。<br>\n";
	print "編集、もしくは削除するには対象のタイトルをチェックして実行をクリックしてください。</p>\n";
	&list_view(1);
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 現行タイトル一覧
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub edit_list {
	# タイトルと説明を表示
	&header("現行タイトル一覧−$columtitle");
	print "<p class=\"title\">現行タイトル一覧</p>\n";

	print "<p>編集、もしくは削除をするには対象のタイトルをチェックして実行をクリックしてください。</p>\n";
	&list_view(0);
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 一覧表示
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub list_view {
	# ファイル読み込み
	my @data = &file_read($datafile);

	if (@data) {
		print "<p><form action=\"$script?\" method=\"POST\">\n";
		print "<input type=\"hidden\" name=\"pass\" value=\"$FORM{'pass'}\">\n";
		print "<input type=\"hidden\" name=\"mode\" value=\"admin\">\n";
		print "<table cellpadding=\"5\" cellspacing=\"0\" border=\"1\">\n";
		print "<tr><td><br></td>\n";
		print "<td>タイトル</td>\n";
		print "<td>更新日時</td></tr>\n";

		# 下書き編集ならフラグが付いてるものだけ表示
		# 記事編集ならフラグが付いていないものを表示
		for (my $i = 0; $i <= $#data; $i++) {
			my ($tit, $dfg, $day) = split(/\t/, $data[$i]);
			if (($_[0] && $dfg) or (!$_[0] && !$dfg)) {
				print "<tr><td align=\"center\"><input type=\"radio\" name=\"no\" value=\"$i\"></td>\n";
				print "<td>$tit</td>\n";
				print "<td>$day</td></tr>\n";
			}
		}
		print "<tr><td colspan=\"3\">\n";
		print "<select name=\"com\">\n";
		print "<option value=\"$FORM{'com'}_edit\">編集</option>\n";
		print "<option value=\"del\">削除</option>\n";
		print "</select>\n";
		print "<input type=\"button\" value=\"実行\" onClick=\"disabled='true'; form.submit();\">\n";
		print "</td></tr>\n";
		print "</table></form></p>\n";
	} else {
		print "<p>[タイトルはまだありません。]</p>\n";
	}

	print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=admin&pass=$FORM{'pass'}\"\">管理画面へ</a></p>\n";

	&footer;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ フォーム画面
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub form {
	if ($FORM{'com'} eq 'new') {
		# 新規作成
		&form_view("新規作成");
	} else {
		# 未入力チェック
		if ($FORM{'no'} eq '') {
			&error("タイトルを選択してください。");
		}
		# 記事・下書き編集の場合は該当ログをフォームに渡す
		my @data = &file_read($datafile);
		my ($tit, $dfg, $day, $txt) = split(/\t/, $data[$FORM{'no'}]);
		$txt =~ s/<br>/\n/g;
		&form_view("編集", $tit, $txt);
	}
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 新規作成（書き込み）
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub write {
	# アクセスチェック
	if ($ENV{'REQUEST_METHOD'} ne 'POST') {
		&error("不正なアクセスです。");
	}

	# 未入力チェック
	if ($FORM{'title'} eq '') { &error("タイトルを入力してください。"); }
	if ($FORM{'text'} eq '') { &error("文章を入力してください。"); }

	# ファイル読み込み
	my @data = &file_read($datafile);

	# 日付ゲット
	my $days = &get_days(time);

	# 編集モードなら該当ログを書き換える
	my $data;
	if ($FORM{'no'} ne '') {
		if (!$FORM{'save'} && $FORM{'dore'} eq 'edit_edit') {
			$data[$FORM{'no'}] = "$FORM{'title'}\t$FORM{'save'}\t$days\t$FORM{'text'}\n";
		} else {
			# 下書き編集から新規追加の場合
			splice(@data, $FORM{'no'}, 1);
			$data = "$FORM{'title'}\t$FORM{'save'}\t$days\t$FORM{'text'}\n";
		}
	} else {
		$data = "$FORM{'title'}\t$FORM{'save'}\t$days\t$FORM{'text'}\n";
	}

	# ファイル書き込み
	&file_write($datafile, $data, @data);

	# 以下結果表示
	&header("正常に作業が完了しました−$columtitle");

	print "<p>正常に作業が完了しました。</p>\n";
	print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=admin&pass=$FORM{'pass'}\"\">管理画面へ</a></p>\n";
	print "</body></html>\n";
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 削除
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub del {
	# ファイル読み込み
	my @data = &file_read($datafile);

	# 削除処理
	splice(@data, $FORM{'no'}, 1);

	# ファイル書き込み
	&file_write($datafile, @data);

	# 以下結果表示
	&header("削除−$columtitle");

	print "<p>正常に削除が完了しました。</p>\n";
	print "<p><a href=\"$script?\">TOP</a> ≫ <a href=\"$script?mode=admin&pass=$FORM{'pass'}\"\">管理画面へ</a></p>\n";
	print "</body></html>\n";
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ デコード
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub decode {
	my ($buffer, $pairs, $value, @pairs);

	if ($ENV{'REQUEST_METHOD'} eq 'POST') {
		read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
	} else {
		$buffer = $ENV{'QUERY_STRING'};
	}

	@pairs = split(/&/, $buffer);

	foreach (@pairs) {
		($pairs, $value) = split(/=/, $_);

		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		$value =~ s/&/&amp;/g;
		$value =~ s/\t/  /g;
		$value =~ s/\r\n|\r|\n/<br>/g;

		&jcode'convert(*value,'sjis');
		$FORM{$pairs} = $value;
	}
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ ファイル読み込み
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub file_read {
	my ($file) = @_;

	open(FILE, "$file") || &error("ファイル\"$file\"が開けませんでした。");
		my @line = <FILE>;
	close(FILE);

	@line = reverse(@line) if($tithr);

	return @line;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ ファイル書き込み
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub file_write {
	my ($file, @data) = @_;

	open(FILE, ">$file") || &error("ファイル\"$file\"が開けませんでした。");
		print FILE @data;
	close(FILE);
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ フォーム表示
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub form_view {
	my ($tit, $ctit, $txt) = @_;

	&header("$tit−$columtitle");
print <<"_HTML_";
<p class="title">$tit</p>
<form action="$script" method="POST">
<input type="hidden" name="pass" value="$FORM{'pass'}">
<input type="hidden" name="mode" value="admin">
<input type="hidden" name="com" value="write">
<input type="hidden" name="dore" value="$FORM{'com'}">
<input type="hidden" name="no" value="$FORM{'no'}">
<table>
	<tr>
		<td align="right">タイトル：</td>
		<td><input type="text" size="50" name="title" value="$ctit"></td>
	</tr>
	<tr>
		<td align="right">文章：</td>
		<td><textarea name="text" cols="70" rows="20">$txt</textarea></td>
	</tr>
	<tr>
		<td></td>
		<td>
		<input type="button" value="　送信　" onClick="disabled='true'; form.submit();">
		下書き保存<input type="checkbox" name="save" value="1">
		</td>
	</tr>
</table>
</form>
<p><a href="$script?">TOP</a> ≫ <a href="$script?mode=admin&pass=$FORM{'pass'}">管理画面へ</a></p>
_HTML_
	&footer;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ ログイン画面
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub login {
	&header("ログイン−$columtitle");

	print <<"_HTML_";
<p class="title">ログイン</p>
<p><form action="$script" method="POST">
<input type="hidden" name="mode" value="admin">
パスワード：<input type="password" name="pass" size="10">
<input type="submit" value="送信">
</form></p>
<p><a href="$script?">TOP</a></p>
_HTML_

	&footer;
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#▼ ヘッダー
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub header {
	my ($title) = @_;

	print "Content-type: text/html\n\n";
	print <<"_HTML_";
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=shift_jis">
<title>$title</title>
<link rel="stylesheet" type="text/css" href="$style">
</head>
<body>
<center>
_HTML_

}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
#▼ フッター
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub footer {
	print qq(<a href="$homeurl" target="_top">HOME</a>) if ($homeurl);
	print <<"_HTML_";
<div align="right">
<small><a href="http://mcgi.jpn.ch/">まろやかコラム Ver$version</a></small>
</div>
</center>
</body>
</html>
_HTML_
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ 日付を獲得
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub get_days{
	my ($dy, $mon, $year) = (gmtime(time+60*60*9))[3, 4, 5];
	return sprintf("%04d.%02d.%02d", $year+1900, $mon+1, $dy);
}

#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
# ▼ エラー
#〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
sub error {
	&header('error');

	print "<p><table><tr><td><font color=\"#CC3333\">エラー</font><br>\n";

	foreach (@_) {
		print "<font color=\"#CC3333\">&gt;&nbsp;</font>$_<br>\n";
	}

	print "</tr></td></table></p>\n";
	print "<a href=\"JavaScript:history.back()\">戻る</a>\n";
	print "</body></html>\n";
	exit;
}
