#! /usr/local/bin/perl

#--------------------------------
#ゆいりんく1.0(link.cgi)
#1997.10.11製作
#すくりぷと　ばい　ゆいちゃっと
#　　　　　　　　　Since  1996
#--------------------------------------------------
# DN Memo Ver5.4 (日記 or 更新記録スクリプト)
#--------------------------------------------------
# 質問などはゆいさんではなくりゅういちのページまで
# W W W :http://www.cj-c.com/
# E-MAIL:ryu@cj-c.com
#--------------------------------------------------
# 設置方法:
# dnmemo.cgi(755)/jcode.pl(755)/dnmemo.dat(666)/dncount.dat(666)
# ４つのファイルを同一ディレクトリに設置。
#--------------------------------------------------

require './jcode.pl';

#----初期設定など---------------*

$method= 'POST';		# 受け渡しの方法 GET or POST
$title = '日記のようなもの';		# タイトル

# BODYタグを書きますHTMLファイルのBODYタグと一緒
$body='<BODY BGCOLOR="#9999FF" TEXT="#006699" LINK="#006699" VLINK="#006699">';

$homepage= 'http://www.oriental-pro.com';	# 戻りのURL
$t_font  = 'ＭＳ ゴシック';		# タイトルのフォント
$t_size  = 7;			# タイトルのサイズ
$color   = "#FFFFFF";		# タイトルの色(16進数で指定)

$table = 0;			# モードの変更(1=更新記録　0=日記)
$time_t= 0;			# 時間のモード(1=手動      0=自動)

#-----------------------------------------日記画像の設定-------
# 日記モードの場合の天気画像の定義
# $icond は画像の位置を指定。(初めのままだと同じディレクトリ。最後のスラッシュ(/)は省く)
# @how1  は画像の名前を定義。(*.gif / *.jpg など)
# @how2  は天気の名前の定義。(晴れ / あめ など)
#--------------------------------------------------------------
$icond=".";			# 天気画像のあるディレクトリ(相対パスか絶対パス(http://〜))

@how1 = ('sun.gif','lain.gif','crow.gif','snow.gif','tand.gif');
@how2 = ('晴れ','あめ','くもり','ゆき','かみなり');

$t_wid= "";			# 画像の横幅(ピクセル指定 / 指定しない場合は縦横とも空欄)
$t_hei= "";			# 画像の縦幅(　〃　)

$obi_color= "#006699";		# 記事タイトルのバック色(16進数で指定)
$obi_t    = "#FFFFFF";		# 記事タイトルの文字色　(　〃　)
$c_bgcolor= "#FFFFCC";		# コメントのバック色    (　〃　)
$s_color  = "#99FFCC";		# 記事タイトルの横につく■の色( 〃 )

$mail  = 'oriental@sainet.or.jp';	# あなたのE-メールアドレス
$your_n= 'oriental';		# あなたの名前

$passwd='0322';			# 書きこむパスワードを指定（削除するときもこれ。）
$max   = 2000;			# 最大記述数
$p_max = 10;			# １ページ表示件数
$tmax  = 30;			# タイトルの限度(全角だとこの場合15字)
$cmax  = 8000;			# コメントの限度(全角だとこの場合1000字)
$crap  = "SOFT";		# フォーム改行形式(SOFT or HARD)

#上部のHTML部分を書きます（タグも書けます）
$coms = <<"_TOP_";

