#!/usr/bin/perl

# ライブラリ取り込み
require './lib/jcode.pl';
require './lib/cgi-lib.pl';
require './lib/config.pl';
require './lib/fold.pl'; # ２バイト文字フォールディングパッケージ

# スクリプトURL
$script = './index.cgi';

# スクリプトURL
$script_store = './store/index.cgi';

# ログファイル名
$logfile = './index_log.cgi';

# ロックファイル名
$lockfile = './lock/ybg.lock';

# アップロードディレクトリ
$ImgDir = "./tmp/";

# 画像ファイルの最大表示の大きさ（単位：ピクセル）
# → これを超える画像は縮小表示します
$MaxW = 240;	# 横幅
$MaxH = 400;	# 縦幅

$no_kwd = 12;

#============#
#  設定完了  #
#============#

if ($ImgDir !~ /\/$/) { $ImgDir .= "/"; }

&decode;
&get_kwd;
if ($mode eq 'regist') { &regist; }
elsif ($mode eq 'admin') { &admin; }
elsif ($mode eq 'form') { &form; }
elsif ($mode eq 'del') { &del; }
elsif ($mode eq 'check') { &check; }
elsif ($mode eq 'edit') { 
	$edit = 1;
	&form;
	}
elsif ($mode eq 'view') { &view; }
elsif ($mode eq 'list') { &display_list; }
elsif ($mode eq 'mail') { &mailform; }
&axs_check;
&mobile;
&display_top;


#----------------#
#  携帯端末振り分け  #
#----------------#
sub mobile {

	$imode ='i-mode.cgi';		#i-mode用
	$tuka ='tuka.hdml';		#TUKA用

	if($ENV{'HTTP_USER_AGENT'} =~ /docomo/i){	# i-mode
		$browser   = "html";

	}elsif($ENV{'HTTP_USER_AGENT'} =~ /^j\-phone/i){# J-PHONE
		$browser   = "html";

	}elsif($ENV{'HTTP_USER_AGENT'} =~ /^KDDI/i){# XHTML(ezweb)
		$browser   = "html";

	}elsif($ENV{'HTTP_USER_AGENT'} =~ /^up\.browser/i){# TUKA
		$browser   = "hdml";

	}elsif($ENV{'HTTP_USER_AGENT'} =~ /^DDIPOCKET/i){# H"
		$browser   = "html";

	}elsif($ENV{'HTTP_USER_AGENT'} =~ /^(ASTEL)/i){	# ASTEL
		$browser   = "html";
	}

	if ( $browser eq 'html' ) {
		print "Location: $imode\n\n";
	} elsif ( $browser eq "hdml" ) {
		print "Location: $tuka\n\n";
	}

}

#----------------#
#  アクセス制限  #
#----------------#
sub axs_check {
	# ホスト名を取得
	&get_host;

	local($flag)=0;
	foreach (split(/\s+/, $deny)) {
		s/\*/\.\*/g;
		if ($host =~ /$_/i) { $flag=1; last; }
	}
	if ($flag) { &error("アクセスを許可されていません"); }
}

#----------------#
#  登録カテゴリー取得  #
#----------------#
sub get_cat {
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$date,$cat,$name) = split(/<>/);
		$flag=0;
		if($cat ne ''){
			foreach (@list_cat){
				if(index($cat,$_) >= 0) {$flag=1}
			}
		push(@list_cat,$cat) if !$flag;
		}
	}
	close(IN);
}


#----------------#
#  登録キーワード取得  #
#----------------#
sub get_kwd{
	open(IN,"$logfile") || &error("Open Error : $logfile");
	loop:while (<IN>) {
		($no,$date,$cat,$name,$sub,$com,$kwd,$host,$tail,$w,$h,$tim) = split(/<>/);
		@kwd = split(/,/, $kwd);
		foreach (@kwd){
			$flag=0;
			if($_){
				foreach $key(@list_kwd){
					if(index($key,$_) >= 0) {$flag=1}
				}
				push(@list_kwd,$_) if !$flag;
				if(@list_kwd >= $no_kwd) {last loop;}
			}
		}
	}
	close(IN);}

