#!/usr/bin/perl
require './setup.cgi';

# NICOLE Board  [ Freeware ]
# 掲示板スクリプト [ フリーウェア ]
#
# Script written by NICOLE
# web-page : http://www10.big.or.jp/~nicole/
# e-mail   : nicole@big.or.jp
#
#---------------------------

@menuitems = ();
&SetDefaultConfig;
&Decode;
&GetCookie;

# BAN
@xman = ();
if ( -e $xfile ){
	if ( open(FILE,$xfile) ){
		@xman = <FILE>;
		close(FILE);
	}
}

foreach(@xman){
	if($_ =~ /^all$/i || ($ENV{'REMOTE_ADDR'} =~ /^$_/ && length($_) > 4)){
		&Error("リモートホスト <B>$ENV{'REMOTE_HOST'} ( $ENV{'REMOTE_ADDR'} ) </B> は出入禁止になっています。<P>");
	}
}

# READ CONFIG
if (-e $file_config) {
	&ReadConfig($file_config);
} elsif ( 1 == $showBoardList ) {
	# 掲示板一覧を表示
	&SelectBoard;
	exit;
} else {
	# ホームページに設定されたURLにジャンプ
	print "Content-type: text/html\n\n";
	print <<_HTML_;
<HTML>
<HEAD>
<TITLE>$admin_name</TITLE>
<BODY>
ようこそ <A HREF="mailto:$admin_email">$admin_name</A> の掲示板へ。<BR>
トップページ ( <A HREF="$admin_homepage">$admin_homepage</A> ) よりお入りください。
</BODY></HTML>
_HTML_
	exit;
}

# CLOSED 
if (1 == $config{'disable'} ){
	&Error("現在この掲示板は管理者の都合により一時的に閉鎖されております");
}


#このファイルの後方参照されたし
while(<DATA>) {
	chop;
	local($a,$b) = split(/<>/);
	$menu_color_list{$a} = $b;
}

# READ LOG DATA

&ReadData;


if ( $cmd eq 'new')			{	&InputMessage('new');
} elsif ( $cmd eq 'reply')	{	&InputMessage('reply');
} elsif ( $cmd eq 'edit') 	{	&InputMessage('edit');
} elsif ( $cmd eq 'regist') {	&RegistMessage;
} elsif ( $cmd eq 'delete')	{ &DeleteMessage( $wparam );
} elsif ( $cmd eq 'search' && $wparam ne '')	{ &Search( $wparam );
} elsif ( $cmd eq 'topic')	{	&DrawHeader('',0,0);	&DrawTopic($wparam,1);
} elsif ( $cmd eq 'sort0')  { $COOKIE{'sort'} = '0'; &SetCookie; &View;
} elsif ( $cmd eq 'sort1')  { $COOKIE{'sort'} = '1'; &SetCookie; &View;
} else {
	&View;
}

&DrawFooter;
exit;

#---------------------------

sub SortTopics {
	local($mode) = @_;
	local($number, $reply );

	@topiclist = ();
	foreach(sort{$datalist{$b} <=> $datalist{$a}}keys(%datalist)){
		($number,$reply,$reply_count,$reply_time) = split(/<>/,$datalist{$_});
		if ( $reply eq '' ){
			$list{ $number } = $reply_time;
		}
	}

	foreach(sort{$list{$b} <=> $list{$a}}keys(%list)){
		push( @topiclist, $_ );
	}
}


#---------------------------
# SELECT BOARD

sub SelectBoard {
	local($board_count, $board);

	&DrawHeader("$admin_name の掲示板一覧",1,1);

	opendir ( DATADIR, "./data/");
	@b = readdir(DATADIR);
	closedir (DATADIR);
	@boards = grep(/.cfg/, @b);
	@boards = sort( @boards );
	$board_count = 0;

	foreach(@boards){
		$board_count++;
	}
	

	print <<_HTML_;
<B>$board_count</B> 個の掲示板があります。
<P>
<TABLE BORDER=0 CELLPADDING=5 CELLSPACING=1>
<TR BGCOLOR=#000050>
<TD><FONT SIZE=2 COLOR=#FFFFFF><B>掲示板</B></TD>
<TD NOWRAP><FONT SIZE=2 COLOR=#ffffff><B>最新の投稿日時</B></TD>
<TD NOWRAP><FONT SIZE=2 COLOR=#ffffff><B>最新の記事タイトル</B></TD>
<TD NOWRAP><FONT SIZE=2 COLOR=#ffffff><B>最新の投稿者</B></TD>
<TD NOWRAP><FONT SIZE=2 COLOR=#ffffff><B>No.</B></TD>
</TR>
_HTML_

	foreach(@boards){
		$board = $_;
		$board =~ s/.cfg//ig;
		$file_data = "./data/$board.log";
		&ReadConfig("./data/$board.cfg");

		if ( 0 != open(FILE,"$file_data") ){
			$number = '';
			$name = '';
			$atime = '';
			$reply = '';
			$subject = '';

			while(<FILE>) {
				chop;
				($number,$reply,$reply_count,$reply_time,$time,$subject,$name,$email,$hp,$icq,$ip,$password,$comment,$menu,$remote_host) = split(/<>/);
				$atime = &FormatDateTime( $time, 1 );
				last;
			}
			close(FILE);
		}

		$name = &FormatName( $name );

		if ($subject eq '' && 0 != $reply ){ $subject = "記事No.$reply への返信";}

		print <<_HTML_;
<TR BGCOLOR=#f0f0f0>
<TD><B><A HREF="$cgi?board=$board">$config{'bbstitle'}</A></B></TD>
<TD NOWRAP><FONT SIZE=2>$atime</TD>
<TD><FONT SIZE=2>$subject</TD>
<TD><FONT SIZE=2>$name</TD>
<TD ALIGN=right><FONT SIZE=2>$number</TD>
</TR>
_HTML_

	}

	print "</TABLE>\n";
	&DrawFooter;
}

#---------------------------
# DECODE

