#!/usr/bin/perl
use strict;

#---
#[BBS.CGI] by eucalyptus. 2002.
#---
use vars qw($version $read_cgi $bbs_cgi $expires $imode_flag $proxy_flag $setting_path $setting2_path $i_read_cgi $reload $temp_path $remake_flag $id_flag $sc_name);
$version = "1.0.0";
$sc_name = "Your BBS Name";
$read_cgi = "/test/read.cgi";
$i_read_cgi = "/test/ir.cgi";
$bbs_cgi = "/test/bbs.cgi";
$setting_path = "./setting";
$setting2_path = "./setting2";
$temp_path = "./temp";
$| = 1;

#タイムゾーン設定/シグナル設定
{ $ENV{'TZ'} = "JST-9"; }
sub SigExit { exit(0); }
{ $SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit"; }

#FORMからブツを取り出す POST対応
use vars qw(%FORM %SETTING %THREAD);
{
 my $buffer;
 my (@pairs, $name, $value);
 if ($ENV{'REQUEST_METHOD'} eq "POST") {
  read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
   @pairs = split /&/,$buffer;
   $buffer = '';
   foreach (@pairs) {
    ($name, $value) = split /=/;
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg;
    $value =~ s/</&lt;/g;
    $value =~ s/>/&gt;/g;
    $value =~ s/\"/&quot;/g;
    $value =~ s/\r\n|\r|\n/<br>/g;
    $value =~ s/<br>/ <br> /g;
    $FORM{$name} = $value;}}
}

#板名がおかしいかテスト
if ("$FORM{'bbs'}" eq ""){disperror("板の名前が指定されていません。");}
if ($FORM{'bbs'} =~ /\W/){disperror("板の名前に使用出来ない文字が含まれています。");}
if ((length($FORM{'bbs'})) > 10){disperror("板の名前が長すぎます。");}
#本文が空かテスト
if (!$FORM{'MESSAGE'}){disperror("本文がありません。");}

#timeとFLAGと板名に変数を保存
{
 use vars qw($NOWTIME $current_bbs $HOST $disp_bbs);
 $NOWTIME = time;
 $current_bbs = $FORM{'bbs'};
 $disp_bbs = $FORM{'bbs'};
 $FORM{'FROM2'} = $FORM{'FROM'};
 $FORM{'mail2'} = $FORM{'mail'};
}

#リメーク処理
{
 if ($FORM{'mail'} eq "__TSU-KU-RI-KA-E"){
  $remake_flag = 1;
  $FORM{'mail'} = "sage";
  subject_output ("$current_bbs");
  print "Content-Type: text/html;\n\n<html><body>$current_bbs リメイク完了．</body></html>";exit;}
}

#日付設定/ID生成
use vars qw($ID $DATE $DISP_DATE);
{
 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($NOWTIME);
 $wday = ("日", "月", "火", "水", "木", "金", "土")[$wday];
 $DATE = sprintf("%04d/%02d/%02d(%s) %02d:%02d",$year + 1900, $mon + 1, $mday, $wday, $hour, $min);
 $DISP_DATE = $DATE;
 $sec = $mon * 12 + $mday;
 ($mday, $wday, $hour, $min) = split(/\./,$ENV{'REMOTE_ADDR'});
 my $idnum = $mday + ($wday * 300) + ($hour * 500) + ($min * 1200);
 my $idcrypt = substr(crypt($idnum,$sec), -8); 
 $ID = " ID:".$idcrypt;
 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
 my $exp = 24 * 60 * 60; $exp *= 30;
 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime($NOWTIME + $exp);
 $wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday];
 $mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
 $year = $year+1900;$mday = "0$mday" if ($mday < 10);
 $expires = "$wday, $mday-$mon-$year 00:00:00 GMT";
}

#串チェック
##これは抜いたぞ

#携帯検出(i-mode / j-sky)
{
 $imode_flag = 0;
 if ($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/){$imode_flag=1;}
#ezweb
# if ($ENV{'HTTP_USER_AGENT'} =~ /UP.Browser/){disperror("hdml");}
 if ($ENV{'HTTP_USER_AGENT'} =~ /UP.Browser/){$imode_flag=1;}
 if ($ENV{'REMOTE_HOST'} =~ /skyweb/){$imode_flag=1;}
 if ("$ENV{'HTTP_X_JPHONE_MSNAME'}" ne ""){$imode_flag=1;}
}

#BBS設定情報読み込み
{
 my ($m_pass,$m_key,$m_value);
 $m_pass = $setting_path . "/" . $current_bbs . ".txt";
 undef %SETTING;
 if(-e $m_pass){
  open(FILE,$m_pass);
  foreach (<FILE>){
   $_ =~ s/\n//g;
   ($m_key,$m_value) = split /=/;
   $SETTING{$m_key} = $m_value;}
  close(FILE);
  }else{disperror("このサーバには、指定された板がありません。");}
 $reload = $SETTING{'INDEX_URL'};
}

#スレッド情報/datがあるかチェック/変数に代入
{
 if ($FORM{'subject'} eq ""){
  undef %THREAD;
  my ($m_pass,$m_key);
  $m_pass = $SETTING{'DAT_SETTING_PATH'} ."/" . $FORM{'key'} . ".txt";
  if(-e $m_pass){
   open(FILE,$m_pass);
   $m_key = <FILE>;
   close (FILE);
   ($THREAD{'subject'},$THREAD{'FLAG'},$THREAD{'BBS'},$THREAD{'COUNT'}) = split(/\t/,$m_key);
   }else{disperror("スレッド情報が見つかりません。");}
   if ($THREAD{'FLAG'} =~ /stop/){disperror("指定されたスレッドには、書き込むことが出来ません。");}
   $m_pass = $SETTING{'DAT_DATA_PATH'} ."/" . $FORM{'key'} . ".dat";
  if(-e $m_pass){}else{disperror("スレッドファイルが見つかりません。");}
  $current_bbs = $THREAD{'BBS'};
 }
}




#スレたてなのか、カキコミなのか/キー名処理
{
 if($FORM{'subject'} ne ""){
  if ($SETTING{'BBS_MAKE_THREAD'} eq "1"){disperror("この板には、スレッドを立てることができません。");}
  $FORM{'key'} = $NOWTIME;
 }else{
  if($FORM{'key'} =~ /\D/){disperror("スレッドの名前に使用出来ない文字が含まれています。");}
  if($FORM{'key'} eq ""){disperror("スレッド名がありません。");}
 }
}

#名前の設定
{
 if($SETTING{'NANASHI_CHECK'} eq 1 && $FORM{'FROM'} eq ''){
  disperror("名前を入れて下さい。");}
}

#datファイルサイズチェック
{
 my $keyfile = $SETTING{'DAT_DATA_PATH'} . "/" . $FORM{'key'} . ".dat";
 if(-s "$keyfile" > 512000) {disperror("スレッドサイズオーバーです。<br>&nbsp;指定されたスレッドには書き込めません。");}
}

