#!/usr/local/bin/perl

require 'jcode.pl';
require 'init.cgi';

#=======================================================================
#inobbs ver.3.1, (C)Copyright ino
# このソフトウェア（以下「inobbs」と記述）はinoが作成しました。
#
# inobbsはフリーソフトです。
# inobbsを使用して発生したいかなる損害に対しても作者は責任を負いません。
#=======================================================================
$version = '3.1';
$myaddress ='http://anchoco.net/bg/';
#=======================================================================

##########メイン##########
$CHARSET  = 'shift_jis';
$conv='sjis';

$FORMDATA=LOADDATA();

$INITFILE= './logs/init.dat'; #設定保存ファイル

$OVRFILE='./logs/over.dat'; #最大保存を超えた場合の保存先
$DATAFILE= './logs/log.dat'; #ログファイル
$RDATAFILE= './logs/new.dat'; #二重書き込み削除防止用ファイル

$delmode=1;
$reload=0;

CONVINIT(); 
INTOINIT();

### for Cookie ###
$COOKIE_NAME = 'inobbs';
$COOKIE_LIFE = 60; #cookie 有効期間(日)
if($FLAG_COOKIE){ getCookie(); }
##################

readFile();
	
if($FORM{'author'} eq 'admin'){ 
	$check=1; 
	$delmode=0;
	my	($olddate,$oldtitle,$oldauthor,$oldurl,$oldtext,$olddel) = split(/\t/,$RDATA[0]);
	@RDATA = ("$olddate\t$oldtitle\t$oldauthor\t$oldurl\t$oldtext\t$delmode\t");
}else{
	$check=0; 
}

if(exists $FORM{'mode'}) {
	
	if($FORM{'mode'} eq 'pass'){
		if ($FORM{'pass'} eq $PASSWORD) { 
			PRINTHEADDER();
			PRINTINIT();
			PRINTFOOTER();
			exit;
		}
		else { 
			ERRORPAGE("パスワードが違います <a href=\"$ENV{'SCRIPT_NAME'}?mode=first\">戻る</a>");
		}
	}
	elsif($FORM{'mode'} eq 'setup'){
		my $setuppage;
		
		WRITEINIT($FORMDATA);
		CONVINIT(); 
		INTOINIT();
		if($BBSTYPE eq  'external'){monoData();}
		if($BBSTYPE ne  'external'){$CODETYPE='sjis';}
		$setuppage = PRINTHEADDER(1,$CODETYPE);
		$setuppage .= SAMPLEPAGE(1,$CODETYPE);
		$setuppage .= PRINTFOOTER(1);
		
		&jcode::convert(\$setuppage,'euc');
		&jcode::convert(\$setuppage,$CODETYPE);
		
		print $setuppage;
		exit;
	}
	elsif($FORM{'mode'} eq 'first'){ 
		PRINTHEADDER();
		PRINTPASS(); 
		PRINTFOOTER();
		exit;
	}
	elsif($FORM{'mode'} eq 'write') {
		$len_text=length( $FORM{'text'} );
		$len_author=length( $FORM{'author'} );
		if( $len_text>0-(1-$NEED_TEXT) and $len_author>0-(1-$NEED_AUTHOR) ) {
			my	($olddate,$oldtitle,$oldauthor,$oldurl,$oldtext,$olddel) = split(/\t/,$RDATA[0]);
			if($FORM{'text'} ne $oldtext and $FORM{'author'} ne 'admin'){ 
				if ($FORM{'text'} !~ m/[\x80-\xff]/ and $NO_SPAM) { 
					ERRORPAGE("日本語が含まれていないと書き込みできません。");
				}else{ 
					writeArticle();	# 書き込み
					$COOKIE{'author'} = $FORM{'author'};
					$COOKIE{'url'}  = $FORM{'url'};
					if($FLAG_MAIL && ($FORM{'author'} ne $MYNAME) ){
						sendNotice();		#書き込みをメールでお知らせ
					}
				}
			}
			$reload=1;
		}
	}
	elsif($FORM{'mode'} eq 'delete') {
		my	($olddate,$oldtitle,$oldauthor,$oldurl,$oldtext,$olddel) = split(/\t/,$RDATA[0]);
		if($delmode ne $olddel){ 
			deleteArticle();	# 削除
			$reload=1;
		}
	}
	
	
	### 記事データの書き込み ###
	if( ($FORM{'mode'} eq 'delete' and $delmode ne $olddel) or ($FORM{'mode'} eq 'write' and $FORM{'text'} ne '') ){
		if($BBSTYPE ne 'mailform'){ openFile(); }
		if($BBSTYPE eq 'external' ){ monoData(); }
	}
	
	if(-e $RDATAFILE){ unlink $RDATAFILE; }
	open(FILE, ">>$RDATAFILE") or ERRORPAGE("$RDATAFILEが開けません。");
	eval{ flock(FILE, 2) };
	print FILE @RDATA;
	close FILE;
}

