#!/usr/bin/perl
## Sun Board v2.3 (1999/09/05) 
## by KENT WEB
## E-MAIL: webmaster@kent-web.com
## WWW: http://www.kent-web.com/
$ver = 'Sun Board v2.3';	# バージョン情報（編集不要）
$remodel = 'SunClip Ver1.24';	# アレンジバージョン情報 by Season 
## ---[注意事項・合意事項]-------------------------------------------------------
## 1. このスクリプトはフリーソフトです。
## 2. このスクリプトを使用したいかなる損害に対して作者はその責任を一切負いません。
## 3. このスクリプトは、Sunordを元にseasonが改造したものです。
##    このスクリプトに関する質問は、seasonにお願いします。
## 4. 掲示板下部にある著作権表示部は絶対に削除しないで下さい。
## ------------------------------------------------------------------------------
## Script-Name：SunClip Ver1.24 (SunBord＠Nifty改造バージョン）
##    Modified：by Season (2002/02/08)
##      e-mail：season.aki@nifty.com
##    HomePage：http://homepage1.nifty.com/mystaff/
## ------------------------------------------------------------------------------
## 2001/05/05 Ver1.21 画像タイトル表示ルーチンのバグを修正
## 2002/01/18 Ver1.22 HTML同時出力機能の出力件数制御の不具合を修正。
## 2002/01/18 Ver1.23 HTML同時出力にFORM形式とTEXT形式の出力形式を追加
## 2002/01/18 Ver1.24 過去ログの検索結果改ページ処理の不具合を修正
###################################
###　　　　基本設定　　　　    ####
###################################
require './jcode.pl';   		 # 文字コードライブラリ取込
require './cgi-lib.pl';			 # cgiライブラリ取込

# CGIスクリプト自身をURLで指定
$script  = "http://www.fujikou-biz.com/cgi/sunclip_3/sunclip.cgi";
$setup   = "http://www.fujikou-biz.com/cgi/sunclip_3/setup.cgi";

# HTML表示ファイルの保存ディレクトリ（フルパスだと / から記述する）
$htm_dir = "./../sunclip3_html/"; 	 # 表示ファイルディレクトリ (フルパスだと / から)

# 添付ファイルの保存ディレクトリ（フルパスだと / から記述する）
$img_dir = "./../sunclip3_html/img";

# HTML表示ファイル (index.html) のＵＲＬ指定
$htm_url = "http://www.fujikou-biz.com/cgi/sunclip3_html/";

# 添付ファイルアップロード先のＵＲＬ指定（http://から指定する）
$img_url = "http://www.fujikou-biz.com/cgi/sunclip3_html/img";

###################################
###　　　基本設定終了　　　    ####
###################################

##################################
##      その他の応用設定       ###
##################################
$nocashe   = 1;				# ブラウザのキャッシュ取込を拒否 (0=no 1=yes)
$ssheet    = 1;				# スタイルシートの適用 (0=no 1=yes)
$wrap      = 'soft';			# 改行形式 (soft=手動 hard=強制)
$method    = 'POST';			# method形式 (POST/GET)
$logfile   = "./sunclip.log";		# ログファイル名
$config    = "./sunclip.cfg";		# 設定ファイル名 (フルパスだと / から)
$htmfile   = "page1.html";		# 表示ファイルHTML(第1ページ)
$nexthtm   = "page2.html";		# 表示ファイルHTML(第2ページ)
$lockkey   = 1;				# ファイルロック処理(mkdir関数）
$lockdir  = './sunclip_lock';		# ロックdir名

# タグ広告挿入オプション (FreeWebなど）
# → <!--上部--> <!--下部--> の代わりに「広告タグ」を挿入する。
# → 広告タグ以外に、MIDIタグ や LimeCounter等のタグにも使用可能です。
$banner1 = '<!--上部-->';   # 表示部上部に挿入
$banner2 = '<!--下部-->';   # 表示部下部に挿入

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

#---(以下は「過去ログ」機能を使用する場合の設定です)---#
#
# 過去ログ用NOファイル
$nofile  = './pastno.dat';

# 過去ログのディレクトリ
# → sunroom.cgiと同一のディレクトリに作成するならばこのままでよい
# → フルパスなら / から記述（http://からではない）
# → 最後は必ず / で閉じる
$pastdir = './';

##################################
##     　 　設定終了　　       ###
##################################

# 設定データの読みこみ
&config_load;

## スタイルシート定義
$style = <<"EOM";			# スタイルシートのタグを記述
<STYLE type="text/css">
<!--
body,tr,td,th { font-size: $pt }
a:link    {font-size: $pt; text-decoration:none; color:$link; }
a:visited {font-size: $pt; text-decoration:none; color:$vlink; }
a:active  {font-size: $pt; text-decoration:none; color:$alink; }
a:hover   {font-size: $pt; text-decoration:underline; color:$alink; }
span      { font-size: $t_point }
big       { font-size: '16pt' }
small     { font-size: '10pt' }
-->
</STYLE>
EOM

# bodyタグを定義
local($BGIMG);
$BGIMG = "background=\"http://$bground\"" if($bground);
$body = "<body $BGIMG bgcolor=$bgcolor text=$text link=$link vlink=$vlink alink=$alink>";

#本文の背景画像指定にhttp://を付加
$COM_IMG = "background=\"http://$com_bgimg\"" if($com_bgimg);

# ディレクトリ指定で最後に / がついていたら切り捨てる
$htm_dir =~ s/\/$//;
$img_dir =~ s/\/$//;
$htm_url =~ s/\/$//;
$img_url =~ s/\/$//;

&form_decode;
if ($mode eq 'setup')       { &setup; }
elsif ($mode eq "howto")    { &howto; }
elsif ($mode eq 'regist')   { &regist; }
elsif ($mode eq 'form')     { &form; }
elsif ($mode eq 'form2')    { &form2; }
elsif ($mode eq 'find')     { &find; }
elsif ($mode eq 'past')     { &past; }
elsif ($mode eq 'admin_in') { &admin_in; }
elsif ($mode eq 'admin' || $mode eq 'delmsg') { &admin; }
elsif ($mode eq 'edit' || $mode eq 'admin_del') { &edit; }
&location;