sub Decode {
	local($buf);

	if ($ENV{'REQUEST_METHOD'} eq "$method") { 
		if($ENV{'CONTENT_LENGTH'} > $max_comment*2){
			&Error("送信データ量が多すぎます");
		}
		read(STDIN, $buf , $ENV{'CONTENT_LENGTH'});
	} else {
		$buf  = $ENV{'QUERY_STRING'};
	}

	@pairs = split(/&/,$buf);

	foreach $pair (@pairs) {
		local($name, $value) = split(/=/, $pair);
		$value =~ tr/+/ /;
		$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
		&jcode'convert(*value,'sjis');
		&jcode'h2z_sjis(*value);
		$value =~ s/\&/\&amp;/g;
		$value =~ s/\"/\&quot;/g;
		$value =~ s/</\&lt;/g;
		$value =~ s/>/\&gt;/g;    
		$FORM{$name} = "\0" if (defined($FORM{$name}));
		$FORM{$name} = $value;
	}

	$name = $FORM{'name'};
	$name =~ s/\r\n/\n/g;
	$name =~ s/\r|\n//g;

	$subject = $FORM{'subject'};
	$subject =~ s/\r\n/\n/g;
	$subject =~ s/\r|\n//g;

	$email = $FORM{'email'};
	$email =~ s/\r\n/\n/g;
	$email =~ s/\r|\n//g;

	$hp = $FORM{'hp'};
	$hp =~ s/\r\n/\n/g;
	$hp =~ s/\r|\n//g;

	$icq = $FORM{'icq'};
	$icq =~ s/\r\n/\n/g;
	$icq =~ s/\r|\n//g;

	$comment = $FORM{'comment'};
	$comment =~ s/\r\n/\n/g;
	$comment =~ s/\r|\n/<BR>/g;

	$password = $FORM{'password'};
	$password =~ s/\r\n//g;
	$password =~ s/\r|\n//g;

	$menu = $FORM{'menu'};
	$menu =~ s/\r\n//g;
	$menu =~ s/\r|\n//g;

	$pwd = $FORM{'pwd'};
	$pwd =~ s/\r\n//g;
	$pwd =~ s/\r|\n//g;

	$number = $FORM{'number'};

	$ip = $FORM{'ip'};
	$remote_host = $FORM{'remote_host'};
	$reply = $FORM{'reply'};
	$reply_count = $FORM{'reply_count'};
	if ($FORM{'reply_time'}) { $reply_time = $FORM{'reply_time'}} else { $reply_time = time };
	$time = $FORM{'time'};
	$cmd = $FORM{'cmd'};
	$wparam = $FORM{'wparam'};
	$lparam = $FORM{'lparam'};

	if ($FORM{'page'}) { $page = $FORM{'page'}; } else { $page = 0; };
	if ($FORM{'board'}) { $board = $FORM{'board'}; };

	$file_data  = "./data/$board.log";
	$file_config = "./data/$board.cfg";
}

#---------------------------
# DRAW TOPIC EX

sub DrawTopicEx {
	local($flag_reply) = @_;
	local($atime,$aname,$icon,$parent_reply_count, $sbg);

	$atime = &FormatDateTime($time);
	$aname = &FormatName($name);
	$comment = &FormatComment($comment,$name);
	$icon = &IsNew( $time );
	if ($icq) {	$icq = "<FONT COLOR=$config{'color_link'}>ICQ=$icq</FONT>、"; }
	if ($email) {	$email= "<A HREF=\"mailto:$email\">メール</A>、";	}
	if ($hp) { $hp = "<A HREF=\"$hp\" TARGET=\"_blank\">ホームページ</A>";}
	if ($icq || $email || $hp){ $email = " 　 <FONT SIZE=2>( $icq $email $hp )</FONT> "; };

	print "\n<A NAME=\"topic$number\"></A>\n";
	print "<TABLE WIDTH=100% BORDER=1 CELLPADDING=4 CELLSPACING=0>\n";
	print "<TR>\n";

	$sbg = $config{'color_subject_bg'};

	if ($reply){
		print "<TD WIDTH=\"99%\" BGCOLOR=$sbg><A HREF=\"$cgi?board=$board&cmd=topic&wparam=$reply\"><FONT COLOR=$config{'color_subject'}><B>記事 No.$reply へのコメント</B></FONT></A></TD>\n";
		print "<TD WIDTH=\"1%\" BGCOLOR=$sbg NOWRAP ALIGN=right><FONT COLOR=$config{'color_subject'} SIZE=2>No.$number</TD>\n";
	} elsif ($subject ne ''){
		if (1 == $config{'menu_use'}){
			$subject = "$menu - $subject";
			if ($menu ne '' && $menu_color_list{$menu}){
				$sbg = $menu_color_list{$menu};
			}
		}

		print "<TD WIDTH=99% BGCOLOR=$sbg><FONT COLOR=$config{'color_subject'}><B>$subject</B></TD>\n";
		print "<TD WIDTH=1% BGCOLOR=$sbg NOWRAP ALIGN=right><FONT COLOR=$config{'color_subject'} SIZE=2>No.$number</TD>\n";
	}

	print "</TR>\n";
	print "<TR><TD COLSPAN=2 BGCOLOR=$config{'color_comment_bg'}><FONT COLOR=$config{'color_comment_text'}>\n";


		if (1 != $config{'readonly'} ){
			print "<FONT COLOR=$config{'color_link'}>$icon <B>$aname</B> さん </FONT><FONT SIZE=2> $email 　 $atime";
			if (1 == $flag_reply ){
				print " 　 [ <A HREF=\"$cgi?board=$board&cmd=edit&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>編集</FONT></A>";
				print " / <A HREF=\"$cgi?board=$board&cmd=delete&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>削除</FONT></A> ] 　 ";
			}
			print "</FONT><P><table border=0 cellpadding=0 cellspacing=2><TR><TD width=40><img src=../../images/homeicon.gif align=top></TD><TD>$comment</TD></table>\n";
		} else {
			print "<FONT SIZE=2>$atime 　 ";
			if (1 == $flag_reply ){
				print "[ <A HREF=\"$cgi?board=$board&cmd=reply&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>追記</FONT></A>";
				print " / <A HREF=\"$cgi?board=$board&cmd=edit&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>編集</FONT></A>";
				print " / <A HREF=\"$cgi?board=$board&cmd=delete&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>削除</FONT></A> ]";
			}
			print "</FONT><P><table border=0 cellpadding=0 cellspacing=2><TR><TD width=40><img src=../../images/homeicon.gif align=top></TD><TD>$comment</TD></table>\n";
		}

	#返信数が０でなければ返信記事を検索し表示
	if (0 != $reply_count) {
		$cnt = @replylist;
		$parent_reply_count = $reply_count;

		for($n=0; $n<$cnt; $n++){
			&GetData( $replylist[$n] );
			if ($num == $reply && $number != 0) {

				$atime = &FormatDateTime($time,1);
				$aname = &FormatName($name);
				$comment = &FormatComment($comment,$name);
				$icon = &IsNew( $time );
				if ($icq) {	$icq = "<FONT COLOR=$config{'color_link'}>ICQ=$icq</FONT>、"; }
				if ($email) {	$email= "<A HREF=\"mailto:$email\">メール</A>、";	}
				if ($hp) { $hp = "<A HREF=\"$hp\" TARGET=\"_blank\">ホームページ</A>";}
				if ( $icq || $email || $hp ){ $email = "　 ( $icq $email $hp ) "; };

				print "<HR NOSHADE SIZE=1}>\n";
				if ( 1 != $config{'readonly'} ){
					print "<FONT SIZE=2><FONT COLOR=$config{'color_link'}>$icon <B>$aname</B> さん</FONT> $email 　 $atime ";
				} else {
					print "<FONT SIZE=2>$icon $atime";
				}
				if (1 == $flag_reply ){
					print " 　 [ <A HREF=\"$cgi?board=$board&cmd=edit&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>編集</FONT></A>";
					print " / <A HREF=\"$cgi?board=$board&cmd=delete&wparam=$number\"><FONT COLOR=$config{'color_comment_text'}>削除</FONT></A> ] 　 ";
				}
				print "<BLOCKQUOTE>$comment</BLOCKQUOTE></FONT>\n";
			}
		}
	}


	if (1 == $flag_reply) {
		if (1 != $config{'readonly'}){
			print "<HR NOSHADE SIZE=1><DIV ALIGN=center><FONT SIZE=2>\n";
			print "<A HREF=\"$cgi?board=$board&cmd=reply&wparam=$num\">コメントを付ける</A></DIV>\n";
		}
	}

	print "</TD></TR></TABLE><BR><DIV ALIGN=right><FONT SIZE=2><A HREF=\"#list\">↑</A></FONT></DIV>\n";
}

