#!/usr/bin/perl

# ----------------------------------------------------------------------------------
# Tree BBS Version 2.03
#
# Script written by CGIダウンロード(Nishiyama)
# This script is free
# HomePage http://www.cgi-down.com/
# E-Mail webmaster@cgi-down.com
# (1999/06/06-2001/10/20)
# 改変履歴
#
# V1.00 (1999-07-13) 当サイトのサポート掲示板でリリース
# V1.01 (1999-09-06) コメント入力幅修正、投稿表示部分に投稿者名表示。
# V1.02 (1999-11-16) タグ使用禁止に変更。 
# V2.00 (1999-11-17) サポート掲示板のみ投稿時に管理者へメール送信機能追加 
# V2.01 (1999-12-20) プログラム一部修正
# V2.01 (2000-05-02) 正式リリース(一般公開) 
# V2.02 (2000-05-26) 改ページできないバグ修正。(ログ等はそのまま使用できます) 
# V2.03 （2001-10-20) セキュリティー強化
#
# 再配布、商用利用（販売・レンタル等）禁止。
# 使用されたらメールをいただけると光栄です。
# 設置等不明な点は、サポート掲示板へお願いします。
# CGIのカスタマイズ・作成も受け付けております。
# メールマガジンにご登録頂きますと最新情報をお届けします。
# http://www.cgi-down.com/magazin/
# ----------------------------------------------------------------------------------
#
# **********************************************************************************
#                       オプション設定　↓ここから
# **********************************************************************************

# -------------------------------------------------------
#      管理者の設定（管理者とは、あなたです）※必須
# -------------------------------------------------------

$master_name = 'kobayash';       # 管理者の名前
$master_email = 'kobayash@phys8.phys.s.chiba-u.ac.jp'; # 管理人のメールアドレス
$master_pass = 'kobaryo';             # 管理人のパスワード
$master_url = 'http://phys8.phys.s.chiba-u.ac.jp/nakayamal/index.html';  # 管理者のURL（トップページ）

# -------------------------------------------------------
#      ファイル関連設定　※必須
# -------------------------------------------------------

$jcode       = './jcode.pl';       # jcode.plの位置
$cgifile     = './treebbs.cgi';    # このCGIの位置
$datafile    = './treebbs.dat';    # データー記録ファイル
$countfile   = './treebbs.cnt';    # カウンターファイル
$cookie_name = 'treebbs';          # クッキーの名前(必要以外、変更不要)
$note1_gif   = './dir.gif';        # 各記事タイトルNO1画像(ディレクトリ)
$note2_gif   = './note.gif';       # 各記事タイトルNO2画像(ノート)
$new_gif     = './new_note.gif';   # 各記事タイトル新着記事用画像
$back_gif    = '';                 # 背景画像(背景画像を使用するときは記入)　※''の間に記載
$titlegif    = '';                 # タイトル画像(タイトル画像を使用する場合は記入)　※''の間に記載
$t_w         = '';                 # タイトル画像の横幅
$t_h         = '';                 # タイトル画像の縦幅

# -------------------------------------------------------
#      その他必要に応じて設定する項目
# -------------------------------------------------------

$title         = 'TAPP Trouble Shooting';      # このCGIのタイトル
$max_page      = '20';            # １ページの表示記事数
$max_report    = '1000';           # 最大記事登録数(極端に大きくするとファイルが巨大化します)
$new_mark      = '3';            # 記事「newマーク」表示日数
$lockfile      = './treebbs.lock';# ロックファイル名(通常はこのままで結構です)
$lock_mode     = '2';             # ロックモード(symlink関数=1 open関数=2)※1で試してエラーの場合は"2"にして下さい。