#----------------#
#  トップページ表示  #
#----------------#
sub display_top{

	&header;

	# トップロゴ表示

	#最終更新日取得
	open(IN,"$logfile") || &error("Open Error : $logfile");
	@_=<IN>;
	($no,$date,$cat,$name,$sub,$com)  = split(/<>/,$_[0]);
	close(IN);

	print "<br>\n";
	print "<p align=center><img src='img/bnr_300x250.jpg'></p>\n";
	print "<p align='center'><big>プロ漫画家オフィシャルブース</big></p>\n";
	print "<p align='center'>ビッグ錠を中心に多くの漫画家（飲み仲間？）が集合！！<br>ここでしか手に入らない「お宝」を多数出展<br>タイミングが合えば実際に漫画家に会えるチャンスも！!</p>\n";
	print "<p class='cap' align=center>(C) 2006 Ryupro, Inc. Allrights Reserved.</p>\n";
	print "<h3>Updates</h3>\n";


	# 管理用ボタン表示
	if ($in{'pwd'} eq $pwd) {
		print "<div class=left>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
		print "<input type=hidden name=mode value=form>\n";
		print "<input type=submit value=\"新規記事追加\"></form>\n";
		print "</div>\n";
	}
	
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$i=0;
	
	while (<IN>) {
		($no,$date,$cat,$name,$sub,$com,$kwd,$host,$tail,$w,$h,$tim) = split(/<>/);

		$i++;
		if ($i > $p_log_top) { last; }

		print "<table width=100% class=box>\n";
		print "<tr><th class=box>\n";
		print "<div>\n";
		print "<a href=\"$script?mode=view&no=$no&cat=$cat\">≫$name</a>\n";

		print "&nbsp;&nbsp;<span class=cap>$date UP<span></div>\n";
		print "</th></tr></table>\n";

	}
	close(IN);

	if ($in{'pwd'} ne $pwd) {
		print "<div class='right'>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=mode value=admin>\n";
		print "<input type=submit value=\"管理用\"></form>\n";
		print "</div>\n";
	}
	
	&footer;
	exit;
}

#----------------#
#  記事リスト表示  #
#----------------#
sub display_list {

	&header;
	
	# 管理用ボタン表示
	if ($in{'pwd'} eq $pwd) {
		print "<div class=left>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
		print "<input type=hidden name=mode value=form>\n";
		print "<input type=submit value=\"新規記事追加\"></form>\n";
		print "</div>\n";
	}

	# キーワード前準備
	$in{'kwd'} =~ s/　/ /g;
	@kwd = split(/\s+/, $in{'kwd'});

	# 検索処理
	open(IN,"$logfile") || &error("Open Error : $logfile");
	$i=0;

	while (<IN>) {
		($no,$date,$cat,$name,$sub,$com,$kwd,$host,$tail,$w,$h,$tim) = split(/<>/);

		# 検索処理
		$flag=1;
		if ($in{'cat'}){#カテゴリー検索
				if(index($cat,$in{'cat'}) >= 0) {$flag=1} 
				else {$flag=0; }
		}
		else{#キーワード検索
			foreach $key (@kwd){
				if($_ =~ /$key/i && $in{'no'} ne $no) {$flag=1} #記事viewからのリンクでは元記事を省く
				else {$flag=0; last; }
			}
		}

		if (!$flag){next;}
			
		$i++;
		if ($i < $page + 1) { next; }
		if ($i > $page + $p_log) { last; }

		print "<table width=100% class=box>\n";
		print "<tr><th class=box>\n";
		print "<div>\n";
		print "<a href=\"$script?mode=view&no=$no&cat=$cat\">≫$name</a>\n";

		print "</div>\n";

		print "</th></tr>\n";
		print "<tr><td class=box>\n";

		# 記事要約
		$com=~ s/<br>/ /g;
		($summary,undef) = &fold($com,150);
		if(length($com) >= 150){
			$summary .= ". . .";
		}

		if ($tail) {
			if ($w && $h) {
				$w /= 4; $h /= 4;
				$wh="width=$w height=$h";
					print "<img src=\"$ImgDir$no$tail\" border=0 $wh class=view align=left>\n";
			}
		}


		# 記事要約表示
		print "<p>$summary</p>\n";

		# 修正削除ボタン表示
		if ($in{'pwd'} eq $pwd) {
			print "<form action=\"$script\" method=\"POST\">\n";
			if($cat){
				print "<input type=hidden name=cat value=\"$cat\">\n";
			}else{
				print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
			}
			print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
			print "<input type=hidden name=no  value=\"$no\">\n";
			print "<input type=checkbox name=lock value=1 checked>\n";
			print "<select name=mode>\n";
			print "<option value=\"edit\">修正\n";
			print "<option value=\"del\">削除\n";
			print "</select>\n";
			print "<input type=submit value=\"送信\">\n";
			print "</form>\n";
		}
		print "</td></tr></table>\n";
	}
	close(IN);

	print "<div class=center>$in{'cat'} 該当する記事が見つかりませんでした。</div>\n" if !$i;


	#ページ処理
	$next = $page + $p_log;
	$back = $page - $p_log;

	print "<table align=center><tr>\n" if $back >= 0 or $next < $i;

	if ($back >= 0) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=mode value=\"list\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=kwd value=\"$in{'kwd'}\">\n";
		print "<input type=hidden name=page value=\"$back\">\n";
		print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
		print "<input type=submit value=\"≪ 前の$p_log件\"></form></td>\n";
	}
		
	if ($next < $i) {
		print "<td><form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=mode value=\"list\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=kwd value=\"$in{'kwd'}\">\n";
		print "<input type=hidden name=page value=\"$next\">\n";
		print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
		print "<input type=submit value=\"次の$p_log件 ≫\"></form></td>\n";
	}
	print "</tr></table>\n" if $back >= 0 or $next < $i;

	if ($in{'pwd'} ne $pwd) {
		print "<div class=left><a href=\"javascript:history.back()\">≪戻る</a></div>\n";
	}

	if ($in{'pwd'} ne $pwd) {
		print "<div class=right>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=kwd value=\"$in{'kwd'}\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=mode value=admin>\n";
		print "<input type=submit value=\"管理用\"></form>\n";
		print "</div>\n";
	}
	else{
		print "<div class=right>\n";
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=cat value=\"$in{'cat'}\">\n";
		print "<input type=hidden name=page value=\"$page\">\n";
		print "<input type=hidden name=mode value=list>\n";
		print "<input type=submit value=\"ログオフ\"></form>\n";
		print "</div>\n";
	}

	&footer;

	exit;
}

