#!/usr/local/bin/perl

require "jcode.pl";

$var = "TBOARD 006 Version 0.13";
#   Copyright(C) TOSHISRUS
#   E-mail   ： tboard@sk.redbit.ne.jp
#   HOMEPAGE ： http://sk.redbit.ne.jp/~tboard/

# ==== 注意事項 ========================================================
#
# 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#    いかなる損害に対して作者は一切の責任を負いません。
#    また、本CGIはフリーソフトですが、著作権は放棄してはいません。
#    フッターの著作権表示はいかなる事があっても削除してはいけません。
#
# 2. 設置に関する質問は当ホームページの掲示板にてお願いいたします。
#    直接メールによる質問は一切お受けいたしておりません。
#
# 3. 設定項目を少なくしたため、カスタマイズが少々辛いです。
#    お気に召しましたら、お使いください。
#    要望などありましたら、当ホームページの掲示板にてお願いいたします。
#
# ======================================================================

# ==== 謝辞 ============================================================
#
# 画像以外の添付ファイルを表示する際に、『牛飼いとアイコンの部屋』様の
# アイコンを使用させてもらいました。ありがとうございます。
#

# [ 設置例 ]
#
#  public_html / index.html (ホームページなど)
#     |
#     +-- tboard [777]             /   tboard006.cgi   [755]
#          |                           tboard006.log   [666]
#          |                           jcode.pl        [644]
#          |                           index.html             ダミーのIndex
#          |
#          +--- icon [777]         /   index.html             ダミーのIndex
#          |                           mem10.gif             『牛飼いとアイコンの部屋』より
#          |
#          +-- oldlog [777]        /                          (過去ログ用のフォルダ)
#

# [ 管理者権限の取得方法 ]
#
# 1. 上の[ 設置例 ]に従って、当CGIを設置します。
#    （例）http://abcd.virtualave.net/tboard/tboard006.cgi
#
# 2. 設置した場所へジャンプし、URLの語尾に『?mode=pwd』と入力し移動します。
#    （例）http://abcd.virtualave.net/tboard/tboard006.cgi?mode=pwd
#
# 3. 管理人パスワードを入力するウィザードが立ち上がりますので、管理パスワードを
#    入力し、送信を押します。うまく動作すると、左のメニューに新たに『絵日記をつ
#    ける』が現れます。管理権限を持つ人のみ、このコンテンツが追加され、さらに『
#    最新の絵日記』では編集/削除ができるようになります。
#

# //// 基本設定 ///////////////////////////////////////////////////////////////////////////

# スクリプト名
$script = "tboard006.cgi";
# タイトル名
$title = "せんぎり日記";
# 戻り先 (例) ../index.html
$backurl = "../";
# Symlinkによるファイルのロック (Yes:1,No:0) 1を推奨
$lockon = 0;
$lockfile = "lock.lok";
# ログファイル名
$logfile = "kakomotomachi.log";
# 最近の絵日記の最大記事件数
$maxkiji = 10;
# 管理者パスワード
$adpwd = "jindaiji";
# 添付ファイルの格納場所
$icon_dir = "icon/";
# 添付ファイル（許可する拡張子:全て半角小文字で登録）
@iconft = ('jpg','gif','png','lzh','zip');
# 絵のサイズ
$i_width = 200;  # 横
# 画像以外の添付ファイルに対してのアイコン
$tmp_img = "./icon/mem10.gif";
# フォーム投稿時の最大サイズ (単位：KB)
$upsize = 50;
# 過去ログディレクトリ
$oldbox = "kakomotomachi/";
# HTMLTAGの許可 (Yes:1,No:0)
$tagok = 0;

# HPの上部にロゴ等を埋め込めます(必要に応じてお使いください)
$head_title = <<HTML_END;
<img src="../img/diary_header.gif"
HTML_END

# //// 基本設定 (ここまで) ////////////////////////////////////////////////////////////////

# 特殊サーバー設置の拡張設定（通常は使用しません。Hi-Ho等のサーバー用です。）
# アイコンフォルダの絶対パス（$tmp_imgも絶対パスにする必要があります。）
$icon_url = "";

# ------ 拡張設定 --------
# フレームを使用する (Yes:1,No:0) サーバー負荷軽減のため、0を推奨
$frameok = 0;
# 日付の位置 (右:1,左:0)
$dayloca = 0;
# 画像無しの時に位置を固定する (Yes:1,No:0)
$imgloca = 0;
# 日記の詰め方？ (右詰め:1,左詰め:0)  ＜言葉が変です。(笑)
$nikkiloca = 1;
# 編集削除時に関連記事を表示する (Yes:1,No:0)
$ndkiji = 1;
# 過去ログファイルのパーミッションを666に自動で設定 (Yes:1,No:0)
$chauto = 0;
# ------------------------

# ----- フォントとテーブルサイズの設定 ----------------------------------
# 基本フォント
$basefont = 'MS UI Gothic';
# 基本フォントサイズ
$basefontsize = '9pt';
# テーブル幅 (単位はピクセル)
$tbwid = '550';
# テーブル(名前部分：左上の幅) (単位はピクセル)
$tbrwid = '100';
# -----------------------------------------------------------------------

# ------------------------
#  補足
# menu01 : 日付情報格納
# menu02 : 日記のタイトル
# menu03 :
# menu04 :
# menu05 :
# ------------------------