#文字数制限
{
 if(length($FORM{'subject'}) > $SETTING{'BBS_SUBJECT_COUNT'}){
  disperror("スレッド名が長すぎます。");}
 if(length($FORM{'FROM'}) > $SETTING{'BBS_NAME_COUNT'}){
  disperror("名前が長すぎます。");}
 if(length($FORM{'mail'}) > $SETTING{'BBS_MAIL_COUNT'}){
  disperror("コマンドが長すぎます。");}
 if(length($FORM{'MESSAGE'}) > $SETTING{'BBS_MESSAGE_COUNT'}){
  disperror("本文が長すぎます。");}
}
#UNICODE対策/1行データからの改行削り
{
 $FORM{'FROM'} =~ s/&/&amp;/g;
 $FORM{'FROM'} =~ s/&amp;quot/&quot/g;
 $FORM{'mail'} =~ s/&/&amp;/g;
 $FORM{'mail'} =~ s/&amp;quot/&quot/g;
 $FORM{'subject'} =~ s/&/&amp;/g;
 $FORM{'subject'} =~ s/&amp;quot/&quot/g;

 if ($SETTING{'BBS_UNICODE'} ne "pass"){
  $FORM{'MESSAGE'} =~ s/&#[x0-9a-fA-F;]+/？/g;
 }
 $FORM{'FROM'} =~ s/<br>//g;
 $FORM{'mail'} =~ s/<br>//g;
 $FORM{'subject'} =~ s/<br>//g;
}

#スレッド名重複チェック/新スレ作成
{
 my (@thread_title,$th_title,$th_key,$th_id,$datpath,$THREAD_TITLE_LOG,$datpath,$th_id2,$th_id3,$th_id4,$counter);
 if($FORM{'subject'} ne "") {
  $th_id2 = $ID . "_" . $current_bbs;
  $THREAD_TITLE_LOG = $temp_path . "/threaddata.dat";
  $th_id3 = $FORM{'key'} - 120;
  $th_id4 = $FORM{'key'} - 3600;
  $counter=0;
  open(THLOG,"$THREAD_TITLE_LOG");
   while (<THLOG>){
    $_ =~ s/\n//g;
    ($th_key,$th_title,$datpath,$datpath,$th_id) = split(/\t/,$_);
    if ($th_title eq $FORM{'subject'}){
     disperror("同じ名前のスレッドがあります。");}
    if ($th_key eq $FORM{'key'}){
     disperror("同じキーのスレッドがあります。<br>&nbsp;リトライして下さい。");}    if ($th_key > $th_id3){
     disperror("error");}
    if ($th_id eq $th_id2){
     if ($th_key > $th_id4){
      $counter++;
      if ($counter > 2){disperror("error");}}
     if ($SETTING{'THREAD_TATESUGI'} eq "1"){
      disperror("error");}}
  }
  $FORM{'mail'} =~ s/stop//g;
  open(THLOG,">>$THREAD_TITLE_LOG");
  eval{flock(THLOG,2);};
  print THLOG $FORM{'key'} . "\t" . $FORM{'subject'} . "\t" . $FORM{'mail'} . "\t" . $current_bbs . "\t" . $th_id2 . "\n";
  close(THLOG);
  $THREAD{'subject'} = $FORM{'subject'};
  $THREAD{'FLAG'} = $FORM{'mail'};
  $THREAD{'BBS'} = $disp_bbs;
  $datpath = $SETTING{'DAT_DATA_PATH'} . "/".$FORM{'key'}.".dat";
  open(DAT,">$datpath");
  close (DAT);
  $datpath = $SETTING{'DAT_SETTING_PATH'} . "/".$FORM{'key'}.".txt";
  open(DAT,">$datpath");
  print DAT "$FORM{'subject'}\t$FORM{'mail'}\t$current_bbs\t0";
  close (DAT);
 }
}

#スレの板と書き込み元板チェック
{
 if($disp_bbs ne $THREAD{'BBS'}) {
  if($SETTING{'ROOT_BBS'} ne "") {
   disperror("その板からはこのスレッドには書き込めません。($disp_bbs $SETTING{'ROOT_BBS'} $THREAD{'BBS'} / ");}}
}

#------------------------------------------------------------------
#置き換え処理/オリジナル機能はこの下へ挿入しる！
#使える変数一覧： *がついてるのは読み込み専用
# $FORM{'MESSAGE'}	本文
# $FORM{'mail'}		コマンド欄
# $FORM{'FROM'}		名前
# $THREAD{'subject'}	スレ名
#*$THREAD{'FLAG'}	対象スレ1のコマンド欄 (ｽﾚｽﾄ時にはstopと入る)
#*$THREAD{'COUNT'}	スレの書き込み数(概算) / 最大+5くらいで考えて
#*$THREAD{'BBS'}	スレの板名
# $THREAD{'S_FLAG'}	1を入れるとｽﾚｽﾄ/2を入れると上のﾔｼ書き込まずｽﾚｽﾄ
# $THREAD{'S_FROM'}	スレスト時名前
# $THREAD{'S_MAIL'}	スレスト時メール欄
# $THREAD{'S_MSG'}	スレスト時コメント
#*$disp_bbs		呼び出し元板
#*$ID			ID
#*$DATE			日時
# $id_flag		ID制御(文字列:ID欄/hidden:ID非表示/superhidden:強制非表示)
# $DISP_DATE		書き込み時の日時欄
# $THREAD{'N_FLAG'}	現在の書き込みの後に書くときは1
# $THREAD{'N_FROM'}	後付け時名前
# $THREAD{'N_MAIL'}	後付け時メール欄
# $THREAD{'N_DATE'}	後付け時日時欄
# $THREAD{'N_MSG'}	後付け時コメント
#------------------------------------------------------------------

#キャップとかの記号置き換え
$FORM{'FROM'} =~ s/★/☆/g;
$FORM{'FROM'} =~ s/◆/◇/g;
$FORM{'mail'} =~ s/★/☆/g;
$FORM{'mail'} =~ s/◆/◇/g;