#----------------#
#  記事表示  #
#----------------#
sub view{

	&header;


	$i=0;
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {

		($no,$date,$cat,$name,$sub,$com,$kwd,$host,$tail,$w,$h,$tim) = split(/<>/);

		# URL自動リンク
		&auto_link($com);
		if ($in{'no'} eq "$no") {

			print "<table width=100% class=box>\n";
			print "<tr><th class=box>\n";
			print "<h4>$name</h4>\n";
			print "</th></tr>\n";
			print "<tr><td class=box>\n";

			print "<table width=100% class=inbox align=left>\n";
			print "<tr valign=top>\n";
			print "<td>\n";

			# 添付ファイルが存在する場合
			if (-e "$ImgDir$no$tail") {

				if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
					if ($w && $h) { $wh="width=$w height=$h"; }
					else { $wh=""; }
					print "<a href=\"$ImgDir$no$tail\" target='_blank'><img src=\"$ImgDir$no$tail\" border=0 $wh class=view align=left></a>\n";
				} 

			}

			print "<h5>$sub</h5>\n" if $sub;
			print "<p>$com</p>\n";
			print "<p>($date 更新)\</p>\n";
			print "</td></tr></table>\n";
			print "</td></tr></table>\n";

		# 関連キーワード・リンク表示
		if($kwd ne ""){
			print "<table width=100% class=box>\n";
			print "<tr><th class=box>\n";
			print "<div>関連キーワード</div>\n";
			print "</th></tr>\n";
			print "<tr><td class=box>\n";
			$kwd =~ s/　/ /g;
			@kwd = split(/,/, $kwd);
			foreach(@kwd){
				print "<div><a href=\"$script?mode=list&no=$no&kwd=$_\">≫$_<a></div>\n";
			}
			print "</td></tr></table>\n";
		}
		print "<div class=left><a href=\"javascript:history.back()\">≪戻る</a></div>\n";

			last;
		}
	}
	close(IN);
	&footer;
	exit;
}

#----------------#
#  メールフォーム表示  #
#----------------#
sub mailform{

	&header;

	if ($in{'send'} ne "") { &display_msg("メールを送信しました"); }

	print "<div class=left>";
	print "Onefine Studio へのメールは、当フォームをご利用ください<br>";
	print " （必要事項をご記入の上、「メールを送信」ボタンを押してください）";
	print "</div>";
	print <<"EOM";
<form action="http://iswmail.infoseek.co.jp/mail/form.cgi" method="POST">
 <input type="hidden" name="thankyou" value="http://yoshihiroboxing.at.infoseek.co.jp/cgi-bin/index.cgi?mode=mail&send=1">
 <input type="hidden" name="Subject:" value="YOSHIHIRO BOXING GYM">

<table width=100% class=box>
<tr><th class=box>
<div>お名前</div>
</th></tr>
<tr><td class=box>
<input type=text name=name size=36>
</td></tr>
</table>

<table width=100% class=box>
<tr><th class=box>
<div>メールアドレス</div>
</th></tr>
<tr><td class=box>
<input type=text name="Reply-To:" size=36>
</td></tr>
</table>

<table width=100% class=box>
<tr><th class=box>
<div>メッセージ</div>
</th></tr>
<tr><td class=box>
<textarea name=comment cols=56 rows=20 wrap=soft></textarea>
</td></tr>
</table>

<table width=100% class=box>
<tr><th class=submit>
<div class=center><input type="submit" value="メールを送信"></div>
</td></tr></table>

</form>
EOM
	
	&footer;
	exit;
}

