#!/usr/bin/perl

use strict;
use vars qw($bbs $key $st $to $ls $im $nf $ko $db @dat $resno);

use vars qw($datdir $kakodir $cgiver $cginame $baseurl $daturl $size $now $ONE);


$cginame = "read.cgi";
$datdir = "../dat";
$kakodir = "../dat2";
$cgiver = "read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03)";
$baseurl = "http://$ENV{'HTTP_HOST'}";
$now = time;

#decode
{
 my ($name,$value,%get,$range);
 if($ENV{'QUERY_STRING'} ne ""){
  foreach(split /&/, $ENV{'QUERY_STRING'}){
   ($name, $value) = split /=/;
   $value =~ tr/+/ /;
   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg;
   $get{$name} = $value;
  }
  $bbs = $get{'bbs'};
  $key = $get{'key'};
  $st = $get{'st'};
  $to = $get{'to'};
  $ls = $get{'ls'};
  $im = $get{'imode'};
  $nf = $get{'nofirst'};
  $ko = $get{'kako'};
  $db = $get{'debug'};
 }
 elsif($ENV{'PATH_INFO'} ne ""){
  ($name,$bbs, $key, $range) = split (/\//,$ENV{'PATH_INFO'});
  if($range =~ /^l(\d+)/){$ls = $1;}
  if($range =~ /^(\d+)\-(\d+)/){$st = $1; $to = $2;}
  elsif ($range =~ /\-(\d+)/){$to = $1;}
  elsif ($range =~ /(\d+)\-/){$st = $1;}
  elsif ($range =~ /^(\d+)/){$st = $1; $to = $1; $nf = "true";$ONE = 1;}
  if($range =~ /\./){$nf = "false";}
  if($range =~ /n/){$nf = "true";}
  if($range =~ /k/){$ko = "true";}	#kakolog
 }
 else{&error("エラー：オプションが指定されていません。");}
}

#main
{
 # datファイル指定/サイズ取得
 my $datfile = $datdir . "/" . $key . ".dat";
 my $kakofile = $kakodir . "/" . $key . ".dat";
 my $k_flag = 0;
 $size = (stat($datfile))[7];
 $size = int($size/1024);

#存在確認
 if(!-e "$datfile"){ &error("スレッドがありません。");}

 print "Content-type: text/html\n\n";

#dat読み出し。
 my ($name, $mail, $date, $message, $subject,$mailto,$nom);
 open(IN,"$datfile");
 @dat = <IN>;#!
 close(IN);
 $resno=@dat+1;
 ($name, $mail, $date, $message, $subject) = split /<>/, $dat[0];
 chomp($subject);
 if($ls =~ /(\d+)/){$st = $resno - $1;}
 if($st < 1){$st = 1;}
 if(!$to){$to=$resno;}

#dat表示
 print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"><HTML lang=\"ja\"><HEAD><META http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\"><STYLE type=\"text/css\"><!-- A:hover { color: #FF0000 ;} --></STYLE><SCRIPT type=\"text/javascript\" defer><!--\nfunction l(e){var N=g(\"NAME\"),M=g(\"MAIL\"),i;with(document) for(i=0;i<forms.length;i++)if(forms[i].FROM&&forms[i].mail)with(forms[i]){FROM.value=N;mail.value=M;}}onload=l;function g(key,tmp1,tmp2,xx1,xx2,xx3,len){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>$subject</TITLE></HEAD>";
 print "<BODY bgcolor=\"#EFEFEF\" link=\"#0000FF\" alink=\"#FF0000\" vlink=\"#0055FF\">\n";

### スレッドのヘッダー

# レス数が多い時or過去ログ落ち時の表示
if (-s "$datfile" > 512000)
 {print "<P align=\"center\" STYLE=\"background-color:\#FF0077;color:white;\">スレッドが大きすぎます。残念ながらこれ以上は書き込めません。</P>\n"; $k_flag = 1;}
 elsif ($resno >=1000)
  {print "<P align=\"center\" STYLE=\"background-color:\#FF0000;color:white;\">レス数が 1000 を超えています。残念ながらこれ以上は書き込めません。</P>\n"; $k_flag = 1;}
 elsif ($resno >=950)
  {print "<P align=\"center\" STYLE=\"background-color:\#FF0000;color:white;\">レス数が 950 を超えています。1000を超えると書き込めなくなくなるよ。</P>\n";}
 elsif ($resno >=900)
  {print "<P align=\"center\" STYLE=\"background-color:\#FFFF00;\">レス数が 900 を超えています。1000を超えると書き込めなくなくなるよ。</P>\n";}

 if($nf ne "true"){
  print "<A name=\"top\"></A>\n";
  print "<font size=2>[<A href=\"$baseurl/$bbs/\">掲示板に戻る</A>] [表\示 : <A href=\"$baseurl/test/$cginame/$bbs/$key/\">全て</A> <A href=\"$baseurl/test/$cginame/$bbs/$key/l50\">最新50</A> ";
  print "<A href=\"$baseurl/test/$cginame/$bbs/$key/-100\">1-99</A>";

# 100単位で閲覧しちゃう？
 {
  my ($acnt,$ncnt,$tcnt);
  for($acnt=2;$acnt<=int($resno / 100)+1;$acnt++){
  $tcnt = $acnt*100;
  $ncnt = $tcnt-100+1;
  print " <A href=\"$baseurl/test/$cginame/$bbs/$key/$ncnt-$tcnt\">$ncnt-$tcnt</A>";}
 }
 print "]</font>";
}
 print "<P><FONT size=\"+1\" color=\"#FF0000\">$subject</FONT></P>\n\n";
 print "<DL>\n";
 $to++;
### 1の書き込み
 if($nf ne "true" || $st == 1){
 $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
 # メール欄の処理
 if($mail eq "" || $mail eq "0"){
  $mailto = "<FONT color=green><B>$name</B></FONT>";
 }else{
  $mailto = "<A href=\"mailto:$mail\"><B>$name</B></A>";}
# 書き込みが？？？
 if($message eq ""){$name=$mail="";$subject=$message="[ここ壊れてます]";}
 print "<dt>1 名前：$mailto <SMALL>[$date]</SMALL><dd>$message<BR><BR>\n";
 if($st ==1){$st++;}
 }

### 2以降の書き込み
 while($st != $to){
  if($dat[$st-1] eq ""){last;}
  chomp($dat[$st-1]);
  ($name, $mail, $date, $message) = split /<>/, $dat[$st-1];
  $message =~ s/(https?|ftp|gopher|telnet|whois|news)\:([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"$1\:$2\" target=\"_blank\">$1\:$2<\/a>/ig;
  # メール欄の処理
  if($mail eq "" || $mail eq "0"){
   $mailto = "<FONT color=green><B>$name</B></FONT>";
  }else{
   $mailto = "<A href=\"mailto:$mail\"><B>$name</B></A>";}
# 書き込みが？？？
  if ($message eq ""){ $name=$mail=""; $subject=$message="[ここ壊れてます]"; }
# 表示処理。
  print "<dt>$st 名前：$mailto <SMALL>[$date]</SMALL><dd>$message<BR><BR>\n";
  $st++;
 }
 $st--;
 print "</DL>\n\n";

### スレッドのフッダー
 print "<hr>";
 #続き/新着
 print "<center>[ ";
 print "<A href=\"$baseurl/test/$cginame/$bbs/$key/$st-\">";
 if($resno-1>$st){ print "続きを読む";}
 else { print "新着レスの表\示";}
 print "</A> ]</center><hr>\n";
#全部読む
 if($nf eq "true"){ print "<A href=\"$baseurl/test/$cginame/$bbs/$key/\">全部読む</A> \n";}
 my $rsnt=$st+100;
#前レス100
 if($st > 100){
  my $st1=$st-$ls-1;
  my $st2=$st1-100;
  print "<A href=\"$baseurl/test/$cginame/$bbs/$key/$st2-$st1\">前100</A> \n";}
#次と最新
 print "<A href=\"$baseurl/test/$cginame/$bbs/$key/$st\-$rsnt\">次100</A> \n";
 print "<A href=\"$baseurl/test/$cginame/$bbs/$key/l50\">最新50</A> \n";
#とっぷ
 print "<A href=\"\#top\">▲</A> ";
#容量ちぇっく
 if ($size > 500) { print "<SMALL><FONT color=#FF0000>（；´Д｀）＜$size\KB</FONT> </SMALL>\n";}
 elsif ($size > 300)	{ print "<SMALL><FONT color=#FF0088>（；´∀｀）＜$size\KB</FONT> </SMALL>\n";}
 elsif ($size > 100)	{ print "<SMALL><FONT color=#FF8800>（ ´∀｀）＜$size\KB</FONT> </SMALL>\n";}
 else { print "<SMALL><FONT color=#009900>（*・∀・）＜$size\KB</FONT> </SMALL>\n";}

#書き込みフォーム
 if ($nf ne "true" &&  $k_flag ne "1") {
  print "<FORM method=POST action=\"$baseurl/test/bbs.cgi\"><INPUT type=submit value=\"書き込む\" name=submit> 名前： <INPUT name=FROM size=19> E-mail<SMALL> (省略可) </SMALL>: <INPUT name=mail size=19><BR><TEXTAREA rows=5 cols=70 wrap=off name=MESSAGE></TEXTAREA><INPUT type=hidden name=bbs value=$bbs><INPUT type=hidden name=key value=$key><INPUT type=hidden name=time value=$now></FORM>\n";
 }

#footer
 print "<P><SMALL>$cgiver</SMALL></P>\n";
 print "</BODY>\n";
 print "</HTML>\n";
}
exit;

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