# -- 色彩のコーディネート (ここから) ------------------
# ===== BODY設定 ===========
# 壁紙 (無しの場合は指定なし)
$kabegami = "";
# 背景色 ＆ ヘルプのバックグラウンド
$color01 = "#ffffff";
# テキストの色
$color02 = "#000000";
# 未リンクの色
$color03 = "#ff0000 ";
# 既リンクの色
$color04 = "#ff0000 ";
# ===== スタイルシート =====
# リンクを合わせた時の色 (hover)
$color05 = "#808080";
# フォームのボックス内のフォントの色 (st1)
$color06 = "#000000";
# フォームのボックス内の背景の色 (st1)
$color07 = "#ffffff";
# ===== TABLEの色(投稿時) ==
# テーブルの色（コンテンツ記入部） … 未記入で背景色 …
$color08 = "#999999";
# テーブル内のフォントの色（コンテンツ記入部）
$color09 = "#ffffff";
# テーブルの色（入力部） … 未記入で背景色 …
$color10 = "";
# 省略可の文字の色
$color11 = "#FF9900";
# ===== TABLEの色(通常記事) ==
# テーブルの色（名前） … 未記入で背景色 …
$color12 = "#999999";
# テーブル内のフォントの色（名前）
$color13 = "#ffffff";
# テーブルの色（タイトル） … 未記入で背景色 …
$color14 = "";
# テーブル内のフォントの色（タイトル）
$color15 = "#808080";
# テーブルの色（記事部分） … 未記入で背景色 …
$color16 = "#ffffff";
# テーブル内のフォントの色（日付等）
$color17 = "#808080";
# テーブル内のフォントの色（記事）
$color18 = "#000000";
# ===== TABLEの色(新着記事) =
# テーブルの色（名前） … 未記入で背景色 …
$color19 = "";
# テーブル内のフォントの色（名前）
$color20 = "#ffffff";
# テーブルの色（タイトル） … 未記入で背景色 …
$color21 = "";
# テーブル内のフォントの色（タイトル）
$color22 = "#ffffff";
# テーブルの色（記事部分） … 未記入で背景色 …
$color23 = "#ffffff";
# テーブル内のフォントの色（日付等）
$color24 = "#000000";
# テーブル内のフォントの色（記事）
$color25 = "#808080";
# -- 色彩のコーディネート (ここまで) ------------------

# テーブル背景色の設定
if($color01 ne ''){$back01 = "bgcolor=$color01";}
if($color08 ne ''){$back08 = "bgcolor=$color08"; $stylest1 = "background-color:$color08;border:1 dotted $color08;";}
if($color10 ne ''){$back10 = "bgcolor=$color10";}
if($color12 ne ''){$back12 = "bgcolor=$color12";}
if($color14 ne ''){$back14 = "bgcolor=$color14";}
if($color16 ne ''){$back16 = "bgcolor=$color16";}
if($color19 ne ''){$back19 = "bgcolor=$color19";}
if($color21 ne ''){$back21 = "bgcolor=$color21";}
if($color23 ne ''){$back23 = "bgcolor=$color23";}

# //// FORMからDATAを読み込む -とほほさんのスクリプトを一部改造- ///////////////////////////
if($ENV{'REQUEST_METHOD'} eq "POST"){
	$buffer = 'POSTDATA';
	# POSTの場合
	# 標準入力からデータを読みだす
	$buf = "";
	$read_data = "";
	$remain = $ENV{'CONTENT_LENGTH'};
	# UPサイズのチェック
	if(&checksize($remain)){&header;&error("フォーム投稿時の最大サイズは、$upsize\KB以内です。");}
	binmode(STDIN);
	while ($remain) {
		$remain -= sysread(STDIN, $buf, $remain);
		$read_data .= $buf;
	}
	# データを解釈する
	$pos1 = 0; # ヘッダ部の先頭
	$pos2 = 0; # ボディ部の先頭
	$pos3 = 0; # ボディ部の終端
	$delimiter = "";
	$max_count = 0;
	while (1) {
		# ヘッダ処理
		$pos2 = index($read_data,"\r\n\r\n",$pos1)+4;
		@headers = split("\r\n",substr($read_data,$pos1,$pos2-$pos1));
		$filename="";
		$name="";
		$flag=0;
		foreach(@headers){
			if ($delimiter eq "") {$delimiter = $_;
			}elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"; filename="([^;]*)"/i) {
				$name = $2;
				if ($3) {
					# 拡張子の取り出し
					@filefooter = split(/\./,$3);
					# 拡張子を全て小文字に変換
					@filefooter[1] =~ tr/A-Z/a-z/;
					# 拡張子の判定
					if(&ftflag(@filefooter[1])){&header;&error("許可されていない拡張子です。");}
					$filename = $name."\.".@filefooter[1];
				}
			}elsif(/^Content-Disposition: ([^;]*); name="([^;]*)"/i){$name = $2;}
		}
		# ボディ処理
		$pos3 = index($read_data, "\r\n$delimiter", $pos2);
		$size = $pos3 - $pos2;
		if($filename){
			# 以前のファイルの削除
			&filedel($name);
			if (open(OUT, "> $icon_dir$filename")) {
			binmode(OUT);
			print OUT substr($read_data, $pos2, $size);
			close(OUT);
			}
			$FORM{$name} = $filename;
		}elsif($name){
			$FORM{$name} = substr($read_data,$pos2,$size);
			if(!$tagok){
				# タグ不可
				$FORM{$name} =~ s/</&lt\;/g;
				$FORM{$name} =~ s/>/&gt\;/g;
			}
			# TABを全てSpaceに置き換える
			$FORM{$name} =~ s/\t/ /g;
			# 改行コードは全て<br>に置き換える
			$FORM{$name} =~ s/\r\n/<br>/g;
			$FORM{$name} =~ s/\r|\n/<br>/g;
		}
		# 終了処理
		$pos1 = $pos3 + length("\r\n$delimiter");
		if(substr($read_data, $pos1, 4) eq "--\r\n") {
			# すべてのファイルの終端
			last;
		}else{
			# 次のファイルを読み出す
			$pos1 += 2;
			next;
		}
	}
}else{
	# GETの場合
	$buffer = $ENV{'QUERY_STRING'};
	@pairs = split(/&/,$buffer);
	@spall =();
	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(!$tagok){
			# タグ不可
			$value =~ s/</&lt\;/g;
			$value =~ s/>/&gt\;/g;
		}
		# TABを全てSpaceに置き換える
		$value =~ s/\t/ /g;
		# 改行コードは全て<br>に置き換える
		$value =~ s/\r\n/<br>/g;
		$value =~ s/\r|\n/<br>/g;
		$FORM{$name} = $value;
	}
}

# ==== メインルーチン =====================================================================

# 日時の取得
&gettime;
# 管理人の権限の取得(クッキーを発行)
if($FORM{'mode'} eq 'pwd'){&ninsyou;}
# 認証コードを発行する
if($FORM{'mode'} eq 'writecode'){&writecode;}

if($frameok){
	# Frame
	if(!$buffer){&t_frame;}
	# Frame左側
	if($FORM{'loca'} eq 'f_left'){&f_left;}
	# Frame右側
	if($FORM{'loca'} eq 'f_right'){&f_right;}
}else{&f_right;}

# =========================================================================================

# //// フレーム ///////////////////////////////////////////////////////////////////////////
sub t_frame{
	print "Content-type: text/html\n";
	print "\n";
	print<<HTML_END;
<html>
<head><title>$title</title></head>
<frameset frameborder=0 framespacing=0 cols="160,*">
<frame name="f_left" src="$script?loca=f_left">
<frame name="f_right" src="$script?loca=f_right">
<noframes>
<body>
フレーム非対応のブラウザの方は利用できません
</body></noframes>
</frameset>
</html>
HTML_END
	exit;
}