#----------------#
#  書きこみ処理  #
#----------------#
sub regist {
	# POSTチェック
	if (!&MethPost()) { &error("METHOD形式が POST でありません"); }

	# カテゴリー重複修正
	if ($in{'cat2'}) { $in{'cat'} = $in{'cat2'}; }

	# フォーム内容をチェック
	if ($in{'name'} eq "") { &error("タイトルが入力されていません"); }
	if ($in{'cat'} eq "") { &error("カテゴリーが入力されていません"); }

	# 時間を取得
	$ENV{'TZ'} = "JST-9";
	$time = time;
	($min,$hour,$mday,$mon,$year,$wday) = (localtime($time))[1..6];

	# 日時のフォーマット
	$date = sprintf("%04d.%02d.%02d",$year+1900,$mon+1,$mday);

	# ロック処理
	if ($lockkey) { &lock; }

	open(IN,"$logfile") || &error("Open Error : $logfile");
	@lines = <IN>;
	close(IN);

	($no,$dat,$cat,$nam,$com) = (split(/<>/, $lines[0]))[0,1,2,3,5];
	
	# 二重投稿チェック（記事修正時は除く）
	if (!$in{'edit'}){
		if ($in{'name'} eq $nam && $in{'comment'} eq $com && $in{'cat'} eq $cat) { &error("二重投稿は禁止です"); }
	}
	
	if ($w_regist && $time - $tim < $w_regist)
		{ &error("連続投稿はもうしばらく時間を置いてからお願い致します"); }

	# 記事Noを採番
	if ($in{'pastlog'}){
		$no=$in{'no'};
	}
	else{
		$no++;
	}

	# 最大記事数処理
	while ($max <= @lines) {
		$del = pop(@lines);
		local($no,$dat,$cat,$nam,$sub,$com,$kwd,$hos,$tail)
							= split(/<>/, $del);
		if (-e "$ImgDir$no$tail") { unlink("$ImgDir$no$tail"); }
	}
	
	# 画像ファイル削除（記事修正用）
	if ($in{'delfile'}) {
		unlink("$ImgDir$in{'no'}$in{'tail'}") if (-e "$ImgDir$in{'no'}$in{'tail'}");
	}
	# ファイル添付処理
	elsif ($in{'upfile'}) { &UpFile; }
	# ファイル名変更（記事修正用）
	elsif ($in{'tail'}) { 
		rename("$ImgDir$in{'no'}$in{'tail'}","$ImgDir$no$in{'tail'}")	 if (-e "$ImgDir$in{'no'}$in{'tail'}");
		$tail=$in{'tail'};
		$W = $in{'w'};
		$H = $in{'h'};
	}

	# 更新
	if ($in{'pastlog'}){ #過去記事として更新
		@lines=();
		open(IN,"$logfile") || &error("Open Error: $logfile");
		while (<IN>) {
			($no,$dat,$cat,$name,$sub,$com,$kwd,$host,$tail,$W,$H,$time) = split(/<>/);
			if ($in{'no'} == $no) {
				$_="$no<>$date<>$in{'cat'}<>$in{'name'}<>$in{'sub'}<>$in{'comment'}<>$in{'kwd'}<>$host<>$tail<>$W<>$H<>$time<>\n";
			}
			push(@lines,$_);
		}
		close(IN);
	}
	else{ #新記事として更新
		unshift(@lines,"$no<>$date<>$in{'cat'}<>$in{'name'}<>$in{'sub'}<>$in{'comment'}<>$in{'kwd'}<>$host<>$tail<>$W<>$H<>$time<>\n");
	}

	# 出力
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @lines;
	close(OUT);
	
	# 旧記事削除（修正処理）
	if ($in{'no'} && !$in{'pastlog'}) {&del; }

	# ロック解除
	if ($lockkey) { &unlock; }

	&display_list
	
}

