#!/usr/bin/perl

#
# 日記CGI
#

# 定義部
$Ver="2005/10/24";

$www=".";
$cgipath="./nicky.cgi";
$vDir=".";

sub InitialNicky
{
# 最新×日分の表示
$PrintDay=5;
$PageCnt=5;
# 最新×日分の表示(iMODE)
$PrintiDay=1;
$PageiCnt=3;
$Age="r";
# 記事を表示させる時の画面幅
$NickyWidth="80%";
$NickyLineWidth="1";
$NickyLineSpan="12";
# 年月日の表現
$Year='年';
$Month='月';
$Day='日';
# 曜日の表現
$WEEK=0;
# 記事本文の表示
$HonbunColor="#000000";
$HonbunSize="2";
# 記事本文の背景色
$HonbunBgColor="#ffffff";
# 記事タイトルの背景色
$TitleBgColor="#4386b1";
# タイトルの縦幅
$TSize="12";
# タイトル行の先頭に付加する文字列
$TitleHead="■";
# リンク用タグを出力する
$LinkTH="No";
# 日付の色
$DateFontColor="#FFFFFF";
# 日付のフォントサイズ
$DateSize="2";
# 記事タイトルの文字色
$TitleFontColor="#CCEDFF";
# 記事タイトルのフォントサイズ
$TitleSize="2";
# 本文をエフェクトする文字と色
$EffectSTR1="#";
$EffectSTR2=">";
$EffectSTR3="（";
$EffectSTR4="＃";
$EffectCOL1="#FF0000";
$EffectCOL2="#00FF00";
$EffectCOL3="#0000FF";
$EffectCOL4="#00FFFF";
$LinkOpen="No";
$Fit_size=200;
$Fit="OFF";
# コメント受付欄のデフォルト縦幅
$CommentRecv="1";
$CommentSTRlen="1024";
$CommentNameWidth="10";
$CommentMessageWidth="30";
$CommentStrSize="3 color=#000000";
$CommentNameStrSize="3 color=#000000";
# コメントの背景色
$CommentBgColor="#F1F5FA";
# コメントの名前フォント色
$CommentNameColor="#975580";
# コメントの名前フォントサイズ
$CommentNameSize="1";
# コメントのフォント色
$CommentFontColor="#3A75AF";
# コメントのフォントサイズ
$CommentFontSize="1";
# コメントの文字列
$CommentStr="コメント";
# コメント枠色
$CommentFlColor="#C5D6EB";
# URLを自動リンクする
#$UrlLink="Yes";
# 時刻の表示
$PutTimeDefault="Yes";
# 過去ログの単語
$MsgNew="<< NEW";
$MsgOld="OLD >>";
$MsgOldLog="過去ログ";
$MsgOldNEWks="[";
$MsgOldNEW="最新";
$MsgOldNEWke="]";
$MsgOldOLDks="[";
$MsgOldOLD="最古";
$MsgOldOLDke="]";
$MsgOldOBgCol="#FFFFFF";
$MsgOldBetween="<a href=\"./nicky.cgi?TitleList\">TitleList</a>";
$MsgOldCol="#000000";
$MsgOldSize="1";
$MsgOldYBgCol="#FFFFFF";
$MsgOldYFnCol="#000000";
$MsgOldMBgCol="#FFFFFF";
$MsgOldYear="年";
$MsgOldMonth="月";
$MsgOldForm="0";
$MsgOld1st="0";
$MsgOldcelp="0";
$MsgOldcels="0";
$MonthSort="UP";
$SaveHTML="OFF";
$LogFname="nicky";
$ks="[";
$ke="]";
$MsgPageOut=1;
#お絵描き系JavaApplet
$image_width=300;
$image_height=300;
$ReplaySTR="Replay";
$ContinueSTR="Continue";
$undoNum=60;
$layerNum=5;
$Quality=0;
$JPEG_border="60";
$CompressL="10";
#TitleList
$MsgOldTG="・";
$TitleListSort="DOWN";
$TLyear="年";
$TLmonth="月";
$TLday="日";
$TLyearsz="5";
$TLmonthsz="4";
$TLdaysz="2";
# その他
# 検索をCGIに吹かせる
$PutSerchTagFlag=0;
# 最新記事のファイルネーム
$NickyHtml="nicky.html";
$tagpl=$taglt=$tagbr=$tagmode=$anker="";
$tag2lf="</p><p>";
$tag3lf="</p><br><p>";
#ユーザーカスタマイズモード
$UserN=$UserL=$UserR=$UserU=$UserD=$UserLC=$UserRC=$UserUC=$UserDC=$UserCmnt="No";
}


#記事本文出力
sub PutNickyOneDay
{
 local($size,$pch,$GrpPath,$PchPath,$ImgLINK,$ImgTAG,$TrTAG,$Msg);
 local($w,$h,$tbTag);
 local($fn, $fn1, $ext, $wpx, $hpx);
 local($continue, $ContinuePath, $apIn);
 local($TitleHeadL, $pt, $flag_uc, $wops);
 local($iTS)="<input type=\"submit\" name=";
 my($dlink, $fw, $fh, $bw, $bh, $rpl, $bkt, $bktl, $tagctl, $ctgp);
 my $alt="";

 $wops="\"window.open(this.href,\'_blank\',\'resizable=yes,menubar=no,directories=no,status=no,location=no,scrollbars=yes";

 # 前準備
 # $size > 0 で画像ファイル有り
 $size=$pch=0;
 if( $GrpFileName ){
	&IsApplet();
	$apIn=$spsize+$PBsize;

	&MakeNickyDir();
	$GrpPath="$NickyDir/$GrpFileName";

	$ext=$GrpPath;
	$ext=~s/^.*\.//;
	$fn1=$GrpFileName;
	$fn1=~s/\..*$//;
	$fn="$NickyDir/$fn1";
	$size=(stat($GrpPath))[7];
	if( $size > 0 ){
		($w, $h)=&GetImageSize($GrpPath);
		if( $w && $h ){
			local($sz);
			$sz=int($size/1024).K;
			$bw=$w;
			$bh=$h;
			$p1=rindex($GrpPath,"\/");
			$p2=rindex($GrpPath,"\/", $p1-1);
			$bg=substr($GrpPath, $p2+1);
			$ThmPath = &get_thumb_name($fn);
			if($ThmPath){
				my($ow,$oh);
				$ow=$w+20;
				$oh=$h+26;
				$GrpPath=$ThmPath;
				($w, $h)=&GetImageSize($GrpPath);
				$fw=" onclick=$wops,width=$ow,height=$oh\');return false;\"";
			}elsif( ($FitCheck eq "ON") && ($w != $fit_size) && ($h != $fit_size) ){
				my($pw, $ph, $fit_width, $fit_height);
				$fiw=$w+20;
				$fih=$h+26;
				$pw=$fit_size/$w;
				$ph=$fit_size/$h;
				if( $pw > $ph ){
					$fit_width=int($w*$ph);
					$fit_height=int($h*$ph);
				}else{
					$fit_width=int($w*$pw);
					$fit_height=int($h*$pw);
				}

				$p1=rindex($GrpPath,"\/");
				$p2=rindex($GrpPath,"\/", $p1-1);
				$gm=substr($GrpPath, $p2);
				$ImgURL="$www$gm";

				if( ($w == $fit_width) && ($h == $fit_height) ){
					undef $fw;
				}else{
					$fw=" onclick=$wops,width=$fiw,height=$fih\');return false;\"";
				}
				$w=$fit_width;
				$h=$fit_height;
			}else{
				undef $fw;
			}
			$p1=rindex($GrpPath,"\/");
			$p2=rindex($GrpPath,"\/", $p1-1);
			$gm=substr($GrpPath, $p2);
			$ImgURL="$www$gm";
			$alt=" width=\"$w\" height=\"$h\" alt=\"$GrpFileName $bw×$bh $sz\"";
			$wpx=$w."px";
			$hpx=$h."px";
		}
	}
	# pch データはあるか
	$PchPath="$fn.pch";
	$pch=(stat($PchPath))[7];
	if( !$pch ){
		$PchPath="$fn.spch";
		$pch=(stat($PchPath))[7];
	}

	#pchが無くてもjpegかgiffでContinue可に
	if(!$pch && ($GrpFileName =~ /\.jpg$|\.jpeg$|\.gif$|\.giff$|\.png$/i)){
		$ContinuePath=$GrpPath;
		$continue=(stat($ContinuePath))[7];
	}
 }

 # ファイルネームが確定しているなら日付取得
 if( $NickyFname ){
	&GetDateFromFname();
	&MakeNickyFname();
 }
 if( ($day==$w_day)&&($month==$w_month)&&($year==$w_year)&&($daysub eq $w_daysub)){
	if( !$saveExec ){
		$flag_new_hit=1;
		if( !$mkHTML ){
   			print "<a name=\"tgt\"></a>\n";
		}
	}
 }
 $week=$Week[&GetWeek($year, $month, $day)];

 # 本文＆画像を指定のレイアウトで出力
 $HonbunHead="<Font Color=\"$MsgColor\" SIZE=\"$MsgSize\">";
 $HonbunHud="</Font>";
 $Msg=&Effect($Message);
 $Honbun=$HonbunHead.$Msg.$HonbunHud;
 $TrTAG="<tr bgcolor=\"$HonbunBgColor\">";

 #pchファイルがある場合は再生タグを
 $dlink="DATE=$year$month$day$daysub";
 $ctgp="ctgry=$Category?" if( $Category );
 if( $pch ){
	my($ww,$hh);
	if( $RepLayout eq "CHECKED" ){
		$ww=$bw+90;$hh=$bh*2+120;
		$rpl="\?RepLayout=CHECKED";
	}else{
		$ww=$bw*2+90;$hh=$bh+160;
		$rpl="";
	}
	$PchPath=~s/$vDir\///;

	if( $apOP eq "Yes" ){
		$ImgLINK="<a href=\"$cgipath?Pch_File=$PchPath?Pch_Speed=-1$rpl?Mode=PaintBBSDraw\" onclick=$wops,width=$ww,height=$hh\');return false;\">$ReplaySTR</a>";
	}else{
		$ImgLINK="<a href=\"$cgipath?Pch_File=$PchPath?Pch_Speed=-1$rpl?Mode=PaintBBSDraw\">$ReplaySTR</a>";
	}
	if(($Admin) && (select eq "main::STDOUT") && $apIn){
		$ImgLINK.="/<a href=\"$cgipath?Pch_File=$PchPath?$ctgp$dlink?Mode=CallApplet\">$ContinueSTR</a>";
	}
 }elsif( $continue && ($Admin) && (select eq "main::STDOUT") && $apIn){
	$ImgLINK="<a href=\"$cgipath?Pch_File=$ContinuePath?$ctgp$dlink?Mode=CallApplet\">$ContinueSTR</a>";
 }
 #画像レイアウトが左上＆右上の場合はalign追加
 if( $Layout == 4 ){	#画像レイアウトが左上
	$ImgLINK="$ImgLINK$br" if( $ImgLINK );
	if( $taglt eq "strict" ){
		$ImgTAG="<img src=\"$ImgURL\" $alt class=\"layoutl\"$e";
	}else{
		$ImgTAG="<img src=\"$ImgURL\" $alt align=\"left\"$e";
	}
 }elsif( $Layout == 5 ){	#画像レイアウトが右上
	$ImgLINK="<div style=\"text-align:right\">$ImgLINK</div>" if( $ImgLINK );
	if( $taglt eq "strict" ){
		$ImgTAG="<img src=\"$ImgURL\" $alt class=\"layoutr\"$e";
	}else{
		$ImgTAG="<img src=\"$ImgURL\" $alt align=\"right\"$e";
	}
 }else{
	#画像レイアウト左上、右上以外
	$ImgLINK="$ImgLINK$br" if( $ImgLINK );
	$ImgTAG="<img src=\"$ImgURL\" $alt$e";
 }
 if( $ThmPath ){
	$ImgTAG="<a href=\"$www/$bg\"$fw>$ImgTAG</a>" if( $fw );
 }else{
	$ImgTAG="<a href=\"$ImgURL\"$fw>$ImgTAG</a>" if( $fw );
 }
# リンク用タグ
 $pt="$year$month$day$daysub";
 if( $LinkTH eq "Yes" ){
	if( $tagmode eq "xhtml" ){
		$TitleHeadL="<a href=\"$cgipath?DT=$pt#x$pt\" title=\"$pt\">$TitleHead</a>";
	}else{
		$TitleHeadL="<a href=\"$cgipath?DT=$pt#$pt\" title=\"$pt\">$TitleHead</a>";
	}
 }else{
	$TitleHeadL=$TitleHead;
 }
$bkt=$TitleHead;
$bktl=$TitleHeadL;
undef $TitleHead if( !$Title );
undef $TitleHeadL if( !$Title );

# 前準備ができたら出力する
if( $anker ne "no" ){
 if( $tagmode eq "xhtml" ){
	print "<a id=\"x$pt\"></a>\n";
 }else{
	print "<a name=\"$pt\"></a>\n";
 }
}
# ユーザーカスタマイズモード
$flag_uc=&ReqUserCustom();
if( $tbRcv eq "Yes" ){
	$tbnum=&getTBnum($pt);
	if( $tbnum || ($tbPast eq "Yes") || !$saveExec && ($Mode ne "MONTH") && !$page){
		$tbTag=$tbTAG;
		$tbTag=~s/%tbnum/$tbnum/g;
		$tbTag=~s/%pt/$pt/g;
	}else{ $tbTag=""; }
}else{
	$tbTag="";
}
$ctgTag=$ctgTagL="";
if( $ctgedit ){
	my($kk, $ff, $idstr, $j, $mini);
	&get_ctg_data() if( !$load_ctg );
	for( $kk=0; $kk<$load_ctg; $kk++ ){
		$ff=$ctg_ff[$kk];
		next if( $$ff[2] ne "yes" );
		$idstr=$$ff[4];
		next if( $idstr eq "idrst" );
		next if( $idstr == 0 );
		if( $idstr > 1 ){ $j=1<<($idstr-1); }else{ $j=$idstr; }
		$mini="<a href=\"$cgipath?ctgry=$j\">$$ff[0]</a>";
		if( $Category & $j ){
			if( !$ctgTag ){ $ctgTag=$$ff[0]; $ctgTagL=$mini; }else{
				$ctgTag  = "$ctgTag$ctgSplit$$ff[0]";
				$ctgTagL = "$ctgTagL$ctgSplit$mini";
			}
		}
	}
	if( !$ctgTag ){
		$ctgTag=$ctgTagL="none";
	}
}
print "<a name=\"cp$pt\" id=\"cp$pt\"></a>" if((($Mode eq "CINPUT") || ($Mode eq "CINPUTS")) && (select eq "main::STDOUT"));
#$pt=sprintf("%s_%08x", $pt, $Category) if( $Category );
if( $flag_uc && ($size <= 0) && ($UserN eq "Yes") ){
	&CustomNprint();
}elsif( $flag_uc && ($Layout == 0) && ($UserL eq "Yes") ){
	&CustomLprint();
}elsif( $flag_uc && ($Layout == 1) && ($UserR eq "Yes") ){
	&CustomRprint();
}elsif( $flag_uc && ($Layout == 2) && ($UserU eq "Yes") ){
	&CustomUprint();
}elsif( $flag_uc && ($Layout == 3) && ($UserD eq "Yes") ){
	&CustomDprint();
}elsif( $flag_uc && ($Layout == 4) && ($UserLC eq "Yes") ){
	&CustomLCprint();
}elsif( $flag_uc && ($Layout == 5) && ($UserRC eq "Yes") ){
	&CustomRCprint();
}elsif( $flag_uc && ($Layout == 6) && ($UserUC eq "Yes") ){
	&CustomUCprint();
}elsif( $flag_uc && ($Layout == 7) && ($UserDC eq "Yes") ){
	&CustomDCprint();
}
#ユーザーカスタマイズモードここまで
else{
local($hdt);
if( $Title ){
$hdt="<Font Color=\"$TitleFontColor\" SIZE=\"$TitleSize\">$Title</Font>\n";
}else{ $hdt=""; }

print <<HTML;
<table bgcolor="$TitleBgColor" cellpadding="$NickyLineWidth" cellspacing="0" border="0" width="$NickyWidth" summary="diary">
<tr><td><table border="0" cellpadding="0" cellspacing="0" width="100%" summary="title">
<tr bgcolor="$TitleBgColor"><td height="$TSize" align="LEFT"><b>
<Font Color="$DateFontColor" SIZE="$DateSize">$TitleHeadL$Date　</Font>
$hdt
</b></td></tr><tr><td>
<table bgcolor="$HonbunBgColor" border="0" Cellspacing="0" cellpadding="$NickyLineSpan" width="100%" summary="day">
HTML
	if( $size > 0 ){
		# レイアウト指定が右
		if( $Layout == 1 ){
			print "$TrTAG<td>$Honbun</td><td width=\"$w\">$ImgLINK$ImgTAG</td></tr>";
		}
		# レイアウト指定が上
		elsif( ($Layout == 2) || ($Layout == 6) ) {
			print "$TrTAG<td>";
			if( $Layout == 6 ){
				print "<center>$ImgLINK$ImgTAG</center>";	#上中央
			}else{
				print "$ImgLINK$ImgTAG";
			}
			print "</td></tr>$TrTAG<td>$Honbun</td></tr>";
		}
		# レイアウト指定が下
		elsif( ($Layout == 3) || ($Layout == 7) ){
			print "$TrTAG<td>$Honbun</td></tr>$TrTAG<td>";
			if( $Layout == 7 ){
				print "<center>$ImgLINK$ImgTAG</center>";
			}else{
				print "$ImgLINK$ImgTAG";
			}
			print "</td></tr>";
		}
		# レイアウト指定が左($Layout=0)
		elsif( $Layout == 0 ){
			print "$TrTAG<td width=\"$w\">$ImgLINK$ImgTAG</td><td>$Honbun</td></tr>";
		}
		# レイアウト指定右上($Layout=5)
		elsif( $Layout == 5 ){
			print "$TrTAG<td>$ImgLINK$ImgTAG$Honbun</td></tr>";
		}
		# レイアウト指定が左上($Layout=4)
		else{
			print "$TrTAG<td>$ImgLINK$ImgTAG$Honbun</td></tr>";
		}
	}else{
		# 画像無しの場合は文章のみ表示
		print "$TrTAG<td>$Honbun</td></tr>";
	}
	print "</table></td></tr></table></td></tr></table>\n";

	if( ($tbRcv eq "Yes") && ($UserCmnt ne "Yes") ){
	  print "<table border=\"0\" width=\"$NickyWidth\" summary=\"Trackback\"><tr><td align=\"right\">$tbTag</td></tr></table>\n" if( $tbnum || ($tbPast eq "Yes") || !$saveExec && ($Mode ne "MONTH") && !$page);
	}
}
$TitleHead=$bkt;
$TitleHeadL=$bktl;
#
# コメント
#
if( ($CommentRecv) || ($Mode eq "CMNTEDIT") ){
	local($cf_size);
	print "\n<form id=\"cfm$pt\" method=\"post\" accept-charset=\"euc-jp\" action=\"$cgipath#cp$pt\"><div class=\"cmntf\">\n";
	print "<a name=\"cp$pt\">" if( $Mode eq "CPREVIEW" );
	&InsertDateTag();
	print "</a>" if( $Mode eq "CPREVIEW" );
	$cf_size=(stat($NickyComment))[7];
	if( (($ModeSub == 16) || ($Mode eq "CMNTEDIT")) && (($CIRCV eq "ON") || ($cf_size !=0 || (($Mode ne "MONTH") && !$page && !$saveExec))) ){

		if( $UserCmnt ne "Yes" ){
			print "<table border=\"0\" width=$NickyWidth bgcolor=\"$CommentFlColor\" summary=\"comment\">\n";
			print "<tr><td>";
			print "<table border=\"0\" width=100% bgcolor=\"$CommentFlColor\" summary=\"recv\">\n";
			print "<tr><td align=\"center\"><font size=$CommentStrSize>$CommentStr</font></td></tr>\n";
			&PutComment();
			print "<tr><td align=\"right\">";
			if( $Mode ne "CMNTEDIT" ){

				if( ($CIRCV eq "ON") || ($CIRCV ne "ON") && ($Mode ne "MONTH") && !$page && !$saveExec ){
					$CommentName=$CommentCName if(($CommentName eq "")&&($CommentCName ne ""));
					print "<font size=$CommentNameStrSize>Name　<input class=\"button\" type=\"text\" name=\"CommentName\" size=\"$CommentNameWidth\"";
					print " value=\"$CommentName\"$e";
					$CommentRecv=1 if( $CommentRecv == "Yes" );
					if( $CommentRecv == 1 ){
						print "　　Message　<input class=\"button\" type=\"text\" name=\"CommentMsg\" size=\"$CommentMessageWidth\"";
						print " value=\"$CommentMsg\"" if( $flagCMNT == 1 );
						print "$e";
					}else{
						print "　　Message　<textarea class=\"button\" name=\"CommentMsg\" rows=\"$CommentRecv\" cols=\"$CommentMessageWidth\">";
						print $CommentMsg if( $flagCMNT == 1 );
						print "</textarea>";
					}
					print "$brよろしければSendボタンをクリックしてください" if( $flagCMNT == 1 );
					print "　$iTS\"CPREVIEW\" value=\"Preview\" class=\"button\"$e</font>";
					print "　$iTS\"CINPUT\" value=\"Send\" class=\"button\"$e</font>";
				}
			}
			print "</td></tr></table></td></tr></table>\n";
		}else{
			&PutCustomComment();
		}
	}
	print "</div></form>";
}

#
# モードによって操作ボタンを追加する。
# 別関数にしようかとも思ったけど細分化しすぎると
# 管理できなくなる
#
# ModeSub
#  1=EDIT/編集する記事を選ぶ
#  2=DELETE/削除する記事を選ぶ
#  4=EDIT/１日に１記事があった場合
#  8=KAKUNIN/確認
# 16=WRITE/書込
#
if( ($ModeSub == 1) || ($ModeSub == 2) || ($Mode eq "CMNTEDIT") ){
	print "<form method=\"post\" action=\"$cgipath\"$e";
	&InsertDateTag();

	print "$iTS\"CMNTGO\" value=\"このコメントを編集\"$e\n" if( $Mode eq "CMNTEDIT" );
	print "$iTS\"EDIT\" value=\"この記事を編集\"$e\n" if( ($ModeSub == 1) || ($ModeSub == 2) );
	if( $ModeSub == 2 ){
		print "$iTS\"DELETEOK\" value=\"削除実行\"$e\n";
	}else{
		print "$iTS\"DELETE\" value=\"これを削除\"$e\n";
	}
	print "</form>";
}

if( ($ModeSub == 16) && ($Admin) && (select eq "main::STDOUT") ){
print "\n<form method=\"post\" action=\"$cgipath\"><div align=\"right\">";
&InsertDateTag();
$tagctl="$iTS\"PANEL\" VALUE=\"カテゴリ編集\"$e" if( $ctgedit );
print <<CNTLTAG;
$iTS"EDIT" VALUE="記事編集"$e$iTS"CMNTGO" VALUE="コメントの編集"$e$iTS"DELETE" VALUE="削除"$e$tagctl$iTS"MakeSetup" VALUE="初期設定"$e$iTS"HEADEDIT" VALUE="ヘッダ／フッタ"$e$iTS"New" VALUE="記事作成"$e
</div></form>
CNTLTAG
}
print "\n";
}

sub get_thumb_name{
 my $fn=$_[0];
 my $thm="";

 if( -f "$fn.thumb.jpg" ){
	$thm="$fn.thumb.jpg";
 }elsif( -f "$fn.thumb.gif" ){
	$thm="$fn.thumb.gif";
 }elsif( -f "$fn.thumb.png" ){
	$thm="$fn.thumb.png";
 }
 $thm;
}

sub get_thumb_name2{
 my $fn=$_[0];
 my $thm="";

 $thm=&get_thumb_name($fn);
 return $thm if( $thm );
 if( -f "$fn.spch" ){
	$thm="$fn.spch";
 }elsif( -f "$fn.pch" ){
	$thm="$fn.pch";
 }
 $thm;
}

sub PutCustomComment{
 my($ctloop, $str2);
 local($name, $msg, $time, $cnt, $i, @ctlist);
 $flag_ucmnt = &ReqUserCustomCmnt();
 if( $flag_ucmnt ){
	$CommentNum=$sCommentNum=$nCommentNum=$cnt=0;
	if( $cf_size > 0 ){
		open(RDC, $NickyComment);
		binmode(RDC);
		while(<RDC>){
			$ctloop=0;
			($name, $msg, $time)=split/\x01/;
			while( !$time ){
				($str2, $time)=split(/\x01/, <RDC>);
				$msg.=$str2;
				$ctloop++;
				last if( $ctloop > 50 );
			}
			chop $time;
			if( $name =~ /^\x03/ ){
				$sCommentNum++;
				if( $Admin && (select eq "main::STDOUT") ){
					($str2,$name)=split(/\x03/, $name);
					$name=&cmnt_dec($name);
					$name=&comment_uri($name)."（非公開）";
					$msg=&cmnt_dec($msg);
				}else{next;}
			}else{
				$name=&comment_uri($name);
				$nCommentNum++;
			}

			$msg=~s/\n/$br/g;
			$msg=&ConvertMsg($msg);
			$msg=&Effect($msg);
			$msg=~s/$br$//;
			$ctlist[$cnt]=$name;
			$cnt++;
			$ctlist[$cnt]=$msg;
			$cnt++;
			$ctlist[$cnt]=$time;
			$cnt++;
		}
		close(RDC);
		$CommentNum=$sCommentNum+$nCommentNum;
	}
	&CustomCmntHprint();

	for($i=0; $i<$cnt; $i+=3){
		$name=$ctlist[$i];
		$msg=$ctlist[$i+1];
		$time=$ctlist[$i+2];
		&CustomCmntAprint();
	}
	undef @ctlist;

	if( ($Mode =~ /CPREVIEW/) && ($CommentName || $CommentMsg) ){
		$msg=$CommentMsg;
		$msg=~s/\n/$br/g;
		$msg=&ConvertMsg($msg);
		$msg=&Effect($msg);
		$msg=~s/$br$//;
		$name=&jadge_uri($CommentName, $CommentURI);
		$time=&MakeCommentTime();
		&CustomCmntAprint();
	}
	$CommentName=$CommentCName if($CommentName eq "" && $CommentCName eq "");

	#表示する条件
	#過去ログ表示でコメントを受け付ける
	#最新ページの表示
	if( ($CIRCV ne "OFF") || ($CIRCV eq "OFF") && (!$page && !$saveExec) && ($Mode ne "MONTH") ){

		if( $Mode =~ /CPREVIEW|CINPUT/ ){
			if( ($Mode =~ /CINPUT/) && ($MNLflag) || $saveExec){
				eval('&CustomCmntOprint();');
			}else{
				eval('&CustomCmntPprint();');
			}
		}else{
			eval('&CustomCmntOprint();');
		}
	}
	&CustomCmntFprint();
 }
}

sub getTBnum{
local($tb_id)=@_;
local($tbfn, $num, $bak);
$tbfn="./tbdir/$year$month.cgi";
$bak=$/;
$/="\x02";
$num=0;
if( open(RD, "$tbfn") ){
	binmode RD;
	while(<RD>){ $num++ if( $_ =~ /^$tb_id\x01/ ); }
	close(RD);
}
$/=$bak;
$num;
}

sub PutNickyOneDayIMODE{
 local($b, $size);

 &GetDateFromFname();

 print "<a name=\"$year$month$day$daysub\"></a>";
 $b="$month$Month$day$Day";
 $b.=" $hour:$min" if( $hour >=0 );
 if( &ReqJcode() ){
	&jcode'euc2sjis(\$b);
	$str=$Title;
	&zenkakuhankaku();
	$Title=$str;
	$str=$Message;
	&zenkakuhankaku();
	$Message=$str;
 }
 print "$b\n<hr><dl>";
 print "<dt>$Title</dt>" if( $Title );
 print "<dd>$Message";

 if( $GrpFileName ){
	my($fn, $fn1, $ext, $sstr);

	&MakeNickyDir();
	$GrpPath="$NickyDir/$GrpFileName";
	$size=(stat($GrpPath))[7];
	if( $size > 0 ){
		$ext=&GetExt($GrpPath);
		if( $size<1024 ){
			$sstr=$size."byte";
		}else{
			$sstr=int($size/1024).K;
		}
		print "$br<a href=\"$www/$year/$GrpFileName\">$ext</a>$sstr";

		$fn1=$GrpFileName;
		$fn1=~s/\..*$//;
		$fn="$NickyDir/$fn1";

		$thumb=&get_thumb_name($fn);
		if( $thumb ){
			$size=(stat($thumb))[7];
			if( $size<1024 ){
				$sstr=$size."byte";
			}else{
				$sstr=int($size/1024).K;
			}
			$ext=&GetExt($thumb);
			$sstr=int($size/1024).K;
			print ":<a href=\"$www/$year/$fn1\.thumb\.$ext\">$ext</a>$sstr";
		}
	}
 }
 print "</dd></dl>";

 if( $CommentRecv ){
  if(!-e "./icomment"){
	&icomment_main();
  }else{
	my($pt, $rc);
	$rc="(有)" if( (stat($NickyComment))[7] > 0 );
	$pt=sprintf("%04d%02d%02d%s", $year, $month, $day, $daysub);

	$str="<a href=\"$cgipath?DT=$pt?Mode=iComment\">Comment$rc</a>";
	&zenkakuhankaku();
	print $str;
  }
 }
 print "$br";
}