# //// ヘッダー ///////////////////////////////////////////////////////////////////////////
sub header{
	print "Content-type: text/html\n";
	print "\n";
	print<<HTML_END;
<html>
<head><title>$title</title>
<style type="text/css">
<!--
body,tr,td {font-size:$basefontsize;font-family: "$basefont"}
table      {font-size:$basefontsize;}
b          {font-size:$basefontsize}
div        {line-height:14pt}
h4         {font-size:12pt}
.st1       {font-size:$basefontsize;font-family:"$basefont";color:$color06;background-color:$color07;} /* 項目1 */
.st2       {color:$color09;$stylest1} /* 項目2 */
-->
</style>
</head>
<body background="$kabegami" $back01 text="$color02"link="$color03" vlink="$color04">
<center>
HTML_END
}

# //// フッター ///////////////////////////////////////////////////////////////////////////
sub footer{
	# 著作権表示（削除・改変はできません）
	print<<HTML_END;
</center>
<div align=center><br>
$var<br>
- <a href='http://sk.redbit.ne.jp/~tboard/' TARGET=_blank>TOSHISRUS</a> -
</div>
</body></html>
HTML_END
	exit;
}

# //// Form幅の調整 ///////////////////////////////////////////////////////////////////////
sub getform{
	if(&ieflag){
		# IE4,IE5用の設定
		$w_name  = 20;
		$w_mail  = 50;
		$w_title = 80;
		$w_com  = 88;
		$w_url = 75;
		$w_file = 66;
		$w_key = 15;
	}else{
		# IE4,IE5以外の設定
		$w_name  = 13;
		$w_mail  = 33;
		$w_title = 52;
		$w_com  = 57;
		$w_url = 50;
		$w_file = 44;
		$w_key = 12;
	}
}

