#!/usr/bin/perl

require "jcode.pl";

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

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

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

# [ 設置例 ]
#
#  public_html / index.html (ホームページなど)
#     |
#     +-- tboard [777]           /  tboard004.cgi   [755]
#          |                        converter.cgi   [755]
#          |                        jcode.pl        [644]
#          |                        tboard004.log   [666]
#          |                        index.html             ダミーのIndex
#          |
#          +--  icon [777]       /  index.html             ダミーのIndex
#          |                        mem10.gif             『牛飼いとアイコンの部屋』より
#          |
#          +-- oldlog [777]      /                         (過去ログ用のフォルダ)
#
# converter.cgiは、TBOARD 004 Version 0.** からのログのコンバート用です。
# 使用方法は、converter.cgiをご覧ください。
# 


# //// 基本設定 (ここから) ////////////////////////////////////////////////////////////////

# スクリプト名
$script = "tboard004.cgi";
# タイトル名
$title = "TETISH DOG";
# 戻り先 (例) ../index.html
$backurl = "../index.htm";
# Symlinkによるファイルのロック (Yes:1,No:0) 1を推奨
$lockon = 0;
$lockfile = "lock.lok";
# ログファイル
$logfile = "tetish.log";
# 最大記事件数 (親記事の件数)
$maxkiji = 10;
# 管理者パスワード
$adpwd = "8126";
# 添付ファイルの格納場所
$icon_dir = "icon/";
# 添付ファイル（許可する拡張子:全て半角小文字で登録）
@iconft = ('jpg','gif','png','lzh','zip');
# 添付ファイルのサイズ
$i_width = 140;  # 横
# 画像以外の添付ファイルに対してのアイコン
$tmp_img = "./icon/mem10.gif";
# フォーム投稿時の最大サイズ (単位：KB)
$upsize = 50;
# レス記事がついたらその記事をTOPに持っていく (Yes:1,No:0)
$topok = 1;
# 過去ログ機能 (Yes:1,No:0)
$oldlogok = 1;
# 過去ログディレクトリ
$oldbox = "oldlog/";
# Sendmail機能 (Yes:1,No:0)  掲示板に投稿があると$admailにメールを送信する
$semailok = 0;
# Sendmailのパス
$sendmail = '/usr/bin/sendmail';
# 管理者のE-mailアドレス
$admail = 'dog@tetish.com';
# HTMLTAGの許可 (Yes:1,No:0) 0を推奨
$tagok = 0;

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

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

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

# ----- 拡張設定 --------------------------------------------------------
# 投稿フォームをリンクにする (Yes:1,No:0)
$tformok = 1;
# 何日以内の記事を新着とするか？(新着表示をしない時は0とする。)
$newdate = 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 = "#fff3e0";
# テキストの色
$color02 = "#808080";
# 未リンクの色
$color03 = "#808080";
# 既リンクの色
$color04 = "#808080";
# ===== スタイルシート =====
# リンクを合わせた時の色 (hover)
$color05 = "#808080";
# フォームのボックス内のフォントの色 (st1)
$color06 = "#808080";
# フォームのボックス内の背景の色 (st1)
$color07 = "#fff0e0";
# ===== TABLEの色(投稿時) ==
# テーブルの色（コンテンツ記入部） … 未記入で背景色 …
$color08 = "orange";
# テーブル内のフォントの色（コンテンツ記入部）
$color09 = "#ffffff";
# テーブルの色（入力部） … 未記入で背景色 …
$color10 = "";
# 省略可の文字の色
$color11 = "orange";
# ===== TABLEの色(通常記事) ==
# テーブルの色（名前） … 未記入で背景色 …
$color12 = "orange";
# テーブル内のフォントの色（名前）
$color13 = "#ffffff";
# テーブルの色（タイトル） … 未記入で背景色 …
$color14 = "";
# テーブル内のフォントの色（タイトル）
$color15 = "#808080";
# テーブルの色（記事部分） … 未記入で背景色 …
$color16 = "#fff3e0";
# テーブル内のフォントの色（日付等）
$color17 = "#808080";
# テーブル内のフォントの色（記事）
$color18 = "#808080";
# ===== TABLEの色(新着記事) =
# テーブルの色（名前） … 未記入で背景色 …
$color19 = "red";
# テーブル内のフォントの色（名前）
$color20 = "#ffffff";
# テーブルの色（タイトル） … 未記入で背景色 …
$color21 = "";
# テーブル内のフォントの色（タイトル）
$color22 = "#808080";
# テーブルの色（記事部分） … 未記入で背景色 …
$color23 = "#ffdddd";
# テーブル内のフォントの色（日付等）
$color24 = "#808080";
# テーブル内のフォントの色（記事）
$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"){
	# 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 'writelog'){&writelog;}