#--------------------#
#  画像アップロード  #
#--------------------#
sub UpFile {
	local($macbin,$fname,$flag,$upfile);

	# 画像処理
	$macbin=0;
	foreach (@in) {
		if (/(.*)Content-type:(.*)/i) { $tail=$2; }
		if (/(.*)filename=(.*)/i) { $fname=$2; }
		if (/application\/x-macbinary/i) { $macbin=1; }
	}
	$tail =~ s/\r//g;
	$tail =~ s/\n//g;
	$fname =~ tr/\"\x0D\x0A//d;

	# ファイル形式を認識
	$flag=0;
	if ($tail =~ /image\/gif/i) { $tail=".gif"; $flag=1; }
	if ($tail =~ /image\/jpeg/i) { $tail=".jpg"; $flag=1; }

	if (!$flag) {
		if ($fname =~ /\.gif$/i) { $tail=".gif"; $flag=1; }
		if ($fname =~ /\.jpe?g$/i) { $tail=".jpg"; $flag=1; }
	}
	# アップロード失敗処理
	if (!$flag && !$clip_err) { return; }
	elsif (!$flag && $clip_err) {
		&error("アップロードできないファイル形式です");
	}

	$upfile = $in{'upfile'};

	# マックバイナリ対策
	if ($macbin) {
		$length = substr($upfile,83,4);
		$length = unpack("%N",$length);
		$upfile = substr($upfile,128,$length);
	}

	# 添付データを書き込み
	$ImgFile = "$ImgDir$no$tail";
	if (!open(OUT,"> $ImgFile")) {
		if ($clip_err) { &error("画像のアップロードに失敗しました"); }
	}
	binmode(OUT);
	binmode(STDOUT);
	print OUT $upfile;
	close(OUT);

	chmod (0666,$ImgFile);

	# 画像サイズ取得
	if ($tail eq ".jpg") { ($W, $H) = &JpegSize($ImgFile); }
	elsif ($tail eq ".gif") { ($W, $H) = &GifSize($ImgFile); }
	elsif ($tail eq ".png") { ($W, $H) = &PngSize($ImgFile); }

	# 画像表示縮小
	if ($W > $MaxW || $H > $MaxH) {
		$W2 = $MaxW / $W;
		$H2 = $MaxH / $H;
		if ($W2 < $H2) { $key = $W2; }
		else { $key = $H2; }
		$W = int ($W * $key) || 1;
		$H = int ($H * $key) || 1;
	}
}

#------------------#
#  　記事削除　  #
#------------------#
sub del {

	#ロック解除確認
	if ($in{'lock'}) {&error("ロック<input type=checkbox checked> を解除して下さい"); }

	local($flag,$no,$dat,$cat,$nam,$sub,$com,$kwd,$hos,$tail,$upfile,@new);

	# ロック処理
	if ($lockkey) { &lock; }

	$flag=0;
	@new=();
	open(IN,"$logfile") || &error("Open Error : $logfile");
	while (<IN>) {
		($no,$dat,$cat,$nam,$sub,$com,$kwd,$hos,$tail) = split(/<>/);
		if ($in{'no'} == $no) {
			$flag=1;
			$upfile="$no$tail";
			next;
		}
		push(@new,$_);
	}
	close(IN);

	if ($flag == 0) { &error("該当記事が見当たりません"); }

	# ログを更新
	open(OUT,">$logfile") || &error("Write Error : $logfile");
	print OUT @new;
	close(OUT);

	# 添付ファイルがあれば削除
	unlink("$ImgDir$upfile") if (-e "$ImgDir$upfile");

	# ロック解除
	if ($lockkey) { &unlock; }

	&display_list
}