## --- フォームからのデータ処理
sub form_decode {

	&ReadParse;
	while (($key,$val) = each %in) {
	
		if ($key ne "upfile") {
			# シフトJISコードに変換
			&jcode'convert(*val, "sjis", "", "z");

			# タグ処理
			if ($tagkey eq 2) {
				$val =~ s/<!--(.|\n)*-->//g;
				$val =~ s/<>/&lt\;&gt\;/g;
			} else {
				$val =~ s/</&lt\;/g;
				$val =~ s/>/&gt\;/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;
			}
		}

		$in{$key} = $val;
	}
	
	$mode    = $in{'mode'};
	$subj    = $in{'subj'};
	$comment = $in{'comment'};
	$img_pos = $in{'img_pos'};
	$page    = $in{'page'};
	
	# コメント本文中の許可タグの変換
	if ($tagkey == 1) { $comment = &tag_change($comment);}

	# 日時の取得
	$ENV{'TZ'} = "JST-9";
	($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	$week = $wday;
	$year += 1900;
	$mon++;
	if ($mon  < 10) { $mon  = "0$mon";  }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($min  < 10) { $min  = "0$min";  }

	# 日時のフォーマット
	if ($date_type) {
		@wday1 = (0,1,2,3,4,5,6);
		@wday2 = ('日','月','火','水','木','金','土');
		$youbi = $wday2[$week];
		$date = "$year年$mon月$mday日";
	}else {
		@wday1 = (0,1,2,3,4,5,6);
		@wday2 = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
		$youbi = $wday2[$week];
		$date = "$year/$mon/$mday";
	}

}

## --- 投稿フォーム１
sub form {
	# パスワードチェック
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います。"); }

	print "Content-type: text/html\n\n";
	print "<html>\n<head><title>$title</title></head>\n";
	print "<frameset rows=\"290\,*\">\n";
	print "<frame name=\"ue\" src=\"$script?mode=form2&pass=$in{'pass'}\">\n";
	print "<frame name=\"sita\" src=\"$htm_url/$htmfile#frame\">\n";
	print "<noframes>\n";
	print "$body\n";
	print "<center><font size=4>フレームが利用できないようです。\n";
	print "<P><a href=\"$script?mode=form2&pass=$in{'pass'}\">ここをクリック</a> して下さい。\n";
	print "</font></center>\n</body></noframes>\n";
	print "</frameset></html>\n";
	exit;
}

## --- 投稿フォーム２
sub form2 {
	# フォームサイズを定義
	&form_size;

	&header;
	print "<center><form action=\"$script\" method=\"$method\" enctype=\"multipart/form-data\" target=\"_top\">\n";
	print "<input type=hidden name=mode value=\"regist\">\n";

	$MaxData = int ($cgi_lib'maxdata / 1024);
	if ($gif)  { $FILE .= "GIF, "; }
	if ($jpeg) { $FILE .= "JPEG, "; }
	if ($png)  { $FILE .= "PNG, "; }
	if ($text) { $FILE .= "TEXT, "; }
	if ($lha)  { $FILE .= "LHA, "; }
	if ($zip)  { $FILE .= "ZIP, "; }
	if ($pdf)  { $FILE .= "PDF, "; }
	if ($midi) { $FILE .= "MIDI, "; }
	if ($word) { $FILE .= "WORD, "; }
	if ($excel){ $FILE .= "EXCEL, "; }
	if ($ppt)  { $FILE .= "POWERPOINT, "; }
	$FILE =~ s/\, $//;
	print "<table border=0>\n";
	print "<tr><td><b>投稿する記事を以下のフォームに記述し「送信する」ボタンを押して下さい。</b></td></tr>\n";
	print "<tr><td><small>　　・添付可能\ファイル ： $FILE</small></td></tr>\n";
	print "<tr><td><small>　　・最大投稿データ量は $MaxData KB までです。</small></td></tr>\n";
	print "</table>\n";
	print "<table border=1>\n";
	print "<tr><td nowrap><b>日　付</b></td>\n";
	print "<td><input type=text name=date value=\"$date\" size=18>\n";
	print "曜日<select name=week>\n";
		foreach(0 .. $#wday1) {
		   if ($week eq "$wday1[$_]") {
			print "<option value=\"$wday1[$_]\" selected>$wday2[$_]\n";
		   }else{
			print "<option value=\"$wday1[$_]\">$wday2[$_]\n";
		   }
		}
	print "</select></td></tr>\n";
	print "<tr><td nowrap><b>タイトル</b></td>\n";
	print "<td><input type=text name=subj size=\"$sub_wid\" value=\"$res_sub\">\n";
	print "<input type=submit value=\"送信する\">";
	print "<input type=reset value=\"リセット\"></td></tr>\n";
	print "<tr><td colspan=2><b>コメント</b><br>";
	print "<textarea name=comment cols=\"$com_wid\" rows=6 wrap=$wrap>$res_com</textarea></tr>\n";
	print "<tr><td nowrap><b>添付File</b></td>\n";
	print "<td><select name=img_pos>\n";
	@IMG_LOCATE = ('下','上','左','右');
	foreach (0 .. $#IMG_LOCATE) {
	    	print "<option value=\"$IMG_LOCATE[$_]\">文章の$IMG_LOCATE[$_]\n";
	}
	print "</select>";
	print "<input type=file Name=upfile size=56></td></tr>\n";
	print "</table></form></center>\n";
	&footer;
	exit;
}

## --- 書込み処理
sub regist {
	# 入力内容チェック
	if ($comment eq "") { &error("コメントに記入がありません。"); }

	# ロック開始
	if ($lockkey) { &file_lock; }

	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	# ホスト名を取得
	&get_host;

	# 記事Noカウント
	($knum,$kdate,$kweek,$ksubj,$kcom) = split(/<>/,$lines[0]);
	$num = $knum + 1;
 	while(length($num) < 3 ) { $num = '0' . "$num"; }
	
	# 最大記事数超を切り捨て
	$i=0;
	$stop=0;
	@new = ();
	@data= ();
	foreach (0 .. $#lines) {
		if ($i > $max-1) { $stop=1; }
		if (!$stop) { push(@new,$lines[$i]); }
		elsif ($stop && $pastkey) { push(@data,$lines[$i]); }
		$i++;
	}

	# 過去ログ更新
	if ($data[0]) { &pastlog; }

	# ファイル添付処理
	if ($in{'upfile'}) { &UpFile; }
	
	# ログをフォーマット
	unshift (@new,"$num<>$in{date}<>$in{week}<>$subj<>$comment<>$host<>$tail<>$W<>$H<>$img_pos<>\n");
	# ログを更新
	open(DB,">$logfile") || &error("Can't write $logfile");
	print DB @new;
	close(DB);

	# 全体の記事数を把握
	if ($pagelog < $#new+1) { $flag=1; }

	# HTMLファイルを生成（第１ページ）
	$write_file = "$htm_dir\/$htmfile";
	&html_regist;

	# HTMLファイルを生成（第２ページ）
	if ($flag) {
		$write_file = "$htm_dir\/$nexthtm";
		&html_regist;
	}

	# 新規記事をＨＴＭＬに挿入
	if ($ins_line) { &newlog_ins; }

	# ロック解除
	if (-d $lockdir) { rmdir($lockdir); }  # Lockdirの削除

	# HTMLファイルへ戻る
	&location;

	exit;
}

## --- HTML生成処理
sub html_regist {
	open(HTML,">$write_file") || &error("Can't write $write_file");

	# HTMLヘッダ部
	print HTML "<html>\n<head>\n";
	print HTML "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print HTML "<title>$title</title>\n";

	# スタイルシート適用
	if ($ssheet) { print HTML "$style\n"; }

	# キャッシュ取込拒否
	if ($nocashe) { print HTML "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n"; }

	print HTML "</head>\n";
	print HTML "$body\n";
	print HTML "<DIV ALIGN=CENTER>";
	print HTML "<a name=\"top\"></a>\n";

	#上部バナー挿入
	print HTML "$banner1<P>\n" if ($banner1 ne "<!--上部-->");

	# タイトル部
	if ($t_gif eq '') {
	     print HTML "<a href=\"$script?mode=howto\"><font color=\"$t_color\" size=\"$t_size\" face=\"$t_face\"><span><b>$title</b></span></font></a>\n";
	} else {
	     print HTML "<a href=\"$script?mode=howto\"><img src=\"http://$t_gif\" border=0></a>\n";
	}
	print HTML "<hr width=\"90%\" size=2>";

	# ひとことメッセージを表示
	$sunmsg =~ s/\r\n/<br>/g;
	$sunmsg =~ s/\r/<br>/g;
	$sunmsg =~ s/\n/<br>/g;

	print HTML "<center>$submsg</center>\n";

	# リンク部
	print HTML "<hr width=\"90%\" size=2>";
	print HTML "[<a href=\"http://$home\" target=\"_self\">HOME</a>]\n";
	print HTML "[<a href=\"$script?mode=find\">ワード検索</a>]\n";

	# 過去ログ
	if ($pastkey) {
	  print HTML "[<a href=\"$script?mode=past\">過去ログ</a>]\n";
	}
	
	print HTML "[<a href=\"$script?mode=admin_in\">管理画面</a>]\n";
	print HTML "[<a href=\"$setup?mode=login\">設定画面</a>]\n";
	print HTML "<hr width=\"90%\" size=2>";
	print HTML "<a name=\"frame\"></a>\n";

	# 記事数を定義
	if ($flag == 2) { 
		$start = $pagelog; $end = $#new; 
	}else {
	 	$start = 0;
	  	if ($i < $pagelog) { 
			$end = $i; 
		}else { 
			$end = $pagelog-1; 
		}
	}

	# 記事を展開
	foreach ($start .. $end) {
	  local($num,$date,$week,$subjct,$com,$host,$tail,$W,$H,$img_pos) = split(/<>/,$new[$_]);

	  if ($subjct eq "") { $subjct = "無題"; }
	  if ($autolink) { &auto_link($com); }		#コメント欄のＵＲＬをAutoLINKする。
	  
	  #曜日の色設定
	  $w_color = $sbj_color;			#平日の色
	  if ($week eq 6) {$w_color = $sat_color;}	#土曜日の色
	  if ($week eq 0) {$w_color = $sun_color;}	#日曜日の色

	 #ログの情報から添付ファイルのリンクを生成する
	 $CLIP = "";
	 if (-e "$img_dir\/$num$tail") {
	 	if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
	 		$CLIP = "<a href=\"$img_url\/$num$tail\" target='_blank'><img src=\"$img_url\/$num$tail\" width=$W height=$H border=0></a>\n";
	 	}else {
	 		$CLIP = "<a href=\"$img_url\/$num$tail\"><img src=\"$img_url\/$Clip_Icon\" border=0 alt='Download:$num$tail'></a> <b>$num$tail</b>\n";
	 	}
	 }

	  # 旧ログの添付ファイルの表示位置を修正
	  if (index("上,下,左,右",$img_pos) < 0) { $img_pos = "下"; }

	  # 添付ファイル画像の表示位置指定
	  if($img_pos eq "左") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width ='10%'>$CLIP</td><td $COM_IMG bgcolor=$com_back width='90%'><blockquote><font color=$com_font>$com</font></blockquote></td>"; }
	  if($img_pos eq "右") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width ='90%'><blockquote><font color=$com_font>$com</font></blockquote></td><td $COM_IMG bgcolor=$com_back width='10%'>$CLIP</td>"; }
	  if($img_pos eq "上") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width='100%'><blockquote><font color=$com_font>$CLIP<P>$com</font></blockquote></td>"; }
	  if($img_pos eq "下") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width='100%'><blockquote><font color=$com_font>$com</font><P>$CLIP</blockquote></td>"; }

	  print HTML "<table border=1 width=$log_size cellspacing=0><th>\n";
	  print HTML "<table border=0 width=100% cellspacing=0 cellpadding=2><tr>\n";
	  print HTML "<td bgcolor=$obi_color colspan=2>\n";
	  print HTML "<font color=$p_color>$point</font>\n";
	  print HTML "<font color=$w_color>$date($wday2[$week])　</font>\n";
	  print HTML "<font color=$sbj_color><b>$subjct</b></font></td>\n";
	  print HTML "</tr>\n";
	  print HTML "<tr>\n";
	  print HTML "$LOG_BODY";
	  print HTML "</tr>\n";
	  print HTML "</table>\n</th></table><P><P>\n";

	} ## foreach -- END
	print HTML "</DIV><hr>\n";
	print HTML "<table border=0 width='100%'>\n";
	print HTML "<tr valign=top>\n";

	# 次／前ページのリンクを生成
	if ($flag == 1) {
	  print HTML "<td width=10><form action=\"$htm_url/$htmfile#top\"><input type=submit value=\"page top\"></form></td>\n";
	  print HTML "<td width=10><form action=\"$htm_url/$nexthtm\"><input type=submit value=\"次ページ\"></form></td>\n";
	  $flag=2;
	} elsif ($flag == 2) {
	  print HTML "<td width=10><form action=\"$htm_url/$nexthtm#top\"><input type=submit value=\"page top\"></form></td>\n";
	  print HTML "<td width=10><form action=\"$htm_url/$htmfile\"><input type=submit value=\"前ページ\"></form></td>\n";
	}

	# 新規投稿入室フォームを表示
	print HTML "<td Align=right>\n";
	print HTML "<form action=\"$script\" method=\"$method\">\n";
	print HTML "<input type=hidden name=mode value=\"form\">\n";
	print HTML "<input type=password name=pass size=10>\n";
	print HTML "<input type=submit value=\"新規投稿\"></form>\n";
	print HTML "</td>\n";
	print HTML "</tr>\n";
	print HTML "</table>\n";

	# 著作権を表示（削除禁止）
	print HTML "<center>$banner2<P></center>\n";
	print HTML "<div Align=right><small><!-- $ver Edit by Season $remodel -->\n";
	print HTML "<a href=\"http://www.kent-web.com/\" target=_blank>SunBoard</a>\n";
	print HTML "- <a href=\"http://homepage1.nifty.com/mystaff/\" target=_blank>Remodel $remodel</a>\n";
	print HTML "</small></div>\n";
	print HTML "</body></html>\n";
	close(HTML);
}

## --- 指定されたHTMLページに最新記事を挿入する ------------------
sub newlog_ins {
	$EXPCNT = $ins_line-1;
	if ($EXPCNT > $#new) { $EXPCNT = $#new; }
	$NEW_LOG = "";

	#タイトルのみ（FORM）
	if ($ins_mode eq 1) {
		$NEW_LOG = "<form>\n<textarea cols=60 rows=5>\n";
		foreach (0 .. $EXPCNT) {
		    local($num,$date,$week,$subjct,$com,$host) = split(/<>/,$new[$_]);
		    $NEW_LOG .= "$date  $subjct\n";
		} #-foreach end
		$NEW_LOG .= "</textarea>\n</form>\n";

	#タイトルのみ（TEXT）
	}elsif ($ins_mode eq 2) {
		$NEW_LOG = "<table border=0><tr><td>\n";
		foreach (0 .. $EXPCNT) {
		    local($num,$date,$week,$subjct,$com,$host) = split(/<>/,$new[$_]);
		    $NEW_LOG .= "$date  $subjct<br>\n";
		} #-foreach end
		$NEW_LOG .= "</td></tr></table>\n";

	# 本文も出力
	}else {
		foreach (0 .. $EXPCNT) {
	    	local($num,$date,$week,$subjct,$com,$host,$tail,$W,$H,$img_pos) = split(/<>/,$new[$_]);
	    	if ($subjct eq "") { $subjct = "無題"; }
	    	if ($autolink) { &auto_link($com); }	# URL自動リンク

	    	#曜日の色設定
	    	$w_color = $sbj_color;			#平日の色
	    	if ($week eq 6) {$w_color = $sat_color;}	#土曜日の色
	    	if ($week eq 0) {$w_color = $sun_color;}	#日曜日の色

	    	#ログの情報から添付ファイルのリンクを生成する
	     	$CLIP = "";
	     	if (-e "$img_dir\/$num$tail") {
	 	    if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
	 		$CLIP = "<a href=\"$img_url\/$num$tail\" target='_blank'><img src=\"$img_url\/$num$tail\" width=$W height=$H border=0></a>\n";
	 	    }else {
	 		$CLIP = "<a href=\"$img_url\/$num$tail\"><img src=\"$img_url\/$Clip_Icon\" border=0 alt='Download:$num$tail'></a> <b>$num$tail</b>\n";
	 	    }
	     	}

	    	# 旧ログの添付ファイルの表示位置を修正
	    	if (index("上,下,左,右",$img_pos) < 0) { $img_pos = "下"; }

	    	# 添付ファイル画像の表示位置指定
	    	if($img_pos eq "左") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width ='10%'>$CLIP</td><td $COM_IMG bgcolor=$com_back width='90%'><blockquote><font color=$com_font>$com</font></blockquote></td>"; }
	    	if($img_pos eq "右") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width ='90%'><blockquote><font color=$com_font>$com</font></blockquote></td><td $COM_IMG bgcolor=$com_back width='10%'>$CLIP</td>"; }
	    	if($img_pos eq "上") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width='100%'><blockquote><font color=$com_font>$CLIP<P>$com</font></blockquote></td>"; }
	    	if($img_pos eq "下") { $LOG_BODY = "<td $COM_IMG bgcolor=$com_back width='100%'><blockquote><font color=$com_font>$com</font><P>$CLIP</blockquote></td>"; }

	    	$NEW_LOG .= <<"_BREAK";
<table border=1 width="$log_size" cellspacing=0>
  <th>
    <table border=0 width=100% cellspacing=0 cellpadding=2><tr>
      <td bgcolor=$obi_color colspan=2>
	<font color=$p_color>$point</font>
	<font color=$w_color>$date($wday2[$week])　</font>
	<font color=$sbj_color><b>$subjct</b></font>
      </td>
    <tr>
	$LOG_BODY
    </tr>
    </table>
  </th>
</table>
<P>
_BREAK

		} #-foreach end
	}

	# 新規記事挿入HTMLファイルを開く
	open(IN,"$ins_html") || &error("Can't open $ins_html");
	@HTML = <IN>;
	close(IN);
	$FLG = 1;
	@NEW=();
	foreach (@HTML) {
	    if ($FLG) { push (@NEW,$_); }
	    if ($_ =~ /<!-- sunclip log_end -->/i) { $FLG = 1; push (@NEW,$_); }
	    if ($_ =~ /<!-- sunclip log_ins -->/i) { $FLG = 0; push (@NEW,$NEW_LOG); }
	}

	# HTMLファイルを更新
	open(OUT,">$ins_html") || &error("Write Error : $ins_html");
	print OUT @NEW;
	close(OUT);
}

## --- 表示ファイルにジャンプ
sub location {
	# IISサーバ対応
	if ($ENV{PERLXS} eq "PerlIS") {
		print "HTTP/1.0 302 Temporary Redirection\r\n";
		print "Content-type: text/html\n";
	}
	print "Location: $htm_url\/$htmfile\n\n";
}

## --- 管理モード入室画面
sub admin_in {
	&header;
	print "<table width=100%><tr><th bgcolor=$obi_color>\n";
	print "<font color=$sbj_color>$remodel　管理入室画面</font></th></tr></table>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=\"admin\">\n";
	print "<P><center><B>管理用パスワードを入力して下さい。</B><br>\n";
	print "<input type=password name=pass size=10>";
	print "<input type=submit value=\" 認証 \"></form>\n";
	print "</center>\n";
	&footer;
	exit;
}

## --- 管理用初期画面
sub admin {
	# パスワードチェック
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います。"); }

	# ログファイルを開く
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	&header;
	print "[<a href=\"$htm_url/$htmfile\">掲示板へもどる</a>]\n";
	print "<table width=100%><tr><th bgcolor=$obi_color>\n";
	print "<font color=$sbj_color>$remodel　管 理 画 面</font></th></tr></table>\n";

	# 記事編集画面
	if ($in{'edit'}) {
	    &admin_edit;	#記事編集画面
	}else {
	    &admin_list;	#記事一覧画面
	}
	exit;
}

#記事編集画面
sub admin_edit {
	&form_size;
	foreach $line (@lines) {
		($num,$date,$week,$subj,$com,$host,$tail,$W,$H,$img_pos) = split(/<>/,$line);
		if ($in{'edit'} eq "$num") { last; }
	}
	$com  =~ s/<br>/\r/g;
	$item = $num . $tail;

	print <<"EOM";
<P><center><h4>編集する部分のみ書き換え、編集ボタンを押して下さい。</h4>
<P><form action="$script" method="$method" enctype="multipart/form-data">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=mode value="edit">
<input type=hidden name=edit value="$num">
<input type=hidden name=item value="$item">

<table border=0>
EOM
	print "<tr><td nowrap><b>記事番号：</b></td><td>No.$num</td>";
	print "<tr><td nowrap><b>日　　付</b></td>";
	print "<td><input type=text name=date size=18 value=\"$date\">\n";
	print "曜日<select name=week>\n";
		foreach(0 .. $#wday1) {
		   if ($week eq "$wday1[$_]") {
			print "<option value=\"$wday1[$_]\" selected>$wday2[$_]\n";
		   }else{
			print "<option value=\"$wday1[$_]\">$wday2[$_]\n";
		   }
		}
	print "</select></td></tr>\n";
	print "<tr><td nowrap><b>タイトル</b></td>";
	print "<td><input type=text name=subj size=\"$sub_wid\" value=\"$subj\"></td></tr>\n";
	print "<tr><td colspan=2><b>コメント</b><br>";
	print "<textarea name=comment cols=$com_wid rows=6 wrap=$wrap>$com</textarea></tr>\n";
	print "<tr><td nowrap><b>添付File</b></td>\n";
	print "<td><select name=img_pos>\n";
	@IMG_LOCATE = ('下','上','左','右');
	foreach (0 .. $#IMG_LOCATE) {
	    if ($IMG_LOCATE[$_] eq $img_pos) {
	    	print "<option value=\"$IMG_LOCATE[$_]\" selected>文章の$IMG_LOCATE[$_]\n";
	    }else{
	    	print "<option value=\"$IMG_LOCATE[$_]\">文章の$IMG_LOCATE[$_]\n";
	    }
	}
	print "</select>";
	print "<input type=file Name=upfile size=50></td></tr>\n";
	print "<tr><th colspan=2>\n";
	print "<font color=$alink><small>※添付fileを指定すると添付ファイルを変更出来ます（無指定は変更無し）</small></font></tr></th>";
	print "<tr><th colspan=2>\n";
	print "<input type=submit value=\"記事を編集する\">";
	print "<input type=reset value=\"リセット\"></th></tr></table>\n";

	 #ログの情報から添付ファイルの内容を表示する
	 if (-e "$img_dir\/$num$tail") {
	 	if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
	 		print "<P><a href=\"$img_url\/$num$tail\" target='_blank'><img src=\"$img_url\/$num$tail\" width=$W height=$H border=0></a>\n";
	 	}else {
	 		print "<P><a href=\"$img_url\/$num$tail\"><img src=\"$img_url\/$Clip_Icon\" border=0 alt='Download:$num$tail'></a> <b>$num$tail</b>\n";
	 	}
	 }

	exit;
}

#記事編集選択画面
sub admin_list {
	print <<"EOM";
<P><center>
<table><tr><td>
  <UL>
  <LI>記事を削除する場合はチェックボックスにチェックを入れ、削除ボタンを押して下さい。
  <LI>記事を編集する場合は、<B>No.</B> をクリックすると編集画面となります。
  </UL>
</td></tr></table>
<P><form action="$script" method="$method">
<input type=hidden name=pass value="$in{'pass'}">
<input type=hidden name=mode value="admin_del">
<input type=submit value="記事を削除する"><input type=reset value="リセット"><P>
<table border=1>
<tr><th>削除</th><th>日時</th><th>No.</th><th>タイトル</th>
EOM

	print "<th>コメント</th></tr>\n";
	foreach $line (@lines) {
		($num,$date,$week,$subj,$com,$host,$tail,$W,$H) = split(/<>/,$line);
		$com =~ s/<br>/ /ig;
		$com =~ s/</\&lt\;/g; $com =~ s/>/\&gt\;/g;
		if (length($com) > 60) { $com = substr($com,0,58); $com = $com . '..'; }

		print "<tr><th><input type=checkbox name=del value=\"$num\"></th>";
		print "<td><small>$date</small></td>";
		print "<th><a href=\"$script?mode=admin&edit=$num&pass=$in{'pass'}\">$num</a></th>";
		print "<td><small><b>$subj</b></small></td>";
		print "<td><small>$com</small></td></tr>\n";
	}
	print "</table></form></center>\n";
	&footer;
	exit;
}

## --- 記事削除／編集処理
sub edit {
	# パスワードチェック
	if ($in{'pass'} ne "$pass") { &error("パスワードが違います。"); }

	# ロック開始
	if ($lockkey) { &file_lock; }

	# ログファイルを開く
	open(DB,"$logfile") || &error("Can't open $logfile");
	@lines = <DB>;
	close(DB);

	if ($mode eq 'admin_del') {
		@new=();
		@delnos = split(/\0/, $in{'del'});
		foreach $line (@lines) {
			local($flag) = 0;
			($num,$date,$week,$sub,$com,$hostname,$tail,$W,$H) = split(/<>/,$line);
			foreach $delno (@delnos) {
				if ($delno eq "$num") { 
					$flag=1;
					if (-e "$img_dir\/$num$tail")
						{ unlink("$img_dir\/$num$tail"); }
					last; 
				}
			}
			if ($flag == 0) { push(@new,$line); }
		}

	} else {
		# 該当記事を抜き出して差し替え
		@new = ();
		foreach $line (@lines) {
		  ($num,$date,$week,$sub,$com,$host,$tail,$W,$H) = split(/<>/,$line);
		  if ($in{'edit'} ne "$num") { 
		  	   push(@new,$line); 
		  }else { 
			   # 添付ファイル差替え処理
			   if ($in{'upfile'}) { 
				unlink("$img_dir\/$in{'item'}"); # 旧添付ファイル削除
			   	&UpFile; 			 # 新添付ファイルアップロード
			   }
			   # 編集ログの差し替え処理
		  	   push(@new,"$num<>$in{'date'}<>$in{week}<>$subj<>$comment<>$host<>$tail<>$W<>$H<>$img_pos<>\n"); }
		}
	}

	# ログファイルを上書き
	open(DB,">$logfile") || &error("Can't write $logfile");
	print DB @new;
	close(DB);

	# 全体の記事数を把握
	if ($pagelog < $#new+1) { $flag=1; }

	# HTMLファイルを生成（第１ページ）
	$i = $#new;
	$write_file = "$htm_dir\/$htmfile";
	&html_regist;

	# HTMLファイルを生成（第２ページ）
	if ($flag) { $write_file = "$htm_dir\/$nexthtm"; &html_regist; }

	# 新規記事をＨＴＭＬに挿入
	if ($ins_line) { &newlog_ins; }

	# ロック解除
	if (-d $lockdir) { rmdir($lockdir); }  # Lockdirの削除

	# 削除処理後は管理画面に戻る
	if ($mode eq "admin_del") { &admin; }

	# 編集処理後は掲示板へ戻る
	else {
		# 表示ファイルに戻る
		&location;
		exit;
	}
}

## --- ワード検索サブルーチン
sub find {
	&header;

	print <<"HTML";
[<a href="$htm_url/$htmfile">掲示板にもどる</a>]
<table width=100%>
<tr>
  <th bgcolor="$obi_color">
    <font color="$sbj_color">ワード検索</font>
  </th>
</tr>
</table>
<P><center>
<table>
<tr>
  <td>
    ■検索したい<b>キーワード</b>を入力し、検索条件を選択し「検索する」を押してください。<br>
    ■複数のキーワードを入力するときは、<b>半角スペース</b>で区切って下さい。
  </td>
</tr>
</table>
<P><form action="$script" method="$method">
<input type=hidden name=mode value="find">
<table border=1>
<tr>
  <th colspan=2>キーワード <input type=text name=word size=30></th>
</tr>
<tr>
  <td>検索条件</td>
  <td>
    <input type=radio name=cond value="and" checked>AND
    <input type=radio name=cond value="or">OR
  </td>
</tr>
<tr>
  <th colspan=2>
    <input type=submit value="検索する"><input type=reset value="リセット">
  </th>
</tr>
</table>
</form></center>
HTML
	# ワード検索の実行と結果表示
	if ($in{'word'} ne "") {

		# 入力内容を整理
		$cond = $in{'cond'};
		$word = $in{'word'};
		$word =~ s/　/ /g;
		$word =~ s/\t/ /g;
		@pairs = split(/ /,$word);

		# ファイルを読み込み
		open(DB,"$logfile") || &error("Can't open $logfile");
		@lines = <DB>;
		close(DB);

		# 検索処理
		foreach $line (@lines) {
			$flag = 0;
			foreach $pair (@pairs){
				if (index($line,$pair) >= 0){
					$flag = 1;
					if ($cond eq 'or') { last; }
				} else {
					if ($cond eq 'and'){ $flag = 0; last; }
				}
			}
			if ($flag == 1) { push(@new,$line); }
		}

		# 検索終了
		$count = @new;
		print "<hr><b><font color=$alink>検索結果：$count件</font></b><P>\n";
		print "<OL>\n";

		foreach $line (@new) {
		  ($num,$date,$week,$sub,$com,$host,$tail,$W,$H) = split(/<>/,$line);
		  if (!$sub) { $sub = "無題"; }
	  	  if ($autolink) { &auto_link($com); }

		  #曜日の色設定
		  $w_color = $text;				#平日の色
		  if ($week eq 6) {$w_color = $sat_color;}	#土曜日の色
		  if ($week eq 0) {$w_color = $sun_color;}	#日曜日の色

		  # 結果を表示
		  print "<LI><small><b><font color=$w_color>$date($wday2[$week])　</font></b></small>\n";
		  print "<b>$sub</b>\n";
		  print "<small>[No.$num]</small>\n";
		  print "<P><blockquote>$com\n";

		 #ログの情報から添付ファイルの内容を表示する
		 if (-e "$img_dir\/$num$tail") {
		 	if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
	 			print "<P><a href=\"$img_url\/$num$tail\" target='_blank'><img src=\"$img_url\/$num$tail\" width=$W height=$H border=0></a>\n";
	 		}else {
	 			print "<P><a href=\"$img_url\/$num$tail\"><img src=\"$img_url\/$Clip_Icon\" border=0 alt='Download:$num$tail'></a> <b>$num$tail</b>\n";
	 		}
	 	}
		print "</blockquote><hr>\n";

		}

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

## --- ブラウザを判断しフォーム幅を調整
sub form_size {
	# ブラウザ情報を取得
	$agent = $ENV{'HTTP_USER_AGENT'};

	# MSIE 3 の場合
	if ($agent =~ /MSIE 3/i) {
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 65;
		$url_wid = 48;
	}
	# MSIE 4/5 の場合
	elsif ($agent =~ /MSIE 4/i || $agent =~ /MSIE 5/i) {
		$nam_wid = 30;
		$sub_wid = 40;
		$com_wid = 65;
		$url_wid = 78;
	}
	# その他
	else {
		$nam_wid = 20;
		$sub_wid = 25;
		$com_wid = 56;
		$url_wid = 50;
	}
}

## --- HTMLのヘッダー
sub header { 
	print "Content-type: text/html\n\n";
	print "<html>\n<head>\n";

	# スタイルシート
	if ($ssheet) { print "$style\n"; }

	# キャッシュ取込拒否
	if ($nocashe) { print "<META HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">\n"; }

	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=x-sjis\">\n";
	print "<title>$title</title></head>\n";
	print "$body\n";
}

## --- HTMLのフッター
sub footer { 
	# 著作権を表示（削除禁止）
	print "<div Align=center><small><!-- $ver Edit by Season $remodel -->\n";
	print "<a href=\"http://www.kent-web.com/\" target=_blank>SunBoard</a>\n";
	print "- <a href=\"http://homepage1.nifty.com/mystaff/\" target=_blank>Remodel $remodel</a>\n";
	print "</small></div>\n";
	print "<center>$banner2<P></center>\n";
	print "</body></html>\n";
}

## --- パスワード暗号処理
sub pwd_encode {
	$now = time;
	($p1, $p2) = unpack("C2", $now);
	$wk = $now / (60*60*24*7) + $p1 + $p2 - 8;
	@saltset = ('a'..'z','A'..'Z','0'..'9','.','/');
	$nsalt = $saltset[$wk % 64] . $saltset[$now % 64];
	$ango = crypt($_[0], $nsalt);
}

## --- パスワード照合処理
sub pwd_decode {
	if ($_[0] =~ /^\$1\$/) { $crptkey = 3; } # FreeBSDサーバ対応
	else { $crptkey = 0; }
	$check = "no";
	if (crypt($in{'pwd'}, substr($_[0],$crptkey,2)) eq "$_[0]") {
		$check = "yes";
	}
}

#  ファイルロック(mkdir関数) ------------------------------------------------------------
sub file_lock {
	local($retry) = 5;
	while (!mkdir($lockdir, 0755)) {
	    if (--$retry <= 0) { &error("Lock Busy…混雑してます"); }
	    sleep(1);
	}
}

## --- ホスト名を取得
sub get_host {
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
	if ($host eq "" || $host eq "$addr") {

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

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

#----------------#
#  過去ログ生成  #
#----------------#
sub pastlog {
	local($past_flag)=0;

	# 過去NOを開く
	open(NO,"$nofile") || &error("Open Error : $nofile");
	$count = <NO>;
	close(NO);

	# 過去ログのファイル名を定義
	$pastfile  = "$pastdir$count\.dat";

	# 過去ログを開く
	open(IN,"$pastfile") || &error("Open Error : $pastfile");
	@past = <IN>;
	close(IN);

	# 規定の行数をオーバーすると次ファイルを自動生成
	if ($#past > $log_line) {
		$past_flag=1;

		# カウントファイル更新
		$count++;
		open(NO,">$nofile") || &error("Write Error : $nofile");
		print NO $count;
		close(NO);

		$pastfile = "$pastdir$count\.dat";
		@past=();
	}

	@temp=();
	foreach (@data) {
		($pnum,$pdate,$pweek,$psub,$pcom,$phost,$tail,$W,$H) = split(/<>/);
		  if (!$psub) { $psub = "無題"; }
	  	  if ($autolink) { &auto_link($pcom); }

		  #ログの情報から添付ファイルのリンクを作成
		  if (-e "$img_dir\/$pnum$tail") {
		 	if ($tail eq ".gif" || $tail eq ".jpg" || $tail eq ".png") {
	 			$pcom .= "<P><a href=\"$img_url\/$pnum$tail\" target='_blank'><img src=\"$img_url\/$pnum$tail\" width=$W height=$H border=0></a>";
	 		}else {
	 			$pcom .= "<P><a href=\"$img_url\/$pnum$tail\"><img src=\"$img_url\/$Clip_Icon\" border=0 alt='Download:$pnum$tail'></a> <b>$pnum$tail</b>";
	 		}
	 	  }

		  # 保存記事をフォーマット
		  push(@temp,"<hr>◆$pdate($wday2[$pweek])　<b>$psub</b>  [No.$pnum]<P><blockquote>$pcom</blockquote><!-- $phost -->\n");

	}

	# 過去ログを更新
	unshift(@past,@temp);
	open(OUT,">$pastfile") || &error("Write Error : $pastfile");
	print OUT @past;
	close(OUT);

	if ($past_flag) { chmod(0666,$pastfile); }
}

#------------#
#  過去ログ  #
#------------#
sub past {
	open(IN,"$nofile") || &error("Open Error : $nofile");
	$pastno = <IN>;
	close(IN);

	if (!$in{'pastlog'}) { $in{'pastlog'} = $pastno; }

	&header;
	print <<"EOM";
[<a href="$script?">掲示板に戻る</a>]
<table width="100%"><tr><th bgcolor="#000080">
  <font color="#FFFFFF">過去ログ[$in{'pastlog'}]</font>
</th></tr></table>
<P>
<form action="$script" method="$method">
<input type=hidden name=mode value=past>
過去ログ：<select name=pastlog>
EOM

	$pastkey = $pastno;
	while ($pastkey > 0) {
		if ($in{'pastlog'} == $pastkey) {
			print "<option value=\"$pastkey\" selected>$pastkey Page\n";
		} else {
			print "<option value=\"$pastkey\">$pastkey Page\n";
		}
		$pastkey--;
	}
	print "</select>\n<input type=submit value='Page移動'></form>\n";
	print "<form action=\"$script\" method=\"$method\">\n";
	print "<input type=hidden name=mode value=past>\n";
	print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
	print "ワード検索：<input type=text name=word size=30 value=\"$in{'word'}\">";
	print "条件：<select name=cond>\n";

	foreach ('AND', 'OR') {
		if ($in{'cond'} eq "$_") {
			print "<option value=\"$_\" selected>$_\n";
		} else {
			print "<option value=\"$_\">$_\n";
		}
	}
	print "</select>\n";
	print "表\示：<select name=view>\n";

	if ($in{'view'} eq "") { $in{'view'} = $pagelog; }
	foreach (5,10,15,20,25,30) {
		if ($in{'view'} eq "$_") {
			print "<option value=\"$_\" selected>$_件\n";
		} else {
			print "<option value=\"$_\">$_件\n";
		}
	}
	print "</select>\n<input type=submit value='検索'></form>\n";

	# 表示ログを定義
	$file = "$pastdir$in{'pastlog'}\.dat";

	# ワード検索処理
	if ($in{'word'} ne "") {
		$in{'word'} =~ s/　/ /g;
		@pairs = split(/\s+/, $in{'word'});

		@new=();
		open(IN,"$file") || &error("Open Error : $file");
		while (<IN>) {
			$flag=0;
			foreach $pair (@pairs) {
				if (index($_,$pair) >= 0) {
					$flag=1;
					if ($in{'cond'} eq 'OR') { last; }
				} else {
					if ($in{'cond'} eq 'AND') { $flag=0; last; }
				}
			}
			if ($flag) { push(@new,$_); }
		}
		close(IN);

		$count = @new;
		print "検索結果：<b>$count</b>件\n";
		if ($page eq '') { $page = 0; }
		$end_data = @new - 1;
		$page_end = $page + $in{'view'} - 1;
		if ($page_end >= $end_data) { $page_end = $end_data; }

		$next_line = $page_end + 1;
		$back_line = $page - $in{'view'};

		if ($back_line >= 0) {
			print "[<a href=\"$script?mode=past&page=$back_line&word=$in{'word'}&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">前の$in{'view'}件</a>]\n";
		}
		if ($page_end ne "$end_data") {
			print "[<a href=\"$script?mode=past&page=$next_line&word=$in{'word'}&view=$in{'view'}&cond=$in{'cond'}&pastlog=$in{'pastlog'}\">次の$in{'view'}件</a>]\n";
		}
		print "[<a href=\"$script?mode=past&pastlog=$in{'pastlog'}\">検索やり直し</a>]\n";

		# 表示開始
		foreach ($page .. $page_end) {
			print $new[$_];
		}
		print "<hr>\n";
		&footer;
		exit;
	}

	# ページ区切り処理
	$start = $page + 1;
	$end   = $page + $pagelog;

	$i=0;
	open(IN,"$file") || &error("Open Error : $file");
	while (<IN>) {
		$flag=0;
		$i++;
		if ($i < $start) { next; }
		if ($i > $end) { last; }
		print $_;
	}
	close(IN);
	print "<hr>\n";

	$next_page = $page + $pagelog;
	$back_page = $page - $pagelog;

	print "<table>\n";
	if ($back_page >= 0) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=past>\n";
		print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
		print "<input type=hidden name=page value=\"$back_page\">\n";
		print "<input type=submit value=\"前の$pagelog件\">\n";
		print "</td></form>\n";
	}
	if ($next_page < $i) {
		print "<td><form action=\"$script\" method=\"$method\">\n";
		print "<input type=hidden name=mode value=past>\n";
		print "<input type=hidden name=pastlog value=\"$in{'pastlog'}\">\n";
		print "<input type=hidden name=page value=\"$next_page\">\n";
		print "<input type=submit value=\"次の$pagelog件\">\n";
		print "</td></form>\n";
	}
	print "</table>\n";
	&footer;
	exit;
}

## --- 許可するＨＴＭＬタグを限定する
sub tag_change {
	local($_) = $_[0];
	1 while s/(.*)(&lt;(img([!-:A-~\s\=]+))&gt;)/$1<img$4>/i;
	1 while s/(.*)(&lt;(font[\s\w\=\+\-\#\"\']+)\&gt;(.*)\&lt;\/font\&gt;)/$1<$3>$4<\/font>/i;
	1 while s/(.*)(&lt;(b)&gt;(.*)&lt;\/b&gt;)/$1<b>$4<\/b>/i;
	1 while s/(.*)(&lt;(i)&gt;(.*)&lt;\/i&gt;)/$1<i>$4<\/i>/i;
	$_;
}

## --- 掲示板の使い方メッセージ
sub howto {

	# 添付可能なファイルの種類とサイズのＭＳＧ準備
	if ($gif)  { $FILE .= "GIF, "; }
	if ($jpeg) { $FILE .= "JPEG, "; }
	if ($png)  { $FILE .= "PNG, "; }
	if ($text) { $FILE .= "TEXT, "; }
	if ($lha)  { $FILE .= "LHA, "; }
	if ($zip)  { $FILE .= "ZIP, "; }
	if ($pdf)  { $FILE .= "PDF, "; }
	if ($midi) { $FILE .= "MIDI, "; }
	if ($word) { $FILE .= "WORD, "; }
	if ($excel){ $FILE .= "EXCEL, "; }
	if ($ppt)  { $FILE .= "POWERPOINT, "; }
	$FILE =~ s/\, $//;
	$MaxData = int ($cgi_lib'maxdata / 1024);

	# 使用可能なタグの種類のＭＳＧ準備
	$OK_tag = "&lt;font&gt;、&lt;img&gt;、&lt;B&gt;、&lt;I&gt;\n";
	if ($tagkey eq 0) { $tag_msg = "<b>タグ</b>は使用できません。\n";} 
	if ($tagkey eq 1) { $tag_msg = "<b>$OK_tagタグ</b>を使用できます。<br>但し、閉じる必要のあるタグの「閉じ忘れ」は無効です。\n"; } 
	if ($tagkey eq 2) { $tag_msg = "<b>全てのタグ</b>を使用できます。\n";} 

	&header;
	print <<"HTML";
[<a href="$script\?">掲示板にもどる</a>]
<table width="100%">
<tr>
  <th bgcolor="$obi_color">
    <font color="$sbj_color">$remodelの使用方法について</font>
  </th>
</tr>
</table>
<P><center>
<table width="90%" border=1 cellpadding=10>
<tr><td bgcolor="$com_back">
<OL>
<LI>$remodelは、<b>ファイルの添付</b>が可能\な<b>HTML表\示</b>のＷｅｂノートです。<P>
<LI>$remodelは、管理者だけが記事の登録・編集・削除を行えます。<P>
<LI>新規記事を投稿するには、画面の最下段にあるフォームに管理人用パスワードを入れて<b>「新規投稿」</b>のボタンをクリックします。<P>
<LI>既存記事を編集・削除するには、トップメニューの<b>「管理人室」</b>のリンクをクリックして<b>「編集・削除」</b>を選択します。<P>
<LI>ファイルを添付するには、新規投稿画面で<b>「添付File」</b>欄の参照ボタンをクリックして添付するファイルを選択します。<P>
<LI>添付できるファイルの種類は、<b>$FILE</b> です。<P>
<LI>添付できるファイルのサイズは、<b>$MaxData KB</b>以下です。<P>
<LI>現在の設定では、コメント欄に、$tag_msg<P>
<LI>ログの保持件数は<b>最大 $max件</b>です。それを超えると古い順に自動削除されます。<P>
<LI>投稿記事には、<b>半角カナは一切使用しないで下さい。</b>文字化けの原因となります。<P>
<LI>投稿記事を<b>「キーワード」によって簡易検索ができます。</b>トップメニューの<a href="$script?mode=find">「ワード検索」</a>のリンクをクリックすると検索モードとなります。<P>
<LI>添付するデータファイルは、著作権上の問題が発生しない様に配慮して下さい。<P></OL></blockquote>
</OL>
<P Align=Right><a href="http://homepage1.nifty.com/mystaff/">$remodel</a></P>
</td></tr></table>
</center>
<hr>
<P>
HTML
	exit;
}

#--------------------#
#  画像アップロード  #
#--------------------#
sub UpFile {
	# 画像処理
	$macbin=0;
	foreach (@in) {
		if ($_ =~ /(.*)Content-type:(.*)\/(.*)/i) { $tail  = $3; }
		if ($_ =~ /(.*)filename=(.*)/i)		  { $fname = $2; }
		if ($_ =~ /application\/x-macbinary/i)	  { $macbin= 1; }
	}
	$tail =~ s/\r//g;
	$tail =~ s/\n//g;
	$fname =~ s/\"//g;

	# ファイル形式を認識
	$flag=0;
	if ($tail =~ /gif/i && $gif)  		{ $tail=".gif"; $flag=1; }
	if ($tail =~ /jpeg/i && $jpeg)  	{ $tail=".jpg"; $flag=1; }
	if ($tail =~ /x-png/i && $png)  	{ $tail=".png"; $flag=1; }
	if ($tail =~ /plain/i && $text) 	{ $tail=".txt"; $flag=1; }
	if ($tail =~ /lha/i && $lha)    	{ $tail=".lzh"; $flag=1; }
	if ($tail =~ /zip/i && $zip)    	{ $tail=".zip"; $flag=1; }
	if ($tail =~ /pdf/i && $pdf)   		{ $tail=".pdf"; $flag=1; }
	if ($tail =~ /mid/i && $midi)   	{ $tail=".mid"; $flag=1; }
	if ($tail =~ /msword/i && $word) 	{ $tail=".doc"; $flag=1; }
	if ($tail =~ /ms-excel/i && $excel) 	{ $tail=".xls"; $flag=1; }
	if ($tail =~ /ms-powerpoint/i && $ppt) 	{ $tail=".ppt"; $flag=1; }

	if (!$flag) {
		if ($fname =~ /.gif/i && $gif) 	{ $tail=".gif"; $flag=1; }
		if (($fname =~ /.jpg/i && $jpeg) || ($fname =~ /.jpeg/i && $jpeg))
						{ $tail=".jpg"; $flag=1; }
		if ($fname =~ /.png/i && $png) 	{ $tail=".png"; $flag=1; }
		if ($fname =~ /.lzh/i && $lha) 	{ $tail=".lzh"; $flag=1; }
		if ($fname =~ /.txt/i && $text) { $tail=".txt"; $flag=1; }
		if ($fname =~ /.zip/i && $zip) 	{ $tail=".zip"; $flag=1; }
		if ($fname =~ /.pdf/i && $pdf) 	{ $tail=".pdf"; $flag=1; }
		if ($fname =~ /.mid/i && $midi) { $tail=".mid"; $flag=1; }
		if ($fname =~ /.doc/i && $word) { $tail=".doc"; $flag=1; }
		if ($fname =~ /.xls/i && $excel){ $tail=".xls"; $flag=1; }
		if ($fname =~ /.ppt/i && $ppt) 	{ $tail=".ppt"; $flag=1; }
	}
	if (!$flag) { &error("$fname<>$tail<>アップロードできないファイル形式です","lock"); }

	$upfile = $in{'upfile'};

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

	# 添付データを書き込み
	$ImgFile = "$img_dir\/$num$tail";
	open(OUT,"> $ImgFile") || &error("画像のアップロードに失敗しました","lock");
	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;
	}
}

#------------------#
#  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);
}

#-----------------#
#  PNGサイズ認識  # WWWis (http://www.bloodyeck.com/wwwis/) より引用
#-----------------#
sub PngSize {
	local($PNG) = @_;
	local($head, $a, $b, $c, $d, $e, $f, $g, $h);

	open(PNG,"$PNG") || return (0,0);
	binmode(PNG);
	if (defined(PNG) && read(PNG, $head, 8) == 8 &&
		$head eq "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" &&
		read(PNG, $head, 4) == 4 && read(PNG, $head, 4) == 4 &&
		$head eq "IHDR" && read(PNG, $head, 8) == 8) {

		($a,$b,$c,$d,$e,$f,$g,$h) = unpack("C"x8, $head);
	}
	else { return (0,0); }
	close(PNG);

	return ($a<<24|$b<<16|$c<<8|$d, $e<<24|$f<<16|$g<<8|$h);
}

## 設定ファイルの読みこみ --------------------------------------------------------------
sub config_load {
	open(IN,"$config") || &error("Can't open $config");
	@lines = <IN>;
	close(IN);

	#各種設定情報の読みこみ
	($id,$pass,$max,$pagelog,$pt,$home,$t_gif,$title,$t_point,$t_color,$t_face,$submsg,
	 $bground,$bgcolor,$text,$link,$alink,$vlink,$log_size,$ratio,$com_bgimg,$com_back,$com_font,$point,$p_color,$obi_color,
	 $sbj_color,$sat_color,$sun_color,$date_type,$tagkey,$autolink,$lockkey,$pastkey,$log_line,$ins_line,$ins_html,$ins_mode) = split(/<>/,$lines[0]);
	if ($id ne 'Sunclip') { &error("ログファイルの形式が正しくありません！"); }

	#添付ファイル設定情報の読みこみ
	($Clip_Size,$Clip_Icon,$gif,$jpeg,$png,$text,$lha,$zip,$pdf,$midi,$word,$excel,$ppt) = split(/<>/,$lines[2]);

	# 投稿受理最大サイズ (bytes)
	# → 例 : 102400 = 100KB
	$cgi_lib'maxdata = $Clip_Size;
}

## 設定ファイルの内容でHTMLを更新 --------------------------------------------------------------
sub setup {
	# ロック開始
	if ($lockkey) { &file_lock; }

	open(DB,"$logfile") || &error("Can't open $logfile");
	@new = <DB>;
	close(DB);

	# 全体の記事数を把握
	$i = $#new;
	if ($pagelog < $#new+1) { $flag=1; }

	# HTMLファイルを生成（第１ページ）
	$write_file = "$htm_dir\/$htmfile";
	&html_regist;

	# HTMLファイルを生成（第２ページ）
	if ($flag) {
		$write_file = "$htm_dir\/$nexthtm";
		&html_regist;
	}

	# ロック解除
	if (-d $lockdir) { rmdir($lockdir); }  # Lockdirの削除

	# HTMLファイルへ戻る
	&location;
	exit;
}

## --- エラー処理
sub error {
	# ロック解除
	if (-d $lockdir) { rmdir($lockdir); }  # Lockdirの削除
	&header;
	print "<center><hr width=75%><h3>ERROR !</h3>\n";
	print "<P><font color=$t_color><B>$_[0]</B></font>\n";
	print "<P><hr width=75%></center>\n";
	&footer;
	exit;
}