#---------------------------
# DRAW TOPIC

sub	DrawTopic {
	local($num,$flag_reply) = @_;
	&GetData( $num );
	if ( 0 != $number) {
		&DrawTopicEx($flag_reply);
	}
}



#---------------------------
# SEARCH

sub	Search {
	local($str) = @_;
	local($num, $found_count);
	&DrawHeader("【$str】の検索結果",0,0);
	@str = split(/ /,$str);

	$found_count = 0;

	foreach(sort{$datalist{$b} <=> $datalist{$a}}keys(%datalist)){
		$num = $_;
		&GetData( $num );
		$targetstr = $subject.$comment;
		$targetstr =~ s/<BR>[&lt;]*//ig;
		$targetstr =~ s/<BR>//ig;

		foreach(@str){
			if($targetstr =~ /$_/i){
				$found_count++;
				if ( 20 < $found_count) {
					last;
				}

				&GetData( $num );
				$comment =~ s/$_/<EM><FONT COLOR=$config{'color_em'}><B><U>$_<\/U><\/B><\/FONT><\/EM>/ig;
				&DrawTopicEx(1);
				last;
			}
		}
	}

	if (0 == $found_count){
		print "<B><CENTER>検索に該当する記事は見つかりませんでした</B></CENTER>\n";
	}
}

#---------------------------
# DELETE MESSAGE

sub DeleteMessage {
	local($num) = @_;
	local($ok);
	&GetData( $num );

	$ok = 0;

	if ( $pwd ne '' && $pwd eq $admin_password ){
		$ok = 1;
	} elsif ( $pwd ne '' && $password ne '' && crypt($pwd, 'hodare') eq $password ){
		if ( 0 == $reply_count ){
			$ok = 1;
		}
	}

	if ( 1 == $ok ) {
		&DeleteMessageEx($num);
		&WriteData;
		$config{'information'} = '<CENTER><EM>記事は削除されました</EM></CENTER>';
		&View;
	} else {
		&DrawHeader('記事の削除',1,1);
		if ($password eq ''){
			print "<EM>この記事にはパスワードが設定されていませんので、管理者だけが記事を削除できます</EM><P>\n";
		} elsif (0 != $reply_count ) {
			print "<EM>この記事には既にコメントがついていますので、管理者だけが記事を削除できます</EM><P>\n";
		}

		print <<_HTML_;
この記事を削除しますか？<P>
記事に設定したパスワード（管理者なら管理パスワード）を入力して「削除」ボタンを押して下さい。
やめる場合は、そのまま「中止」ボタンを押して下さい。
<P>
<TABLE BORDER=0><TR>
<TD><FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=hidden NAME=cmd VALUE=delete>
<INPUT TYPE=hidden NAME=wparam VALUE="$num">
<INPUT TYPE=password NAME=pwd SIZE=10>
<INPUT TYPE=submit VALUE="はい削除します">
</FORM></TD>
<TD><FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=submit VALUE="いいえ中止します">
</FORM></TD>
</TR></TABLE>
_HTML_

		&DrawTopic( $num );
	}
}

#---------------------------
# DELETE MESSAGE EX

sub DeleteMessageEx {
	local($num) = @_;
	local($parent,$n);

	&GetData( $num );

	#削除されるのが子記事なら親記事の返信数を減らす
	if ( $reply ) {
		$parent = $reply;
		#親記事の返信カウントを減らす
		&GetData( $parent );
		$reply_count--;
		&SetData( $parent );
	} elsif (0 != $reply_count){
		#削除されるのが親記事で、子記事があるなら（０でなければ）子記事も削除する
		$cnt = @replylist;
		for($n=0; $n<$cnt; $n++){
			&GetData( $replylist[$n] );
			if ($num == $reply) {
				$number= 0;
				&SetData( $replylist[$n] );
			}
		}
	}

	#関連記事の削除や返信数の処理が終わったら、本記事に削除フラグを立てる
	&GetData( $num );
	$number = 0;
	&SetData( $num );
}

#---------------------------
# DRAW NAVI