#------------------#
#  記事送信フォーム  #
#------------------#
sub form {

	#ロック解除確認
	if ($in{'lock'}) {&error("ロック<input type=checkbox checked> を解除して下さい"); }

	local($flag,$no,$dat,$cat,$nam,$sub,$com,$kwd,$hos,$tail,$w,$h,$upfile,@new);

	if ($edit){#修正フォーム用
		$flag=0;
		open(IN,"$logfile") || &error("Open Error : $logfile");
		while (<IN>) {
			($no,$dat,$cat,$nam,$sub,$com,$kwd,$hos,$tail,$w,$h) = split(/<>/);
			if ($in{'no'} == $no) {
				$flag=1;
				last;
			}
		}
		close(IN);
		if ($flag == 0) { &error("該当記事が見当たりません"); }
		$com =~ s/<br>/\r/g;
	}

	&header;

	print <<"EOM";
<form action="$script" method="POST" enctype="multipart/form-data">
<input type=hidden name=mode value="regist">
<input type=hidden name=no value="$in{'no'}">
<input type=hidden name=pwd value="$in{'pwd'}">
<input type=hidden name=tail value="$tail">
<input type=hidden name=w value="$w">
<input type=hidden name=h value="$h">
EOM

	if ($edit){
		print "<h2>記事修正フォーム</h2>\n";
		print "<div class=left><font color=\"#ff0000\">※修正する部分のみ変更してください。</font></div>\n";
		print "<input type=hidden name=edit value=1>\n";#（二重投稿チェックをさせない）
	}
	else{
	print "<h2>新規記事追加フォーム</h2>\n";
	}
	
	print <<"EOM";
<table width=100% class=box>
<tr><th class=box>
<div>カテゴリー<font color=red>（必須）</font></div>
</th></tr>
<tr><td class=box>
EOM

	print "<select name=cat>\n";
	print "<option value=\"\">\n";
	foreach (@list_cat){
		print "<option value=\"$_\"";
		print " selected " if index($in{'cat'},$_) >= 0;
		print ">$_\n";
	}
	print "</select> ";

	print <<"EOM";
<input type=text name=cat2 size=28>
</td></tr>
<tr><td>
<div>この記事が属するカテゴリーを、左のメニューから選択して下さい。<br>新しいカテゴリーを設定するには、右の入力欄に入力して下さい。</div>
</td></tr></table>

<table width=100% class=box>
<tr><th class=box>
<div>タイトル<font color=red>（必須）</font></div>
</th></tr>
<tr><td class=box>
<input type=text name=name size=36 value="$nam">
</td></tr>
<tr><td>
<div>この記事の、タイトルを入力して下さい。</div>
</td></tr></table>

<table width=100% class=box>
<tr><th class=box>
<div>サブタイトル</div>
</th></tr>
<tr><td class=box>
<input type=text name=sub size=56 value="$sub">
</td></tr>
<tr><td>
<div>この記事の、サブタイトルを入力して下さい。</div>
</td></tr></table>

<table width=100% class=box>
<tr><th class=box>
<div>画像ファイル</div>
</th></tr>
<tr><td class=box>
<input type=file name=upfile size=36>
</td></tr>

EOM

	#画像フォーム（記事修正用）
	if ($in{'no'}){
		print "<tr><td class=box>\n";
		print "<div>\n";
		print "<input type=radio name=delfile value=0 checked>画像を使用する\n";
		print "<input type=radio name=delfile value=1>画像を使用しない\n";
		print "</div>\n";
		print "</td></tr>\n";
	}
	
	print <<"EOM";
<tr><td>
<div>画像ファイルを選択して、この記事に画像を表\示できます。（対応ファイル：jpeg・gif 形式）</div>
</td></tr>
</table>

<table width=100% class=box>
<tr><th class=box>
<div>コメント</div>
</th></tr>
<tr><td class=box>
<textarea name=comment cols=56 rows=20 wrap=soft>$com</textarea>
</td></tr>
<tr><td>
<div>この記事のコメントを入力して下さい。<br>
コメント内での、URL（http://・https://・ftp://で始まるもの）は、リンク表\示されます。<br>
（メールアドレスは、頭に「mailto:」を入力することで、リンク表\示されます。）</div>
</td></tr></table>

<table width=100% class=box>
<tr><th class=box>
<div>関連キーワード</div>
</th></tr>
<tr><td class=box>
<input type=text name=kwd size=56 value="$kwd">
</td></tr>
<tr><td>
<div>関連キーワードを設定すると、この記事に関連する記事を素早く参照できます。<br>
この記事と関連させたい記事の、どちらにも含まれるキーワードを入力して下さい。<br>
キーワードは、「，」カンマ（半角）区切りで、いくつでも設定できます。</div>
</td></tr></table>

<table width=100% class=box>

EOM

	#記事更新方法選択
	if ($in{'no'}){
		print "<tr><th class=box>\n";
		print "<div>記事更新方法</div>\n";
		print "</th></tr>\n";
		print "<tr><td class=box>\n";
		print "<div>\n";
		print "<input type=radio name=pastlog value=1 checked>過去記事として更新（位置変更なし）<br>\n";
		print "<input type=radio name=pastlog value=0>最新記事として更新（最新記事トップへ移動）\n";
		print "</div>\n";
		print "</td></tr>\n";
		print "<tr><td>\n";
		print "<div>記事の更新方法を設定して下さい。通常は、過去記事として更新して下さい。<br>\n";
		print "<div>記事の順序をトップに移動する場合は、最新記事として更新することができます。</div>\n";
		print "</td></tr>\n";
		print "</table>\n";
	}
	
	print <<"EOM";

<table width=100% class=box>
<tr><th class=submit>
<div class=center><input type=submit value="記事を送信"></div>
</td></tr></table>
</form>
<div class=left><a href="javascript:history.back()">≪戻る</a></div>
<br>
EOM
	&footer;
	exit;
}

#----------------#
#  デコード処理  #
#----------------#
sub decode {
	&ReadParse;
	while (($key,$val) = each %in) {
		if ($key ne "upfile") {
			# シフトEUCコードに変換
			&jcode'convert(*val, "euc", "", "z");

			# タグ処理
			$val =~ s/&/&amp;/g;
			$val =~ s/"/&quot;/g;
			$val =~ s/</&lt;/g;
			$val =~ s/>/&gt;/g;

			# 全角スペースを半角スペースに統一
			$val =~ s/　/ /g;

			# 改行処理
			if ($key eq "comment") {
				$val =~ s/\r\n/<br>/g;
				$val =~ s/\r/<br>/g;
				$val =~ s/\n/<br>/g;
			} else {
				$val =~ s/\r//g;
				$val =~ s/\n//g;
			}

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

		}
		$in{$key} = $val;
	}
	$mode = $in{'mode'};
	$page = $in{'page'};
}