&header;
# クッキーを取得する
&get_cookie;
# 新規投稿
if($tformok && $FORM{'mode'} ne 'newform'){$newkijif = "<a href=\"$script?mode=newform\">△新規投稿</a> 　 ";}else{$newkijif = "";}
# 過去ログ機能時に過去ログのリンク先を表示
$onum = &oldlist;
if($oldlogok && $onum && $FORM{'mode'} ne 'oldlog'){
$oldlogurl = "<a href=\"$script?mode=oldlog\">△過去ログ</a> 　 ";}else{$oldlogurl = "";}
# 検索のリンク先を表示
if($FORM{'mode'} ne 'search'){
$searchurl = "<a href=\"$script?mode=search\">△検索</a> 　 ";}else{$searchurl = "";}
# 戻り先の埋め込み (編集/削除時にはボードへ戻る戻り先も追加)
if($FORM{'mode'} ne ''){$boardurl = "<a href=\"$script\">△TBOARD</a> 　 ";}else{$boardurl = "";}
print"<div align=right>$newkijif$oldlogurl$searchurl$boardurl<a href=\"$backurl\">▲TOP</a></div><br>\n";
# 過去ログ表示
if($FORM{'mode'} eq 'oldlog'){&oldform;&kiji;&footer;}
# 投稿フォーム (SEARCH用)
if($FORM{'mode'} eq 'search'){&searchform;&kiji;&footer;}
# 上部埋め込み
if($FORM{'mode'} eq ''){print"$head_title";}
if(!$tformok || $FORM{'mode'} eq 'newform' || $FORM{'mode'} eq 'rewrite' || $FORM{'mode'} eq 'rekiji'){
	if($ndkiji && ($FORM{'mode'} eq 'rewrite' || $FORM{'mode'} eq 'rekiji')){&kiji;}
	if($FORM{'mode'} eq 'rekiji'){print"<h4>返信</h4>\n";}
	if($FORM{'mode'} eq 'rewrite'){print"<h4>編集/削除</h4>\n";}
	# 投稿フォーム
	&tform;
}
# 記事表示部
&kiji;
&footer;

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