if($BBSTYPE eq 'embed' ){
	if($FORM{'mode'} eq 'view') { 
		$form=1; 
	}else{
		$form=0; 
	}	
}
elsif($BBSTYPE eq 'popup' and $FORM{'ppmode'} eq 'w'){
	if($check != 1){ $PAGEVIEW=0; }
}


# 携帯からのアクセス
if(srchUserAgent() == 0){
	$FLAG_SMILE=0;
	$SHOW_HPMAIL=0;
	$LINK_ICON= $INIT{'link'};
	$MAIL_ICON= $INIT{'mail'};
}
printPage();
exit;


########## 記事ページの出力 ##########
sub	printPage
{
	$check2 = $FORM{'chk'};
	if( $check or $check2 ){ $chk=1; }else{ $chk=0; }
	
	$len_cookie_url=length( $COOKIE{'url'} );
	if( $COOKIE{'url'} =~ /http:\/\//i and $len_cookie_url>7){ $urlValue="$COOKIE{'url'}"; }else{ $urlValue="http://"; }
	if( $COOKIE{'author'} eq "admin"){ $authorValue="" }else{ $authorValue="$COOKIE{'author'}"; }
	if($FLAG_COOKIE){ printCookieHeader(); }
	
	
print <<END;
Content-type: text/html; charset=$CHARSET

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=$CHARSET" />
<link rel="stylesheet" href="$CSSFILE" type="text/css" />
<title>inobbs</title>
END

if(srchUserAgent()==1){
print <<END;
<script language="javascript" type="text/javascript">
	function OpenForm (c) {
		window.open(c,
		'comments',
		'width=$POPWIDTH,height=$POPHEIGHT,scrollbars=yes,status=yes');
	}
	function writeSmileTag(code) 
	{
		var cache = document.smile.text.value;
		this.code = code;
		document.smile.text.value = cache + '(:' + code + ':)'; 
		document.smile.text.focus(); 
	}
	function myReload(){
		window.opener.parent.inobbs.location.reload(true);
	}
</script>
END
}
print qq( </head>\n );


if($reload and $BBSTYPE eq 'popup'){ print qq( <body onload="myReload()" > ); }
else{ print qq( <body>\n ); }

print qq( <div $CSS{'bbsbody'}>\n );

printForm();

if($chk){
print <<END;
<form action="$ENV{'SCRIPT_NAME'}" method="post">
	<input type="password" name="pass" size="10" />
	<input type="hidden" name="mode" value="delete" />
	<input type="submit" value="削除" />
END
	if($BBSTYPE eq 'popup'){print qq( <input type="hidden" name="ppmode" value="w" />\n); }
}

	my	($i, $nextpage, $len_url, $len_author);
	
	my	$begin = $FORM{'page'} * $PAGEVIEW;
	my	$end   = $begin + $PAGEVIEW;
	
	if($end > @DATA) {	$end = @DATA;	}
	
	# 記事の出力
	for($i = $begin ; $i < $end ; ++$i) {
		print bbstext($i);
	}
	if($chk){ print qq(</form>\n); }

	print qq(<div $CSS{'bbsfooter'}>);
	# 次ページへのリンク
	if($PAGEVIEW !=0 ){
		if($end < @DATA) {
			$nextpage = $FORM{'page'} + 1;
			print qq(<a href="$ENV{'SCRIPT_NAME'}?ppmode=$FORM{'ppmode'}&page=$nextpage&chk=$chk">&laquo;prev</a>\n);
			$flag_prev=1;
		}else{ $flag_prev=0; }
		if($FORM{'page'}>0  &&  $end <= @DATA) {
			$nextpage = $FORM{'page'} - 1;
			print qq(&nbsp;<a href="$ENV{'SCRIPT_NAME'}?ppmode=$FORM{'ppmode'}&page=$nextpage&chk=$chk">next&raquo;</a>\n);
			$flag_next=1;
		}else{ $flag_next=0; }
	}
	
	if($flag_prev or $flag_next){ print qq(<br />); }
	
	if($COPYRIGHT==1){ print qq(<a href="$myaddress" target="_blank">inobbs ver.</a><a href="$ENV{'SCRIPT_NAME'}?mode=first" target="_blank">$version</a>); }
	else{ print qq(<div style="display: none">inobbs ver.$version ( $myaddress )</div>); }
	print qq(</div>);
	
print <<END;
</div>
</body>
</html>
END
}

sub printForm
{
print qq(<div $CSS{'bbsform'}>);

if($BBSTYPE eq 'embed'){
	if($form){
		$CALL_CLOSE=0;
		formStyle(); 
	}
	elsif($form ==0){
print <<END;
	<form action="$ENV{'SCRIPT_NAME'}" method="post">
		<input type="submit" value="$BF_BOTTON">
		<input type="hidden" name="mode" value="view">
	</form>
END
	}
}

elsif($BBSTYPE eq 'popup'){
	if($FORM{'ppmode'} ne 'w'){
		if($CALL_WRITE){ 
			print qq(<a href="$ENV{'SCRIPT_NAME'}?ppmode=w" onclick="OpenForm(this.href); return false">$PLZWRITE</a>\n); 
		}
	}
	elsif($FORM{'ppmode'} eq 'w'){
		formStyle();
	}
}

elsif($BBSTYPE eq 'external'){
	if($FORM{'ppmode'} ne 'r'){ formStyle(); }
	if($FORM{'ppmode'} eq 'r'){ $PAGEVIEW=$LOGVIEW; }
}

elsif($BBSTYPE eq 'mailform'){
	$AF_BOTTON='送信';
	$PAGEVIEW=0;
	$FLAG_SMILE=0;
	$CALL_CLOSE=0;
	formStyle(); 
}


print qq(</div>);
}

sub formStyle
{
print <<END;
	<form action="$ENV{'SCRIPT_NAME'}" method="post" name="smile">
		<input type="text" id="textfield" name="author" size="$NAME_WDTH" maxlength="50" value="$authorValue" />name<br />
		<input type="text" id="textfield" name="url" size="$URL_WDTH" maxlength="100" value="$urlValue" />url/mail<br />
		<textarea id="textareafield" name="text" cols="$TXT_WDTH" rows="$TXT_HGHT" ></textarea><br />
		<input type="hidden" name="mode" value="write" />
END

	if($FLAG_SMILE){ addSmileTag(); }

	print qq(<input type="submit" value="$AF_BOTTON" />);
	if($CALL_CLOSE){ print qq(<input type="button" name="close" value="$PLZCLOSE" onClick="window.close()" />); }
	print qq(</form>);
	
}
##########  記事を書き込む ########## 
sub putDate
{
	#引数 0 "$year,$mon,$mday,$wday,$hour,$min,$sec"
	#引数 1 "$author"
	
	my $name,$date= $DT_FRMT;
	my @dt = split(/\//,$_[0]);
		
	if( $dt[1] ne ''){
		my @mnth = split(/\,/,$SHOW_MNTH);
		my @week = split(/\,/,$SHOW_WKDY);
		my @ap = split(/\,/,$SHOW_AMPM);
		my $ampm = $dt[4] < 12 ? $ap[0] : $ap[1]; # AM･PMの設定
		if($CHK_12H){$dt[4] = $dt[4] < 12 ?  $dt[4] : $dt[4] - 12; }# 12時間ごとの表示にする
		
		my $YY = sprintf("%04d", $dt[0]);
		my $yy = substr($dt[0],2,2);
		my $DD = sprintf("%02d", $dt[2]);
		my $dd = sprintf("%2d", $dt[2]);
		my $HH = sprintf("%02d", $dt[4]);
		my $hh = sprintf("%2d", $dt[4]);
		my $MM = sprintf("%02d", $dt[5]);
		my $mm = sprintf("%2d", $dt[5]);
		my $SS = sprintf("%02d", $dt[6]);
		my $ss = sprintf("%2d", $dt[6]);
		
		$date =~ s/YY/$YY/g;
		$date =~ s/yy/$yy/g;
		$date =~ s/DD/$DD/g;
		$date =~ s/dd/$dd/g;
		$date =~ s/HH/$HH/g;
		$date =~ s/hh/$hh/g;
		$date =~ s/MM/$MM/g;
		$date =~ s/mm/$mm/g;
		$date =~ s/SS/$SS/g;
		$date =~ s/ss/$ss/g;
		
		$date =~ s/MONTH/$mnth[$dt[1]]/g;
		$date =~ s/WEEK/$week[$dt[3]]/g;
		$date =~ s/AMPM/$ampm/g;
		$date =~ s/NAME/$_[1]/g;
		
	}else{
		#旧表示互換
		if( $date =~ /NAME/ ){ $name = 'by '.$_[1]; }
		if( $date =~ /(YY|yy|DD|dd|HH|hh|MM|mm|SS|ss|MONTH|WEEK|AMPM)/){ $dt[0] = ' at '.$dt[0]; }
		else{$dt[0]='';}
		$date = "$name$dt[0]";
	}
	
	return $date;
}

sub	writeArticle
{
	$ENV{'TZ'} = $TZONE;
	my	($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
	$year+=1900;
	my	$date = "$year/$mon/$mday/$wday/$hour/$min/$sec";
	
	unshift @DATA, "$date\t$FORM{'title'}\t$FORM{'author'}\t$FORM{'url'}\t$FORM{'text'}\t\n";
	while(@DATA > $MAXLINE) {
		open(FILE, ">>$OVRFILE") or ERRORPAGE("$OVRFILEが開けません。");
		eval{ flock(FILE, 2) };
		seek(FILE,0,0);
		print FILE $DATA[$MAXLINE];
		close FILE;
		
		pop @DATA;
	}
	###
	$delmode=0;
	@RDATA = ("$date\t$FORM{'title'}\t$FORM{'author'}\t$FORM{'url'}\t$FORM{'text'}\t$delmode\t");
	
}

sub bbstext #$i
{
		my $bbstext,$i=@_[0];
		my ($date, $title, $author, $url, $text) = split(/\t/, $DATA[$i]);
		
		$len_author = length($author); 
		if($len_author < 1){ $author=$UNKNOWN; }
		
		convert2url($text,$url);
		if($FLAG_SMILE){ repSmileTag($text); repSmileTag($author); }
		
		$len_url = length($url);
		if($url=~/mailto/i or $url=~/http:\/\//i and $len_url>7) { 
			if($SHOW_HPMAIL){
				if($url=~/mailto/i){ $hpmail="$url$MAIL_MARK</a>";}
				else{$hpmail="$url$HP_MARK</a>";}
				$author="$url$author</a> $hpmail";
			}else{
				$author="$url$author</a>";
			}
		}
		
		$date=putDate($date,$author);
		
		$bbstext =qq(<div $CSS{'bbscontent'}>$text);
		$bbstext.=qq(<div $CSS{'bbsdate'}>);
			if($chk){$bbstext.= qq(<input type="checkbox" id="chkbox_$i" name="del_$i" />);}
		$bbstext.=qq($date</div>);
		$bbstext.=qq(</div>);
		
		return $bbstext;
}
########## 記事を削除する ##########
sub	deleteArticle
{
	my	$key;
	
	if($FORM{'pass'} ne $PASSWORD) {
		ERRORPAGE("管理パスワードが違います。");
	}
	
	foreach $key (sort {$b cmp $a} keys %FORM) {
		if($key =~ /del_([0-9]+)/) {
			splice @DATA, $1, 1;
		}
	}
	###
	$delmode=1;
	my	($olddate,$oldtitle,$oldauthor,$oldurl,$oldtext) = split(/\t/,$DATA[0]);
		$oldtext =~ s/\s+$//;
	@RDATA = ("$olddate\t$oldtitle\t$oldauthor\t$oldurl\t$oldtext\t$delmode\t");
	
}

########## 記事データの書き込み ##########
sub openFile
{
open(FILE, ">$DATAFILE") or ERRORPAGE("$DATAFILEが開けません。");
eval{ flock(FILE, 2) };
print FILE @DATA;
close FILE;
}
########## 記事データの読み込み ##########
sub readFile
{
open(FILE, "<$DATAFILE") or ERRORPAGE("$DATAFILEが開けません。");
eval{ flock(FILE, 1) };
@DATA = <FILE>;
close FILE;
open(FILE, "<$RDATAFILE") or ERRORPAGE("$RDATAFILEが開けません。");
eval{ flock(FILE, 1) };
@RDATA = <FILE>;
close FILE;
}


########## アドレス変換 ##########
sub convert2url
{
	foreach ($_[0]) { #foreach ($text) {
		&jcode::convert(\$_,'euc');
		s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+)
		/<a href=\"$1\" target=\"_blank\">$LINK_ICON<\/a>/giox;
		s/(https:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+)
		/<a href=\"$1\" target=\"_blank\">$LINK_ICON<\/a>/giox;
		s/(ftp:\/\/[\w\.\~\-\/]+)
		/<a href=\"$1\" target=\"_blank\">$LINK_ICON<\/a>/giox;
		s/([\w\.\-\_]+)\@([\w\.\-\_]+)
		/<a href=\"mailto\:$1\@$2\">$MAIL_ICON<\/a>/giox;
		&jcode::convert(\$_,$conv);
	}
	foreach ($_[1]) { #foreach ($url) {
		&jcode::convert(\$_,'euc');
		s/(http:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+)
		/<a href=\"$1\" target=\"_blank\">/giox;
		s/(https:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+)
		/<a href=\"$1\" target=\"_blank\">/giox;
		s/(ftp:\/\/[\w\.\~\-\/\?\&\+\=\:\@\%\;\,]+)
		/<a href=\"$1\" target=\"_blank\">/giox;
		s/([\w\.\-\_]+)\@([\w\.\-\_]+)
		/<a href=\"mailto\:$1\@$2\">/giox;
		&jcode::convert(\$_,$conv);
	}

}

########## スマイリータグ ##########
sub addSmileTag
{
	my $i;
	print qq( <div $CSS{'bbssmile'}> \n);
			foreach( @SMILEIMG ) {
				print qq( <img onClick="writeSmileTag\('$SMILETAG[$i]'\)" src="$SMILEIMG[$i]" width="$SMILEWIDTH" height="$SMILEHEIGHT" border="0" alt="\(:$SMILETAG[$i]:\)" /> \n);
			$i+=1;
			}
	if( length($SMILETAGNOTE)>0 ){ print qq( <div $CSS{'bbstagnote'}>$SMILETAGNOTE</div> \n); }
	print qq( </div> \n);
}

sub repSmileTag
{
	my $i;
	foreach( @SMILEIMG ) {
		$_[0] =~ s/\(:$SMILETAG[$i]:\)/<img src=\"$SMILEIMG[$i]\" width=\"$SMILEWIDTH\" height=\"$SMILEHEIGHT\" border=\"0\" alt=\"(:$SMILETAG[$i]:)\" \/>/g;
		$i+=1;
	}
}

##########モノログ書き出し##########
sub monoData
{
	my	$begin = 0;
	my	$end   = $PAGEVIEW;
	
	if($end > @DATA) { $end = @DATA-1; }
	
	my	($i, @header, $write_form, @footer);
		
	for($i = $end ; $i >= $begin ; --$i)
	{		
		unshift @MONO, bbstext($i);
		
		while(@MONO > $PAGEVIEW) { pop @MONO; }	
	}
	
	if($CALL_WRITE){ 
		$write_form=qq( <div $CSS{'bbsform'}><a href="$ENV{'SCRIPT_NAME'}" target="_blank" onclick="OpenForm(this.href); return false">$PLZWRITE</a></div> );
		unshift @MONO, "$write_form";
	}
	

	if($LOGTYPE ne 'js'){ $header[0]=qq( <script type="text/javascript" language="javascript"> );}
	$header[1]=" function OpenForm (c) { window.open(c, 'form', 'width=$POPWIDTH,height=$POPHEIGHT,scrollbars=yes,status=yes'); } ";
	if($LOGTYPE ne 'js'){ $header[2]=" </script> ";}
	if($LOGTYPE eq 'js'){ $header[3]=" document.writeln(' ";}
	$header[4]=qq( <link rel="stylesheet" href="$CSSFILE" type="text/css" /> );
	
	unshift @MONO, "$header[0]$header[1]$header[2]$header[3]$header[4]"; 
		
	
	if($CHK_LOG){
		$footer[0]=qq( <a href="$ENV{'SCRIPT_NAME'}?ppmode=r" target="_blank" onclick="OpenForm(this.href); return false">$PLZLOG</a> );
	}
	if($CHK_LOG and $COPYRIGHT){
		$footer[1]=qq( &nbsp;\/&nbsp; );
	}
	if($COPYRIGHT){ 
		$footer[2]= qq(<a href="$myaddress" target="_blank">inobbs ver.</a><a href="$ENV{'SCRIPT_NAME'}?mode=first" target="_blank">$version</a>);
	}else{ 
		$footer[2]= qq(<div style="display: none">inobbs ver.$version ( $myaddress )</div>);
	}
	
	push @MONO,"<div $CSS{'bbsfooter'}>$footer[0]$footer[1]$footer[2]</div>";
	if($LOGTYPE eq 'js'){
		push @MONO,"\'); ";
	}
	
	foreach( @MONO ) {
		&jcode::convert(\$MONO[$i],'euc');
		$MONO[$i] =~ s/\~/%7E/g;
		&jcode::convert(\$MONO[$i],$CODETYPE);
		$i+=1;
	}
	
	
	if($LOGTYPE eq 'js'){
		$LOGFILE= $LOGPATH.'mono.js';#Javascript型のログ書き出しファイル
	}elsif($LOGTYPE eq 'php'){
		$LOGFILE= $LOGPATH.'mono.txt'; #PHP or SSI型のログ書き出しファイル
	}
	if(-e $LOGFILE){ unlink $LOGFILE}
	open(FILE, ">>$LOGFILE") or ERRORPAGE("$LOGFILEが開けません。");
	eval{ flock(FILE, 2) };
	print FILE @MONO;
	close FILE;

}
###### 携帯からのアクセス UserAgentを調べる ######
sub srchUserAgent
{
my $myagent=1;

@user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'});
if ($user_agent[0] =~ /ASTEL/) {
  # ドットi 用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /^UP.Browser/) {
  # EZweb 旧端末用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /^KDDI/) {
  # EZweb WAP2.0 対応端末用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /PDXGW/) {
  # H" 用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /DoCoMo/) {
  # i-mode 用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /J-PHONE/) {
  # J-SKY 用の処理
  $myagent=0;
} elsif ($user_agent[0] =~ /L-mode/) {
  # L-mode 用の処理
  $myagent=0;
} else {
  # それ以外
  $myagent=1;
}

return $myagent;
}

################## for Cookie ##################

###### Cookie Header ######
sub	printCookieHeader
{
	my	(@cpairs, $cname, $cvalue, $value);
	
	# それぞれの$COOKIEから%COOKIEにまとめる
	foreach $cname (keys %COOKIE) {
		$cvalue = $COOKIE{$cname};
		$cvalue =~ s/(\W)/sprintf("%%%02X", ord $1)/eg;
		push @cpairs, "$cname#$cvalue";
	}
	$value = join('&', @cpairs);
	
	# グリニッジ標準時の文字列
	my	@mon_str = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
	my	@wdy_str = qw(Sun Mon Tue Wed Thu Fri Sat);
	my	$life = $COOKIE_LIFE * 24 * 60 * 60;
	my	($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime(time + $life);
	my	$date = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$wdy_str[$wday], $mday, $mon_str[$mon], $year + 1900, $hour, $min, $sec);
	
	print "Set-Cookie: $COOKIE_NAME=$value; expires=$date\n";
}

###### Cookie 取得 ######
sub	getCookie
{
	my	($pair, $cpair);
	
	foreach $pair (split(/;\s*/, $ENV{'HTTP_COOKIE'})) {
		my	($name, $value) = split(/=/, $pair);
		
		# まとめた%COOKIEからそれぞれの$COOKIEに分割
		if($name eq $COOKIE_NAME) {
			foreach $cpair (split(/&/, $value)) {
				my	($cname, $cvalue) = split(/#/, $cpair);
				
				$cvalue =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
				$COOKIE{$cname} = $cvalue;
			}
			last;
		}
	}
}


################## for sendmail ##################

###### メールを送る ######
sub	sendNotice
{
	my $mail;
	
	$FORM{'text'} =~ s/&amp;/&/g;
	$FORM{'text'} =~ s/&lt;/</g;
	$FORM{'text'} =~ s/&gt;/>/g;
	$FORM{'text'} =~ s/<br \/>/\n/g;
	
	$mail  = "To: $MAILTO\n";
	$mail .= "From: $MAILTO\n";
	$mail .= "Subject: " . MAIL64("$SUBJECT");
	$mail .= "Content-Type: text/plain\; charset=\"iso-2022-jp\"\n\n";
	$mail .= "name: $FORM{'author'}\n";
	$mail .= "comment: $FORM{'text'}\n";
	$mail .= "url/mail: $FORM{'url'}\n";

	&jcode::convert(\$mail,'jis');
	open(MAIL, "| $SENDMAIL -i -t -f $MAILTO") or die("ERROR: exec sendmail.");
	print MAIL "$mail\n";
	close (MAIL);
}
###### BASE64エンコード ######

sub MAIL64 {
  local($xx) = $_[0];
  &jcode::convert(\$xx,'jis');
  $xx =~ s/\x1b\x28\x42/\x1b\x28\x4a/g;
  $xx = BASE64($xx);
  return("=?iso-2022-jp?B?$xx?=\n");
}


sub BASE64 {
  my($base) = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            . "abcdefghijklmnopqrstuvwxyz"
            . "0123456789+/";
  local($xx, $yy, $zz, $i);
  $xx = unpack("B*", $_[0]);
  for ($i = 0; $yy = substr($xx, $i, 6); $i += 6) {
    $zz .= substr($base, ord(pack("B*", "00" . $yy)), 1);
    if (length($yy) == 2) {
      $zz .= "==";
    } elsif (length($yy) == 4) {
      $zz .= "=";
    }
  }
  return($zz);
}