#--------------#
#  HTMLヘッダー  #
#--------------#
sub header {
	$head_flag = 1;
	print "Content-type: text/html\n\n";
	print <<"EOM";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=EUC-JP">
<link href="lib/standard.css" rel="stylesheet" type="text/css">
<title>$title</title>
<meta name="Keywords" content="$meta_keyword">
<meta name="Description" content="$meta_description">
</head>
<body>
EOM

	&get_cat;

	print "<table width=100% height=100% cellpadding=0 cellspacing=0 border=0>\n";
	print "<tr>\n";
	print "<td width=180 valign=top>\n";

	#カテゴリーリンク表示
	print "<table width=180 cellpadding=5 cellspacing=0 border=0>\n";
	print "<tr><td class=logo>\n";
	print "<br> \n";
	print "</td></tr>\n";

	if ($in{'cat'} eq "" && $mode ne "mail" && !$in{'kwd'}){
		print "<tr><td class=thislink>\n";
	}
	else{
		print "<tr><td class=link>\n";
	}

	if ($in{'pwd'} ne $pwd) {
			if ($in{'cat'} eq $_ && $mode ne "mail" && !$in{'kwd'}){
				print "<a href=\"$script\">≫Top</a>\n";
			}
			else{
				print "<a href=\"$script\" class=\"white\">≫Top</a>\n";
			}	}
	else{
		print "<form action=\"$script\" method=\"POST\">\n";
		print "<input type=hidden name=mode value=\"list\">\n";
		print "<input type=hidden name=cat value=\"$_\">\n";
		print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
		print "<input type=submit value='全記事'></form>\n";
	}
	print "</td></tr>\n";

	foreach(@list_cat){

		if ($in{'cat'} eq $_){
			print "<tr><td class=thislink>\n";
		}
		else{
			print "<tr><td class=link>\n";
		}

		if ($in{'pwd'} ne $pwd) {
			if ($in{'cat'} eq $_){
				print "<a href=\"$script?mode=list&cat=$_\">≫",$_,"</a>\n";
			}
			else{
				print "<a href=\"$script?mode=list&cat=$_\" class=\"white\">≫",$_,"</a>\n";
			}
		}
		else{
			print "<form action=\"$script\" method=\"POST\">\n";
			print "<input type=hidden name=mode value=\"list\">\n";
			print "<input type=hidden name=cat value=\"$_\">\n";
			print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";
			print "<input type=submit value=\"$_\"></form>\n";
		}
		print "</td></tr>\n";
	}

	print "</table>\n";
	print "</td>\n";
	print "<td valign=\"top\" class=body>\n";
}

#--------------#
#  HTMLフッター  #
#--------------#
sub footer {
	print <<"EOM";
<td width=180 valign=top>
<table width=180 cellpadding=5 cellspacing=0 border=0>
<tr><th class=link>
<div class="white">記事検索</div>
</th></tr>
<tr><td class=link>
<form method="GET" action="$script">
<input type=hidden name=mode value=list>
<div align=center>
<input type=text name=kwd size=16><br>
<input type=submit value="検索"></div>
</form>
</td></tr>
EOM

	&get_kwd;

	print "<tr><th class=link>\n";
	print "<div class=\"white\">最新登録キーワード</div> \n";
	print "</th></tr>\n";
	foreach(@list_kwd){
		print "<tr><td class=kwd>\n";
		print "<a href=\"$script?mode=list&kwd=$_\" class=\"white\">",$_,"</a>\n";
		print "</td></tr>\n";
	}

	print <<"EOM";
</table>

</table>
</td>
</td>
</tr>
</table>
</body>
</html>
EOM
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	if ($lockflag) { &unlock; }

	&header if (!$head_flag);
	print "<table width=100% class=box>\n";
	print "<tr><th class=box>\n";
	print "<div>処理を続行できません</div>\n";
	print "</th></tr>\n";
	print "<tr><td class=box>\n";
	print "<div class='error'>$_[0]</div>\n";
	print "</td></tr></table>\n\n";
	print "<div class=left><a href=\"javascript:history.back()\">≪戻る</a></div>\n";
	&footer;
	exit;
}

#--------------#
#  メッセージ表示  #
#--------------#
sub display_msg {

	print "<table width=100% class=box>\n";
	print "<tr><td class=box>\n";
	print "<div class='error'>$_[0]</div>\n";
	print "</td></tr></table>\n\n";
	print "<div class=left><a href=\"$script\">≪トップへ戻る</a></div>\n";
	&footer;
	exit;
}

#----------------#
#  ホスト名取得  #
#----------------#
sub get_host {
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};

	if ($host eq "" || $host eq $addr) {
		$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
	}
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	# 古いロックは削除する
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 30) { &unlock; }
	}
	local($retry) = 5;
	# symlink関数式ロック
	if ($lockkey == 1) {
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) { &error('LOCK is BUSY'); }
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		while (!mkdir($lockfile, 0755)) {
			if (--$retry <= 0) { &error('LOCK is BUSY'); }
			sleep(1);
		}
	}
	$lockflag=1;
}

