#!/usr/local/bin/perl

#--------------------------------------------------------------------------------------------------
# 掲示板 ver1.12.00
#
# ※再配布不可／改造可です。
#
# date: 2000/08
# by  : megumi.s
# mail: webmaster@ace-cgi.jp
# url : http://www.ace-cgi.jp/
#--------------------------------------------------------------------------------------------------

require './jcode.pl';
require './frmana.pl';

########## 固定項目 ##########
$cgi_file		= "./bbs200.cgi";		#このファイル
$data_file		= "./bbs200.dat";		#データファイル
$env_file		= './bbs200.env';		#環境設定ファイル
$top_file		= "./top.html";			#上部ファイル
$form_file		= "./bbsform.html";		#フォームファイル
$ptbl_file		= "./ptbl.html";		#親記事表示ファイル
$ctbl_file		= "./ctbl.html";		#親記事表示ファイル
$cnt_file		= "./count.dat";		#カウンタファイル
$pastno_file	= "./pastno.dat";		#過去ログ番号ファイル
$lock_file		= "./lock/bbs200.lok";	#ロックファイル名

$log_line		= '100';				#過去ログ１ファイル行数
$cook_name		= 'BBS200';				#クッキー名
$counter_path	= "cnt";				#カウンタ画像のディレクトリ

########## 処理はここから ##########

&env_read;	#環境設定読み込み
$form_cnt = &form_get($tagkey);	#フォーム解析

if($FORM{'mode'} eq "howto")		{&howto_disp;}
if($FORM{'mode'} eq "find")			{&search_proc;}
if($FORM{'mode'} eq "past")			{&past_disp;}
if($FORM{'mode'} eq "msg_del")		{&del_disp;}
if($FORM{'mode'} eq "del")			{&del_proc;}
if($FORM{'mode'} eq "master")		{&master_in;}
if($FORM{'mode'} eq "env")			{&env_set;}
if($FORM{'mode'} eq "env_w")		{&env_write;}
if($FORM{'mode'} eq "master_res")	{&mas_res_proc;}
if($FORM{'mode'} eq "image")		{&icon_disp;}
if($FORM{'mode'} eq "msg"){
	&input_chk;
	&cookie_set;
	&data_save;
}
if($FORM{'mode'} eq "res_msg"){
	&cookie_get;
	&head_disp;
	&form_disp($FORM{'resno'});
	&res_disp;
	&foot_disp;
	exit;
}
if($FORM{'mode'} eq "all_res"){
	if($FORM{'pass_wd'} ne $pass){
		&error('パスワードが違います','');
	}
}
&cookie_get;
&top_disp;
&form_disp("");
&data_disp;
&foot_disp;
exit;