sub icomment_main{
	$str="\n<form method=\"POST\" action=\"$cgipath\">\n";
	$str.="$CommentStr$br";
	&zenkakuhankaku();
	print $str;
	&PutCommentIMODE();
	&InsertDateTag();

	$str="Name　<input class=\"button\" type=\"text\" name=\"CommentName\"";
	$str.="value=\"$CommentName\"" if( $flagCMNT == 1 );
	$str.=">";
	if( $CommentRecv == 1 ){
		$str.="　　Message　<input type=\"text\" name=\"CommentMsg\"";
		$str.="value=\"$CommentMsg\"" if( $flagCMNT == 1 );
		$str.=">";
	}else{
		$str.="　　Message　<textarea name=\"CommentMsg\" rows=\"$CommentRecv\">";
		$str.=$CommentMsg if( $flagCMNT == 1 );
		$str.="</textarea>";
	}
	$str.="　<input type=\"submit\" name=\"CINPUTI\" value=\"Send\">";
	$str.="</form>";
	&zenkakuhankaku();
	print $str;
}

sub CommentIMODE{
 local($sts, $s, $pt);

 &nickyGetHead();
 $sts=&ReqJcode();
 &jcode'euc2sjis(\$iHead) if( $sts );
 print $iHead;
 &MakeNickyFname();
 &icomment_main();

 $pt=sprintf("%04d%02d%02d%s", $year, $month, $day, $daysub);
 $s="<br><a href=\"$cgipath?DT=$pt#$pt\">戻る</a>$iFoot";
 &jcode'euc2sjis(\$s) if( $sts );
 print $s;
}

sub ReqUserCustom{
if( !$flag_customread ){
	$status_customread=eval("require '$CustomCGI'");
	$flag_customread=1;
}
return $status_customread;
}

sub ReqUserCustomCmnt{
if( !$flag_cmnt_customread ){
	$status_cmnt_customread=eval("require '$CustomCmntCGI'");
	$flag_cmnt_customread=1;
}
return $status_cmnt_customread;
}

sub IsApplet{
$spsize=(stat("$vDir/spainter.jar"))[7] if( $spsize == -3 );
$PBsize=(stat("$vDir/PaintBBS.jar"))[7] if( $PBsize == -3 );
$PBsize=0 if( !$PBsize );
$spsize=0 if( !$spsize );
}

#
# 日付の作成
#
sub MakeDateStr{
if( !$Date ){
	$week=$Week[&GetWeek($year, $month, $day)];
	$Date="$year$Year$month$Month$day$Day$week";
	if( ($hour >= 0) && ($PutTime eq "Yes") ){ $Date.="$hour:$min"; }
}
}

#
# 指定されたファイルを出力する
#
sub PutFile{
my($f)=@_;
my $dat="";

if( open(FILE, $f) ){
	binmode(FILE);
	while(<FILE>){$dat.=$_;}
	close(FILE);
}
$dat;
}

#
# ColorSample
#
sub PutColorSample
{
	local($i, $j, $k, $col);
	&PutHTMLheader();
	print "<title>カラーサンプル</title>\n</head>\n<body>\n";

	print "カラーサンプル$br$br\n";
	print "<UL><LI>HTMLでの色指定は通常、#RedGreenBlue（それぞれ16進2桁）で行います。</UL>\n<HR>\n";

	for($k=0; $k<0x100; $k+=0x10){
		print "<TABLE BORDER=\"1\"><TR><TD>\n";
		$str=sprintf("Blue=%02X", $k);
		print "<TABLE BORDER=\"0\">";
		print "<TR><TH COLSPAN=\"9\" ALIGN=\"LEFT\">($str)</TH><TH COLSPAN=\"9\" ALIGN=\"LEFT\">Green</TH></TR>\n";

		print "<TR><TH COLSPAN=\"2\"></TH>\n";
		for($i=0; $i<0x100; $i+=0x10){
			printf("<TD>%02X</TD>", $i);
		}
		print "</TR>\n";

		print "<TR><TH ROWSPAN=\"17\">Red</TH>\n";
		for($i=0; $i < 0x100; $i+=0x10){
			print "<TR>\n" if( $i );
			printf("<TD>%02X</TD>", $i);
			for($j=0; $j < 0x100; $j+=0x10){
				$col=sprintf("#%02x%02x%02x", $i, $j, $k);
				print "<TD><FONT COLOR=\"$col\">■</FONT></TD>";
			}
			print "</TR>\n";
		}
		print "</TABLE>\n</TD></TR></TABLE>\n";
	}
	print "</body></html>\n";
}

#
#タイトル一覧
#
sub PutTitleListSub
{
	local($tcnt)=$_[0];
	my($a, $yd, $i, $j);

	$j=0;
	print "<td align=\"right\" valign=\"top\" NOWRAP>";
	if( $tcnt ){
		print "<font size=$TLdaysz>";
		for $a(@grplist){
			print "$a$br";
		}
		print "</font></td>";
		print "<td valign=\"top\" NOWRAP><font size=$TLdaysz>";
		for $a(@daylist){
			print "$a$br";
			$yd=$ddlist[$j];
			$j++;
		}

		print "</font></td>";
		print "<td valign=\"top\" NOWRAP><font size=$TLdaysz>";
		for $a(@titlelist){
			print "$a$br";
		}
		print "</font>";
	}else{
		my(@gpl, @ddl, @dyl);

		$yd=$j=0;
		if( $TitleListSort eq "UP" ){
			@gpl=reverse(@grplist);
			@ddl=reverse(@ddlist);
			@dyl=reverse(@daylist);
		}else{
			@gpl=@grplist;
			@ddl=@ddlist;
			@dyl=@daylist;
		}
		print "<font size=$TLdaysz>";
		for $a(@gpl){
			if( $ddl[$j] != $yd ){
				for($i=0; $i<($ddl[$j]-$yd-1); $i++){
					print "$br";
				}
				print "$a $dyl[$j]$br";
			}
			$yd=$ddl[$j++];
		}
		print "</font></td>";
		undef @gpl;
		undef @ddl;
		undef @dyl;
	}
	print "</td>";
	undef @daylist;
	undef @titlelist;
	undef @grplist;
	undef @ddlist;
}

sub PutTitleList
{
	local($i, $fname, $fn, $yr, $mn, $flag_1st);
	local($mdstr, $clm, $tcnt, $brcnt);
	local(@daylist, @titlelist, @grplist, @ddlist);
	my($opt, $gfn, $tp, $ctgl);
	$tp="x" if( $tagmode eq "xhtml" );
	$ctgl="\?ctg=$ctg" if( $ctg );
	$brcnt=0;
	&nickyGetHead();
	if( $UseListHD eq "Yes" ){
		print &put_macro($head2nd);
	}else{
		print &put_macro($head);
	}
	print "<table border=\"0\" width=\"$NickyWidth\">";

	if( $TitleListSort eq "UP" ){
		$opt="r";
	}else{
		$opt="tr";
	}
	for $gfn( &GetNickyList($opt) ){
		$NickyFname=$$gfn[0];
		&GetDateFromFname();
		&GetNickyFile("$vDir/$NickyFname");
		$mdstr="<a href=\"$cgipath$ctgl?DT=$year$month$day$daysub#$tp$year$month$day$daysub\" target=\"_blank\">";
		if( $yr != $year ){
			if( $flag_1st ){
				&PutTitleListSub($tcnt);
				print "</tr>\n";
			}
			print "<tr><td align=\"right\" valign=\"top\" nowrap>";
			print "$mdstr<font Size=$TLyearsz><b>$year$TLyear</b></font></a></td>";
			if( $Title ){
				print "<td colspan=\"3\"></td>";
			}else{
				print "<td colspan=\"11\"></td>";
			}
			print "</tr>\n";
			print "<tr><td align=\"right\" valign=\"top\" NOWRAP>$mdstr<Font Size=$TLmonthsz><b>$month$TLmonth</b></Font></a>";
			print "</td>";
			$yr=$year;
			$mn=$month;
			$flag_1st=1;
			$i=0;
			$clm=0;
			$tcnt=0;
		}elsif( $mn != $month ){
			&PutTitleListSub($tcnt);
			if( !$tcnt ){
				if($clm++ > 4){
					print "</tr>\n<tr>";
					$clm=0;
				}
			}else{
				print "</tr>\n<tr>";
			}
			print "<td align=\"right\" valign=\"top\" NOWRAP>$mdstr<font size=$TLmonthsz><b>$month$TLmonth</b></font></a>";
			$mn=$month;
			$i=0;
			$tcnt=0;
		}
		if( $GrpFileName ){
			$grplist[$i]=$MsgOldTG;
		}else{
			$grplist[$i]="";
		}
		$daylist[$i]="$mdstr$day$TLday</a>";
		$ddlist[$i]=$day;
		if( $Title ){
			$titlelist[$i]="$mdstr$Title</a>";
			$tcnt++;
		}
		$i++;
	}
	&PutTitleListSub($tcnt);
	print "</tr>";
	print "</table>";
	if( $UseListFT eq "Yes" ){
		print &put_macro($foot2nd);
	}else{
		print &put_macro($foot);
	}
}

sub BaseName{
my($p)=@_;
my($c);
for (split(/\/|\\|\:/, $p)){$c = $_;}
$c;
}

# 拡張子を取得
sub GetExt{
local($p1, $n);

$p1="";
$n=rindex($_[0], "\.");
$p1=substr($_[0], $n+1) if( ($n > 0) && (length($_[0]) > $n) );
$p1;
}

sub GetDir{
my($s)=@_;
my($p, $n);

$p="";
$n=rindex($s, "/");
if( $n >= 0 ){
	$p=substr($s, 0, $n+1);
}else{
	$p="\./";
}
$p;
}

sub zenkakuhankaku{
&jcode'z2h_euc(\$str);

&jcode'tr(\$str, "０１２３４５６７８９（", "0123456789(");
&jcode'tr(\$str, "ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ", "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
&jcode'tr(\$str, "ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ", "abcdefghijklmnopqrstuvwxyz");
&jcode'tr(\$str, "！＃＄％＆（）＝｜−＾￥‘｛＋＊｝＜＞？＿＠；：，［］／", "!#\$%&()\=|-^\\`{+*}<>\?_@;:,[]\/");
&jcode'euc2sjis(\$str);
}