sub	DrawNavi {
	local($cpage,$mpage,$npage,$s);

	$npage = $page+1;
	$mpage = int((@topiclist-1)/$config{'viewcount'}) +1;
	$cpage = $page;

	if ( &IsSort ) {
		$s = " [ レス順\表\示 ]";
	}

	print "<TABLE WIDTH=100% BORDER=0 CELLPADDING=0 CELLSPACING=0>\n";
	print "<TR><TD><FONT SIZE=2> $s</TD><TD ALIGN=right NOWRAP><FONT SIZE=2>";

	if($page >= 1) {
		$cpage = $page - 1;
		print "<A HREF=\"$cgi?board=$board&page=$cpage\">←１日進む</A> \n";
	}

	print " [ $npage / $mpage ] ";

	if ($mpage > $npage){
		$cpage = $page +1;
		print " <A HREF=\"$cgi?board=$board&page=$cpage\">１日戻る→</A>\n";
	}


	print "</TD></TR></TABLE><P>\n";
}
#---------------------------
# View

sub View {
	local($cnt) = @topiclist;
	&DrawHeader('',0,0);
	if (0 == $cnt){
		print "<HR NOSHADE SIZE=1><CENTER><EM>記事はありません</EM></CENTER>";
	} else {
		if ( &IsSort ) { &SortTopics; }
		if (1 == $config{'show_topiclist'}){
			&ViewList;
			&DrawNavi;
		}
		&DrawNavi;
		&ViewDump;
		
	}
}

#---------------------------
# View LIST

sub ViewList {
	local($i,$n,$atime,$aname,$icon,$replyicon,$href,$atimecolor,$areply);

	print "<A NAME=\"list\"></A>\n";
	print "<TABLE WIDTH=100% BORDER=1 CELLPADDING=0 CELLSPACING=0 BORDERCOLOR=$config{'color_subject_bg'}><TR><TD>\n";
	print "<TABLE WIDTH=100% BORDER=0 CELLPADDING=3 CELLSPACING=1 BGCOLOR=$config{'color_bg'}>\n";
	print "<TR>\n";
	if ( 1 == $config{'menu_use'} ){
		print "<TD NOWRAP WIDTH=5% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>$config{'menu_name'}<B></TD>\n";
	}
	print "<TD NOWRAP WIDTH=65% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>タイトル</B></TD>\n";
	if ( 1 != $config{'readonly'} ){
		print "<TD NOWRAP WIDTH=20% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>投稿者</B></TD>\n";
		print "<TD NOWRAP WIDTH=5% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>返信</B></TD>\n";
	} else {
		print "<TD NOWRAP WIDTH=5% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>追記</B></TD>\n";
	}
	print "<TD NOWRAP WIDTH=5% BGCOLOR=$config{'color_subject_bg'}><FONT COLOR=$config{'color_subject'} SIZE=2><B>更新日時</B></TD>\n";

	&GetData( $max_number );
	$areply = $reply;

	for($i = $page*$config{'viewcount'}; $i < $page*$config{'viewcount'}+$config{'viewcount'}; $i++){
		if($topiclist[$i]){

			&GetData( $topiclist[$i] );
			if (0 != $number){
				$atime = &FormatDateTime($reply_time, 1);
				$aname = &FormatName($name);
				$icon = &IsNew( $time );
				$replyicon = &IsNew( $reply_time );
				if ( 0 == $reply_count ) { $replyicon = ''; }

				if ( $number == $max_number || $number == $areply){
					$atimecolor = $config{'color_em'};
				} else {
					$atimecolor = $config{'color_text'};
				}

				$href = "<A HREF=\"#topic$number\">";
				print "<TR>\n";

				if ( 1 == $config{'menu_use'} ){
					print "<TD NOWRAP BGCOLOR=$config{'color_comment_bg'}>$href<FONT COLOR=$config{'color_text'} SIZE=2>$menu</FONT></A></TD>\n";
				}

				print "<TD BGCOLOR=$config{'color_comment_bg'}><FONT SIZE=2>$href<FONT COLOR=$config{'color_link'}>$icon $subject</A></TD>\n";
				if ( 1 != $config{'readonly'} ){
					print "<TD BGCOLOR=$config{'color_comment_bg'}><FONT SIZE=2>$href<FONT COLOR=$config{'color_text'}>$aname</FONT></A></TD>\n";
				}
				print "<TD BGCOLOR=$config{'color_comment_bg'} NOWRAP>$href<FONT COLOR=$config{'color_text'} SIZE=2>$reply_count $replyicon</A></TD>\n";
				print "<TD BGCOLOR=$config{'color_comment_bg'} NOWRAP>$href<FONT COLOR=$atimecolor SIZE=2>$atime</A></TD>\n";
				print "</TR>\n";
			}
		}
	}

	print "</TABLE>\n";
	print "</TD></TR></TABLE><P>\n";
}

#---------------------------
# View DUMP

sub	ViewDump {
	local($i);

	$i = @topiclist;
	if (0 != $i){
		for($i = $page*$config{'viewcount'}; $i < $page*$config{'viewcount'}+$config{'viewcount'}; $i++){
			if($topiclist[$i]){
				&DrawTopic( $topiclist[$i], 1);
			}
		}
	}
}

#---------------------------
# WRITE DATA

sub	WriteData {
	local($tmpfile) = "./data/$$".$ENV{'REMOTE_HOST'}.".tmp";
	local($i,$cnt);

	#最大記事数を超えた記事を破棄する
	$cnt = @topiclist;

	for($i = $config{'max_topic'}; $i < $cnt; $i++){
		if($topiclist[$i]){
			&DeleteMessageEx( $topiclist[$i] );
		}
	}

	#ファイルに書き出す
	open(TMP,">$tmpfile") || &Error ("can't open $tmpfile");
	foreach(sort{$datalist{$b} <=> $datalist{$a}}keys(%datalist)){
		&GetData( $_ );
		if ( 0 != $number){
			print TMP "$datalist{$_}\n";
		}
	}
	close(TMP);

	&FileLock(1);
	rename($tmpfile,$file_data);
	&FileLock(0);
}

#---------------------------
# READ DATA

sub ReadData {
	local($number,$reply);

	$max_number = 0;
	@topiclist = ();
	@replylist = ();

	unless (-e "$file_data") {
		open(FILE,">$file_data") || &Error ("can't open $file_data");
		close(FILE);
		chmod( 0666, $file_data );
	} else {
		&FileLock(1);
		open(FILE,"$file_data") || &Error ("can't open $file_data");
		while(<FILE>){
			chop;
			($number,$reply) = split(/<>/);
			$datalist{$number} = $_;
			if ( $max_number < $number ) { $max_number = $number; }
			if ( $reply ne '') {
				push( @replylist, $number);
			} else {
				push( @topiclist, $number );
			}
		}
		close(FILE);
		&FileLock(0);
		@replylist = reverse(@replylist);
	}
}


