#!/usr/bin/perl
#Perlのパスを指定
#普通は、『#!/usr/bin/perl』or『#!/usr/local/bin/perl』を指定
#プロバイダによっては、『#!/usr/local/bin/perl5』の場合もあり。
###############################################
#このscriptの著作権は・・・
#HPサービス（hp@bird.to・mkc@intacc.ne.jp）に帰属しています。
#よって、改竄する事は許可しますが、著作権の表示は削除しないで下さい。
#また、このscriptによる如何なる損害も賠償しませんので・・・
#予め、ご了承下さい。
#尚、バグ情報などは、HPサービス（hp@bird.to）まで
#お知らせ頂けると有難いです。
#また、利用にあたっては、HPサービス（http://hp.bird.to/）に従って下さい。
####################使用方法######################
#一番上のPerlのパスを合わせて転送し、パーミッションを設定すれば・・・
#それで、使えるようになります。
#このCGIのカスタマイズは、ほとんどインターネット上で出来るように
#作ってありますので、ファイル内容を、特に変更する必要はありません。
####################変数設定######################
#（★☆）は、変更可能部分（よく分からない人は、変更しない事!!）
#（★）は、変更しない方がいい部分
#（☆）は、変更した方がいい部分

# 管理人専用コマンドの暗証番号（秘密の暗号に書き換えて下さい）（☆）
		my $secret='4321';

# カスタマイズ用ファイル（★☆）
		my $custom_file='./DATA/bbs_custom.cgi';

# データファイル名（★☆）
		my $data_file = './DATA/bbs.cgi';

# アクセス制限者用入室パスワード（秘密の暗号に書き換えて下さい）（★☆）
		my $access_pass='4321';

# タイトルの名前（★☆）
		my $html_title = '掲示板';

#フォーム題名（★☆）
		my $titlemessage="<B>$html_title</B>";

#homeのURL（自分のHPのURLを記入する）（★☆）
		my $home_url = 'http://hp.bird.to/info/bbs.html';

# トップに表示するログ数（１ページに表示する話題の数）（★☆）
		my $top_max=10;

#記録ログ数（総記録データ数。あまり多くすると重たくなるので注意）（★☆）
		my $log_max = 100;

#名無しのデフォルト（名前が未記入の時、この名前になる）（★☆）
		my $no_name ='匿名希望';

#フッターに挿入するタグ（★☆）
		my $hooter ="<A HREF=\"$home_url\" target=\"_top\">HOME</A>";

#タグの有効・無効（0=無効、1=有効）（★☆）
		my $tag =0;

#新レス上位機能の有効・無効（0=無効、1=有効）（★☆）
		my $newtop =1;

#リンク時のウィンドウ出現方法('new'=別、'_top'=同じ）（★☆）
		my $href_target='new';

#インラインリンク設定(0=使用しない、1=URL、2=文字、3=画像）（★☆）
		my $inlinelink=1;
		my $inline_word='ここをクリック!!';#文字の場合
		my $inline_image='<img src="./IMAGE/inline.gif" width=19 height=13 border=0>';#画像の場合

#時間表示方法（0=表示なし,1=月日時分を表示,2=月日のみ表示,3=月日時分曜日を表示,4=月日曜日を表示）（★☆）
		my $date_way =1;

#アクセス制限先ホスト名（複数の場合は、『=』で連結する）（★☆）
		my $limit_host ='';

#セキュリティータイム（掲示板有効時間）（★☆）
		my $security_time =60*60*1;

#名前の最大文字数（★☆）
		my $namelength =20;

#コメントの最大文字数（★☆）
		my $commentlength =3000;

#アドレスの最大文字数（★☆）
		my $addresslength =50;

#URLの最大文字数（★☆）
		my $urllength =100;

#題名の最大文字数（★☆）
		my $subjectlength =40;

#バックの色（★☆）
		my $bgcolor='black';

#バックのイラスト（★☆）
		my $background='./IMAGE/background/night.gif';

#文字の色（★☆）
		my $textcolor='white';

#リンクの色（★☆）
		my $linkcolor ='red';

#一度訪れたリンクの色（★☆）
		my $vlinkcolor='red';

#投稿の文字色（★☆）
		my $newscolor='dimgray';

#投稿の題名色（★☆）
		my $subcolor='blue';

#投稿のバックの色（★☆）
		my $tdcolor='floralwhite';

#CGIのURL（★☆）
		my $script_url = './bbs.cgi';

# 排他制御として使用するディレクトリ名（★☆）
		my $lockname='./DATA/bbslock';

#perlのバージョンを指定（★）
		require 5.001;

#cgi-lib.plのパスを指定（★）
		require "./cgi-lib.pl";

#jcode.plのパスを指定（★）
		require "./jcode.pl";