# //// 投稿フォーム ///////////////////////////////////////////////////////////////////////
sub tform{
	if($c_key ne $adpwd){&error("あなたは管理者ではありません。");}
	if($FORM{'date'} eq ''){
		$r_date = $date;
	}else{
		# 編集及び記事削除時にログファイルから関連ログ検出
		# 投稿記事のログを開く
		open(IN,"$logfile") || &error("Can't open logfile");
		@lines = <IN>;
		close(IN);
		# 初期化
		$r_date = "";
		$r_title = "";
		$r_com = "";
		foreach$line(@lines){
			($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
			if($rdate eq $FORM{'date'}){
				$r_date = $rdate;
				$c_name = $rname;
				$r_title = $rtitle;
				$c_mail = $remail;
				# コメントは<br>を改行コードに置き換える
				$rcom =~ s/<br>/\n/g;
				$r_com = $rcom;
				$c_url = $rurl;
				last;
			}
		}
	}
	# Form幅の調整
	&getform;
	print"<form method=post enctype=\"multipart/form-data\" action=\"$script\">\n";
	if($frameok){print"<input type=hidden name=loca value=\"f_right\">\n";}
	print"<input type=hidden name=mode value=\"writelog\">\n";
	print"<input type=hidden name=date value=\"$r_date\">\n";
	print"<input type=hidden name=key value=\"$c_key\">\n";
	print"<table border=0 cellpadding=2 cellspacing=0>\n";
	# 日付
	if($rmenu01 eq ''){$rmenu01 = $r_date;}
	# 年（フォーマット）
	$nnen = substr($rmenu01,0,4);
	# 月（フォーマット）
	$ntuki = substr($rmenu01,4,2);
	# 日（フォーマット）
	$nhi = substr($rmenu01,6,2);
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>日付</font></td>\n";
	print"<td $back10>\n";
	# 年
	print"<select name=menu01_1 class=\"st1\">\n";
	$nen = $nnen - 1;
	print" <option value=\"$nen\">$nen\n";
	$nen = $nnen;
	print" <option value=\"$nen\" SELECTED>$nen\n";
	$nen = $nnen + 1;
	print" <option value=\"$nen\">$nen\n";
	print"</select>年\n";
	# 月
	$t = 1;
	print"<select name=menu01_2 class=\"st1\">\n";
	while($t<13){
		$tflag = '';
		if($t<10){$tt = "0$t";}else{$tt = $t;}
		if($tt eq $ntuki){$tflag = 'SELECTED';}
		print" <option value=\"$tt\" $tflag>$t\n";
		$t++;
	}
	print"</select>月\n";
	# 日
	$t = 1;
	print"<select name=menu01_3 class=\"st1\">\n";
	while($t<32){
		$tflag = '';
		if($t<10){$tt = "0$t";}else{$tt = $t;}
		if($tt eq $nhi){$tflag = 'SELECTED';}
		print" <option value=\"$tt\" $tflag>$t\n";
		$t++;
	}
	print"</select>日\n";
	print"</td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# タイトル
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>タイトル</font></td>\n";
	print"<td $back10><input type=text name=\"menu02\" size=\"$w_title\" value=\"$rmenu02\" class=\"st1\"> <font color=$color11>省略可</font></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# 添付ファイル
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>添付ファイル</font></td>\n";
	print"<td $back10><input type=file name=\"$r_date\" size=\"$w_file\" class=\"st1\"> <font color=$color11>省略可</font></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# 日記
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>日記</font></td>\n";
	print"<td $back10><textarea name=com cols=\"$w_com\" rows=10 wrap=\"soft\" class=\"st1\">$r_com</textarea></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# 送信
	if($FORM{'date'} ne ''){
		# PASSWORD
		print"<tr>\n";
		print"<td $back08 align=center width=80><font color=$color09>編集/削除</font></td>\n";
		print"<td $back10><select name=mode2 class=\"st1\">\n";
		print" <option value=\"hensyu\">編集\n";
		print"<option value=\"del\">削除\n";
		print"</select></td>\n";
		print"</tr>\n";
		print"<tr>\n";
		print"<td $back08 colspan=2 height=2> </td>\n";
		print"</tr>\n";
		if(&ieflag){
			print"<tr>\n";
			print"<td $back10 colspan=2 height=3> </td>\n";
			print"</tr>\n";
		}
		print"<tr>\n";
		print"<td $back10 colspan=2><input type=submit value=\"　絵日記を編集/削除する　\" class=\"st2\"></td>\n";
		print"</tr>\n";
		print"<tr>\n";
		print"<td $back08 colspan=2 height=2> </td>\n";
		print"</tr>\n";
		if(&ieflag){
			print"<tr>\n";
			print"<td $back10 colspan=2 height=3> </td>\n";
			print"</tr>\n";
		}
		print"</table>\n";
	}else{
		print"<tr>\n";
		print"<td $back10 colspan=2><input type=submit value=\"　絵日記をつける　\" class=\"st2\"></td>\n";
		print"</tr>\n";
		print"<tr>\n";
		print"<td $back08 colspan=2 height=2> </td>\n";
		print"</tr>\n";
		if(&ieflag){
			print"<tr>\n";
			print"<td $back10 colspan=2 height=3> </td>\n";
			print"</tr>\n";
		}
		print"</table>\n";
	}
	print"<br>\n";
	# ヘルプを表示
	&help;
}

# //// ロックファイル : symlink関数 ///////////////////////////////////////////////////////
sub lock{
	local($retry) = 5;
	while (!symlink(".",$_[0])) {
		if (--$retry <= 0) { &error("LOCK is BUSY",$_[0]); }
		sleep(1);
	}
}

# //// Error処理 ///////////////////////////////////////////////////////////////////////////
sub error {
	if(-e $_[1]){ unlink($_[1]);}
	print"<center><hr width=75%><h4>エラー</h4>\n";
	print"<P><h4>$_[0]</h4>\n";
	print"<P><hr width=75%><br>ブラウザの戻るで戻ってください。</center>\n";
	&footer;
	exit;
}

# //// UP投稿部 ログへの書き込み //////////////////////////////////////////////////////////
sub writelog{
	if($FORM{'key'} ne $adpwd){&header;&error("あなたは管理者ではありません。");}
	# 記入漏れのチェック
	$error_flag = 0;
	if($FORM{'mode2'} ne 'del' && $FORM{'com'} eq ''){$error_flag = 1;}
	if($error_flag){
		# 編集時にはエラーが生じても添付ファイルを削除しない
		if($FORM{'mode'} ne 'hensyu'){&filedel($FORM{'date'});}
		&header;&error("記入漏れがあります。");
	}
	# 日付情報を8桁にする
	$FORM{'menu01'} = $FORM{'menu01_1'}.$FORM{'menu01_2'}.$FORM{'menu01_3'};
	# ファイルのロック
	if($lockon){&lock($lockfile);}
	# 投稿記事のログを開く
	open(IN,"$logfile") || &error("Can't open logfile",$lockfile);
	@lines = <IN>;
	close(IN);
	# 初期化
	@new = ();
	if($FORM{'mode2'} eq 'hensyu'){
		# 記事編集時
		foreach$line(@lines){
			($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
			if($rdate eq $FORM{'date'}){
				$line = "$rdate\t$FORM{'name'}\t$FORM{'email'}\t$FORM{'title'}\t$FORM{'com'}\t$FORM{'url'}\t$FORM{'key'}\t$FORM{'menu01'}\t$FORM{'menu02'}\t$FORM{'menu03'}\t$FORM{'menu04'}\t$FORM{'menu05'}\t\n";
			}
			push(@new,$line);
		}
	}elsif($FORM{'mode2'} eq 'del'){
		# 記事削除時
		foreach$line(@lines){
			# 記事削除用フラッグ
			$dflag = 1;
			($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
			if($rdate eq $FORM{'date'}){
				# 添付ファイルの削除
				&filedel($FORM{'date'});
				$dflag = 0;
			}
			if($dflag){push(@new,$line);}
		}
	}else{
		# 新規投稿時
		$line = "$FORM{'date'}\t$FORM{'name'}\t$FORM{'email'}\t$FORM{'title'}\t$FORM{'com'}\t$FORM{'url'}\t$FORM{'key'}\t$FORM{'menu01'}\t$FORM{'menu02'}\t$FORM{'menu03'}\t$FORM{'menu04'}\t$FORM{'menu05'}\t\n";
		unshift(@lines,$line);
		# 記事をカウントしMAXを超えたら古い記事から削除
		$s = 0;
		while($s<@lines){
			if($s < $maxkiji){
				push(@new,@lines[$s]);
			}else{
				($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,@lines[$s]);
				if($rmenu01 eq ''){$rmenu01 = $rdate;}
				$oldlog = substr($rmenu01,0,6)."\.log";
				&movelog($rdate,$logfile,$oldlog);
			}
			$s++;
		}
	}
	# ログの更新
	open(OUT,">$logfile") || &error("Can't write logfile",$lockfile);
	print OUT @new;
	close(OUT);
	# ロック解除
	if(-e $lockfile){unlink($lockfile);}
	# ブラウザのリフレッシュ
	&header;
	if($frameok){
		print"<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=$script?loca=f_right\">\n";
	}else{
		print"<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=$script\">\n";
	}
	&footer;
	exit;
}

# //// クッキーの発行 //////////////////////////////////////////////////////////////////////
sub set_cookie {
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 30*24*60*60);
	$yearg += 1900;
	if($secg  < 10){$secg  = "0$secg";}
	if($ming  < 10){$ming  = "0$ming";}
	if($hourg < 10){$hourg = "0$hourg";}
	if($mdayg < 10){$mdayg = "0$mdayg";}
	$month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mong];
	$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wdayg];
	$date_gmt = "$youbi, $mdayg\-$month\-$yearg $hourg:$ming:$secg GMT";
	$cook="key\:$FORM{'key'}";
	print "Set-Cookie: tboard=$cook; expires=$date_gmt\n";
}

# //// クッキーの取得 /////////////////////////////////////////////////////////////////////
sub get_cookie{
	$cookies = $ENV{'HTTP_COOKIE'};
	@pairs = split(/;/,$cookies);
	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/,$DUMMY{'tboard'});
	foreach $pair (@pairs) {
		$cnum = index("$pair","\:");
		$name = substr($pair,0,$cnum);
		$value = substr($pair,($cnum+1),(length($pair)-($cnum+1)));
		$COOKIE{$name} = $value;
	}
	$c_key = $COOKIE{'key'};
}