#---------------------------
# READ CONFIG

sub ReadConfig {
	local($filename) = @_;
	local($name,$value);
	open(FILE,"$filename") || &Error ("can't open $filename");
	while(<FILE>){
		chop;
		($name,$value) = split(/<>/);
		$config{ $name } = $value;
	}
	close(FILE);

	$config{'information'} =~ s/(&lt;)/</ig;
	$config{'information'} =~ s/(&gt;)/>/ig;
	$config{'information'} =~ s/(&quot;)/"/ig;
	@menuitems = ();
	if (1 == $config{'menu_use'}){
		@pairs = split(/<BR>/,$config{'menu_list'});
		foreach (@pairs) {
			push( @menuitems, $_ );
		}
	}
}

#---------------------------
# INPUT PASSWORD

sub InputPassword {
	local($title,$msg ) = @_;
	if ($title eq '') { $title = 'パスワードの入力'; };
	&DrawHeader( $title,1,1 );
	$comment =~ s/<BR>/\n/ig;

	print <<_HTML_;
<P>
$msg
<P>
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME="number" VALUE="$number">
<INPUT TYPE=hidden NAME="reply" VALUE="$reply">
<INPUT TYPE=hidden NAME="reply_count" VALUE="$reply_count">
<INPUT TYPE=hidden NAME="reply_time" VALUE="$reply_time">
<INPUT TYPE=hidden NAME="time" VALUE="$time">
<INPUT TYPE=hidden NAME="subject" VALUE="$subject">
<INPUT TYPE=hidden NAME="name" VALUE="$name">
<INPUT TYPE=hidden NAME="email" VALUE="$email">
<INPUT TYPE=hidden NAME="hp" VALUE="$hp">
<INPUT TYPE=hidden NAME="icq" VALUE="$icq">
<INPUT TYPE=hidden NAME="comment" VALUE="$comment">
<INPUT TYPE=hidden NAME="menu" VALUE="$menu">
<INPUT TYPE=hidden NAME="board" VALUE="$board">
<INPUT TYPE=hidden NAME="cmd" VALUE="$cmd">
<INPUT TYPE=hidden NAME="wparam" VALUE="$wparam">
<INPUT TYPE=hidden NAME="lparam" VALUE="$lparam">
<INPUT TYPE=password NAME=pwd SIZE=20>
<INPUT TYPE=submit VALUE=" 認証 ">
</FORM>
_HTML_
	$show_footer = 1;
	&DrawFooter;
	exit;
}

#---------------------------
#記事の入力。引数modeにより新規投稿、返信、編集を使い分ける