#custom.plのパスを指定（★）
		require "./custom_bbs.pl";

#現在time（★）
		my $now_time=time();

# 排他制御使用関数（★）
		my $expire     = 3*60;	# 最大排他制御時間（ sec ）
		my $num_retry  = 5;	# 最大再試行回数
		my $retry_time = 1;	# 排他制御待ち時間（ sec ）

# Cookie の有効期間（現在３０日に設定）（★）
		my $expires_time= &expires(30);

# Cookie の有効期間を設定（★）
		my $expires="expires=$expires_time";

# Cookieの名前（★）
		my $C_NAME='HPBBS1';

#HOMEアイコン表示（★☆）
		my $home_icon='<img src="./IMAGE/home.gif" width=24 height=22 border=0>';

#メールアイコン表示（★☆）
		my $mail_icon='<img src="./IMAGE/mail.gif" width=24 height=20 border=0>';

#押しピンアイコン表示（★☆）
		my $pin_icon='<img src="./IMAGE/pin.gif" width=28 height=24>';

#コーナーのめくれ表示（★☆）
		my $corner_icon='<img src="./IMAGE/corner.jpg" width=16 height=16 align=right><br clear=all>';

#曜日配列（★☆）
		my @wday=('(日)','(月)','(火)','(水)','(木)','(金)','(土)');
		my @wday2=('(Sun)','(Mon)','(Tue)','(Wed)','(Thu)','(Fri)','(Sat)');

##########ここより先は、Perlの知識が必要です!!##########
##########よく分からない人は、立ち入るべからず##########
		my %params;
        &ReadParse(\%params);
        $res_num = $params{'res_num'};#レスをつける親玉番号
        $subject = &jcode'sjis($params{'subject'});#題名
        $name = &jcode'sjis($params{'name'});#名前
        $email = &jcode'sjis($params{'email'});#メールアドレス
        $hp_url = &jcode'sjis($params{'hp_url'});#HPのURL
        $comment = &jcode'sjis($params{'comment'});#コメント
        $command = $params{'command'};#コマンド
        $page = $params{'page'};#リクエストページ
        $enter_pass = &jcode'sjis($params{'enter_pass'});#入室パスワード
        $secret_pass = &jcode'sjis($params{'secret_pass'});#管理人パス
        $code = $params{'code'};#コード

        $repair_delete = $params{'repair_delete'};#削除orトップ
        $target = $params{'target'};#削除データ
		my (@target)=split(/\0/,$target);#削除データ

        $repair_[0] = &jcode'sjis($params{'repair_0'});
        $repair_[1] = &jcode'sjis($params{'repair_1'});
        $repair_[2] = &jcode'sjis($params{'repair_2'});
        $repair_[3] = $params{'repair_3'};
        $repair_[4] = $params{'repair_4'};
		$repair_[5] = $params{'repair_5'};
        $repair_[6] = $params{'repair_6'};
        $repair_[7] = $params{'repair_7'};
        $repair_[8] = $params{'repair_8'};
        $repair_[9] = $params{'repair_9'};
        $repair_[10] = $params{'repair_10'};
        $repair_[11] = $params{'repair_11'};
        $repair_[12] = $params{'repair_12'};
        $repair_[13] = $params{'repair_13'};
        $repair_[14] = &jcode'sjis($params{'repair_14'});
        $repair_[15] = $params{'repair_15'};
        $repair_[16] = $params{'repair_16'};
        $repair_[17] = &jcode'sjis($params{'repair_17'});
        $repair_[18] = $params{'repair_18'};
        $repair_[19] = $params{'repair_19'};
        $repair_[20] = &jcode'sjis($params{'repair_20'});
        $repair_[21] = $params{'repair_21'};
        $repair_[22] = $params{'repair_22'};
        $repair_[23] = $params{'repair_23'};
        $repair_[24] = $params{'repair_24'};


		shift @repair_;

		$remote_host=$ENV{'REMOTE_HOST'};#クライアントのホスト名
		if($remote_host eq ''){
				$remote_host=gethostbyaddr(pack("C4",split(/\./,$ENV{'REMOTE_ADDR'})),2);
				$remote_host=$ENV{'REMOTE_ADDR'} if($remote_host eq '');
		}