# //// 記事表示部 /////////////////////////////////////////////////////////////////////////
sub kiji{
	# 過去ログ時に必要
	if($logfile eq ''){&footer;}
	if(!$searchflag){
		# 投稿記事のログを開く
		open(IN,"$logfile") || &error("Can't open logfile");
		@lines = <IN>;
		close(IN);
	}
	$s = 0;
	while($s<@lines){
		($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,@lines[$s]);
		if($FORM{'mode'} eq 'tform' && $FORM{'date'} ne $rdate){$s++;next;}
		# 親記事
		$ncolor = $back12;
		$nfont  = $color13;
		$tcolor = $back14;
		$tfont  = $color15;
		$kcolor = $back16;
		$kfont1 = $color17;
		$kfont2 = $color18;
		# === テンプレート =======================
		# テーブルサイズ
		$osize0 = $tbwid;
		$osize1 = $osize0 - 4;
		$osize2 = $tbrwid;
		$osize3 = $osize0 - $osize2;
		$rsize0 = $osize0 - 50;
		$rsize1 = $rsize0 - 4;
		$rsize2 = $tbrwid;
		$rsize3 = $rsize0 - $rsize2;
		# ========================================
		# 記事の内容
		# 投稿日
		$day = substr($rmenu01,4,2).'/'.substr($rmenu01,6,2).'/'.substr($rmenu01,0,4);
		# 記事の内容
		if(!$oldflag && $c_key eq $adpwd){
			# 記事編集用
			if($frameok){
				$khen = " 　 <a href=\"$script?loca=f_right&mode=tform&date=$rdate\"><font color=$kfont1>編集/削除</font></a>";
			}else{
				$khen = " 　 <a href=\"$script?mode=tform&date=$rdate\"><font color=$kfont1>編集/削除</font></a>";
			}
		}else{$khen = "";}
		if($s){
			if($fflag){print"	</td></tr>\n";}
			print"	</table>\n";
			print"</td>\n";
			print"</tr>\n";
			print"</table>\n";
		}
		print"<br>\n";
		print"<table border=0 cellpadding=2 cellspacing=0 width=$osize0>\n";
		print"<tr>\n";
		if($rmenu02 eq ''){$rmenu02 = '　';}
		if($dayloca){
			print"<td $ncolor align=left width=$osize3><font color=$nfont>$rmenu02</font></td>\n";
			print"<td $ncolor align=right width=$osize2><font color=$nfont>$day</font></td>\n";
		}else{
			print"<td $ncolor align=left width=$osize2><font color=$nfont>$day</font></td>\n";
			print"<td $ncolor align=right width=$osize3><font color=$nfont>$rmenu02</font></td>\n";
		}
		print"</tr>\n";
		print"<tr>\n";
		print"<td $ncolor colspan=2 align=center width=$osize1>\n";
		print"	<table border=0 cellpadding=5 cellspacing=0 width=$osize1>\n";
		print"	<tr>\n";
		# 添付ファイルの有無
		($fileflag,$iwidth,$iheight,$tmp_ft) = &fileflag($rdate);
		# 初期化
		$wid = '';
		$cols = '';
		$imgflag = 1;
		if($fileflag ne 0){
			print"	<td $kcolor width=\"$i_width\" align=center>\n";
			if($iwidth ne 0 && $iheight ne 0){
				# 添付ファイルが画像の時 (GIF,JPG,PNG)
				# 画像が制限よりも大きいときには縮小してリンクを張る
				if($iwidth>$i_width){
					$iheight = int($iheight/($iwidth/$i_width));
					print"	<a href=\"$fileflag\" TARGET=_blank><img src=\"$fileflag\" height=\"$iheight\" width=\"$i_width\" border=\"0\"></a>\n";
				}else{
					print"	<img src=\"$fileflag\" height=\"$iheight\" width=\"$iwidth\" border=\"0\">\n";
				}
			}else{
				# 添付ファイルが画像以外の時
				print"	<a href=\"$fileflag\"><img src=\"$tmp_img\" border=\"0\"></a> <font color=$kfont2>$tmp_ft</font>\n";
			}
			print"	</td>\n";
			$cols = "colspan=2";
			$imgflag = 0;
			$wid =  "width=".($osize1 - $i_width);
		}
		if($imgflag && $imgloca){$wid =  "width=".($osize1 - $i_width);}else{$imgflag = 0;}
		if($nikkiloca){
			if($imgflag){print"	<td $kcolor valign=top width=$i_width>　</td>\n";$cols = "colspan=2";}
			print"	<td $kcolor valign=top $wid>\n";
		}else{
			if($imgflag){print"	<td $kcolor valign=top width=$i_width>　</td>\n";$cols = "colspan=2";}
			print"	<td $kcolor valign=top $wid align=right>\n";
		}
		print"	<div><font color=$kfont2>$rcom</font></div>\n";
		print"	</td></tr>\n";
		print"	</tr>\n";
		print"	<tr><td $cols $back16 align=right>$wcom$khen</td></tr>\n";
		$bkcolor = $kcolor;
		$flag = 1;
		$fflag = 0;
		$s++;
	}
	print"	</table>\n";
	print"</td>\n";
	print"</tr>\n";
	print"</table>\n";
}

# //// 日時の取得 /////////////////////////////////////////////////////////////////////////
sub gettime{
	# 日本時間に設定
	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday,$dmy,$dmy) = localtime(time);
	$year += 1900;
	$mon++;
	$hourn = $hour;  # バックアップ用
	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";  }
	$date = $year.$mon.$mday.$hour.$min.$sec;
}

# //// IEフラッグ /////////////////////////////////////////////////////////////////////////
sub ieflag{
	# IEだと1を返す
	local($ieflag);
	# ブラウザ名の取得
	$agent = $ENV{'HTTP_USER_AGENT'};
	$ieflag = 0;
	if($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i || $agent =~ /MSIE 6/i){$ieflag = 1;}
	return($ieflag);
}

# //// 拡張子判定フラッグ /////////////////////////////////////////////////////////////////
sub ftflag{
	# 許可しない拡張子だと1を返す
	local($foot) = @_;
	local($s,$ftflag);
	# 許可しない拡張子フラッグ
	$ftflag = 1;
	$s = 0;
	while($s<@iconft){
		if($foot eq @iconft[$s]){
			$ftflag = 0;
			last;
		}
		$s++;
	}
	return($ftflag);
}

# //// ファイルサイズチェックフラッグ /////////////////////////////////////////////////////
sub checksize{
	# ファイルサイズが制限を越えると1を返す
	local($readdata) = @_;
	local($size,$checksize);
	# フラッグの初期化
	$checksize = 0;
	# 単位はKB
	$size = $upsize*1024;
	if($readdata>$size){$checksize = 1;}
	return($checksize);
}