sub InputMessage {
	local($mode,$tryagain) = @_;

	if ( 0 != $config{'proxy'} ) {
		while(($envkey,$envvalue) = each(%ENV)){
			if($envkey   =~ /proxy|cache|squid/i || $envvalue =~ /proxy|cache|squid/i){
			&Error('プロキシ経由での発言は許可されていません',);
			}
		}
	}

	if (1 != $tryagain ){
		if ($mode eq 'new'){
			if (1 == $config{'readonly'}){
				if ( $pwd ne $admin_password ){
					&InputPassword('管理者の新規投稿','この掲示板は管理者だけが新規投稿できます。管理パスワードを入力して下さい');
				}
			}

			&DrawHeader('新規投稿',0,1);
			$subject = '';
			$comment = '';
			$name = $COOKIE{'name'};
			$hp = $COOKIE{'hp'};
			$email = $COOKIE{'email'};
			$icq = $COOKIE{'icq'};
			$password = $COOKIE{'password'};
		} elsif ($mode eq 'reply') {
			if (1 == $config{'readonly'} ){
				if ( $pwd ne $admin_password ){
					&InputPassword('管理者のコメント','この掲示板は管理者だけがコメントを付けられます。管理パスワードを入力して下さい');
				}
			}

			&DrawHeader('コメント',0,1);
			print "<P>コメント記入<BR>\n";
			&GetData( $wparam );
			$comment = '';
			$name = $COOKIE{'name'};
			$hp = $COOKIE{'hp'};
			$email = $COOKIE{'email'};
			$icq = $COOKIE{'icq'};
			$password = $COOKIE{'password'};
		} elsif ( $mode eq 'edit'){
			if ($pwd eq '' || $pwd ne $admin_password){
				&InputPassword('記事の編集','管理者のみ記事内容の編集ができます。管理パスワードを入力して下さい');
			}
			&GetData( $wparam );
			$comment =~ s/<BR>/\n/ig;
			&DrawHeader('記事の編集',1,1);

		} else {
			&Error("sub InputMessage ( $mode, $wparam ,$lparam)");
		}
	} else {
		$comment =~ s/<BR>/\n/ig;
	}

	print <<_HTML_;
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME="board" VALUE="$board">
<INPUT TYPE=hidden NAME="cmd" VALUE="regist">
<INPUT TYPE=hidden NAME="pwd" VALUE="$pwd">
<INPUT TYPE=hidden NAME="wparam" VALUE="$mode">
<INPUT TYPE=hidden NAME="lparam" VALUE="$lparam">
<INPUT TYPE=hidden NAME="number" VALUE="$number">
<INPUT TYPE=hidden NAME="time" VALUE="$time">
<INPUT TYPE=hidden NAME="reply" VALUE="$reply">
<INPUT TYPE=hidden NAME="reply_count" VALUE="$reply_count">
<INPUT TYPE=hidden NAME="reply_time" VALUE="$reply_time">
<TABLE BORDER=0 CELLPADDING=3 CELLSPACING=0><TR><TD>
_HTML_

	if ($mode ne 'reply') {
		if (1 == $config{'menu_use'}){
			print "<TR><TD NOWRAP>$config{'menu_name'}</TD>\n";
			print "<TD><SELECT NAME=menu>\n";
			foreach (@menuitems) {
				if ( $menu eq $_) {
					print "<OPTION VALUE=\"$_\" SELECTED>$_\n";
				} else {
					print "<OPTION VALUE=\"$_\">$_\n";
				}
			}
			print "</SELECT><EM>*</EM></TD></TR>\n";
		}

		print "<TR>\n";
		print "<TD NOWRAP>タイトル</TD>\n";
		print "<TD><INPUT TYPE=text SIZE=50 MAXLENGTH=100 NAME=subject VALUE=\"$subject\"></TD>\n";
		print "</TR>\n";
	}

	if (1 != $config{'readonly'}){
		print "<TR>\n";
		print "<TD NOWRAP>お名前</TD>\n";
		print "<TD><INPUT TYPE=text SIZE=50 MAXLENGTH=50 NAME=name VALUE=\"$name\"></TD>\n";
		print "</TR>\n";
	} else {
		print "<INPUT TYPE=hidden NAME=name VALUE=\"$admin_name\">\n";
	}

	if ($mode eq 'edit'){
		print "<TR>\n";
		print "<TD>REMOTE_HOST</TD>\n";
		print "<TD>$remote_host ( $ip )";
		print "<INPUT TYPE=hidden NAME=ip VALUE=\"$ip\">";
		print "<INPUT TYPE=hidden NAME=remote_host VALUE=\"$remote_host\">";
		print "</TD>\n";
		print "</TR>\n";
	}

	if ( 1 != $config{'readonly'} ){
		print "<TR>\n";
		print "<TD NOWRAP>メール</TD>\n";
		print "<TD><INPUT TYPE=text SIZE=50 MAXLENGTH=100 NAME=email VALUE=\"$email\"></TD>\n";
		print "</TR>\n";

		print "<TR>\n";
		print "<TD NOWRAP>ホームページ</TD>\n";
		print "<TD><INPUT TYPE=text SIZE=50 MAXLENGTH=100 NAME=hp VALUE=\"$hp\"></TD>\n";
		print "</TR>\n";

		print "<TR>\n";
		print "<TD NOWRAP>ICQ</TD>\n";
		print "<TD><INPUT TYPE=text SIZE=50 MAXLENGTH=15 NAME=icq VALUE=\"$icq\"></TD>\n";
		print "</TR>\n";
	}

	if (1 != $config{'readonly'}){
		if ($mode eq 'edit'){
			print "<TR><TD NOWRAP>パスワード</TD>\n";
			print "<TD>$password<INPUT TYPE=hidden NAME=password VALUE=\"$password\"></TD></TR>\n";
		} else {
			print "<TR><TD NOWRAP>パスワード</TD>\n";
			print "<TD><INPUT TYPE=password SIZE=10 MAXLENGTH=10 NAME=password VALUE=\"$password\"><EM>*</EM><FONT SIZE=2>設定しておくと後で記事を削除することができます</FONT></TD></TR>\n";
		}
	}

	print <<_HTML_;
<TR>
<TD NOWRAP>コメント</TD>
<TD><FONT SIZE=2><EM>*</EM>HTMLタグは使えません。URLを書くと自動的にリンクされます</FONT><BR><TEXTAREA WRAP=soft NAME=comment ROWS=15 COLS=50>$comment</TEXTAREA></TD>
</TR>
</TABLE>
<P>
_HTML_
	if ( $mode eq 'edit'){
		print "<INPUT TYPE=submit VALUE=\"　修正する　 \">\n";
		print "　 [ <A HREF=\"$cgi?board=$board\">修正をやめる</A> ]\n";
	} else {
		print "<INPUT TYPE=submit VALUE=\"　投稿する　 \">\n";
		print "　 [ <A HREF=\"$cgi?board=$board\">投稿をやめる</A> ]\n";
	}

	print "</FORM>\n";

	if ( $mode eq 'reply' ){
		print "<HR NOSHADE SIZE=1>\n";
		print "元記事<P>\n";
		&DrawTopic( $wparam, 0);
	}
}


#---------------------------
#記事を登録する wparamにより新規投稿、返信、編集を使い分けている

sub	RegistMessage {
	local($errmsg) = '';

	if (1 != $config{'readonly'} ){
		if ( $name eq ""){ $errmsg = "<LI>お名前が空白です</LI>"; }
		if ( $email ne '' && $email !~ /[0-9a-z\.\~\-\_\/]+\@[0-9a-z\.\-\/\~\_]+/i){ $errmsg = "<LI>メールアドレスが不適切です</LI>"; $email = ''; }
		if ( $hp ne '' && $hp !~ /http\:\/\/[\d\w\.\~\-\_\/]+/i){ $errmsg = "<LI>ホームぺージのURLが不適切です</LI>";$hp = ''; }
	}

	if ( $config{'baseurl'} ne "." && $ENV{'HTTP_REFERER'} !~ $config{'baseurl'}){ $errmsg = "<LI>この URL $config{'baseurl'} 以外からは投稿出来ません</LI>";};
	if ( $subject eq "" && $wparam eq 'new') { $errmsg = "<LI>タイトルが空白です</LI>";}
	if ( $comment eq ""){ $errmsg = "<LI>コメント欄が空白です</LI>";}
	if ( length($comment) > $max_comment) {	$errmsg = "<LI>文章が長すぎます</LI>";}

	#入力エラーがあるようなら再入力画面にする
	if ( $errmsg ne '' ){
		&DrawHeader('再入力',1,1);
		print "<EM><FONT COLOR=$config{'color_em'}><B>*入力にエラーがあります。内容をお確かめのうえ再度入力をお願いします。<UL>$errmsg</UL></B></FONT></EM>\n";
		&InputMessage($wparam, 1);
		return;
	}

	if ( $wparam eq 'edit' || 1 == $config{'readonly'}){
		if ($pwd ne $admin_password) {
			&Error('記事データの受信エラー','受信したデータにエラーがありました');
		}
	}

	if ( $name eq $admin_name && $wparam ne 'edit' && 1 != $config{'readonly'}){
		if ($pwd eq '' || $pwd ne $admin_password) {
			&InputPassword('管理者名での投稿', '管理者の名前での投稿には管理パスワードが必要です');
		}
	}

	if ( $wparam eq 'new' || $wparam eq 'reply') {
		if ( $wparam eq 'reply' ){ $reply = $number; }

		local($anumber,$areply,$areply_count,$areply_time,$atime,$asubject,$aname,$aemail,$ahp,$aicq,$aip,$apassword,$acomment,$amenu,$aremote_host) = split(/<>/,$datalist{$max_number});
		if ( $asubject eq $subject && $name eq $aname && $comment eq $acomment) {
			$config{'information'} = "<EM>直前の投稿と内容が全く同じですので二重投稿と判断されました。<BR>最初に投稿されたデータは受付けられています</EM>";
			&View;
			return;
		}

		$time = time;
		$reply_time = time;
		$max_number++;
		$number = $max_number;
		$COOKIE{'name'} = $name;
		$COOKIE{'hp'} = $hp;
		$COOKIE{'email'} = $email;
		$COOKIE{'icq'} = $icq;
		$COOKIE{'password'} = $password;
		&SetCookie;

		$ip = $ENV{'REMOTE_ADDR'};
		$remote_host = $ENV{'REMOTE_HOST'};

		if ($password ne '') {
			$password = crypt( $password, 'hodare');
		}

	} elsif ( $wparam eq 'edit') {
		$max_number = $number;
	}

	&SetData( $max_number );
	$temp_time = $time;
	$temp_reply = $reply;

	#返信の場合は親記事の返信数をカウントアップ
	if ($wparam eq 'reply') {
		&GetData( $reply );	#この時点でカレントには親記事のデータが入っている
		$reply_count++;
		if ( $reply_time < $temp_time ) {
			$reply_time = $temp_time;
		}
		&SetData( $temp_reply );
		push(@replylist, $max_number); #子記事の場合はリストの最後に追加
	} elsif ($wparam eq 'new'){
		unshift(@topiclist, $max_number); #親記事の場合はリストの最初に追加
	}

	&WriteData;

	if ($wparam eq 'edit'){
		$config{'information'} = '<CENTER><B>記事は修正されました</B></CENTER>';
	} else {
		$config{'information'} = '<CENTER><B>投稿ありがとうございます</B></CENTER>';
	}

	&View;
}