####################条件分岐####################
		if(defined ($dlock_id=&LockOn($lockname))){
				if($repair_delete eq 'begin'){
						my @custom=&custom_open($custom_file,$html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink);
						my ($html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink)=@custom;
						unlink($custom_file) if($secret_pass eq $secret);
				}

				my @custom=&custom_open($custom_file,$html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink);#カスタマイズ類を取得

				foreach(@custom){
						$_=~s/&#44;/,/og;
				}

				($html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink)=@custom;#カスタマイズ類を設定

				if($codeword eq ''){
						($codeword)=&codeword;
						@custom=($html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink);
						&repair_custom($custom_file,@custom);
				}

				foreach('subject','name','email','hp_url','comment'){
						${$_}=~s/&/&amp;/og;
						${$_}=~s/</&lt;/og if($tag==0);
						${$_}=~s/>/&gt;/og if($tag==0);
						${$_}=~s/,/&#44;/og;
				}#タグの無効化

				for($i=0;$i<@repair_;$i++){
						$repair_[$i]=~s/,/&#44;/og;
				}#カンマの無害化

				print html_header($html_title,$name,$email,$hp_url) unless($command=~/repair_custom/ &&  $secret_pass eq $secret);
				&data_open;

				if($secret_pass eq $secret && $command eq '' && $repair_delete ne 'begin'){
						&target_list;
				}
				elsif($command eq 'repair_custom_beginner' && $secret_pass eq $secret){
						($html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink)=&repair_custom($custom_file,@repair_) if($repair_delete ne 'begin');
						print html_header($html_title);
						&looking_list;
				}
				elsif($command eq 'repair_custom_pro' && $secret_pass eq $secret){
						($html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink)=&repair_custom($custom_file,@repair_) if($repair_delete ne 'begin');
						print html_header($html_title);
						&looking_list;
				}
				elsif($command eq 'change' && $secret_pass eq $secret){
						if($repair_delete eq 'delete'){
								&delete_data(@target);
								&looking_list;
						}#削除の場合
						elsif($repair_delete eq 'custom_beginner'){
								&custom_beginner($script_url,$html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink,$secret_pass);
						}#カスタマイズする（初心者）場合
						elsif($repair_delete eq 'custom_pro'){
								&custom_pro($script_url,$html_title,$titlemessage,$home_url,$bgcolor,$background,$textcolor,$linkcolor,$vlinkcolor,$newscolor,$subcolor,$tdcolor,$top_max,$log_max,$secret,$tag,$date_way,$access_pass,$limit_host,$newtop,$hooter,$security_time,$codeword,$href_target,$inlinelink,$secret_pass);
						}#カスタマイズする（上級者）場合
						elsif($repair_delete eq 'color'){
								&color_list($script_url);
						}#色の見本を場合
						elsif($repair_delete eq 'background'){
								&background_list($script_url);
						}#背景イラストを見る場合
						elsif($repair_delete eq 'top'){
								&looking_list;
						}#トップに戻る場合
						else{
								&target_list;
						}#指定なしの場合
				}
				elsif($command eq 'write'){
						$name=$no_name if($name eq '');
						my $call_time=&decode($code,$codeword);

						if($comment eq ''){
								$error_code='コメントを記入して下さい';
						}
						elsif($namelength<length($name)){
								$error_code='名前の文字数を減らして下さい';
						}
						elsif($commentlength<length($comment)){
								$error_code='コメントの文字数を減らして下さい';
						}
						elsif($addresslength<length($email)){
								$error_code='メールアドレスの文字数を減らして下さい';
						}
						elsif($urllength<length($hp_url)){
								$error_code='URLの文字数を減らして下さい';
						}
						elsif($subjectlength<length($subject)){
								$error_code='題名の文字数を減らして下さい';
						}
						elsif($call_time+$security_time<$now_time && $security_time>0){
								$error_code='掲示板の有効時間を過ぎています';
						}
						else{
								&data_save;
						}
						$res_num='';#新規投稿に戻す為
						&looking_list;
				}
				elsif($command eq 'password_list'){
						if($enter_pass eq ''){
								&password_list;
						}
						elsif($enter_pass eq $access_pass){
								&looking_list;
						}
						else{
								$error_code='パスワードが違います';
								&password_list;
						}
				}
				else{
						if($enter_pass eq $access_pass){
								&looking_list;
						}
						else{
								my $host_check;
								if($limit_host ne ''){
										my(@limit_host)=split(/=/,$limit_host);
										foreach(@limit_host){
												if($remote_host=~/$_/){
														$host_check=1;
														last;
												}
										}
								}
								if($host_check==1){
										&password_list;
								}
								else{
										&looking_list;
								}
						}
				}

				&LockOff($dlock_id);
		}#排他制御終了

		else {
				&custom_open;
				print html_header($html_title);		
				print &lock_error();
		}

		print html_footer();#フッターを出力
		exit 0;