<B>□仕事のメモや、身近に起こったことなど、不定期かつ無秩序に記しておくページです。</B><br>
<B>□気になることがあってもツッコまないでください(^^;</B><BR>
<B>□固有名詞はおおむね仮名です。</B><BR>

_TOP_
#↑ここは消さないこと

#-----ここから下は応用設定------*

$t_img  = "";			# タイトルに画像をURLで指定
$twid  = "135";			# 　〃　の横幅(ピクセル指定)
$thei  = "80";			# 　〃　の縦幅(　〃　)
$a_link= 1;			# URL、E-mailをリンクする? (1=YES 0=NO)
$tagkey = 1;			# タグの使用 (1=YES 0=NO)
$link_file= './dnmemo.dat';	# datファイルの位置
$cgidir   = './dnmemo.cgi';	# CGIファイルの名前

#--カウンタ設定(KENTさん式)--#

$counter  = 0;			# カウンタの設置 (1=YES 0=NO)
$mini_fig = 5;			# カウンタの桁数
$cnt_color= "D00000";		# テキスト=> テキスト色
$gif_path = ".";		# 画像=> 画像までのディレクトリ
$mini_wid = 8;			#  〃 => 画像の横サイズ
$mini_hei = 12;			#  〃 => 画像の縦サイズ
$countfile= './dncount.dat';	# カウンタファイル

$k_font="ＭＳ Ｐゴシック";	# 基本フォント(環境による)
$k_size="11pt";			# 基本フォントサイズ(ptは単位 削除不可)

$ie_c = "#E88C8E";		# リンクを合わせた時の色変化(16進数 IE向け)

#------設定はここまで-----------*

#-----------------------------------
# ここより下はあなたの責任で…。
#-----------------------------------

$regist = '1';
$ver="DN Memo v5.4";
&jikan;&decode;
if ($mode eq "hen_") { &hen_; }
if ($mode eq "h_w_") { &h_w_; }
&readlog;
if ($mode eq "find") { &find; }
if ($mode eq "edit") { &edit; }
&write if ($name);
&html;
exit;

sub hed_ { #ヘッダ
print "Content-type: text/html\n\n";
print <<"_HTML_";
<HTML>
<HEAD>
<!--$ver-->
<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">
<STYLE TYPE="text/css">
<!--
A:hover { color:$ie_c;}
BODY,TD,TH { font-family:"$k_font"; font-size:$k_size; }
-->
</STYLE>
<TITLE>$title</TITLE>
</HEAD>$body
<!--広告用タグ(ヘッダ)はここから-->

<DIV align="right">
プラモのことなら<A HREF="http://www.hobbylandcube.com/"><IMG SRC="cubebanalogo2.jpg" BORDER="0"></A><BR>
</DIV>


<!--ここまでの間にそのまま入れる-->
_HTML_
}

sub foot_ { #フッタ
print <<"_HTML_";
<br><hr width=90\%>
<!--著作権\表\示\削除不可-->
<H5 ALIGN=right><A HREF="http://i.am/yui/" target="_top">ゆいりんく(Free)</A>
<br>EDIT By <A HREF="http://www.cj-c.com/" target="_top">CJ Club</A>
</H5>
<!--広告用タグ(フッタ)はここから-->

<!--ここまでの間にそのまま入れる-->
</BODY></HTML>
_HTML_
exit;
}

sub html {
$count = int(($roomtotal-1)/$lmax);
if ($t_img ne ""){$title_h="<img src=\"$t_img\" width=$twid height=$thei>\n";}
	elsif($t_img eq ""){
$title_h="<FONT SIZE=$t_size COLOR=\"$color\" FACE=\"$t_font\">$title</FONT>\n";
	}
&hed_;
print <<"_HTML_";
<center>$title_h<BR>
<hr width=90\%>
□<A HREF="$homepage"> BACK</A><hr width=90\%>
<TABLE><TR><TD>$coms</TD></TR></TABLE>
<DIV ALIGN=RIGHT>BY / <A HREF="mailto:$mail">$your_n</A></DIV>
<hr width=90\%></center>
Page:
_HTML_
$roomtotal = @lines;
$count = int(($roomtotal-1)/$lmax);
for($i=0;$i<=$count;$i++){
	if($i eq $page){ print "[<b>$i</b>] \n";		}else{
		print "[<A HREF=\"$cgidir?page=$i&lm=$lmax\">$i</A>]\n";
	}
}#for
(@lines < $lmax) || (@lines = @lines[$page2 .. $page2+$lmax-1]);
if($table){
	print "<br><center>\n";
	foreach $line(@lines){
			($url,$time_on,$name,$len) = split(/\t/, $line);
if($name ne "" && $len ne ""){
	if ($url eq "http://" || $url eq "") { $url = "\n"; }
	elsif ($url ne "") { $url = "<A HREF=\"$url\">$url</A>"; }
	if ($a_link == 1) { &auto_($len); }
		print "<center><TABLE WIDTH=\"75%\"><TR><TD BGCOLOR=\"$obi_color\"><FONT SIZE=4 COLOR=\"$s_color\">■ </FONT><FONT COLOR=\"$obi_t\" size=4>$name</FONT></TD></TR></TABLE>\n" ;
		print "<TABLE WIDTH=\"75%\"><TR><TD BGCOLOR=$c_bgcolor><dl><dd><table><tr><td>$time_on</td></tr><tr><td><br><BLOCKQUOTE>$len</BLOCKQUOTE></td></tr></table></dl>\n" ;
		print "</TD></TR><TR><TD BGCOLOR=$c_bgcolor COLSPAN=\"2\" align=right>$url</TD></TR></TABLE>\n" ;
	print "</center>\n";
	}}
}else{
foreach $line(@lines){
	($url,$time_on,$name,$len) = split(/\t/, $line);
if($name ne "" && $len ne ""){
	if($t_wid ne ""){$howhow="<IMG SRC=\"$icond\/$url\" WIDTH=\"$t_wid\" HEIGET=\"$t_hei\">";}
	elsif($t_wid eq ""){$howhow="<IMG SRC=\"$icond\/$url\">";}
	if ($a_link == 1) { &auto_($len); }
		print "<center><TABLE WIDTH=\"75%\"><TR><TD BGCOLOR=\"$obi_color\"><FONT SIZE=4 COLOR=\"$s_color\">■ </FONT><FONT COLOR=\"$obi_t\" size=4>$name</FONT></TD></TR></TABLE>\n" ;
		print "<TABLE WIDTH=\"75%\"><TR><TD BGCOLOR=$c_bgcolor><dl><dd><table width=90\%><tr><td>□ $time_on</td><td align=right>$howhow\n" ;
		print "</td></tr><tr><td colspan=2><br><BLOCKQUOTE>$len</BLOCKQUOTE></td></tr></table></dl></TD></TR></TABLE>\n";
	print "</center>\n";
}}
}#table
print "<div align=left>Page:";
for($i=0;$i<=$count;$i++){
	if($i eq $page){ print "[<b>$i</b>] ";		}else{
		print "[<A HREF=\"$cgidir?page=$i&lm=$lmax\">$i</A>] \n";
	}
}#for
print <<"_HTML_";
</div><BR><HR width=90\%><DIV ALIGN=right><FORM METHOD="$method" ACTION="$cgidir">
表\示件数:<INPUT TYPE=text NAME="lm" SIZE="2" value="$lmax">
<INPUT TYPE=submit VALUE="表\示件数変更">
<BR>(現在$roomtotal件中/$lmax件/Pageで表\示をしています。)<BR></FORM><BR>
<BR><form action="$cgidir" method=$method><input type=hidden name=mode value=find>
<input type=password name=pass size=8><input type=submit value="管理用"></form>
</DIV>
_HTML_
	if ($counter) { &counter; }
&foot_;
}#html END

sub write {
&err(1) unless($name);
&err(2) unless($len);
&err(4) if( $regist && ($pass ne $passwd) );
&err(5) if(length($len) > $cmax);

$value = "$url\t$time_on\t$name\t$len\t$times\t\n";
&writelog;
}#write END

sub decode{	#一般的なデコード＆変数への代入
if ($ENV{'REQUEST_METHOD'} eq "POST") { 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');
		if ($tagkey == 0) {
			$value =~ s/</\&lt\;/g;
			$value =~ s/>/\&gt\;/g;
			$value =~ s/\"/\&quot\;/g;
		} else {
			$value =~ s/<>/\&lt\;\&gt\;/g;
			$value =~ s/<!--(.|\n)*-->//g;
		}

		$FORM{$name} = $value;
	}
$pass = $FORM{'pass'};
$name = $FORM{'name'};
$url = $FORM{'url'};
if($time_t == 1){$time_on = $FORM{'date'};}
elsif($time_t == 0){$time_on = $date;}
$len = $FORM{'len'};
$len =~ s/\r\n/<br>/g;
$len =~ s/\r|\n/<br>/g;
$mode = $FORM{'mode'};
$page = $FORM{'page'};
$page=0 unless($page);
$lmax = $FORM{'lm'};
$lmax = $p_max unless($lmax);
$page2 = $page*$lmax;
$tms = $FORM{'tms'}

}#decode END

#-------------
# フォーム表示
#-------------
sub find {
&err(4) if( $regist && ($pass ne $passwd) );
$passon="<INPUT TYPE=hidden NAME=\"pass\" VALUE=\"$pass\" SIZE=\"20\">" if($regist);
if($table == 1){
$url_form = "<TR><TD>更新ページURL:</TD><TD><INPUT TYPE=text NAME=\"url\" VALUE=\"http://\" size=45><br>入力しない場合はこのまま</TD></TR>";
$t_m = "タイトル";
	}elsif($table == 0){
$t_m2 = "見だし";
}
if ($t_img ne ""){$title_h="<img src=\"$t_img\" width=$twid height=$thei>\n";}
	elsif($t_img eq ""){
$title_h="<FONT SIZE=$t_size COLOR=\"$color\" FACE=\"$t_font\">$title</FONT>\n";
	}
&hed_;
print <<"_HTML_";
□ <A HREF="$cgidir"> BACK</A>　□<A HREF="$cgidir?mode=edit&pass=$pass"> EDIT</A><HR>
<center>$title_h<br>(Write Mode)<hr width=90\%>□ 内容編集はEDITモードで
<hr width=90\%>
</center>
<BLOCKQUOTE><FORM METHOD="$method" ACTION="$cgidir">
<TABLE>
<TR><TD>$t_m$t_m2/</TD><TD><INPUT TYPE=text NAME="name" VALUE=""></TD></TR>
<TR><TD COLSPAN="2">コメント/<BR><textarea cols="60" rows="4" NAME="len" WRAP="$crap">
</textarea></TD></TR>
$passon$url_form
_HTML_
if($table==0){
	print "<tr><td>てんき/</td><td><select name=url>\n";
	foreach(0 .. $#how1) {
		print "<option value=\"$how1[$_]\">$how2[$_]\n";
	}
print "</select> <font size=\"2\">(天気を選択して下さい)</td></tr>\n";
}
if($time_t==1){
print"<tr><td>時刻調整/</td><td><input type=text size=30 name=date value=\"$date\"></td></tr>";
}
print <<"_HTML_";
<TR><TD COLSPAN="2"><INPUT TYPE=submit VALUE=" 登録 ">
<INPUT TYPE=reset VALUE="リセット">
</TABLE></FORM></BLOCKQUOTE><BR>
_HTML_
&foot_;
	}

sub jikan{#$dateに時刻を代入します。
	$times = time;

	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
	$year=$year+1900;
	$mon++;
	if ($mon  < 10) { $mon  = "0$mon";  }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($min  < 10) { $min  = "0$min";  }
	if ($sec  < 10) { $sec  = "0$sec";  }
	$week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat') [$wday];

	$date = "$year\/$mon\/$mday\($week\) $hour\:$min\:$sec";
}#jikan END

sub readlog{	#配列@linesにログを読み込む
	open(DB,"$link_file")||&err(0);
	seek(DB,0,0);
	@lines = <DB>;
	close(DB);
}#readlog END

sub writelog{	#$valueを@linesに加えたのち、書き込む
	(@lines < $max-1) || (@lines = @lines[0 .. $max - 2]);
	unshift( @lines,$value) if ($value);
		@lines=grep(!/^\n/,@lines);
	open(DB,">$link_file") || &err(0);
		eval 'flock(DB,2);';
		seek(DB,0,0);  print DB @lines;
		eval 'flock(DB,8);';
	close(DB);
}#writelog END

sub edit {

if($buffer=~/erase/){
	&err(4) if($pass ne $passwd);
	$buffer=~s/&pass=.*//;#余分な部分を削除
	$buffer=~s/&//;#余分な部分を削除
	(@erase) = split(/erase=/, $buffer);#削除リストを作成
	foreach $erase(@erase){
		@lines=grep(!/$erase/,@lines);
	}

	$value='';&writelog;
}
if ($t_img ne ""){$title_h="<img src=\"$t_img\" width=$twid height=$thei>\n";}
	elsif($t_img eq ""){
$title_h="<FONT SIZE=$t_size COLOR=\"$color\" FACE=\"$t_font\">$title</FONT>\n";
	}
&hed_;
print <<"_HTML_";
<FORM METHOD="$method" ACTION="$cgidir">
<INPUT TYPE=HIDDEN NAME=mode value="edit">
□<A HREF="$cgidir"> EDIT終了</A>　
□<A HREF="$cgidir?mode=find&pass=$pass"> WRITE</A><BR><hr width=90\%>
<center>$title_h<br>(Edit Mode)<BR>
<HR WIDTH=90\%>
<table><tr><td>
□ 削除するものにチェックをいれます。<br>
□ 編集する場合は、タイトルをクリック。
</td></tr></table>
<hr width=90\%>
</center>
Page:
_HTML_

$roomtotal = @lines;
$count = int(($roomtotal-1)/$lmax);
for($i=0;$i<=$count;$i++){
	if($i eq $page){ print "[<b>$i</b>] \n";		}else{
		print "[<A HREF=\"$cgidir?page=$i&lm=$lmax&mode=edit&pass=$pass\">$i</A>] \n";
	}
}#for

(@lines < $lmax) || (@lines = @lines[$page2 .. $page2+$lmax-1]);
print "<center><TABLE BORDER=0 width=80\%>\n";
print "<TR><TD BGCOLOR=$obi_color><B>タイトル＆日付け</B></TD><TD BGCOLOR=$c_bgcolor><B>コメント</B></TD></TR>\n" ;
foreach $line(@lines){
	($url,$time_on,$name,$len,$tm) = split(/\t/, $line);
	print "<TR><TD BGCOLOR=$obi_color><INPUT TYPE=radio NAME=\"erase\" VALUE=\"$tm\"><a href=$cgidir?mode=hen_&pass=$pass&tms=$tm>$name</a>\n" ;
	print "<BR>$time_on</TD><TD BGCOLOR=\"$c_bgcolor\">$len</TD></TR>\n";
}
	print "</TABLE></center>\n";
print <<"_HTML_";
<hr>$date現在、$roomtotal件登録されています。
<BR>
<INPUT TYPE=hidden NAME="pass" VALUE="$pass">
<INPUT TYPE=submit NAME="edit" VALUE=" 削除 ">
<INPUT TYPE=reset VALUE="リセット"></FORM>
<BR>
_HTML_
&foot_;
}#html END
#---------------
# 記事編集ページ
#---------------
sub hen_ {
&err(4) if( $regist && ($pass ne $passwd) );
open(DB,"$link_file");
@lines = <DB>;
close(DB);

@new = ();
$flag = 0;
foreach $line (@lines) {
	($url,$time_on,$name,$len,$tm) = split(/\t/,$line);
	if ($tms eq "$tm") {
	&hed_;
	$len =~ s/<br>/\n/g;
	if ($tagkey) { $len =~ s/</&lt;/g; $len =~ s/>/&gt;/g; }
print <<"_HTML_";
<form action="$cgidir" method="$method"><input type=hidden name=pass value="$FORM{'pass'}">
<input type=hidden name=mode value=edit><input type=submit value="管理画面に戻る"></form>
<table width=100% bgcolor=$c_bgcolor><tr><th>タイトル [$name] の編集</th></tr></table>
<center>
□ 編集したい項目を変更し[編集]ボタンを押してください。
<form action="$cgidir" method="$method"><input type=hidden name=pass value="$FORM{'pass'}">
<input type=hidden name=mode value=h_w_><input type=hidden name=tms value=$tms>
<table><tr><td>タイトル</td><td>
/<input type=text name=name value="$name" size=30></td></tr>
<tr><td>時刻調整</td><td>
/<input type=text name="tmtm" value="$time_on" size=30></td></tr>
<tr><td colspan=2>コメント/ <font size=2>(適当に改行を入れて下さい)</font><br>
<textarea name="len" rows=12 cols=70 wrap=$crap>$len</textarea></td></tr>
_HTML_
if($table==0){
	print "<tr><td>てんき</td><td>/<select name=url>\n";
	foreach(0 .. $#how1) {
		if ($url eq "$how1[$_]") {
		print "<option value=\"$how1[$_]\" selected>$how2[$_]\n";
		} else {
		print "<option value=\"$how1[$_]\">$how2[$_]\n";
		}
	}
print "</select> <font size=\"2\">(天気を選択して下さい)</td></tr>\n";
}elsif($table==1){
print "<TR><TD>更新ページURL</TD><TD>/<INPUT TYPE=text NAME=\"url\" VALUE=\"$url\" size=35><br>入力しない場合はこのまま</TD></TR>\n";
}
print <<"_HTML_";
<tr><td colspan=2 align=center><input type=submit value="編集する">
<input type=reset value=リセット></td></tr></table></form></center>
_HTML_

&foot_;
	}
	}
}
#---------------------
# 編集内容を書きかえる
#---------------------
sub h_w_ {
&err(1) unless($name);
&err(2) unless($len);
&err(5) if(length($len) > $cmax);
open(DB,"$link_file");
@lines = <DB>;
close(DB);

@new = ();
$flag = 0;
foreach $line (@lines) {
	$line =~ s/\n//g;
	($kurl,$kti,$kna,$klen,$ktm) = split(/\t/,$line);
	if ($tms eq "$ktm") {
		$line = "$url\t$FORM{'tmtm'}\t$name\t$len\t$tms\t";
		$flag = 1;
	}
	push(@new,"$line\n");
}

if ($flag == 0) { &er_("編集ナンバーが不正です。"); }

if ($flag == 1) {
	open (DB,">$link_file");
	print DB @new;
	close(DB);
}
&html;
}
### --- カウンタ処理 ---（KENTさんのスクリプトを参考 http://www.kent-web.com）###
sub counter {
	# カウントファイル読み込み
	open(NO,"$countfile") || &error("Can't open $countfile",'0');
	$cnt = <NO>;
	close(NO);

	# カウントアップ
	if ($FORM{'mode'} eq "") {
		$cnt++;

		# カウントファイル更新
		open(NO,">$countfile") || &error("Can't write $countfile",'0');
		print NO $cnt;
		close(NO);
	}
	# 桁数調整
	while(length($cnt) < $mini_fig){ $cnt = 0 . $cnt; }
	@cnts = split(//,$cnt);
	print "<table border=0 align=left><td bgcolor=$c_bgcolor>\n";
	# カウンタ表示
	if (-e "$gif_path/0.gif") {
		foreach (0 .. $#cnts) {
		print "<img src=\"$gif_path/$cnts[$_]\.gif\" alt=\"$cnts[$_]\" width=\"$mini_wid\" height=\"$mini_hei\">";
		}
	} else {
		print "<font color=$cnt_color face=\"Times New Roman,Arial\">$cnt</font>";
	}
	print "</td></table>\n";
}
sub auto_ { # URL、E-MAILを判断してリンクにする
	$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=$2 target=_top>$2<\/a>/g;
	$_[0] =~ s/([\w\.\-]+)\@([\w\.\-]+)/<a href=mailto\:$1\@$2>$1\@$2<\/a>/g;
}
sub err{
$error = $_[0];
&hed_;
print <<"_HTML_";
<HTML><HEAD><TITLE>$title</TITLE></HEAD>$body
<H1>タイプ $error のエラーが発生しました。</H1>
<HR>
[<A HREF="$cgidir">戻る</A>]
<BR>エラータイプの説明<BR><BR>
タイプ0：ログファイルが開けないか書け込めません<br>
タイプ1：タイトルが記入されていません<BR>
タイプ2：コメントがありません<BR>
タイプ3：URLが不適当です<BR>
タイプ4：パスワードが不適当です<BR>
タイプ5：コメントが多すぎます<BR>
_HTML_
&foot_;
}
__END__