#---------------------------
# 1=ロック 0=解除

sub FileLock {
	local($lock) = @_;
	local($retry) = 0;

	if ( 1 == $lock ){
		foreach (1..6){
			unless ( -e $board ) {
				mkdir( $board, 0755 );
				last;
			}
			$retry++;
			sleep(3);
		}
	} else {
		rmdir( $board );
	}
}

#---------------------------
# ERROR

sub Error {
	local($errmsg) = @_;
	&DrawHeader('エラー',1,1);
	print "$errmsg\n";
	&DrawFooter;
	exit 0;
}


#---------------------------
# SET COOKIE

sub SetCookie {
	local($cook) = "name<$COOKIE{'name'}>hp<$COOKIE{'hp'}>email<$COOKIE{'email'}>icq<$COOKIE{'icq'}>password<$COOKIE{'password'}>sort<$COOKIE{'sort'}>";
	$ENV{'TZ'} = "GMT"; # 国際標準時の取得

	local($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time + 7*24*60*60);
	if ($year < 99) { $year += 100; }
	$year += 1900;
	if ($sec  < 10)  { $sec  = "0$sec";  }
	if ($min  < 10)  { $min  = "0$min";  }
	if ($hour < 10)  { $hour = "0$hour"; }
	if ($mday < 10)  { $mday = "0$mday"; }
	$mon = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
	$youbi = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday')[$wday];
	$date_gmt = "$youbi, $mday\-$mon\-$year $hour:$min:$sec GMT";
	print "Set-Cookie: $cookie_id=$cook; expires=$date_gmt\n";
}

#---------------------------
# GET COOKIE

sub GetCookie{
	local($name,$value);
	@pairs = split(/;/,$ENV{'HTTP_COOKIE'});

	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}

	@pairs = split(/>/,$DUMMY{$cookie_id});

	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;
		$COOKIE{$name} = $value;
	}
}


#---------------------------
# DRAW HEADER

sub	DrawHeader {
	local($title,$show_information,$show_toolbar)=@_;
	local($i, $str, $atime, $info, $sr);

	unless ($title && $title ne ''){
		$title = "$config{'bbstitle'}";
	}

	if ( 1 == $show_information ){
		$info = '';
	} else {
		$info = "<FONT SIZE=2>$config{'information'}</FONT><BR>";
	}

	if (1 == $config{'readonly'} ){
		$sr = "<DIV ALIGN=right><FONT SIZE=2>READONLY</FONT></DIV>\n";
	}

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

	print <<_HTML_;
<HTML><HEAD>
<META NAME="GENERATOR" CONTENT="Board.cgi v$version">
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$code">
<STYLE>
A:link { text-decoration: none; color: $config{'color_link'} }
A:visited { text-decoration: none; color: $config{'color_link'} }
A:active { text-decoration: none; color: $config{'color_em'} }
A:hover { text-decoration: underline; color: $config{'color_em'}; }
EM { text-decoration:none; font-style: normal; font-weight: bold; color: $config{'color_em'}; }
TD { vertical-align: top; }
</STYLE>
<TITLE>$config{'bbstitle'}</TITLE>
<style type="text/css"><!--body {  background:  url(../../images/back-i.jpg) no-repeat}--></style>
</HEAD>
<BODY TEXT=$config{'color_text'} BGCOLOR=$config{'color_bg'} LINK=$config{'color_link'} ALINK=$config{'color_link'} VLINK=$config{'color_link'} BACKGROUND="$config{'image_background'}">
<BR><BR><CENTER>
<table BORDER=0 CELLPADDING=4 CELLSPACING=0><TR><TD width=30><img src=../../images/hata-1.gif></TD>
<TD width=325><img src=../../images/hodare.gif></TD><TD width=30><img src=../../images/hata-2.gif></TD></TR>
<table WIDTH=70% BORDER=0 CELLPADDING=4 CELLSPACING=0 BGCOLOR=$config{'color_subject_bg'}>
<TR><TD><FONT COLOR=$config{'color_subject'}><B><CENTER>$title</B></CENTER></TD></TR>
</TABLE></CENTER>

$sr
$str
$info

_HTML_

	if ( 1 != $show_toolbar && 1 != $config{'readonly'} ){
			print <<_HTML_;
<CENTER>
<TABLE BORDER=0 CELLPADDING=4 CELLSPACING=0>
<TR>
<TD>
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=hidden NAME=cmd VALUE=new>
<INPUT TYPE=submit VALUE="新規投稿">
</FORM>
</TD>
_HTML_
	if ( &IsSort ) {
		print <<_HTML_;
<TD NOWRAP>
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=hidden NAME=cmd VALUE="sort0">
<INPUT TYPE=submit VALUE="投稿順で\表\示">
</FORM>
</TD>
_HTML_
	} else {
		print <<_HTML_;
<TD NOWRAP>
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=hidden NAME=cmd VALUE="sort1">
<INPUT TYPE=submit VALUE="レス順で\表\示">
</FORM>
</TD>
_HTML_
	}
	print <<_HTML_;
<TD NOWRAP>
<FORM METHOD="$method" ACTION="$cgi">
<INPUT TYPE=hidden NAME=board VALUE="$board">
<INPUT TYPE=hidden NAME=cmd VALUE=search>
<INPUT TYPE=text NAME=wparam SIZE=20>
<INPUT TYPE=submit VALUE="検索">
</FORM>
</TD>
</TR>
</TABLE>
</CENTER>
_HTML_
	}

}