###############アクセス制限者用htmlを表示###############
sub password_list{

print <<END_OF_TEXT;
　<P>
<h1>$html_title</h1>
入室パスワードを入力して下さい。<BR>
入室パスワードを知らない方は、管理人までご連絡下さいませ。<P>
$error_code<P>
<form method="POST" action="$script_url">
<input type="hidden" name="command" value='password_list'>
<input type="text" size=10 name="enter_pass">
<input type="submit" value="パスワード入力">
</form>
　<P>
　<P>
END_OF_TEXT
}
####################htmlを表示####################
sub looking_list{

		$enter_pass=$access_pass if($command ne '');
		my $code=&encode($now_time,$codeword);

		($cookie_name,$cookie_email,$cookie_hp_url) = get_cookie();
		($c_cook,$c_name)=split(/:/,$cookie_name);
		($c_cook,$c_email)=split(/:/,$cookie_email);
		($c_cook,@c_hp_url)=split(/:/,$cookie_hp_url);
		$c_hp_url=join(':',@c_hp_url);#http://の:を連結

		$c_name=$name if($name ne '');
		$c_email=$email if($email ne '');
		$c_email=$email if($email eq '' && $command eq 'write');
		$c_hp_url=$hp_url if($hp_url ne '');
		$c_hp_url=$hp_url if($hp_url eq '' && $command eq 'write');
		$c_hp_url='http://' if($c_hp_url eq '');

		$submit='返信' if($res_num ne '');#返信の時
		$submit='送信' if($res_num eq '');#新規投稿の時

		my @true_ranks=sort{ $last_times{$b}<=>$last_times{$a} }keys %last_times;
		#総データ番号
		foreach(@true_ranks){
				push(@true_nums,$_) if($res_nums{$_} eq $_);
		}
		#投稿グループ番号（レスの親玉の番号）

		if($res_num ne ''){
				my $subject=$subjects{$res_num};
				my $name=$names{$res_num};
				my $email=$emails{$res_num};
				my $hp_url=$hp_urls{$res_num};
				my $date=$dates{$res_num};
				my $comment=$comments{$res_num};

				if($email ne ''){
						$email="<a href=\"mailto:$email\">$mail_icon</a>";
				}
				if($hp_url ne 'http://' && $hp_url ne ''){
						$hp_url="<a href=\"$hp_url\" target=\"$href_target\">$home_icon</a>";
				}
				else{
						$hp_url="";
				}

				print(
						'<table border=2 width=90% cellpadding=0 cellspacing=0><tr><td bgcolor="',$tdcolor,'"><font color="',$newscolor,'"><dl><dt>',$pin_icon,'<B><font size=+1 color="',$subcolor,'">',$subject,
						'　</font></B><font size=-1>投稿者：',$name,' ',
						$email,$hp_url,$date,'</font><input type=submit value=返信><P></dt><dd>',
						$comment,'</dd></dl></font>'
						);
				foreach(reverse @true_ranks){
						if($res_num eq $res_nums{$_} && $res_num ne $_){
								my $subject=$subjects{$_};
								my $name=$names{$_};
								my $email=$emails{$_};
								my $hp_url=$hp_urls{$_};
								my $date=$dates{$_};
								my $comment=$comments{$_};

								if($email ne ''){
										$email="<a href=\"mailto:$email\">$mail_icon</a>";
								}
								if($hp_url ne 'http://' && $hp_url ne ''){
										$hp_url="<a href=\"$hp_url\" target=\"$href_target\">$home_icon</a>";
								}
								else{
										$hp_url="";
								}
								print(
										'<font color="',$newscolor,'"><ul style="LIST-STYLE-TYPE:none"><li><dl><dt><B><font size=+1 color="',$subcolor,'">',$subject,'　</font></B><font size=-1>投稿者：',$name,' ',$email,$hp_url,$date,'</font><P></dt><dd>',
										$comment,'</dd></dl></ul></font>'
										);
						}
				}

				print($corner_icon,'</td></tr></table>　<P>');
		
		}
print <<END_OF_TEXT;
$error_code<P>
<form method="POST" action="$script_url">
<input type="hidden" name="command" value='write'>
<input type="hidden" name="res_num" value="$res_num">
<input type="hidden" name="enter_pass" value="$enter_pass">
<input type="hidden" name="code" value="$code">
<table><tr><td nowrap>
<table border=1>
<tr><td align="center" colspan=4 nowrap>$titlemessage</td></tr>

<tr><td align=center nowrap>名前</td><td nowrap><input type="text" size=25 name="name" value="$c_name"></td>
<td align=center nowrap>メール</td><td nowrap><input type="text" size=20 name="email" value="$c_email"></td></tr>
<tr><td align=center nowrap>HP</td><td colspan=3 nowrap><input type="text" size=55 name="hp_url" value="$c_hp_url"></td></tr>
<tr><td align=center nowrap>題名</td><td nowrap><input type="text" size=25 name="subject"></td><td colspan=2 nowrap><input type="submit" value="$submit"><input type="reset" value="取消"></td></tr>
<tr><td align=center nowrap>コメント</td><td align=center colspan=3 nowrap><textarea name="comment" rows="5" cols="50"></textarea></td></tr>
</table>
</td></tr>
<tr><td align=right>
<A HREF="$home_url" target="_top">[HOME]</A>
</td></tr></table>
</form>
　<p>
END_OF_TEXT

		if($res_num eq ''){
				my $top_ranks;
				$top_ranks=@true_nums-$page*$top_max if($top_max>@true_nums-$page*$top_max);
				$top_ranks=$top_max if($top_max<=@true_nums-$page*$top_max);
				for($i=0;$i<$top_ranks;$i++){
						my $subject=$subjects{$true_nums[$i+$page*$top_max]};
						my $name=$names{$true_nums[$i+$page*$top_max]};
						my $email=$emails{$true_nums[$i+$page*$top_max]};
						my $hp_url=$hp_urls{$true_nums[$i+$page*$top_max]};
						my $date=$dates{$true_nums[$i+$page*$top_max]};
						my $comment=$comments{$true_nums[$i+$page*$top_max]};

						if($email ne ''){
								$email="<a href=\"mailto:$email\">$mail_icon</a>";
						}
						if($hp_url ne 'http://' && $hp_url ne ''){
								$hp_url="<a href=\"$hp_url\" target=\"$href_target\">$home_icon</a>";
						}
						else{
								$hp_url="";
						}

						print(
								'<form method=POST action="',$script_url,
								'"><input type="hidden" name=res_num value="',
								$true_nums[$i+$page*$top_max],
								'"><input type="hidden" name=enter_pass value="',
								$enter_pass,
								'"><table border=2 width=90% cellpadding=0 cellspacing=0><tr><td bgcolor="',$tdcolor,'"><font color="',$newscolor,'"><dl><dt>',$pin_icon,'<B><font size=+1 color="',$subcolor,'">',$subject,
								'　</font></B><font size=-1>投稿者：',$name,' ',
								$email,$hp_url,$date,'</font><input type=submit value=返信><P></dt><dd>',
								$comment,'</dd></dl></font>'
						);
						foreach(reverse @true_ranks){
								if($true_nums[$i+$page*$top_max] eq $res_nums{$_} && $res_nums{$_} ne $_){
										my $subject=$subjects{$_};
										my $name=$names{$_};
										my $email=$emails{$_};
										my $hp_url=$hp_urls{$_};
										my $date=$dates{$_};
										my $comment=$comments{$_};

										if($email ne ''){
												$email="<a href=\"mailto:$email\">$mail_icon</a>";
										}
										if($hp_url ne 'http://' && $hp_url ne ''){
												$hp_url="<a href=\"$hp_url\" target=\"$href_target\">$home_icon</a>";
										}
										else{
												$hp_url="";
										}
										print(
												'<font color="',$newscolor,'"><ul style="LIST-STYLE-TYPE:none"><li><dl><dt><B><font size=+1 color="',$subcolor,'">',$subject,'　</font></B><font size=-1>投稿者：',$name,' ',$email,$hp_url,$date,'</font><P></dt><dd>',
												$comment,'</dd></dl></ul></font>'
										);
								}
						}
						print($corner_icon,'</td></tr></table></form>　<P>');
				}
				print(
						'<form method="POST" action="',$script_url,
						'"><input type=hidden name="page" value=',++$page,
						'><input type="hidden" name="enter_pass" value=',$enter_pass,
						'><input type="submit" value="NexT"></form>'
				) if(@true_nums>$top_ranks+$top_max*$page);
		}

print <<END_OF_TEXT;

<form method="POST" action="$script_url">
<table width=90%>
<tr><td nowrap>
<input type="text" size=8 name="secret_pass">
<input type="submit" value="管理人専用">
</td>
<td nowrap align=right>
<font size=2><A HREF="http://hp.bird.to/index.html" target="$href_target">掲示板SP Ver.1.68(C)HPサービス</A></font>
</td>
</tr></table>
</form>

END_OF_TEXT
}