# ---------- 各色設定部 --------------
$title_color   = '#000000';       # このCGIのタイトルの文字色
$title_bgcolor = '#ffc0cb';       # 記事テーブルの背景色
$del_color     = '#808080';       # 削除記事のタイトル色
# ---------- body色設定部 ------------
$bgcolor       = '#faf0e6';       # 背景色
$text_color    = '#000000';       # 通常文字色
$link_color    = '#6633ff';       # LINKの文字色
$alink_color   = '#ff00ff';       # ALINKの文字色
$vlink_color   = '#cc0099';       # VLINKの文字色

# **********************************************************************************
#                     オプション設定終わり　↑ここまで
# ----------------------------------------------------------------------------------
# これ以降書き換えをする場合は、個人の責任で行って下さい。
# **********************************************************************************
# [メイン処理]
if (!(-r $jcode)) { &error("jcode.pl が見つかりません"); }
require $jcode;
@DATA = &read_file($datafile);
&read_form;
if ($FORM{'ac'} eq 'new') { &html_header; &html_new; &html_footer; exit; }
elsif ($FORM{'ac'} eq 'view') { &view; }
elsif ($FORM{'ac'} eq 'control') { &password; }
elsif ($FORM{'ac'} eq 'password') { &delete1; }
elsif ($FORM{'ac'} eq 'delete') { &delete2; &delete1; }
elsif ($FORM{'ac'} eq 'regist') { &check_registry; }