#----------------#
# 投稿データ取得 #
#----------------#
sub form_get
{
	local($flg) = $_[0];	#タグ
	local($cnt) = 0;
	local($pair,$buff,$i);
	if($ENV{'REQUEST_METHOD'} eq "POST"){
		if($ENV{'CONTENT_LENGTH'} > 51200){&error('サイズオーバー','');}
		read(STDIN, $buff, $ENV{'CONTENT_LENGTH'});
	}
	else{$buff = $ENV{'QUERY_STRING'};}

	local(@pairs) = split(/&/,$buff);
	foreach $pair(@pairs){
		local($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');
		&jcode'h2z_sjis(*value);
		if($flg == 0){
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/\"/&quot;/g;
		}
		else{
			$value =~ s/<!--(.|\n)*-->//g;
			$value =~ s/<##>/&lt;##&gt;/g;
			$value =~ s/<#>/&lt;#&gt;/g;
			$value =~ s/<>/&lt;&gt;/g;
		}
		for($i=0; $i<@TAG; $i++){
			if($TAG[$i] eq $name || index($name,"mrescom_") >= 0){
				$value =~ s/\r\n/<BR>/g;
				$value =~ s/\r/<BR>/g;
				$value =~ s/\n/<BR>/g;
				last;
			}
		}
		if($i >= @TAG){
			$value =~ s/</&lt;/g;
			$value =~ s/>/&gt;/g;
			$value =~ s/\"/&quot;/g;
			$value =~ s/\r//g;
			$value =~ s/\n//g;
		}
		if($name eq 'del'){
			push(@delete,$value);
		}
		if(index($name,"mrescom_") >= 0){
			$nn = $name;
			$nn =~ s/mrescom_//g;
			push(@answer,$nn);
		}
		$FORM{$name} = $value;
		if($name ne "mode" && $name ne "resno" && $name ne "pass" && index($name,"mrescom_") < 0){
			$cif = 0;
			for($cin=0; $cin<$cnt+1; $cin++){
				if($FORM[$cin] eq $name){
					$FORM[$cin] = $name; $cif = 1; last;
				}
			}
			if($cif == 0){ $FORM[$cnt++] = $name; }
		}
	}

	@answer = reverse(@answer);

	return $cnt;
}
#--------------------#
# ヘッダ部分書き出し #
#--------------------#
sub head_disp
{
	if(!open(IN,"$top_file")){ &error('トップファイルがオープン出来ません',''); }
	local(@head) = <IN>;
	close(IN);
	print "Content-type: text/html\n\n";
	print "<html>\n";
	for($i=0;$i<@head;$i++){
		print "$head[$i]";
		if(index($head[$i],"<body") >= 0 || index($head[$i],"<BODY") >= 0){
			last;
		}
	}
}
#-------------------------------------------------#
# フッタ部分書き出し ※ここは書き換えないで下さい #
#-------------------------------------------------#
sub foot_disp
{
	print "<div align=center>\n";
	print "<small>自由レイアウト掲示板<font face=verdana> v1.12.00</font> <a href=\"http://www.ace-cgi.jp/\">エース</a></small>\n";
	print "</div>\n";
	print "</body></html>\n";
}
#--------------------#
# トップ部分書き出し #
#--------------------#
sub top_disp
{
	if(!open(IN,"$top_file")){&error('トップファイルがオープン出来ません','');}
	local(@head) = <IN>;
	close(IN);
	$cntm = '<!--counter-->';
	print "Content-type: text/html\n\n";
	print "<html>\n";
	for($i=0;$i<@head;$i++){
		if(index($head[$i],$cntm) >= 0){
			&counter_disp; next;
		}
		print "$head[$i]";
	}
}
#--------#
# 投稿欄 #
#--------#
sub form_disp
{
	if(!open(IN,"$form_file")){ &error('フォームファイルがオープン出来ません','HEADER'); }
	@data = <IN>;
	close(IN);

	for($fi=0;$fi<@data;$fi++){
		$val = &form_cookie($data[$fi]);
		print "$val";
		if(index($data[$fi],"action") >= 0 || index($data[$fi],"ACTION") >= 0){
			print "<input type=hidden name=resno value=\"$_[0]\">\n";
		}
	}
}
#--------------------------------------------#
# フォームの文字列にクッキーの値を割り当てる #
#--------------------------------------------#
sub form_cookie
{
	local($str) = $_[0];
	@ana = &frmana'str_ana($str);

	for($i=0; $i<@ana; $i++){
		local($typ,$nam,$val) = split(/<#>/,$ana[$i]);
		if($nam){ $b_name = $nam; }
		if($nam){
			if($COOKIE{$nam}){
				if($typ eq "radio" || $typ eq "check"){
					if($COOKIE{$nam} eq $val){ $str = &frmana'str_val_add(2,$str,$val,"checked"); }
				}
				else{ $str = &frmana'str_val_add(1,$str,$nam,$COOKIE{$nam}); }
			}
		}
		elsif($val){
			if($COOKIE{$b_name} eq $val){
				if($typ eq "option"){ $str = &frmana'str_val_add(2,$str,$val,"selected"); }
			}
		}
	}
	return $str;
}
#--------------#
# 投稿チェック #
#--------------#
sub input_chk
{
	for($i=0; $i<@CHK; $i++){
		if($FORM{$CHK[$i]} eq ""){
			&error("$CHK_COM[$i]を入力して下さい","");
		}
	}
#	if( $FORM{'mail'} && $FORM{'mail'} !~ /(.*)\@(.*)\.(.*)/ ){
#		&error("メールを正しく入力して下さい","");
#	}
}
#------------------#
# 投稿データを記録 #
#------------------#
sub data_save
{
	$date = &time_get;
	&file_lock('ON');

	if(!open(IN,"$data_file")){ &error('データファイルがオープン出来ません','ON'); }
	@lines = <IN>;
	close(IN);

	#---- 記事番号 ----#
	$pno = $lines[0];
	$pno =~ s/\n//;
	if($FORM{'resno'} ne ""){ $number = $FORM{'resno'}; }
	else{ $pno++; $number = $pno; }
	shift(@lines);

	$val = "";
	for($i=0; $i<$form_cnt; $i++){
		$val .= "$FORM[$i]<>$FORM{$FORM[$i]}<#>";
	}

	local($no,$rno,$date2,$host,$pasw,$buf) = split(/<##>/,$lines[0]);
	if($buf eq $val){
		&error("二重投稿です","ON");
	}

	$passw = "";
	if($FORM{'pass'} ne ""){ $passw = crypt($FORM{'pass'},"pw"); }	#暗号化
	$host = $ENV{'REMOTE_ADDR'};

	$val = "$number<##>$FORM{'resno'}<##>$date<##>$host<##>$passw<##>$val<##>\n";

	@NEW = ();
	@past_data = ();
	if($FORM{'resno'} eq ""){	#親記事投稿
		@past_parent = ();
		@past_child = ();
		for($i=0,$c=1; $i<@lines; $i++){
			local($n1,$n2) = split(/<##>/,$lines[$i]);
			if($n2 eq ""){$c++;}
			if($c > $max){
				if($pastkey == 0){last;}
				else{
					if($n2 eq "")	{push(@past_parent,$lines[$i]);}
					else			{push(@past_child,$lines[$i]);}
				}
			}
			else{
				push(@NEW, $lines[$i]);
			}
		}
		#---- 過去ログ ----#
		if(@past_parent != 0){
			@past_child = reverse(@past_child);
			push(@past_parent, @past_child);
			push(@past_data, @past_parent);
			&pastLog_proc;
		}
		unshift(@NEW, $val);
	}
	else{					#レス記事投稿
		if($res_sort){		#トップへ移動
			@RES = ();
			for($i=0; $i<@lines; $i++){
				local($n1,$n2) = split(/<##>/,$lines[$i]);
				if($n2 eq "" && $FORM{'resno'} eq $n1){ $parent = $lines[$i]; }
				elsif($n2 eq "$FORM{'resno'}"){ push(@RES,$lines[$i]); }
				else{ push(@NEW,$lines[$i]); }
			}
			unshift(@NEW, @RES);		#レスを上に追加
			unshift(@NEW, $val);		#新規レスを上に追加
			unshift(@NEW, $parent);		#親記事を上に追加
		}
		else{
			for($i=0; $i<@lines; $i++){
				local($n1,$n2) = split(/<##>/,$lines[$i]);
				if($FORM{'resno'} eq $n1 && $n2 eq ""){
					push(@NEW, $lines[$i]);
					push(@NEW, $val);
				}
				else{
					push(@NEW, $lines[$i]);
				}
			}
		}
	}

	unshift(@NEW, "$pno\n"); #親記事番号

	if(!open(OUT,">$data_file")){ &error('データファイルがオープン出来ません','ON'); }
	print OUT @NEW;
	close(OUT);

	&file_lock('OFF');
}
#----------#
# 投稿記事 #
#----------#
sub data_disp
{
	if(!open(IN,"$data_file")){ &error('データファイルがオープン出来ません','HEADER'); }
	local(@lines)=<IN>;
	close(IN);
	shift(@lines);

	@parent = ();
	for($i=0; $i<@lines; $i++){
		local($num,$num2) = split(/<##>/,$lines[$i]);
		if($num2 eq ""){push(@parent,$lines[$i]);}
		elsif($num2 ne ""){push(@child,$lines[$i]);}
	}
	@child = reverse(@child);

	if($FORM{'page'} eq '')	{$start_cnt = 0;}
	else					{$start_cnt = $FORM{'page'};}
	if( $start_cnt < 0 )	{$start_cnt = 0;}
	$max_cnt = @parent;
	$end_cnt = $start_cnt + $pagemax;
	if($end_cnt >= $max_cnt){$end_cnt = $max_cnt;}
	$next = $max_cnt - $end_cnt;
	if($next > $pagemax){$next = $pagemax;}

	#--- データ表示 ----#
	&cont_disp($start_cnt,$end_cnt-$start_cnt);

	#---- 改ページ ----#
	print "<div align=center><table cellpadding=0 cellspacing=2 border=0><tr>\n";
	$next_cnt = $end_cnt;
	$prev_cnt = $start_cnt-$pagemax;

	if( $prev_cnt >= 0 ){		#前ページボタン
		print "<td><form action=\"$cgi_file\" method=post>\n";
		print "<input type=hidden name=page value=\"$prev_cnt\">\n";
		if($FORM{'mode'} eq "all_res"){
			print "<input type=hidden name=mode value=\"all_res\">\n";
			print "<input type=hidden name=pass_wd value=\"$pass\">\n";
		}
		print "<input type=submit value=\"前の$pagemax件\" class=\"button\">\n";
		print "</form></td>\n";
	}

	if ($end_cnt ne $max_cnt) {	#次ページボタン
		print "<td><form action=\"$cgi_file\" method=post>\n";
		print "<input type=hidden name=page value=\"$next_cnt\">\n";
		if($FORM{'mode'} eq "all_res"){
			print "<input type=hidden name=mode value=\"all_res\">\n";
			print "<input type=hidden name=pass_wd value=\"$pass\">\n";
		}
		print "<input type=submit value=\"次の$next件\" class=\"button\">\n";
		print "</form></td>\n";
	}
	print "</tr></table></div><p>\n";
}
#----------#
# レス記事 #
#----------#
sub res_disp
{
	if(!open(IN,"$data_file")){&error('データファイルがオープン出来ません','');}
	@lines = <IN>;
	close(IN);
	shift(@lines);

	@parent = ();
	@child = ();
	for($i=0; $i<@lines; $i++){
		local($num,$num2) = split(/<##>/,$lines[$i]);
		if($FORM{'resno'} eq $num && $num2 eq ""){ push(@parent,$lines[$i]); }
		elsif($FORM{'resno'} eq $num2){ push(@child,$lines[$i]); }
	}
	@child = reverse(@child);

	#--- データ表示 ----#
	print "<div align=center><B>以下の記事に対するレスになります</B></div><p>\n";
	$pcnt = @parent;
	&cont_disp(0,$pcnt);
}
#----------#
# 内容表示 #
#----------#
sub cont_disp
{
	local($start_cnt) = $_[0];
	local($end_cnt) = $_[1];
	local($name,$cont);

	if(!open(IN,"$ptbl_file")){ &error('テーブルファイルがオープン出来ません','HEADER'); }
	local(@ptbl)=<IN>;
	close(IN);
	if(!open(IN,"$ctbl_file")){ &error('テーブルファイルがオープン出来ません','HEADER'); }
	local(@ctbl)=<IN>;
	close(IN);

	if($FORM{'mode'} eq "all_res"){
		print "<div align=center>\n";
		print "<a href=\"$cgi_file\">[掲示板へ戻る]</a>\n";
		print "<form action=\"$cgi_file\" method=post>\n";
		print "<input type=submit value=\"管理者用一括返信\" class=\"button\">\n";
		print "</div><p>\n";
	}

	for($ci=$start_cnt; $ci<$start_cnt+$end_cnt; $ci++){
		local($num1,$dummy,$date,$host,$pasw,$buffer) = split(/<##>/,$parent[$ci]);

		$f = 0;
		@resc = ();
		for($cj=0; $cj<@ptbl; $cj++){
			if(index($ptbl[$cj],"<!--RES-START-->") >= 0){$f = 1; next;}
			#---- レス記事処理 ----#
			if($f == 1){
				if(index($ptbl[$cj],"<!--RES-END-->") >= 0){
					$f2 = 0;
					for($ck=0; $ck<@child; $ck++){
						local($dummy,$num2,$date,$host,$pasw,$buffer) = split(/<##>/,$child[$ck]);
						if($num1 ne $num2){next;}
						if($f2 == 0){
							for($cc=0;$cc<@resc;$cc++){
								if(index($resc[$cc],"<!--RES-->") >= 0){
									$cc++;last;
								}
								print "$resc[$cc]";
							}
							$f2=1;
						}

						local(@data) = split(/<#>/,$buffer);
						for($cl=0; $cl<@ctbl; $cl++){
							$val = $ctbl[$cl];
							$wbuf = "";
							for(;;){

								$p = index($val,"<!--");
								if($p < 0){ last; }
								$p+=4;
								$q = index($val,"-->",$p);
								if($q < 0){ last; }
								$buf = substr($val,$p,$q-$p);
								if($buf eq $wbuf){ last; }
								$wbuf = $buf;
								for($cm=0; $cm<@data; $cm++){
									($name,$cont) = split(/<>/,$data[$cm]);
									if($name eq $buf){
										if(index($cont,"http\://") >= 0 && length($cont) <= 7){ $cont=""; }
										last;
									}
								}
								if($cm < $#data+1){
									for($cm=0; $cm<@AUTO_LINK; $cm++){
										if($name eq $AUTO_LINK[$cm]){
											if($res_br == 0){ $cont =~ s/<BR>//g; }
											&auto_link($cont);
											last;
										}
									}
									$val = &text_chg($val,$name,$cont,$num1,$date,$pasw);
								}
								else{
									$val = &text_chg($val,"","",$num1,$date,$pasw);
									$val = &text_chg($val,$buf,"",$num1,$date,$pasw);
#									$val =~ s/<!--$buf-->//g;
								}
							}
							print "$val";
						}
					}
					if($f2 == 1){
						for(;$cc<@resc;$cc++){
							print "$resc[$cc]";
						}
					}
					$f = 0;
					next;
				}
				push(@resc,$ptbl[$cj]);
			}
			#---- 親記事処理 ----#
			else{
				local(@data) = split(/<#>/,$buffer);
				$val = $ptbl[$cj];
				$wbuf = "";
				for(;;){
					$p = index($val,"<!--");
					if($p < 0){ last; }
					$p+=4;
					$q = index($val,"-->",$p);
					if($q < 0){ last; }
					$buf = substr($val,$p,$q-$p);
					if($buf eq $wbuf){ last; }
					$wbuf = $buf;
					for($cl=0; $cl<@data; $cl++){
						($name,$cont) = split(/<>/,$data[$cl]);
						if($name eq $buf){
							if(index($cont,"http\://") >= 0 && length($cont) <= 7){ $cont=""; }
							last;
						}
					}
					if($cl < $#data+1){
						for($cl=0; $cl<@AUTO_LINK; $cl++){
							if($name eq $AUTO_LINK[$cl]){ &auto_link($cont); last; }
						}
						$val = &text_chg($val,$name,$cont,$num1,$date,$pasw);
					}
					else{
						$val = &text_chg($val,"","",$num1,$date,$pasw);
						$val = &text_chg($val,$buf,"",$num1,$date,$pasw);
#						$val =~ s/<!--$buf-->//g;
					}
				}

				$val = &form_cookie($val);
				if(index($ptbl[$cj],"form") >= 0 || index($ptbl[$cj],"FORM") >= 0
				|| index($ptbl[$cj],"action") >= 0 || index($ptbl[$cj],"ACTION") >= 0
				|| index($ptbl[$cj],"hidden") >= 0 || index($ptbl[$cj],"HIDDEN") >= 0){
					if($FORM{'mode'} eq "all_res"){
						$val = "";
					}
				}
				print "$val";
				if(index($ptbl[$cj],"action") >= 0 || index($ptbl[$cj],"ACTION") >= 0){
					if($FORM{'mode'} ne "all_res"){
						print "<input type=hidden name=resno value=\"$num1\">\n";
					}
				}
			}
		}
		if($FORM{'mode'} eq "all_res"){
			print "<div align=center>\n";
			print "<B>上記記事に対する管理者レスです。</B><BR>\n";
			print "<textarea name=\"mrescom_$num1\" rows=5 cols=50 wrap=soft></textarea>\n";
			print "</div><BR><BR>\n";
		}
	}

	if($FORM{'mode'} eq "all_res"){
		print "<input type=hidden name=mode value=master_res>\n";
		print "<input type=hidden name=pass_wd value=$FORM{'pass_wd'}>\n";
		local(@mr)=split(/&/,$mres);
		for($mc=0; $mc<@mr; $mc++){
			local($mnam,$mval)=split(/=/,$mr[$mc]);
			print "<input type=hidden name=$mnam value=$mval>\n";
		}
		print "</form>\n";
	}
}
#--------------------------#
# 定数にデータを割り当てる #
#--------------------------#
sub text_chg
{
	local($str) = $_[0];
	local($nam) = $_[1];
	local($val) = $_[2];
	local($num) = $_[3];
	local($dat) = $_[4];
	local($pas) = $_[5];
	$str =~ s/<!--$nam-->/$val/g;
	$str = &frmana'str_lnk_del($str);
	$str =~ s/<!--no-->/$num/g;
	if(index($dat,"-") >= 0){ $dat = substr($dat,0,index($dat,"-")); }
	$str =~ s/<!--date-->/$dat/g;
	$str =~ s/<!--pass-->/$pas/g;

	return $str;
}
#--------------#
# カウンタ表示 #
#--------------#
sub counter_disp
{
	if(!open(CNT,"$cnt_file")){&error('カウンタファイルが読み込めません','HEADER');}
	$cnt=<CNT>;
	close(CNT);

	if($FORM{'mode'} eq ""){
		$cnt++;
		if(!open(OUT,">$cnt_file")){&error('カウンタファイルが読み込めません','HEADER');}
		print OUT $cnt;
		close(OUT);
	}

	while(length($cnt) < $cnt_place){	#桁数
		$cnt = '0'."$cnt";
	}
	@cnt2 = split(//,$cnt);

	if($counter == 1 || $counter == 2){
		print "<table cellpadding=0 cellspacing=0 border=0><tr><td>\n";
		if($counter == 2){	#画像
			foreach(0 .. $#cnt2){
				print "<img src=\"$counter_path/$cnt2[$_]\.gif\" alt=\"$cnt2[$_]\">";
			}
		}
		else{				#文字
			print "$cnt";
		}
		print "</td></tr></table>\n";
	}
}
#------------------------#
# 掲示板の使い方画面表示 #
#------------------------#
sub howto_disp
{
	&head_disp;
	print "[<a href=\"$cgi_file\">掲示板に戻る</a>]\n";
	print "<center>\n";
	print "<B>〜　掲示板の使い方　〜</B><p>\n";
	print "<table width=90% cellpadding=3 border=0><tr><td>\n";
	if($tagkey){ print "<li>コメント欄に<B>タグ</B>が使用出来ます。ただし、&lt;a href=\"..\"&gt;....&lt;\/a&gt;を使用した場合は自動リンクはされません。</li>\n"; }
	else{ print "<li><B>タグ</B>は使用出来ません。</li>\n"; }
	if(@CHK_COM){
		print "<li>必須入力項目は、";
		for($i=0; $i<@CHK_COM; $i++ ){
			print "<B>「$CHK_COM[$i]」</B>";
		}
		print "です。その他の項目は任意です。</li>\n";
	}
	print "<li>この掲示板は<B>クッキー対応</B>です。（ただし利用者のブラウザがクッキー対応の場合のみ）</li>\n";
	print "<li>キーワードによって<B>簡易検索</B>ができます。</li>\n";
	print "<li>記事は最大<B>$max件</B>保存されます。</li>\n";
	print "<li>管理者が不利益と判断する記事、他人を中傷する記事は削除されることがあります。</li>\n";
	print "</td></tr></table>\n";
	print "</center>\n";
	&foot_disp;
	exit;
}
#------#
# 検索 #
#------#
sub search_proc
{
	&head_disp;
	print "[<a href=\"$cgi_file\">掲示板に戻る</a>]\n";
	print "<center>\n";
	print "<B>〜　簡易検索　〜</B><p>\n";
	print "<table width=90% cellpadding=3 border=0>\n";
	print "<tr><td>\n";
	print "■検索する<B>キーワード</B>を入力し、検索条件を選択して「検索する」ボタンを押してください。<BR>\n";
	print "■<B>キーワード</B>は<B>「半角スペース」</B>で区切って複数指定できます。<BR>\n";
	print "</td></tr></table><p>\n";

	print "<form action=\"$cgi_file\" method=\"post\">\n";
	print "<input type=\"hidden\" name=\"mode\" value=\"find\">\n";
	print "<B>キーワード</B><input type=\"text\" name=\"word\" size=30 value=\"$FORM{'word'}\"><BR>";
	print "<input type=\"radio\" name=\"cond\" value=\"or\" checked class=select>いずれかの語を含む\n";
	print "<input type=\"radio\" name=\"cond\" value=\"and\" class=select>全ての語を含む\n";
	print "<BR>\n";
	print "<input type=\"submit\" value=\"検索する\" class=\"button\"> <input type=\"reset\" value=\"リセット\" class=\"button\">\n";
	print "<BR><BR>\n";
	print "</form>\n";
	print "</center>\n";

	#---- 検索 ----#
	if($FORM{'word'} ne ""){

		$cond = $FORM{'cond'};
		$word = $FORM{'word'};
		$word =~ s/　/ /g;
		$word =~ s/\t/ /g;
		@pairs = split(/ /,$word);

		$keys = $word;
		if($cond eq 'or'){ $keys =~ s/ / または /g; }
		else			 { $keys =~ s/ / かつ /g; }

		if(!open(IN,"$data_file")){ &error("データファイルがオープン出来ません",""); }
		@lines = <IN>;
		close(IN);

		#---- 検索 ----#
		@NEW = ();
		foreach(1 .. $#lines){
			$flg = 0;
			foreach $pair(@pairs){
				if(index($lines[$_],$pair) >= 0){
					$flg = 1;
					if($cond eq 'or'){last;}
				}
				else{
					if($cond eq 'and'){$flg = 0; last;}
				}
			}
			if($flg == 1){push(@NEW,$lines[$_]);}
		}
		#---- 結果表示 ----#
		$count = @NEW;
		print "<hr width=100% size=2 noshade>\n";
		if($count != 0){
			print "<font color=#CC0000><B>検索結果：$count件</B></font><p>\n";
		}
		else{
			print "<font color=#CC0000><B>「$keys」では検索出来ませんでした</B></font><p>\n";
		}
		foreach $line(@NEW){
			local($num,$num2,$date,$host,$pasw,$buf) = split(/<##>/,$line);
			@data = split(/<#>/,$buf);
			print "<blockquote>\n";
			foreach(0 .. $#data){
				local($name,$cont) = split(/<>/,$data[$_]);
				if($cont){
					&auto_link($cont);
					print "$name = $cont<BR>\n";
				}
			}
			print "</blockquote>\n";
			print "<hr width=100% size=1 noshade>\n";
		}
	}
	&foot_disp;
	exit;
}
#--------------#
# 過去ログ表示 #
#--------------#
sub past_disp
{
	&head_disp;
	print "[<a href=\"$cgi_file\">掲示板に戻る</a>]\n";
	print "<center>\n";
	print "<B>〜　過去ログ閲覧　〜</B><p>\n";
	print "<table width=90% cellpadding=3 border=0>\n";
	print "<tr><td>\n";
	print "■番号の大きいほうが新しいログです<BR>\n";
	print "</td></tr></table><p>\n";

	if(!open(IN,"$pastno_file")){&error('過去ログ用カウンタファイルが読み込めません','');}
	$no = <IN>;
	close(IN);

	if($no == 0){
		print "過去ログはありません\n";
	}
	else{
		print "<table width=90% cellpadding=3 border=0><tr><td>\n";
		for($i=0; $i<$no; $i++){
			$c = $i+1;
			print "[ <a href=\"$c.html\" target='_blank'>$c</a> ]\n";
		}
		print "</td></tr></table>\n";
	}
	print "</center>\n";

	&foot_disp;
	exit;
}
#--------------#
# 過去ログ作成 #
#--------------#
sub pastLog_proc
{
	if(!open(IN,"$pastno_file")){ &error('過去ログ用カウンタファイルが読み込めません','ON');}
	$count = <IN>;
	close(IN);

	if($count == 0){ $count++; }
	$pastfile = "$count\.html";

	if(-e $pastfile){
		if(!open(IN,"$pastfile")){ &error('過去ログファイルが読み込めません','ON'); }
		@past = <IN>;
		close(IN);
		if($#past > $log_line){	#次のファイルを作成
			$count++;
			$pastfile = "$count\.html";
		 }
	}

	unless(-e $pastfile){
		if(!open(IN,">$pastno_file")){ &error('過去ログ用カウンタファイルが読み込めません','ON'); }
		print IN "$count";
		close(IN);
		&new_log;
	}

	if(!open(IN,"$pastfile")){ &error('過去ログファイルが読み込めません','ON'); }
	@past = <IN>;
	close(IN);

	foreach $line(@past_data){
		local($num,$num2,$dt,$host,$pas,$buf) = split(/<##>/,$line);
		if($num2){ $num = "$num2のレス"; }
		$pval = "[No\.$num]<BR>";
		$pval .= "<blockquote>";
		@data = split(/<#>/,$buf);
		foreach(0 .. $#data){
			local($name,$cont) = split(/<>/,$data[$_]);
			if($cont){
				&auto_link($cont);
				$pval .= "$name = $cont<BR>";
			}
		}
		$pval .= "</blockquote>";
		$pval .= "<hr width=100% size=1 noshade>\n";
		push(@log_data, $pval);
	}

	@new_data = ();
	foreach $line(@past){
		if($line =~ /<!--MESSAGE END-->/i){
			push(@new_data, $line);
			last;
		}
		push(@new_data, $line);
		if($line =~ /<!--MESSAGE START-->/i){
			push(@new_data, @log_data);
		}
	}
	push(@new_data,"</body></html>\n");

	if(!open(OUT,">$pastfile")) { &error('過去ログファイルが読み込めません','ON'); }
	print OUT @new_data;
	close(OUT);

}
sub new_log
{
	if(!open(IN,"$top_file")){ &error('トップファイルがオープン出来ません',''); }
	local(@head) = <IN>;
	close(IN);

	@nnew = ();
	push(@nnew, "<html>\n");
	for($i=0;$i<@head;$i++){
		push(@nnew,"$head[$i]");
		if(index($head[$i],"<body") >= 0){
			last;
		}
	}
	push( @nnew, "<\!--MESSAGE START-->\n" );
	push( @nnew, "<\!--MESSAGE END-->\n" );
	push( @nnew, "</body></html>\n" );

	if(!open(OUT,">$pastfile")){ &error('過去ログファイルが読み込めません','ON'); }
	print OUT @nnew;
	close(OUT);
	chmod(0666,"$pastfile");	#パーミッション変更
}
#----------------#
# パスワード入力 #
#----------------#
sub master_in
{
	&head_disp;
	print "<center><BR><BR><B>パスワードを入力し、モードを選択して下さい</B><BR>\n";
	print "<form action=\"$cgi_file\" method=post>\n";
	print "<table border=0>\n";
	print "<input type=hidden name=action value=\"master\">\n";
	print "<tr><td><B>パスワード　</B><input type=password name=pass_wd size=10 maxlength=20>　<input type=submit value=\" 実行 \" class=\"button\"></td></tr>\n";
	print "<tr><td align=center><input type=radio name=mode value=\"msg_del\" checked class=select>記事削除 <input type=radio name=mode value=\"all_res\" class=select>一括返信 <input type=radio name=mode value=\"env\" class=select>環境設定</td></tr>\n";
	print "</table>\n";
	print "</form></center>\n";
	&foot_disp;
	exit;
}

#----------#
# 削除画面 #
#----------#
sub del_disp
{
	if($FORM{'action'} eq 'master' && $FORM{'pass_wd'} ne $pass){
		&error('パスワードが違います','');
	}
	if(!open(IN,$data_file)){ &error('データファイルがオープン出来ません',''); }
	@lines = <IN>;
	close(IN);
	shift(@lines);

	@NEW = ();
	for($i=0; $i<@lines; $i++){
		local($num,$num2,$date,$host,$pasw,$buf) = split(/<##>/,$lines[$i]);
		if($num2 eq ''){
			push(@NEW,$lines[$i]);
		}
	}
	@lines = reverse(@lines);

	&head_disp;
	print "[<a href=\"$cgi_file\">掲示板に戻る</a>]\n";
	print "<center>\n";
	print "<B>〜　記事削除　〜</B><p>\n";
	print "<table width=90% cellpadding=3 border=0>\n";
	print "<tr><td>\n";
	if($FORM{'action'} eq ''){
		print "■投稿時に設定した「削除キー」を入力して下さい。<br>\n";
	}
	print "■削除したい記事にチェックを付けて「削除」ボタンを押して下さい。<BR>\n";
	print "■親記事を削除すると、関連記事は全て削除されます。<BR>\n";
	print "</td></tr></table><p>\n";

	print "<form action=\"$cgi_file\" method=post>\n";
	print "<input type=hidden name=\"mode\" value=\"del\">\n";
	if($FORM{'action'} eq ''){
		print "<B>削除キー</B> <input type=\"text\" name=\"del_key\" size=15>\n";
	}
	else{
		print "<input type=hidden name=\"action\" value=\"master\">\n";
		print "<input type=hidden name=\"pass_wd\" value=\"$FORM{'pass_wd'}\">\n";
	}
	print "<input type=submit value=\"  削除  \" class=\"button\"> <input type=reset value=\"クリア\" class=\"button\"><p>\n";
	print "<table width=90% cellpadding=0 cellspacing=0 border=1>\n";

	if($FORM{'page'} eq '')	{$start_cnt = 0;}
	else					{$start_cnt = $FORM{'page'};}
	if($start_cnt < 0)		{$start_cnt = 0;}
	$max_cnt = @NEW - 1;
	$end_cnt = $start_cnt + $pagemax - 1;
	if($end_cnt >= $max_cnt){$end_cnt = $max_cnt;}
	$next = $max_cnt - $end_cnt;
	if($next > $pagemax){$next = $pagemax;}

	foreach($start_cnt .. $end_cnt){
		local($num,$num2,$date,$host,$pasw,$buf) = split(/<##>/,$NEW[$_]);
		@data = split(/<#>/,$buf);
		$buf = "";
		foreach(0 .. $#data){
			local($name,$cont) = split(/<>/,$data[$_]);
			for($i=0; $i<@CHK; $i++){
				if($CHK[$i] eq $name){
					$cont =~ s/<BR>/ /g;
					$cont =~ s/</&lt;/g;
					$cont =~ s/>/&gt;/g;
					if(length($cont) > 20){$cont = substr($cont,0,18); $cont = $cont.'..';}
					$buf .= "$cont ";
					last;
				}
			}
		}

		$cmark = ($FORM{'action'} eq '') ? "radio" : "checkbox";
		print "<tr><td><input type=$cmark name=del value=\"$date\" class=select> \n";
		print "$num $buf <small>$date</small>\n";

		foreach(0 .. $#lines){
			local($num3,$num4,$date,$host,$pasw,$buf) = split(/<##>/,$lines[$_]);
			if($num eq "$num4"){
				@data = split(/<#>/,$buf);
				$buf = "";
				foreach(0 .. $#data){
					local($name,$cont) = split(/<>/,$data[$_]);
					for($i=0; $i<@CHK; $i++){
						if($CHK[$i] eq $name){
							$cont =~ s/<BR>/ /g;
							$cont =~ s/</&lt;/g;
							$cont =~ s/>/&gt;/g;
							if(length($cont) > 20){$cont = substr($cont,0,18); $cont = $cont.'..';}
							$buf .= "$cont ";
							last;
						}
					}
				}
				$cmark = ($FORM{'action'} eq '') ? "radio" : "checkbox";
				print "<center><table width=90% cellpadding=0 cellspacing=0 border=0><tr><td>\n";
				print "<input type=$cmark name=del value=\"$date\" class=select>\n";
				print "$buf <small>$date</small>\n";
				print "</td></tr></table></center>\n";
			}
		}
		print "</td></tr>\n";
	}
	print "</table></form>\n";

	#---- 改ページ ----#
	print "<div align=center><table border=0><tr>\n";
	$next_cnt = $end_cnt+1;
	$prev_cnt = $start_cnt-$pagemax;

	if($prev_cnt >= 0){		#前ページボタン
		print "<td><form action=\"$cgi_file\" method=post>\n";
		print "<input type=hidden name=page value=\"$prev_cnt\">\n";
		print "<input type=hidden name=mode value=msg_del>\n";
		print "<input type=submit value=\"前の$pagemax件\" class=\"button\">\n";
		if($FORM{'action'} eq 'master'){
			print "<input type=hidden name=action value=\"master\">\n";
			print "<input type=hidden name=pass_wd value=\"$FORM{'pass_wd'}\">\n";
		}
		print "</form></td>\n";
	}

	if($end_cnt ne $max_cnt){	#次ページボタン
		print "<td><form action=\"$cgi_file\" method=post>\n";
		print "<input type=hidden name=page value=\"$next_cnt\">\n";
		print "<input type=hidden name=mode value=msg_del>\n";
		print "<input type=submit value=\"次の$next件\" class=\"button\">\n";
		if($FORM{'action'} eq 'master'){
			print "<input type=hidden name=action value=\"master\">\n";
			print "<input type=hidden name=pass_wd value=\"$FORM{'pass_wd'}\">\n";
		}
		print "</form></td>\n";
	}
	print "</tr></table></div><p>\n";

	&foot_disp;
	exit;
}
#----------#
# 削除処理 #
#----------#
sub del_proc
{
	if($FORM{'action'} eq "master"){
		if($FORM{'pass_wd'} ne $pass){ &error('パスワードが違います',''); }
	}
	else{
		if($FORM{'del_key'} eq ""){ &error('削除キーを入力して下さい','');}
	}
	if($FORM{'del'} eq ""){ &error('削除記事を選択して下さい',''); }

	&file_lock('ON');
	@dnew=();
	if(!open(IN,"$data_file")){&error('データファイルがオープン出来ません','ON');}
	@lines = <IN>;
	close(IN);
	push(@dnew, $lines[0]);
	shift(@lines);

	$dflg = 0;
	$wnum = 0;
	for($i=0; $i<@lines; $i++){
		local($num,$num2,$keyw,$host,$pasw) = split(/<##>/,$lines[$i]);
		$f = 0;
		for($j=0; $j<@delete; $j++){
			if($delete[$j] eq $keyw){
				if($FORM{'action'} ne "master"){
					if($pasw eq ""){ &error('この記事には削除キーが設定されていません','ON'); }
					if($pasw ne crypt($FORM{'del_key'},"pw")){ &error('削除キーが一致しません','ON'); }
				}
				$wnum = $num;
				if($num2 eq ''){$dflg=1;}
				$f = 1; last;
			}
			elsif(($dflg == 1) && ($wnum eq $num2)){
				$f = 1; last;
			}
		}
		if($f == 0){
			push(@dnew,$lines[$i]);
		}
	}

	if(!open(OUT,">$data_file")){ &error('データファイルがオープン出来ません','ON'); }
	print OUT @dnew;
	close(OUT);
	&file_lock('OFF');
	&del_disp;	#削除画面へ
}
#----------#
# 環境設定 #
#----------#
sub env_set
{
	if($FORM{'pass_wd'} ne $pass){
		&error('パスワードが違います','');
	}
	&head_disp;
	print "[<a href=\"$cgi_file\">掲示板に戻る</a>]\n";
	print "<center>\n";
	print "<B>〜　環境設定　〜</B><p>\n";

	print "<table width=90% cellpadding=3 border=0>\n";
	print "<tr><td>\n";
	print "■変更したい部分を修正し、「変更する」ボタンを押してください。<BR>\n";
	print "</td></tr></table><p>\n";

	print "<form action=\"$cgi_file\" method=post>\n";
	print "<input type=hidden name=action value=\"master\">\n";
	print "<input type=hidden name=mode value=\"env_w\">\n";
	print "<input type=hidden name=pass_wd value=\"$pass\">\n";

	print "<table width=90% cellpadding=2 cellspacing=0 border=0>\n";

	#---- パスワード ----#
	print "<tr><td bgcolor=#cccccc colspan=2><B>パスワード</B></td></tr>\n";
	print "<tr><td>パスワード</td><td><input type=text name=env_pass size=20 maxlength=8 value=\"$pass\"> 半角英数</td></tr>\n";
	print "<tr><td colspan=2>　</td></tr>\n";

	#---- 記事 ----#
	print "<tr><td bgcolor=#cccccc colspan=2><B>記事</B></td></tr>\n";
	print "<tr><td>最大記事数</td><td><input type=text name=env_max_cnt size=10 maxlength=5 value=\"$max\"><small>　あまり大きくしないで！</small></td></tr>\n";
	print "<tr><td>１ページの記事数</td><td><input type=text name=env_page_cnt size=10 maxlength=5 value=\"$pagemax\"></td></tr>\n";
	$mk[0] = ""; $mk[1] = "";
	$i = ($pastkey==0) ? 0 : 1;
	$mk[$i] = "checked";
	print "<tr><td>過去ログ</td><td><input type=radio name=env_log value=\"no\" $mk[0] class=select>作らない　<input type=radio name=env_log value=\"yes\" $mk[1] class=select>作る</td></tr>\n";
	$mk[0] = ""; $mk[1] = "";
	$i = ($res_sort==1) ? 0 : 1;
	$mk[$i] = "checked";
	print "<tr><td>レスをつけた記事</td><td><input type=radio name=env_res value=\"top\" $mk[0] class=select>トップへ移動　<input type=radio name=env_res value=\"now\" $mk[1] class=select>そのまま</td></tr>\n";
	$mk[0] = ""; $mk[1] = "";
	$i = ($tagkey==0) ? 0 : 1;
	$mk[$i] = "checked";
	print "<tr><td>タグ</td><td><input type=radio name=env_tag value=\"no\" $mk[0] class=select>許可しない　<input type=radio name=env_tag value=\"yes\" $mk[1] class=select>許可する</td></tr>\n";
	$mk[0] = ""; $mk[1] = "";
	$i = ($res_br==0) ? 0 : 1;
	$mk[$i] = "checked";
	print "<tr><td>返信記事の改行</td><td><input type=radio name=env_res_br value=\"no\" $mk[0] class=select>許可しない　<input type=radio name=env_res_br value=\"yes\" $mk[1] class=select>許可する</td></tr>\n";
	print "<tr><td colspan=2>　</td></tr>\n";

	#---- カウンタ ----#
	$mk[0] = ""; $mk[1] = ""; $mk[2] = "";
	$i = ($counter==0) ? 0 :
	     ($counter==1) ? 1 : 2;
	$mk[$i] = "checked";
	print "<tr><td bgcolor=#cccccc colspan=2><B>カウンタ</B></td></tr>\n";
	print "<tr><td><input type=radio name=env_counter value=\"no\" $mk[0] class=select>なし</td><td>　</td></tr>\n";
	print "<tr><td><input type=radio name=env_counter value=\"text\" $mk[1] class=select>テキスト</td><td>　</td></tr>\n";
	print "<tr><td><input type=radio name=env_counter value=\"gif\" $mk[2] class=select>画像</td><td><small>※CGIのある階層にcnt\/1.gif〜cnt\/9.gifを置く</small></td></tr>\n";
	print "<tr><td>桁数</td><td><input type=text name=env_counter_size size=10 maxlength=30 value=\"$cnt_place\"></td></tr>\n";
	print "<tr><td colspan=2>　</td></tr>\n";

	#---- フォーム詳細設定 ----#
	print "<tr><td bgcolor=#cccccc colspan=2><B>フォーム詳細設定</B></td></tr>\n";
	print "<tr><td colspan=2>form.htmlで指定している名称に対して設定を行います。<BR>\n";
	print "&lt;input type=text name=\"aaa\"&gt;と書いてる場合、<B>aaa</B>が名称になります。<BR>\n";
	print "また、指定は、カンマ区切りで書いて下さい。（aaa,bbb....）</td></tr>\n";
	$fbuf = $TAG[0];
	for($i=1; $i<@TAG; $i++){ $fbuf .= ",$TAG[$i]";}
	print "<tr><td>タグを許可する名称</td><td><input type=text name=env_f_tag size=30 value=\"$fbuf\"></td></tr>\n";
	$fbuf = $CHK[0];
	for($i=1; $i<@CHK; $i++){ $fbuf .= ",$CHK[$i]";}
	print "<tr><td>必須項目とする名称</td><td><input type=text name=env_f_chk size=30 value=\"$fbuf\"></td></tr>\n";
	$fbuf = $CHK_COM[0];
	for($i=1; $i<@CHK_COM; $i++){ $fbuf .= ",$CHK_COM[$i]";}
	print "<tr><td>必須項目とする名称のコメント</td><td><input type=text name=env_f_chk_com size=30 value=\"$fbuf\"><small>上記項目と同じ数分</small></td></tr>\n";
	$fbuf = $AUTO_LINK[0];
	for($i=1; $i<@AUTO_LINK; $i++){ $fbuf .= ",$AUTO_LINK[$i]";}
	print "<tr><td>自動リンクをかける名称</td><td><input type=text name=env_f_auto_link size=30 value=\"$fbuf\"></td></tr>\n";
	$fbuf = $COOK[0];
	for($i=1; $i<@COOK; $i++){ $fbuf .= ",$COOK[$i]";}
	print "<tr><td>クッキー対応にする名称</td><td><input type=text name=env_f_cook size=30 value=\"$fbuf\"></td></tr>\n";
	print "<tr><td colspan=2>　</td></tr>\n";

	#---- 一括返信設定 ----#
	print "<tr><td bgcolor=#cccccc colspan=2><B>一括返信設定</B></td></tr>\n";
	print "<tr><td colspan=2>管理者が一括返信する時にデフォルトで設定される項目を指定します。<BR>\n";
	print "名称=値で指定。複数の時は&でつなぐ<BR>\n";
	print "<tr><td colspan=2><input type=text name=env_mres value=\"$mres\" size=70></td></tr>\n";
	print "<tr><td colspan=2>　</td></tr>\n";

	print "</table>\n";
	print "<BR><input type=submit value=\" 変更する \" class=\"button\"> <input type=reset value=\" リセット \" class=\"button\"><BR>\n";
	print "</form>\n";
	print "</center>\n";

	&foot_disp;
	exit;
}
#------------------#
# 環境設定読み込み #
#------------------#
sub env_read
{
	if(!open(IN,"$env_file")){ &error('環境設定ファイルが正しく読み込めません',''); }
	@lines = <IN>;
	close(IN);

	foreach $buf(@lines){
		local($keyw,$data) = split(/<#>/,$buf);
		chop( $data );
		if($keyw eq "PASS"){	#パスワード
			$data =~ s/\n//;
			($pass,$dmy) = split(/<>/,$data,2);
		}
		if($keyw eq "ITEM"){	#記事
			$data =~ s/\n//;
			($max,$pagemax,$plog,$resp,$tagu,$resbr,$dmy) = split(/<>/,$data,7);
			$pastkey = ($plog eq "yes") ? 1 : 0;
			$res_sort = ($resp eq "top") ? 1 : 0;
			$tagkey = ($tagu eq "no") ? 0 : 1;
			$res_br = ($resbr eq "no") ? 0 : 1;
			#最大記事数、１ページの記事数、過去ログ、レスをつけた記事の位置、タグ許可、レス記事の改行
		}
		if($keyw eq "COUNTER"){	#カウンタ
			$data =~ s/\n//;
			($cntk,$cnt_place,$dmy) = split(/<>/,$data,3);
			$counter = ($cntk eq "gif") ? 2 :
					   ($cntk eq "text") ? 1 : 0;
			#カウンタ種類、桁数
		}
		if($keyw eq "FORM_VOI"){	#フォーム詳細設定
			$data =~ s/\n//;
			local($ftag,$fchk,$fchkm,$flink,$fcook,$dmy) = split(/<>/,$data,6);
			@TAG = split(/,/,$ftag);
			@CHK = split(/,/,$fchk);
			@CHK_COM = split(/,/,$fchkm);
			@AUTO_LINK = split(/,/,$flink);
			@COOK = split(/,/,$fcook);
		}
		if($keyw eq "MRES"){	#一括返信設定
			$data =~ s/\n//;
			($mres,$dmy) = split(/<>/,$data,2);
		}

	}
}
#------------------#
# 環境設定書き込み #
#------------------#
sub env_write
{
	if($FORM{'pass_wd'} ne $pass){
		&error('パスワードが違います','');
	}

	#---- パスワード ----#
	$buf = "PASS<#>$FORM{'env_pass'}<>\n";
	push(@NEW, $buf);

	#---- 記事 ----#
	$buf = "ITEM<#>$FORM{'env_max_cnt'}<>$FORM{'env_page_cnt'}<>$FORM{'env_log'}<>$FORM{'env_res'}<>$FORM{'env_tag'}<>$FORM{'env_res_br'}<>\n";
	push(@NEW, $buf);

	#---- カウンタ ----#
	$buf = "COUNTER<#>$FORM{'env_counter'}<>$FORM{'env_counter_size'}<>\n";
	push(@NEW, $buf);

	#---- フォーム詳細設定 ----#
	$buf = "FORM_VOI<#>$FORM{'env_f_tag'}<>$FORM{'env_f_chk'}<>$FORM{'env_f_chk_com'}<>$FORM{'env_f_auto_link'}<>$FORM{'env_f_cook'}<>\n";
	push(@NEW, $buf);

	#---- 一括返信設定 ----#
	$buf = "MRES<#>$FORM{'env_mres'}<>\n";
	push(@NEW, $buf);

	open(OUT, ">$env_file");
	print OUT @NEW;
	close(OUT);

	print "Location: $cgi_file" . '?' . "\n\n";
}
#--------------#
# アイコン参照 #
#--------------#
sub icon_disp
{
	&head_disp;
	print "<center><hr width=80% size=1 noshade>\n";
	print "<BR><B>イメージ画像サンプル</B></font><BR><BR>\n";
	print "現在登録されているイメージ画像は以下のとおりです<BR><BR>\n";
	print "<hr width=80% size=1 noshade>\n";

	print "<table cellpadding=3 cellspacing=0 border=1>\n";

	@icon1=();
	@icon2=();
	if(!open(IN,"$form_file")){ &error('フォームファイルがオープン出来ません','HEADER'); }
	local(@data) = <IN>;
	close(IN);

	$f = 0;
	for($fi=0; $fi<@data; $fi++){
		@ana = &frmana'str_ana($data[$fi]);
		foreach(0 .. $#ana){
			local($typ,$nam,$val) = split(/<#>/,$ana[$_]);
			if($nam eq "icon"){
				$f = 1;
				next;
			}
			if($f == 1){
				if($typ ne "option"){ $f = 0; next; }
				if($val eq ""){ next; }
				push(@icon1,"$val\n");
				$nn = "";
				$p = rindex($data[$fi],">");
				if($p){$nn=substr($data[$fi],$p+1,10); $nn =~ s/\n//g;}
				push(@icon2,"$nn");
			}
		}
	}

	$icnt = @icon1;
	for($i=0,$j=0; $i<@icon1; $i++){
		if($icon1[$i] eq ""){ next; }
		$icon1[$i] =~ s/\n//g;
		$j++;
		if($j == 1){ print "<tr>\n"; }
		print "<td align=center><img src=\"$icon1[$i]\"><BR><B>$icon2[$i]</B></td>\n";
		if($j >= 5){ print "</tr>\n"; $j=0; }
	}
	if( $j != 0 ){
		for( ; $j<5; $j++ ){
			print "<td>&nbsp;</td>\n";
		}
		print "</tr>\n";
	}

	print "</table>\n";
	print "<form><input type=button value=\"このウィンドウを閉じる\" onClick=\"top.close();\" class=\"button\"></form><BR><BR>\n";

	&foot_disp;
	exit;
}
#----------#
# 一括返信 #
#----------#
sub mas_res_proc
{
	$date = &time_get;
	&file_lock('ON');

	if(!open(IN,"$data_file")){ &error('データファイルがオープン出来ません','ON'); }
	@lines = <IN>;
	close(IN);

	#---- 記事番号 ----#
	$pno = $lines[0];
	$pno =~ s/\n//;
	shift(@lines);

	$mval = "";
	local($psw) = $FORM{'pass_wd'};
	if($FORM{'pass_wd'} ne ""){ $FORM{'pass_wd'} = crypt($FORM{'pass_wd'},"pw"); }	#暗号化
	local($addr) = $ENV{'REMOTE_ADDR'};
	for($i=0; $i<$form_cnt; $i++){
		if($FORM[$i] ne "comment" && $FORM[$i] ne "pass_wd"){ $mval .= "$FORM[$i]<>$FORM{$FORM[$i]}<#>"; }
	}

	for($j=0; $j<@answer; $j++){
		local($dt) = "$date"."-"."$answer[$j]";
		$nam  = "mrescom_$answer[$j]";
		if($FORM{$nam}){
			$val = $mval;
			$val .= "comment<>$FORM{$nam}<#>";
			$mv = "$answer[$j]<##>$answer[$j]<##>$dt<##>$addr<##>$FORM{'pass_wd'}<##>$val<##>\n";
			@mn = ();
			@mr = ();
			if($res_sort){
				for($i=0; $i<@lines; $i++){
					local($num,$num2) = split(/<##>/,$lines[$i]);
					if($num2 eq "" && $answer[$j] eq $num){
						$mp = $lines[$i];
					}
					elsif($num2 eq $answer[$j]){
						push(@mr,$lines[$i]);
					}
					else{
						push(@mn,$lines[$i]);
					}
				}
				unshift(@mn,@mr);
				unshift(@mn,$mv);
				unshift(@mn,$mp);
			}
			else{
				for($i=0; $i<@lines; $i++){
					local($num,$num2) = split(/<##>/,$lines[$i]);
					if($answer[$j] eq $num && $num2 eq ""){
						push(@mn,$lines[$i]);
						push(@mn,$mv);
					}
					else{
						push(@mn,$lines[$i]);
					}
				}
			}
			@lines = @mn;
		}
	}
	unshift( @lines, "$pno\n" );

	if(!open(OUT,">$data_file")){ &error('データファイルがオープン出来ません','ON'); }
	print OUT @lines;
	close(OUT);

	&file_lock('OFF');
	print "Location: $cgi_file" . '?' . "mode=all_res&pass_wd=$psw\n\n";
}
#----------#
# 現在時刻 #
#----------#
sub time_get
{
	$ENV{'TZ'} = "JST-9";
	( $sec,$min,$hour,$mday,$mon,$year,$wday ) = localtime();
	$mon  = $mon+1;
	$sec  = "0$sec"  if $sec  < 10;
	$min  = "0$min"  if $min  < 10;
	$hour = "0$hour" if $hour < 10;
	$mday = "0$mday" if $mday < 10;
	$mon  = "0$mon"  if $mon  < 10;
	$year = $year + 1900;
	$wday = ('sun','mon','tue','wed','thu','fri','sat')[$wday];
	$date = "$year/$mon/$mday($wday) $hour:$min:$sec";
	return( $date );
}
#------------#
# 自動リンク #
#------------#
sub auto_link
{
	if(!($_[0] =~ /<\/a>/)){
		$_[0] =~ s/([^=^\"]|^)(http\:[\w\.\~\-\/\?\&\+\=\:\@\%\;\#]+)/$1<a href=\"$2\" target='_top'>$2<\/a>/g;
	}
}
#--------------#
# クッキー書込 #
#--------------#
sub cookie_set
{
	local(@m)=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	local(@y)=('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
	$ENV{'TZ'} = "GMT";
	($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time + 60*24*60*60);
	$year += 1900;
	$sec  = "0$sec"  if ($sec  < 10);
	$min  = "0$min"  if ($min  < 10);
	$hour = "0$hour" if ($hour < 10);
	$mday = "0$mday" if ($mday < 10);
	$date_gmt = "$y[$wday], $mday\-$m[$mon]\-$year $hour:$min:$sec GMT";
	local($cook) = "pass\:\:$FORM{'pass'}";
	for($i=0; $i<@COOK; $i++){
		if($COOK[$i] ne "pass"){
			$cook .= "\,$COOK[$i]\:\:$FORM{$COOK[$i]}";
		}
	}
	print "Set-Cookie: $cook_name=$cook; expires=$date_gmt\n";
}
#--------------#
# クッキー読込 #
#--------------#
sub cookie_get
{
	@pairs = split(/\;/, $ENV{'HTTP_COOKIE'});
	foreach $pair(@pairs){
		local($name,$value) = split(/\=/,$pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/\,/, $DUMMY{$cook_name});
	foreach $pair(@pairs) {
		local($name,$value) = split(/\:\:/,$pair);
		$COOKIE{$name} = $value;
	}
	for($i=0; $i<@COOK; $i++){
		if($FORM{$COOK[$i]}){
			$COOKIE{$COOK[$i]} = $FORM{$COOK[$i]};
		}
	}
}
#----------------#
# ファイルロック #
#----------------#
sub file_lock
{
	if($_[0] eq 'ON'){
		$flg = 0;
		foreach(1 .. 5){
			if(-e $lock_file){sleep(1);}
			else{
				if(!open(LOCK,">$lock_file")){&error('ロックファイル作成失敗','');}
				close(LOCK);
				$flg = 1;
				last;
			}
		}
		if(!$flg){ &error('ただ今込み合っています','ON'); }
	}
	else{
		if(-e $lock_file){
			unlink($lock_file);
		}
	}
}
#------------#
# エラー処理 #
#------------#
sub error
{
	if($_[1] ne 'HEADER'){
		print "Content-type: text/html\n\n";
		print "<html><head>\n";
		print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
		print "<style type=\"text/css\">\n";
		print "<!--\n";
		print "body,tr,td,th{font-size:10pt;}\n";
		print "-->\n";
		print "</style>\n";
		print "<title>自由レイアウト掲示板</title>\n";
		print "</head>\n";
		print "<body bgcolor=#FFFFFF text=#000000>\n";
		print "<center>\n";
	}
	if(-e $lock_file && $_[1] eq 'ON'){
		unlink($lock_file);
	}
	print "<div align=center>\n";
	print "<B>$_[0]</B>\n";
	print "</div><p>\n";

	print "<a href=\"http://www.ace-cgi.jp/\"><small>エース</small></a>\n";
	print "</body></html>\n";
	exit;
}