####################管理人専用html####################
sub target_list{

print <<END_OF_TEXT;
<h1>管理人専用コマンド</h1>
　<p>
削除する場合は、削除データを指定してから、送信ボタンを押して下さい<BR>
（一度に複数のデータを削除出来ます）<BR>
色の違う太文字は、一番初めの投稿を表\わしています。<BR>
太文字を削除すると、その投稿の下についていたレスも削除されます。<p>
<form method="POST" action="$script_url">
<input type=hidden name="command" value='change'>
<input type="hidden" name="secret_pass" value="$secret_pass">
<table border=1>
<tr><th colspan=6>削除・カスタマイズフォーム</th></tr>

<tr align="center"><td nowrap>指定</td><td nowrap>題名</td><td nowrap>投稿者</td><td nowrap>内容</td><td nowrap>日付</td><td nowrap>ホスト名</td></tr>

END_OF_TEXT

		my @true_ranks=sort{ $last_times{$b}<=>$last_times{$a} }keys %last_times;
		foreach(@true_ranks){
				push(@true_nums,$_) if($res_nums{$_} eq $_);
		}
		#投稿グループ番号（レスの親玉の番号）

		for($i=0;$i<@true_nums;$i++){
				my $num=$nums{$true_nums[$i]};
				my $subject=$subjects{$true_nums[$i]};
				my $name=$names{$true_nums[$i]};
				my $date=$dates{$true_nums[$i]};
				my $remote_host=$remote_hosts{$true_nums[$i]};
				my $comment=$comments{$true_nums[$i]};
				$comment=substr($comment,0,20) if(length($comment)>20);
				$subject=substr($subject,0,20) if(length($subject)>20);
				$name=substr($name,0,20) if(length($name)>20);
				$subject='題名なし' if($subject eq '');
				$comment=~s/</&lt;/og;
				$comment=~s/>/&gt;/og;

				if($true_nums[$i] eq $res_nums{$true_nums[$i]}){
						$subject='<font color="'.$subcolor.'"><B>'.$subject.'</B></font>';
				}

				print(
						'<tr>',
						'<td nowrap>',
						'<input type="checkbox" name="target" value="',$num,'">','</td>',
						'<td nowrap>',$subject,' </td><td nowrap>',$name,' </td><td nowrap>',$comment,' </td><td nowrap>',$date,'</td><td nowrap>',$remote_host,'</td></tr>',
				) ;

				foreach(reverse @true_ranks){
						if($true_nums[$i] eq $res_nums{$_} && $res_nums{$_} ne $_){
								my $num=$nums{$_};
								my $subject=$subjects{$_};
								my $name=$names{$_};
								my $date=$dates{$_};
								my $remote_host=$remote_hosts{$_};
								my $comment=$comments{$_};
								$comment=substr($comment,0,20) if(length($comment)>20);
								$subject='題名なし' if($subject eq '');
								$comment=~s/</&lt;/og;
								$comment=~s/>/&gt;/og;

								print(
										'<tr>',
										'<td nowrap>',
										'<input type="checkbox" name="target" value="',$num,'">','</td>',
										'<td nowrap>',$subject,'</td><td nowrap>',$name,'</td><td nowrap>',$comment,' </td><td nowrap>',$date,'</td><td nowrap>',$remote_host,'</td></tr>',
								) ;
						}
				}
		}

print <<END_OF_TEXT;
</table>
<table>
<tr><td>
<input type="radio" checked name='repair_delete' value='delete'>データ削除
</td></tr>
<tr><td>
<input type="radio" name='repair_delete' value='custom_beginner'>カスタマイズする（初心者用）
</td></tr>
<tr><td>
<input type="radio" name='repair_delete' value='custom_pro'>カスタマイズする（上級者用）
</td></tr>
<tr><td>
<input type="radio" name='repair_delete' value='color'>色候補を見る
</td></tr>
<tr><td>
<input type="radio" name='repair_delete' value='background'>背景イラスト候補を見る
</td></tr>
<tr><td>
<input type="radio" name='repair_delete' value='top'>トップに戻る
</td></tr>
</table>
<input type="submit" value="送信">

</form>
　<p>
END_OF_TEXT
}
####################データ収集####################
sub data_open{

		unless(-f $data_file){ open(DATA,">$data_file");close(DATA); }
		if(open(DATA,"$data_file")){
		        @line = <DATA>;
		        close(DATA);

				for($i=0;$i<@line;$i++){
						chomp($line[$i]);
						my ($num,$res_num,$subject,$name,$email,$hp_url,$date,$comment,$last_time,$remote_host) = split(/,/,$line[$i]);


						$nums{$num}=$num;
						$res_nums{$num}=$res_num;
						$subjects{$num}=$subject;
						$names{$num}=$name;
						$emails{$num}=$email;
						$hp_urls{$num}=$hp_url;
						$dates{$num}=$date;
						$comments{$num}=$comment;
						$last_times{$num}=$last_time;
						$remote_hosts{$num}=$remote_host;
						$this_num=$num if($this_num<=$num);
				}
				$this_num++;#次ログの整理番号
		}
		else{
				$error_code='データファイルへのアクセスに失敗しました!!';
		}
}