&html_view;
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ヘッダー部分]
sub html_header {
  print "Content-type: text/html\n\n";
  print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n";
  if ($back_gif) {
    print "<BODY BACKGROUND=\"$back_gif\" BGCOLOR=$bgcolor TEXT=$text_color LINK=$link_color ALINK=$alink_color VLINK=$vlink_color>\n";
  } else {
    print "<BODY BGCOLOR=$bgcolor TEXT=$text_color LINK=$link_color ALINK=$alink_color VLINK=$vlink_color>\n";
  }
  print "<DIV ALIGN=center>\n";
  if ($titlegif) {
    print "<IMG SRC=\"$titlegif\" WIDTH=$t_w HEIGHT=$t_h ALT=\"$title\" BORDER=0><BR><BR>\n\n";
  } else {
    print "<FONT SIZE=6 COLOR=$title_color>$title</FONT><BR><BR>\n\n";
  }
#  print "<BODY BGCOLOR=$bgcolor TEXT=$text_color LINK=$link_color ALINK=$alink_color VLINK=$vlink_color>\n";
#  print "<P ALIGN=center><FONT SIZE=6 COLOR=$title_color>$title</FONT><BR><BR>\n\n";
  print "[　<A HREF=\"$cgifile\">トップ</A>　]\n";
  print "[　<A HREF=\"$cgifile?ac=new\">新規投稿</A>　]\n";
  print "[　<A HREF=\"$master_url\" TARGET=\"_top\">ＨＯＭＥ</A>　]\n";
  print "</P><HR SIZE=1>\n\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [フッター部分　※著作権表示]
sub html_footer {
  print "<HR SIZE=1>\n";
  print "<DIV ALIGN=center>[管理者：<A HREF=\"mailto:$master_email\">$master_name</A>]　　[<A HREF=\"$cgifile?ac=control\">管理者専用</A>]</DIV>\n";
  print "<HR SIZE=1>\n\n";
# 著作権表示（必ず見えるように表示して下さい）
  print "<DIV ALIGN=senter>Tree BBS Version 2.03 [<A HREF=\"http://www.cgi-down.com/\">CGIダウンロード</A>]</DIV>\n";

  print "</BODY></HTML>\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [トップ表示]
sub html_view {
  &html_header;

# 登録記事数を求める。
  $max_date = @DATA;

# newマークを付ける基準を求める。
    ($date,$now_sec) = &time;
    $new_dis = $new_mark * 60 * 60 * 24;

# 改ページ処理
  if ($FORM{'page'} eq '') { $end_page = 0; }
  else { $end_page = $FORM{'page'}; }
  $end_list = ($end_page + $max_page);
  if ($end_page < 0) { $end_page = 0; }
  if ($end_list >= $max_date) { $end_list = $max_date; }

# 記事の表示
  print "<CENTER>\n";
  print "<TABLE WIDTH=95% BORDER=0><TR><TD>\n\n";
  for ($i = $end_page;$i<$end_list;$i++) {
    chop($DATA[$i]);
    @DATAS = split(/★/,$DATA[$i]);
    foreach (@DATAS) {
      local($number,$mx,$rx,$sp,$date,$sc,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$_);
      $name  =~ s/\0/☆/g;
      $title =~ s/\0/☆/g;
      $com   =~ s/\0/☆/g;
      if ($mx eq 'main') {    # メイン記事の表示
        print "<DIV ALIGN=center><TABLE WIDTH=100% BORDER=0>";
        print "<TR><TD><IMG SRC=\"$note1_gif\" BORDER=0> ";
        if ($now_sec < ($sc + $new_dis)) {
          print "<IMG SRC=\"$new_gif\" BORDER=0> ";
        } else {
          print "<IMG SRC=\"$note2_gif\" BORDER=0> ";
        }
        print "<A HREF=$cgifile?ac=view&no=$number&mx=$number>$title</A>　[$name]　[$date]</TD></TR>";
        print "</DIV></TABLE>\n";
      } else {
        $wid = (100 - $sp*2.5);    # レスの場合はスペースを入れる
        print "<DIV ALIGN=right><TABLE WIDTH=$wid% BORDER=0>";
        print "<TR><TD><IMG SRC=\"$note1_gif\" BORDER=0> ";
        if ($now_sec < ($sc + $new_dis)) {
          print "<IMG SRC=\"$new_gif\" BORDER=0> ";
        } else {
          print "<IMG SRC=\"$note2_gif\" BORDER=0> ";
        }
        if ($title eq '管理者によって削除') {
          print "<FONT COLOR=\"$del_color\">$title　[$name]　[$date]</FONT></TD></TR>";
        }
        else {
          print "<A HREF=$cgifile?ac=view&no=$number&mx=$mx>$title</A>　[$name]　[$date]</TD></TR>";
        }
        print "</DIV></TABLE>\n";
      }
    }
    print "<HR SIZE=1>\n\n";
  }
  print "</TD></TR></TABLE>\n";

# 次ページ用
  $next_page = $end_list;

# まだデータが残っている場合は、次ページボタンを付け、
# １ページに表示した人数を $next_page で返す。
  if ($end_list ne $max_date) {
    print "<DIV ALIGN=center>\n";
    print "<FORM ACTION=\"$cgifile\" METHOD=\"post\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"page\" VALUE=\"$next_page\">\n";
    print "<INPUT TYPE=\"submit\" VALUE=\"次ページ\">\n";
    print "</FORM>\n";
    print "</DIV>\n";
  }

  &html_footer;
  exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [返信用個別表示]
sub view {
  &html_header;

# 指定された記事ナンバーを検索し @MATCH に格納する。
  foreach $lines (@DATA) {
    local($main,$re) = split(/★/,$lines);
    local($number,$mx,$rx,$sp,$date,$sc,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$main);
    if ($FORM{'mx'} eq $number) { push(@MATCH,$lines); }
  }

# 記事の表示
  print "<CENTER>\n";
  print "<TABLE WIDTH=80% BORDER=1>\n";
  foreach $match (@MATCH) {
    chop($match);
    local(@MAT) = split(/★/,$match);
    foreach (@MAT) {
      local($number,$mx,$rx,$sp,$date,$sc,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$_);
       if ($FORM{'no'} eq $number) {
        $cha_no = sprintf("%0" . "4" . "\d",$number);
        $name  =~ s/\0/☆/g;
        $title =~ s/\0/☆/g;
        $com   =~ s/\0/☆/g;
        print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%>記事番号</TD><TD WIDTH=10%><CENTER>$cha_no</CENTER></TD>\n";
        print "<TD BGCOLOR=$title_bgcolor WIDTH=15%>投稿日</TD><TD WIDTH=60%>$date</TD></TR>\n";
        print "<TR><TD BGCOLOR=$title_bgcolor>投稿者</TD><TD COLSPAN=3>$name</TD></TR>\n";
#        print "<TR><TD BGCOLOR=$title_bgcolor>E-Mail</TD><TD COLSPAN=3><A HREF=\"mailto:$mail\">$mail</A></TD></TR>\n";
#        print "<TR><TD BGCOLOR=$title_bgcolor>URL</TD><TD COLSPAN=3><A HREF=\"$hpurl\" TARGET=\"_blank\">$hpurl</A></TD></TR>\n";
#        print "<TR><TD BGCOLOR=$title_bgcolor>ブラウザ／OS</TD><TD COLSPAN=3>$agent</TD></TR>\n";
        print "<TR><TD BGCOLOR=$title_bgcolor>タイトル</TD><TD COLSPAN=3>$title</TD></TR>\n";
        print "<TR><TD BGCOLOR=$title_bgcolor>投稿記事</TD><TD COLSPAN=3 BGCOLOR=white>$com</TD></TR>\n";
        print "</TABLE>\n\n";
        print "<BR><HR WIDTH=80%>\n";
        print "返事を書く場合は、下のフォームに書いて下さい。\n";

 # フォームへデータを送る
        &html_new($number,$mx,$rx,$sp,$title,$com);
      }
    }
  }
  &html_footer;
  exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [投稿部]
sub html_new {
  local($no,$mx,$rx,$sp,$title,$com,) = (@_);

  &read_cookie;
# ブラウザによってサイズを変更する。
  local($ad_width,$name_width,$com_width) = &bura_check;

# 投稿部分
  print "<FORM ACTION=\"$cgifile\" METHOD=\"post\">\n";
  print "<CENTER>\n";
  print "<TABLE BORDER=1>\n";

  print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>名前</NOBR></TD>\n";
  print "<TD><INPUT TYPE=\"text\" NAME=\"name\" SIZE=$name_width MAXLENGTH=20 VALUE=$COOKIE{'name'}></TD>\n\n";

  $renum = $sp + 1;

# RE[*]の重複を防止する
  $title =~ s/RE\[\d+\]://g;

  if ($FORM{'ac'} ne "new") {
  print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>タイトル</NOBR></TD>\n";
  print "<TD><INPUT TYPE=\"text\" NAME=\"title\" SIZE=60 MAXLENGTH=60\" VALUE=RE[$renum]:$title></TD></TR>\n\n";
  } else {
  print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>タイトル</NOBR></TD>\n";
  print "<TD><INPUT TYPE=\"text\" NAME=\"title\" SIZE=60 MAXLENGTH=60\"></TD></TR>\n\n";
  }

#  print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>メール</NOBR></TD>\n";
#  print "<TD><INPUT TYPE=\"text\" NAME=\"mail\" SIZE=$name_width MAXLENGTH=50 VALUE=$COOKIE{'mail'}></TD>\n\n";

#  print "<TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>ＨＰ</NOBR></TD>\n";
#  print "<TD><INPUT TYPE=\"text\" NAME=\"hpurl\" SIZE=$name_width MAXLENGTH=70 VALUE=$COOKIE{'hpurl'}></TD></TR>\n\n";

# 新規投稿の場合
  if ($FORM{'ac'} eq "new") {
    print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>コメント</NOBR></TD>\n";
#    print "<TD COLSPAN=3><TEXTAREA NAME=com ROWS=10 COLS=$com_width WRAP=soft></TEXTAREA></TD></TR>\n\n";
    print "<TD><TEXTAREA NAME=com ROWS=10 COLS=$com_width WRAP=soft></TEXTAREA></TD></TR>\n\n";
    print "</TABLE><BR>\n\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"ac\" VALUE=\"regist\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"no\" VALUE=\"main\">\n";
    print "<INPUT TYPE=\"submit\" VALUE=\"登録する\">\n";
    print "<INPUT TYPE=\"reset\" VALUE=\"リセット\">\n";
  }
# 返信の場合「>」を付ける
  else {
    $com =~ s/<BR>/\r>/g;
    print "<TR><TD BGCOLOR=$title_bgcolor WIDTH=15%><NOBR>コメント</NOBR></TD>\n";
#    print "<TD COLSPAN=3><TEXTAREA NAME=com ROWS=10 COLS=$com_width WRAP=soft>>$com</TEXTAREA></TD></TR>\n\n";
    print "<TD><TEXTAREA NAME=com ROWS=10 COLS=$com_width WRAP=soft>>$com</TEXTAREA></TD></TR>\n\n";
    print "</TABLE><BR>\n\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"ac\" VALUE=\"regist\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"no\" VALUE=\"$no\">\n";
    if ($mx eq 'main') {
      print "<INPUT TYPE=\"hidden\" NAME=\"res\" VALUE=\"$no\">\n";
    } else {
      print "<INPUT TYPE=\"hidden\" NAME=\"res\" VALUE=\"$mx\">\n";
    }
    print "<INPUT TYPE=\"hidden\" NAME=\"rx\" VALUE=\"$rx\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"sp\" VALUE=\"$sp\">\n";
    print "<INPUT TYPE=\"submit\" VALUE=\"返信する\">\n";
    print "<INPUT TYPE=\"reset\" VALUE=\"リセット\">\n";
  }
  print "</FORM>\n";
  print "</CENTER>\n\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [投稿チェック]
sub check_registry {
  if ($FORM{'name'} eq "") { &error("名前が入力されていません"); }
  if ($FORM{'title'} eq '') { &error("タイトルが入力されていません"); }
  if ($FORM{'com'} eq "") { &error("投稿内容が入力されていません"); }
  else { &registry; }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルに記録]
sub registry {
  &set_cookie;

# 現在時間の取得
  ($date,$sc) = &time;

  $FORM{'name'}  =~ s/☆/\0/g;
  $FORM{'title'} =~ s/☆/\0/g;
  $FORM{'com'}   =~ s/\n//g;
  $FORM{'com'}   =~ s/☆/\0/g;
  $FORM{'com'}   =~ s/</&lt;/g;
  $FORM{'com'}   =~ s/>/&gt;/g;
  $FORM{'com'}   =~ s/\r/<BR>/g;

# 記事数取得
  $max = @DATA;

# クライアントのホスト名取得
  $rehost = $ENV{'REMOTE_HOST'};

# ブラウザ情報取得
  $agent = $ENV{'HTTP_USER_AGENT'};

  # ロック開始
  if($lock_mode == 1) { &lock1; }
  elsif ($lock_mode == 2) { &lock2; }


# カウンターファイルよりカウント取得（記事ナンバー）
  local($cnt) = &read_file($countfile);
  local($count) = $cnt + 1;

# メイン記事登録
  if ($FORM{'no'} eq 'main') {
# 最大記事記録数より多ければ古い記事を削除する
    $m = 0;
    foreach $log (@DATA) {
      $m++;
      if ($m == $max_report) { last; }
      push(@NEW,$log);
    }
    $log = "$count☆main☆$count☆0☆$date☆$sc☆$FORM{'name'}☆$FORM{'title'}☆$FORM{'mail'}☆$FORM{'hpurl'}☆$FORM{'com'}☆$rehost☆$agent★\n";
    unshift(@NEW,$log);
# レス登録
  } else {
    foreach $logs (@DATA) {
      local($number,$kizi) = split(/☆/,$logs);
      if ($FORM{'res'} eq $number) {
        chop($logs);
        @DATAS = split(/★/,$logs);
        $space = $FORM{'sp'} + 1;
        $new_ress = "$count☆$number☆$FORM{'rx'}☆$space☆$date☆$sc☆$FORM{'name'}☆$FORM{'title'}☆$FORM{'mail'}☆$FORM{'hpurl'}☆$FORM{'com'}☆$rehost☆$agent";
        $flag1 = 0; $flag2 = 0;
        foreach $t_date (@DATAS) {
          local($cnt,$mx,$rx,$sp,$dates,$scs,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$t_date);
          if (($flag2 == 1) && ($sp1 >= $sp)) {
            $ress_date = "$ress_date★$new_ress";
            $flag2 = 2;
          }
          if ($flag1) { $ress_date = "$ress_date★$t_date"; }
          else { $ress_date = $t_date; $flag1 = 1; }
          if (($FORM{'no'} == $cnt) && (!$flag2)) {
            $flag2 = 1; $sp1 = $sp;
          }
        }
        if ($flag2 == 1) { $ress_date = "$ress_date★$new_ress"; }
        unshift (@NEW,"$ress_date\n");
      }
      else { push (@NEW,$logs); }
    }
  }
  @DATA = @NEW;
  &write_file($datafile,@DATA);    #ファイル更新
  &write_file($countfile,$count);  #カウント更新

  # ロック解除
  &fileunlock;

  $COOKIE{'name'}  = $FORM{'name'};
  $COOKIE{'mail'}  = $FORM{'mail'};
  $COOKIE{'hpurl'} = $FORM{'hpurl'};
  print "Location: $cgifile" . '?' . "\n\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルに記録]
sub write_file {
  local($datafile,@DATA) = @_;
  if (!open(OUT, ">$datafile")) { &error("データファイルがありません"); }
  print OUT @DATA;
  close (OUT);
  return @DATA;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [記録ファイルの読み込み]
sub read_file {
  local($date_file) = $_[0];
  if (!open(IN,$date_file)) { &error("データファイルがありません"); }
  local(@date_files) = <IN>;
  close(IN);
  return @date_files;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック(symlink)]
sub lock1 {
  local($retry) = 5;
  while (!symlink(".", $lockfile)) {
    if(--$retry <= 0) { &error("ただ今混雑中です。しばらくしてアクセスしてください。"); }
    sleep(1);
  }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック(open)]
sub lock2 {
  foreach (1 .. 5) {
    if (-e $lockfile) { sleep(1); }
    else {
      open(LOCK,">$lockfile");
      close(LOCK);
      return;
    }
  }
  &error("ただ今混雑中です。しばらくしてアクセスしてください。");
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルロック解除]
sub fileunlock {
  if (-e $lockfile) { unlink($lockfile); }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [パスワード入力画面]
sub password {
  &html_header;
  print "<DIV ALIGN=center>\n";
  print "管理者用のパスワードを入力して下さい。<BR>\n";
  print "<FORM ACTION=\"$cgifile\" METHOD=\"post\">\n";
  print "<INPUT TYPE=\"password\" NAME=\"pass\" SIZE=10 MAXLENGTH=20>";
  print "<INPUT TYPE=\"hidden\" NAME=\"ac\" VALUE=\"password\">\n";
  print "<INPUT TYPE=\"submit\" VALUE=\"　確認　\">\n";
  print "</FORM>\n";
  print "</DIV>\n";
  &html_footer;
  exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [削除処理 1]
sub delete1 {
  if ($FORM{'pass'} ne $master_pass | $FORM{'pass'} eq '') { &error("パスワードが違います"); }
  if ($FORM{'pass'} eq $master_pass) {
    &html_header;

# 投稿記事削除終了
    print "<DIV ALIGN=right>[<A HREF=\"$cgifile\">削除モードを終了する</A>]</DIV>\n";

    print "<CENTER>\n";
    print "<TABLE WIDTH=80% BORDER=0><TR><TD>\n";
    print "◆ツリー記事（レス含む）を削除する場合は、メイン記事をチェックして下さい。<BR>\n";
    print "◆レス記事を削除する場合は、完全には削除されません。<BR>\n";
    print "</TD></TR></TABLE><BR>\n";
    @DATA = &read_file($datafile);
    $max = @DATA;

    print "<FORM ACTION=\"$cgifile\" METHOD=\"post\">\n";

# 記事の表示
    print "<CENTER>\n";
    print "<TABLE WIDTH=95% BORDER=0><TR><TD>\n\n";
    for ($i = 0;$i<$max;$i++) {
      chop($DATA[$i]);
      @DATAS = split(/★/,$DATA[$i]);
      foreach (@DATAS) {
        local($number,$mx,$rx,$sp,$date,$sc,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$_);
        $name  =~ s/\0/☆/g;
        $title =~ s/\0/☆/g;
        $com   =~ s/\0/☆/g;
        if ($mx eq 'main') {
          print "<DIV ALIGN=center><TABLE WIDTH=100% BORDER=0>";
          print "<TR><TD><INPUT TYPE=checkbox NAME=\"get\" value=\"$number\"> ";
          print "[$title] [$name] [$date]</TD></TR>";
          print "</DIV></TABLE>\n";
        } else {
          $wid = (100 - $sp*2.5);
          print "<DIV ALIGN=right><TABLE WIDTH=$wid% BORDER=0>";
          print "<TR><TD><INPUT TYPE=checkbox NAME=\"get\" value=\"$number\"> ";
          if ($title eq '管理者によって削除') {
            print "<FONT COLOR=$del_color>[$title] [$name] [$date]</FONT></TD></TR>";
          }
          else {
            print "[$title] [$name] [$date]</TD></TR>";
          }
          print "</DIV></TABLE>\n";
        }
      }
      print "<HR SIZE=1>\n\n";
    }
    print "</TABLE><BR><BR>\n\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"pass\" VALUE=\"$FORM{'pass'}\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"ac\" VALUE=\"delete\">\n";
    print "<INPUT TYPE=\"hidden\" NAME=\"get\" VALUE=\"$number\">\n";
    print "<INPUT TYPE=\"submit\" VALUE=\"　削除　\"><INPUT TYPE=\"reset\" VALUE=\"リセット\">\n";
    print "</FORM>\n";

  print "</TD></TR></TABLE>\n";
      print "</CENTER>\n\n";
    &html_footer;
    exit;
  }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [削除処理 2]
sub delete2 {

  if ($FORM{'pass'} ne $master_pass | $FORM{'pass'} eq '') { &error(""); }
  if ($FORM{'pass'} eq $master_pass) {

    # ロック開始
    if($lock_mode == 1) { &lock1; }
    elsif ($lock_mode == 2) { &lock2; }

# 現在時間の取得
    ($dates,$sc) = &time;

    foreach $log (@DATA) {
      local($no,$kizi) = split(/☆/,$log);
      $m_no = $no;
      if (!$get{$m_no}) { push(@NEW,$log); }
    }
    &write_file($datafile,@NEW);    #ファイル更新

    foreach $logs (@NEW) {
      @NEWS = split(/★/,$logs);
      $t_date = "";
      $f = 0;
      foreach (@NEWS) {
        local($number,$mx,$rx,$sp,$date,$sc,$name,$title,$mail,$hpurl,$com,$rehost,$agent) = split(/☆/,$_);
        $del_date = "$number☆$mx☆$rx☆$sp☆$dates☆☆管理者☆管理者によって削除☆☆☆都合により削除されました☆$rehost☆$agent";
        $r_no = $number;
        if ($f) { $t_date .= "★"; }
        if($get{$r_no}) { $t_date .= $del_date; }
        else { $t_date .= $_; }
        $f = 1;
      }
      $t_date =~ s/\n//;
      push(@N_NEW,"$t_date\n");
    }
    &write_file($datafile,@N_NEW);    #ファイル更新
    # ロック解除
    &fileunlock;
  }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [クッキー関連処理]
# クッキー取得
sub read_cookie {
  local($cookies) = $ENV{'HTTP_COOKIE'};
  local($pair,%DUMMY);
  local(@pairs) = split(/;/,$cookies);
  foreach $pair (@pairs) {
    local($name,$value) = split(/=/,$pair);
    $name =~ s/ //g;
    $DUMMY{$name} = $value;
  }
  @pairs = split(/,/,$DUMMY{$cookie_name});
  foreach $pair (@pairs) {
    local($name,$value) = split(/#/,$pair);
    $COOKIE{$name} = $value;
  }
}

# クッキー記録
sub set_cookie {
# クッキーの有効期限を３０日にする
  local($csec,$cmin,$chour,$cmday,$cmon,$cyear,$cwday) = gmtime(time + 30*24*60*60);
  $cyear = $cyear + 1900;
  $cmday = sprintf("%.2d",$cmday);
  $chour = sprintf("%.2d",$chour);
  $cmin = sprintf("%.2d",$cmin);
  $csec = sprintf("%.2d",$csec);
  $cmon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$cmon];
  $cwday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$cwday];
  $date_gmt = "$cwday, $cmday\-$cmon\-$cyear $chour:$cmin:$csec GMT";
  local($cook) = "name\#$FORM{'name'}\,mail\#$FORM{'mail'}\,hpurl\#$FORM{'hpurl'}";
  print "Set-Cookie: $cookie_name=$cook; expires=$date_gmt\n";
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [フォームデータを取得し、文字コード統一]
sub read_form {
  local($pair,$form_date);
  if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form_date, $ENV{'CONTENT_LENGTH'}); }
  else { $form_date = $ENV{'QUERY_STRING'}; }
  local(@pairs) = split(/&/,$form_date);
  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');
    if ($name eq 'get') { $get{$value} = 1; }
    else { $FORM{$name} = $value; }
  }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ブラウザチェック]
sub bura_check{
  $ad_width = 50; $name_width = 20; $com_width = 65;
  $agent = $ENV{'HTTP_USER_AGENT'};
  if ($agent =~ /MSIE 3/i || $agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
    $ad_width = $ad_width * 1.2;
    $name_width = $name_width * 1.5;
    $com_width = $com_width * 1.05;
  }
  return ($ad_width,$name_width,$com_width);
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [現在時刻を取得]
sub time{
  $ENV{'TZ'} = "JST-9";
  ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime();
  $year = $year + 1900;
  $mon = sprintf("%.2d",$mon +1);
  $mday = sprintf("%.2d",$mday);
  $hour = sprintf("%.2d",$hour);
  $min = sprintf("%.2d",$min);
  $sec = sprintf("%.2d",$sec);
# 曜日を日本語化
  @week = ('日','月','火','水','木','金','土');
  $wday = $week[$wday];
  local($date) = "$year年$mon月$mday日($wday) $hour時$min分$sec秒";
  $sc = time;
  return ($date,$sc);
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [エラー関連]
sub error {
  $error = $_[0];

  print "Content-type: text/html\n\n";
  print "<html><head><title>$error_message</title></head>\n";
  print "<BODY bgcolor=ffffff text=000000>\n";
  print "<BR><BR><BR><CENTER>\n\n";
  print "<TABLE BORDER=0>\n";
  print "<TR><TD BGCOLOR=#FFCCCC WIDTH=70 ALIGN=center>\n";
  print "<FONT SIZE=4><B>エラー</B></FONT></TD>\n\n";
  print "<TD BGCOLOR=#FFCC99 WIDTH=500 ALIGN=center>\n";
  print "<FONT SIZE=4><B>$error</B></FONT></TD></TR>\n";
  print "</TABLE>\n";
  print "</CENTER>\n\n";
  print "</BODY></HTML>\n";
  # ロック解除
  &fileunlock;
  exit;
}