# //// 添付ファイルの削除 /////////////////////////////////////////////////////////////////
sub filedel{
	local($filehead) = @_;
	local($s,$d_file);
	$s = 0;
	while($s<@iconft){
		$d_file = $icon_dir.$filehead."\.".@iconft[$s];
		unlink($d_file);
		$s++;
	}
}

# //// 添付ファイルの存在チェック /////////////////////////////////////////////////////////
sub fileflag{
	local($filehead) = @_;
	local($s,$d_file,$fileflag,$iwidth,$iheight);
	# フラッグの初期化
	$fileflag = 0;
	$s = 0;
	$iwidth = 0;
	$iheight = 0;
	$tmp_ft = '';
	while($s<@iconft){
		$d_file = $icon_dir.$filehead."\.".@iconft[$s];
		if(-e $d_file){
			# 画像ファイルの大きさの取得
			open(STRM, "<$d_file");
			binmode(STRM);
			if(@iconft[$s] eq 'gif'){
				($iwidth,$iheight) = &gifsize(\*STRM);
			}elsif(@iconft[$s] eq 'jpg'){
				($iwidth,$iheight) = &jpegsize(\*STRM);
			}elsif(@iconft[$s] eq 'png'){
				($iwidth,$iheight) = &pngsize(\*STRM);
			}
			if($icon_url eq ''){
				$fileflag = $d_file;
			}else{
				$fileflag = $icon_url.$filehead."\.".@iconft[$s];
			}
			$tmp_ft = @iconft[$s];
			close(STRM);
			last;
		}
		$s++;
	}
	return($fileflag,$iwidth,$iheight,$tmp_ft);
}

# //// 簡単なヘルプ ///////////////////////////////////////////////////////////////////////
sub help{
	print"<table border=0 cellpadding=2 cellspacing=0 width=550>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 align=center width=550>\n";
	print"	<table border=0 cellpadding=5 cellspacing=0 width=550>\n";
	print"	<tr><td $back01><div>\n";
	print"	・『最近の絵日記』の\表\示\件数は、<font color=$color11>$maxkiji件</font>です。<br>\n";
	print"	・それ以降の記事は古いものから順に月ごとに『アルバム』に記入されていきます。<br>\n";
	print"	・『添付ファイル』は、<font color=$color11>@iconft</font>の拡張子のみ有効です。<br>\n";
	print"	・添付ファイルのファイル名に<font color=$color11> 『 . 』 </font>がない事を確認してください。<br>\n";
	print"	・『絵(GIF,JPG,PNG)』の大きさは、<font color=$color11>横 $i_width\ピクセル</font>を越えると縮小されます。<br>\n";
	print"	・更に、縮小された『絵』に対しては<font color=$color11>アップした元ファイル</font>にリンクが張られ原寸で閲覧する事が\可\能\です。<br>\n";
	print"	・なお、フォーム投稿時の最大サイズは、<font color=$color11>$upsize\KB</font>以内となっています。<br>\n";
	if($tagok){print"	・タグの使用が<font color=$color11>\可\能\です。</font><br>\n";}
	else{print"	・タグの使用は<font color=$color11>できません。</font><br>\n";}
	print"	</div></td></tr>\n";
	print"	</table>\n";
	print"</td>\n";
	print"</tr>\n";
	print"</table>\n";
}

# //// 過去ログディレクトリからログファイルリストを作成 ///////////////////////////////////
sub oldlist{
	local(@filelist,$ofile);
	# 過去UP物ディレクトリのオープン
	opendir(DIR,$oldbox);
	@filelist = ();
	while ($ofile = readdir(DIR)){
	 if(index($ofile,"\.")>0){
	  push(@filelist,$ofile);
	 }
	}
	closedir(DIR);
	# ファイル名をソートする
	@filelist = sort @filelist;
	@filelist = reverse(@filelist);
	return(@filelist);
}

# //// 過去ログへ移す ///////////////////////////////////////////////////////////////////////
sub movelog{
	# $mdate : (親)記事投稿日  $logfile : 移動する元ログ  $oldlog : 移動先ログ(過去ログ)
	# (注意) ここではエラーは返さないので致命的なバグもありうる
	local($mdate,$logfile,$oldlog) = @_;
	local(@lines1,$line1,@lines2,$flag);
	local($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05);
	# 記事のオープン
	open(IN,"$logfile");
	@lines1 = <IN>;
	close(IN);
	foreach $line1 (@lines1){
		($rdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line1);
		if($mdate eq $rdate){
			# 過去ログのオープン
			open(IN,"$oldbox$oldlog");
			@lines2 = <IN>;
			close(IN);
			unshift(@lines2,$line1);
			# ログの更新
			open(OUT,">$oldbox$oldlog");
			print OUT @lines2;
			close(OUT);
			# 属性の変更
			if($chauto){chmod(0666,"$oldbox$oldlog");}
		}
	}
}

# //// 過去ログのフォーム /////////////////////////////////////////////////////////////////
sub oldform{
	# $mtitle : メールのタイトル  $mbody  : メールの記事内容
	# $temail : 送信先E-mail      $femail : 送信元E-mail
	# 過去ログファイル一覧
	@oldlist = &oldlist;
	if(!@oldlist){&footer;}
	print"<table><tr><td>\n";
	&oldloghelp;
	print"</td></tr><tr><td>\n";
	# 過去ログフォーム
	print"<form method=post enctype=\"multipart/form-data\" action=\"$script\">\n";
	if($frameok){print"<input type=hidden name=loca value=\"f_right\">\n";}
	print"<input type=hidden name=mode value=\"$FORM{'mode'}\">\n";
	print"<table>\n";
	print"<tr><td>\n";
	print "<select name=old class=\"st1\">\n";
	$s = 0;
	$osec = '';
	if($FORM{'old'} eq ''){$osec = 'SELECTED'; $FORM{'old'} = substr(@oldlist[0],0,6);}
	while($s<@oldlist){
		$osec = '';
		$ovalue = substr(@oldlist[$s],0,6);
		if(index($ovalue,$FORM{'old'})>=0 && $FORM{'old'} ne ''){$osec = 'SELECTED';}
		$odate = substr($ovalue,0,4).'年'.substr($ovalue,4,2).'月';
		print"<option value=\"$ovalue\" $osec>$odate\n";
		$s++;
	}
	print "</select>\n";
	print"</td>\n";
	print"<td><input type=submit value=\"アルバムをみる\" class=\"st2\"></td></tr>\n";
	print"</table></form>\n";
	print"</td></tr></table>\n";
	# 過去ログフラッグ
	$oldflag = 1;
	# 読み込むlogfileの更新
	if($FORM{'old'} ne ''){$logfile = $oldbox.$FORM{'old'}."\.log";}else{$logfile = ""}
}