####################データセーブ####################
sub data_save{

		my ($sec,$min,$hour,$day,$month,$year,$wday) = localtime($now_time);
		$month = ($month + 1);
		if($month < 10) { $month = "0$month"; }
		if($day < 10) { $day = "0$day"; }
        if($hour < 10) { $hour = "0$hour"; }
        if($min < 10) { $min = "0$min"; }

		if($date_way==0){
				$date = "";
		}
		elsif($date_way==1){
				$date = "投稿日：$month月$day日 $hour時$min分";
		}
		elsif($date_way==2){
				$date = "投稿日：$month月$day日";
		}
		elsif($date_way==3){
				$date = "投稿日：$month月$day日$wday[$wday]$hour時$min分";
		}
		elsif($date_way==4){
				$date = "投稿日：$month月$day日$wday[$wday]";
		}
		elsif($date_way==5){
				$date = "投稿日：$month/$day$wday2[$wday]$hour:$min";
		}
		elsif($date_way==6){
				$date = "投稿日：$month/$day$wday2[$wday]";
		}
		elsif($date_way==7){
				$date = "$month月$day日 $hour時$min分";
		}
		elsif($date_way==8){
				$date = "$month月$day日";
		}
		elsif($date_way==9){
				$date = "$month月$day日$wday[$wday]$hour時$min分";
		}
		elsif($date_way==10){
				$date = "$month月$day日$wday[$wday]";
		}
		elsif($date_way==11){
				$date = "$month/$day$wday2[$wday]$hour:$min";
		}
		elsif($date_way==12){
				$date = "$month/$day$wday2[$wday]";
		}

		$comment =~ s/\r\n/<BR>/og;
		$comment =~ s/\r/<BR>/og;
		$comment =~ s/\n/<BR>/og;
		$comment =~ s/\t/　/og;
		$comment=~ s/<BR><BR>/<BR>　<BR>/og;

		if($tag==0 && $inlinelink==1){
				$comment=~s/(http:\/\/[!#-9A-~]+)/<a href=\"$1\" target=\"$href_target\">$1<\/a>/g;
				$comment=~s/([0-9a-z_\.\-]+\@([0-9a-z_\-]+\.)+[0-9a-z_\-]+)/<a href=\"mailto:$1\" target=\"$href_target\">$1<\/a>/ig;
		}
		elsif($tag==0 && $inlinelink==2){
				$comment=~s/(http:\/\/[!#-9A-~]+)/<a href=\"$1\" target=\"$href_target\">$inline_word<\/a>/g;
				$comment=~s/([0-9a-z_\.\-]+\@([0-9a-z_\-]+\.)+[0-9a-z_\-]+)/<a href=\"mailto:$1\" target=\"$href_target\">$inline_word<\/a>/ig;
		}
		elsif($tag==0 && $inlinelink==3){
				$comment=~s/(http:\/\/[!#-9A-~]+)/<a href=\"$1\" target=\"$href_target\">$inline_image<\/a>/g;
				$comment=~s/([0-9a-z_\.\-]+\@([0-9a-z_\-]+\.)+[0-9a-z_\-]+)/<a href=\"mailto:$1\" target=\"$href_target\">$inline_image<\/a>/ig;
		}

		unless($line[0]=~/\Q,$subject,$name,$email,$hp_url,\E/ && $line[0]=~/\Q,$comment,\E/){

				$res_num=$this_num if($res_num eq '');#新規投稿の場合
				unshift(@line,"$this_num,$res_num,$subject,$name,$email,$hp_url,$date,$comment,$now_time,$remote_host");
				#データをデータリストの先頭に記録します

				splice(@line,$log_max,@line-$log_max) if(@line > $log_max);
				#最大リスト数を超える分は削除します

				#データリストに変更があればファイルを更新します
				if(open(DATA,">$data_file")){
						for($i=0;$i<@line;$i++){
								if($line[$i]=~/^$res_num,/ && $newtop==1){
										my ($num,$res_num,$subject,$name,$email,$hp_url,$date,$comment,$last_time,$remote_host) = split(/,/,$line[$i]);
										$line[$i]="$num,$res_num,$subject,$name,$email,$hp_url,$date,$comment,$now_time,$remote_host";
										$last_times{$num}=$now_time;#更新用
								}#新しいレスがついた投稿は、一番上に持ってくる
								print DATA "$line[$i]\n";
						}
						close(DATA);
						$nums{$this_num}=$this_num;
						$res_nums{$this_num}=$res_num;
						$subjects{$this_num}=$subject;
						$names{$this_num}=$name;
						$emails{$this_num}=$email;
						$hp_urls{$this_num}=$hp_url;
						$dates{$this_num}=$date;
						$comments{$this_num}=$comment;
						$last_times{$this_num}=$now_time;
						$remote_hosts{$this_num}=$remote_host;#更新用
				}
				else{
						$error_code='データファイルへのアクセスに失敗しました!!';
				}
		}
}
####################データ消去####################
sub delete_data{
		my (@target)=@_;
		if(open(DATA, ">$data_file")){
				for($i=0; $i<@line; $i++){
						my $delete_check=0;
						foreach(@target){
								if($line[$i]=~/^$_,/){
										delete $last_times{$_};
										$delete_check=1;
										last;
								}
						}
						if($delete_check==0){
								print DATA "$line[$i]\n"; 
						}
				}
				close(DATA);
		}
}
####################ヘッダー部分####################
sub html_header{
        my ($title,$name,$email,$hp_url) = @_;
        my $header='';

        $header.="HTTP/1.0 200 OK\n" if($ENV{'PERLXS'} eq 'PerlIS');
        $header.="Content-type: text/html; charset=Shift_JIS\n";
        $header.= &set_cookie($name,$email,$hp_url) if($name ne '');
		$header.="\n";
		$header.='<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">'."\n";
		$header.='<html>'."\n";
		$header.='<head>'."\n";
		$header.="<title>${title}</title>"."\n";
		$header.='</head>'."\n";;
		$header.='<body';
		$header.=" bgcolor=\"${bgcolor}\"" if($bgcolor ne '');
		$header.=" text=\"${textcolor}\"" if($textcolor ne '');
		$header.=" link=\"${linkcolor}\"" if($linkcolor ne '');
		$header.=" vlink=\"${vlinkcolor}\"" if($vlinkcolor ne '');
		$header.=" background=\"${background}\"" if($background ne '');
		$header.='>'."\n";
		$header.='<center>'."\n";
		return $header;
}
####################フッター部分####################
sub html_footer{
		if($hooter eq '0' || $hooter eq '1'){
				$hooter ="<A HREF=\"$home_url\" target=\"_top\">HOME</A>";
		}
        my $menustr = '';
		$menustr.=<<END_OF_TEXT;
　<p>
$hooter<P>
</center>
</body></html>
END_OF_TEXT
          return $menustr;
}
####################クッキー取得####################
sub get_cookie{
        my ($name,$email,$hp_url);
        if(defined $ENV{'HTTP_COOKIE'}){
                my $cook=$ENV{'HTTP_COOKIE'};
                (@cook) = split(/;/,$cook);
				foreach(@cook){
						if($_=~/$C_NAME/){
								my ($cookie_name,$value) = split(/=/,$_);
								($name,$email,$hp_url) = split(/,/,$value);
								return ($name,$email,$hp_url);
						}
				}
        }
}
####################クッキーセット####################
sub set_cookie{
        my ($name,$email,$hp_url) = @_;
		return  "Set-Cookie: ${C_NAME}=name:${name},email:${email},hp_url:${hp_url}; ${expires}\n\n";
}
###############クッキーの有効期限を取得###############
sub expires {
		my($day) = @_;
		my(@date);
	    my(@week) = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
	    my(@month) = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

	    @date = gmtime($now_time+ $day * 60 * 60 * 24);

	    $date[5] = $date[5] + 1900;

	    foreach (0..3) {
				$date[$_] = sprintf("%.2d",$date[$_]);
	    }

	    return "$week[$date[6]], $date[3]-$month[$date[4]]-$date[5] $date[2]:$date[1]:$date[0] GMT";
}

####################排他制御開始####################
# $id = LockOn(filename);
sub LockOn{
		my ($filename)=@_;

		# 古いディレクトリを削除
		rmdir($filename) if(-d $filename && ($now_time-(stat($filename))[9])>$expire);

		# 排他制御用ディレクトリ生成
		my $retry;
		for($retry=$num_retry; $retry>0 && mkdir($filename,0755)!=1; $retry--){
				sleep($retry_time);
		}
		return $filename if($retry>0);	# 成功
		return undef;			# 失敗
}
####################排他制御終了####################
# LockOff($id);
sub LockOff{
		my ($filename)=@_;
		rmdir ($filename) if(defined $filename);
}
####################排他制御失敗####################
sub lock_error{
		my $body = <<END_OF_BODY;
<h1>しばらくお待ち下さい</h1>
　<p>
只今、込み合ってるようです。<BR>
しばらくしてから、リロード（再読み込み）してみて下さい<p>
リロードしても繋がらない場合は・・・<BR>
３分間ほど待ってから、もう一度トライしてみて下さい。<p>

注：新規設置の管理人様へ・・・<BR>
新規設置時に、このコメントばかり表\示される時は・・・<BR>
DATAのパーミッションが777（707の場合もあり）以外になっていないか・・・<BR>
DATAが、Dataやdataになっていないかを確認してみて下さいませ≦(._.)≧<BR>
（詳しくは、HPサービスのFAQを参照して下さい）<BR>
　<p>
END_OF_BODY
		return $body;
}