#トリップ
{
if($FORM{'FROM'} =~ /([^\#]*)\#(.+)/){
 my $main_message = $1;
 my $key = $2;
 my $salt = substr($key."H.", 1, 2);
 $salt =~ s/[^\.-z]/\./go;
 $salt =~ tr/:;<=>?@[\\]^_`/ABCDEFGabcdef/;
 $key = substr(crypt($key, $salt),-8);
 if($main_message ne ""){
  $FORM{'FROM'} = "$main_message </b>◆$key <b>";
   }else{$FORM{'FROM'} = "</b> ◆$key <b>";}
}}
#キャップ
{
if($FORM{'mail'} =~ /([^\#]*)\#(.+)/){
 my $main_message = $1;
 my $key = $2;
 my $capfile = $setting2_path . "/capfile.txt";
 my ($name,$cap);
 open (FILE,"$capfile");
 eval{flock(FILE,2);};
 while (<FILE>){
  chop;
  ($name,$cap) = split(/###/,$_);
  if ($cap eq $key){
   if($FORM{'FROM'} ne ""){$FORM{'FROM'} = $FORM{'FROM'} . " ＠";}
   $FORM{'FROM'} = $FORM{'FROM'} . $name;
   last;
  }
 }
 close (FILE);
 if($main_message ne ""){
 $FORM{'mail'} = "$main_message";
 }else{$FORM{'mail'} = "";}
}}

##1のコマンド欄で何かが起こる系
#ID強制/隠し/任意
{
 if($THREAD{'FLAG'} =~ /ID=/){
  if($THREAD{'FLAG'} =~ /ID=d/){
   $id_flag = "ID:" . $ID;}
  elsif($THREAD{'FLAG'} =~ /ID=h/){
   $id_flag = "hidden";}
  elsif($THREAD{'FLAG'} =~ /ID=o/){
   $id_flag = "ID:???";
   if ($FORM{'mail'} eq ""){
    $id_flag = "ID:" . $ID;}}}
}

#強制名無し/名無し置き換え
{
 if($THREAD{'FLAG'} =~ /NANASHI/){
  $FORM{'FROM'} = "";
 }
 if($FORM{'FROM'} eq ""){
  $FORM{'FROM'} = $SETTING{'NANASHI_NAME'};
 }
}

#ふしあなさん
{
 if($SETTING{'FUSIANA_TRAP'} eq ""){
  $FORM{'FROM'} =~ s/fusianasan//g;}
 if($FORM{'FROM'} =~  /fusianasan/){
  my ($HOST,$HOST2);
  $HOST = $ENV{'REMOTE_ADDR'};
  if ($HOST =~ /\d$/) {
   $HOST = gethostbyaddr(pack('c4',split(/\./, $HOST)), 2) || $HOST;}
  if ($ENV{'HTTP_VIA'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/) {
   $HOST2 = $ENV{'HTTP_VIA'};}
  if ($ENV{'HTTP_X_FORWARDED_FOR'} =~ s/^(\d+)\.(\d+)\.(\d+)\.(\d+)(\D*).*/$1.$2.$3.$4/) {
   $HOST2 = $ENV{'HTTP_X_FORWARDED_FOR'};}
   if ($ENV{'HTTP_FORWARDED'} =~ s/.*\s(\d+)\.(\d+)\.(\d+)\.(\d+)/$1.$2.$3.$4/){
   $HOST2 = $ENV{'HTTP_FORWARDED'};}
  $HOST2 = gethostbyaddr(pack('c4', split(/\./, $HOST2)), 2);
  $HOST .= "<$HOST2>" if ($HOST2);
  $FORM{'FROM'} =~ s/fusianasan/<\/b>$HOST<b>/g;
 }
}

#強制age/sage/supersage
{
 if($THREAD{'FLAG'} =~ /AGE/){
  $FORM{'mail'} =~ s/supersage//g;
  $FORM{'mail'} =~ s/sage//g;}
 if($THREAD{'FLAG'} =~ /SUPERSAGE/){
   $FORM{'mail'} = $FORM{'mail'} . "super";}
 if($THREAD{'FLAG'} =~ /SAGE/){
   $FORM{'mail'} = $FORM{'mail'} . "sage";}
}

#名前の前にいろいろつける機能
{
 if($THREAD{'FLAG'} =~ /NAME/){
  my($logt,@logs,$tango,$ouen,$comnt);
  open(LOG,"$setting2_path/name.txt");
  @logs=<LOG>;
  close(LOG);
  $logt=@logs;# ログ数の代入
  $tango = int(rand($logt));
  $ouen = $logs[$tango];
  chop($ouen);
  $FORM{'FROM'}=$ouen.$FORM{'FROM'};
 }
}

#AA置き換え機能
{
 my ($aaflag,$aafile);
 if($SETTING{'AA_ENABLE'} eq "checked" && $THREAD{'FLAG'} !~ /AA=off/){$aaflag = 1;}
 if($SETTING{'AA_ENABLE'} eq "option" && $THREAD{'FLAG'} =~ /AA=on/){$aaflag = 1;}
 if($aaflag eq "1"){
  my ($aafile);
  if($FORM{'mail'} =~ /gikoippai/){
   if ($FORM{'MESSAGE'} =~ /.*<br>.*<br>.*<br>/){
    disperror("ギコいっぱいは、４行以上の書き込みには適\用出来ません。");}
   if ($FORM{'MESSAGE'} =~ /^ <br>/){
    disperror("ギコいっぱいは、空白行には適\用出来ません。");}
   if ($FORM{'MESSAGE'} =~ /<br>( |　)+<br>/){
    disperror("ギコいっぱいは、空白行には適\用出来ません。");}
   $FORM{'MESSAGE'} =~ s/<br>/<br>\tUU￣￣\tU U\t\t＼＿＿＿＿＿＿＿＿＿＿＿＿＿<br>　　　　　　∧ ∧　 ／￣￣￣￣￣￣￣￣￣￣￣￣￣<br>〜′￣￣( ﾟДﾟ)＜　 /g;
   $FORM{'MESSAGE'} = "　　　　　　∧ ∧　 ／￣￣￣￣￣￣￣￣￣￣￣￣￣<br>〜′￣￣( ﾟДﾟ)＜　 $FORM{'MESSAGE'}<br>\tUU￣￣\tU U\t\t＼＿＿＿＿＿＿＿＿＿＿＿＿＿";
   $FORM{'MESSAGE'} =~ s/\t/　/g;}
  elsif($FORM{'mail'} =~ /chigyo/){
   my ($aalen,$aaline,@aalines);
   if ($FORM{'MESSAGE'} =~ /.*<br>/){
    disperror("稚魚AA\機\能\は、２行以上の書き込みには適\用出来ません。");}
   if ($FORM{'MESSAGE'} eq " "){
    disperror("１行目が空白です。稚魚AA\機\能\を適\用出来ません。");}
   $FORM{'MESSAGE'} =~ s/<br>.*$//g;
   $FORM{'MESSAGE'} =~ s/<br>//g;
   if(length($FORM{'MESSAGE'}) > 50){
    disperror("1行の長さが50(全角25)文字以上あります。稚魚AA\機\能\を適\用出来ません。");}

   @aalines = ("　／∪＼","　∧　∧","　／■＼");
   $aalen = int(rand(3));
   $aaline = $aalines[$aalen] . "<br>";
   @aalines = ("∋　・Д・）","∋ 　 ﾟﾊﾟ ）","∋　・ゐ・）","∋　・∀・）","∋　´Д｀）","∋　´∀｀）","∋ *・∀・）","∋　 ﾟДﾟ)");
   $aalen = int(rand(8));
   $aaline = $aaline . $aalines[$aalen] . " 　". $FORM{'MESSAGE'} . "<br>";
   $aalen = int(rand(5));
   if ($aalen > 1){
    @aalines = ("　∂ 魚)ｅ","　∂ 老)ｅ","　∂ ゑ)ｅ","　∂ 影)ｅ");
    $aalen = int(rand(4));
    $aaline = $aaline . $aalines[$aalen]  . "<br>";
   }
   $aalen = int(rand(4));
   if ($aalen > 2){$aaline = $aaline . "　　┃┃<br>";}
   $FORM{'MESSAGE'} = $aaline . "　　┛┗ ";
   $FORM{'MESSAGE'} =~ s/\t/　/g;}
  else{
   if($FORM{'mail'} =~ /fuwafuwa/){$aafile = "fuwafuwa";}
   if($FORM{'mail'} =~ /seito/){$aafile = "seito";}
   if($FORM{'mail'} =~ /sakuratan/){$aafile = "sakuratan";}
   if("$aafile" ne ""){
    if ($FORM{'MESSAGE'} =~ /.*<br>/){
     disperror("AA置き換え機能は、２行以上の書き込みには適\用出来ません。");}
    if ($FORM{'MESSAGE'} eq " "){
     disperror("１行目が空白です。AA置き換え\機\能\を適\用出来ません。");}
    $FORM{'MESSAGE'} =~ s/<br>.*$//g;
    $FORM{'MESSAGE'} =~ s/<br>//g;
    if(length($FORM{'MESSAGE'}) > 50){
     disperror("1行の長さが50(全角25)文字以上あります。AA置き換え\機\能\を適\用出来ません。");}
    my ($aalen,$aalen2,$aaline,@aalines);
    $aafile = $setting2_path . "/" . $aafile . ".txt";
    open (FILE,"$aafile");
    eval{flock(FILE,2);};
    @aalines = <FILE>;
    close (FILE);
    $aalen2 = $#aalines;$aalen2++;
    $aalen = int(rand($aalen2));
    $aaline = $aalines[$aalen];
    $aaline =~ s/\[message\]/$FORM{MESSAGE}/g;
    $FORM{'MESSAGE'} = "$aaline";
    $FORM{'MESSAGE'} =~ s/\r//g;
    $FORM{'MESSAGE'} =~ s/\n//g;
   }
  }
 }
}


#レスポンスアンカー
{
 $FORM{'MESSAGE'} =~ s/&gt;&gt;([0-9]+)(?![-\d])/<a href="$read_cgi\/$FORM{'bbs'}\/$FORM{'key'}\/$1" target="_blank">&gt;&gt;$1<\/a>/g;
 $FORM{'MESSAGE'} =~ s/&gt;&gt;([0-9]+)\-([0-9]+)/<a href="$read_cgi\/$FORM{'bbs'}\/$FORM{'key'}\/$1-$2" target="_blank">&gt;&gt;$1-$2<\/a>/g;
}

#------------------------------------------------------------------
#ここまで
#------------------------------------------------------------------

#ID
{
 if($SETTING{'DISP_ID'} eq "optional"){
  if ($id_flag eq ""){
   $id_flag = "ID:???";
   if ($FORM{'mail'} eq ""){$id_flag = $ID;}}}
 if($id_flag eq "hidden"){$id_flag = "";}
 if ($SETTING{'DISP_ID'} eq "checked"){
  $id_flag = $ID;}
 if($id_flag ne ""){$DISP_DATE = $DATE . " " .$id_flag;}
 if ($id_flag eq "superhidden"){$DISP_DATE = $DATE;}
}

#クッキードゾー
{
 if($imode_flag ne "1"){
  if($SETTING{'BBS_NAMECOOKIE_CHECK'} eq "checked"){
   print "Set-Cookie: NAME=$FORM{'FROM2'}; expires=$expires; path=/\n";}
  if($SETTING{'BBS_MAILCOOKIE_CHECK'} eq "checked"){
   print "Set-Cookie: MAIL=$FORM{'mail2'}; " if ($FORM{'mail'} !~ /NANASI/ && $FORM{'mail'} !~ /LIMIT/);
   print "expires=$expires; path=/\n";
  }
 }
}
#threaddata.datを使ってファイルロック
open(THLOG,">>./temp/threaddata.dat");
eval{flock(THLOG,2);};

#再びスレッドデータ読み込み
{
 my ($m_pass,$m_key);
 $m_pass = $SETTING{'DAT_SETTING_PATH'} . "/" . $FORM{'key'} . ".txt";
 if(-e $m_pass){
  open(MPASS,$m_pass);
  $m_key = <MPASS>;
  close (MPASS);
  ($THREAD{'subject'},$THREAD{'FLAG'},$THREAD{'BBS'},$THREAD{'COUNT'}) = split(/\t/,$m_key);
  }else{disperror("スレッド情報が見つかりません。");}
  if ($THREAD{'FLAG'} =~ /stop/){disperror("指定されたスレッドには、書き込むことが出来ません。");}
}

#dat吐き出し
{
 my $datafile = $SETTING{'DAT_DATA_PATH'} . "/"  . $FORM{'key'} . ".dat";
 open(OUT, ">> $datafile");
 eval{flock(OUT,2);};
 if ($THREAD{'S_FLAG'} ne "2"){
  $THREAD{'COUNT'}++;
  print OUT "$FORM{'FROM'}<>$FORM{'mail'}<>$DISP_DATE<> $FORM{'MESSAGE'} <>$FORM{'subject'}\n";}
 if ($THREAD{'N_FLAG'} eq "1"){
  $THREAD{'COUNT'}++;
  print OUT "$THREAD{'N_FROM'}<>$THREAD{'N_MAIL'}<>$THREAD{'N_DATE'}<> $THREAD{'N_MSG'} <>\n";}
 if ($THREAD{'S_FLAG'} eq "1"){
  $THREAD{'COUNT'}++;
  print OUT "$THREAD{'S_FROM'}<>$THREAD{'S_MAIL'}<>$THREAD{'S_DATE'}<> $THREAD{'S_MSG'} <>\n";}
 if ($THREAD{'S_FLAG'} eq "2"){
  $THREAD{'COUNT'}++;
  print OUT "$THREAD{'S_FROM'}<>$THREAD{'S_MAIL'}<>$THREAD{'S_DATE'}<> $THREAD{'S_MSG'} <>\n";}
# Over 1000 Thread
 if ($THREAD{'COUNT'} > 999) {
  print OUT "LIMIT<><>LIMIT<> 1000突破！ <br> 続きは新しいスレッドで・・・。 <>\n";
  $THREAD{'COUNT'}++;
  $THREAD{'S_FLAG'} = "1";}
 close(OUT);
}
#スレッドデータ書き出し
{
  my ($m_pass,$m_key);
  $m_pass = $SETTING{'DAT_SETTING_PATH'} . "/" . $FORM{'key'} . ".txt";
  if ($THREAD{'S_FLAG'} eq "1"){$THREAD{'FLAG'}= $THREAD{'FLAG'} . " stop";}
  open(MPASS,">$m_pass");
  eval{flock(MPASS,2);};
  print MPASS $THREAD{'subject'} . "\t" . $THREAD{'FLAG'} . "\t" . $THREAD{'BBS'} . "\t" . $THREAD{'COUNT'};
  close (MPASS);
}

#サブジェクトとか作成
{
 my $sub_flag = $SETTING{'ROOT_BBS'};
 subject_output ("$current_bbs");
 if ($sub_flag ne ""){
  subject_output ("$sub_flag");
 }
 if ($disp_bbs ne $current_bbs){
  subject_output ("$disp_bbs");
 }
}

#統計データの書き込み
{
 my $RES_LOG = $temp_path . "/resdata.dat";
 open(RESLOG,">>$RES_LOG");
 eval{flock(RESLOG,2);};
 print RESLOG $NOWTIME . "\t" . $current_bbs . "\t" . $ID . "\n";
 close(RESLOG);
}

#threaddata.datを使ってファイルアンロック
close(THLOG);

#インフォ表示
{
 if ($ENV{'HTTP_USER_AGENT'} =~ /kage/){
  print "Status: 302 Moved Temporarily\n"; 
  print "Location: /$disp_bbs/index.html \n\n";}

 elsif ($ENV{'HTTP_USER_AGENT'} =~ /Katjusha/){
  print "Status: 302 Moved Temporarily\n"; 
  print "Location: /$disp_bbs/index.html \n\n";}
 elsif ($ENV{'HTTP_USER_AGENT'} =~ /Indy Lib/){
  print "Content-Type: text/html;\n\n<html><head><title>書きこみました。</title><meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><META content=5;URL=/ http-equiv=refresh></head><body>書きこみが終わりました。<br><br>画面を切り替えるまでしばらくお待ち下さい。<br><br><br><br><br><hr></body></html>\n\n";exit;}
 elsif ($ENV{'HTTP_USER_AGENT'} =~ /onazilla/){
  print "Content-Type: text/html; charset=shift_jis\n\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><title>書き込み終了 - $sc_name </title></head><body bgcolor=\"#EFEFEF\"><b><font>■書き込みました。</font></b><hr><font style=\"font-size:9pt\">&nbsp;&nbsp;Monazillaツールを検出しました。<br>&nbsp;&nbsp;書き込み確認：<a href=\"http://$ENV{'SERVER_NAME'}/$disp_bbs/index.html\">indexへ</a> / <a href=\"http://$ENV{'SERVER_NAME'}$read_cgi/$disp_bbs/$FORM{'key'}/l5\">書き込んだスレッドへ</a>。<br><br><br><br><br></font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";exit;

 }
 elsif ($ENV{'HTTP_USER_AGENT'} =~ /Hotzonu/){
  print "Content-Type: text/html; charset=shift_jis\n\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><title>書き込み終了 - $sc_name</title></head><body bgcolor=\"#EFEFEF\"><b><font>■書き込みました。</font></b><hr><font style=\"font-size:9pt\">&nbsp;&nbsp;Hotzonuを検出しました。<br>&nbsp;&nbsp;書き込み確認：<a href=\"http://$ENV{'SERVER_NAME'}/$disp_bbs/index.html\">indexへ</a> / <a href=\"http://$ENV{'SERVER_NAME'}$read_cgi/$disp_bbs/$FORM{'key'}/l5\">書き込んだスレッドへ</a>。<br><br><br><br><br><br>";
 if ($SETTING{'INDEX_AD_3'} ne ""){
  open (IN,$SETTING{'INDEX_AD_3'});
  while (<IN>) { print; }
  close (IN);}
  print "</font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";exit;
 }
  elsif ($imode_flag eq "1"){
  print "Content-Type: text/html;\n\n<html><head><title>書込終了</title></head><body<b>■書込み終了<hr><a href=\"/$disp_bbs/i/\">スレ一覧へ</a></body></html>";exit;}
  else{
  my $jump = "http://$ENV{'SERVER_NAME'}/$disp_bbs/index.html";
  if ($ENV{'HTTP_REFERER'} =~ /read.cgi/){
   if ($FORM{'resno'} eq ""){$FORM{'resno'} = "l5";}
   $jump = "http://$ENV{'SERVER_NAME'}$read_cgi/$disp_bbs/$FORM{'key'}/$FORM{'resno'}";}
  print "Content-Type: text/html; charset=shift_jis\n\n<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><META content=1;URL=$jump http-equiv=refresh><title>書き込み終了 - $sc_name</title></head><body bgcolor=\"#EFEFEF\"><b><font>■書き込みました。</font></b><hr><font style=\"font-size:9pt\">&nbsp;&nbsp;そのまましばらくお待ち下さい。<br><br><br><br>";
 if ($SETTING{'INDEX_AD_3'} ne ""){
  open (IN,$SETTING{'INDEX_AD_3'});
  while (<IN>) { print; }
  close (IN);}
  print "</font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";exit;
 }
}
exit;

#サブジェクト作成のサブルーチン
sub subject_output {

#subject.txt読み出し/順番並び替え
 my ($target_bbs)=@_;
 my ($m_pass,$m_key,$m_value,$temp1,$temp2);
 $m_pass = $setting_path . "/" . $target_bbs . ".txt";
 undef %SETTING;
 if(-e $m_pass){
  open(FILE,$m_pass);
  foreach (<FILE>){
   $_ =~ s/\n//g;
   ($m_key,$m_value) = split /=/;
   $SETTING{$m_key} = $m_value;}
  close(FILE);
  }else{disperror("このサーバには、指定された板がありません。");}
 my (@sub_array,$subject,$file,$value,%INDEX,$filename,$count,$count2,$count3,$name,$mail,$time,$message,$subject,$count4,$flag_,$keyfile,$line,$start,$end,$mailto,$next_th,$count_temp);
 my $th_title = $THREAD{'subject'} . " (" . $THREAD{'COUNT'} . ")";
 my $target_datname = $FORM{'key'} . ".dat";
 my $record = $target_datname . "<>" . $th_title;
 my $subject = $SETTING{'SUBJECT_PATH'} .  "/subject.txt";
 undef @sub_array;
 $next_th = 2;
 if ($FORM{'subject'} ne ""){
  push(@sub_array,$record);
   $next_th = 0;}
  elsif ($FORM{'mail'} !~ /sage/){
   push(@sub_array,$record);
    $next_th = 0;}
 open(SUBR,"$subject");
 eval{flock(SUBR,1);};
 $count4 = -1;
 while(<SUBR>){
  $_ =~ s/\n//g;
  ($file, $value) = split /<>/;
  unless($file){next;}
  $filename = $SETTING{'DAT_DATA_PATH'} . "/" . $file;
  if(-e $filename){
   $count4++;
   if ($count4 == $SETTING{'BBS_MAX_LIVE_THREAD'}){last;}
   if ($count4 == $SETTING{'BBS_MAX_MENU_THREAD'}){
    if ($next_th == 2){push(@sub_array,$record);$next_th = 0;}}
   if ($file ne $target_datname){
    push(@sub_array,$_);
    if ($next_th == 1){
     push(@sub_array,$record);
     $next_th = 0;
    }
  }else{
   if ($next_th != 0){
    if ($FORM{'mail'} =~ /supersage/){
     $next_th = 1;
     next;}
    elsif ($FORM{'mail'} =~ /sage/){
     push(@sub_array,$record);
     $next_th = 0;}
    }
   }
  }
 }
 close(SUBR);
 if ($next_th == 1){
  push(@sub_array,$record);
  $next_th = 0;
 }

#subject.txt書き出し
if ($remake_flag ne "1"){
  open(SUBR,">$subject");
  eval{flock(SUBR,2);};
  $, = "\n";
  print SUBR @sub_array;
  $, = "";
  print SUBR "\n";
  close (SUBR);
 }else{
  undef @sub_array;
  open(SUBR,"$subject");
  eval{flock(SUBR,1);};
  while(<SUBR>){
   $_ =~ s/\n//g;
   ($file, $value) = split /<>/;
   unless($file){next;}
   $filename = $SETTING{'DAT_DATA_PATH'} . "/" . $file;
   if(-e $filename){
    push(@sub_array,$_);
  }}
 close(SUBR);
 }
#suball.html書き出し判定
 my $suball = $SETTING{'SUBJECT_PATH'} . "/suball.html";
 ($temp1) = (stat($suball))[9];
 $temp2 = $NOWTIME - 10800;
 if ($remake_flag eq "1"){$temp1 = 1;}
 if ($temp1 < $temp2){&thread_all($target_bbs);}

#統計情報書き出し判定
 my $STAT_LOG = $temp_path . "/stat_" . $target_bbs . ".dat";
 ($temp1) = (stat($STAT_LOG))[9];
 $temp2 = $NOWTIME - 30;
 if ($remake_flag eq "1"){$temp1 = 1;}
 if ($temp1 < $temp2){&stat_out($target_bbs);}

#i-mode用HTML書き出し
 my $index = $SETTING{'SUBJECT_PATH'}  . "/i/index.html";
 open(SUBR,">$index");
 eval{flock(SUBR,2);};
 print SUBR "<HTML><HEAD><base href=\"http://".$ENV{'SERVER_NAME'}.$i_read_cgi."/". $target_bbs . "/\"><TITLE>".$target_bbs ."\@$sc_name</TITLE></HEAD>$sc_name<hr>$SETTING{'BBS_TITLE'}<hr>";



 if ($SETTING{'INDEX_AD_IMODE'} ne ""){
  open (IN,$SETTING{'INDEX_AD_IMODE'});
  while (<IN>) { print SUBR; }
  close (IN);}
  $count = 0;
  foreach (@sub_array){
  $count++;
  ($file, $value) = split /<>/;
  $file =~ s/.dat//g;
  print SUBR $count . ":<A HREF=\"". $file . "/l10\">".$value ."</a><br>";
  if ($count > 30){last;}
 }
 $count++;
  print SUBR "<br>".$count . ":<A HREF=\"New_thread\">新ｽﾚを立てる</a><br>";
 print SUBR "<hr></BODY></HTML>";
 close (SUBR);

#subback.html書き出し
 my $subback = $SETTING{'SUBJECT_PATH'}  . "/subback.html";
 my $count = 0;
 open(SUBR,">$subback");
 eval{flock(SUBR,2);};
 print SUBR "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<HTML lang=\"ja\">\n<HEAD>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n<META http-equiv=\"Content-Style-Type\" content=\"text/css\">\n<META http-equiv=\"pragma\" content=\"no-cache\">\n<TITLE>".$SETTING{'BBS_TITLE'} . "</TITLE></HEAD><BODY TEXT=#000000 link=#0000CC alink=#FF0000 vlink=#AA0088><font style=\"font-size:12pt\">";
  print SUBR "[<b> $SETTING{'BBS_TITLE'} スレッド一覧 </b>] / [<A HREF=\"/" . $target_bbs . "/index.html\">掲示板へ戻る</a>] / [<A HREF=\"/" . $target_bbs . "/suball.html\">全スレッド一覧</a>]&nbsp<hr>";

  foreach (@sub_array){
  $count++;
  ($file, $value) = split /<>/;
  $file =~ s/.dat//g;
  print SUBR "<A HREF=\"" . $read_cgi . "/" . $target_bbs . "/" . $file . "/l50\" target=\"_blank\">" . $count . ": " . $value . "</a><br>";
 }
  $count++;
  print SUBR "<br><A HREF=\"/" . $target_bbs . "/suball.html\">" . $count . ": 全てのスレッドを\表\示</a><br>";
 print SUBR "<br><br></font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS THREAD INDEX / MADE BY BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";
 close (SUBR);

#index.html読み出し/書き込み
 my $index = $SETTING{'SUBJECT_PATH'}  . "/index.html";
  if ($remake_flag ne "1"){
  open(SUBR,"$index");
  eval{flock(SUBR,1);};
  undef %INDEX;
  while(<SUBR>){
   if ($_ !~ /^<!--th_id:/){next;}
   $_ =~ s/<!--th_id://g;
   ($file, $value) = split (/-->/,$_);;
   $INDEX{$file} = $value ;
  }
  close(SUBR);
 }
 open(SUBR,">$index");
 eval{flock(SUBR,2);};
 print SUBR "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<HTML lang=\"ja\"><HEAD><META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><META http-equiv=\"Content-Style-Type\" content=\"text/css\"><META http-equiv=\"pragma\" content=\"no-cache\"><SCRIPT LANGUAGE=\"JavaScript\"><!--\nName = getCookie(\"NAME\");Mail = getCookie(\"MAIL\");function getCookie(key, tmp1, tmp2, xx1, xx2, xx3) {tmp1 = \" \" + document.cookie + \";\";xx1 = xx2 = 0;len = tmp1.length;while (xx1 < len) {xx2 = tmp1.indexOf(\";\", xx1);tmp2 = tmp1.substring(xx1 + 1, xx2);xx3 = tmp2.indexOf(\"=\");if (tmp2.substring(0, xx3) == key) {return(unescape(tmp2.substring(xx3 + 1, xx2 - xx1 - 1)));}xx1 = xx2 + 1;}return(\"\");}\n// --></SCRIPT><TITLE>$SETTING{'BBS_TITLE'}</TITLE></HEAD><BODY TEXT=\"#$SETTING{'BBS_TEXT_COLOR'}\" BGCOLOR=\"#$SETTING{'BBS_BG_COLOR'}\" link=\"#$SETTING{'BBS_LINK_COLOR'}\" alink=\"#$SETTING{'BBS_ALINK_COLOR'}\" vlink=\"#$SETTING{'BBS_VLINK_COLOR'}\" background=\"$SETTING{'BBS_BG_PICTURE'}\">";
 print SUBR "<br><center>";
 if($SETTING{'BBS_TITLE_LINK'} ne ""){ 
  print SUBR "<a href=\"$SETTING{'BBS_TITLE_LINK'}\" border=0>"; }
 if($SETTING{'BBS_TITLE_PICTURE'} ne ""){
  print SUBR "<IMG src=\"$SETTING{'BBS_TITLE_PICTURE'}\" border=\"0\">";
 }else{
  print SUBR "<h1>$SETTING{'BBS_TITLE'}</h1>";}
 if($SETTING{'BBS_TITLE_LINK'} ne ""){ print SUBR "</a>"; }
 print SUBR "<br><TABLE style=\"border:1px solid #666666;\" align=\"center\" width=\"95%\" cellspacing=\"0\" cellpadding=\"3\" bgcolor=\"$SETTING{'BBS_THREAD_BG_COLOR'}\">";
 print SUBR "<TR><TD><font style=\"font-size:10pt\">■<b>$SETTING{'BBS_TITLE'} at $sc_name</b>";
 if ($SETTING{'BBS_PROXY_CHECK'} eq "checked") {
  print SUBR " [PROXY監視中です]"; }
 print SUBR "<hr><DIV align=\"right\">[<a href=\"./i/\">for i-mode</a>]<a href=\"#menu\">■</a> <a href=\"#1\">▼</a></font></DIV><br>";
 open (IN,"$SETTING{'INDEX_HEAD'}");
 while (<IN>) { print SUBR "$_"; }
 close (IN);
 if ($SETTING{'BBS_MAKE_THREAD'} ne "1"){
  print SUBR "<TABLE align=\"center\" border=\"0\"><TR><form method=\"POST\" action=\"$bbs_cgi\"><TD nowrap ALIGN=\"right\">タイトル：</TD><TD COLSPAN=\"2\"><input type=\"text\" name=\"subject\" size=\"40\">　<input type=submit value=\"新規スレッド作成\" name=\"submit\"></TD></TR><TR><TD nowrap ALIGN=\"right\">名前：</TD><TD><SCRIPT Language=\"JavaScript\"><!--\n document.write(\"<INPUT TYPE=text NAME=FROM SIZE=20 VALUE=\");\n document.write(Name, \">\");\n // --></SCRIPT><NOSCRIPT><INPUT TYPE=text NAME=FROM SIZE=20></NOSCRIPT></TD><TD nowrap width=45%>E-mail<font size=\"1\">（省略可）</font>：<SCRIPT Language=\"JavaScript\"><!--\n document.write(\"<INPUT TYPE=text NAME=mail SIZE=20 VALUE=\");\n document.write(Mail, \">\");\n // --></SCRIPT><NOSCRIPT><INPUT TYPE=text NAME=mail SIZE=20></NOSCRIPT></TD><TD><br></TD></TR><TR><TD nowrap ALIGN=\"right\" VALIGN=\"top\">内容：</TD><TD COLSPAN=\"2\"><textarea rows=5 cols=60 wrap=OFF name=MESSAGE></textarea><input type=hidden name=bbs value=$target_bbs><input type=hidden name=time value=$NOWTIME></TD></form></TR></TABLE>";
 }
 print SUBR "<DIV align=\"left\">";
 print SUBR "<font style=\"font-size:10pt\" color=\"#$SETTING{'BBS_BG_COLOR'}\">";
 open (IN,$STAT_LOG);
 while (<IN>) { print SUBR; }
 close (IN);
 print SUBR "</font>";
 print SUBR "</TD></TR></TABLE>";
 if ($SETTING{'INDEX_AD_1'} ne ""){
  open (IN,$SETTING{'INDEX_AD_1'});
  while (<IN>) { print SUBR; }
  close (IN);}
 print SUBR "</DIV>\n";
 print SUBR "<A name=\"menu\"></A><TABLE style=\"border:1px solid #666666;\" cellspacing=\"0\" cellpadding=\"3\" width=\"95%\" align=\"center\" bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\"><TR><TD bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\"><font size=2\">";
 print SUBR "<TABLE style=\"border:1px solid #666666;\" cellspacing=\"0\" cellpadding=\"2\" width=\"100%\" bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\"><TR><TD bgcolor=\"#$SETTING{'BBS_THREAD_MENU_COLOR'}\"><font style=\"font-size:9pt\">■スレッド一覧</FONT></TD></TR></TABLE>";
 for (1.. $SETTING{'BBS_MAX_MENU_THREAD'}){
  $count_temp = $_ - 1;
  if ("$sub_array[$count_temp]" eq ""){last;}
   ($file, $value) = split(/<>/,$sub_array[$count_temp]);
   $file =~ s/.dat//g;
    if ($SETTING{'BBS_THREAD_NUMBER'} >= $_) {
     print SUBR "<A HREF=\"" . $read_cgi . "/" . $target_bbs . "/" . $file . "/l50\" target=\"_blank\">" . $_ . ": </a>";
     print SUBR "<A HREF=\"#$_\">" . $value . "</a>&nbsp;";
    }else {
     print SUBR "<A HREF=\"" . $read_cgi . "/" . $target_bbs . "/" . $file . "/l50\" target=\"_blank\">" . $_ . ": " . $value . "</a>&nbsp;";
    }
  }
 print SUBR "<div align=\"right\">[<a href=\"./subback.html\">スレッド一覧を表\示</a>]</TD></TR></TABLE>";
 if ($SETTING{'INDEX_AD_2'} ne ""){
  open (IN,$SETTING{'INDEX_AD_2'});
  while (<IN>) { print SUBR; }
  close (IN);}
 foreach $count (1 .. $SETTING{'BBS_THREAD_NUMBER'}){
 $count_temp = $count - 1;
  if ("$sub_array[$count_temp]" eq ""){last;}
  ($file, $value) = split(/<>/,$sub_array[$count_temp]);
  $file =~ s/.dat//g;
  $count2 = $count + 1;
  $count3 = $count - 1;
  if ($count2 > $SETTING{'BBS_THREAD_NUMBER'}){$count2 = 1;}
  if ($count3 < 1){$count3 = $SETTING{'BBS_THREAD_NUMBER'};}
  print SUBR "<A name=\"$count\"></A><TABLE style=\"border:1px solid #666666;\" cellspacing=\"0\" cellpadding=\"3\" width=\"95%\" align=\"center\" bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\"><TR><TD bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\">";
  print SUBR "<TABLE style=\"border:1px solid #666666;\" border=0 cellspacing=\"0\" cellpadding=\"2\" width=\"100%\" bgcolor=\"#$SETTING{'BBS_THREAD_BG_COLOR'}\"><TR><TD bgcolor=\"#$SETTING{'BBS_THREAD_MENU_COLOR'}\"><font color=\"#$SETTING{'BBS_SUBJECT_COLOR'}\">■ $value ($current_bbs)</FONT></TD><TD bgcolor=\"#$SETTING{'BBS_THREAD_MENU_COLOR'}\" align=\"right\"><A HREF=\"#menu\">■</A><A HREF=\"#$count3\">▲</A><A HREF=\"#$count2\">▼</A></FONT></TD></TR></TABLE><DL>";
  $flag_ = 1;
  if ($file ne $FORM{'key'}){
   if ($INDEX{$file} ne ""){
    print SUBR "\n<!--th_id:".$file."-->";
    print SUBR $INDEX{$file};$flag_ = 2;}}
  
  if ($flag_ eq "1"){
  print SUBR "\n<!--th_id:".$file."-->";
   if($value =~ /.*\((\d+)\)$/){$end="$1";}
   $start = $end - $SETTING{'BBS_INDEX_RES'} + 2;
   if ($start < 1) { $start = 2;}
   $keyfile = $SETTING{'DAT_DATA_PATH'} . "/" . $file . ".dat";
   open(DAT,"$keyfile");
   my @datdata = <DAT>;
   close (DAT);
   $count4 = 1;
   foreach (@datdata){
    $flag_ = 0;
    if ($count4 == 1){$flag_ = 1;}
    if ($count4 >= $start){$flag_ = 1;}
    if ($flag_ == 1){
     ($name,$mail,$time,$message,$subject) = split /<>/,$_;
     $message =~ s/(https?|ftp|gopher|telnet|whois|news):([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/g;
     if($mail ne ''){$mailto = "<a href=\"mailto:$mail\"><b>$name</b></a>";}
     else{$mailto = "<font color=\"#$SETTING{'BBS_NAME_COLOR'}\"><b>$name</b></font>";}
    my @messx = split(/<br>/,$message);
    my $messy = @messx;
    if($count4 != 1){
    if($messy > $SETTING{'BBS_LINE_NUMBER'}){
     $message = join('<br>',@messx[0 .. $SETTING{'BBS_LINE_NUMBER'}-1]);
     $message = $message . "<br><font color=\"#$SETTING{'BBS_NAME_COLOR'}\">（省略されました・・全てを読むには<a href=\"$read_cgi/$target_bbs/$file/$count4\" target=\"_blank\">ここ</a>を押してください）</font><br>";}}

     print SUBR "<dt>".$count4." 名前：".$mailto." <SMALL>[".$time."]</SMALL><dd>".$message."<br><br>";}
    $count4++;
   }
  }
  print SUBR "\n<dt><dd><form method=POST action=\"$bbs_cgi\"><input type=submit value=\"書き込む\" name=\"submit\">名前：<SCRIPT Language=\"JavaScript\"><!--\ndocument.write(\"<INPUT TYPE=text NAME=FROM SIZE=19 VALUE=\");document.write(Name, \">\");\n// --></SCRIPT><NOSCRIPT><INPUT TYPE=text NAME=FROM SIZE=19></NOSCRIPT>コマンド<font size=\"1\">（省略可）</font>：<SCRIPT Language=\"JavaScript\"><!--\ndocument.write(\"<INPUT TYPE=text NAME=mail SIZE=19 VALUE=\");document.write(Mail, \">\");\n// --></SCRIPT><NOSCRIPT><INPUT TYPE=text NAME=mail SIZE=19></NOSCRIPT><ul><textarea rows=5 cols=60 wrap=OFF name=MESSAGE></textarea></ul><input type=hidden name=bbs value=$target_bbs><input type=hidden name=key value=$file></form><br>";
 print SUBR "<b><A href=\"$read_cgi/$target_bbs/$file\">レスを全部読む</A> <A href=\"$read_cgi/$target_bbs/$file/l50\">最新レス５０</A> <A href=\"$read_cgi/$target_bbs/$file/-100\">レス１−１００</A> <A href=\"#menu\">スレッド一覧</a> <a href=\"/$target_bbs/\">リロード</A></b></form></DL></TD></TR></DL></TABLE><br>"
 }
 if ($SETTING{'INDEX_AD_3'} ne ""){
  open (IN,$SETTING{'INDEX_AD_3'});
  while (<IN>) { print SUBR; }
  close (IN);}
 print SUBR "<br><br></font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS INDEX / MADE BY BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";
 close (SUBR);

}

#スレ一覧生成
sub thread_all{
 my ($target_bbs)=@_;
 my (@dirdata,$dirline,$count1,$count2,$txtfile,@newarray,$m_key,$amtime,$asubject,$aFLAG,$aBBS,$aCOUNT,@sdirdata,$ma,$ba,$sa,$mb,$bb,$sb,$count,$afile);
 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
  ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($NOWTIME);
 $sec = sprintf("%04d/%02d/%02d %02d:%02d",$year + 1900, $mon + 1, $mday,  $hour, $min);
 $count1 = 0;
 $count2 = 0;
 opendir (DIR,"$SETTING{'DAT_DATA_PATH'}");
 @dirdata = readdir (DIR);
 closedir (DIR);
 foreach $dirline (@dirdata) {
  if ($dirline !~ /.dat/){next;}
  $txtfile = $SETTING{'DAT_SETTING_PATH'} . "/" . $dirline;
  $txtfile =~ s/\.dat/\.txt/g;
  if(-e $txtfile){
   open (FILE,$txtfile);
   $m_key = <FILE>;
   close (FILE);
   ($asubject,$aFLAG,$aBBS,$aCOUNT) = split(/\t/,$m_key);
   if ($SETTING{'ROOT_BBS'} ne ""){
   if ($aBBS ne $target_bbs){next;}}
   $amtime = $dirline;
   $amtime =~ s/.dat//g;
#ソートを最終書き込み順にする時は下のコメントをはずす
#   ($amtime) = (stat($txtfile))[9];
   $count1++;
   $count2 = $count2 + $aCOUNT;
   push(@newarray,"$amtime\t$dirline\t$asubject ($aCOUNT)");
  }
 }
 @sdirdata = sort {
  ($ma,$ba,$sa)=split(/\t/,$a);
  ($mb,$bb,$sb)=split(/\t/,$b);
  $mb <=> $ma } @newarray;
 $afile = $SETTING{'SUBJECT_PATH'} . "/suball.html";
 $count = 1;
 open (SUBR,">$afile");
 print SUBR "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n<HTML lang=\"ja\">\n<HEAD>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n<META http-equiv=\"Content-Style-Type\" content=\"text/css\">\n<META http-equiv=\"pragma\" content=\"no-cache\">\n<TITLE>".$SETTING{'BBS_TITLE'} . "</TITLE>\n<style type=\"text/css\"><!--A {text-decoration: none;}--></style></HEAD><BODY TEXT=#000000 link=#0000CC alink=#FF0000 vlink=#AA0088 BGCOLOR=\"#EFEFEF\"><font style=\"font-size:12pt\">";
  print SUBR "<font size=2>[<b> $SETTING{'BBS_TITLE'} 全スレッド一覧 </b>] / [<A HREF=\"/" . $target_bbs . "/index.html\">掲示板へ戻る</a>]&nbsp<hr>";
 print SUBR "　スレッドが立てられた時間順に\ソ\ー\ト\してあります。<br>　この情報は3時間毎に更新します。<br>　 " . $sec . "現在 / ".$count1."個のスレッド / ".$count2."個の書き込み<hr>";
 foreach $dirline (@sdirdata) {
  ($ma,$ba,$sa)=split(/\t/,$dirline);
  $ba =~ s/\.dat//g;
  print SUBR "<A HREF=\"" . $read_cgi . "/" . $target_bbs . "/" . $ba . "/l50\" target=\"_blank\">" . $count . ": " . $sa . "</a><br>";
  $count++;
 }
 print SUBR "<br><br></font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS SUBALL INDEX / MADE BY BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";
 close (SUBR);
}

sub stat_out {
 my ($target_bbs)=@_;
 my ($resline,@resdata,@idarray,$restime,$resbbs,$resid,$idline,$acount1,$acount2,$aflag);
 my $temptime = $NOWTIME - 3600;
 my $RES_LOG = $temp_path . "/resdata.dat";
 $acount1 = 0;
 $acount2 = 0;
 open(RESLOG,"$RES_LOG");
 eval{flock(RESLOG,1);};
 while (<RESLOG>) {
 ($restime,$resbbs,$resid) = split(/\t/,$_);
 if ($restime > $temptime) {
  push (@resdata,$_);
  $aflag=0;
  if ($resbbs eq $target_bbs){$aflag=1;}
  if ($SETTING{'ROOT_BBS'} eq ""){$aflag=1;}
  if ($aflag == 1){
   $acount1++;
   $aflag = 0;
   foreach $idline (@idarray){
    if ($idline eq $resid){$aflag=1;last;}}
    if ($aflag == 0){
     push (@idarray,$resid);
     $acount2++;
    }
   }
  }
 }
 close(RESLOG);
 open(RESLOG,">$RES_LOG");
 eval{flock(RESLOG,2);};
 print RESLOG @resdata;
 close(RESLOG);
 my $STAT_LOG = $temp_path . "/stat_" . $target_bbs . ".dat";
 my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst);
  ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($NOWTIME);
 $sec = sprintf("%02d/%02d %02d:%02d", $mon + 1, $mday,  $hour, $min);
 open (STATLOG,">$STAT_LOG");
 eval{flock(RESLOG,2);};
 print STATLOG "参加人数:約".$acount2."人 1時間当たりの書き込み数:".$acount1."書き込み";
 close (STATLOG);
}

#エラー処理
sub disperror{
 my ($error_value)=@_;
 if ("$error_value" eq "hdml"){
 print "Content-type: text/x-hdml\n\n<HDML VERSION=\"3.0\" MARKABLE=\"TRUE\" PUBLIC=\"TRUE\"><DISPLAY NAME=\"main\">ezwebには対応してないです</DISPLAY></HDML>";exit;}
 if ("$error_value" eq "error"){
 print "Content-Type: text/html\n\nファイルロックエラー。　#03";exit;}

 elsif ($ENV{'HTTP_USER_AGENT'} =~ /kage/){
 print "Content-Type: text/html; charset=shift_jis\n\n<HTML>\n<HEAD>\n<TITLE>ERROR</TITLE>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n</HEAD>\n<BODY bgcolor=\"#FFFFFF\">\n<font size=+1 color=#FF0000><b>ＥＲＲＯＲ：$error_value</b></font>\n<br>\n</body>\n</html>\n";exit;}

 elsif ($ENV{'HTTP_USER_AGENT'} =~ /Katjusha/){
 print "Content-Type: text/html; charset=shift_jis\n\n<HTML>\n<HEAD>\n<TITLE>ERROR</TITLE>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n</HEAD>\n<BODY bgcolor=\"#FFFFFF\">\n<font size=+1 color=#FF0000><b>ＥＲＲＯＲ：$error_value</b></font>\n<br>\n</body>\n</html>\n";exit;}
 elsif ($ENV{'HTTP_USER_AGENT'} =~ /onazilla/){
 print "<HTML>\n<HEAD>\n<TITLE>ERROR</TITLE>\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n</HEAD>\n<BODY bgcolor=\"#FFFFFF\">\n<font size=+1 color=#FF0000><b>ＥＲＲＯＲ：$error_value</b></font>\n<br>\n</body>\n</html>\n";exit;}

 print "Content-Type: text/html; charset=shift_jis\n\n<html><head><title>ERROR! - $sc_name</title></head><body bgcolor=\"#EFEFEF\"><b><font color=\"#FF0000\">■エラーが発生しました。</font></b><hr><font style=\"font-size:9pt\">&nbsp;&nbsp;".$error_value."<br><br><br><br></font><div align=\"right\"><font style=\"font-size:8pt\"><hr>[BBS.CGI] for $sc_name <br>Version : ".$version."</font></div></body></html>";exit;
}