# //// SEARCH FORM //////////////////////////////////////////////////////////////////////////
sub searchform{
	# Form幅の調整
	&getform;
	# ヘルプを表示
	print"<table><tr><td>\n";
	&searchhelp;
	print"</td></tr><tr><td>\n";
	if($FORM{'sub'} eq ' リセット '){
		$FORM{'com'} = '';
		$FORM{'andor'} = '';
	}
	print"<form method=post enctype=\"multipart/form-data\" action=\"$script\">\n";
	if($frameok){print"<input type=hidden name=loca value=\"f_right\">\n";}
	print"<input type=hidden name=mode value=\"search\">\n";
	print"<table border=0 cellpadding=2 cellspacing=0>\n";
	# SEARCH内容
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>KEYWORD</font></td>\n";
	print"<td $back10><input type=text name=com size=\"$w_url\" value=\"$FORM{'com'}\" class=\"st1\"></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# AND OR
	$a = '';
	$b = '';
	if($FORM{'andor'} eq 'or'){$b = 'CHECKED';}
	else{$a = 'CHECKED';}
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>検索条件</font></td>\n";
	print"<td $back10>\n";
	print"<input type=radio value=\"and\" name=\"andor\" $a>AND\n";
	print"<input type=radio value=\"or\" name=\"andor\" $b>OR\n";
	print"</td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}

	print"<tr>\n";
	print"<td $back10 colspan=2><input type=submit name=sub value=\"　検索　\" class=\"st2\"> <input type=submit name=sub value=\" リセット \" class=\"st2\"></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	print"</table></form>\n";
	print"</td></tr></table>\n";
	# Searchフラッグ
	$oldflag = 1;
	$searchflag = 1;
	# 検索結果ログの吐き出し
	@scom = split(/ /, $FORM{'com'});
	@lines = &filefind(@scom);
}

# //// 簡単なヘルプ(SEARCH) ////////////////////////////////////////////////////////////////
sub searchhelp{
	print"<table border=0 cellpadding=2 cellspacing=0>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 align=center>\n";
	print"	<table border=0 cellpadding=5 cellspacing=0>\n";
	print"	<tr><td $back01><div>\n";
	print"	・KEYWORDには、<font color=$color11>スペース区切り</font>で入力します。<br>\n";
	print"	・大文字・小文字は<font color=$color11>判断しません</font>。<br>\n";
	print"	・絵日記の数が多くなると処理に時間がかかります。<br>\n";
	print"	</div></td></tr>\n";
	print"	</table>\n";
	print"</td>\n";
	print"</tr>\n";
	print"</table>\n";
}

# //// 簡単なヘルプ(過去ログ) //////////////////////////////////////////////////////////////
sub oldloghelp{
	print"<table border=0 cellpadding=2 cellspacing=0>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 align=center>\n";
	print"	<table border=0 cellpadding=5 cellspacing=0>\n";
	print"	<tr><td $back01><div>\n";
	print"	・<font color=$color11>月ごと</font>にアルバムを\表\示\します。<br>\n";
	print"	・下のセレクトボックスより月を選択し、<font color=$color11>アルバムをみる</font>を押してください。<br>\n";
	print"	・アルバムでの編集/削除はできません。<br>\n";
	print"	</div></td></tr>\n";
	print"	</table>\n";
	print"</td>\n";
	print"</tr>\n";
	print"</table>\n";
}

# //// 検索結果ログを吐き出す ///////////////////////////////////////////////////////////////
sub filefind{
	local(@kind) = @_;
	local(@lines,@log,@oldlist,@new,$line,$flag,$kind2);
	# ログを開いて全て一つにする（激重）
	# 投稿記事のログを開く
	open(IN,"$logfile") || &error("Can't open logfile");
	@lines = <IN>;
	close(IN);
	@log = ();
	# 過去ログファイル一覧
	@oldlist = &oldlist;
	$s=0;
	while($s<@oldlist){
		$oldlog = $oldbox.@oldlist[$s];
		# 投稿記事のログを開く
		open(IN,"$oldlog") || &error("Can't open logfile");
		@log = <IN>;
		close(IN);
		push(@lines,@log);
	  $s++;
	}
	@new = ();
	foreach $line (@lines){
		$flag = 0;
		$s = 0;
		while($s<@kind){
			if(@kind[$s] ne ''){
				# 拡張子を全て小文字に変換
				$line2 = $line; $line2 =~ tr/A-Z/a-z/;
				$kind2 = @kind[$s]; $kind2 =~ tr/A-Z/a-z/;
				if(index($line,@kind[$s])>=0 || index($line2,$kind2)>=0){
					$flag = 1;
					if($FORM{'andor'} eq 'or'){last;}
				}else{
					if($FORM{'andor'} eq 'and'){$flag = 0;last;}
				}
			}
			$s++;
		}
		if($flag){push(@new,$line);}
	}
	return(@new);
}

# //// GIF,JPG,PNG サイズ取得 /////////////////////////////////////////////////////////////
#      〜 WWWimagesizeより (http://www.bloodyeck.com/wwwis/) 〜

sub gifsize{
  local($GIF) = @_;
  local($type,$a,$b,$c,$d,$s)=(0,0,0,0,0,0);

  if(defined( $GIF )		&&
     read($GIF, $type, 6)	&&
     $type =~ /GIF8[7,9]a/	&&
     read($GIF, $s, 4) == 4	){
    ($a,$b,$c,$d)=unpack("C"x4,$s);
    return ($b<<8|$a,$d<<8|$c);
  }
  return (0,0);
}