# //// ヘッダー ///////////////////////////////////////////////////////////////////////////
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{
	# 初期化
	$r_tdate = "";
	$r_title = "";
	$r_com = "";
	# ===== 返信時 =====
	if($FORM{'mode'} eq 'rekiji'){
		open(IN,"$logfile") || &error("Can't open logfile");
		@lines = <IN>;
		close(IN);
		foreach $line (@lines){
			($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
			if($rdate eq $FORM{'date'}){
				$r_tdate = $FORM{'tdate'};
				$r_title = "Re:$rtitle";
				$rcom =~ s/<br>/\n＞/g;
				$r_com = "＞$rcom";
				last;
			}
		}
	}
	# ===== 記事編集時 =====
	if($FORM{'mode'} eq 'rewrite'){
		open(IN,"$logfile") || &error("Can't open logfile");
		@lines = <IN>;
		close(IN);
		foreach $line (@lines){
			($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
			if($rdate eq $FORM{'date'}){
				$date = $rdate;
				$r_tdate = $rtdate;
				$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";
	print"<input type=hidden name=mode value=\"writelog\">\n";
	print"<input type=hidden name=date value=\"$date\">\n";
	print"<input type=hidden name=tdate value=\"$r_tdate\">\n";
	print"<table border=0 cellpadding=2 cellspacing=0>\n";
	# おなまえ
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>おなまえ</font></td>\n";
	if($FORM{'mode'} eq '' || $FORM{'mode'} eq 'newform' || $FORM{'mode'} eq 'rekiji'){
		print"<td $back10><input type=text name=name size=\"$w_name\" value=\"$c_name\" class=\"st1\"></td>\n";
	}else{
		print"<td $back10><input type=hidden name=name value=\"$c_name\">$c_name</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";
	}
	# E-mail
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>E-mail</font></td>\n";
	print"<td $back10><input type=text name=email size=\"$w_mail\" value=\"$c_mail\" 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=text name=title size=\"$w_title\" value=\"$r_title\" 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 $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";
	}
	# URL
	print"<tr>\n";
	print"<td $back08 align=center width=80><font color=$color09>URL</font></td>\n";
	print"<td $back10><input type=text name=url size=\"$w_url\" value=\"$c_url\" 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=\"$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";
	}
	# 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";
	}
	# 送信
	if($FORM{'mode'} eq 'rewrite'){
		# 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"</form><br>\n";
	# ヘルプを表示
	&help;
	if($tformok || $FORM{'mode'} eq 'rewrite' || $FORM{'mode'} eq 'rekiji'){&footer;}
}

# //// ロックファイル : 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{
	# 記入漏れのチェック
	$error_flag = 0;
	if($FORM{'mode2'} ne 'del'){
		if($FORM{'name'} eq ''){$error_flag = 1;}
		if($FORM{'title'} eq ''){$error_flag = 1;}
		if($FORM{'com'} eq ''){$error_flag = 1;}
	}
	if($FORM{'key'} eq ''){$error_flag = 1;}
	if($error_flag){
		# 編集時にはエラーが生じても添付ファイルを削除しない
		if($FORM{'mode2'} ne 'hensyu'){&filedel($FORM{'date'});}
		&header;&error("記入漏れがあります。");
	}
	# ファイルのロック
	if($lockon){&lock($lockfile);}
	# 投稿記事のログを開く
	if($FORM{'mode2'} eq ''){
		if($FORM{'tdate'} eq ''){$FORM{'tdate'} = $FORM{'date'};}
		$flag = 1;
	}else{
		$flag = 0;
	}
	open(IN,"$logfile") || &error("Can't open logfile",$lockfile);
	@lines = <IN>;
	close(IN);
	# 初期化
	@new = ();
	@old = ();
	if($flag){
		# 新規投稿時
		$line = "$FORM{'date'}\t$FORM{'tdate'}\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";
		if($FORM{'date'} eq $FORM{'tdate'}){
			unshift(@lines,$line);
			# 記事をカウントしMAXを超えたら古い記事から削除 （親記事時）
			$onum = 0;
			foreach $line (@lines){
				($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
				if($rdate eq $rtdate){$onum++;}
				if(($onum-1) < $maxkiji){
					push(@new,$line);
				}else{
					if($oldlogok){
						$oldlog = substr($rtdate,0,6).'.log';
						push(@old,$line);
					}else{
						# 添付ファイルを削除
						&filedel($rdate);
					}
				}
			}
		}else{
			$flag = 0;
			foreach $line2 (@lines){
				($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line2);
				if($rtdate eq $FORM{'tdate'}){$flag = 1;}
				if($flag && $rtdate ne $FORM{'tdate'}){
					$flag = 0;
					push(@new,$line);
				}
				push(@new,$line2);
			}
			if($flag){push(@new,$line);}
			# TOPへ移動する記事
			if($topok){$topflag = $FORM{'tdate'};}
		}
	}else{
		if($FORM{'mode2'} eq 'hensyu'){
			# 記事編集時
			foreach $line (@lines){
				($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
				if($rdate eq $FORM{'date'}){
					if(&pwdcheck($rkey,$FORM{'key'})){&header;&error("パスワードが違います。",$lockfile);}
					$line = "$FORM{'date'}\t$FORM{'tdate'}\t$rname\t$FORM{'email'}\t$FORM{'title'}\t$FORM{'com'}\t$FORM{'url'}\t$rkey\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){
				($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$line);
				if($rdate eq $FORM{'date'}){
					if(&pwdcheck($rkey,$FORM{'key'})){&header;&error("パスワードが違います。",$lockfile);}
					# 添付ファイルの削除
					&filedel($rdate);
				}elsif($rtdate eq $FORM{'date'}){
					# 添付ファイルの削除
					&filedel($rdate);
				}else{push(@new,$line);}
			}
		}
	}
	# ログの更新
	open(OUT,">$logfile") || &error("Can't write logfile",$lockfile);
	print OUT @new;
	close(OUT);
	# ロック解除
	if(-e $lockfile){unlink($lockfile);}
	# 過去ログの作成
	if($oldlogok){&movelog;}
	# TOPへ記事を移動
	if($topflag ne ''){&movetop($topflag);}
	# ブラウザのリフレッシュ
	# 新規投稿時のみCookieを発行する
	if($FORM{'mode2'} eq ''){&set_cookie;}
	# Sendmail機能
	if($semailok && $FORM{'mode2'} eq ''){
		# タイトル
		$mtitle = "From $var";
		if($FORM{'email'} eq ''){$FORM{'email'} = 'xxx@no.mail';}
		$mdate = substr($FORM{'date'},0,4).'年'.substr($FORM{'date'},4,2).'月'.substr($FORM{'date'},6,2).'日'.substr($FORM{'date'},8,2).'時'.substr($FORM{'date'},10,2).'分';
		# コメント<br>の改行コードへの置換
		$FORM{'com'} =~ s/<br>/\n/g;
		$mbody = <<"FILE_END";
--------------------------------------------------
掲示板名：$title
投稿時間：$mdate
タイトル：$FORM{'title'}
投稿者名：$FORM{'name'}
コメント：
$FORM{'com'}
---------------- $var -----------
FILE_END
		&semail($mtitle,$mbody,$admail,$FORM{'email'});
	}
	&header;
	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="name\:$FORM{'name'}\,email\:$FORM{'email'}\,url\:$FORM{'url'}\,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_name = $COOKIE{'name'};
	$c_mail = $COOKIE{'email'};
	$c_url = $COOKIE{'url'};
	$c_key = $COOKIE{'key'};
}

# //// 記事表示部 /////////////////////////////////////////////////////////////////////////
sub kiji{
	if(!$searchflag){
		# 投稿記事のログを開く
		open(IN,"$logfile") || &error("Can't open logfile");
		@lines = <IN>;
		close(IN);
	}
	$s = 0;
	while($s<@lines){
		($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,@lines[$s]);
		if(($FORM{'mode'} eq 'rekiji' || $FORM{'mode'} eq 'rewrite') && $FORM{'tdate'} ne $rtdate){$s++;next;}
		if($newdate && &newflag($date,$rdate)){
			# 新着記事
			$ncolor = $back19;
			$nfont  = $color20;
			$tcolor = $back21;
			$tfont  = $color22;
			$kcolor = $back23;
			$kfont1 = $color24;
			$kfont2 = $color25;
		}else{
			# 通常記事
			$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;
		# おなまえとタイトル (メールアドレスがある際には、おなまえにリンクを張る)
		if($remail ne ''){$rname = "<a href=\"mailto:$remail\"><font color=$nfont>$rname</font></a>";}
		# 記事の内容
		# 投稿日
		$day = substr($rdate,0,4).'年'.substr($rdate,4,2).'月'.substr($rdate,6,2).'日'.substr($rdate,8,2).'時'.substr($rdate,10,2).'分';
		# ホームページがある際には、HPを埋め込む
		if($rurl ne ''){$home = " 　 <a href=\"$rurl\" TARGET=_blank><font color=$kfont1>HP</font></a>";}else{$home = "";}
		# ========================================
		if($rdate eq $rtdate){
			if(!$oldflag){
				# 記事編集用
				$khen = " 　 <a href=\"$script?mode=rewrite&date=$rdate&tdate=$rtdate\"><font color=$kfont1>編集/削除</font></a>";
				# 返信用
				$rekiji = " 　 <a href=\"$script?mode=rekiji&date=$rdate&tdate=$rtdate\"><font color=$kfont1>返信</font></a>";
			}else{$khen = ""; $rekiji="";}

			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";
			print"<td $ncolor align=center width=$osize2><font color=$nfont>$rname</font></td>\n";
			print"<td $tcolor width=$osize3><font color=$tfont>$rtitle</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 = '';
			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";
				$wid =  "width=".($osize1 - $i_width);
			}
			print"	<td $kcolor valign=top $wid>\n";
			print"	<div align=right><font color=$kfont1>(投稿日) $day</font>$home$rekiji$khen</div>\n";
			print"	<div><font color=$kfont2>$rcom</font></div>\n";
			print"	</td></tr>\n";
			$bkcolor = $kcolor;
			$flag = 1;
			$fflag = 0;
		}else{
			if(!$oldflag){
				# 記事編集用
				$khen = " 　 <a href=\"$script?mode=rewrite&date=$rdate&tdate=$rtdate\"><font color=$kfont1>編集/削除</font></a>";
				# 返信用
				$rekiji = " 　 <a href=\"$script?mode=rekiji&date=$rdate&tdate=$rtdate\"><font color=$kfont1>引用</font></a>";
			}else{$khen = ""; $rekiji="";}

			if(!$fflag){print"	<tr><td $bkcolor $cols align=right width=$osize1>\n"; $fflag = 1;}
			print"	<table border=0 cellpadding=2 cellspacing=0 width=$rsize0>\n";
			print"	<tr>\n";
			print"	<td $ncolor align=center width=$rsize2><font color=$nfont>$rname</font></td>\n";
			print"	<td $tcolor width=$rsize3><font color=$tfont>$rtitle</font></td>\n";
			print"	</tr>\n";
			print"	<tr>\n";
			print"	<td $ncolor colspan=2 align=center width=$rsize1>\n";
			print"		<table border=0 cellpadding=5 cellspacing=0 width=$rsize1>\n";
			print"		<tr>\n";
			# 添付ファイルの有無
			($fileflag,$iwidth,$iheight,$tmp_ft) = &fileflag($rdate);
			# 初期化
			$wid = '';
			$cols = '';
			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";
				$wid =  "width=".($rsize1 - $i_width);
			}
			print"		<td $kcolor valign=top $wid>\n";
			print"		<div align=right><font color=$kfont1>(投稿日) $day</font>$home$rekiji$khen</div>\n";
			print"		<div><font color=$kfont2>$rcom</font></div>\n";
			print"		</td></tr>\n";
			print"		</table>\n";
			print"	</td>\n";
			print"	</tr>\n";
			print"	</table><br>\n";
			$flag = 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;
}

# //// パスワードチェック /////////////////////////////////////////////////////////////////
sub pwdcheck{
	# パスワードが違うと1を返す
	# $pwd：ログ保存PWD  $key：入力PWD  $adpwd：管理者PWD
	local($pwd,$key) = @_;
	local($aflag);
	$aflag = 1;
	if($pwd eq $key || $key eq $adpwd){$aflag = 0;}
	return($aflag);
}

# //// IEフラッグ /////////////////////////////////////////////////////////////////////////
sub ieflag{
	# IEだと1を返す
	local($ieflag);
	# ブラウザ名の取得
	$agent = $ENV{'HTTP_USER_AGENT'};
	$ieflag = 0;
	if($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/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";
	if($oldlogok){print"	・それ以降の記事は古いものから順に月ごとに過去ログに記入されていきます。<br>\n";}
	print"	・添付ファイルは、<font color=$color11>@iconft</font>の拡張子のみ有効です。<br>\n";
	print"	・添付ファイルのファイル名に<font color=$color11> 『 . 』 </font>がない事を確認してください。<br>\n";
	print"	・画像ファイルの大きさは、<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($topok){
		print"	・レスがつくとその対象の親記事が<font color=$color11>TOPへ移動</font>します。<br>\n";
	}
	print"	・親記事を削除すると関連するレス記事も削除されます。<br>\n";
	if($newdate){print"	・<font color=$color11>$newdate日以内の記事</font>は、テーブルの色がこの色（<font color=$color19>■</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";
}

# //// レスがつくとその親記事をTOPへ移動する //////////////////////////////////////////////
sub movetop{
	local($topdate) = @_;
	local($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05,@rlines,@rnew,$pflag,$rline);
	# ファイルのロック
	if($lockon){&lock($lockfile);}
	open(IN,"$logfile") || &error("Can't open logfile",$lockfile);
	@rlines = <IN>;
	close(IN);
	# 記事削除時
	@topkiji = ();
	foreach $rline (@rlines){
		($rdate,$rtdate,$rname,$remail,$rtitle,$rcom,$rurl,$rkey,$rmenu01,$rmenu02,$rmenu03,$rmenu04,$rmenu05) = split(/\t/,$rline);
		if($rtdate eq $topdate){push(@topkiji,$rline);}else{push(@rnew,$rline);}
	}
	unshift(@rnew,@topkiji);
	# ログの更新
	open(OUT,">$logfile") || &error("Can't write logfile",$lockfile);
	print OUT @rnew;
	close(OUT);
	# ロック解除
	if(-e $lockfile){unlink($lockfile);}
}

# //// 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 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 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";
	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の更新
	$logfile = $oldbox.$FORM{'old'}.'.log';
}

# //// 過去ログへ移す ///////////////////////////////////////////////////////////////////////
sub movelog{
	# ファイルのロック
	if($lockon){&lock($lockfile);}
	open(IN,"$oldbox$oldlog");
	@lines = <IN>;
	close(IN);
	unshift(@lines,@old);
	# ログの更新
	open(OUT,">$oldbox$oldlog");
	print OUT @lines;
	close(OUT);
	# ロック解除
	if(-e $lockfile){unlink($lockfile);}
	# 属性の変更
	if($chauto){chmod(0666,"$oldbox$oldlog");}
}

# //// 簡単なヘルプ(過去ログ) //////////////////////////////////////////////////////////////
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";
	if($topok){
		print"	・レスが付くとトップへ移動を使用する際には、<font color=$color11>日付順にならない場合があります</font>が、このBBSの仕様ですので\予\めご了承ください。<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";
}

# //// 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";
	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 filefind{
	local(@kind) = @_;
	local(@lines,@reslines,@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.substr(@oldlist[$s],0,6).'.log';
		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);
}

# //// メールの送信 ///////////////////////////////////////////////////////////////////////
sub semail{
	# $mtitle : メールのタイトル  $mbody  : メールの記事内容
	# $temail : 送信先E-mail      $femail : 送信元E-mail
	local($mtitle,$mbody,$temail,$femail) = @_;
	&jcode'convert(*mtitle,'jis');
	&jcode'convert(*mbody,'jis');
	if (!open(MAIL,"| $sendmail -t")) { &error("メール送信に失敗しました。");}
	print MAIL "To:$temail\n";
	print MAIL "From:$femail\n";
	print MAIL "Subject: $mtitle\n";
	print MAIL "MIME-Version: 1.0\n";
	print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
	print MAIL "Content-Transfer-Encoding: 7bit\n";
	print MAIL "$mbody\n";
	close(MAIL);
}

# //// 経過時間の計算  Format : 20010401000000 ////////////////////////////////////////////
sub pasttime{
	local($time) = @_;
	local(@mdate,$styear,$year,$mon,$day,$hour,$min,$sec,$s,$uday,$mcount,$yy,$pydate,$pastsec);
	# グレゴリオ暦の定義
	#  閏年は、4で割り切れるが100では割り切れない、または400で割り切れる。
	# == 日数データ =========
	@mdate = (0,31,59,90,120,151,181,212,243,273,304,334);
	# $styear年より何秒経過したかを算出する
	$styear = 2001;
	$year = substr($time,0,4);
	$mon = substr($time,4,2);
	$day = substr($time,6,2);
	$hour = substr($time,8,2);
	$min = substr($time,10,2);
	$sec = substr($time,12,2);
	# $styearから今まで(2月を経過)に何日閏年があったかを算出する
	$s = 0;
	# 閏年のカウント
	$uday = 0;
	# 2月経過？
	if($mon>2){$mcount=1;}else{$mcount=0;}
	while($s<($year-$styear+$mcount)){
		$yy = $styear+$s;
		if ((!($yy%4) && ($yy%100)) || !($yy%400)){$uday++;}
		$s++;
	}
	# $styear年からの先月までの合計日数
	$pydate = ($year-$styear)*365+(@mdate[$mon-1])+$uday;
	# $styear年から現在までの経過秒数
	$pastsec = ($pydate+$day)*24*60*60 + $hour*60*60 + $min*60 + $sec;
	return($pastsec);
}

# //// 新着フラッグ ///////////////////////////////////////////////////////////////////////
sub newflag{
	local($ntime,$ptime) = @_;
	local($newflag);
	if((&pasttime($ntime)-&pasttime($ptime)) < ($newdate*24*60*60)){$newflag = 1;}else{$newflag = 0;}
	return($newflag);
}