#---------------------------
# DRAW FOOTER

sub DrawFooter {
	print <<_HTML_;
<HR NOSHADE SIZE=1>
<FONT SIZE=2>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=0>
<TR>
<TD NOWRAP><FONT SIZE=2>
<A HREF="$config{'homepage'}">ホームへ</A> |
<!---<A HREF="$cgi?board=$board&cmd=">記事\表\示</A> | --->
_HTML_


	print <<_HTML_;

<A HREF="admin.cgi">管理画面</A>
_HTML_

	if ( $FORM{'board'} && 1 == $config{'readonly'} && 1 != $show_footer){
		print " | <A HREF=\"$cgi?board=$board&cmd=new\">新規投稿</A>";
	}

	print <<_HTML_;
<TD NOWRAP ALIGN=right><FONT SIZE=2>
管理者 <A HREF="mailto:$admin_email"><B>$admin_name</B></A>
</TD>
</TR>
</TABLE>
<HR NOSHADE SIZE=1>
<CENTER><font size=1><a href=http://www.atlas-net.com/ target=_blank>Copyright (C) ATLAS DESIGN WORKS 2004 All righrt reserved</a></font>
<br><br><FONT SIZE=2>$copyright</CENTER></FONT>
</BODY></HTML>
_HTML_
}

#---------------------------
# FORMAR DATE TIME

sub FormatDateTime {
	local($atime, $flag) = @_;
	$ENV{'TZ'} = "JST-9";
	local($sec,$min,$hour,$mday,$mon,$year,$dayofweek) = gmtime($atime+$timezone*60*60);

	if ($year < 99) { $year += 100; }
	$year += 1900;
	$mon++;
	if ($mon < 10) { $mon = "0$mon";}
	if ($mday < 10) { $mday = "0$mday";}
	if ($hour < 10) { $hour = "0$hour";}
	if ($min < 10) { $min = "0$min";}
	$dow = ('日','月','火','水','木','金','土') [$dayofweek];

	if (1 == $flag) {
		$date = "<FONT SIZE=2>$mon/$mday ($dow) $hour:$min</FONT>";
	} else {
		$date = "<FONT SIZE=2>$year/$mon/$mday ($dow) $hour:$min</FONT>";
	}

	$date;
}

#---------------------------
# FORMAT NAME

sub FormatName {
	local($name) = @_;
	if ( $name eq $admin_name ) {
		$name = "<FONT COLOR=$config{'color_em'}><B>$name</B> [管理人]</FONT>";
	}
	$name;
}

#---------------------------
# 文章内のURLやFTPや引用文などを変換する

sub	FormatComment {
	local($com,$name)=@_;

	$com = "<P>$com</P>";
	$com =~ s/>(&gt;[^<]*)/><FONT COLOR=$config{'color_quote'}>$1<\/FONT>/g;
	$com =~ s/(http:\/\/[0-9a-z?#=:\.\~\-\_\/\&\;]+)/<A HREF=\"$1\" TARGET=\"_blank\">$1<\/A>/ig;
	$com =~ s/(ftp:\/\/[0-9a-z\.\~\-\_\/]+)/<A HREF=\"$1\" TARGET=\"_blank\">$1<\/A>/ig;

	#管理者だけ B, U, UL, LI, EM のHTMLタグが使える
	#HTMLタグの閉じ忘れがあるとデザインがおもむろに崩れるからである
	#管理者なら記事の編集もできるし、多少なりともHTMLの知識があるという前提

	if ( $name eq $admin_name ) {
		$com =~ s/(&lt;B&gt;)/<B>/ig;
		$com =~ s/(&lt;\/B&gt;)/<\/B>/ig;
		$com =~ s/(&lt;U&gt;)/<U>/ig;
		$com =~ s/(&lt;\/U&gt;)/<\/U>/ig;
		$com =~ s/(&lt;UL&gt;)/<UL>/ig;
		$com =~ s/(&lt;\/UL&gt;)/<\/UL>/ig;
		$com =~ s/(&lt;LI&gt;)/<LI>/ig;
		$com =~ s/(&lt;\/LI&gt;)/<\/LI>/ig;
		$com =~ s/(&lt;EM&gt;)/<EM>/ig;
		$com =~ s/(&lt;\/EM&gt;)/<\/EM>/ig;
	}

	$com;
}

#---------------------------
# GET DATA

sub GetData {
	local($num) = @_;
	($number,$reply,$reply_count,$reply_time,$time,$subject,$name,$email,$hp,$icq,$ip,$password,$comment,$menu,$remote_host) = split(/<>/,$datalist{$num});
}

#---------------------------
# SET DATA

sub SetData {
	local($num) = @_;
	if($reply_count eq '') { $reply_count = 0 };
	if ($name eq $admin_name){
		$ip = '';
		$remote_host = '';
	}
	$datalist{$num} = "$number<>$reply<>$reply_count<>$reply_time<>$time<>$subject<>$name<>$email<>$hp<>$icq<>$ip<>$password<>$comment<>$menu<>$remote_host<>0";
}

#---------------------------
# IS NEW

sub IsNew {
	local($t) = @_;
	local($icon) = '';

	if ( int((time - $t)/3600) < $config{'flush_time'}) {
		$icon = "<IMG SRC=\"$icon_new\" WIDTH=$icon_new_width HEIGHT=$icon_new_height BORDER=0 ALT=\"New\">";
	}

	return $icon;
}

#---------------------------
# IS SORT

sub IsSort {
	return ( $cmd eq 'sort1' || $COOKIE{'sort'} eq '1');
}


__END__
買う<>#600000
売る<>#000060
交換<>#006000