sub jpegsize {
  local($JPEG) = @_;
  local($done)=0;
  local($c1,$c2,$ch,$s,$length, $dummy)=(0,0,0,0,0,0);
  local($a,$b,$c,$d);

  if(defined($JPEG)		&&
     read($JPEG, $c1, 1)	&&
     read($JPEG, $c2, 1)	&&
     ord($c1) == 0xFF		&&
     ord($c2) == 0xD8		){
    while (ord($ch) != 0xDA && !$done) {
      # Find next marker (JPEG markers begin with 0xFF)
      # This can hang the program!!
      while (ord($ch) != 0xFF) { return(0,0) unless read($JPEG, $ch, 1); }
      # JPEG markers can be padded with unlimited 0xFF's
      while (ord($ch) == 0xFF) { return(0,0) unless read($JPEG, $ch, 1); }
      # Now, $ch contains the value of the marker.
      if ((ord($ch) >= 0xC0) && (ord($ch) <= 0xC3)) {
	return(0,0) unless read ($JPEG, $dummy, 3);
	return(0,0) unless read($JPEG, $s, 4);
	($a,$b,$c,$d)=unpack("C"x4,$s);
	return ($c<<8|$d, $a<<8|$b );
      } else {
	# We **MUST** skip variables, since FF's within variable names are
	# NOT valid JPEG markers
	return(0,0) unless read ($JPEG, $s, 2);
	($c1, $c2) = unpack("C"x2,$s);
	$length = $c1<<8|$c2;
	last if (!defined($length) || $length < 2);
	read($JPEG, $dummy, $length-2);
      }
    }
  }
  return (0,0);
}

sub pngsize {
  local($PNG) = @_;
  local($head) = "";
  local($a, $b, $c, $d, $e, $f, $g, $h)=0;

  if(defined($PNG)				&&
     read( $PNG, $head, 8 ) == 8		&&
     $head eq "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" &&
     read($PNG, $head, 4) == 4			&&
     read($PNG, $head, 4) == 4			&&
     $head eq "IHDR"				&&
     read($PNG, $head, 8) == 8 			){
    ($a,$b,$c,$d,$e,$f,$g,$h)=unpack("C"x8,$head);
    return ($a<<24|$b<<16|$c<<8|$d, $e<<24|$f<<16|$g<<8|$h);
  }
  return (0,0);
}

# //// 管理人へ認証コードを発行する /////////////////////////////////////////////////////////
sub ninsyou{
	&header;
	# Form幅の調整
	&getform;
	print"<br>\n";
	print"<br>\n";
	print"<br>\n";
	print"<form method=post enctype=\"multipart/form-data\" action=\"$script\">\n";
	print"<input type=hidden name=mode value=\"writecode\">\n";
	print"<table border=0 cellpadding=2 cellspacing=0 align=center>\n";
	# 管理人パスワード
	print"<tr>\n";
	print"<td $back08 colspan=2 align=center><font color=$color09>管理人パスワード</font></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	# PASSWORD
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>PASSWORD</font></td>\n";
	print"<td $back10><input type=password name=key size=\"$w_key\" value=\"$c_key\" class=\"st1\"></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	print"<tr>\n";
	print"<td $back10 colspan=2><input type=submit value=\"　送信　\" class=\"st2\"></td>\n";
	print"</tr>\n";
	print"<tr>\n";
	print"<td $back08 colspan=2 height=2> </td>\n";
	print"</tr>\n";
	if(&ieflag){
		print"<tr>\n";
		print"<td $back10 colspan=2 height=3> </td>\n";
		print"</tr>\n";
	}
	print"</table>\n";
	&footer;
}

# //// 会員認証Codeを発行する /////////////////////////////////////////////////////////////
sub writecode{
	# 記入漏れのチェック
	$error_flag = 0;
	if($FORM{'key'} eq ''){$error_flag = 1;}
	if($error_flag){&header;&error("記入漏れがあります。");}
	if($FORM{'key'} ne $adpwd){&header;&error("あなたは管理者ではありません。");}
	# Cookieを発行する
	&set_cookie;
	# ブラウザのリフレッシュ
	&header;
	print"<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL=$script\">\n";
	&footer;
	exit;
}

# //// 右側フレーム ///////////////////////////////////////////////////////////////////////
sub f_right{
	# ログの書き込み処理
	if($FORM{'mode'} eq 'writelog'){&writelog;}
	&header;
	# クッキーを取得する
	&get_cookie;
	$nnikki = '';
	$vnikki = '';
	$nalbum = '';
	$snikki = '';
	# Non Frame
	if(!$frameok){
		if($c_key eq $adpwd){
			$nnikki = "<a href=\"$script?mode=tform\">△絵日記をつける</a> 　 ";
		}
			$vnikki = "<a href=\"$script\">△最近の絵日記をみる</a> 　 ";
		# 過去ログ機能時に過去ログのリンク先を表示
		$onum = &oldlist;
		if($onum){$nalbum = "<a href=\"$script?mode=oldlog\">△アルバムをみる</a> 　 ";}
		$snikki = "<a href=\"$script?mode=search\">△検索</a> 　 ";
	}
	# 戻り先の埋め込み
	print"<div align=right>	$nnikki$vnikki$nalbum$snikki<a href=\"$backurl\" TARGET=_parent>▲TOP</a></div><br>\n";
	# 投稿フォーム
	if($FORM{'mode'} eq 'tform' && $c_key eq $adpwd){
		if($FORM{'date'} ne ''){&kiji; print"<h4>編集/削除</h4>\n";}
		&tform;&footer;
	}
	# 過去ログ表示
	if($FORM{'mode'} eq 'oldlog'){&oldform;}
	# 投稿フォーム (SEARCH用)
	if($FORM{'mode'} eq 'search'){&searchform;}
	if($FORM{'mode'} eq ''){print"$head_title\n";}
	if($FORM{'mode'} eq 'rewrite'){
		if($ndkiji){&kiji;}
		print"<h4>編集/削除</h4>\n";
	}
	&kiji;
	&footer;
}

# //// 左側フレーム ///////////////////////////////////////////////////////////////////////
sub f_left{
	# 左フレーム用に色調を変える
	$kabegami = '';
	$back01 = $back19;
	$color02 = $color20;
	$color03 = $color20;
	$color04 = $color20;
	&header;
	# クッキーを取得する
	&get_cookie;
	print"<div align=left>\n";
	print"<h4>$title</h4>\n";
	if($c_key eq $adpwd){
		print"・ <a href=\"$script?loca=f_right&mode=tform\" TARGET=f_right>絵日記をつける</a><br>\n";
	}
	print"・ <a href=\"$script?loca=f_right\" TARGET=f_right>最近の絵日記をみる</a><br>\n";
	# 過去ログ機能時に過去ログのリンク先を表示
	$onum = &oldlist;
	if($onum){print"・ <a href=\"$script?loca=f_right&mode=oldlog\" TARGET=f_right>アルバムをみる</a><br>\n";}
	print"・ <a href=\"$script?loca=f_right&mode=search\" TARGET=f_right>検索</a><br>\n";
	print"</div>\n";
	&footer;
	exit;
}