#デフォルトヘッダ作成
sub MakeDefaultHead{
local($a);
$a=<<DefaultHead_EOF
<html>
<head>
<meta http-equiv="Content-type" CONTENT="text/html; charset=euc-jp">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<title>日記</title>
<style type="text/css">
<!--
.button{color:white;background-color:#9999CC;border:0}
-->
</style>
</head>
<body bgcolor="#ffffff" text="#000000"link="#8080A0" vlink="#8080A0">
<center>
<div>日記</div>
<hr width="80%">
DefaultHead_EOF
;
$a;
}
#
#デフォルトフッタ作成
#
sub MakeDefaultFoot{
local($a);
$a="<hr width=\"80%\">\n</center>\n</body>\n</html>\n";
$a;
}
#
#デフォルトヘッダ作成(iMODE版)
#
sub MakeDefaultHeadIMODE{
local($a);
$a=<<MakeDefaultHeadIMODE_EOF
<HTML><HEAD>
<TITLE>Diary</TITLE>
</HEAD><BODY TEXT="#666666">
MakeDefaultHeadIMODE_EOF
;
$a;
}
#
#デフォルトフッタ作成(iMODE版)
#
sub MakeDefaultFootIMODE{
local($a);
$a="</BODY></HTML>";
$a;
}
#
#デフォルトエディットフッタ作成
#
sub MakeDefaultEfoot{
local($a);
$a=<<EFOOT;
<hr>\n<a href=\"$cgipath?page=0\">記事最新ページへ</a>/
<a href=\"$cgipath?HEADEDIT\">ヘッダ／フッタの編集</a>/
<a href=\"$cgipath?MakeSetup\">初期設定</a>/
<a href=\"$cgipath?PassWord\">パスワード再設定</a>
EFOOT
$a;
}

#
#記事ヘッダファイル書き込み
#
sub nicky_write_head{
my($dat)="$head$TMN$foot$TMN$iHead$TMN$iFoot$TMN$efoot$TMN$head2nd$TMN$foot2nd$TMN$Use2ndHD$TMN$UseListHD$TMN$UseSearchHD$TMN$Use2ndFT$TMN$UseListFT$TMN$UseSearchFT";
$dat=~s/\r//g;
open(WD, ">./NickyHFdat.cgi");
binmode(WD);
print WD $dat;
close(WD);
$dat;
}
#
#記事ヘッダファイル抽出
#
sub nickyGetHead{
	my($hffn)=@_;
	local $all="";

	if( $hffn && open(IN, $hffn) ){
		while(<IN>){$all.=$_;}
		close(IN);
	}elsif( open(IN, $NickyHF) ){
		while(<IN>){$all.=$_;}
		close(IN);
	}

	($head,$foot,$iHead,$iFoot,$efoot,$head2nd,$foot2nd,$Use2ndHD,$UseListHD,$UseSearchHD,$Use2ndFT,$UseListFT,$UseSearchFT)=split(/$TMN/, $all);
	$UseSearchFT=~s/\r|\n//g;
	if( !$head ){
		$head=&MakeDefaultHead();
	}
	if( !$foot ){
		$foot=&MakeDefaultFoot();
	}
	if( !$iHead ){
		$iHead=&MakeDefaultHeadIMODE();
	}
	if( !$iFoot ){
		$iFoot=&MakeDefaultFootIMODE();
	}
	if( !$efoot ){
		$efoot=&MakeDefaultEfoot();
	}
}

sub get_ctg_data{
#Gloval : $load_ctg, @ctg_ff, $ctg_ptype, $ctg_btn
 my($i,$j)=(0,0);
 my($linedat, $catebin, $ctname, $snum, $putok, $lstr, $ctgid);
 if( !$load_ctg && open(RD, "./catelist.cgi") ){
	binmode RD;
	for $linedat(<RD>){
		my(@f);
		$linedat=~s/\r|\n//;
		next if( !$linedat );
		if( $j == 0 ){
			$ctg_ptype = $linedat;
		}elsif( $j == 1 ){
			$ctg_btn=$linedat;
		}else{
			@f=($ctname, $snum, $putok, $lstr, $ctgid)=split(/,/, $linedat);
			$f[0]=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
			$f[3]=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
			$i=$j-2;
			$ctg_ff[$i]=\@f;
			if( $j == 2 ){
				$lstr=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
				($ctname,$ctgSplit,$snum)=split(/\x01/,$lstr);
			}
		}
		$j++;
	}
	close RD;
	$load_ctg=$j-2 if( $j > 2 );
 }
}

sub put_macro{
my($hd)=@_;
my($bkmonth, $bkday, $bkyear, $bkfn, $bksub, $bkmsg, $bktitle);
my($bkgf, $bkly, $bkcr, $bkfs, $bkrl, $bktr, $bkdate);
my($bkh, $bkm, $bkf, $bkcate, $bkYR, $bkMON);
my($hd1, $hd2, $cal);
my($dat, $f, $i, $str);
local $putcal=0;
local $p_zero=0;

$bkfn=$NickyFname;$bkmonth=$month;$bkday=$day;$bkyear=$year;
$bksub=$daysub;$bktitle=$Title;$bkmsg=$Message;$bkdate=$Date;
$bkgf=$GrpFileName;$bkly=$Layout;$bkcr=$CommentRecv;
$bkfs=$fit_size;$bkrl=$RepLayout;$bktr=$tbRcv;$bkYR=$YR;$bkMON=$MON;
$bkh=$hour;$bkm=$min;$bkf=$FitCheck;$bkcate=$Category;
for($i=1;$i<6;$i++){
	$f="header$i.cgi";
	if( $hd =~ /%$f%/ ){
		($hd1, $hd2)=split(/%$f%/, $hd);
		$dat=&PutFile($f);
		$hd="$hd1$dat$hd2";
	}
}

if( $hd =~ /%Calendar%/ ){
	($hd1, $hd2)=split(/%Calendar%/, $hd);
#	if( ($Mode ne "DELETEOK") && ($Mode ne "WRITE") && (!$YR || !$MON) ){
	if( ($Mode ne "DELETEOK") && (!$YR || !$MON) ){
		$YR=$bkyear;$MON=$bkmonth;$p_zero=1;
	}
	$putcal=$list_req=1;
	eval('require("./minili.cgi")');
	&goto_exit("$@ / <br>minili.cgi") if( $@ );
	$cal=eval('&PutCalendarT()');
	$list_req=0;
	$hd="$hd1$cal$hd2";
}

if( $hd =~ /%TitleList%/ ){
	($hd1, $hd2)=split(/%TitleList%/, $hd);
	$year=$bkyear;$month=$bkmonth;
	$list_req=1;
	eval('require("./minili.cgi")');
	&goto_exit("$@ / <br>minili.cgi") if( $@ );
	eval('$cal=&PutTitleList2();');
	$list_req=0;
	$hd="$hd1$cal$hd2";
}
if( $hd =~ /%Category%/ ){
	($hd1, $hd2)=split(/%Category%/, $hd);
	$dat=$cal="";
	&get_ctg_data();
	if( $ctg_ptype eq "link" || !$ctg ){
		$cal=&PutFile("./ctgput.cgi");
	}else{
		@ctg_ff=sort{$$a[1] <=> $$b[1]} @ctg_ff;
		$cal="<form method=\"post\" action=\"$cgipath\"><div>\n";
		$cal.="<select name=\"ctgry\">" if( $ctg_ptype eq "sel" );
		for $categorydat(@ctg_ff)
		{
			$ctgid=$$categorydat[4];
			next if( ($ctg_ptype eq "chkbox") && ($ctgid eq "idrst") );
			$ctgid=(1<<($ctgid-1)) if( $ctgid > 1 );
			$i++;
			next if( $$categorydat[2] ne "yes" );
			if( $ctg_ptype eq "chkbox" ){
				$cal.="<input type=\"checkbox\" name=\"ctgry\" value=\"$ctgid\"";
				$cal.=" checked" if( $ctgid & $ctg );
				$cal.=">$$categorydat[0]";
				$cal.=$$categorydat[3];
			}else{
				$cal.="<option value=\"$ctgid\"";
				$cal.=" selected" if( $ctgid & $ctg );
				$cal.=">$$categorydat[0]</option>";
			}
		}
		$cal.="</select>\n" if( $ctg_ptype eq "sel" );
		$cal.="<input type=\"submit\" value=\"$ctg_btn\" class=\"catebtn\">" if( $ctg_ptype =~ /chkbox|sel/ );

		$cal.="</div></form>\n";
	}
	$hd="$hd1$cal$hd2";
}
if( $hd =~ /%admin%/ ){
	$cal="";
	($hd1, $hd2)=split(/%admin%/, $hd);
	if( $Admin && !$mkHTML ){
		$cal=&PutFile("./admin.cgi");
	}
	$hd="$hd1$cal$hd2";
}
$NickyFname=$bkfn;$month=$bkmonth;$day=$bkday;$year=$bkyear;
$daysub=$bksub;$Title=$bktitle;$Message=$bkmsg;$Date=$bkdate;
$GrpFileName=$bkgf;$Layout=$bkly;$CommentRecv=$bkcr;
$fit_size=$bkfs;$RepLayout=$bkrl;$tbRcv=$bktr;$YR=$bkYR;$MON=$bkMON;
$hour=$bkh;$min=$bkm;$FitCheck=$bkf;$Category=$bkcate;

#undef $YR;undef $MON;
$hd;
}
#
#カスタマイズフォーマット抽出
#
sub nickyGetCustomText{
my($all);
$all="";
if( open(IN, $CustomText) ){
	binmode(IN);
	while(<IN>){ $all.=$_; }
	close(IN);
	($CustomN,$CustomL,$CustomR,$CustomU,$CustomD,$CustomLC,$CustomRC,$CustomUC,$CustomDC, $CustomHead, $CustomFoot, $CustomTB)=split(/$TMN/, $all);
}

}
sub NickyGetCustomCmntText
{
my($all);
$all="";
if( open(IN, $CustomCmntText) ){
	binmode(IN);
	while(<IN>){ $all.=$_; }
	close(IN);
	($CustomCmntH,$CustomCmntA,$CustomCmntF,$CustomCmntO,$CustomCmntP)=split(/$TMN/, $all);
}

}

#
#記事ヘッダーファイル修正
#
sub NickyHead
{
my($IT)="<input type=";
&nickyGetHead("./NickyHFdat.cgi");
$head=&tagenc($head);
$foot=&tagenc($foot);
$head2nd=&tagenc($head2nd);
$foot2nd=&tagenc($foot2nd);
$iHead=&tagenc($iHead);
$iFoot=&tagenc($iFoot);
$efoot=&tagenc($efoot);

&PutHTMLheader();
print <<HD1_EOF;
<TITLE>記事ヘッダ＆フッタ編集</TITLE></HEAD><BODY>
<CENTER>ヘッダ＆フッタの編集$br$br
<FORM METHOD="POST" ACTION="./nicky.cgi">
<table border=0 width=1><tr><td>
$IT"HIDDEN" NAME="MODE" VALUE="HEADWRITE">
●ヘッダ$br
<TEXTAREA NAME="HEADDER" ROWS="12" COLS="80">$head</TEXTAREA>
$br$br●フッタ$br
<TEXTAREA NAME="foot" ROWS="12" COLS="80">$foot</TEXTAREA>
$br<CENTER>$IT"submit" VALUE="書込"></CENTER>
$br$br
●ヘッダ　使用するページにチェック→
$IT"CHECKBOX" NAME="Use2ndHD" VALUE="Yes" 
HD1_EOF
if( $Use2ndHD eq "Yes" ) { print "CHECKED"; } print ">２ページ目以降\n";
print "　$IT\"CHECKBOX\" NAME=\"UseListHD\" VALUE=\"Yes\" ";
if( $UseListHD eq "Yes" ) { print "CHECKED"; } print ">タイトル一覧\n";
print "　$IT\"CHECKBOX\" NAME=\"UseSearchHD\" VALUE=\"Yes\" ";
if( $UseSearchHD eq "Yes" ) { print "CHECKED"; } print ">検索$br\n";

print "<TEXTAREA NAME=\"head2nd\" ROWS=\"12\" COLS=\"80\">$head2nd</TEXTAREA>";

print "$br$br●フッタ　使用するページにチェック→";
print " $IT\"CHECKBOX\" NAME=\"Use2ndFT\" VALUE=\"Yes\"";
if( $Use2ndFT eq "Yes" ) { print "CHECKED"; } print ">２ページ目以降\n";
print "　$IT\"CHECKBOX\" NAME=\"UseListFT\" VALUE=\"Yes\"";
if( $UseListFT eq "Yes" ) { print "CHECKED"; } print ">タイトル一覧\n";
print "　$IT\"CHECKBOX\" NAME=\"UseSearchFT\" VALUE=\"Yes\"";
if( $UseSearchFT eq "Yes" ) { print "CHECKED"; } print ">検索$br\n";

print <<HD2_EOF
<TEXTAREA NAME="foot2nd" ROWS="12" COLS="80">$foot2nd</TEXTAREA>
$br<CENTER>$IT\"submit\" VALUE=\"書込\"></CENTER>$br$br
●iMODE用ヘッダ$br
<TEXTAREA NAME="iHead" ROWS="12" COLS="80">$iHead</TEXTAREA>
$br$br●iMODE用フッタ$br
<TEXTAREA NAME="iFoot" ROWS="12" COLS="80">$iFoot</TEXTAREA>$br
$br●編集画面の最後尾に出力するタグ$br
<TEXTAREA NAME="efoot" ROWS="12" COLS="80">$efoot</TEXTAREA>$br
</td></tr></table>
$IT"submit" VALUE="書込">$br
</FORM></CENTER></BODY></HTML>
HD2_EOF
;
}

#
#記事ヘッダ＆フッタファイル書きこみ
#
sub NickyHeadWrite{
my $dat;
$dat=&nicky_write_head();
&create_exec($dat, $NickyHF, "nHF");
&MakeNickyLast();
}
sub goto_end{
my($par)=@_;
print "$par</body></html>\n";
exit;
}
sub goto_exit{
my($par)=@_;
print "Content-type: text/html\n\n" if( !$flag_type );
&PutHTMLheader();
&goto_end($par);
}
sub create_exec{
my($dat, $outfile, $exe)=@_;
my $stylecgi="./$exe.cgi";
$dat=~s/\@/\\@/g;
open(WD, ">$stylecgi");
print WD "sub put_$exe(){\nopen(WD, \">$outfile\");\n";
print WD "print WD<<STYLE_EOF;\n$dat\nSTYLE_EOF\nclose WD;\n;\n}\n&put_$exe();\n1;\n\n";
close(WD);
&goto_end("permission denied $stylecgi") if( !-e "$stylecgi" );
eval(require("$stylecgi"));
&goto_end($@) if( $@ );
unlink($stylecgi);
&goto_end($@) if( $@ );
}
sub create_style{
my $styledat="";
return unless( open(RD, "./d.cgi") );
while(<RD>){ $styledat.=$_; }
close(RD);
&create_exec($styledat,"$vDir/d.css", "cssdat");
}
#
# Setup関連
#
sub ReadSetup{
my($arg, $val, $dat);
&InitialNicky();    #ファイルに設定項目が落ちている場合を
					#想定して読む前に一通り設定する。

if( open(RD, "./NickyConf.cgi") ){
 binmode(RD);
 while(<RD>){
	$dat=$_;
	$dat=~s/\r|\n//g;
	($arg,$val)=split(/=/,$dat,2);
	${$arg}=$val;
 }
 close(RD);
}
$mtap=$MTApath;
$mto=$MailTo;
$flag_savehtml=$SaveHTML;

if( $WEEK == 1 ){
	@Week=('(Sun)','(Mon)','(Tue)','(Wed)','(Thu)','(Fri)','(Sat)');
}else{
	@Week=('（日）','（月）','（火）','（水）','（木）','（金）','（土）');
}
$MsgSize=$HonbunSize;
$MsgColor=$HonbunColor;
$MsgBgColor=$HonbunBgColor;
}

#
# ユーザーカスタマイズ保存
#
sub SaveUserCustomizeDone
{
	my($str, $subname)=($_[0], $_[1]);
	my($substrcgi, $a, $b);

	$customtext.="$str$TMN";
	$str=~s/\"/\\\"/g;
	$str=~s/\r//g;

	if( $subname !~ /Head$|Foot$/ ){
		$a=$UserCustomHead;
		$a=~s/\"/\\\"/g;
		$a=~s/\r//g;
		$b=$UserCustomFoot;
		$b=~s/\"/\\\"/g;
		$b=~s/\r//g;
		$str=~s/\$UserCustomHead/$a/;
		$str=~s/\$UserCustomFoot/$b/;
	}

	$str=~s/\n/\";\nprint \"/g;

	undef $substrcgi;
	if( $subname !~ /Head$|Foot$/ ){
		$substrcgi= "sub $subname\n";
		$substrcgi.= "{\n";
	}

	$substrcgi.= "print \"$str\"\;\n";
	if( $subname !~ /Head$|Foot$/ ){
		$substrcgi.= "}\n";
		$substrcgi.=$TMN;
	}
	$substrcgi;
}

sub SaveUserCustomize
{
	my($str,$uhh, $uff);

	$customtext="";
	$uh=&SaveUserCustomizeDone($UserCustomHead, "UserCustomHead");
	$uhh=$customtext;
	$customtext="";
	$uf=&SaveUserCustomizeDone($UserCustomFoot, "UserCustomFoot");
	$uff=$customtext;

	$customtext="";
	$str=&SaveUserCustomizeDone($UserCustomN, "CustomNprint");
	$str.=&SaveUserCustomizeDone($UserCustomL, "CustomLprint");
	$str.=&SaveUserCustomizeDone($UserCustomR, "CustomRprint");
	$str.=&SaveUserCustomizeDone($UserCustomU, "CustomUprint");
	$str.=&SaveUserCustomizeDone($UserCustomD, "CustomDprint");
	$str.=&SaveUserCustomizeDone($UserCustomLC, "CustomLCprint");
	$str.=&SaveUserCustomizeDone($UserCustomRC, "CustomRCprint");
	$str.=&SaveUserCustomizeDone($UserCustomUC, "CustomUCprint");
	$str.=&SaveUserCustomizeDone($UserCustomDC, "CustomDCprint");
	$customtext.=$uhh.$uff;
	$customtext.=$UserCustomTB;
	$UserCustomTB=~s/\"/\\\"/g;
	$UserCustomTB=~s/\r//g;
	$UserCustomTB=~s/\n/\\n/g;
	$UserCustomTB=~s/\$tbnum/%tbnum/g;
	$UserCustomTB=~s/\$pt/%pt/g;
	$str.="\$tbTAG=\"$UserCustomTB\"\;";
	$str.="\n1;\n";

	open(WD, ">$CustomText");
	binmode(WD);
	print WD $customtext;
	close(WD);

	open(WD, ">$CustomCGI");
	binmode(WD);
	print WD $str;
	close(WD);

	&SaveNickyConf();
}
sub SaveUserCustomizeC
{
	local($str);

	undef $uf;
	undef $uh;
	$customtext="";
	$str=&SaveUserCustomizeDone($UserCustomCmntH, "CustomCmntHprint");
	$str.=&SaveUserCustomizeDone($UserCustomCmntA, "CustomCmntAprint");
	$str.=&SaveUserCustomizeDone($UserCustomCmntF, "CustomCmntFprint");
	$str.=&SaveUserCustomizeDone($UserCustomCmntO, "CustomCmntOprint");
	$str.=&SaveUserCustomizeDone($UserCustomCmntP, "CustomCmntPprint");
	$str.="\n1;\n";

	open(WD, ">$CustomCmntText");
	binmode(WD);
	print WD $customtext;
	close(WD);

	open(WD, ">$CustomCmntCGI");
	binmode(WD);
	print WD $str;
	close(WD);

	&SaveNickyConf();
}
#
# ユーザーカスタマイズ
#    w3mでtextare内にtableタグを書けない為、tableにしない。
#
sub PutUserCustomize
{
my($nm, $ag, $ta, $textdata)=($_[0], $_[1], $_[2], $_[3]);

if( ($CustomMode eq "Custom") && ($nm !~ /^UserHead$|^UserFoot$|^UserTB$/) ){
	print "　カスタマイズ<INPUT TYPE=\"RADIO\" NAME=\"$nm\" VALUE=\"Yes\"";
	if( $ag eq "Yes" ) { print " CHECKED"; } print ">する\n";
	print "　<INPUT TYPE=\"RADIO\" NAME=\"$nm\" VALUE=\"No\"";
	if( $ag ne "Yes" ) { print " CHECKED"; } print ">しない\n";
}

$textdata=&tagenc($textdata);
print "$br<textarea name=\"$ta\" rows=\"12\" cols=\"75\">$textdata</textarea>\n<input type=\"submit\" name=\"MODE\" value=\"$CustomMode\">$br\n";
}

sub UserCustomize
{
local($i);

$CustomMode="Custom";
&PutHTMLheader();
&nickyGetCustomText();
print "<title>ユーザーカスタマイズ</title>\n</head>\n";
print "<body BGCOLOR=\"#FFFFFF\" text=\"#000000\" link=\"#0088CC\" alink=\"#00FFDD\" vlink=\"#0088CC\">";
print "<center>ユーザーカスタマイズ</center>\n";
print "<hr noshade size=\"1\" width=\"40%\"><form method=\"POST\" action=\"$cgipath\"><center>\n";

print "<b>記事のヘッダ(変数\$UserCustomHeadに入ります)</b>\n";
&PutUserCustomize("UserHead", $UserHead, "UserCustomHead", $CustomHead);
print "<b>記事のフッタ(変数\$UserCustomFootに入ります)</b>\n";
&PutUserCustomize("UserFoot", $UserFoot, "UserCustomFoot", $CustomFoot);

print "<hr><b>画像なし</b>\n";
&PutUserCustomize("UserN", $UserN, "UserCustomN", $CustomN);

print "<hr><b>画像レイアウト左</b>\n";
&PutUserCustomize("UserL", $UserL, "UserCustomL", $CustomL);

print "<hr><b>画像レイアウト右</b>\n";
&PutUserCustomize("UserR", $UserR, "UserCustomR", $CustomR);

print "<hr><b>画像レイアウト上</b>\n";
&PutUserCustomize("UserU", $UserU, "UserCustomU", $CustomU);
print "<hr><b>画像レイアウト下</b>\n";
&PutUserCustomize("UserD", $UserD, "UserCustomD", $CustomD);

print "<hr><b>画像レイアウト左上</b>\n";
&PutUserCustomize("UserLC", $UserLC, "UserCustomLC", $CustomLC);
print "<hr><b>画像レイアウト右上</b>\n";
&PutUserCustomize("UserRC", $UserRC, "UserCustomRC", $CustomRC);
print "<hr><b>画像レイアウト上中央</b>\n";
&PutUserCustomize("UserUC", $UserUC, "UserCustomUC", $CustomUC);
print "<hr><b>画像レイアウト下中央</b>\n";
&PutUserCustomize("UserDC", $UserDC, "UserCustomDC", $CustomDC);

if( (stat("./tb.cgi"))[7] || $CustomTB ){
print "<hr><b>トラックバック(\$tbTagに入ります)</b>\n";
&PutUserCustomize("UserTB", "Yes", "UserCustomTB", $CustomTB);
}
print "</form></center></html>\n";
}

sub UserCustomizeCmnt
{
local($i);

$CustomMode="CustomC";
&PutHTMLheader();
&NickyGetCustomCmntText();
print "<title>コメントのカスタマイズ</title>\n</head>\n";
print "<body bgcolor=\"#FFFFFF\" text=\"#000000\">";
print "<center>コメントのカスタマイズ\n";
print "<Hr><form method=\"POST\" action=\"$cgipath\">";

print "\n　コメントのカスタマイズ<INPUT TYPE=\"RADIO\" NAME=\"UserCmnt\" VALUE=\"Yes\"";
if( $UserCmnt eq "Yes" ) { print " CHECKED"; } print ">する\n";
print "　<INPUT TYPE=\"RADIO\" NAME=\"UserCmnt\" VALUE=\"No\"";
if( $UserCmnt ne "Yes" ) { print " CHECKED"; } print ">しない\n";
print "$br$br";

print "$br<b>ヘッダ</b>\n";
&PutUserCustomize("UserCmntH", $UserCmntH, "UserCustomCmntH", $CustomCmntH);

print "$br<b>コメント本文</b>\n";
&PutUserCustomize("UserCmntA", $UserCmntA, "UserCustomCmntA", $CustomCmntA);

print "$br<b>入力欄（表示用）</b>\n";
&PutUserCustomize("UserCmntO", $UserCmntO, "UserCustomCmntO", $CustomCmntO);

print "$br<b>入力欄（プレビュー用）</b>\n";
&PutUserCustomize("UserCmntP", $UserCmntP, "UserCustomCmntP", $CustomCmntP);

print "$br<b>フッタ</b>\n";
&PutUserCustomize("UserCmntF", $UserCmntF, "UserCustomCmntF", $CustomCmntF);

print "</form></center></body></html>";
}
sub tagenc{
my($str)=@_;
$str=~s/&/&amp;/g;
$str=~s/</&lt;/g;
$str=~s/>/&gt;/g;
$str=~s/\"/&quot;/g;
$str;
}
#
# 初期設定
#
sub MakeSetup
{
my($i, $sizea, $jpsz, $str, $imp, $appp, $b2, $ITT, $IRT, $ITC);
my($hap1, $hap2, $hap3, $hap4, $hap5, $hap6, $hap7, $hap8, $hap9);
my($hap10, $hap11, $hap12);
my($sizetb, $tbtag, $ck, $sizem, $minitag, $nb);
my $v="value=";
my $s="size=";
&IsApplet();
$sizea=$spsize+$PBsize;
$ck=" CHECKED";
$sizetb=(stat("./tb.cgi"))[7];
$sizem=(stat("./minili.cgi"))[7];

if( -e "$vDir/jcode.pl" ){
	$jpsz=1;
	$imp="<li><a href=\"#iMODE\">iMODE関連</a></li>";
}
if( $sizetb ){
	$tbtag="<li><a href=\"#tb\">トラックバック関連</a></li>";
}

if( $sizem ){
	$minitag="<li><a href=\"#mini\">miniList関連</a></li>";
}
$appp="<li><a href=\"#Applet\">お絵描きアプレット</a>$br" if( $sizea );
$b2="$br$br";
$ITT="<input type=\"TEXT\" name=";
$IRT="<input type=\"RADIO\" name=";
$ITC="<input type=\"CHECKBOX\" name=";
$nb="&nbsp;";

&PutHTMLheader();
print <<MkSt1_EOF;
<title>nicky!Setup</title>
<style type="text/css">
<!--
.button{border:1px solid #cccccc;color:#999999;background-color:#ffffff;}
body{background:#f0f0f0;color:#000000;}body a:link{color:#000000;}
body a:visited{color:#000000;}table table{background:#e0e0f0;}
.bt{background:#000000;color:#ffffff;text-align:center;height:24pt;font-weight:bold;}
-->
</style>
</head>
<body>
<center><font face="Impact" size="6" color="#000000"><b>nicky!Setup</b></font>
<DIV ALIGN="RIGHT">Ver.$Ver$br
<A HREF="$cgipath?ColorSample" TARGET="_blank">カラーサンプル</A>$br
<HR SIZE="1" NOSHADE WIDTH="90%">
Perl Ver$]</DIV>
<table border="1" cellpadding="4" cellspacing="0"><tr><td>
$br<center><b>---　Menu　---</b></center><ol><li><a href="#GENERAL">記事全体にまつわる設定</a>
<li><a href="#TITLE">記事のタイトルにまつわる設定</a>
<li><a href="#DIARY">記事本文にまつわる設定</a>
<li><a href="#COMMENTIN">コメントにまつわる設定</a>
<li><a href="#MSGOLD">過去ログにまつわる設定</a>
<li><a href="#TITLELIST">タイトルリストにまつわる設定</a>
$tbtag
$minitag
<li><a href="#OTHER">その他</a>
$imp$appp
</ol></td></tr></table>

<!-- 記事全体にまつわる設定 -->

<a name="GENERAL"></a>
<table border="0" width="100%">
<tr><td align=center>$br
<form method="POST" action="$cgipath">
<table cellpadding="0" cellspacing="1" border="0">
<tr><td class="bt">記事全体にまつわる設定</td></tr>
<tr><td>
最新ページは
<select name="PrintDay">
MkSt1_EOF
;
for($i=1; $i <= 15; $i++){
	if( $i == $PrintDay ){
		print "<option $v\"$i\" selected>$i";
	}else{
		print "<option $v\"$i\">$i";
	}
}
print "</select>件分を表示$b2";

$hap1=$hap2=$hap3=$hap4=$hap5=$hap6=$hap7="";
if( ($Age ne "t") && ($Age ne "tc") ){
	$hap1=$ck;
}elsif( $Age eq "t" ){$hap2=$ck;}else{$hap3=$ck;}
if( $WEEK != 1 ){$hap4=$ck;}else{$hap5=$ck;}
if( $PutTimeDefault eq "Yes" ){$hap6=$ck;}else{$hap7=$ck;}

print <<MkSt2_EOF;
表示の順序$br　
$IRT"Age" $v"r" $hap1>日付順$br　
$IRT"Age" $v"t" $hap2>書き込み順$br　
$IRT"Age" $v"tc" $hap3>コメントを含む書込順$br$br
記事を表示させる画面幅$ITT"NickyWidth" $v"$NickyWidth" $s"8">$b2
枠線の太さ$ITT"NickyLineWidth" $v"$NickyLineWidth" $s"4">$b2
枠線と本文の間隔$ITT"NickyLineSpan" $v"$NickyLineSpan" $s"4">$b2
日記の名前<br>
　$ITT"pageTitle" $v"$pageTitle" $s"64">$nb$nb$br
管理者の名前(HN)<br>
　$ITT"auther" $v"$auther" $s"64">$br
日記の概要<br>
　$ITT"descr" $v"$descr" $s"64">$br


</td></tr></table>
$br設定<INPUT TYPE="submit" NAME="MODE" $v"SETUP">$b2

<!-- 記事のタイトルにまつわる設定 -->
<a name="TITLE"></a>
<table border=0>
<tr><td class="bt">記事のタイトルにまつわる設定</td></tr>
<tr><td>記事タイトルの背景色$ITT"TitleBgColor" $v"$TitleBgColor" $s"10">$br$br
タイトルの縦幅$ITT"TSize" $v"$TSize" $s"6">$b2
日付の表現　年$ITT"Year" $v"$Year" $s"6">
　月$ITT"Month" $v"$Month" $s"6">
　日$ITT"Day" $v"$Day" $s"6">$b2
曜日の表現$br　<input type="RADIO" name="WEEK" $v"0"$hap4>日〜土$br　$IRT"WEEK" $v"1"$hap5>Sun〜Sat$b2
日付の文字サイズ
$ITT"DateSize" $v"$DateSize" $s"6">$b2
日付の文字色
$ITT"DateFontColor" $v"$DateFontColor" $s"10">$b2
時刻の表示（デフォルト）$br　$IRT"PutTimeDefault" $v"Yes"$hap6>表示する$br　$IRT"PutTimeDefault" $v"No\"$hap7>表示しない$b2
記事タイトルの文字サイズ
$ITT"TitleSize" $v"$TitleSize" $s"6">$b2
記事タイトルの先頭に付加する文字
MkSt2_EOF
$str=&tagenc($TitleHead);
print "$ITT\"TitleHead\" $v\"$str\" $s\"15\">$b2\n";
#
# リンク用タグを受けつける
#
print "リンク用タグを$br　";
print "$IRT\"LinkTH\" $v\"Yes\"";
print $ck if( $LinkTH eq "Yes" );
print ">表示する$br　";
print "$IRT\"LinkTH\" $v\"No\"";
print $ck if( $LinkTH ne "Yes" );
print ">表示しない$b2\n";

if( $LinkOpen eq "Yes" ){$hap1=$ck; $hap2="";
}else{$hap2=$ck; $hap1="";}
if( $Fit eq "ON" ){$hap3=$ck; $hap4="";}else{
$hap4=$ck; $hap3="";}

print <<HTML_EOF;
記事タイトルの文字色
$ITT"TitleFontColor" $v"$TitleFontColor" $s"10"></td></tr></table>

$br設定<input type="submit" name="MODE" $v"SETUP">$b2
<a name="DIARY"></a>
<table border=0><tr><td class="bt">記事本文にまつわる設定</td></tr>
<tr><td nowrap>

記事本文の文字サイズ$ITT"HonbunSize" $v"$HonbunSize" $s"6">$b2
記事本文の表示色$ITT"HonbunColor" $v"$HonbunColor" $s"10">$b2
記事本文の背景色$ITT"HonbunBgColor" $v"$HonbunBgColor" $s"10">$b2

自動リンクは新規ウィンドゥで開くように$br　
$IRT"LinkOpen" $v"Yes"$hap1>する$br　
$IRT"LinkOpen" $v"No"$hap2>しない$b2

画像表示サイズのデフォルト
$ITT"Fit_size" $v"$Fit_size" $s"3" class="button2">
$IRT"Fit" $v"ON"$hap3>有効　
$IRT"Fit" $v"No"$hap4>無効$b2
HTML_EOF

#
# 記事本文のエフェクト
#
$EffectSTR1=&tagenc($EffectSTR1);
$EffectSTR2=&tagenc($EffectSTR2);
$EffectSTR3=&tagenc($EffectSTR3);
$EffectSTR4=&tagenc($EffectSTR4);
print <<MkSt3_EOF;
記事本文のエフェクト　
文字$ITT"EffectSTR1" $v"$EffectSTR1" $s"4">
　色$ITT"EffectCOL1" $v"$EffectCOL1" $s"8">$b2
記事本文のエフェクト　
文字$ITT"EffectSTR2" $v"$EffectSTR2" $s"4">
　色$ITT"EffectCOL2" $v"$EffectCOL2" $s"8">$b2
記事本文のエフェクト　
文字$ITT"EffectSTR3" $v"$EffectSTR3" $s"4">
　色$ITT"EffectCOL3" $v"$EffectCOL3" $s"8">$b2
記事本文のエフェクト　
文字$ITT"EffectSTR4" $v"$EffectSTR4" $s"4">
　色$ITT"EffectCOL4" $v"$EffectCOL4" $s"8">
</td></tr></table>
<font size=1><B>※エフェクトの文字に半角の(/\\/[を指定することはできません</B></font>$b2
<!-- コメント入力欄関連 -->
<a name="COMMENTIN"></a>
<table border=0>
<tr><td class="bt">コメント関連</td></tr>
<tr><td>
コメント入力欄の縦幅（デフォルト）<select name="CommentRecv">
MkSt3_EOF

for($i=0; $i<10; $i++){
	print "<option $v\"$i\"";
	if( (($CommentRecv eq "No") && ($i == 0)) || (($CommentRecv eq "Yes") && ($i == 1)) || (($CommentRecv ne "Yes") && ($CommentRecv == $i)) ){
		print " selected";
	}
	if( $i ){
		print ">$i";
	}else{
		print ">なし";
	}
}
print "</select>$b2\n";

$hap1=$hap2="";
if( $CIRCV ne "OFF" ){ $hap1=$ck;}else{$hap2=$ck;}
print <<MkSt4_EOF;
受付許容文字数$ITT"CommentSTRlen" $v"$CommentSTRlen">$b2
過去ログ表示時に入力フォームを表示$br　$IRT"CIRCV" $v"ON"$hap1>する$br　$IRT"CIRCV" $v"OFF"$hap2>しない$b2
コメント入力欄の横幅$br
　Name$ITT"CommentNameWidth" $v"$CommentNameWidth" $s"8">
　Message$ITT"CommentMessageWidth" $v"$CommentMessageWidth" $s"8">$b2
コメントの枠色
$ITT"CommentFlColor" $v"$CommentFlColor" $s"10">$b2
コメントの文字列
$ITT"CommentStr" $v"$CommentStr" $s"30">$b2
コメントの文字サイズ
$ITT"CommentStrSize" $v"$CommentStrSize" $s"16">$b2
Name, Messageの文字サイズ
$ITT"CommentNameStrSize" $v"$CommentNameStrSize" $s"16">$b2
</td></tr>
<tr><td class="bt">コメント出力欄の設定</td></tr>
<tr><td>
背景色
$ITT"CommentBgColor" $v"$CommentBgColor" $s"10">
$br$br\nコメント記入者の表示色$ITT"CommentNameColor" $v"$CommentNameColor" $s"10">$br
記入者の表示サイズ$ITT"CommentNameSize" $v"$CommentNameSize" $s"5">$b2
コメントの文字色$ITT"CommentFontColor" $v"$CommentFontColor" $s"10">$br
コメントの文字サイズ$ITT"CommentFontSize" $v"$CommentFontSize" $s"5">$b2
</td></tr>
<tr><td class="bt">コメント受信時メール通知の設定</td></tr>
<tr><td>sendmailのパス$ITT"MTApath" $v"$MTApath" $s"20">$br
送信先メールアドレス$ITT"MailTo" $v"$MailTo" $s"20">$br
</td></tr></table>
MkSt4_EOF

print "$br設定<input type=\"submit\" name=\"MODE\" $v\"SETUP\">$b2\n";
#
# 過去ログ
#
$hap1=$hap2=$hap3=$hap4=$hap5=$hap6=$hap7=$hap8=$hap9=$hap10="";
if( $MsgOldForm == 2 ){ $hap1=$ck; }
elsif( $MsgOldForm == 0 ){ $hap2=$ck; }
elsif( $MsgOldForm == 4 ){ $hap3=$ck; }
elsif( $MsgOldForm == 1 ){ $hap4=$ck; }
if( !$MsgOld1st ){ $hap5=$ck; }
elsif( $MsgOld1st == 1 ){ $hap6=$ck; }
elsif( $MsgOld1st == 2 ){ $hap7=$ck; }
if( $SaveHTML eq "ON" ){
$hap8=$ck;
$hap10="$br　$ITC\"LogRemake\" value=\"GO\">過去ログ再構築";
}else{
$hap9=$ck;
}
print <<html_eof;
<a name="MSGOLD"></a>
<table border="0">
<tr><td class="bt">過去ログにまつわる設定</td></tr>
<tr><td>
表示形式$br
　$IRT"MsgOldForm" $v"2" $hap1>月単位（上）
　$IRT"MsgOldForm" $v"0" $hap2>月単位（下）
　$IRT"MsgOldForm" $v"4" $hap3>月単位（上＋下）
$br　$IRT"MsgOldForm" $v"1" $hap4>件数単位$b2

最新ページにログリストを$br　$IRT"MsgOld1st" $v"0" $hap5>表示する
　$IRT"MsgOld1st" $v"1" $hap6>表示しない
　$IRT"MsgOld1st" $v"2" $hap7>全く表示しない

$b2記事をHTMLに保存
$IRT"SaveHTML" $v"ON" $hap8>する　
$IRT"SaveHTML" $v"OFF" $hap9>しない$br
　過去ログの保存ファイルネーム
　$ITT"LogFname" $v"$LogFname" $s"8">
$hap10
</td></tr><tr><td class="bt">以下件数単位／月単位共通設定項目</td></tr><tr><td>
html_eof
$str=&tagenc($MsgOld);
print "過去ログ（Old）$ITT\"MsgOld\" $v\"$str\" $s\"20\">";
print "$br（最新ページにログリストを表示しない時に有効）$b2\n";
$str=&tagenc($MsgOldSize);
print "過去ログの文字サイズ$ITT\"MsgOldSize\" $v\"$str\" $s\"20\">";

print "</td></tr><tr><td class=\"bt\">以下件数単位指定時に有効</td></tr><tr><td>";
$str=&tagenc($MsgNew);
print "過去ログ（New）$ITT\"MsgNew\" $v\"$str\" $s\"20\">$b2";
print "過去ログの表示件数";
print "<SELECT NAME=\"PageCnt\">";
for($i=1; $i <= 30; $i++){
	if( $i == $PageCnt ){
		print "<option $v\"$i\" SELECTED>$i";
	}else{
		print "<option $v\"$i\">$i";
	}
}
print "</SELECT>$b2";

print "ページの表示を$br　$IRT\"MsgPageOut\" $v\"1\" ";
print $ck if( $MsgPageOut );
print ">する　　[最新]の文字　$ITT\"MsgOldNEWks\" $v\"$MsgOldNEWks\" $s\"3\">　$ITT\"MsgOldNEW\" $v\"$MsgOldNEW\" SIZE=\"20\">　$ITT\"MsgOldNEWke\" $v\"$MsgOldNEWke\" $s\"3\">$b2";
print "　　　　　 　　[最古]の文字　$ITT\"MsgOldOLDks\" $v\"$MsgOldOLDks\" size=\"3\">　$ITT\"MsgOldOLD\" $v\"$MsgOldOLD\" SIZE=\"20\">　$ITT\"MsgOldOLDke\" $v\"$MsgOldOLDke\" $s\"3\">$b2";
print "　　　　　 　　ページの括弧　$ITT\"ks\" $v\"$ks\" $s\"3\">　$ITT\"ke\" $v\"$ke\" $s\"3\">$b2";

print "　$IRT\"MsgPageOut\" $v\"0\" ";
print $ck if( !$MsgPageOut );
$str=&tagenc($MsgOldBetween);
print ">しない　過去ログNewとOldの間の表示$br";
print "　　　　　 　　$ITT\"MsgOldBetween\" $v\"$str\" $s\"40\">";

if( $MonthSort eq "UP" ){ $hap1=$ck; $hap2="";}else{ $hap2=$ck; $hap1="";}
$hap3=&tagenc($MsgOldYear);
$hap4=&tagenc($MsgOldMonth);
print <<HTML_EOFML;
</td></tr><tr><td class="bt">以下月単位指定時に有効</td></tr><tr><td>
表示順$br
$IRT"MonthSort" $v"UP" $hap1>昇順　
$IRT"MonthSort" $v"DOWN" $hap2>降順$b2
過去ログ$ITT"MsgOldLog" $v"$MsgOldLog" $s"20">背景色$ITT"MsgOldOBgCol" $v"$MsgOldOBgCol" $s"8">文字色$ITT"MsgOldCol" $v"$MsgOldCol" $s"8">$b2
　　　　年$ITT"MsgOldYear" $v"$hap3" $s"20">背景色$ITT"MsgOldYBgCol" $v"$MsgOldYBgCol" $s"8">文字色$ITT"MsgOldYFnCol" $v"$MsgOldYFnCol" $s"8">$b2
　　　　月$ITT"MsgOldMonth" $v"$hap4" $s"20">背景色$ITT"MsgOldMBgCol" $v"$MsgOldMBgCol" $s"8">$b2
　　　　cellpadding$ITT"MsgOldcelp" $v"$MsgOldcelp">　cellspacing$ITT"MsgOldcels" $v"$MsgOldcels">
</td></tr></table>
HTML_EOFML
print "$br設定<input type=\"submit\" name=\"MODE\" $v\"SETUP\">$b2\n";

#
#一覧に関する設定
#
print "<a name=\"TITLELIST\"></a>\n";
print "<table border=0>";
print "<tr><td class=\"bt\">タイトルリストに関する設定</td></tr>\n";
print "<tr><td>\n";
print "年$ITT\"TLyear\" $v\"$TLyear\" $s\"5\">";
print "月$ITT\"TLmonth\" $v\"$TLmonth\" $s\"5\">";
print "日$ITT\"TLday\" $v\"$TLday\" $s\"5\">$b2";
$str=&tagenc($TLyearsz);
print "年のサイズ$ITT\"TLyearsz\" $v\"$str\" $s\"5\">$br";
$str=&tagenc($TLmonthsz);
print "月のサイズ$ITT\"TLmonthsz\" $v\"$str\" $s\"5\">$br";
$str=&tagenc($TLdaysz);
print "日のサイズ$ITT\"TLdaysz\" $v\"$str\" $s\"5\">$b2";
print "表示順$br\n";
print "$IRT\"TitleListSort\" $v\"UP\" ";
print $ck if( $TitleListSort eq "UP" );
print ">昇順$br";
print "$IRT\"TitleListSort\" $v\"DOWN\" ";
print $ck if( $TitleListSort ne "UP" );
print ">降順$b2";
$str=&tagenc($MsgOldTG);
print "画像有の印$ITT\"MsgOldTG\" $v\"$str\" $s\"20\">";
print "</tr></td></table>\n$b2";
#
# その他
#
if( $PutSerchTagFlag ){ $hap1=$ck;$hap2=""; }else{ $hap2=$ck;$hap1="";}
$hap3=$hap4=$hap5=$hap6=$hap7=$hap8=$hap9=$hap10=$hap11=$hap12="";
if( $tagpl eq "strict" ){	$hap4=$ck;
}else{						$hap3=$ck;
}
if( $taglt eq "strict" ){	$hap6=$ck;
}else{						$hap5=$ck;
}
if( $tagbr eq "p" ){	$hap8=$ck;
}else{					$hap7=$ck;
}
if( $tagmode eq "xhtml" ){	$hap10=$ck;
}else{						$hap9=$ck;
}
if( $anker eq "no" ){	$hap12=$ck;
}else{					$hap11=$ck;
}
$tag2lf=&tagenc($tag2lf);
$tag3lf=&tagenc($tag3lf);
print <<HTML_EOF_OTH;
<a name="OTHER"></a>
<table border=0>
<tr><td class="bt">その他</td></tr><tr><td>
過去ログへのリンクタグ$br
　$IRT"tagpl" $v"tra"$hap3>Transitional　$IRT"tagpl" $v"strict"$hap4>Strict/XHTML
$b2画像レイアウト右上＆左上指定タグ$br
　$IRT"taglt" $v"tra"$hap5>Transitional　$IRT"taglt" $v"strict"$hap6>Strict/XHTML
$b2連続改行変換$br
<table border="0">
<tr><td rowspan="2" valign="top">$IRT"tagbr" $v"p"$hap8>する$br</td>
    <td>　改行が２つ続いた場合
　　$ITT"tag2lf" $v"$tag2lf"></td></tr>
    <tr><td>　改行が３つ続いた場合
　　$ITT"tag3lf" $v"$tag3lf"></td></tr>
<tr><td colspan="2">$IRT"tagbr" $v"br"$hap7>しない</td></tr></table>
$brタグモード$br
　$IRT"tagmode" $v"html"$hap9>HTML　$IRT"tagmode" $v"xhtml"$hap10>XHTML
$b2アンカーをCGIに出力$br
　$IRT"anker" $v"yes"$hap11>させる　$IRT"anker" $v"no"$hap12>させない

$b2検索機能へのリンクをCGIに$br
　$IRT"PutSerchTagFlag" $v"1"$hap1>出力させる　$IRT"PutSerchTagFlag" $v"0"$hap2>出力させない$b2
最新版を出力させるHTMLファイルネーム
$ITT"NickyHtml" $v"$NickyHtml" $s"16">
</td></tr>
</table>\n$b2
HTML_EOF_OTH
# Trackback
if( $sizetb ){
$hap1=$hap2=$hap3=$hap4="";
if( $tbPast eq "Yes" ){$hap1=$ck;$hap2="";}else{$hap2=$ck;$hap1="";}
if( $tbRcvDef eq "Yes" ){$hap3=$ck;$hap4="";}else{$hap4=$ck;$hap3="";}
print <<TBEOF;
<a name="tb"></a>
<table border=0><tr><td class="bt">トラックバック関連</td></tr>
<tr><td>
トラックバックのデフォルト$br
　$IRT"tbRcvDef" $v"Yes" $hap3>受け付ける
　$IRT"tbRcvDef" $v"No" $hap4>受け付けない
$b2
過去ログ表示時に０件のトラックバックを表示$br
　$IRT"tbPast" $v"Yes" $hap1>する
　$IRT"tbPast" $v"No" $hap2>しない
</td></tr></table>
TBEOF
print "$br設定<input type=\"submit\" name=\"MODE\" $v\"SETUP\">$br$br";
}
#
# miniList
#
if( $sizem ){
if( $miniLang ne "ja" ){ $hap1=$ck;$hap2=""; }else{ $hap2=$ck;$hap1=""; }
if( $miniNum ne "No" ){ $hap3=$ck;$hap4=""; }else{ $hap3="";$hap4=$ck; }
print <<HTML_EOF;
<a name="mini"></a>
<table border="0"><tr><td class="bt">miniList</td></tr><tr><td>
カレンダーの表示言語$br
　$IRT"miniLang" $v"en"$hap1>英語　$IRT"miniLang" $v"ja" $hap2>日本語$b2
タイトルの表示文字数$br
　$ITT"ministr" $v"$ministr" $s"8">$b2
最新ページのタイトル表示数は$br
　$IRT"miniNum" $v"Yes"$hap3>最新+過去ログ　$IRT"miniNum" $v"No"$hap4>最新のみ

</td></tr></table>$b2
HTML_EOF
}
# iMODE関連
if( $jpsz )
{
print "<a name=\"iMODE\"></a>\n";
print "<table border=0><tr><td class=\"bt\">iMODE関連</td></tr>\n";
print "<tr><td>";
if( &ReqJcode() ){
	print "１ページ目に表示する件数";
	print "<select name=\"PrintiDay\">";
	for($i=1; $i <= 30; $i++){
		if( $i == $PrintiDay ){
			print "<option $v\"$i\" selected>$i";
		}else{
			print "<option $v\"$i\">$i";
		}
	}
	print "</select>$b2";
	print "過去ログの表示件数";
	print "<select name=\"PageiCnt\">";
	for($i=1; $i <= 30; $i++){
		if( $i == $PageiCnt ){
			print "<option $v\"$i\" selected>$i";
		}else{
			print "<option $v\"$i\">$i";
		}
	}
	print "</select>";
}else{
	print "jcode.plの実装に失敗しています";
}
print "</td></tr></table>$b2\n";
}

#JavaApplete系
if( $sizea > 0 )
{
if( $apOP eq "Yes" ){$hap1=$ck;$hap2="";}else{$hap2=$ck;$hap1="";}
print <<MkStAP_EOF;
<a name="Applet"></a>
<table border=0>
<tr><td class="bt">お絵描きアプレットの設定</td></tr><tr><td>
サイズのデフォルト値　横幅$ITT"image_width" $v"$image_width" $s"4">縦幅$ITT"image_height" $v"$image_height" $s"4">$b2
Appletサイズ 横幅$ITT"apw" $v"$apw" $s"6">縦幅$ITT"aph" $v"$aph" $s"6">$b2
Layer $ITT"layerNum" $v"$layerNum" $s"3">枚
　Undo $ITT"undoNum" $v"$undoNum" $s"3">回
　Quality $ITT"Quality" $v"$Quality" $s"3">$b2
再生の文字　$ITT"ReplaySTR" $v"$ReplaySTR" $s"10">
$b2続きの文字　$ITT"ContinueSTR" $v"$ContinueSTR" $s"10">
$b2 JPEGしきい値　$ITT"JPEG_border" $v"$JPEG_border" $s"5">K
$b2圧縮率　$ITT"CompressL" $v"$CompressL" $s"5">
$b2再生時別Windowオープン$br　
$IRT"apOP" $v"Yes"$hap1>する　
$IRT"apOP" $v"No"$hap2>しない
</td></tr></table>
MkStAP_EOF
}
#
# SUBMIT
#
print "$br設定<input type=\"submit\" name=\"MODE\" $v\"SETUP\">";
print "　　初期値<input type=\"submit\" name=\"MODE\" $v\"INITIAL\">";
print "</form>";

print "</td></tr></table>";
print "</body></html>\n";
}

#
# Save to ConfigFile
#
sub SaveNickyConf{

if( -e "./panel.cgi" ){
	$ctgedit=1;
}else{
	$ctgedit=0;
}
open(WDCNF, ">./NickyConf.cgi");
binmode(WDCNF);
print WDCNF <<SAVEDATA;
pageTitle=$pageTitle
auther=$auther
descr=$descr
PrintDay=$PrintDay
PageCnt=$PageCnt
PrintiDay=$PrintiDay
PageiCnt=$PageiCnt
Age=$Age
Year=$Year
Month=$Month
Day=$Day
WEEK=$WEEK
NickyWidth=$NickyWidth
NickyLineWidth=$NickyLineWidth
NickyLineSpan=$NickyLineSpan
HonbunBgColor=$HonbunBgColor
TSize=$TSize
DateSize=$DateSize
DateFontColor=$DateFontColor
TitleSize=$TitleSize
TitleHead=$TitleHead
LinkTH=$LinkTH
TitleBgColor=$TitleBgColor
TitleFontColor=$TitleFontColor
CommentRecv=$CommentRecv
CommentSTRlen=$CommentSTRlen
CIRCV=$CIRCV
CommentBgColor=$CommentBgColor
CommentNameColor=$CommentNameColor
CommentNameSize=$CommentNameSize
CommentFontColor=$CommentFontColor
CommentFontSize=$CommentFontSize
CommentStr=$CommentStr
CommentStrSize=$CommentStrSize
CommentNameStrSize=$CommentNameStrSize
CommentFlColor=$CommentFlColor
CommentNameWidth=$CommentNameWidth
CommentMessageWidth=$CommentMessageWidth
MTApath=$MTApath
MailTo=$MailTo
HonbunColor=$HonbunColor
HonbunSize=$HonbunSize
EffectSTR1=$EffectSTR1
EffectSTR2=$EffectSTR2
EffectSTR3=$EffectSTR3
EffectSTR4=$EffectSTR4
EffectCOL1=$EffectCOL1
EffectCOL2=$EffectCOL2
EffectCOL3=$EffectCOL3
EffectCOL4=$EffectCOL4
LinkOpen=$LinkOpen
Fit_size=$Fit_size
Fit=$Fit
PutTimeDefault=$PutTimeDefault
MsgNew=$MsgNew
MsgOld=$MsgOld
MsgOldLog=$MsgOldLog
MsgOldForm=$MsgOldForm
MsgOld1st=$MsgOld1st
MsgOldCol=$MsgOldCol
MsgOldOBgCol=$MsgOldOBgCol
MsgOldSize=$MsgOldSize
MsgOldYBgCol=$MsgOldYBgCol
MsgOldYFnCol=$MsgOldYFnCol
MsgOldMBgCol=$MsgOldMBgCol
MsgOldTG=$MsgOldTG
MsgOldYear=$MsgOldYear
MsgOldMonth=$MsgOldMonth
MsgOldcelp=$MsgOldcelp
MsgOldcels=$MsgOldcels
TLyear=$TLyear
TLmonth=$TLmonth
TLday=$TLday
TLyearsz=$TLyearsz
TLmonthsz=$TLmonthsz
TLdaysz=$TLdaysz
MsgOldNEWks=$MsgOldNEWks
MsgOldNEW=$MsgOldNEW
MsgOldNEWke=$MsgOldNEWke
MsgOldOLDks=$MsgOldOLDks
MsgOldOLD=$MsgOldOLD
MsgOldOLDke=$MsgOldOLDke
MsgOldBetween=$MsgOldBetween
MonthSort=$MonthSort
SaveHTML=$SaveHTML
LogFname=$LogFname
ks=$ks
ke=$ke
MsgPageOut=$MsgPageOut
tbPast=$tbPast
tbRcvDef=$tbRcvDef
TitleListSort=$TitleListSort
image_width=$image_width
image_height=$image_height
apw=$apw
aph=$aph
ReplaySTR=$ReplaySTR
ContinueSTR=$ContinueSTR
JPEG_border=$JPEG_border
CompressL=$CompressL
layerNum=$layerNum
undoNum=$undoNum
Quality=$Quality
apOP=$apOP
PutSerchTagFlag=$PutSerchTagFlag
NickyHtml=$NickyHtml
UserN=$UserN
UserL=$UserL
UserR=$UserR
UserU=$UserU
UserD=$UserD
UserLC=$UserLC
UserRC=$UserRC
UserUC=$UserUC
UserDC=$UserDC
UserCmnt=$UserCmnt
tagpl=$tagpl
taglt=$taglt
tagbr=$tagbr
tag2lf=$tag2lf
tag3lf=$tag3lf
tagmode=$tagmode
anker=$anker
ctgedit=$ctgedit
ministr=$ministr
miniLang=$miniLang
miniNum=$miniNum
SAVEDATA
close( WDCNF );

if( ($Mode eq "SETUP") && ($SaveHTML eq "ON") && (($flag_savehtml ne "ON")||($LogRemake eq "GO")) ){
	if( $MsgOldForm !~ /1/ ){
		&MakeMonthHTML();
	}else{
		&MakePageHTML();
	}
	&MakeLastHTMLsub();
	&NickyPageOut(0);
	exit;
}else{
	&MakeNickyLast();
}
}

#
# 記事用ファイルネーム作成
# ディレクトリ:$NickyDir
# ファイルネーム：$NickyFname
# サーチ用パス：$NickySPath
#
sub MakeNickyDir{
	$NickyDir="$vDir/$year";
}
sub MakeNickyFname{
local($fname);
my($i, $fn, @flist);

&MakeNickyDir();
$fname=sprintf("%02d%02d", $month, $day);
if( !$daysub ){
	$i=0;
	$fn="./$year/$fname.*\\.nky\$";
	@flist=&GetFileList($fn);
	$i=$#flist;
	$i++;
	$daysub=sprintf("%c", 0x41+$i);
}

if( $Category ){
$NickyFname=sprintf("%s/%s%s_%08X.nky", $NickyDir, $fname, $daysub, $Category);
}else{
$NickyFname=sprintf("%s/%s%s.nky", $NickyDir, $fname, $daysub);
}
$NickySPath=sprintf("%s/%s.*\\.nky", $NickyDir, $fname);
$NickyComment=sprintf("%s/%s%s.cmnt", $NickyDir, $fname, $daysub);
}

#
# チェック
#
sub TrueCheck
{
	my($pair, @pairs, $DUMMY, $name, $value, $arg);

	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});

	foreach $pair (@pairs) {
		($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		if( $name eq "Nicky" ){
			$DUMMY = $value;
		}
	}
	@pairs = split(/,/, $DUMMY);
	foreach $pair (@pairs) {
		($arg, $value) = split(/:/, $pair);
		${$arg} = $value;
	}
	&AdminCheck($pass);
}
#
# ファイルからグローバル変数に取り込む
#
sub GetNickyFile
{
	my($nfn)=@_;
	my($str);

	if( open(RRDD, $nfn) ){
		binmode(RRDD);
		while(<RRDD>){$str .= $_;}
		close(RRDD);
	}

	($Date, $Title, $Message, $GrpFileName, $Layout, $CommentRecv, $fit_size, $RepLayout, $tbRcv) = split(/\x01/, $str);
	if( $fit_size ){
		$FitCheck = "ON";
	}else{
		undef $FitCheck;
	}
	if( substr($Date,-5) =~ /[0-9][0-9]:[0-9][0-9]/ ){
		$hour=substr($Date,-5,2);
		$min=substr($Date,-2,2);
	}else{
		$hour=$min=-1;
	}
}

sub MakeCommentTime{
my($cdate);
my($csec,$cmin,$chour,$cday,$cmon,$cyear,$cwday,$cyday,$cisdst) = localtime;
sprintf("%04d/%02d/%02d %02d:%02d", $cyear+1900, $cmon+1, $cday, $chour, $cmin);
}

sub cut_str{
my($str, $len)=@_;
my($i, $mkstr, $c, $od);

return $str if( !$len || $len >=length($str) );

for($i=0;$i<$len;$i++){
	$c=substr($str, $i, 1);
	$mkstr.=$c;
	$od=ord($c);
	if( $od >= 0x80 ){
		$c=substr($str, $i+1, 1);
		$mkstr.=$c;
		$len+=0.5 if( $od == 0x8e );
		$i++;
	}
}
$mkstr.="..";
$mkstr.="." if( $i == $len );
$mkstr;
}

sub getNickyFname{
($year, $month, $day, $daysub, $Category)=@_;
my(@dmy, $gomi1, $gomi2);
&MakeNickyFname();
if( !$Category ){
	@dmy=&GetFileList("\/$year\/$year\/$month$day$daysub.*\.nky\$");
	($gomi1, $gomi2)=split(/_/, $dmy[0]);
	if( $gomi2 ){
		$Category=substr($gomi2, 0, 8);
		$NickyFname="$vDir/$year/$month$day$daysub"."_"."$Category\.nky";
	}
}
($NickyFname, $Category);
}

sub cmnt_enc{
my($val)=$_[0];
my($rtn, $s, $o);
$rtn="";
for $s( split(//, $val)){
  $o=sprintf("%02x", ord($s));
  $rtn=$rtn."%$o";
}
$rtn;
}

sub cmnt_dec{
my($val)=$_[0];
$val=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
$val;
}

sub NickyInputComment{
	my($cdate, $error, $gomi1, $gomi2, $gomi3, $ille, @dmy);
	my($name, $msg, $time);

	&getNickyFname($year, $month, $day, $daysub, $Category);
	$CommentName=~s/\r|\n//g;
	$CommentMsg=~s/\r//g;
	$CommentMsg=~s/\n(\n+)/\n\n/g;
	$CommentMsg=~s/\n(\n+)$//;
	$CommentName=&cut_str($CommentName, 50);
	$CommentMsg=&cut_str($CommentMsg, $CommentSTRlen);
	if( ($CommentName ne "") && ($CommentMsg ne "") && ($Mode ne "CPREVIEW") ){
		if( open(RDC, $NickyComment) ){
			binmode(RDC);
			while(<RDC>){
				local($str2, $ctloop);
				$ctloop=0;
				($name, $msg, $time)=split/\x01/;
				while( $time == "" ){
					($str2, $time)=split(/\x01/, <RDC>);
					$msg.=$str2;
					$ctloop++;
					last if( $ctloop > 50 );
				}
			}
			close(RDC);
		}
		($name, $gomi1)=split(/\x02/, $name);
		if( ($msg ne $CommentMsg) || ($name ne $CommentName) ){
			$cdate=&MakeCommentTime();
			if( ($CommentMsg =~ /\x01/) || ($CommentName =~ /\x01/) ){
				$ille = 1;
			}else{
				$ille = 0;
				open(WDC, ">>$NickyComment");
				binmode(WDC);
				if( $Mode eq "CINPUTS" ){
					print WDC "\x03";
					$CommentName=&cmnt_enc($CommentName);
					$CommentURI=&cmnt_enc($CommentURI);
					$CommentMsg=&cmnt_enc($CommentMsg);
				}
				print WDC "$CommentName\x02$CommentURI\x01";
				print WDC "$CommentMsg\x01";
				print WDC "$cdate\n";
				close( WDC );
			}
			if( $mtap && $mto ){
				if( $Admin && (-f "comment_notice_admin.cgi")){
				}else{
				  open(PIPE, "|$mtap -t -Fnicky!");
				  if( $error == 0 ){
					print PIPE "To: $mto\n";
					print PIPE "Subject: nicky!Notice ReciveCommentMessage\n\n";
					print PIPE "Recieve Date : $cdate\n";
					print PIPE "from  : $ENV{REMOTE_HOST}($ENV{REMOTE_ADDR})\n";
					print PIPE "agent : $ENV{HTTP_USER_AGENT}\n\n";
					print PIPE "http://$ENV{HTTP_HOST}$ENV{SCRIPT_NAME}\?DT=$year$month$day$daysub#$year$month$day$daysub\n\n";
					print PIPE "illegal post\n" if( $ille );
					close(PIPE);
				  }
				}
			}
		}
		undef $CommentMsg;
		undef $CommentName;
		undef $CommentURI;
		($m_yer, $m_month, $m_day, $m_daysub)=($year, $month, $day, $daysub);
		&MakeHTMLone($year, $month, $day, $daysub, 0, 0);
		&MakeNickyLast();
	}else{
		&nickyGetHead();
		if( &IsIMODE() ){
			$sts=&ReqJcode();
			&jcode'euc2sjis(\$iHead) if( $sts );
		}else{
			print &put_macro($head);
		}
		$flagCMNT=1;
		$ModeSub=16;
		&GetNickyFile($NickyFname);
		if( &IsIMODE() ){
			&PutNickyOneDayIMODE();
			&jcode'euc2sjis(\$iFoot) if( $sts );
		}else{
			&PutNickyOneDay();
			print &put_macro($foot);
		}
	}
}
#
# 記事修正フォーム出力
# (2002/02/10 提供 http://sugarplum.vis.ne.jp/)
#
sub PutEditNicky
{
 my($str, $fitstr, $dat1, $dat2);
 local($size1,$size4);
 my $sc="style=\"text-align:center\"";
 my $IT="<input type=";
 my $ITS="$IT\"submit\" name=";
 my $ITV="$ITS\"Mode\" value=";
 my $nte="class=\"nte\"";
 $HRSTR="<hr size=\"1\" noshade>";
 $para = $_[0];
 $lg=$lg."k";
# $dat2=&put_editstyle();

 $dat1="";
 $dat1="<p $sc>$ITS\"WRITE\" value=\"書込\"></p>\n" if( $para eq "WRITE" );
print <<html_eof;
<form name="editscr" enctype="multipart/form-data" method="post" action="$cgipath#tgt" id="editscr">
$dat1
<div id="nicky_edit_1">
<h1 id="nicky_edit_2">記事作成／編集</h1>
<div id="nicky_edit_3">
<h2 id="nicky_edit_4">本文</h2>
<table id="nicky_edit_5">
<tr><td align="left">日付</td><td align="left">
html_eof
 if( $first eq "Yes" ){
	undef $daysub;
	$Category=0;
 }else{
	local($yd);
	&MakeNickyFname();
	&MakeDateStr();
	$yd=sprintf("%04d%02d%02d%s%s%s_%08x",$year,$month,$day,$daysub,$hour,$min,$Category);
	print "$IT\"HIDDEN\" name=\"DATE\" value=\"$yd\">\n";
 }
 $nCategory=$Category if( !$stage2nd );

 $lg=$lg."y";
 print "<select name=\"nyear\">";
 for($i=$year-10; $i<=$year+10; $i++){
	if( $i == $year ){$dat1=" selected";}else{$dat1="";}
	print "<option value=\"$i\"$dat1>$i";
 }
 print "</select>年";

 print "<select name=\"nmonth\">";
 for($i=1; $i<=12; $i++){
	if( $i == $month ){$dat1=" selected";}else{$dat1="";}
	printf "<option value=\"%02d\"$dat1>$i", $i;
 }
 print "</select>月";

 print "<select name=\"nday\">";
 for($i=1; $i<=31; $i++){
	if( $i == $day ){$dat1=" selected";}else{$dat1="";}
	printf "<option value=\"%02d\"$dat1>$i", $i;
 }
 print "</select>日\n";

 if( $hour >= 0 ){
	print "$IT\"CHECKBOX\" $nte name=\"PutTime\" value=\"Yes\"";
	print " CHECKED" if( $PutTime eq "Yes" );
	print ">時刻の表示\n";
 }
 print "$IT\"HIDDEN\" name=\"hour\" value=\"$hour\">\n";
 print "$IT\"HIDDEN\" name=\"min\" value=\"$min\">\n";
 if( $para =~ /KAKUNIN/ ){
	print "$ITS\"CMNTEDIT\" value=\"日付の記事を編集\">\n";
	print "</td>\n";
 }
 print "<td rowspan=\"4\" valign=\"bottom\" align=\"left\">";
 &get_ctg_data();
 if( $load_ctg > 0 ){
	my $i=0;
	my($sr,$catedat,$hp,$idstr);
	@ctg_ff=sort{$$a[1] <=> $$b[1]} @ctg_ff;
	for $sr(@ctg_ff){
		$idstr=$$sr[4];
		next if( $idstr eq "idrst" );
		next if( $idstr == 0 );
		if( $idstr > 1 ){
			$j=1<<($idstr-1);
		}else{
			$j=$idstr;
		}
		if( $nCategory & $j ){ $hp=" checked";}else{$hp="";}
		$catedat.="$IT\"checkbox\" $nte name=\"nCategory\" value=\"$j\"$hp>";
		$catedat.="$$sr[0]$br";
	}
	if( $catedat ){
		print "<h3 id=\"nicky_edit_6\">カテゴリ</h3>\n$catedat";
	}
	print "<input type=\"hidden\" name=\"stage2nd\" value=\"TRUE\">";
 }
 $Title=&tagenc($Title);
 $message=&tagenc($message);
print <<html;
</td></tr>
<tr><td style="{white-space:nowrap;}" align="left">タイトル</td>
<td align="left">$IT"TEXT" size="60" name="Title" value="$Title"></td></tr>
<tr><td colspan="2" align="left">本文　<small><a href="$cgipath?ColorSample" target="_blank">カラーサンプル</a></small>$br
<textarea name="Message" rows="10" cols="75" $inputt>$message</textarea>
html
 print &PutFile("$vDir/iconlist_tag.cgi");
 print $inpute;
 print "</td></tr>\n";
 print "<tr><td colspan=\"2\" align=\"left\">コメント入力欄の縦幅 ： <select name=\"CommentRecv\">";
 for($i=0; $i<10; $i++){
	print "<option value=\"$i\"";
	if( (($CommentRecv eq "No") && ($i == 0)) || (($CommentRecv eq "Yes") && ($i == 1)) || (($CommentRecv ne "Yes") && ($CommentRecv == $i)) ){
		print " SELECTED";
	}
	if( $i ){ print ">$i";}else{print ">なし";}
 }
 print "</select>";

 if( (stat("./tb.cgi"))[7] ){
	print "$IT\"checkbox\" $nte name=\"tbRcv\" value=\"Yes\"";
	print " CHECKED" if( $tbRcv eq "Yes" );
	print ">Trackbackを受け付ける";
 }
 print "　$IT\"CHECKBOX\" $nte name=\"UrlLink\" value=\"Yes\"";
 print " CHECKED" if( $UrlLink eq "Yes" );
 print ">URL自動リンク\n</td></tr></table>\n";

 $fit_size=$Fit_size if( !$fit_size );
 $fitstr="　表示サイズ $IT\"TEXT\" name=\"fit_size\" value=\"$fit_size\" size=\"3\">fit$IT\"CHECKBOX\" $nte name=\"FitCheck\" value=\"ON\"";

 print "<h2 id=\"nicky_edit_7\">画像関連</h2>\n";
 print "<table id=\"nicky_edit_8\">";
 $size1=(stat("$vDir/PaintBBS.jar"))[7];
 $size4=(stat("$vDir/spainter.jar"))[7];
 if( $GrpFileName ){
	my(@fl,$evf);
	local($flag, $p2, $n);
	print "<tr><td nowrap>$IT\"HIDDEN\" name=\"GrpFileName\" value=\"$GrpFileName\">";

	$n=rindex($GrpFileName, "\.");
	$p2=substr($GrpFileName, 0, $n);
	@fl=&GetFileList("\\$NickyDir\\/$p2\\.");

	$flag=0;
	for (@fl){
		if( ($_ ne "./$year/$GrpFileName") &&
			($_ ne "./$year/$p2.nky") &&
			($_ ne "./$year/$p2.cmnt") ){
			$flag=1;
			$evf=$_;
			last;
		}
	}

	if( !$flag ){
		print "event/spch/thumbnail</td>\n<td nowrap>： $IT\"FILE\" name=\"EventFile\" size=\"45\" MaxLength=\"200\">";
		if( !$ThmPath ){
			print $fitstr;
			print "CHECKED" if( $FitCheck eq "ON" );
			print ">";
		}
		print "</td></tr>\n";
	}else{
		print "</td><td>\n</td></tr>";
	}
	print "<tr><td colspan=2 nowrap>画像系ファイル削除$IT\"CHECKBOX\" $nte name=\"GrpFileDel\" value=\"Delete\">";
	if( $flag ){
		print "　event/spcsh/thumbnail削除$IT\"CHECKBOX\" name=\"EventFileDel\" value=\"Delete\">";
		if( !$ThmPath ){
			print $fitstr;
			print "CHECKED" if( $FitCheck eq "ON" );
			print ">";
		}
		if( $evf =~ /pch$|spch$/ ){
			print " $IT\"CHECKBOX\" name=\"RepLayout\" value=\"CHECKED\" $RepLayout>再生(上下)";
		}
	}

	print "</td></tr>\n";
	$str="$HRSTR<ul><li>画像を差し替えたい場合は、一旦画像ファイルを削除した後に再度アップロード／描画します。<li>『画像ファイル削除』をチェックした場合、確認ボタン選択でも画像ファイルを削除します。</ul></td></tr>\n";
 }else{
	my $ds;
	$ds=$dat1="";
	$dat1=" CHECKED" if( $FitCheck eq "ON" );
print <<html_eof;
<tr><td>画像ファイル</td><td>： $IT"FILE" name="GrpFile" size="45" MaxLength="200" class="netn"></td></tr>
<tr><td nowrap>event/spch/thumbnail</td><td nowrap>： $IT"FILE" name="EventFile" size="45" MaxLength="200" class="netn">
$fitstr$dat1></td></tr>
html_eof
	if( $size1+$size4 > 0 ){
		$ds="<tr><td nowrap>アプレット呼び出し</td>\n<td>： ";
		$ds.="$ITV\"PaintBBS\">" if( $size1 > 0 );
		if( $size4 > 0 ){
			$ds.="　$ITV\"SPAINTER:Normal\">";
			$ds.="　$ITV\"SPAINTER:Pro\">";
		}
		$layerNum=9 if( !$layerNum );
print <<html_eof;
$ds
</td></tr><tr>
<td colspan="2">　幅 $IT"TEXT" name="image_width" value="$image_width" size="3">
　高さ $IT"TEXT" name="image_height" value="$image_height" size="3">
　Layer $IT"TEXT" name="layerNum" value="$layerNum" size="3">
　圧縮率 $IT"TEXT" name="CompressL" value="$CompressL" size="3">
　Quality $IT"TEXT" name="Quality" value="$Quality" size="3">
 $IT"CHECKBOX" $nte name="AnimeSave" value="True" CHECKED>再生可
 $IT"CHECKBOX" $nte name="RepLayout" value="CHECKED" $RepLayout>再生(上下)
</td></tr>
html_eof
	}
 }

 @a=("左 ","右 ","上 ","下 ", "左上 ", "右上 ", "上中央 ", "下中央 ");
 $dat1="";
 for($i=0; $i<8; $i++){
	$dat1.="$IT\"RADIO\" $nte name=\"Layout\" value=\"$i\"";
	$dat1.=" CHECKED" if( $i == $Layout );
	$dat1.=">$a[$i]";
 }
 &nickyGetHead();
 $efoot=~s/\$passwd/$pass/g;
print <<html_eof;
<tr><td nowrap>画像の表示位置</td><td nowrap>：$dat1</td></tr></table>
<p $sc>$ITS"KAKUNIN" value="確認"> 
$ITS"KAKUNINH" value="ヘッダをつけて確認"> 
$ITS"WRITE" value="書込"></p>
</div></form>$str
$efoot
</div>
</body></html>
html_eof
}

sub put_editstyle{
my $dat=<<html_eof;
<style type="text/css">
<!--
input, textarea{ border:solid 1px #444; }
.nte{border:none;}
#nicky_edit_1{clear:both;width:100%;margin:0em;padding:0em;}
#nicky_edit_2{background-color:#808080; color:#fff; font-size:medium; padding:7px 0px 7px 35px;}
#nicky_edit_3{margin-left:100px;}
#nicky_edit_4, #nicky_edit_7{border-bottom:double 3px #888;color:#333;font-size:medium;padding:5px;margin-bottom:10px;text-align:left;}
#nicky_edit_6{color:#333; font-size:small; padding:5px; margin:0; background-color:#f5f5f5;}

-->
</style>
html_eof
$dat;
}
#
#記事作成
#
sub Nicky{
	&GetDateLocaltime();
	&PutHTMLheader();
	print "<title>nicky!記事作成</title>";
	print &put_editstyle();
	&get_inputarea();
	print $inputh;
	print "</head>";
	print "<body bgcolor=\"#FFFFFF\" text=\"#000000\" link=\"#0088CC\" alink=\"#00FFDD\" vlink=\"#0088CC\" style=\"background-color:#fff; margin:0px 0px 10px 0px;\">";
	$PutTime=$PutTimeDefault;
	$FitCheck=$Fit;
	$tbRcv=$tbRcvDef;
	$UrlLink="Yes";
	$Category="-1";
	&PutEditNicky(KAKUNIN);
}

sub ReqJcode
{
	local($ret);

	$ret = 0;
	if( !$flag_jcode ){
		if( eval("require '$vDir/jcode.pl'") ){
			$flag_jcode=1;
			$ret=1;
		}else{
			$flag_jcode=2;
		}
	}elsif( $flag_jcode == 1 ){
		$ret=1;
	}

	$ret;
}
#
#記事作成(iMODE版)
#
sub NickyIMODE
{
my($opt)=@_;
my($optmsg);
local($str);

if( $opt eq "edit" ){
	$optmsg="<input type=\"submit\" name=\"MODE\" value=\"SEND\">";
}else{
	$optmsg="<input type=\"submit\" name=\"delImode\" value=\"削除実行\">";
}

$ITT="<input type=\"HIDDEN\" name=";
&PutHTMLheaderSJIS();
$str="<form method=\"POST\" action=\"$cgipath\">";
if( $daysub ){
my($ct);
$ct=sprintf("_%08x", $Category) if( $Category );
$str.=<<NIMS_EOF;
$ITT"DATE" value="$year$month$day$daysub$hour$min$ct">$ITT"GrpFileName" value="$GrpFileName">$ITT"Layout" value="$Layout">$ITT"CommentRecv" value="$CommentRecv">$ITT"fit_size" value="$fit_size">$ITT"FitCheck" value="$FitCheck">$ITT"RepLayout" value="$RepLayout">$ITT"tbRcv" value="$tbRcv">
NIMS_EOF
}
$str.=<<NIM_EOF
タイトル$br
<input type="TEXT" size="15" name="Title" value="$Title">$br本文$br
<textarea name="Message" rows="3" cols="15">$Message</textarea>$br
PassWord<input type="TEXT" name="passwd" size="6">$br
$optmsg
</form>
NIM_EOF
;
&jcode'euc2sjis(\$str) if( &ReqJcode() );
print $str;
}

#
#記事編集(iMODE)
#
sub NickyEditIMODE{
	my($opt)=@_;
	my(@lst, $gfn, $fn);

	if( $daysub ){
		&MakeNickyFname();
		if( !-e "$vDir/$NickyFname" ){
			$fn=sprintf("%s/%04d/%02d%02d%s.*.nky\$", $vDir, $year, $month, $day, $daysub);
			@lst=&GetFileList($fn);
			$NickyFname=$lst[0];
			&GetDateFromFname();
		}
	}else{
		@lst=&GetNickyList("r");
		$gfn=$lst[0];
		$NickyFname=$$gfn[0];
		&GetDateFromFname();
	}
	&GetNickyFile("$vDir/$NickyFname");
	$Message=&message_br($Message);
	&NickyIMODE($opt);
}

#
# iMODEより受信
#
sub RecvIMODE{
if( &ReqJcode() ){
	&jcode'sjis2euc(\$Title);
	&jcode'sjis2euc(\$Message);
	&jcode'sjis2euc(\$passwd);
}

if( &AdminCheck($passwd) ){
	&GetDateLocaltime() if( !$daysub );
	$hour=sprintf("%02d", $hour);
	$min=sprintf("%02d", $min);
	$PutTime=$PutTimeDefault;
	&NickyRight();
}else{
	&NickyIMODE("edit");
}
}

sub DeleteImode{
if( &AdminCheck($passwd) ){
	&NickyDelete("true");
}else{
	&PutHTMLheaderSJIS();
	print "</head><body>Invalid PassWord</body></html>\n";
}
exit;
}

#
# コメントの出力
#
sub jadge_uri{
 my($name, $uri)=@_;
 my $tg="";
 if( $uri =~ /^http:\/\/[0-9a-z]/i ){
	$tg=" target=\"_blank\"" if( $LinkOpen eq "Yes" );
	$name="<a href=\"$uri\"$tg>$name</a>";
 }

$name;
}

sub comment_uri{
 my($name, $uri)=split(/\x02/, $_[0]);
 &jadge_uri($name, $uri);
}

sub PutComment
{
	my($name, $uri, $msg, $time, $ctloop);
	if(($cf_size > 0) || ($CommentName ne "") || ($CommentMsg ne "")){
		print "<tr bgcolor=\"$CommentBgColor\"><td><ul>";
		if( $cf_size ){
			open(RDC, $NickyComment);
			binmode(RDC);
			while(<RDC>){
				local($str2);

				$ctloop=0;
				($name, $msg, $time)=split/\x01/;
				while( $time == "" ){
					($str2, $time)=split(/\x01/, <RDC>);
					$msg.=$str2;
					$ctloop++;
					last if( $ctloop > 50 );
				}
				chop $time;
				if( $name =~ /^\x03/ ){
					if( $Admin && (select eq "main::STDOUT") ){
						($str2, $name)=split(/\x03/, $name);
						$name=&cmnt_dec($name);
						$msg=&cmnt_dec($msg);
					}else{ next; }
				}
				$name=&comment_uri($name);
				$msg=~s/\n/$br/g;
				$msg=&ConvertMsg($msg);
				$msg=&Effect($msg);
				print "<Font Color=\"$CommentNameColor\" SIZE=\"$CommentNameSize\"><LI>$name($time)$br</Font>\n";
				print "<Font Color=\"$CommentFontColor\" SIZE=\"$CommentFontSize\">$msg</Font>\n";
			}
			close(RDC);
		}
		if( ($Mode =~ /CPREVIEW/) && (($CommentName ne "")||($CommentMsg ne "")) ){
			$msg=$CommentMsg;
			$msg=~s/\n/$br/g;
			$msg=&ConvertMsg($msg);
			$msg=&Effect($msg);
			$name=&jadge_uri($CommentName, $CommentURI);
			$time=&MakeCommentTime();
			print "<Font Color=\"$CommentNameColor\" SIZE=\"$CommentNameSize\"><li>$name($time)$br</Font>\n";
			print "<Font Color=\"$CommentFontColor\" SIZE=\"$CommentFontSize\">$msg</Font>\n";
		}
		print "</ul></td></tr>\n";
	}
}
#
# コメントの出力(iMODE)
#
sub PutCommentIMODE
{
	local($name, $msg, $time, $size, $ctloop);

	$size=(stat($NickyComment))[7];
	if( $size > 0 ){
		print "<ul>";
		open(RDC, $NickyComment);
		binmode(RDC);
		while(<RDC>){
			local($str2);
			$ctloop=0;
			($name, $msg, $time)=split/\x01/;
			while( $time == "" ){
				($str2, $time)=split(/\x01/, <RDC>);
				$msg.=$str2;
				$ctloop++;
				last if( $ctloop > 50 );
			}
			chop $time;
			$msg=~s/\n/$br/g;
			if( $name =~ /^\x03/ ){
				if( $Admin && (select eq "main::STDOUT") ){
					($str2, $name)=split(/\x03/, $name);
					$name=&cmnt_dec($name);
					$msg=&cmnt_dec($msg);
				}else{next;}
			}
			$name=&comment_uri($name);
			$str="<li>$name($time)$br";
			&zenkakuhankaku();
			print $str;
			$str=$msg;
			&zenkakuhankaku();
			print $str;
		}
		close(RDC);
		print "</ul>\n";
	}
}
#
# コメントの編集
#
sub EditComment
{
	local($cnt, $ctloop);
	my($name, $uri, $msg);
	my $IT="<input type=";

	&PutHTMLheader();
	&MakeNickyFname();
	print "<title>コメントの編集</title>\n</head><body>\n";
	print "$brコメントの編集$br$br\n";
	print "※コメントを削除したい場合は名前を消します$br$br\n";
	print "<form method=\"POST\" action=\"$cgipath\">\n";
	&InsertDateTag();

	$cnt=0;
	open(RDC, $NickyComment);
	binmode(RDC);
	while(<RDC>){
		local($str2);

		s/\"/&quot;/g;
		$ctloop=0;
		($name, $msg, $time)=split/\x01/;
		while( $time == "" ){
			($str2, $time)=split(/\x01/, <RDC>);
			$msg.=$str2;
			$ctloop++;
			last if( $ctloop > 50 );
		}
		chop $time;
		($name, $uri)=split(/\x02/, $name);
		($CmntSecret, $name)=split(/\x03/, $name);
		if( $name eq "" ){
			$name=$CmntSecret;$CmntSecret="";
		}else{
			$CmntSecret="Yes";
			$name=&cmnt_dec($name);
			$uri=&cmnt_dec($uri);
			$msg=&cmnt_dec($msg);
		}
		print "Name $IT\"TEXT\" name=\"CmntNameZZZ$cnt\" value=\"$name\">　\n";
		print "URI $IT\"TEXT\" name=\"CmntURIZZZ$cnt\" value=\"$uri\">　\n";
		print "Date $IT\"TEXT\" name=\"CmntTimeZZZ$cnt\" value=\"$time\">　\n";
		print "Secret $IT\"hidden\" name=\"CmntSecretZZZ$cnt\" value=\"Yes\">" if( $CmntSecret );
		$msg=~s/&/&amp;/g;
		print "Message <textarea name=\"CmntMsgZZZ$cnt\" rows=\"5\" cols=\"40\">$msg</textarea>　\n";
		print "<hr>\n";
		$cnt++;
	}

	if( $passwd ){
		print "$IT\"hidden\" name=\"passwd\" value=\"$passwd\">\n";
	}
	print "$IT\"submit\" name=\"CMNTWRITE\" value=\"保存\">\n";
	print "</form>\n</body></html>\n";
}
#
# 編集したコメントを書きこむ
#
sub WriteComment{
my($i, $sc);

 &MakeNickyFname();
 open(WDC, ">$NickyComment");
 binmode WDC;
 for($i=0; $i <= $CmntCnt; $i++){
	if( ($CmntName[$i] ne "")&&($CmntMsg[$i] ne "")&&($CmntTime[$i]  ne "")){
		if( $CmntSecret[$i] eq "Yes" ){
			$sc="\x03";
			$CmntName[$i]=&cmnt_enc($CmntName[$i]);
			$CmntURI[$i]=&cmnt_enc($CmntURI[$i]);
			$CmntMsg[$i]=&cmnt_enc($CmntMsg[$i]);
		}else{$sc="";}
		print WDC "$sc$CmntName[$i]\x02$CmntURI[$i]\x01$CmntMsg[$i]\x01$CmntTime[$i]\n";
	}
 }
 close WDC;
 &MakeHTMLone($year, $month, $day, $daysub, 0, 0);
 &MakeNickyLast();
}

#
# $NickyFnameより日付を取得
#
sub GetDateFromFname
{
 my($gomi,$gomi1);
 local($p1, $p2, $fname);

 $p1=rindex($NickyFname, "\/",);
 $p2=rindex($NickyFname, "\/",$p1-1);
 $gomi1=substr($NickyFname, $p2);

 ($gomi, $year, $fname)=split(/\//, $gomi1);
 $month=substr($fname,0,2);
 $day=substr($fname,2,2);
 $daysub=substr($fname,4,1);
 if( substr($fname,5,1) eq "_" ){
	$Category=hex(substr($fname,6,8));
 }else{
	$Category="";
 }
}

#
# 日付受け渡しタグ挿入
#
sub InsertDateTag
{
my($ct);
$ct=sprintf("_%08x", $Category);
print "\n<input type=\"HIDDEN\" name=\"DATE\" value=\"$year$month$day$daysub$hour$min$ct\"$e\n";
}
#
# 本文のエフェクト
#
sub Effect{
 my($data)=@_;
 my($add, $ade, $ret, $c, $me);
 my(@eflist);
 my $sp='<br>';

 $tag2lf=$sp if( !$tag2lf );
 $tag3lf=$sp if( !$tag3lf );
 $c=0;
 while( ($data =~ /$br|$tag2lf|$tag3lf/i) && ($c<1000) ){
	$eflist[$c]="$`$&";
	$c++;
	$data=$';
 }
 $eflist[$c]=$data;

 $ret="";
 for $me (@eflist){
	$add=$ade="";
	if( ($EffectSTR1) && ($me =~ /^$EffectSTR1/) ){
		$add = "<span style=\"color:$EffectCOL1\">";
		$ade="</span>";
	}elsif( ($EffectSTR2) && ($me =~ /^$EffectSTR2/) ){
		$add = "<span style=\"color:$EffectCOL2\">";
		$ade="</span>";
	}elsif( ($EffectSTR3) && ($me =~ /^$EffectSTR3/) ){
		$add = "<span style=\"color:$EffectCOL3\">";
		$ade="</span>";
	}elsif( ($EffectSTR4) && ($me =~ /^$EffectSTR4/) ){
		$add = "<span style=\"color:$EffectCOL4\">";
		$ade="</span>";
	}
	if( ($me =~ /<table|<tr|<td*>$|<\/td>|<\/tr>|<dl|<\/dl>|<\/dt>|<\/dd>|<\/p>|<\/li>|<ol|<\/ol>|<ul|<pre|<\/pre|<\/ul>.*$br$/i) ){
		$me=~s/$br$//;
	}
	$ret.="$add$me$ade";
 }
 $ret=~s/$br$//i;
 $ret;
}

#
#記事確認
#
sub NickyKakunin
{
my($para)=@_;
my($hs)=&put_editstyle();

$HRSTR="<hr size=\"1\" noshade>";
&get_inputarea();
if( $para eq "NORMAL" ){
	&PutHTMLheader();
	print $hs;
}else{
	&nickyGetHead();
	$head=~s/<\/head>/$hs$inputh<\/head>/i;
	print &put_macro($head);
}
$message = $Message;
&MakeDateStr();
$lg=$lg."c";
if( $para eq "NORMAL" ){
	$Message =~ s/\n/$br/g;
	print "<title>確認</title>$inputh</head><body><div style=\"text-align:center;\">よろしければ<strong>『書込』ボタン</strong>をクリックしてください。$HRSTR</div><div style=\"margin-left:100px;\">$br$br\n";
	&PutNickyOneDay();
	print "</div>";
}else{
	if( $tagbr eq "p" ){
		$Message=~s/\r//g;
		$Message=~s/\n\n\n/$tag3lf/g;
		$Message=~s/\n\n/$tag2lf/g;
	}
	$Message=~s/\n/$br/g;
	&PutNickyOneDay();
	&PutCustomComment() if( $UserCmnt eq "Yes" );
	my $fdat=&put_macro($foot);
	$fdat =~ s/<\/body>|<\/html>|<\/xhtml>//ig;
	print $fdat;
}
&PutEditNicky(WRITE);
}
sub message_br{
my($dat)=@_;
$dat=~s/\r//g;
if( $tagbr eq "p" ){
 $dat=~s/$tag3lf/\n\n\n/g;
 $dat=~s/$tag2lf/\n\n/g;
}
$dat=~s/<br>/\n/ig;
$dat=~s/<br \/>/\n/ig;
$dat;
}
#
# 指定された日時の記事を編集する
#
sub NickyEdit
{
my(@fl, $fn);

if( (!$year) && ($nyear) ){
	$year=$nyear;
	$month=$nmonth;
	$day=$nday;
	$Category=$nCategory;
	undef $daysub;
}
$UrlLink="Yes";
$PutTime=$PutTimeDefault;
$FitCheck=$Fit;
if( !$daysub ){
	&PutHTMLheader();
	print "<title>記事編集</title>\n</head>\n";
	$NickySPath=sprintf("$vDir/%04d/%02d%02d*\\.nky", $year, $month, $day);
	@fl=&GetFileList($NickySPath);

	$find=$#fl;
	if( $find > 0 ){
		$ModeSub=1;

		for $fn(@fl){
			$NickyFname="$vDir/$fn";
			&GetNickyFile($NickyFname);
			&PutNickyOneDay();
			print "$br$br";
		}
		print "</body></html>";
		exit;
	}
	$daysub="A";
}

$ModeSub=4;
&MakeNickyFname();
&GetNickyFile($NickyFname);
$Message=&message_br($Message);
&NickyKakunin(NORMAL);
}
#
# 指定された記事を削除する TRUE=unlink(Grp);
#
sub NickyDelete
{
	my($flag)=@_;
	my($oldFname, $o, $n, $p, @fl);
	my($op, $np);
	my($f, $cnt, $fn, $dmy, $ctg);

	&MakeNickyFname();
	&GetNickyFile($NickyFname);				# 画像ファイルネーム取得
	unlink($NickyFname);					# 記事本文削除
	$f="$month$day";

	if( ($GrpFileName) && ($flag) ){
		$n=rindex($GrpFileName, "\.");
		$oldFname=substr($GrpFileName,0,$n);
		@fl=&GetFileList("$NickyDir/$oldFname\\.");
		for $p(@fl){ unlink("$vDir/$p"); }
	}
	unlink($NickyComment);
	$dsub=ord($daysub)-0x41;
	$cnt=0;
	$oldFname=$NickyFname;
	@fl=&GetFileList($NickySPath);
	for $p(@fl){
		$cnt++;
		if( $cnt > $dsub ){
			$NickyFname="$vDir/$p";
			$p=sprintf("$year/$f%c",$cnt+0x40);
			($dmy, $ctg)=split(/_/, $NickyFname);
			if( !$ctg ){
				$fn="$p.nky";
			}else{
				$fn="$p\_$ctg";
			}
			rename($NickyFname, "$vDir/$fn");
			#以下コメントのrename
			$n="$vDir/$p.cmnt";
			$o=sprintf("$vDir/$year/$f%c.cmnt", $cnt+0x41);
			rename($o, $n);
			#コメントのrenameここまで
			$oldFname="$vDir/$p";
		}
	}
	if( $flag ){
		eval('require("./tb.cgi")');
		unless( $@ ){
			eval("del_daytb(\"$year\", \"$month\", \"$day\", $daysub)");
			&goto_exit("[$@]<br>お手数ですが tb.cgi を最新のものに入れ替えてください") if( $@ );
		}
		$p=sprintf("%02d/%02d.*\.nky", $year, $month);
		@fl=&GetFileList("$vDir/$p");
		if( $#fl >= 0 ){
			&MakeHTMLone($year, $month, $day, $daysub, 0, 0);
		}else{
			$fn=&MakeMonthIndexFname($year, $month);
			unlink("$vDir/$fn");
			$fn=&MakeMonthFname($year, $month);
			unlink("$vDir/$fn");
			if( $MsgOldForm !~ /1/ ){
				&MakeMonthHTML();
			}
		}
		&MakeNickyLast();
	}
}
#
# 指定された記事を削除するか確認
#
sub NickyDeleteConfirm{
	&MakeNickyFname();
	&GetNickyFile($NickyFname);
	$ModeSub=2;
	&PutNickyOneDay();
	print "$brこれを削除します。$brよろしければ削除実行ボタンをクリックしてください。</body></html>";
}
#
# 記事ファイル書込み
#
sub WriteNickyFile{
my($r, $p);
$r=rindex($NickyFname, "\/");
$p=substr($NickyFname, 0, $r);
mkdir($p, 0777) if( !-e $p );
undef $fit_size if( $FitCheck ne "ON" );
$a=open(WR, ">$NickyFname");
binmode(WR);
print WR "$Date\x01";
print WR "$Title\x01";
print WR "$Message\x01";
print WR "$GrpFileName\x01";
print WR "$Layout\x01";
print WR "$CommentRecv\x01";
print WR "$fit_size\x01";
print WR "$RepLayout\x01";
print WR "$tbRcv\x01";
close(WR);
}

sub WriteNicky{
$Message=~s/\r//g;
if( $tagbr eq "p" ){
	$Message=~s/\n\n\n/$tag3lf/g;
	$Message=~s/\n\n/$tag2lf/g;
	$Message=~s/\n$/$br/;
}
$Message=~s/\n/$br/ig;
&MakeDateStr();
&MakeNickyFname();

&WriteNickyFile();
}
#
# That's Right!!
#
sub NickyRight{
	&WriteNicky();
	&MakeNickyLast();
}

sub GetFileList
{
my($opt)=@_;
my($i, @pt, $dirname, $fname, $f, $p1, $p2);

$p1=rindex($opt,"\/");
$p2=rindex($opt,"\/", $p1-1);
$opt=substr($opt, $p2);
$i=0;
undef @pt;
if( opendir(RDD, "$vDir/$year/") ){
 for $fname( readdir(RDD) ){
	$f="./$year/$fname";
	$pt[$i++]=$f if( $f =~ /$opt/ );
 }
 closedir(RDD);
}
@pt;
}

sub GetNickyList{
my($opt)=@_;
my($i, $tmp, @pt, $ctry, $hexctg);

if( ($opt eq "r") || ($opt eq "t") || ($opt eq "tr") ){
	$tmp="^[0-1][0-9][0-3][0-9][A-Za-z].*\\.nky\$";
}else{
	$tmp="^[0-1][0-9][0-3][0-9][A-Za-z].*\\.nky\$|^[0-1][0-9][0-3][0-9][A-Za-z]\\.cmnt\$";
}
$i=0;
undef @pt;

if( opendir(RD, "$vDir/") ){
	for $dirname( readdir(RD) ){
		if( $dirname =~ /^[1-9][0-9][0-9][0-9]$/ ){
		  if( opendir(RDD, "$vDir/$dirname") ){
			for $fname( readdir(RDD) ){
				my(@fn, $f);

				if( $fname =~ /$tmp/ ){
					if( $ctg ){
						my($fn, $ctg1)=split(/_/, $fname);
						my($ctgdat, $dummy)=split(/\./, $ctg1);
						next if( !($ctg & hex($ctgdat)) );
					}
					$f="/$dirname/$fname";
					@fn=($f, (stat("$vDir/$dirname/$fname"))[10]);
					$pt[$i]=\@fn;
					$i++;
				}
			}
			closedir(RDD);
		  }
		}
	}
	closedir(RD);
}

return sort{$$b[1] cmp $$a[1]} @pt if( ($opt eq "t") || ($opt eq "tc") );
if( $opt eq "tr" ){
	return reverse(sort{$$b[0] cmp $$a[0]} @pt);
}else{
	return sort{$$b[0] cmp $$a[0]} @pt;
}
}
# 指定された日付の記事が何ページ目にあるのか探す
sub SerchPageFromDate
{
	local($gomi, $fn, $fname, @oldname, $gyear, @oldyear);
	local($cnt, $page, $gfn);
	local($syear, $smonth, $sday, $sdaysub, $i);
	my($ofn, $p1, $p2);

	$syear=$year;$smonth=$month;$sday=$day;$sdaysub=$daysub;
	$Category=$ctg if( $ctg );
	&MakeNickyFname();
	$p1=rindex($NickyFname, "\/");
	$ofn=substr($NickyFname, $p1+1, 5);

	$cnt=0;
	@nli=&GetNickyList($Age) if( !@nli );
	for $gfn(@nli){
		next if( $$gfn[0] !~ /\.nky$/ );
		$NickyFname=$$gfn[0];
		($gomi, $gyear, $fname)=split(/\//, $$gfn[0]);
		($fn, $gomi)=split(/\./, $fname);

		last if( ($year == $gyear) && (substr($fn, 0, 5) eq $ofn) );
		$oldyear[$i]=$gyear;
		$oldname[$i]=$fn;
		$cnt++;
	}

	if( !&IsIMODE() ){
		if( $cnt < $PrintDay ){
			$page=0;
		}else{
			$page=(($cnt+1)-$PrintDay)/$PageCnt;
			$page++ if( $page != int((($cnt+1)-$PrintDay)/$PageCnt) );
		}
		$PageNo=int($page);
		&NickyPageOut($PageNo);
	}else{
		if( $cnt < $PrintiDay ){
			$page=0;
		}else{
			$page=(($cnt+1)-$PrintiDay)/$PageiCnt;
			$page++ if( $page != int((($cnt+1)-$PrintiDay)/$PageiCnt) );
		}
		$PageNo=int($page);
		&NickyPageOutIMODE($PageNo);
	}
}
sub GetIndexList{
my(@pt, $fname);
my $i=0;

if( opendir(RD, "$vDir/") ){
 for $fname( readdir(RD) ){
	if( $fname =~ /^nkyIndex[1-9][0-9][0-9][0-9][0-1][0-9]\.cgi$/ ){
		$pt[$i]=$fname;
		$i++;
	}
 }
 closedir(RD);
}

@pt;
}

sub GetHTMLlist{
my($i, @pt, $fname);

undef @pt;
if( opendir(RD, "$vDir/") ){
 for $fname( readdir(RD) ){
	if( $MsgOldForm !~ /1/ ){
		if( $fname =~ /^$LogFname[1-9][0-9][0-9][0-9][0-1][0-9]\.html$/ ){
			$pt[$i]=$fname;
			$i++;
		}
	}else{
		if( $fname =~ /^$LogFname[0-9][0-9][0-9][0-9][0-9]\.html$/ ){
			$pt[$i]=$fname;
			$i++;
		}
	}
 }
 closedir(RD);
}

@pt;
}

#
# ページ出力モード
#  パラメータで渡されたページを出力
#  $PrintDay=最新表示件数
#  $PageCnt =過去ログ件数指定時に表示する件数
#
sub NickyPageOut
{
 local($gomi, $fn, $fname, @oldname, @oldyear);
 local($cnt, $startno, $find);
 local($pageno, $flaglog, $gfn);
 my(@fl, $hd, $ft, $out_1st, $ctgl, $outcnt, $bky, $bkm);

 &nickyGetHead();
 $pageno=$_[0];
 #出力開始番号算出
 if( $pageno == 0 ){
	$startno=0;
	$hd=$head;
	$ft=$foot;
 }else{
	$startno=$PrintDay+($pageno-1)*$PageCnt;
	if( $Use2ndHD eq "Yes" ){
		$hd=$head2nd;
	}else{
		$hd=$head;
	}
	if( $Use2ndFT eq "Yes" ){
		$ft=$foot2nd;
	}else{
		$ft=$foot;
	}
 }
 $outcnt = $page == 0 ? $PrintDay:$PageCnt;
 $outcnt+=$startno;
 $ModeSub=16;
 $cnt=$flaglog=0;
 unless( @nli ){
	@nli=&GetNickyList($Age)
 }else{
	if( $mkHTML ){
		if( ($Age eq "t") || ($Age eq "tc") ){
			@nli=sort{$$b[1] cmp $$a[1]} @nli;
		}elsif( $Age eq "tr" ){
			@nli=reverse(sort{$$b[0] cmp $$a[0]} @nli);
		}else{
			@nli=sort{$$b[0] cmp $$a[0]} @nli;
		}
	}
 }

 for $gfn(@nli){
	($gomi, $year, $fname)=split(/\//, $$gfn[0]);
	($fn, $gomi)=split(/\./, $fname);
	$flag=0;
	for($i=0; $i<$cnt; $i++){
		if( ($oldyear[$i] eq $year) && ($oldname[$i] eq $fn) ){
			$flag=1;
			last;
		}
	}

	if( $flag == 0 ){
		$oldyear[$i]=$year;
		$oldname[$i]=$fn;
		if( $cnt >= $startno ){
			$NickyFname="$vDir/$year/$fn.nky";
			if( $cnt >= $outcnt ){
				$flaglog=1;
				last;
			}
			&GetNickyFile($NickyFname);
			next if(!$Title && !$Message && (!$Admin || $mkHTML));
			$NickyComment="$vDir/$year/$fn.cmnt";
			if( !$out_1st ){
				$gomi=$year;
				$month=substr($fn, 0, 2);
				$bky=$year;$bkm=$month;
				print &put_macro($hd);
				if( ($MsgOldForm == 2) || ($MsgOldForm == 4) ){
					&PutMonthTag("UP", "");
					print "$br\n";
				}
				$out_1st=1;
				$year=$gomi;
			}
			&PutNickyOneDay();
			print $br;
		}
		$cnt++;
	}
 }
 print &put_macro($hd) if( !$out_1st );
 # $MsgOldForm:0,2=月, 1=件数
 # $MsgOld1st:最新ページにログリストを0する, 1しない, 2全然しない
 $ctgl=$ctg?"\?ctg=$ctg":"";
 if( ($page == 0) && ($MsgOld1st == 2) ){
 }elsif( $MsgOldForm == 1 ){
	print "<div class=\"pastlink\">\n";
	if( !$mkHTML || $SaveHTML ne "ON" ){
		print "<a href=\"$cgipath$ctgl?page=",$pageno-1,"\">$MsgNew</a> " if( $pageno );
		if( ($pageno!=0) || ($MsgOld1st==0) ){
			if( $MsgPageOut ){
				&PutPageTag();
			}else{
				print $MsgOldBetween;
			}
		}
		print "<a href=\"$cgipath$ctgl?page=",$pageno+1,"\">$MsgOld</a>" if( $flaglog ) ;
	}else{
		#page=0だけ考えれば良い。
		my($target, $fnh);
		$cnt=@nli-$PrintDay;
		$target=int($cnt/$PageCnt);
		$target-- if( !($cnt % $PageCnt) );

		$fnh=&MakePageFname($target);
		$gfn=$nli[$PrintDay];
		($gomi, $year, $fname)=split(/\//, $$gfn[0]);
		$fn=substr($fname, 0,5);
		print $MsgOldBetween if( !$MsgOld1st && !$MsgPageOut);
		print "<a href=\"$www/$fnh#$year$fn\">$MsgOld</a>" if( $flaglog ) ;
	}
	print "\n</div>\n";
	print "$br$br<a href=\"$cgipath$ctgl?TitleList\">一覧</a> / <a href=\"$cgipath?SetSearch\">検索</a>　　" if( $PutSerchTagFlag );
 }else{
	local($fn, $str, $cyear, $cmon, $mh);
	undef $str;

	if( ($Age eq "t") || ($Age eq "tc") ){
		$gomi=$fl[0];
		$fn=$$gomi[0];
		$cyear=substr($fn, 2, 4);
		$cmon=substr($fn, 7, 2);
		if( !$mkHTML || ($SaveHTML ne "ON") ){
			$str=sprintf("$cgipath?DATE=%04d%02d$ctgl?MODE=MONTH", $cyear, $cmon);
		}else{
			$mh=&MakeMonthFname($cyear, $cmon);
			$str="$www/$mh";
		}
	}elsif( $Age eq "r" ){
		if( $NickyFname ){
			&GetDateFromFname();
			if( !$mkHTML || ($SaveHTML ne "ON") ){
				$str=sprintf("$cgipath?DATE=%04d%02d$ctgl?MODE=MONTH#%04d%02d%02d%s", $year, $month, $year, $month, $day, $daysub);
			}else{
				$mh=&MakeMonthFname($year, $month);
				$str=sprintf("$www/$mh#%04d%02d%02d%s",$year,$month,$day,$daysub);
			}
		}
	}

	if( $MsgOld1st == 0 ){
		&PutMonthTag("DOWN", $str) if(($MsgOldForm == 0) || ($MsgOldForm == 4));
	}elsif( $str ){
		print "<div class=\"pastlink\">\n<a href=\"$str\">$MsgOld</a>\n</div>\n";
	}
 }
 $year=$bky;$month=$bkm;
 print &put_macro($ft);
}
#
# ページ出力モード(iMODE版)
#  パラメータで渡されたページを出力
#
sub NickyPageOutIMODE
{
	local($pageno)=@_;
	local($gomi, $fn, $fname, @oldname, @oldyear);
	local($cnt, $startno, $find, $gfn);
	local($flaglog, $sts);
	my($pgout, $outcnt);

	$PrintDay=$PrintiDay;	#最初のページに表示する記事数
	$PageCnt=$PageiCnt;		#最初以外のページに表示する記事数

	#出力開始番号算出
	if( $pageno == 0 ){
		$startno=0;
	}else{
		$startno=$PrintDay+($pageno-1)*$PageCnt;
	}
	$outcnt = $page == 0 ? $PrintDay:$PageCnt;
	$outcnt+=$startno;
	$ModeSub=16;

	#ヘッダを出力
	&nickyGetHead();
	$sts=&ReqJcode();
	&jcode'euc2sjis(\$iHead) if( $sts );
	print $iHead;

	print "<hr>";
	$cnt=$flaglog=0;
	for $gfn(&GetNickyList($Age)){
		($gomi, $year, $fname)=split(/\//, $$gfn[0]);
		($fn, $gomi)=split(/\./, $fname);
		$flag=0;
		for($i=0; $i<$cnt; $i++){
			if( ($oldyear[$i] eq $year) && ($oldname[$i] eq $fn) ){
				$flag=1;
				last;
			}
		}

		if( $flag == 0 ){
			$oldyear[$i]=$year;
			$oldname[$i]=$fn;
			if( $cnt >= $startno ){
				if( $cnt >= $outcnt ){
					$flaglog=1;
					last;
				}
				$NickyFname="$vDir/$year/$fn.nky";
				&GetNickyFile($NickyFname);
				($fn, $gomi)=split(/_/, $fn);
				$NickyComment="$vDir/$year/$fn.cmnt";
				&PutNickyOneDayIMODE();
			}
			$cnt++;
		}
	}
	# $MsgOldForm:0=月, 1=件数
	# $MsgOld1st:最新ページにログリストを0する, 1しない
	if( $pageno ){
		$pgout=$MsgNew;
		&jcode'euc2sjis(\$pgout);
		print "<a href=\"$cgipath?page=",$pageno-1,"\">$pgout</a> ";
	}
	if( $flaglog ){
		$pgout=$MsgOld;
		&jcode'euc2sjis(\$pgout);
		print "<a href=\"$cgipath?page=",$pageno+1,"\">$pgout</a>";
	}
	close(RDD);

	&jcode'euc2sjis(\$iFoot) if( $sts );
	print $iFoot;
}
#
# 月出力モード
#  $year, $monthで指定された月を出力
#
sub NickyMonthOut
{
	my($sp, $gomi, $fn, $fname);
	my($tuki, $nen, @list);
	my($dmy, $ctgd, $ctgh);

	$nen=$year;
	$tuki=$month;
	$ModeSub=16;

	#ヘッダを出力
	&nickyGetHead();
	if( $Use2ndHD eq "Yes" ){
		print &put_macro($head2nd);
	}else{
		print &put_macro($head);
	}

	if( ($MsgOldForm == 2) || ($MsgOldForm == 4) ){
		&PutMonthTag("UP", "");
		print "$br\n";
	}

	$i=0;
	$year=$nen;
	$sp=sprintf("^./%04d/%02d...*\\.nky\$", $nen, $tuki);
	@list=&GetFileList($sp);
	@list=sort @list;
	@list=reverse(@list) if( $MonthSort eq "UP" );

	print "\n<a name=\"nicky_top\"></a>\n";
	for $fn(@list){
		if( $ctg ){
			($dmy, $ctgd)=split(/_/, $fn);
			next unless( $ctgd );
			$ctgh=hex(substr($ctgd, 0, 8));
			next unless( $ctg & $ctgh );
		}
		$NickyFname="$vDir/$fn";
		&GetNickyFile($NickyFname);
		next if( !$Title && !$Message && (!$Admin || $mkHTML) );
		if( $saveExec || $Admin && $mkHTML ){
			&GetDateFromFname();
			print WDI "$day\x01$daysub\x01$Title\x01$GrpFileName\n";
		}
		$NickyComment="$vDir/$year/$fn.cmnt";
		&PutNickyOneDay();
		print "$br";
	}
	print "\n<a name=\"nicky_bottom\"></a>\n";

	&PutMonthTag("DOWN", "") if( ($MsgOldForm == 0) || ($MsgOldForm == 4) );
	$year=$nen;
	if( $Use2ndFT eq "Yes" ){
		print &put_macro($foot2nd);
	}else{
		print &put_macro($foot);
	}
}
sub MakeIndex{
	my($y, $m)=@_;
	local($aaa,@list, $fname, $fn);
	$year=$y;
	$aaa=sprintf("^./%04d/%02d...*\\.nky\$", $year,$m);
	@list=&GetFileList($aaa);
	@list=sort @list;
	@list=reverse(@list) if( $MonthSort eq "UP" );

	$fn=&MakeMonthIndexFname($y, $m);
	open(WDI, ">$vDir/$fn");

	for $fname(@list){
		$NickyFname="$vDir/$fname";
		&GetNickyFile($NickyFname);

		next if( !$Title && !$Message );
		if( $Admin && $mkHTML ){
			&GetDateFromFname();
			print WDI "$day\x01$daysub\x01$Title\x01$GrpFileName\n";
		}
	}
	close(WDI);
}
#Kano3
sub MakeMonthFname{
my($y, $m)=@_;
my($str);
$str=sprintf("$LogFname%04d%02d.html", $y, $m);
$str;
}
sub MakeMonthIndexFname{
my($y, $m)=@_;
my($str);
$str=sprintf("nkyIndex%04d%02d.cgi", $y, $m);
$str;
}

sub SaveMonthHTMLone{
my($y, $m)=@_;
my($fn, $bky, $bkm);
$bky=$year;$bkm=$month;
$year=$y;$month=$m; #minili
$saveExec=1;
$fn=&MakeMonthIndexFname($y, $m);
open(WDI, ">$vDir/$fn");
$fnHTML=&MakeMonthFname($y, $m);
open(WD, ">$vDir/$fnHTML");
binmode WD;
select WD;
&NickyMonthOut();
close(WD);
close(WDI);
select STDOUT;
$year=$bky;$month=$bkm;
$saveExec=0;
}

sub MakeDummyIndex{
my($para)=@_;
my($gfn, $fn);
local(@mnl);

	if( @nli ){
		@mnl=@nli;
	}else{
		@mnl = &GetNickyList("tr") if( !@mnl );
	}
	$omon=$oyear=0;
	for $gfn( @mnl ){
		($gomi, $year, $fname)=split(/\//, $$gfn[0]);

		$mon=substr($fname, 0, 2);
		if( ($oyear != $year) || ($omon != $mon) ){
			if( $oyear != $year ){
				$oyear=$year;
				$omon=0;
			}
			if( $para ){
				&MakeIndex($year, $mon);
			}else{
				$fn=&MakeMonthIndexFname($year, $mon);
				open(WDI, ">$vDir/$fn");
				close(WDI);
			}
			$omon=$mon;
		}
	}
}

#$flag = 0: 該当記事のみ変更
#      = 1: 全記事対象
#$flag2 = 0: 通常             $flag2は未使用としても可
#     2 = 1: 記事投稿／編集時
sub MakeHTMLone{
	local($y, $m, $d, $ds, $flag, $flag2)=@_;

	return if( $SaveHTML ne "ON" );
	($year, $month, $day, $daysub)=($y, $m, $d, $ds) unless( $year );
	$mkHTML=1;
	if( $MsgOldForm !~ /1/ ){
		my($fnidx, $fnl, $bkmode);
		$bkmode=$Mode;
		$fnidx=&MakeMonthIndexFname($y, $m);
		if( !(stat("$vDir/$fnidx"))[7] ){
			&MakeMonthHTML();
		}else{
			&SaveMonthHTMLone($y, $m);
		}
		$Mode=$bkmode;
	}else{
		local($p, $p1, $y2, $m2, $d2, $ds2, $nday, $nday2, $i, $j, $pnum);
		@nli=&GetNickyList("tr") if( !@nli );
		unless( $flag ){
			$p="/$year/$month$day$daysub.nky";
			$j=0;
			for $p1(@nli){
				last if( $$p1[0] eq $p );
				$j++;
			}
			$pnum=int($j/$PageCnt);
			&MakeOnePageHTML($pnum, 0);
			&MakeOnePageHTML($pnum-1, 0) if( $pnum && $flag2 );
		}else{
			$i=$#nli;
			$p1=$nli[$i];
			$p=rindex($$p1[0], "\/");
			$m2=substr($$p1[0], $p+1,2);
			$d2=substr($$p1[0], $p+3,2);
			$ds2=substr($$p1[0], $p+5,1);
			$y2=substr($$p1[0], $p-4, 4);
			$nday=$y*100000+$m*1000+$d*10+ord($ds)-0x41;
			$nday2=$y2*100000+$m2*1000+$d2*10+ord($ds2)-0x41;

			if( $nday >= $nday2 ){
				$pnum=int($i/$PageCnt);
				if( !($i % $PageCnt) && $i ){
					$pnum-=1;
					&MakeOnePageHTML($pnum, 1);
					$pnum++;
				}
				&MakeOnePageHTML($pnum, 1);
			}else{
				&MakePageHTML();
			}
		}
	}
	$mkHTML=0;
}

sub MakePageFname{
my($pageno)=@_;

sprintf("$vDir/$LogFname%05d.html", $pageno);
}
#
# ページ出力モード
#  パラメータで渡されたページを出力
#  $PrintDay=最新表示件数
#  $PageCnt =過去ログ件数指定時に表示する件数
#
sub MakeOnePageHTML
{
	my($spage, $para)=@_;
	local($gomi, $fn, $fname, @oldname, $cnt);
	local($flaglog, $gfn, $hfname);
	my($hd, $ft, $i, $newfname, $oldfname, $out_1st, $bkpage);

	$bkpage=$pageno;
	$pageno=$spage;
	$saveExec=1;
	$hfname=&MakePageFname($pageno);
	open(WD, ">$vDir/$hfname");
	binmode WD;
	select WD;

	&nickyGetHead();
	if( $Use2ndHD eq "Yes" ){
		$hd=$head2nd;
	}else{
		$hd=$head;
	}
	if( $Use2ndFT eq "Yes" ){
		$ft=$foot2nd;
	}else{
		$ft=$foot;
	}
	$ModeSub=16;


	$flaglog=0;
	$cnt=($pageno+1)*$PageCnt-1;
	for($i=$cnt; $i>$cnt-$PageCnt; $i--){
		$gfn=$nli[$i];
		($gomi, $year, $fname)=split(/\//, $$gfn[0]);
		($fn, $gomi)=split(/\./, $fname);
		unless( $fn ){$flaglog=1;next;}

		$NickyFname="$vDir/$year/$fn.nky";
		&GetNickyFile($NickyFname);
		$NickyComment="$vDir/$year/$fn.cmnt";
		next if( !$Title && !$Message );

		&GetDateFromFname();
		if( !$out_1st ){
			$out_1st=1;
			print &put_macro($hd);
			print "\n<a name=\"nicky_top\"></a>\n";
		}
		&PutNickyOneDay();

		if( $para ){
//			&MakeIndex($year, $month);
			$para=0;
		}
		print "$br";
	}

	if( !$out_1st ){
		print &put_macro($hd);
		print "\n<a name=\"nicky_top\"></a>\n";
	}
	print "\n<a name=\"nicky_bottom\"></a>\n";
	$flaglog=1 if( $pageno == int($#nli/$PageCnt) );
	$newfname=&MakePageFname($pageno+1);
	$oldfname=&MakePageFname($pageno-1);
	print "<div class=\"pastlink\">\n";
	print "<a href=\"$www/$newfname\">$MsgNew</A> " if( !$flaglog );
	print $MsgOldBetween;
	print "<a href=\"$www/$oldfname\">$MsgOld</A>" if( $pageno );
	print "$br$br<a href=\"$cgipath?TitleList\">一覧</a> / <a href=\"$cgipath?SetSearch\">検索</A>　　" if( $PutSerchTagFlag );
	print "\n</div>\n";
	print &put_macro($ft);
	close(WD);
	select STDOUT;
	$pageno=$bkpage;
	$saveExec=0;
}

sub MakePageHTML
{
	my($i, $j, $str, $cnt, $cntl, $lastpage, $oy, $om);
	local($pageno);

	$mkHTML=1;
	#全件数カウント
	@nli=&GetNickyList("tr") if( !@nli );
	$i=$#nli;
	&MakeDummyIndex(1);
	#古いページから作る.最古=2
	$pageno=0;
	$om=$oy=-1;
	for($j=0;$j<$i;$j+=$PageCnt){
		&MakeOnePageHTML($pageno, 0);
		$pageno++;
	}
}

sub rmIndex
{
my($i, @pt, $fname, $f);

$i=0;
if( opendir(RDD, "$vDir") ){
 for $fname( readdir(RDD) ){
	$pt[$i++]=$fname if( $fname =~ /nkyIndex/ );
 }
 closedir(RDD);
}
unlink @pt;
}

sub MakeMonthHTML{
my($gfn, $fn);
local(@mnl, $fnHTML, $bakmode);

	&rmIndex();
	$mkHTML=1;
	$bakmode=$Mode;
	$Mode="MONTH";
	&MakeDummyIndex(0);
	@mnl = &GetNickyList("tr") if( !@mnl );
	$omon=$oyear=0;
	for $gfn( @mnl ){
		($gomi, $year, $fname)=split(/\//, $$gfn[0]);

		$mon=substr($fname, 0, 2);

		if( ($oyear != $year) || ($omon != $mon) ){
			if( $oyear != $year ){
				$oyear=$year;
				$omon=0;
			}
			$month=$mon;
			&SaveMonthHTMLone($year, $month);
			$omon=$mon;
		}
	}
	$Mode=$bakmode;
}

sub PutMonthTag_sub{
my($oyear, $omon, $mon, $dat, $ycnt)=@_;
my($fn,$fe, $ctgt);
$fe=($tagpl ne "strict")?"</font>":"";

if( $oyear != $year ){
	$ycnt++;
	if( $oyear ){ $dat.="$fe</td></tr>\n<tr>"; }
	if( $tagpl eq "strict" ){
		$dat="$dat<td class=\"pasty\">$year$MsgOldYear</td><td class=\"pastm\">";
	}else{
		$dat="$dat<td bgcolor=\"$MsgOldYBgCol\"><font color=\"$MsgOldYFnCol\" size=$MsgOldSize>$year$MsgOldYear$fe</td><td bgcolor=\"$MsgOldMBgCol\"><font size=$MsgOldSize>";
	}
}
if( ($SaveHTML eq "ON") && $mkHTML && !$ctg){
	$fn=&MakeMonthFname($year, $mon);
	$dat="$dat<a href=\"$fn\">$mon$MsgOldMonth</a>　";
}else{
	$ctgl=$ctg?"\?ctg=$ctg":"";
	$dat.="<a href=\"$cgipath$ctgl\?DATE=$year$mon\?MODE=MONTH\">$mon$MsgOldMonth</a>　";
}

($dat, $ycnt);
}
#過去ログとして月単位のリンクタグを出力
# para="DOWN":下
sub PutMonthTag
{
my($para, $lnk)=@_;
my($gfn, $dat, $ycnt);
local($dummy, $dummy2, $fe, $fname, $oyear, $omon, $mon, @mnl, @idxl);

$oyear=$omon=0;

if( ($SaveHTML eq "ON" ) && !$ctg ){
	@idxl=&GetIndexList();
	for $gfn( sort @idxl ){ #nkyIndex200402.cgi
		$year=substr($gfn, 8, 4);
		$mon=substr($gfn, 12,2);
		if( ($oyear != $year) || ($omon != $mon) ){
			($dat, $ycnt)=&PutMonthTag_sub($oyear, $omon, $mon, $dat, $ycnt);
			if( $oyear != $year ){
				$ycnt++;
				$oyear=$year;
				$omon=0;
			}
			$omon=$mon;
		}
	}
}else{
	@mnl = &GetNickyList("tr") if( !@mnl );
	for $gfn( @mnl ){
		($dummy, $year, $fname)=split(/\//, $$gfn[0]);

		$mon=substr($fname, 0, 2);
		if( ($oyear != $year) || ($omon != $mon) ){
			($dat, $ycnt)=&PutMonthTag_sub($oyear, $omon, $mon, $dat, $ycnt);
			if( $oyear != $year ){
				$ycnt++;
				$oyear=$year;
				$omon=0;
			}
			$omon=$mon;
		}
	}
}
if( $tagpl eq "strict" ){
	$dummy="class=\"mtable\"";
	$dummy2="class=\"pastmsg\"";
	$fe="";
}else{
	$dummy="border=\"0\" bgcolor=\"$MsgOldOBgCol\"";
	$dummy2=" bgcolor=\"$MsgOldOBgCol\"";
	$fe="</font>";
}
print "<table $dummy cellpadding=\"$MsgOldcelp\" cellspacing=\"$MsgOldcels\" summary=\"Log\"><tr><td $dummy2";
print " rowspan=\"$ycnt\"" if( $ycnt != 1 );
if( $lnk ){
	print ">\n<a href=\"$lnk\" style=\"TEXT-DECORATION: none;color:$MsgOldCol;";
	if( $tagpl eq "srict" ){
		print "font-size:$MsgOldSize;\"";
	}
	print "\"";
}
print ">$MsgOldLog";
print "</a>" if( $lnk );
print "</td>\n$dat";
print "$fe</td></tr>\n</table>";
print "$br<a href=\"$cgipath?TitleList\">一覧</a> / <a href=\"$cgipath?SetSearch\">検索</a>" if( $PutSerchTagFlag && ($para eq "DOWN"));
}
# ページ指定タグの出力
sub PutPageTag
{
	local($i, $j, $cnt, $cntl, $lastpage, $fs, $fe);
	my($ctgl);

	$ctgl="\?ctg=$ctg" if( $ctg );
	$fs=$fe="";
	if( $tagpl ne "strict" ){
		$fs="<font size=$MsgOldSize>";
		$fe="</font>";
	}
	#全件数カウント
	@nli=&GetNickyList("r") if( !@nli );
	$i=$#nli+1;
	#件数分リンクする
	print $fs;
	if( ($i > $PrintDay) && ($PageNo) ){
		print "$MsgOldNEWks<a href=\"$cgipath$ctgl?page=0\">$MsgOldNEW</a>$MsgOldNEWke";
	}
	$j=$i-$PrintDay;
	$lastpage=$j/$PageCnt;
	if( $j%$PageCnt ){
		$lastpage=($j-($j%$PageCnt))/$PageCnt;
		$lastpage++;
	}
	$lastpage=0 if( $lastpage < 0 );
	$maxpage=10;
	$cnt=$PageNo-($maxpage/2);
	$cntl=0;
	if( $cnt + $maxpage > $lastpage ){ $cnt=$lastpage-$maxpage; }
	if( $cnt < 1 ){ $cnt = 1; }
	for($j=$PrintDay+$cnt*$PageCnt; ($j<$i+$PageCnt) && ($cntl<$maxpage) ; $j+=$PageCnt){
		if( $cnt != $PageNo ){
			print "$ks<a href=\"$cgipath$ctgl?page=$cnt\">$cnt</a>$ke";
		}else{
			print "$ks$cnt$ke";
		}
		$cnt++;
		$cntl++;
	}

	print "$MsgOldOLDks<a href=\"$cgipath$ctgl?page=$lastpage\">$MsgOldOLD</a>$MsgOldOLDke" if($lastpage!=$PageNo);
	print "$fe\n";
}
sub write_exec{
 my($f);
 if( open(RDABC, "./exelist.cgi") ){
	binmode RDABC;
	while(<RDABC>){
		$f=$_;
		$f=~s/ |\r|\n//g;
		eval(require($f));
		&goto_end($@) if( $@ );
	}
	close RDABC;
 }

}
#
# 最新×日分の記事を作成
#
sub MakeLastHTMLsub{
$mkHTML=1;
open(WR, ">$vDir/$NickyHtml");
binmode(WR);
select WR;
&NickyPageOut(0, $PrintDay);
close(WR);
select STDOUT;
&write_exec();
$mkHTML=0;
}

sub MakeNickyLast{
	my($cn, $ccn, $cu, $bky, $bkm, $bkd, $bks);

	$MNLflag=1;
	($cn, $ccn, $cu)=($CommentName,$CommentCName,$CommentURI);
	$CommentName=$CommentCName=$CommentURI="";
	($bky, $bkm, $bkd, $bks)=($year,$month,$day,$daysub);
	&MakeLastHTMLsub();
	($CommentName,$CommentCName,$CommentURI)=($cn,$ccn,$cu);
	if( &IsIMODE() ){
		&NickyPageOutIMODE(0, $PrintDay);
	}else{
		if(($Mode eq "CINPUT") || ($Mode eq "CINPUTS")){
			($year, $month, $day, $daysub)=($m_yer, $m_month, $m_day, $m_daysub);
			if( $MsgOldForm == 1 ) {
				&SerchPageFromDate();
			}else{
				&NickyMonthOut();
			}
		}else{
			($year,$month,$day,$daysub)=($w_year,$w_month,$w_day,$w_daysub);
			if( !$flag_new_hit && ($Mode eq "WRITE") ){
				if( $MsgOldForm == 1 ) {
					&SerchPageFromDate();
				}else{
					&NickyMonthOut();
				}
			}else{
				if( $Admin ){
					&NickyPageOut(0, $PrintDay);
				}else{
					print &PutFile("$vDir/$NickyHtml");
				}
			}
		}
	}
	$MNLflag=0;
}
sub MakeLastHTMLcheck{
	my($data, $hd, $ft);

	if( !$flag_type ){
		$flag_type=1;
		print "Content-type: text/html\n\n";
	}

	&MakeNickyFname();
	if( !-e "$NickyFname" ){
		print "file not found [$NickyFname]\n";
		exit;
	}
	exit unless( open(RD, "$vDir/$NickyHtml") );
	binmode(RD);
	while(<RD>){ $data.=$_; }
	close RD;

	($hd, $ft)=split(/$year$month$day$daysub\"/, $data);
	if( $ft ){
		print "exist";
		exit;
	}

	if( $SaveHTML eq "ON" ){
		&MakeHTMLone($year, $month, $day, $daysub, 0, 0);
	}
	&MakeLastHTMLsub();
	exit;
}
#
# 最新×日分の記事をHTMLに出力
#
sub MakeLastHTML{
	my($flg);

	$flg=0;
	&mobile_load();
	if( $BBSmode eq "BBS" ){
		$flg=1;
	}elsif( &AdminCheck($password) ){
		$flg=1;
	}
	if( $flg ){
		if( $daysub ){
			&MakeLastHTMLcheck();
		}else{
			&MakeLastHTMLsub();
		}
	}
	exit;
}
#
# 戻る
#
sub NickyReturn{
	print "<table border=\"0\" width=\"$NickyWidth\">\n<tr><td><hr>";
	print "【<A HREF=\"$www/$NickyHtml\">戻る</A>】";
	print "</td></tr></table>\n";
}
#
# 検索キーワード設定
#
sub NickySetSearch{
	&nickyGetHead();
	if( $UseSearchHD eq "Yes" ){
		print &put_macro($head2nd);
	}else{
		print &put_macro($head);
	}

	print "<form method=\"POST\" action=\"$cgipath\">";
	print "　　検索キーワード　<input type=\"text\" name=\"SerchWord\">";
	print "　<input type=\"submit\" name=\"MODE\" value=\"検索\">";
	print "</form>\n";
	&NickyReturn();

	if( $UseSearchFT eq "Yes" ){
		print &put_macro($foot2nd);
	}else{
		print &put_macro($foot);
	}
}

#
# 検索
#
sub NickySerch{
	local($aaa, $gomi, $fn, $fname, $gfn);
	local($cnt, $find, $startno);
	local($pageno, $flaglog);

	$ModeSub=16;
	$Mode=MONTH;
	#ヘッダを出力
	&nickyGetHead();
	if( $UseSearchHD eq "Yes" ){
		print &put_macro($head2nd);
	}else{
		print &put_macro($head);
	}
	print "$br検索キーワード『$SerchWord』$br\n";

	$SerchWord=~s/\"/\\\"/g;
	$SerchWord=~s/\'/\\\'/g;
	$SerchWord=~s/\`/\\\`/g;
	$SerchWord=~s/ /\.\*/g;
	$SerchWord=~s/　/\.\*/g;
	$SerchWord=~s/\\/\\\\/g;
	$SerchWord=~s/\|/\\\|/g;
	$SerchWord=~s/\?/\\\?/g;
	$SerchWord=~s/\//\\\//g;
	$SerchWord=~s/\-/\\\-/g;
	$SerchWord=~s/\*/\\\*/g;
	$SerchWord=~s/\=/\\\=/g;
	$SerchWord=~s/\&/\\\&/g;
	$SerchWord=~s/\,/\\\,/g;
	$SerchWord=~s/\(/\\\(/g;
	$SerchWord=~s/\)/\\\)/g;
	@nli=&GetNickyList("tr") if( !@nli );
	for $gfn(@nli){
		$NickyFname="$vDir/$$gfn[0]";
		&GetDateFromFname();
		&GetNickyFile($NickyFname);

		next if( !$Title && !$Message );
		$msg=$SerchWord;
		next if( ($Message !~ /$SerchWord/) && ($Title !~ /$SerchWord/) );
		&PutNickyOneDay();
		print "$br";
	}

	&NickyReturn();
	if( $UseSearchFT eq "Yes" ){
		print &put_macro($foot2nd);
	}else{
		print &put_macro($foot);
	}
}

#日付から曜日を取得
sub GetWeek{
 local($y,$m,$d)=@_;
 my($dday);
 local(@monday)=('0','0','31','59','90','120','151','181','212','243','273','304','334','365');

 $y--;
 $dday=$y*365;
 $dday+=int($y/4);
 $dday-=int($y/100);
 $dday+=int($y/400);

 $y++;
 $dday += $monday[$m];
 if( ((($y % 4 == 0) && ($y % 100 != 0)) || ($y % 400 == 0)) && ($m>2) ){
	$dday++;
 }

 $dday+=$d;
 $dday%7;
}

sub GetJpegWHSub{
local($c1,$c2,$s,$le, $dummy);
local($a,$b,$c,$d);
my($ch)=0;

if( read(RD, $c1, 1) && read(RD, $c2, 1) && (ord($c1) == 0xFF) && (ord($c2) == 0xD8) ){
	while( ord($ch) != 0xDA ){
		while(ord($ch) != 0xFF) { return(0,0) unless read(RD, $ch, 1); }
		while(ord($ch) == 0xFF) { return(0,0) unless read(RD, $ch, 1); }
		if ((ord($ch) >= 0xC0) && (ord($ch) <= 0xC3)){
			return(0,0) unless read (RD, $dummy, 3);
			return(0,0) unless read(RD, $s, 4);
			($a,$b,$c,$d)=unpack("C"x4,$s);
			return ($c<<8|$d, $a<<8|$b );
		}else{
			return(0,0) unless read (RD, $s, 2);
			($c1, $c2) = unpack("C"x2,$s);
			$le = $c1<<8|$c2;
			last if (!defined($le) || $le < 2);
			read(RD, $dummy, $le-2);
		}
	}
}
return (0,0);
}

sub GetJpegWH{
 local($x, $y);
 if(open(RD, $_[0])){
	binmode(RD);
	($x, $y)=GetJpegWHSub();
	close(RD);
 }
 return($x, $y);
}

sub GetGiffWH{
 local($type,$a,$b,$c,$d,$s);

 if(open(RD, $_[0])){
	binmode(RD);
	if(read(RD, $type, 6) && $type =~ /GIF8[7,9]a/ && read(RD, $s, 4) == 4){
		($a,$b,$c,$d)=unpack("C"x4,$s);
		close(RD);
		return ($b<<8|$a,$d<<8|$c);
	}
	close(RD);
 }
 return (0,0);
}

#
# 縦幅と横幅を$image_heightと$image_widthに格納
#
sub GetImageSize
{
 local($fname)=@_;
 if( $fname =~ /\.png$/i ){
	if( open(RD, $fname) ){
		local($w, $fn, $k, $w1, $w2, $w3, $w4);
		local($h, $h1, $h2, $h3, $h4, $str);
		binmode(RD);
		read(RD,$str,0x18);
		close(RD);
		($k,$w1,$w2,$w3,$w4, $h1,$h2,$h3,$h4)=unpack("H32 C8",$str);
		$w=$w1*0x1000000+$w2*0x10000+$w3*0x100+$w4;
		$h=$h1*0x1000000+$h2*0x10000+$h3*0x100+$h4;
		($w, $h);
	}
 }elsif( $fname =~ /\.jpeg$|\.jpg$/i ){
	&GetJpegWH($fname);
 }elsif( $fname =~ /\.giff$|\.gif$/i ){
	&GetGiffWH($fname);
 }
}
sub GetImageSizePch
{
 if( $Pch_File ){
  if( $Pch_File =~ /\.pch$|\.spch$/ ){
	$fn=$Pch_File;
	$fn=~s/\.pch$|\.spch$/\.png/;
	if( (stat($fn))[7] > 0 ){
		($image_width, $image_height)=&GetImageSize($fn);
	}else{
		$fn=$Pch_File;
		$fn=~s/\.pch$|\.spch$/\.jpg/;
		if( (stat($fn))[7] > 0 ){
			($image_width, $image_height)=&GetJpegWH($fn);
		}else{
		 $fn=$Pch_File;
		 $fn=~s/\.pch$|\.spch$/\.jpeg/;
		 if( (stat($fn))[7] > 0 ){
			($image_width, $image_height)=&GetJpegWH($fn);
		 }else{
			$fn=$Pch_File;
			$fn=~s/\.pch$|\.spch$/\.gif/;
			($image_width,$image_height)=&GetGiffWH($fn) if((stat($fn))[7] > 0);
		 }
		}
  	}
  }elsif( $Pch_File =~ /\.jpeg$|\.jpg$/i ){
	($image_width, $image_height)=&GetJpegWH($Pch_File);
  }elsif( $Pch_File =~ /\.giff$|\.gif$/i ){
	($image_width, $image_height)=&GetGiffWH($Pch_File);
  }elsif( $Pch_File =~ /\.png$/i ){
	($image_width, $image_height)=&GetImageSize($Pch_File);
  }
 }
}
#
# HTMLヘッダ出力
#
sub PutHTMLheaderSJIS{
print "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-type\" content=\"text/html; charset=Shift_JIS\">\n";
}
sub IsPCH(){
my($ret);
if( ($Pch_File) && ($Pch_File !~ /\.pch$|\.spch$/) ){
	if( $Mode eq "ContinuePaintBBS" ){
		$ret=1;
	}else{
		$ret=2;
	}
}else{
my($dmy, $dm1, $dm2, @prm);
undef $layer_count;
@prm=('layer_count', 'layer_max', 'layer_last', 'count_lines', 'quality', 'end_param');
if( open(RD, $Pch_File) ){
	$dmy="1";
	while( $dmy ){
		$dmy=<RD>;
		$dmy=~s/\r|\n//g;
		($dm1,$dm2) = split(/=/,$dmy);
		for $parm(@prm){
			if( $parm eq $dm1 ){
				${$dm1}=$dm2;
			}
		}
	}
	close(RD);
}
$ret=2 if( $layer_count );
}
$ret;
}
sub CallApplet(){
my($PaintBBS,$spainter,$jud);
my($PBBStag, $SPTRtag, $Ctag, $Qtag, $Pstr, $Qstr, $Prostr, $Atag);

$Pch_File="$vDir/$Pch_File" if( $Pch_File );
&IsApplet();

$jud=&IsPCH();
$Ctag="<input type=\"submit\" class=\"nebtn\" name=\"Mode\" value=\"Continue\">";
$Pstr="<input type=\"submit\" class=\"nebtn\" name=\"Mode\" value=\"ContinuePaintBBS\">";
$Prostr="$Ctag　<input type=\"submit\" class =\"nebtn\" name=\"Mode\" value=\"ContinuePro\">";
$Qstr="Quality <input type=\"text\" class=\"button3\" name=\"Quality\" value=\"$quality\" size=\"3\">";
if( ($Pch_File !~ /\.pch$|\.spch$/) && ($PBsize) ){
 if( ($jud != 2) || (!$spsize) ){
	$PBBStag=$Pstr;
  }else{
	$Qtag=$Qstr;
	$PBBStag=$Pstr;
	$SPTRtag=$Prostr;
  }
}elsif( ($jud != 2) && ($PBsize) ){
 $PBBStag=$Ctag;
}elsif( ($jud == 2) && ($spsize) ){
 $SPTRtag=$Prostr;
 $Qtag=$Qstr;
}

&PutHTMLheader();
print <<ca_eof;
</head><body>
<form Method="POST" ACTION="$cgipath">
圧縮率 <input type="text" class="button3" name="CompressL" value="$CompressL" size="3">
$Qtag
<input type="hidden" name="Pch_File" value="$Pch_File">
<input type="hidden" name="DATE" value="$DT">
<input type="hidden" name="Category" value="$ctgry">
$br
$PBBStag
$SPTRtag
<input type="checkbox" name="AnimeSave" value="True" checked>
</form>
</body></html>
ca_eof
}

#
# PaintBBS呼び出し（再生）
#
sub CallPaintBBSDraw{
local($w, $h, $jud, $pch);
my($o1, $o2, $p1, $p2, $ft);

$Pch_File="$vDir/$Pch_File" if( $Pch_File );

$Pch_Speed=-1 if( !$Pch_Speed );
if( ($pch_width) && ($pch_height) ){
	$image_width=$pch_width;
	$image_height=$pch_height;
}else{
	&GetImageSizePch();
}

$w=$image_width;
if( $w < 120 ){
	$w=120;
}
$h=$image_height+25;

&PutHTMLheaderSJIS();
$jud=&IsPCH();

$p1=rindex($fn, "\/");
$p2=rindex($fn, "\/", $p1-1);
$fn=substr($fn, $p2);

if( $RepLayout eq "CHECKED" ){
$hrsize=$w+30;
$hrs="";
$o1="<tr><td><img src=\"$www$fn\" border=\"1\"></td></tr><tr><td><br>";
$o2="<td align=right><br>";
}else{
$hrsize=$w*2+30;
$hrs="<hr size=\"1\" noshade width=\"$hrsize\"><br>";
$o1="<tr><td valign=\"top\" align=\"right\"><img src=\"$www$fn\" border=\"1\"></td><td width=40></td><td>";
$o2="<td colspan=\"3\">$hrs</td></tr><tr><td colspan=\"3\" align=\"right\"><br>";
}
print <<ANIME_VIEW_EOF1;
<title>Replay</title><style type="text/css"><!--.button{color:white;background-color:#9999CC;border:0}--></style>
</head><body><center>$hrs
<table border="0" cellpadding="0" cellspacing="0">
$o1
ANIME_VIEW_EOF1

#新PCHViewer 既存コード使える
if( (stat("$vDir/PCHViewer.jar"))[7] ){
if( $jud == 2 ){
print "<applet name=\"pch\" code=\"pch2.PCHViewer.class\" archive=\"$www/PCHViewer.jar\" width=\"$w\" height=\"$h\"><param name=\"buffer_progress\" value=\"false\"><param name=\"buffer_canvas\" value=\"false\"><param name=\"res.zip\" value=\"$www/res/res.zip\"><param name=\"tt.zip\" value=\"$www/res/tt.zip\"><param name=\"tt_size\" value=\"31\">";
}else{
print "<applet code=\"pch.PCHViewer.class\" NAME=\"paintbbs\" width=\"$w\" height=\"$h\" archive=\"$www/PCHViewer.jar\" MAYSCRIPT>";
}
}else{
print "<applet code=\"pbbs.PaintBBS.class\" archive=\"$www/PaintBBS.jar\" name=\"paintbbs\" width=\"$w\" height=\"$h\"><param name=\"viewer\" value=\"true\">";
}

$p1=rindex($Pch_File, "\/");
$p2=rindex($Pch_File, "\/", $p1-1);
$Pch_File=substr($Pch_File, $p2);

if( $apOP eq "Yes" ){
	$ft="onclick=\"window.close()\" value=\"Close\"";
}else{
	$ft="onclick=\"history.go(-1)\" value=\"Return\"";
}
print "<param name=\"pch_file\" value=\"$www$Pch_File\"><param name=\"speed\" value=\"$Pch_Speed\"><param name=\"image_width\" value=\"$image_width\"><param name=\"image_height\" value=\"$image_height\"></applet>\n</td></tr><tr>$o2<form><input type=\"button\" class=\"button\" $ft></form></td></tr></table></center></body></html>\n";
}

#
# PaintBBS呼び出し（描画）
#
sub CallPaintBBS{
my($psec,$pmin,$phour,$pday,$pmon,$pyear,$wday,$yday,$isdst);
my($palette,$w,$h,$fn,$jud,$ssmp,$scmp,$sstd,$hp,$str);
my($AppleteMode,$p1,$p2,$cry,$wd,$key,$szt, $vms, $apl);
local($AnimeSave,$count_lines,$layer_last)=($AnimeSave,$count_lines,$layer_last);

$apl="applet";
$vms="$apl id=\"applet\" alt=\"JavaApplet\"";
$Pch_File="$vDir/$Pch_File" if( $Pch_File );
($psec,$pmin,$phour,$pday,$pmon,$pyear,$wday,$yday,$isdst) = localtime;
if( (!$year) && ($nyear) ){
	$year=$nyear;
	$month=$nmonth;
	$day=$nday;
	$Category=$nCategory;
}
$pmon+=1;
if( $Pch_File ){
	$GrpFileName=$Pch_File;
	$GrpFileName=~s/^.*\///;
	$GrpFileName=~s/\.pch$|\.spch$|\.jpg$|\.jpeg$|\.gif$|\.giff$|\.png$//i;
}else{
	my($nmstr);
	if( $Mode =~ /SPAINTER/ ){
		$nmstr="snormal" if( $Mode =~ /Nor/ );
		$nmstr="spro" if( $Mode =~ /Pro/ );
	}else{
		$nmstr="PaintBBS";
	}
	$GrpFileName=sprintf("$nmstr%02d%02d%02d%02d%02d", $pmon,$pday,$phour,$pmin,$psec);
}

if( $Admin && (($Message) || ($Title)) ){
	&WriteNicky();
}else{
	&MakeDateStr();
}
&MakeNickyFname();

$key=int(rand(999));
$cry=int(rand(9999));
$wd=crypt($cry, $key);

&PutHTMLheaderSJIS();
if( !$Admin ){
print "<meta http-equiv=\"REFRESH\" content=\"0;URL=http://www.npa.go.jp/hightech/\">\n</head></html>";
exit;
}
open(WR, ">./PaintBBS.cgi");
binmode(WR);
print WR "$wd\n";
print WR "$NickyDir\n";
print WR "$NickyFname\n";
print WR "$GrpFileName\n";
print WR $Date;
close(WR);

print "<meta http-equiv=\"Pragma\" content=\"no-cache\">\n";
$palette=(stat("$vDir/palette.js"))[7];
print "<script type=\"text/JavaScript\" charset=\"Shift_JIS\" src=\"$www/palette.js\"></script>\n" if( $palette > 0 );
print &PutFile("./spainter_head.cgi");
print "<title>Draw!</title>\n</head>\n";
print "<body>\n<center>\n<table border=\"0\" width=\"100%\" height=\"100%\" summary=\"JavaApplet\">\n<tr>\n";

&GetImageSizePch();

$w=$image_width+150;
$w=400 if( $w < 400 );
$h=$image_height+150;
$h=500 if( $h < 500 );
$w=$apw if( $apw );
$h=$aph if( $aph );
if( $Mode =~ /^Continue|^SPAINTER|^PaintBBS/ ){
$ssmp="<td>\n<$vms code=\"c.ShiPainter.class\" name=\"paintbbs\" archive=\"$www/spainter.jar,$www/res/normal.zip\" width=\"$w\" height=\"$h\"><param name=\"res.zip\" value=\"$www/res/res_normal.zip\"><param name=\"tools\" value=\"normal\">";
$hp=$h+300;
$hp=$aph if( $aph );
$sstd="<td>\n<$vms code=\"c.ShiPainter.class\" name=\"paintbbs\" archive=\"$www/spainter.jar,$www/res/pro.zip\" width=\"$w\" height=\"$hp\"><param name=\"res.zip\" value=\"$www/res/res_pro.zip\"><param name=\"tools\" value=\"pro\">";
$scmp="<param name=\"tt.zip\" value=\"$www/res/tt.zip\"><param name=\"dir_resource\" value=\"$www/res/\">";
if( $layerNum ){
	$layerNum = 255 if( $layerNum > 255 );
	$scmp.="<param name=\"layer_count\" value=\"$layerNum\">";
}

if( ($Mode =~ /^Continue/) || ($Mode =~ /^PaintBBS/) ){
$jud=&IsPCH();
if( $jud == 2 ){
	if( $Mode =~ /Pro/ ){
		print "$sstd$scmp";
	}else{
		print "$ssmp$scmp";
	}
}else{
	print "<td align=\"center\">\n<$vms code=\"pbbs.PaintBBS.class\" archive=\"$www/PaintBBS.jar\" name=\"paintbbs\" width=\"$w\" height=\"$h\">";
}
}elsif( $Mode =~ /Nor/ ){
print "$ssmp$scmp";
}else{
print "$sstd$scmp";
}
if( ($Mode =~ /^SPAINTER/) || ($jud == 2) ){
	$AppleteMode="Savespainter";

	if( $layer_max ){
		print "<param name=\"layer_max\" value=\"$layer_max\">";
		print "<param name=\"layer_last\" value=\"$layer_last\">";
		print "<param name=\"count_lines\" value=\"$count_lines\">";
	}
}else{
	$AppleteMode="SavePaintBBS";
}
print &PutFile("./spainter_param.cgi");

$undoNum=60 if( !$undoNum );
if( $Quality < 3 ){
 $undoNum = int(($undoNum+1)/3)*3 if( $undoNum % 3 );
 $undoNum = 3 if( $undoNum < 3 );
 $undomg=$undoNum/3;
}else{
 $undoNum = int(($undoNum+1)/2)*2 if( $undoNum % 2 );
 $undoNum = 2 if( $undoNum < 2 );
 $undomg=$undoNum/2;
}

undef $qa;
undef $qt;
if( $Quality ){
	$qt=$Quality;
}elsif( $quality ){
	$qt=$quality;
}
$qa="<param name=\"quality\" value=\"$qt\">" if( $qt );

print "<param name=\"image_jpeg\" value=\"true\"><param name=\"undo\" value=\"$undoNum\"><param name=\"undo_in_mg\" value=\"$undomg\"><param name=\"url_save\" value=\"./nicky.cgi?$cry?$key?MODE=$AppleteMode\"><param name=\"image_size\" value=\"$JPEG_border\"><param name=\"compress_level\" value=\"$CompressL\">$qa";
if( $Message || $Mode =~ /^Continue/ ){
	print "<param name=\"url_exit\" value=\"./nicky.cgi?page=0\">";
}else{
	my $ctgt="";
	$ctgt="?Category=$Category";
	print "<param name=\"url_exit\" value=\"./nicky.cgi$ctgt?DATE=$year$month$day$daysub?Mode=EDIT\">";
}

print "<param name=\"thumbnail_type\" value=\"animation\">" if( $AnimeSave eq "True" );

$szt="<param id=\"image_width\" name=\"image_width\" value=\"$image_width\"><param id=\"image_height\" name=\"image_height\" value=\"$image_height\">";
if( $Pch_File ){
	$p1=rindex($Pch_File, "\/");
	$p2=rindex($Pch_File, "\/", $p1-1);
	$Pch_File=substr($Pch_File, $p2);
	if( $Pch_File =~ /\.pch$|\.spch$/i ){
		print "<param name=\"pch_file\" value=\"$www$Pch_File\">";
		if( $Pch_File =~ /\.pch$/ ){
			print "$szt\n";
		}
	}else{
		print "<param name=\"image_canvas\" value=\"$www$Pch_File\">$szt";
	}
}else{
print "$szt";
}
print "</$apl>\n</td>\n";
print "<td width=\"150\">\n<script type=\"text/JavaScript\">\n<!--\nPaletteInit();\n//-->\n</script>\n</td>\n" if( $palette > 0 );
}
print "</tr>\n</table>\n";
$str=&PutFile("./spainter_body.cgi");
$str=~s/%IMG_WIDTH%/$image_width/g;
$str=~s/%IMG_HEIGHT%/$image_height/g;
print $str;
print "</center>\n</body>\n</html>\n";
}

#
# Recv Data from PaintBBS
#
sub SavePaintBBS
{
	my($key,$cry,$mode);
	local($dir, $fname, $date, $path, $crcv, $wd);

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

	&ReadSetup();
	if( open(RD, "./PaintBBS.cgi") ){
		binmode(RD);
		$wd=<RD>;
		$wd=~s/\r|\n//g;
	}else{
		exit;
	}

	($cry,$key,$mode) = split(/\?/, $ENV{'QUERY_STRING'});
	if( $wd ne crypt($cry, $key) ){
		open(WD, ">./PaintBBS_error.cgi");
		print WD "$ENV{'REMOTE_ADDR'}";
		close(WD);
		exit;
	}

	$dir=<RD>;
	chop $dir;
	$NickyFname=<RD>;
	chop $NickyFname;
	$fname=<RD>;
	chop $fname;
	$path="$dir/$fname";
	$date=<RD>;
	close(RD);

	$crcv=$CommentRecv;
	&GetNickyFile($NickyFname);
	$Date=$date if( $Date eq "");
	$CommentRecv=$crcv if( !$CommentRecv );

	$a=<STDIN>;
	$data="";
	while( <STDIN> ){$data.=$_;}

	unlink("$dir/$GrpFileName") if( $GrpFileName =~ /\.jpeg$|\.jpg$|\.gif$|\.giff$|\.png$/i );
	$GrpFileName=$fname;
	if( substr($data,1,3) eq "PNG" ){
		$GrpFileName.=".png";
		($img,$pch)=split(/[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/,$data,2);
	}else{
		$GrpFileName.=".jpg";
		($img,$pch)=split(/\xff\xd9[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/,$data,2);
	}

	# Save to image file
	mkdir($dir, 0777) if( !-d "$dir" );

	open(WD, ">$dir/$GrpFileName");
	binmode(WD);
	print WD $img;
	print WD "\xff\xd9" if( $GrpFileName =~ /jpg$/ );
	close( WD );

	# Save to process file
	if( length($pch) > 17 ){
		if( $Mode eq "SavePaintBBS" ){
			open(WD, ">$path.pch");
		}elsif( $Mode eq "Savespainter" ){
			open(WD, ">$path.spch");
		}
		binmode(WD);
		print WD $pch;
		close WD;
	}

	&initial2nd();
	&GetDateFromFname();
	$tbRcv = $tbRcvDef if( !-f "$vDir/$NickyFname" );
	&WriteNicky();
	if( $Message && $Title ){
		open(WR, ">$vDir/$NickyHtml");
		binmode(WR);
		select WR;
		&NickyPageOut(0, $PrintDay);
		close(WR);
	}

	open(WR, ">./PaintBBS.cgi");
	print WR "\n";
	close(WR);
}

#
# 記事本文自動編集
#
sub ConvertMsg{
	local($msg,$flag,$j,$i,$line,$url, $str, @field, $flagB);

	$flag=0;
	$msg="";
	$j=0;
	@field=split(/http:\/\/|HTTP:\/\//,$_[0]);
	for $line( @field ){
		if( $j==0 ){
			$j++;
			$msg.=$line;
			next;
		}
		if( substr($line,7) !~ /\w|#|\?|\/|\:|\.|\~|\%|\-|\&|\=|\+|\,|\;/ ){
			$j++;
			$msg.=$line;
			next;
		}
		$flag=1;
		$line="http://".$line;
		if( $line !~ /<\/A>|<\/a>/ ){
			#URLを$urlに抽出
			$flagB=0;
			$str=substr($line,0,1);
			$url=$str;
			for($i=1; $str ne "\n"; $i++){
				$str=substr($line, $i, 1);
				if( $str =~ /\w|#|\?|\/|\:|\.|\~|\%|\-|\&|\=|\+|\,|\;/ ){
					$url.=$str;
				}else{
					$str=substr($line, $i);
					$flagB=1 if( $str =~ /^\"/ );
					last;
				}
			}
			#URLにタグを追加する。
			if( $flagB == 0 ){
				my($tg);
				if( $LinkOpen eq "Yes" ){
					$tg="target=\"_blank\"";
				}else{
					$tg="";
				}
				$str=$line;
				$line="<a href=\"$url\" $tg>$url</a>";
				$line.=substr($str,$i);
			}
		}
		$msg.=$line;
		$j++;
	}
	if( $flag == 0 ){
		$_[0];
	}else{
		$msg;
	}
}

#
# 記事本文自動編集
#
sub AutoEditNicky{
 local($data)=@_;
 local($msg, $str);
 $msg="";

 if( $data ){
	for $str(split(/\n/,$data)){
		if( $UrlLink eq "Yes" ){
			$msg.=&ConvertMsg($str)."\n";
		}else{
			$msg.="$str\n";
		}
	}
 }
 $msg;
}
#
# 現在日時取得
#
sub GetDateLocaltime{
	my($isdst, $yday);
	($sec,$min,$hour,$day,$month,$year,$wday,$yday,$isdst) = localtime;

	$year+=1900;
	$month=sprintf("%02d", $month+1);
	$day=sprintf("%02d", $day);
	$week=$Week[$wday];
	$first="Yes";
}
#
# POSTで渡されたデータを各グローバル変数にセット
#
sub NickySetValue{
	local($gomi, $cnt);

	$setVcnt++;
	if( !$Admin && $setVcnt > 20 ){
		goto_exit("value Error!IP[$ENV{'REMOTE_ADDR'}]");
	}elsif( $arg eq "MODE" ){
		$Mode=$val;
	}elsif( $arg =~ /WRITE|KAKUNIN|EDIT|DELETE|DELETEOK|CMNTEDIT|HEADEDIT|INPUT|MakeSetup|SETUP|CMNTGO|CMNTWRITE|CPREVIEW|PANEL|del/ ){
		$Mode=$arg;
	}elsif( $arg eq "month" ){
		$month=sprintf("%02d", $val);
	}elsif( $arg eq "day" ){
		$day=sprintf("%02d", $val);
	}elsif( $arg eq "hour" ){
		$hour=sprintf("%02d", $val);
	}elsif( $arg eq "min" ){
		$min=sprintf("%02d", $val);
	}elsif( $arg eq "CommentRecv" ){
		if( $val eq "No" ){ $val = 0 }
		elsif( $val eq "Yes" ){ $val = 1 }
		$CommentRecv=$val;
	}elsif( $arg eq "CommentMsg" ){
		$CommentMsg=&tagenc($val);
	}elsif( $arg eq "CommentName" ){
		$CommentName=&tagenc($val);
	}elsif( !$Admin && ($arg =~ /^Effect|^Msg|^ks$|^ke$|^ReplaySTR$|^ContinueSTR$|^TL|^User|^CommentSTRlen|^tag/)){
	}elsif( $arg eq "HEADDER" ){
		$head=$val;
	}elsif( $arg eq "GrpFile" ){
		$GrpData=$val if( $val !~ /^$/ );
	}elsif( $arg eq "EventFile" ){
		$EventData=$val if( $val !~ /^$/ );
	}elsif( $arg =~ /^Cmnt.*ZZZ/ ){
		($gomi, $cnt)=split(/ZZZ/, $arg);
		${$gomi}[$cnt]=$val;
		$CmntCnt=$cnt if( $CmntCnt < $cnt );
	}elsif( $arg eq "Category" ){
		$Category+=$val;
	}elsif( $arg eq "nCategory" ){
		$nCategory+=$val;
	}elsif( $arg eq "ctgry" ){
		$ctgry+=$val;
	}elsif( ($arg eq "DATE") || ($arg eq "DT") ){
		$year=substr($val,0,4);
		$month=substr($val,4,2);
		$day=substr($val,6,2);
		$daysub=substr($val,8,1);
		$hour=substr($val,9,2);
		$min=substr($val,11,2);
		$cnt=rindex($val, "_");
		$Category=hex(substr($val, $cnt+1, 8)) if($cnt >= 0);
		$DT=$val;
	}elsif( $arg !~ /^$|Admin|vDir|mtap|mto|cgipath|^[0-9]/ ){
		${$arg}=$val;
	}
}

#
# Cookie食す。
#
sub WriteCookie
{
local($key,$pss);
local($sec,$min,$hour,$mday,$mon,$year,$wday);

if( $pass || $password ){
($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time + 60*24*60*60);

$wday = ('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday') [$wday];
$mon  = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec')[$mon];
$datec = sprintf("%s, %02d\-%s\-%04d %02d:%02d:%02d GMT",$wday,$mday,$mon,$year+1900,$hour,$min,$sec);

$key=$ENV{REQUEST_URI};
$key=$ENV{SCRIPT_NAME} if( $key eq "" );
if( $password ){
$pss=$password;
}else{
$pss=$pass;
}
print "Set-Cookie: Nicky=pass:$pss; expires=$datec;path=$key;\n";
}
}
#
# $NickyAdminと比較
#
sub AdminCheck{
	my($pass)=$_[0];
	my($str, $key);

	if( open(RD, "./NickyAdmin.cgi") ){
		binmode(RD);
		$str=<RD>;
		close(RD);
	}
	return 1 if( $str eq crypt($pass, $ENV{SCRIPT_NAME}) );
	$key=$ENV{REQUEST_URI};
	return 1 if( $str eq crypt($pass, $key) );
	$key =~ s/\+/ /g;
	$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
	if( $str eq crypt($pass, $key) ){
		1;
	}else{
		0;
	}
}

sub mobile_save{
	my($str, $str1, $dummy, $cry, @po, @ps, @org, $i, $j, $key);
	my($atm, $cnt);
	$str="popserv=$popserv\npopuser=$popuser\npoppass=$poppass\n";
	$str1="$BBSmode,$WriteMode";

	if( $BBSmode ne "BBS" ){
		$key=$password;
	}else{
		$key=$WriteMode;
	}
	$cry=crypt($ENV{DOCUMENT_ROOT}, $key);

	$crylen=length($cry);
	@po=unpack("C$crylen", $cry);
	$pslen=length($str);
	@ps=unpack("C$pslen", $str);

	@org=@po;
	while( $#po < $#ps ){
		@po=(@po, @org);
	}
	open(WD, ">./MobileUpper.cgi");
	binmode WD;
	for($i=0;$i<$#po;$i++){
		print WD $po[$i]+$ps[$i];
		print WD ",";
	}
	print WD "\n$str1\n";

	$cnt=$#AutoLayout+1;
	$atm="";
	for($i=0;$i<$cnt;$i++){
		$atm="$AutoLayout[$i],$atm";
	}
	print WD "$atm\n";
	print WD "$MobileGallery\n";
	close WD;
}

sub mobile_load{
	my($str, $str1, $cry, $de, $a, @savedat, $i, $j, $key, @ppp, $atm);
	if( open(RD, "./MobileUpper.cgi") ){
		binmode RD;
		$str=<RD>;
		$str1=<RD>;
		$atm=<RD>;
		$MobileGallery=<RD>;
		close(RD);
	}else{
		return;
	}
	$atm=~s/\r|\n//g;
	$MobileGallery=~s/\r|\n//g;
	@AutoLayout=split(/,/, $atm);
	@savedat=split(/,/, $str);
	($BBSmode, $WriteMode) = split(/,/, $str1);
	$WriteMode=~s/\r|\n| //g;
	if( $BBSmode ne "BBS" ){
		return if( !$password );
		$key=$password;
	}else{
		$key=$WriteMode;
	}

	$cry=crypt($ENV{DOCUMENT_ROOT}, $key);
	$crylen=length($cry);
	@po=unpack("C$crylen", $cry);
	@org=@po;
	if( ($#po == 0) && ($#savedat) ){
		print "<html><body>error4</body></html>\n";
		exit;
	}
	while( $#po < $#savedat ){
		@po=(@po, @org);
	}
	for($i=0;$i<$#savedat;$i++){
		$ppp[$i]=$savedat[$i]-$po[$i];
	}
	$de=pack("C$i", @ppp);
	for (split(/\n/, $de)){
		($arg, $val)=split(/=/, $_);
		${$arg}=$val;
	}
	$str="popserv=$popserv\npopuser=$popuser\npoppass=$poppass\n";
	$popserv =~ s/\r|\n|\t| //g;
	$popuser =~ s/\r|\n|\t| //g;
	$poppass =~ s/\r|\n|\t| //g;
}

#
# パスワードチェック
#
sub NickyPassCheck{
	local($passwdcf)=$passwdcf;
	if( (stat("./NickyAdmin.cgi"))[7] > 0 ){
		if( !&AdminCheck($oldpassword) ){
			&NickyPassWord();
		}
	}

	if( $Mode eq "DUMMY PASSWORD" ){
		srand;
		for($password=rand(9999999); $password eq $pass; ){};
		&WriteCookie();
		if( !$flag_type ){
			print "Content-type: text/html\n\n";
			$flag_type=1;
		}
		$Admin=0;
		&MakeNickyLast();
		exit;
	}

	if( $password eq $passwdcf ){
		local($i, $key);

		if( !$password ){
			if( $oldpassword ){
				$password = $oldpassword;
			}else{
				&NickyPassWord();
			}
		}
		&nickyGetHead();
		select STDOUT;

		@nli=&GetNickyList($Age) if( !@nli );
		if( $#nli < 0 ){
			local($str);
			$str="http://".$ENV{HTTP_HOST}.$ENV{REQUEST_URI};
			&GetDateLocaltime();
			$Title="ようこそ";
			$Message="このメッセージは、nicky.cgiが自動生成したものです。\n\nこのメッセージの下に、『記事編集』『初期設定』等の操作ボタンが表示されていますが、これは管理者のパソコンでここへアクセスした場合にのみ表示されるものです。\n\n#新規に記事を書きこみする場合は下の『記事作成』ボタンをクリックするか、URIを$str?Newと指定します。\n#また、カスタマイズを行う場合は下の『初期設定』ボタンをクリックするか、URIを$str?MakeSetupと指定します。\n\n公開するまでにはこのメッセージを削除するのをお忘れなく・・・。";
			&WriteNicky();
		}

		$key=$ENV{SCRIPT_NAME};
		if( $key eq "" ){
			$key=$ENV{REQUEST_URI};
			$key =~ s/\+/ /g;
			$key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
		}
		&WriteCookie();
		open(WD, ">./NickyAdmin.cgi");
		binmode(WD);
		print WD crypt($password, $key);
		close(WD);
		if( -e "./MobileUpper.cgi" ){
			my($p);
			$p=$password;
			$password=$oldpassword;
			&mobile_load();
			$password=$p;
			&mobile_save();
		}
		if( !$flag_type ){
			print "Content-type: text/html\n\n";
			$flag_type=1;
		}
		unless( -e "./NickyAdmin.cgi" ){
			print "<html><body>nicky.cgiを設置したフォルダにCGIからのライト権がありません</body></html>\n"; exit;
		}
		$Admin=1; &MakeNickyLast();
	}else{
		&NickyPassWord();
	}
	exit;
}
#
# パスワード入力画面
#
sub NickyPassWord{

if( !$flag_type ){
	print "Content-type: text/html\n\n";
	$flag_type=1;
}
&PutHTMLheader();
print "<title>nicky!パスワード設定画面</title>\n</head>\n<body>\n";
print "<center>nicky!パスワード設定画面$br<HR>\n";
print "<form method=\"POST\" action=\"$cgipath\">";
if( (stat("./NickyAdmin.cgi"))[7] ){
	local($pair, @pairs, $DUMMY, $name, $value);

	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});

	foreach $pair (@pairs) {
		local($name, $value) = split(/=/, $pair);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/, $DUMMY{'Nicky'});
	foreach $pair (@pairs) {
		local($name, $value) = split(/:/, $pair);
		${$name} = $value;
	}
	print "旧パスワード　<input type=\"password\" name=\"oldpassword\" value=\"$pass\" size=\"12\">$br\n";
}
print <<HTML;
新パスワード　<input type="password" name="password" size="12">$br
パスワード確認<input type="password" name="passwdcf" size="12">$br$br
<input type="submit" name="MODE" value="SETUP PASSWORD">$br$br$br$br
<input type="submit" name="MODE" value="DUMMY PASSWORD">
</form></center></body>\n</html>
HTML
exit;
}

#
# iMODE判定
#
sub IsIMODE{
my($ret);
$ret=0;
$ret=1 if( $ENV{HTTP_USER_AGENT} =~ /DoCoMo|J-PHONE|DDIPOCKET|UP\.Browser/ );
#$ret=1 if( -e "./imode" );
$ret;
}
#
# Modeに従って実行
#
sub NickyExec{
 if( ($Mode eq "SETUP PASSWORD") || ($Mode eq "DUMMY PASSWORD") ){
	&NickyPassCheck();
 }else{
	if( (stat("./NickyAdmin.cgi"))[7] <= 0 ){
		&NickyPassWord();
	}
 }
 if( !$flag_type ){
	if( $Mode eq "WRITE" && $Admin ){
		$password=$pass;
		&WriteCookie();
	}
	print "Content-type: text/html\n\n";
	$flag_type=1;
 }
 if( $DT && !$Mode ) {
	if( ($MsgOldForm == 1) || (&IsIMODE()) ) {
		$Mode="PageOut";
	} else {
		$Mode="MONTH";
	}
 }elsif( $Mode eq "PANEL" ){
	$ld="panel.cgi";
	$Mode="exec";
 }elsif( $ld && !$Mode ){
	$Mode="exec";
 }
 $lg=$lg."i";
 $Message=&AutoEditNicky($Message);
 if( $Mode =~ /KAKUNIN/ ){
	if( $nyear && (!$year)){
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
#		$Category=$nCategory;
	}
	$ModeSub=8;
	if( $Mode eq "KAKUNIN" ){
		&NickyKakunin(NORMAL);
	}else{
		&NickyKakunin(CUSTOM);
	}
 }elsif( ($Mode eq "WRITE") && ($Admin) ){
	my($oyear,$omonth,$oday,$odaysub,$oCategory,$cfn,$flagh,$bkfn,$bkfn2);
	$flag_new_make=0;
	$oyear=$year;
	$omonth=$month;
	$oday=$day;
	$odaysub=$daysub;
	$oCategory=$Category;
	$Category=$nCategory;
	if( $nyear ){
		undef $Date;
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
		undef $daysub if(($oyear)&&(($nyear!=$oyear)||($nmonth!=$omonth)||($nday!=$oday)));
		&MakeNickyFname();
		$cfn=$NickyComment;
	}
	($w_year,$w_month,$w_day,$w_daysub)=($year,$month,$day,$daysub);
	$flag_new_make=1 if( !-f $NickyFname );
	&WriteNicky();
	$bkfn=$NickyFname;
	$nCategory=0 unless( $nCategory );
	if(($oyear)&&($nyear)&&(($nyear != $oyear) ||
	   ($nmonth != $omonth)||($nday != $oday))
	  ){
		#日付変更→古い方を削除
		$year=$oyear;
		$month=$omonth;
		$day=$oday;
		$daysub=$odaysub;
		$Category=$oCategory;
		&MakeNickyFname();
		rename($NickyComment, $cfn) if( -e $NickyComment );
		if( ($oyear != $nyear) && ( $GrpFileName ) ){
		  my($ogf, $ngf, $thf, $fn, $ext);
		  $ogf=sprintf("$vDir/%04d/$GrpFileName", $oyear);
		  $ngf=sprintf("$vDir/%04d/$GrpFileName", $nyear);
		  $fn=$GrpFileName;
		  $ext=&GetExt($fn);
		  $fn=~s/\..*$//;
		  $th=sprintf("$vDir/%04d/$fn", $oyear);
		  $thf=&get_thumb_name2($th);
		  if( -e $ngf ){
			my($gsec,$gmin,$ghour,$gday,$gmon,$gyear,$gwday,$gyday,$gisdst)=localtime;
			$GrpFileName=sprintf("grp%04d%02d%02d%02d%02d%02d.$ext", $gyear,$gmon,$gday,$ghour,$gmin,$gsec);
			$fn=$GrpFileName;
			$fn=~s/\..*$//;
			$ngf=sprintf("$vDir/%04d/$GrpFileName", $nyear);
#			while( -e $GrpFileName ){
#				($gsec,$gmin,$ghour,$gday,$gmon,$gyear,$gwday,$gyday,$gisdst)=localtime;
#				$GrpFileName=sprintf("grp%04d%02d%02d%02d%02d%02d.$ext", $gyear,$gmon,$gday,$ghour,$gmin,$gsec);
#			}
			$bkfn2=$NickyFname;
			$NickyFname=$bkfn;
			&WriteNickyFile();
			$NickyFname=$bkfn2;
		  }
		  rename($ogf, $ngf);
		  if( $thf ){
			$ext=&GetExt($thf);
			if( ($ext eq "pch") || ($ext eq "spch") ){
			  $ngf=sprintf("$vDir/%04d/$fn.$ext", $nyear);
			}else{
			  $ngf=sprintf("$vDir/%04d/$fn.thumb.$ext", $nyear);
			}
			rename($thf, $ngf);
		  }
		}
		&NickyDelete();
#		$flagh=1;
		$flag_new_make=0;
		&MakeHTMLone($w_year, $w_month, $w_day, $w_daysub, 1, 0);
	}elsif(($oCategory != -1) && ($oCategory ne $nCategory)){
		if( $oyear && (sprintf("[%s]", $oCategory) ne "[]") ){
			$Category=$oCategory;
			$year=$oyear;
			$month=$omonth;
			$day=$oday;
			$daysub=$odaysub;
			&MakeNickyFname();
			unlink($NickyFname);
		}
		#&MakeHTMLone($year, $month, $day, $daysub, 0, 0);
	}

	unless( $flagh ){
		&MakeHTMLone($year, $month, $day, $daysub, 0, 1);
	}
	&MakeNickyLast();
 }elsif( $arg eq "New" ){
	&Nicky();
 }elsif( $Mode eq "PageOut" ){
	&SerchPageFromDate();
 }elsif( $Mode eq "MONTH" ){
	&NickyMonthOut();
 }elsif( ($Mode =~ /^EDIT$|CMNTEDIT/) & $Admin ){
	&NickyEdit();
 }elsif( $Mode eq "CMNTGO" ){
	if( $Admin || &AdminCheck($passwd) ){
		&EditComment();
	}else{
		return 0;
	}
 }elsif( $Mode eq "CMNTWRITE" ){
	if( $Admin || &AdminCheck($passwd) ){
		&WriteComment();
	}else{
		return 0;
	}
 }elsif( $Mode eq "MKL" ){
	&MakeLastHTML();
 }elsif( $Mode eq "iComment" ){
	&CommentIMODE();
 }elsif( $Mode eq "DELETE" ){
	&NickyDeleteConfirm();
 }elsif( ($Mode eq "DELETEOK") && ($Admin) ){
	&NickyDelete("TRUE");
 }elsif( ($Mode eq "HEADEDIT") && ($Admin) ){
	&NickyHead();
 }elsif( ($Mode eq "HEADWRITE") && ($Admin) ){
	&NickyHeadWrite();
 }elsif( $Mode =~ /^CINPUT$|^CINPUTS$|CPREVIEW/ ){
	&NickyInputComment();
 }elsif( $Mode eq "CINPUTI" ){
	if( &ReqJcode() ){
		&jcode'sjis2euc(\$CommentName);
		&jcode'sjis2euc(\$CommentMsg);
	}
	&NickyInputComment();
 }elsif( ($Mode eq "SERCH") || ($Mode eq "SEARCH") || ($SerchWord) ){
	&NickySerch();
 }elsif( ($Mode eq "MakeSetup") && ($Admin) ){
	&MakeSetup();
 }elsif( ($Mode eq "SETUP") && ($Admin) ){
	my($dat);
	$MsgSize=$HonbunSize;
	$MsgColor=$HonbunColor;
	$MsgBgColor=$HonbunBgColor;
	&create_style();
	&nickyGetHead("NickyHFdat.cgi");
	$dat="$head$TMN$foot$TMN$iHead$TMN$iFoot$TMN$efoot$TMN$head2nd$TMN$foot2nd$TMN$Use2ndHD$TMN$UseListHD$TMN$UseSearchHD$TMN$Use2ndFT$TMN$UseListFT$TMN$UseSearchFT";
	&create_exec($dat, $NickyHF, "nHF");
	&SaveNickyConf();
 }elsif( ($Mode eq "INITIAL") && ($Admin) ){
	my($dat);
	unlink($NickyConf);
	&InitialNicky();
	&create_style();
	&nickyGetHead("NickyHFdat.cgi");
	$dat="$head$TMN$foot$TMN$iHead$TMN$iFoot$TMN$efoot$TMN$head2nd$TMN$foot2nd$TMN$Use2ndHD$TMN$UseListHD$TMN$UseSearchHD$TMN$Use2ndFT$TMN$UseListFT$TMN$UseSearchFT";
	&create_exec($dat, $NickyHF, "nHF");
	&MakeNickyLast();
 }elsif( ($Mode eq "PaintBBS") || ($Mode =~ /^Continue/) || ($Mode =~ /^SPAINTER/) ) {
	&CallPaintBBS();
 }elsif( $Mode eq "PaintBBSDraw" ){
	&CallPaintBBSDraw();
 }elsif( $Mode eq "CallApplet" ){
	&CallApplet();
 }elsif( $Mode eq "ColorSample" ){
	&PutColorSample();
 }elsif( ($Mode eq "UserCustom") && $Admin ){
	&UserCustomize();
 }elsif( ($Mode eq "Custom") && $Admin ){
	&SaveUserCustomize();
 }elsif( ($Mode eq "CustomC") && $Admin ){
	&SaveUserCustomizeC();
 }elsif( $Mode eq "SEND" ){
	&RecvIMODE($Mode);
 }elsif( $Mode eq "delImode" ){
	&DeleteImode();
 }elsif( ($Mode eq "saveFile") && $Admin ){
	&saveFile();
 }elsif( ($Mode eq "exec") && $ld ){
	if( $ld eq "panel.cgi" ){
		$f=1;
	}elsif( open(RD, "./liblist.cgi") ){
		$f=0;
		while(<RD>){$dat.=$_;}
		close(RD);
		$dat=~s/\r//g;
		@nlib=split(/\n/, $dat);
		for $ln(@nlib){
			if( $ln eq $ld ){
				$f=1;
				last;
			}
		}
	}
	return 0 unless( $f );
	undef $dat;
	undef @nlib;
	eval('require("$ld")');
	if( $@ ){
		print "error\n$@";
	}else{
		$r=rindex($ld, "\.");
		$abc=substr($ld, 0, $r);
		&$abc();
	}
	exit;
	return 0;
 }else{
	return 0;
 }
1;
}

sub editFile{
my($fname)=@_;
my($dat, $dat0, $dat1, $tmp);

$tmp=$fname;
$tmp=~s/\.//g;
&PutHTMLheader();
&goto_end("bad filename") if( $tmp=~/(\W)/ );
if( open(RD, "./$fname") ){
	binmode RD;
	while(<RD>){$dat.=$_;}
	close(RD);
	$dat=~s/\r//g;
}
while( $dat=~s/\n$// ){}
$dat=~s/&/&amp;/g;
$dat=~s/</&lt;/g;
print "</head><body>filename=[$fname]$br<form method=\"POST\" action=\"$cgipath\"><p>";
if( $fname eq "inputarea.cgi" ){
($dat0, $dat, $dat1)=split(/\x01/, $dat);
print "<textarea cols=\"80\" rows=\"20\" name=\"libList0\">$dat0</textarea><br>\n";
print "<textarea cols=\"80\" rows=\"4\" name=\"libList1\">$dat1</textarea><br>\n";
}
print <<HTML;
<textarea cols="80" rows="20" name="libList">$dat</textarea>
<input type="hidden" name="Mode" value="saveFile">
<input type="hidden" name="fname" value="$fname">
<br><input type="submit" name="dummy" value="save!">
</p></form></body></html>
HTML
}
sub get_inputarea{
my $dat;
$inputh=$inpute="";
if( open(RD, "./inputarea.cgi") ){
binmode RD;
while(<RD>){$dat.=$_;}
close RD;
($inputh, $inpute, $inputt)=split(/\x01/, $dat);
}
}

sub saveFile{
if( $libList ){
$libList=~s/\r//g;
if( $fname eq "inputarea.cgi" ){
$libList0=~s/\r//g;
$libList1=~s/\r|\n//g;
$libList="$libList0\x01$libList\x01$libList1";
}
}
open(WD, ">./$fname");
binmode(WD);
print WD $libList;
close(WD);
if( $fname eq "d.cgi" ){
&create_style;
}
&NickyPageOut(0, $PrintDay);
}
sub PutHTMLheader{
print "<html lang=\"ja\">\n<head>\n<meta http-equiv=\"Content-type\" content=\"text/html; charset=EUC-JP\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n";
}
sub initial2nd{
$flag_customread=$flag_cmnt_customread=$mkHTML=$saveExec=0;
# 記事HTML用ヘッダ／フッタファイル名
$NickyConf="./NickyConf.cgi";
$NickyHF="./NickyHF.cgi";
$NickyAdmin="./NickyAdmin.cgi";
$CustomText="./CustomText.cgi";
$CustomCGI="./CustomCGI.cgi";
$CustomCmntText="./CustomCmntText.cgi";
$CustomCmntCGI="./CustomCmntCGI.cgi";
$TMN="\n#\n#----NickyTerminate----\n#\n";
if( $tagmode eq "xhtml" ){
$br="<br />";$e=" />";
}else{
$br="<br>";$e=">";
}
}
#
# S.Kano
#
$ENV{TZ}="JST-9";
local($str,$arg,$val);
local($page,$PageNo,$flag_new_make,$flag_new_hit)=(0,0,0,0);
local($UserCmntF,$UserCmntH,$UserCmntO,$UserCmntP,$UserCmntA)=($UserCmntF,$UserCmntH,$UserCmntO,$UserCmntP,$UserCmntA);
local($UserCustomCmntF,$UserCustomCmntH,$UserCustomCmntO,$UserCustomCmntP,$UserCustomCmntA)=($UserCustomCmntF,$UserCustomCmntH,$UserCustomCmntO,$UserCustomCmntP,$UserCustomCmntA);
local($stage2nd,$NickyAdmin,$EventFileDel,$tbTAG)=($stage2nd,$NickyAdmin,$EventFileDel,$tbTAG);
local($UserCustomN,$UserCustomR,$UserCustomU,$UserCustomD,$UserCustomL,$UserCustomRC,$UserCustomUC,$UserCustomDC,$UserCustomLC)=($UserCustomN,$UserCustomR,$UserCustomU,$UserCustomD,$UserCustomL,$UserCustomRC,$UserCustomUC,$UserCustomDC,$UserCustomLC);
local($UserHead,$UserFoot,$Category,$LogRemake)=($UserHead,$UserFoot,$Category,$LogRemake);
local($CommentMsg,$CmntURI,$spsize,$PBsize,$load_ctg)=("",$CmntURI, -3, -3, 0);
local($setVcnt,$GrpSave,$ctg_ptype,$ctg_btn)=(0,$GrpSave,$ctg_ptype,$ctg_btn);
local($w_year, $w_month, $w_day, $w_daysub);
local(@ctg_ff);
my($flag, $newline, $a)=(0,0,"");
my($r1, $r2);
my($clength)=$ENV{'CONTENT_LENGTH'};
$Mode="";
$r1=rindex($ENV{SCRIPT_NAME}, "/");
$r2=rindex($cgipath, "/");
$Admin=&TrueCheck();
if( substr($ENV{SCRIPT_NAME}, $r1) ne substr($cgipath, $r2) ){1;}else{
binmode(STDIN);
binmode(STDOUT);

for $str(split(/\?/, $ENV{'QUERY_STRING'})){
	($arg, $val)=split(/=/, $str);
	$val =~ s/\+/ /g;
	$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
	&NickySetValue() if( $arg ne "CIRCV" );
}
if( ($Mode eq "SavePaintBBS") || ($Mode eq "Savespainter" ) ){
	&SavePaintBBS();
	exit;
}
if( $Admin ){
	&ReadSetup();
}elsif( $clength > 5120 ){
	goto_exit("IP=$ENV{'REMOTE_ADDR'}");
}

if( $clength > 0 ){
 $CTYPE=$ENV{'CONTENT_TYPE'};
 if( $CTYPE =~ /multipart/ ){
	my($gomi1, $gomi2, $gomi3, $gomi4);
	goto_exit("IP=$ENV{'REMOTE_ADDR'}") if( !$Admin );
	eval( '$a=<STDIN>;' );
	goto_exit("このシステムでは動作しません(Ver=$Ver)<br>$@") if( $@ );
	if( $a =~ /\r\n/ ){ $newline="\r\n"; }else{ $newline ="\n"; }
	($gomi1, $BOUNDARY)=split(/boundary=/, $CTYPE);
	while( <STDIN> ){
		($gomi1, $arg, $gomi2, $gomi3)=split /\"/;

		$gomi1=<STDIN>;
		$gomi2=<STDIN>;
		$gomi4=<STDIN>;

		if( $arg =~ /^Message$/ ){
			$val=$gomi2;
			while( $gomi4 !~ /$BOUNDARY/ ){
				$val.=$gomi4;
				$gomi4=<STDIN>;
			}
		}elsif( ($arg eq "GrpFile") || ($arg eq "EventFile") ){
			if( $gomi4 =~ $BOUNDARY ){
				$val="";
			}else{
				if( $gomi1 =~ /^Content-Type:/ ){
					$val=$gomi4;
				}else{
					$val=$gomi2.$gomi4;
				}
				$gomi4=<STDIN>;
				while( $gomi4 !~ /$BOUNDARY/ ){
					$val.=$gomi4;
					$gomi4=<STDIN>;
				}
			}
			if( $gomi3 ){
			  if(($arg eq "GrpFile") || ($arg eq "URLimage")) {
				if( !$GrpFileName ){
					$GrpFileName=&BaseName($gomi3);
				}
			  }elsif( $gomi3 ){
				$EventFileName=&BaseName($gomi3);
			  }
			}
		}else{
			$val=$gomi2;
		}

		$val=~s/$newline$//;
		&NickySetValue();
	}
  #
  # 画像ファイル削除
  #   反則風味だがここ以外でやるとロジックが膨れる。
  #
  if( ($GrpFileDel eq "Delete") && ($Admin) ){
	my($n, $p, $o, @fl);
	&MakeNickyFname();

	$n=rindex($GrpFileName, "\.");
	$o=substr($GrpFileName,0,$n);
	@fl=&GetFileList("$NickyDir/$o\\.");
	for $p(@fl){
		if( ($p !~ /\.cmnt$/) && ($p !~ /\.nky$/) ){
			unlink("$vDir/$p");	# 画像ファイル削除
		}
	}

	undef $GrpFileName;
	undef @fl;
  }
  if( ($EventFileDel eq "Delete") && ($Admin) && ($GrpFileName) ){
	my($n, $p2, @fl);

	if( (!$year) && ($nyear) ){
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
	}
	&MakeNickyFname();
	$n=rindex($GrpFileName, "\.");
	$p2=substr($GrpFileName, 0, $n);
	@fl=&GetFileList("$NickyDir/$p2\\.");
	for (@fl){
		if( ($_ ne "./$year/$GrpFileName") &&
			($_ ne "./$year/$p2.nky") &&
			($_ ne "./$year/$p2.cmnt") ){
			unlink("$vDir/$_");
		}
	}
  }
  if( ($GrpData) && ($Admin) ){
	my($gsec,$gmin,$ghour,$gday,$gmon,$gyear,$gwday,$gyday,$gisdst, $gf);

   if( !$ld && !$GrpSave ){
	if( (!$year) && ($nyear) ){
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
	}
	&MakeNickyFname();
	mkdir($NickyDir, 0777) if( !-e $NickyDir );
	$gf=$GrpFileName;
	$gf=~s/\.//g;
	if( (-e "$NickyDir/$GrpFileName") || ($gf=~/[^_a-zA-Z0-9_\-]/) ){
		($gsec,$gmin,$ghour,$gday,$gmon,$gyear,$gwday,$gyday,$gisdst)=localtime;
		$gmon++;
		$ext=&GetExt($GrpFileName);
		$GrpFileName=sprintf("grp%02d%02d%02d%02d%02d.$ext", $gmon,$gday,$ghour,$gmin,$gsec);
	}
	open(WD, ">$NickyDir/$GrpFileName");
	binmode(WD);
	print WD $GrpData;
	close(WD);
   }
  }

  if( ($EventFileName =~ /\.pch$|\.spch$|\.jpg$|\.png$|\.gif$/ ) && 
	($GrpFileDel ne "Delete") && ($Admin) ){
	local($fn1, $ext);
	if( (!$year) && ($nyear) ){
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
	}
	&MakeNickyFname();
	if( $GrpFileName && -e "$NickyDir/$GrpFileName" ){
		$ext=$EventFileName;
		$ext=~s/^.*\.//;
		$ext = "thumb\.$ext" if( $ext =~ /jpg|png|gif/i );
		$fn1=$GrpFileName;
		$fn1=~s/\..*$//;

		open(WD, ">$NickyDir/$fn1.$ext");
		binmode(WD);
		print WD $EventData;
		close(WD);
	}
  }
  # pchのみ
  if( ( ((&GetExt($EventFileName) =~ /^pch$|^spch$/ ) && (!$GrpData)) ||
	  ((&GetExt($GrpFileName) =~ /^pch$|^spch$/ ) && (!$EventData)) ) &&
	   ($GrpFileDel ne "Delete") && ($Admin) ){

	if( (!$year) && ($nyear) ){
		$year=$nyear;
		$month=$nmonth;
		$day=$nday;
	}
	&MakeNickyFname();
	mkdir($NickyDir, 0777) if( !-e $NickyDir );
	open(WD, ">$NickyDir/$EventFileName");
	binmode(WD);
	print WD $EventData;
	close(WD);
	$Mode="Continue" if( !$GrpFileName );
	$Pch_File="$NickyDir/$EventFileName";
  }
 }else{	#multipart
	read(STDIN, $a, $clength);

	foreach (split(/&/, $a)){
		($arg, $val)=split(/=/, $_);
		$val =~ s/\+/ /g;
		$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/ego;
		&NickySetValue();
	}
	&ReadSetup() if( !$Admin );
 }
#
# Modeによって何がしたいのかを判定＆実行
#
 &initial2nd();
 $ctg = $ctgry if( !$ctg && $ctgry );
 if( $Mode eq "MKL" ){
	$flag_type=1;
	&MakeLastHTML();
 }elsif( &NickyExec() == 0 ){
	&NickyPageOut(0, $PrintDay);
 }
 exit;
} # $clength <= 0
 &ReadSetup if( !$Admin );
 &initial2nd();
 $ctg = $ctgry if( !$ctg && $ctgry );
 if( $arg eq "PassWord" ){
	&NickyPassWord();
 }elsif( $Mode eq "MKL" ){
	&MakeLastHTML();
 }else{
	print "Content-type: text/html\n\n";
	$flag_type=1;
	$lg="n";
 }
 if( $arg eq "page" ){
  if( !$val ){ $val=0 };
  $PageNo=$val;
  if( &IsIMODE() ){
	&NickyPageOutIMODE($PageNo, $PrintDay);
  }else{
	&NickyPageOut($PageNo, $PrintDay);
  }
 }elsif( $arg =~ /^SetSerch$|^SetSearch$/ ){
	&NickySetSearch();
 }elsif( $arg eq "New" ){
  if( ( &IsIMODE() ) && ( &ReqJcode() ) ){
	&NickyIMODE("edit");
  }else{
	if( $Admin ){
		&Nicky();
	}else{
		&NickyPageOut(0, $PrintDay);
	}
  }
 }elsif( $arg eq "new" ){
	&NickyIMODE("edit");
 }elsif( ($arg eq "edit") || ($arg eq "del") ){
	&NickyEditIMODE($arg);
 }elsif( $arg eq "TitleList" ){
	&PutTitleList();
 }elsif( ($arg eq "UserCustom") && $Admin ){
	&UserCustomize();
 }elsif( ($arg eq "MakeSetup") && (($Admin) || (-e "./MakeSetup")) ){
	&MakeSetup();
 }elsif( ($arg eq "UserCustomC") && $Admin ){
	&UserCustomizeCmnt();
 }elsif( $arg eq "ColorSample" ){
	&PutColorSample();
 }elsif( ($arg eq "editexe") && $Admin ){
	&editFile("exelist.cgi");
 }elsif( ($arg eq "editlib") && $Admin ){
	&editFile("liblist.cgi");
 }elsif( ($arg eq "editFile") && $Admin ){
	&editFile($fname);
 }elsif( ($arg eq "editreject") && $Admin ){
	&editFile("reject_list.cgi");
 }elsif( ($arg eq "editcss") && $Admin ){
	&editFile("d.cgi");
 }elsif( ($arg eq "editinput") && $Admin ){
	&editFile("inputarea.cgi");
 }elsif( ($arg eq "saveFile") || ($Mode eq "saveFile") ){
 }else{
  if( &NickyExec() == 0 ){
	if( !&IsIMODE() ){
		&NickyPageOut(0, $PrintDay);
	}else{
		&NickyPageOutIMODE(0, $PrintDay);
	}
  }
 }
}
#end of script