#--------------#
#  ロック解除  #
#--------------#
sub unlock {
	if ($lockkey == 1) { unlink($lockfile); }
	elsif ($lockkey == 2) { rmdir($lockfile); }
	$lockflag=0;
}


#--------------#
#  自動リンク  #
#--------------#
sub auto_link {
	$_[0] =~ s/([^=^\"]|^)((http|https|ftp)\:[\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2\" target='_blank'>$2<\/a>/g;
	$_[0] =~ s/([^=^\"]|^)(mailto:)([\w\.\~\-\/\?\&\=\@\;\#\:\%]+)/$1<a href=\"$2$3\" target='_blank'>$3<\/a>/g;
}

#------------------#
#  JPEGサイズ認識  #
#------------------#
sub JpegSize {
	local($jpeg) = @_;
	local($t, $m, $c, $l, $W, $H);

	open(JPEG, "$jpeg") || return (0,0);
	binmode JPEG;
	read(JPEG, $t, 2);
	while (1) {
		read(JPEG, $t, 4);
		($m, $c, $l) = unpack("a a n", $t);

		if ($m ne "\xFF") { $W = $H = 0; last; }
		elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) {
			read(JPEG, $t, 5);
			($H, $W) = unpack("xnn", $t);
			last;
		}
		else {
			read(JPEG, $t, ($l - 2));
		}
	}
	close(JPEG);
	return ($W, $H);
}

#-----------------#
#  GIFサイズ認識  #
#-----------------#
sub GifSize {
	local($gif) = @_;
	local($data);

	open(GIF,"$gif") || return (0,0);
	binmode(GIF);
	sysread(GIF,$data,10);
	close(GIF);

	if ($data =~ /^GIF/) { $data = substr($data,-4); }

	$W = unpack("v",substr($data,0,2));
	$H = unpack("v",substr($data,2,2));
	return ($W, $H);
}

#--------------------#
#  管理パスワード照合 #
#--------------------#
sub admin {

	&header;
	# 見出し表示
	print "<h2>管理画面ログイン</h2>\n";
	print "<table width=100% class=box>\n";
	print "<tr><th class=box>\n";
	print "<div>パスワード入力</div>\n";
	print "</th></tr>\n";
	print "<tr><td class=box>\n";
	print"<form action=\"$script\" method=\"POST\">\n";
	print"<input type=hidden name=mode value=\"list\">\n";
	print"<input type=hidden name=cat value=\"$in{'cat'}\">\n";
	print"<input type=hidden name=kwd value=\"$in{'kwd'}\">\n";
	print"<input type=hidden name=page value=\"$page\">\n";
	print"<input type=password name=pwd size=8>\n";
	print"<input type=submit value=' 認証 '></form>\n";
	print"</td</tr></table>\n";
	print "<div class=left><a href=\"javascript:history.back()\">≪戻る</a></div>\n";
	&footer;
	exit;

}

#------------------#
#  チェックモード  #
#------------------#
sub check {
	&header;
	print "<h2>Check Mode</h2>\n";
	print "<ul>\n";

	# ログファイル
	if (-e $logfile) {
		print "<li>ログファイル：パスＯＫ！\n";
		if (-r $logfile && -w $logfile) { print "<li>ログパーミッション：OK!\n"; }
		else { print "<li>ログパーミッションが不正です。\n"; }
	} else { print "<li>ログファイルのパスが不正です： $logfile\n"; }

	# 画像ディレクトリ
	if (-d $ImgDir) {
		print "<li>アップロードディレクトリ：パスOK!\n";
		if (-r $ImgDir && -w $ImgDir && -x $ImgDir) {
			print "<li>アップロードディレクトリのパーミッション：OK!\n";
		} else { print "<li>アップロードディレクトリのパーミッションが不正です。\n"; }
	} else { print "<li>アップロードディレクトリのパスが不正です： $ImgDir\n"; }

	# ロックディレクトリ
	print "<li>ロック形式：";
	if ($lockkey == 0) { print "ロック設定なし\n"; }
	else {
		if ($lockkey == 1) { print "symlink\n"; }
		else { print "mkdir\n"; }
		($lockdir) = $lockfile =~ /(.*)[\\\/].*$/;
		print "<li>ロックディレクトリ：$lockdir\n";

		if (-d $lockdir) {
			print "<li>ロックディレクトリのパス：OK\n";
			if (-r $lockdir && -w $lockdir && -x $lockdir) {
				print "<li>ロックディレクトリのパーミッション：OK\n";
			} else {
				print "<li>ロックディレクトリのパーミッション：NG → $lockdir\n";
			}
		} else { print "<li>ロックディレクトリのパス：NG → $lockdir\n"; }
	}

	print "</ul>\n";
	&footer;
	exit;
}


__END__

