#!/usr/bin/perl
# 
# 先頭行の例:a #!/usr/bin/perl
# 先頭行の例:b #!/usr/local/bin/perl
# 先頭行の例:c #!/bin/perl

#     オリジナルスクリプト[Joyful Note]の規定
#    ┌───────────────────────────────
#    │  JOYFUL NOTE v1.21 (2002/01/15)
#    │  Copyright(C) Kent Web 2002
#    │  webmaster@kent-web.com
#    │  http://www.kent-web.com/
#    └───────────────────────────────
      $originalver = 'Joyful Note v1.21';
#    ┌───────────────────────────────
#    │ [注意事項]
#    │ 1. このスクリプトはフリーソフトです。このスクリプトを使用した
#    │    いかなる損害に対して作者は一切の責任を負いません。
#    │ 2. 設置に関する質問はサポート掲示板にお願いいたします。
#    │    直接メールによる質問は一切お受けいたしておりません。
#    │ 3. 添付の home.gif は L.O.V.E の mayuRin さんによる画像です。
#    └───────────────────────────────

$ver = 'JOYFULYY v2.50y24m71'; # (不正なURL対策)
#  ◆URLの中の不正なタグ対策:表示ではタグを無効削除、タグがあればタグを無効にする

# ★★★★★★★★★★★一時製作用★★★★★★★★★★★★★★
	$test = 0;
	# 各画像にコメントを投稿する $pic_comment(0:no 1:yes)
	if ($test && -e "x_makeflg.txt"){ $pic_comment = 1; $pic_comgyo = 5; }
	undef $test;

# この改造スクリプト[JOYFULYY]では、以下の規定をお守りください。
#┌─────────────────────────────────
#│  JOYFULYY
#│  This was edited by Yamamoto
#│  raikouspace@nifty.com
#│  http://izu22.cool.ne.jp/y-pg/
#│  http://homepage1.nifty.com/raikou/
#└─────────────────────────────────
# 改造版著作権表示部(削除改変不可)
#┌─────────────────────────────────
#│ [追加注意事項]
#│ 1. このスクリプトはJOYFUL NOTE v1.21を改造したものです。 
#│    設置に関する質問その他の質問を「Kent Web」様にしないでください。
#│    また、「Kent Web」様のサポート掲示板での問い合わせもしないでください。
#│ 2. 以下の利用規定に基づき「Kent Web」様に著作権のあるCGIスクリプトを
#│    改造し再配布します。
#│    「再配布の規定について」http://www.kent-web.com/pubc/saihaifu.html
#│    「フリーソフト利用規定」http://www.kent-web.com/pubc/kitei.html
#│ 2. このスクリプトの利用規定は「Kent Web」様の「再配布の規定について」
#│    および「フリーソフト利用規定」の主旨と同様のものとします。
#│    この改造スクリプトを再改造できますが、著作権表示部は削除改変不可です。
#│    著作権表示部に再改造者の著作権表示を追加してご使用ください。
#│ 3. このスクリプトを使用したいかなる損害に対しても、
#│    作者および改造者は一切の責任を負いません。
#│ 5  改造者への質問は、こちらにお願いします。
#│    「JOYFULYYのご案内」http://izu22.cool.ne.jp/y-pg/
#└─────────────────────────────────

# 各種項目の設定は、項目設定プログラム「j_set.cgi」を起動して、
# インターネット接続で行いますので、ここでのエディター修正は不要です。
# 通常は、このスクリプトをエディター修正することはありませんので注意ください。

# --------------------- #
#      臨時項目設定     #
# --------------------- #
# ここでは、一部の方がエディターで設定できるように臨時の設定を行います
# JOYFULYYのバージョンアップをしますと、ここの設定は消えてしまいますので、
# バージョンアップ版でも、同様に設定しなおしてください。

# 日記帳モードで管理者用パスワード入力欄を先頭行トップメニュー末尾に移動します。(0:no 1:yes)
#              パスワード入力欄が大きいのでサイズ指定をする予定
#              しかし、form文を入れるために下に一行分の余白が出てしまう・・・
	$dailypasst = 0;
# 記事を新規投稿する時に、先頭ではなく末尾に投稿されるようにする(0:no 1:yes)
#   改造ね!っとへお問い合わせのMakiさんのご希望です(正式ご提供するかどかは検討中です)
#   でも、最大記事数を超えた時には最新記事から過去ログへ移行することになってしまいます!
#   最大記事数を大きく設定した上で、サーバーの容量不足にもご注意ください。
	$reg_endposition = 0;
# 返信・追加ボタンを強制的非表示にする(0:no 1:yes)
	$undisplay_resbt = 0;

# ---------------------------- #
#     改造者向け説明と設定     #
# ---------------------------- #
# <★特記★>
# 改造者がログ形式を変更して新しいアイテムを追加出来る予約フィールドを用意しました
# このファイルの「sub inperm_sub」にある
# <高度な改造者向けの予約フィールドの解説> の解説をお読みください。
# CGIの製作に慣れている方には独自の新機能を実現しやすくなっています!(v2.50y24m63より)

# <ライブラリのバージョン設定>
# もし、改造したライブラリ先頭スクリプトの $lib_ver 変数に独自のバージョンを設定した場合は、
# 以下のバージョン変数にも同じものを設定すれば、改造バージョンの整合性が保たれます。
# (もし、改造版使用者が間違って別のバージョンのライブラリを使うとエラーになります)
# (旧バージョンの改造ライブラリを再配布する場合もご利用ください)
# 例えば、j_lib_r1.cgi を改造し先頭スクリプトに、$lib_ver = "v2.50y21kaizou"; を設定した場合は、
# 以下にも同様に設定します 例:$lib_r1_ver = "v2.50y21kaizou"
# もちろん、最新版のライブラリを改造して再配布する時にはなにも設定する必要はありません。
	$lib_r1_ver = "";
	$lib_r2_ver = "";
	$lib_r3_ver = "";
	$lib_w1_ver = "";
	$lib_w2_ver = "";
	$lib_x1_ver = "";
	$lib_x2_ver = "";
# 	改造版再配布でバージョンチェックの必要がないならば、
# 	ライブラリ読み込み時点でのバージョンチェック(&libchk)を行わない方法もあります。
# 	以下で「0」を設定すればライブラリのバージョンチェックを行いません。
	$lib_ver_check = 1; # 0:チェックしない 1:チェックする

# <著作権表示>
# 掲示板の著作権表示部の出力は j_lib_r2.cgi の「sub html_log_end」にあります。
# そこには改造者による著作権表示のサンプルもありますので簡単に出来ると思います。
# 参考にしてください。

# <参考:巡回ソフト>
# 掲示板巡回ソフト用のエクステンション用区切りは「j_lib_r2.cgi」の先頭で説明しています。

# -------------------------------- #
#    改造者向け固定ファイル指定    #
# -------------------------------- #
# JOYFULYY掲示板では、各ファイル名を項目設定プログラムで設定しますので、
# ここで指定する必要はありません、通常は変更しないように注意してください。
# しかし、一部のファイル名は固定していますので項目設定プログラムでは変更できません。
# もし、固定したファイル名を変更する必要がある時にはここで変更してください。
# さらに、項目設定プログラム(j_set.cgi)でも同様の変更を行う必要があります
# (指定方法は全てFTP指定です)

# [注意]
#   このファイル「./joyfulyy.cgi」の指定は項目設定の「■ライブラリ、ディレクトリ、ファイルの設定」
#   の「■スクリプトのファイル名」で設定しますのでここにはありません。

# 項目設定の関係
	$setpro_file = "./j_set.cgi"; # 項目設定プログラム
	$setfile = "./j_param.cgi"; # j_set.cgiによって自動生成される「設定項目ファイル」です
# ライブラリのファイル名(臨時版v2.50y21より)
#  (ここではjoyfulyy.cgiが適宜読み込んで処理を行うスクリプトをライブラリと呼んでいます)
	$lib_r1 = "./j_lib_r1.cgi"; #  ◇ページ表示の共通サブルーチンのライブラリ
	$lib_r2 = "./j_lib_r2.cgi"; #  ◇通常ページ表示のライブラリ
	$lib_r3 = "./j_lib_r3.cgi"; #  ◇その他のページ表示のライブラリ
	$lib_w1 = "./j_lib_w1.cgi"; #  ◇記事書き込みライブラリ
	$lib_w2 = "./j_lib_w2.cgi"; #  ◇メール送信のライブラリ
	$lib_x1 = "./j_lib_x1.cgi"; #  ◇その他のライブラリ
	$lib_x2 = "./j_lib_x2.cgi"; #  ◇ログ破損対策のライブラリ
	$lib_x3 = "./j_lib_x3.cgi"; #  ◇項目設定用ライブラリ(これはj_set.cgiでも再設定が必要)
# 直リンク防止:画像出力スクリプト「j_trance.cgi」
	$trance_scr = "./j_trance.cgi"; # j_set.cgiが自動生成します(j_set.cgiでも再設定が必要)
# 改造者向け試作ファイル名(まだ利用されていないと思います)
	$remake_file = "./j_init.cgi"; # 使用方法は追って確立したいです、希望者はお申し出ください
# 特殊管理設定:通常使用にはまったく無関係です
	$adminfile = "./j_admin.cgi"; # JOYFULYYをレンタル等する場合等に使用する設定です

# --------------------- #
#    製作用臨時設定     #
# --------------------- #
# 指定秒スリープモード(製作者が一時的に使用する設定です一般にはまったく無関係です)
# タスクマネージャーで使用メモリを観察するために、指定秒スリープ(停止)するものです。
	$test_sleep = 0; # 以下の停止と秒数を有効にする (0:無効 1:有効)
	if ($test_sleep){
		$test_sleep_exit = 3;   # 秒数:通常ページ表示後など全てのexit直前の停止時間
		$test_sleep_head = 1;   # 秒数:通常ページヘッダーを表示したあとの停止時間
		$test_sleep_max = 4;    # 秒数:投稿直後の最大メモリ使用時の停止時間
		$test_sleep_logchk = 1; # 秒数:投稿後の正常書き込みデータ確認後の停止時間
	}
	$test_sleep_error = 3;  # 秒数:強制エラーでの停止時間、但し「123sleep」があれば常時停止
# Windows XPの不明なバグ(JavaScript関連バグ)を回避する (0:no 1:yes)
	$test_escape = 0;

# --------------------- #
#      各殊設定終了     #
# --------------------- #




# ***** 処理開始 *****

# 【注:このディレクトリ移動処理は j_set.cgi のものと同等にする】
# <ともくん方式の自動化>
# 自身のファイルが読めない時自動処理によってアクティブディレクトリを移動
# chdir 'd:/1yam/apache//1y/0j/b-imp/img/'; # テスト用
if (!(-e $setpro_file)){ # 項目設定プログラムが読めない時
	# まず、ドキュメントルートとスクリプト名を使って絶対パスを作成する
	$droot = $ENV{'DOCUMENT_ROOT'}; # ルート
	$droot =~ s/(\/[^\/]*$)//; # 右端削除 v2.50y21sにて「/」も削除
	$spass = $ENV{'SCRIPT_NAME'}; # $spass = $ENV{'PATH_INFO'};
	$spass =~ s/(\/[^\/]*$)/\//; # 右端削除
	$spass =~ s/\~//g; # チィルダ削除
	# 以下のともくん方式を自動化して試みる!
	# ともくん方式→ chdir 'C:\home\test\joyfulyy'; # <-もちろんそれぞれの環境に合わせて書き換える
	$allpass = $droot . $spass;
	$rslt = chdir $allpass; # このディレクトリをアクティブにする
	if ($rslt){ $setfile_msg_sp = "[ chdir $allpass ]"; } # 項目設定で表示するため
	if (!(-e $setpro_file)){
		if ($allpass =~ /:\\/){
			$droot = $ENV{'DOCUMENT_ROOT'}; # ルート
			$droot =~ s/(\\[^\\]*$)/\\/; # 右端削除
			$spass = $ENV{'SCRIPT_NAME'}; # $spass = $ENV{'PATH_INFO'};
			$spass =~ s/(\\[^\\]*$)/\\/; # 右端削除
			$spass =~ s/\~//g; # チィルダ削除
			$allpass = $droot . $spass;
		} else {
			$allpass =~ s/\//\\/g;
		}
		$rslt = chdir $allpass; # このディレクトリをアクティブにする
		if ($rslt){ $setfile_msg_sp = "[ chdir $allpass ]"; } # 項目設定で説明を表示するため
	}
	if ($setfile_msg_sp){ # ともくん方式の自動化のメッセージ
		$setfile_tmsg .= "このサーバーではパスの指定が特殊なためプログラムが動作出来ません。<br>";
		$setfile_tmsg .= "そのため起動時に「chdir」コマンドを自動生成して";
		$setfile_tmsg .= "アクティブディレクトリを移動して動作しています。<br><b>→ $setfile_msg_sp</b><br>";
		if (!(-e $setpro_file)){ # 項目設定プログラムが読めない時
			$setfile_tmsg .= "<FONT color=\"#ff0000\">しかしながら、このCGIプログラムから項目設定プログラム「$setpro_file」を";
			$setfile_tmsg .= "見つけることが出来ませんでしたので失敗しています。<br>";
			$setfile_tmsg .= "エディター修正で joyfulyy.cgi 、j_set.cgi の中の「固定ファイル指定」をサーバー仕様に合わせて修正する必要があります。</FONT><br>";
		} else {
			$setfile_tmsg .= "その結果、項目設定プログラム「$setpro_file」の存在を確認できましたので、";
			$setfile_tmsg .= "このまま掲示板をお使い頂けると思います。<br>";
			$setfile_tmsg .= "しかし、もし閲覧者が掲示板を開けなくなる場合があれば、この処理は不向きですので、<br>";
			$setfile_tmsg .= "エディター修正で joyfulyy.cgi 、j_set.cgi の中の「固定ファイル指定」をサーバー仕様に合わせて修正する必要があります。<br>";
		}
	} elsif (!(-e $setpro_file)){ # それでも見つからなかった
		$setfile_msg_sp = "ダミー";
		$setfile_tmsg .= "<FONT color=\"#ff0000\">このサーバーではパスの指定が特殊なためプログラムが動作出来ません<br>";
		$setfile_tmsg .= "そのため起動時に「chdir」コマンドを試行してみましたが効果がありませんでした。<br>";
		$setfile_tmsg .= "エディター修正で joyfulyy.cgi 、j_set.cgi の中の「固定ファイル指定」をサーバー仕様に合わせて修正する必要があります。</FONT><br>";
	}
}

# 設定項目ファイル読み込み
if (-e $setfile) {
	require $setfile; &joy_pm_set;
} else {
	# まだ項目設定ファイルが作成されていない
	$setfile_name = $setfile; $setfile_name =~ s/.*\/([^\/]*)$/$1/;
	$setpro_file_name = $setpro_file; $setpro_file_name =~ s/.*\/([^\/]*)$/$1/;
	# 項目設定プログラムが読めない時
	if (!(-e $setpro_file)){ 
		$msg ="設定項目ファイル($setfile_name)と、設定項目プログラム($setpro_file_name)が見つかりませんでした<BR><BR>";
		if ($setfile_msg_sp){ # ともくん方式の自動化のメッセージを追加
			$msg .= $setfile_tmsg;
		}
		$msg .="<BR>先ず、設定項目プログラム($setpro_file_name)をブラウザからURL指定で開いて確認してください。<BR><BR>";
		&header;
		print "<TABLE><TR><TD><BR><hr width=700><BR>$msg<BR></TD></TR></TABLE>\n";
		print "<P><B>$ver</B><P><hr width=700></center></body></html>\n";
		if ($lockkey && $lockflag) { &unlock; }
		if ($test_sleep){ sleep($test_sleep_exit); }
		exit;
	}
			# 初期読み込みファイルのパスを自動調査
			# v2.50y21 にて提供予定でしたが効果が確認できませんので使いません
			#	$setfile_flg = 0; $setfile_msg = "";
			#	&autopass($setfile,$setfile_name,$setfile_flg,$setfile_msg);
			#	スクリプトは j_set.cgi にあります
	# 項目設定ファイルが読めない時
	if (-e './joyset.pl') { # 旧設定項目ファイル
		$msg ="新設定項目ファイルが見つかりません<BR><BR>「$setpro_file_name」を起動して、新設定項目ファイル($setfile_name)を作成してください<BR>旧設定項目ファイル(joyset.pl)の設定を取り込むことができます。";
	} else {
		$msg ="設定項目ファイル($setfile_name)が見つかりません<BR>「$setpro_file_name」を起動して作成できます";
	}
	&header;
	print "<center><P><BR><hr width=700><BR>$msg<BR>\n";
	print "<form action=\"$setpro_file\" method=\"POST\">\n";
		print "<input type=submit value=\"項目設定プログラム($setpro_file_name)を起動して、新設定項目ファイルを作成 \">\n";
	print "</form>\n";
	print "<P><B>$ver</B><P><hr width=700></center></body></html>\n";
	if ($lockkey && $lockflag) { &unlock; }
	if ($test_sleep){ sleep($test_sleep_exit); }
	exit;
}
# ●JOYFULYYをレンタル等する場合等に使用する設定で、通常使用にはまったく無関係です。
if (-e $adminfile) {
	require $adminfile; &rnt_admin; $adflg = 1; # 特殊管理項目の設定
	undef @max_mini; undef @rentalalldata;
}

&vupvalue; # ●VUP新変数の初期値

# ●Tok2無料対策の初期化処理
if ($tok2cookie_flg){ # ●Tok2 クッキー対策フラグに連動させる
	utime time(), time(), __FILE__; # スクリプト生成日時の更新
	# 参考 http://www23.tok2.com/home/FAQ/cgi1.html
	$location_off = 1;
}
# ●JOYFULYYの標準改造版対応
if (-e $remake_file) {
	# $remake_file    ← JOYFULYYの改造版標準プログラムファイル名を格納する
	# 項目設定の「■その他(P3P対応など)」の
	# 「JOYFULYYの改造版標準プログラムファイル名<URL指定>」で確認できます
	require $remake_file;
	# 改造版標準プログラムの起動フラグ
	$remake_flg0 = 1; # joyfulyy.cgi から呼び出されたサインとして利用できます
	# 改造版標準プログラムには「sub rmk_init_set」ルーチンが必要です。(ダミー可能)
	&rmk_init; # ここで項目設定を固定出来ます
}


# メイン処理
&decode;

# アクセス制限 : アイコン選択などを除く、投稿エラーから戻ってきた場合を除く
$axsflg=1;
if ($mode eq "gfsize" || $mode eq "imgset" || $mode eq "err-return") { $axsflg=0; }
if ($in{'imageselect'} || $in{'imageselect-res'} || $in{'picnsub'}) { $axsflg=0; }
if ($axsflg) { &axs_check; }

# 自動投稿対策3 掲示板の直リンクを禁止する
if ($access_link){
	if ($in{'tyoku'} && $in{'tyoku'} eq $access_link_p){ # 直リンクパスワード
		$flg = 1;
	} else {
		$ref = $ENV{'HTTP_REFERER'}; $flg = 0;
		if ($access_link_u0 && $ref =~ /^$access_link_u0/){ $flg = 1; } # この掲示板から
		foreach (@access_link_u) { if ($_ && $ref =~ /^$_/){ $flg = 1; last; }} # 許可サイトから
	}
	if (!$flg){
		if ($access_link_ej){
			$tmp = "<A href=\"$access_link_ej\" >$access_link_em</A>";
		} else {
			$tmp = "$access_link_em";
		}
		$tmp .= "<p><FONT color=\"#009900\">" . $access_link_m . "</FONT>";
		&error("$tmp");
	}
}

# 以下は、特殊初期化確認項目「sub vupvalue」に移動
# ●複数画像最大数、(ログのアイテム読み取り用)
# &inperm0;

# 日記帳パスワードチェック
if ($diary){
	if ($in{'kpass'}){
		if ($in{'kpass'} ne $pass) { &error("管理パスワードが違います <diary_st>"); }
		$diary_no_form = 0; # 入力フォーム表示
	} else {
		$diary_no_form = 1; # ★日記帳モードでの入力フォームの非表示
	}
} else { # 通常モードで、日記帳記事
	if ($in{'diary_kiji'}){
		if ($in{'kpass'} ne $pass) { &error("管理パスワードが違います <diary_op>"); }
		if ( $in{'pwd'} eq "") { $in{'pwd'} = $in{'kpass'}; } # 記事の修正キー
	}
	$diary_no_form = 0; # 入力フォーム表示
}

# ############## #
#    処理実行    #
# ############## #

# ★j_lib_x2 :JOYFULYYのログ破損対策のライブラリ
@lib_file = ();
$lib_file[0] = "$lib_x2<>$lib_x2_ver";
if ($logbk || $in{'log'}){
	&libchk; # 事前準備(ログチェックモードでも)
	if ($in{'log'}){ &log_chk_mode_pre; } # ログチェックモード準備
}

# j_lib_r1,3:ページ表示関係のライブラリ使用
@lib_file = ();
$lib_file[0] = "$lib_r1<>$lib_r1_ver";
$lib_file[1] = "$lib_r3<>$lib_r3_ver";
if ($mode eq "find") { &libchk; &find; } # ワード検索
if ($mode eq "usrok") { &libchk; &usr_ok; } # ●投稿と修正での確認画面
if ($mode eq "err-return") { # ●投稿エラーから戻ってきた
	if ($in{'re-mode'} eq "usr_edt"){ &libchk; &usr_edt_form; } # 記事修正処理
}
if ($mode eq "regist_page") { &libchk; &regist_page; } # ●投稿フォームのページへ
if ($mode ne $access_mod_n) { # mode="regist" : 書込み後は除く
	if ($in{'formmode'} eq "regist_page") { &libchk; &regist_page; } # ●投稿フォームのページへ
}

if ($mode eq $access_mod_n) { # mode="regist" : 投稿・返信フォームでの操作
	if ($in{'picnsub'}){ # 追加画像数の変更操作
		$flg = 0;
		# $gf_no の抽出
		foreach $gfc (0 .. $gf_maxno) {
			$tmp = $gfc;
			if (length($tmp) <= 1){ $tmp = "0" . $tmp; }
			$tmp = "picn" . $tmp;
			if ($in{'picnum'} eq $tmp) { $gf_no = $gfc; $flg = 1; last; }
		}
		if ($flg) { &get_time; &set_cookie; } # 時間を取得 # クッキーを発行
		if ($in{'formmode'} eq "regist_page") { &libchk; &regist_page; } # ●投稿フォームのページへ
		if ($in{'reno'}){ $modereg_flg = 1; } # &res_form; 返信での画像の数変更
		# &html_log; # 通常記事表示のばあいは、この下で開く
		$mode = "";
	} elsif ($in{'imageselect'}) { # アイコン選択画面へ
		&libchk; &image("imgset","","");
	} elsif ($in{'imageselect-res'}) { # アイコン選択画面へ
		&libchk; &image("resimgset","$in{'no'}","");
	}
}

if ($mode eq "usr_edt") { # 記事修正フォームでの操作
	if ($in{'imageselect'} && $in{'imageselect'} ne "削除") {
		$in{'action'} = ""; # アイコン選択ページへ。アイコンの削除を除く
	}
	if ($in{'icon'} && $in{'imageselect'} eq "削除") { # ■アイコンを選択して戻ってきた
		$in{'action'} = ""; # アイコンの削除はもう一度編集画面を開く
	}
	if ($in{'iconurl_dis'}) { $in{'action'} = ""; } # ページの再表示なので、書き込みをしない
	if ($in{'iccode'}){ &libchk; &icpass_set; } # ●アイコンを選択 アイコン専用キー選択
	if ($in{'action'} ne "edit") { &libchk; &usr_edt_form; } # 記事修正フォーム
}

# j_lib_w1:記事書き込み関係のライブラリ使用
@lib_file = ();
$lib_file[0] = "$lib_w1<>$lib_w1_ver";
if ($mailing || $prvd_mail){ $lib_file[1] = "$lib_w2<>$lib_w2_ver"; } # メール通知
if ($axsflg) { # アクセス制限 : 投稿エラーから戻ってきた場合を除く アイコン選択を除く
	if ($in{'comment'} || $in{'name'} || $in{'email'} || $in{'url'} || $in{'sub'}){
		# 投稿があれば
		&libchk; &axs_taboo; # 登録単語で書込み制限
		if ($list_name_flg){ &list_name_chk; } # 管理者偽称チェック(もしくは会員制掲示板)
	}
}

if (!$diary_no_form){ # ★日記帳モードでの入力フォームの非表示を除く
	if ($mode eq $access_mod_n) { &libchk; &regist; } # mode="regist" : ログ書込処理
	if ($mode eq "usr_del") { &libchk; &usr_del; } # ユーザ記事削除
	if ($mode eq "usr_edt") {
		if ($in{'action'} eq "edit") { &libchk; &usr_edt; } # 記事修正処理
	}
}

# j_lib_x1:その他のライブラリ使用
@lib_file = ();
$lib_file[0] = "$lib_x1<>$lib_x1_ver";
if ($mode eq "howto") { &libchk; &howto; } # 使い方
elsif ($mode eq "howtopic") { &libchk; &howtopic; } # 使い方・複数画像
elsif ($mode eq "admin") { &libchk; &admin; } # 管理モード
elsif ($mode eq "admin2") { &libchk; &admin2; } # 管理モード:●管理用先頭メッセージ
elsif ($mode eq "admin3") { &libchk; &ic_edit; } # 管理モード:◎アイコン編集機能
elsif ($mode eq "past") { &libchk; &past; } # 過去ログ
elsif ($mode eq "check") { &libchk; &check; } # 旧チェックモード

# j_lib_r1,3:ページ表示関係のライブラリ使用
# 目次の各種初期化と、新着一覧
if ($in{'copnum'}){ $in{'contents'} = "on"; } # 目次より表示ページ変更
$con_flg = 0; $con_jmpflg = 0; # 目次表示フラグ、他
if ($in{'cts'} =~ /jmp/i){ $getjump_flg = 1; } # 目次にジャンプ
if ($contents == 1 && $in{'contents'} eq "on"){ $con_flg = 1; } # メニューより表示
if ($contents >= 2 && $in{'contents'} ne "off"){ $con_flg = 1; } # 常時表示
$con_new_flg = 0;
if (($in{'conewday'} || $in{'conewday'} eq "0") && $in{'conewday'} ne $co_new_day){
	$con_new_flg = 1; # 新着期間変更flg
}
$co_pop_lines = 22; # ポップ行数 9行以上が必須
# 新着一覧
@lib_file = ();
$lib_file[0] = "$lib_r1<>$lib_r1_ver";
$lib_file[1] = "$lib_r3<>$lib_r3_ver";
if ($new_con && $mode eq "new") { &libchk; &newcon; }

# j_lib_r1,2:ページ表示関係のライブラリ使用
@lib_file = ();
$lib_file[0] = "$lib_r1<>$lib_r1_ver";
$lib_file[1] = "$lib_r2<>$lib_r2_ver";
&libchk; # 以降は、r1・r2確定なので先に読み込む
if ($mode eq "gfsize") { &gfsize; } # ●投稿画像表示サイズ指定して戻ってきた
if ($in{'pic'}) { # ●投稿画像表示サイズ指定と同等扱い(クッキー保存をする)
	# リンク(画像なし)、掲示板のURLに「?pic=p0~p1」を追加して開いた
	$in{'picsize'} = "pics$in{'pic'}"; &gfsize;
}
if ($in{'iccode'}){ &icpass_set; } # ●アイコンを選択 アイコン専用キー選択
if ($mode eq "imgset" || $mode eq "resimgset") { &imageset; } # ●アイコンを選択して戻ってきた
# 返信フォーム
if ($mode eq "resimgset") { &libchk; &res_form; } # ●アイコンを選択して戻ってきた
elsif ($mode eq "res") { &libchk; &res_form; } # 返信フォーム
if ($mode eq "err-return") { # ●投稿エラーから戻ってきた
	if ($in{'reno'}){ &libchk; &res_form; } # 返信フォーム
}
if ($modereg_flg){
	if ($in{'reno'}){ &libchk; &res_form; } # 返信での画像の数変更
}
	# ☆標準改造版処理
	if ($remake_flg0){$rmk = '処理実行の&html_logの直前:振分skin等'; # remake keyword
		$rtn=0;&rmk_control($rmk); } # sub内より呼出たら$rtn判定
		# if($rtn==1){return 3;}} # ここはsub内ではないのでreturn処理しない

# メール通知のため先行して管理データ読み込み
&ad_rd_all;
# 通常掲示板表示
&html_log;
# メール通知数カウント中
if ($mailing && $mailing_flg){
	$lib_file[0] = "$lib_w2<>$lib_w2_ver"; &libchk; # メール送信のライブラリ
	if ($lockkey) { &lock; }
	$r = &mail_to("蓄積確認");
	if ($lockkey) { &unlock; }
}
exit;

#------------------------#
#  ●ライブラリ読み込み  #
#------------------------#
sub libchk {
	$i = 0;
	foreach (@lib_file) {
		if ($_){
			($l_file,$l_file_ver) = split(/<>/, $_);
			$libchk_flg = 0;
			foreach (@libtbl) { # 
				if ($_ eq $l_file) { $libchk_flg = 1; } # すでに読み込み済み
			}
			if (!$libchk_flg){ # 新しくrequireする
				if (-e $l_file) {
				#	require $l_file;  # ライブラリ読み込み
					$check = eval { require $l_file;};
					if (!$check){
						$tmp = "<FONT color=#009900>只今、掲示板のバージョンアップ作業中と思われます<br>もう少し待ってから、再度掲示板を開いてください m(_ _)m<br><br></b>ライブラリの $l_file が更新中です(あるいは不正)";
						$tmp .= "<br>(自動チェック : ";
						open(PROC,"perl -c $l_file 2>&1 |");
						$tmp .= <PROC>;
						close(PROC);
						$tmp .= ")</FONT><b>";
						&error("$tmp");	
					}
					# この joyfulyy.cgi とライブラリのバージョンを確認する
					if ($lib_ver_check){
						if (!$l_file_ver){ $l_file_ver = $ver; }
						if ($l_file_ver !~ /$lib_ver$/){
							$tmp = '<FONT color=#009900>只今、掲示板のバージョンアップ作業中の可能性があります<br>もう少し待ってから、再度掲示板を開いてみてください m(_ _)m</b><b></FONT>';
							$tmp .= "<br><br></b><FONT color=#000000>「$lib_r1」のバージョンが違っています<br>";
							$l_file_ver =~ s/.*( v.*)$/$1/;
							$tmp .= "バージョンは $l_file_ver であるはずですが、$lib_ver になっています</FONT><b>";
							&error("$tmp");
						}
					}
					push(@libtbl,$l_file);
				} else {
				&error("JOYFULYYライブラリの $l_file が見つかりません<br><br>(現在読み込み済みライブラリ:@libtbl)");	
				}
			}
			$i++;
		}
	}
	# 読み込み確認用
	$testcnt++; # 読み込み順番
	#	if ($testcnt == 2){ &error("読み込み順番=$testcnt / $l_file $l_file_ver"); }
}
#----------------#
#  アクセス制限  #
#----------------#
sub axs_check {
	# ホスト名を取得
	$host = $ENV{'REMOTE_HOST'};
	$addr = $ENV{'REMOTE_ADDR'};
	if ($host eq "" || $host eq $addr) {
		# Windowsの自動判定によるホスト名の取得
		if ( $Win_mode == 0 ){
			if ( -x $script ){ # 
				# パーミッション実行OKなら、UNIXと考えてホスト名取得
				$host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr;
			} else {
				# Windowsと考えてホスト名取得を取得しない
				$host = $addr; # Windows
			}
		}
		# 項目設定の「■その他」の「●ホスト名の取得」で指定した場合
		if ( $Win_mode == 1 ){ $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2) || $addr; }
		if ( $Win_mode == 2 ){ $host = $addr; }
	}

	local($flag)=0;

	if ($deny_flg) {
		foreach (@deny) { # ■アクセス制限(ホスト名、IPアドレス)
			if (!$_) { next; }
			$_ =~ s/\*/\.\*/g;
			if ($host =~ /$_/i) { $flag=1; last; }
		}
		if ($flag) { &error("アクセスを許可されていません"); }
	}
}


#----------------#
#  デコード処理  #
#----------------#
sub decode {
	# $cgi_lib内でのエラーENDをパスする
	$maxdata_bk = $cgi_lib'maxdata;
	if ($cgi_lib'maxdata < 30720000){
		$cgi_lib'maxdata = 30720000; # 約30MB ありえない数を入れて画像オーバーの時に&ReadParse をパスする
	}
	&ReadParse; # デコード処理 $cgi_lib内
	$cgi_lib'maxdata = $maxdata_bk; # 復帰

	# ************** 投稿画像の合計容量チェックは廃止

	while (($key,$val) = each %in) {
		if ($val ne "") { $acc_timing_flg = 1; } # 閲覧時一度のタイミング
		$gf_chk = substr($key,0,6);
		if ($gf_chk ne "upfile") {
			# シフトJISコードに変換
			&jcode'convert(*val, "sjis", "", "z");

			# タグ処理
			$val =~ s/<>/&lt;&gt;/g;
			# ここではタグの不許可の処理を行わない(v2.50y23g2)
			#	if ($tagkey || $key eq "kmsg") { # タグ有効、管理メッセージ
			#		$val =~ s/<>/&lt;&gt;/g;
			#	} elsif($key ne "ok_msg") { # 案内文($ok_msg)を除く
			#		$val =~ s/</&lt;/g;
			#		$val =~ s/>/&gt;/g;
			#	}

			# 改行処理
			if ($key eq "comment" || $key eq "kmsg") { # 記事コメント、管理メッセージ
				$val =~ s/\r\n/<br>/g;
				$val =~ s/\r/<br>/g;
				$val =~ s/\n/<br>/g;
				# 記事の文末に余分な改行(空行)があれば削除(ともくんさん推薦)
				$val =~ s/(<br>)*$//;
				$val =~ s/ $/ <br>/; # 最終行のスペースは有効にする
			} else {
				$val =~ s/\r//g;
				$val =~ s/\n//g;
			}
			if ($key eq "name" || $key eq "sub") {
				$val =~ s/"/'/g;
			}
		}
		$in{$key} = $val;
	}
	$mode = $in{'mode'};
	# 投稿モード名(regist)の時間許可
	# モード名の変更と解除の後に投稿された場合
	if ($mode ne ""){ # v2.50y24m23(迷惑投稿対策)のミスをv2.50y23m24にて修正
		if ($mode eq "regist" || $mode eq $access_mod_n || $mode eq $access_mod_n_bk){
			# (注:「VUP新変数の初期値」にてモード名の初期化は済み)
			if ($access_mod){ # 投稿処理のモード名(regist)を変えている場合
				$tmp = time - $access_mod_n_bktime; # 現在秒からモード名保存時間(秒)を引く
				if ($tmp <= 60*$access_mod_t){ # モードを変えてから一定時間内の場合
					$mode = $access_mod_n; # 現在設定のモード名に変更して許可
				}
			} else {
				# 全て許可
				$mode = $access_mod_n = "regist"; # 通常のモード名に設定 $mode="regist"
			}
		}
	}

	$in{'url'} =~ s/^http\:\/\///;
	# もしURLにタグがあれば無効にする(ともくんさん指摘)
	$in{'url'} =~ s/"/'/g; $in{'url'} =~ s/</&lt;/g; $in{'url'} =~ s/>/&gt;/g;

	$page = $in{'page'};
	if ($in{'sub'} eq "" && !$in_sub){ # 題名が入力必須で無い時
		if ($in{'name'} ne ""){ # 日記帳以前の記事
			$in{'sub'} = "無題";
		}
	}
	if ($in{'no'} ne ""){
		$in{'no'} =~ s/\0/0/g; $in{'no'} =~ s/\1/1/g; $in{'no'} =~ s/\2/2/g; $in{'no'} =~ s/\3/3/g;
		$in{'no'} =~ s/\4/4/g; $in{'no'} =~ s/\5/5/g; $in{'no'} =~ s/\6/6/g; $in{'no'} =~ s/\7/7/g;
		$in{'no'} =~ s/\8/8/g; $in{'no'} =~ s/\9/9/g;
		$in{'no'} =~ s/\s//g; $in{'no'} =~ s/[\. ]//g;# スペース文字削除

	}
	# ●画像数他
	if ($in{'gf_no'}) { $gf_no = $in{'gf_no'}; }
	#	if ($in{'piccom'}) { $piccom = $in{'piccom'}; }
	foreach $gfc (1 .. $gf_maxno) {
		$tmp = "upfile_c$gfc";
		if ($in{$tmp}){ $upfile_c[$gfc] = $in{$tmp}; }
		$tmp = "upfile_p$gfc";
		if ($in{$tmp}){ $upfile_p[$gfc] = $in{$tmp}; }
	}

	# ●追加画像数を変更したときコメント再表示
	if ($in{'picnum'} || $in{'picnsub'}) {
		if ($in{'day'}) {$gfin_day = $in{'day'};}
		if ($in{'sub'}) {$gfin_sub = $in{'sub'};}
		$gfin_com = "";
		if ($in{'comment'}) {
		#	if ($tagkey) { # 文章に &lt; &gt; を書いた所が < >に変換されないように
				$in{'comment'} =~ s/&/&amp;/g;
		#	}
			$gfin_com = $in{'comment'}; $gfin_com =~ s/<br>/\n/g;
		}
	}
	# ●投稿と修正での確認画面
	if ($mode eq "usrok") {
		if ($tagkey) { # 文章に &lt; &gt; を書いた所が < >に変換されないように
			$in{'comment'} =~ s/&/&amp;/g;
		}
		$in{'comment'} =~ s/kigou-Apostrophe-/'/g;
	}
	# ●投稿エラーから戻ってきたコメント再表示
	if ($mode eq "err-return") {
		if ($in{'name'})  { $c_name  = $in{'name'}; }
		if ($in{'email'}) { $c_email = $in{'email'}; }
		if ($in{'url'})   { $c_url   = $in{'url'}; }
		if ($in{'pwd'})   { $c_pwd   = $in{'pwd'}; }
		if ($in{'day'})   { $gfin_day = $in{'day'}; }
		if ($in{'sub'})   { $gfin_sub   = $in{'sub'}; }
	#	if ($tagkey) { # 文章に &lt; &gt; を書いた所が < >に変換されないように
			$in{'comment'} =~ s/&/&amp;/g;
	#	}
		$in{'comment'} =~ s/kigou-Apostrophe-/'/g;
		if ($in{'comment'}) { $gfin_com = $in{'comment'}; $gfin_com =~ s/<br>/\n/g; }
	}
	# ■アイコンBBS
	if ($in{'icon'})  { $c_icon  = $in{'icon'}; }
	if ($c_icon eq "del_icon") {$c_icon = ""; }
	if ($in{'iconurlflg'}){ # アイコンのURL指定
		$url_icon  = $in{'iconurl'};
	}
	if ($in{'select_icon'}) { $select_icon  = $in{'select_icon'}; }
}

#--------------#
#  時間を取得  #
#--------------#
sub get_time {
	$ENV{'TZ'} = "JST-9";
	$times = time;
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times);
	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	# 日時のフォーマット
	$date = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
			$year+1900,$mon+1,$mday,$week[$wday],$hour,$min);
}
sub get_time_s { # 秒まで取得
	$ENV{'TZ'} = "JST-9";
	$times = time;
	($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($times);
	@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
	# 日時のフォーマット
#	$date_s = sprintf("%02d時%02d分",$hour,$min);
	$date_s = sprintf("%04d/%02d/%02d(%s) %02d:%02d:%02d",
			$year+1900,$mon+1,$mday,$week[$wday],$hour,$min,$sec);
}

#------------------#
#  クッキーの発行  #
#------------------#
sub set_cookie {
	# クッキーは60日間有効
	local($sec,$min,$hour,$mday,$mon,$year,$wday) = gmtime(time+60*24*60*60);

	@month=('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
	$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
			$week[$wday],$mday,$month[$mon],$year+1900,$hour,$min,$sec);
	$gmt2 = $gmt; $gmt2 =~ s/,/,gmtb<>/g; # ジャバスクリプトのクッキー保存のため、日時保存
	# ●クッキーで0の判定ができないので、文字"0"に置き換え
	if ($gf_no == 0) { $gf_no = "0"; }
	if (!$picresize){ $gf_sz = 1; }
	if ($in{'iconurlflg'}){ # アイコンのURL指定
		if ($url_icon ne "" && $url_icon ne "http://"){ $c_icon = $url_icon; }
	}
	if ($c_icon eq "del_icon"){$c_icon = ""; }
	# 新着一覧
	$sv_newno = "$newno#$newno_now_sv#$newno_cflg#$co_new_day#$newno_time#$newno_sign";
	# 記号エスケープ
	$tmpname = &set_cook_kigou2($in{'name'});
	$tmpurl = &set_cook_kigou2($in{'url'});
	$tmpcom = &set_cook_kigou($in{'comment'});
	$tmpsub = &set_cook_kigou2($in{'sub'});
	# 連続修正
	$in{'email'} =~ s/連続修正//g;
	$tmpurl =~ s/連続修正//g;
	if ($renzoku_s == 1){ $in{'email'} .= '連続修正'; }
	if ($renzoku_s == 2){ $tmpurl .= '連続修正'; }
	if ($mode eq "usr_edt") { # 記事修正フォームでの操作
		# 修正作業では連続修正は表示しないが変化もしない
		if ($c_email =~ /連続修正/){ $in{'email'} .= '連続修正'; } 
		if ($c_url =~ /連続修正/){ $tmpurl .= '連続修正'; }
	}
	# 画像表示サイズ
	if ($in{'gf_sz'}){ $gf_sz = $in{'gf_sz'}; } # 倍率が保存されないミスを修正 v2.50y24m52
	if (!$picresize2){ $gf_sz = 1; } # 倍率を閲覧者のクッキーに保存しない場合

	# ◆ログに新しいアイテムを追加:クッキー保存 (v2.50y24m63より)
	# 注意! 書き込むデータの中では「-」「<>」に加えて「,」も不可です
	#       もしあれば別の文字列に変換してください
	# 追加の例です↓この1行をここに追加すれば(コメントを外す)すぐにクッキー保存します
	# $new_item[8] = "<.>$my_log<.>$in{'$my_item'}<.>$my_data

	# 通常クッキー作成
	if (@_[0] eq "") {
		# 記事枠色、記事背景色
		if ( $kiji_bd || $kiji_bg ){
			if (!$reno){
				$tmpcol = $in{'color'} . "-" . $in{'color_bd'} . "-" . $in{'color_bg'};
			} else {
				$tmpcol = $in{'color'} . "-" . $c_col_bd . "-" . $c_col_bg;
			}
		} else {
			$tmpcol = $in{'color'};
		}
		$tmpcol .= "-" . join ('-',@new_item);

		#	$tmpname = &set_cook_kigou2($in{'name'});
		$cook="name<>$tmpname\,email<>$in{'email'}\,url<>$tmpurl\,pwd<>$in{'pwd'}\,icon<>$c_icon\,color<>$tmpcol,gf_no<>$gf_no,gf_sz<>$gf_sz,newno<>$sv_newno,gmta<>$gmt2";
	}
	# アイコンを選択するために、記事を一時的にクッキー作成
	if (@_[0] eq "icsel-com") {
		#	$in{'comment'} =~ s/&/&amp;/g; # 文章に &lt; &gt; を書いた所が < >に変換されないように
		#	$tmpcom = &set_cook_kigou($in{'comment'});
		#	$tmpname = &set_cook_kigou2($in{'name'});
		#	$tmpday = $in{'day'};
		#	$tmpsub = &set_cook_kigou2($in{'sub'});
		if ($in{'piccom'}){
			$tmppiccom = ",piccom<>$in{'piccom'}";
			foreach $gfc (1 .. $gf_maxno) {
				$tmp = "upfile_c$gfc";
				if ($in{$tmp}){ $tmppiccom .= ",upfile_c$gfc<>$in{$tmp}"; }
				$tmp = "upfile_p$gfc";
				if ($in{$tmp}){ $tmppiccom .= ",upfile_p$gfc<>$in{$tmp}"; }
			}
		}
		# 記事枠色、記事背景色
		if ( $kiji_bd || $kiji_bg ){
			$tmpcol = $in{'color'} . "-" . $in{'color_bd'} . "-" . $in{'color_bg'};
		} else {
			$tmpcol = $in{'color'};
		}
		$tmpcol .= "-" . join ('-',@new_item);
		$cook="name<>$tmpname,email<>$in{'email'},url<>$tmpurl,pwd<>$in{'pwd'},icon<>$c_icon,color<>$tmpcol,gf_no<>$gf_no,gf_sz<>$gf_sz,newno<>$sv_newno,gmta<>$gmt2,day<>$in{'day'},sub<>$tmpsub,comment<>$tmpcom$tmppiccom";

	}

	# 以下は、記事を編集していない時のクッキー作成

	# 記号エスケープ
	$c_name = &set_cook_kigou2($c_name);
	$c_url = &set_cook_kigou2($c_url);
	# ●新着一覧更新
	if (@_[0] eq "newno" || @_[0] eq "newnooff") {
		# 標準クッキー(に戻す)、再発行
		#	$tmpname = &set_cook_kigou2($c_name);
		if ($in{'color'}){
		} else {
			if ( $kiji_bd || $kiji_bg ){
				$tmpcol = $c_color . "-" . $c_col_bd . "-" . $c_col_bg;
			} else {
				$tmpcol = $c_color;
			}
			$tmpcol .= "-" . join ('-',@new_item);
		}
		$cook="name<>$c_name,email<>$c_email,url<>$c_url,pwd<>$c_pwd,icon<>$c_icon,color<>$tmpcol,gf_no<>$gf_no,gf_sz<>$gf_sz,newno<>$sv_newno,gmta<>$gmt2";
		if (@_[0] eq "newnooff") {
			$cook .= ",newclear<>off";
		}
		if ($COOK{'comment'} || $COOK{'sub'}){ # 書きかけの記事があれば保存する v2.50y16
			$COOK{'comment'} =~ s/&/&amp;/g; # 文章に &lt; &gt; を書いた所が < >に変換されないように
			$cook .= ",day<>$COOK{'day'},sub<>$COOK{'sub'},comment<>$COOK{'comment'}";
		}
	}
	# ●アイコンBBS ●画像表示サイズ変更
	if (@_[0] eq "icset" || @_[0] eq "scope") {
		# アイコンを決定したので、標準クッキーに戻す。再発行。
		#	$tmpname = &set_cook_kigou2($c_name);
		if ( $kiji_bd || $kiji_bg ){ $c_color = $c_color . "-" . $c_col_bd . "-" . $c_col_bg; }
		$cook="name<>$c_name\,email<>$c_email\,url<>$c_url\,pwd<>$c_pwd\,icon<>$c_icon\,color<>$c_color,gf_no<>$gf_no,gf_sz<>$gf_sz,newno<>$sv_newno,gmta<>$gmt2";
		if (@_[0] eq "newnooff") {
			$cook .= ",newclear<>off";
		}
	}

	# URLエスケープ
	$cook =~ s/([^a-zA-Z0-9_.!~*'()-<>#@?&])/'%' . unpack('H2', $1)/eg;

	#	if ($p3p_cookie){ print "P3P: CP=\"ADM NOI\"\n"; } # 旧、●P3P対応v2.50y12まで
	if ($p3p){ print "P3P: CP=\"ADM NOI\"\n"; } # ●P3P対応
	$tok2cookie = "";
	if ($tok2cookie_flg){ # ●Tok2 クッキー対策
		$tok2cookie = "$cookiename=$cook; expires=$gmt\n";
	} else { # 通常のクッキー保存
		#	16320 Internet Explorer でエラーの限界
		#	 5072 Internet Explorer でクッキー保存の限界
		$cooklength = length($cook);
		if ($cooklength >= 5070){ #
			$tmpmsg = "</font>記事文章が多いためにクッキーの一時保存が出来ません";
			$tmpmsg .= "<br>そのため、アイコンの選択はできませんでした <(_ _)>";
			$tmpmsg .= "<br><br>下の「投稿ページへ戻る」ボタンで戻ってください。";
			$tmpmsg .= "<br>一旦記事を投稿した後、記事の修正でアイコンの選択を行えます。($cooklength)";
			&error("$tmpmsg");
		} else {
			print "Set-Cookie: $cookiename=$cook; expires=$gmt\n";
		}
	}

}
sub set_cook_kigou {
	if (@_ ne ''){
		local($tmp) = @_;
		$tmp =~ s/&lt;&gt;/wkakko-kigou/g;
		$tmp =~ s/;/semicolon-kigou/g;
		$tmp =~ s/,/comma-kigou/g;
		$tmp =~ s/=/equal-kigou/g;
		return ($tmp);
	} else {
		return ("");
	}
}
sub set_cook_kigou2 {
	if (@_ ne ''){
		local($tmp) = @_;
		$tmp =~ s/&lt;/k1-kigou/g;
		$tmp =~ s/&gt;/k2-kigou/g;
		$tmp =~ s/</k1-kigou2/g;
		$tmp =~ s/>/k2-kigou2/g;
		$tmp =~ s/;/semicolon-kigou/g;
		$tmp =~ s/,/comma-kigou/g;
		$tmp =~ s/=/equal-kigou/g;
		$tmp =~ s/"/w-quotation/g;
		return ($tmp);
	} else {
		return ("");
	}
}

#------------------#
#  クッキーを取得  #
#------------------#
sub get_cookie {
	local($key, $val, @pairs);
	# URLアンエスケープ
	#	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	$tmp = $ENV{'HTTP_COOKIE'};
	$tmp =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
	@pairs = split(/;/, $tmp);
	foreach (@pairs) {
		($key,$val) = split(/=/);
		$key =~ s/\s//g;
		$GET{$key} = $val;
	}
	@pairs = split(/,/, $GET{$cookiename});
	foreach (@pairs) {
		($key,$val) = split(/<>/);
		# シフトJISコードに変換:クッキー読み込みでの文字化け対策・windowsでの現象
		&jcode'convert(*val, "sjis", "", "z");
		$COOK{$key} = $val;
	}
	$c_name  = $COOK{'name'};
	#	$c_name = &get_cook_kigou($c_name);
	$c_email = $COOK{'email'};
	if (!$diary){ # 日記帳では、クッキーのURLは取らない
		$c_url   = $COOK{'url'};
	}
	$c_pwd   = $COOK{'pwd'};
	$c_icon  = $COOK{'icon'};
	if ($c_icon =~ /http:/) {$url_icon = $c_icon; $c_icon = ""; }
	$gfin_sub   = $COOK{'sub'};

	if ($in{'name'})  { $c_name  = $in{'name'}; }
	if ($in{'email'}) { $c_email = $in{'email'}; }
	if ($in{'url'})   { $c_url   = $in{'url'}; }
	if ($in{'pwd'})   { $c_pwd   = $in{'pwd'}; }
	if ($in{'sub'})   { $gfin_sub   = $in{'sub'}; }

	if ($in{'icon'})  { $c_icon  = $in{'icon'}; }
	if ($c_icon eq "del_icon") {$c_icon = ""; }
	if ($in{'iconurlflg'}){ # アイコンのURL指定
		$url_icon = $in{'iconurl'};
	}

	$c_color = $COOK{'color'};
	if ( $c_color =~ /-/ ){ # 個別記事の枠色背景色を取り出し
		($c_color_ch,$c_col_bd,$c_col_bg,@new_item) = split(/-/, $c_color);
		$c_color = $c_color_ch;
	}
	if ($in{'color'}) { $c_color = $in{'color'}; }
	if ($in{'color_bd'}) { $c_col_bd = $in{'color_bd'}; }
	if ($in{'color_bg'}) { $c_col_bg = $in{'color_bg'}; }

	# ◆ログに新しいアイテムを追加:クッキー読取り (v2.50y24m63より)
	# 追加の例です↓この1行をここに追加すれば(コメントを外す)すぐにクッキー読取りします
	# ($dummy,$my_log_cook,$my_item_cook,$my_data_cook) = split(/<.>/, $new_item[8]);

	# ●投稿画像数
	$flg = 1; # クッキーから取り込みフラグ
	if (!$gf_no_cookie){ # 入力フォームの行数変更をクッキーに保存しない(0:no 1:yes)
		$flg = 0;
		if ($in{'mode'} eq "imgset"){ $flg = 1; }
		if ($in{'mode'} eq "resimgset"){ $flg = 1; }
		if ($in{'mode'} eq "res"){ $flg = 1; }
		if ($in{'mode'} eq "ok"){ $flg = 1; }
	}
	if ($flg){ 
		if ( $COOK{'gf_no'} || $COOK{'gf_no'} eq "0" ) {$gf_no = $COOK{'gf_no'};}
	}
	# ●クッキーで0の判定ができないので文字"0"に置き換えた
	if ($gf_no eq "0") { $gf_no = 0; }
	# ●投稿画像数を変更して戻ってきた
	if ($in{'picnum'}) {
		foreach $gfc (0 .. $gf_maxno) {
			$tmp = $gfc;
			if (length($tmp) <= 1){ $tmp = "0" . $tmp; }
			$tmp = "picn" . $tmp;
			if ($in{'picnum'} eq $tmp) { $gf_no = $gfc; last; }
		}
	}
	if ($in{'picnsub'}) {
		if ($in{'comment'}) {$gfin_com = $in{'comment'};}
		if ($in{'day'}) {$gfin_day = $in{'day'};}
		if ($in{'sub'}) {$gfin_sub = $in{'sub'};}
		#	$gfin_com = &get_cook_kigou($gfin_com);
		#	$gfin_sub = &get_cook_kigou2($gfin_sub);
		#	$c_name = &get_cook_kigou2($c_name);
	}

	# ●投稿画像表示サイズ
	if ($COOK{'gf_sz'} ne "") {$gf_sz = $COOK{'gf_sz'};} else { $gf_sz = 1; }
	#	if ($in{'gf_sz'} ne "") { $gf_sz = $in{'gf_sz'}; }
	# ●投稿画像表示サイズを変更して戻ってきた
	if ($in{'picsize'}) {
		if ($in{'picsize'} eq "pics04") { $gf_sz = 0.4; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics06") { $gf_sz = 0.6; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics08") { $gf_sz = 0.8; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics10") { $gf_sz = 1.0; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics13") { $gf_sz = 1.3; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics17") { $gf_sz = 1.7; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics20") { $gf_sz = 2.0; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics25") { $gf_sz = 2.5; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics30") { $gf_sz = 3.0; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics40") { $gf_sz = 4.0; $picsize_flg = 1; }
		if ($in{'picsize'} eq "pics50") { $gf_sz = 5.0; $picsize_flg = 1; }
		if ($in{'picsize'} eq "picsp1") { $gf_sz = "p1"; $picsize_flg = 1; } # リンク(大画像なし)
		if ($in{'picsize'} eq "picsp0") { $gf_sz = "p0"; $picsize_flg = 1; } # リンク(全画像なし)
		if ($in{'picsize'} eq "pics00") { $gf_sz = "p0"; $picsize_flg = 1; } # 予備
	}
	if (!$picresize){ # 画像ファイルの表示変更の許可 → 0:許可しない
		$gf_sz = 1.0; # 設定が許可しないに変更されたら原寸表示 (v2.50y24m4)
	}

	# ■アイコンを選択して戻ってきた。アイコン選択の時にコメントを復活
	if ($mode eq "imgset" || $mode eq "resimgset") { 
		if ($COOK{'comment'} || $COOK{'sub'}) { # 書きかけの記事があれば
			if ($COOK{'comment'}) {$gfin_com = $COOK{'comment'};}
			#	$gfin_com = &get_cook_kigou($gfin_com);
			#	$gfin_com =~ s/&/&amp;/g;
			if ($COOK{'day'}) {$gfin_day = $COOK{'day'};}
			if ($COOK{'sub'}) {$gfin_sub = $COOK{'sub'};}
			# if ($COOK{'piccom'}) {$piccom = $COOK{'piccom'};}
			foreach $gfc (1 .. $gf_maxno) {
				$tmp = "upfile_c$gfc";
				if ($COOK{$tmp}){ $upfile_c[$gfc] = $COOK{$tmp}; }
				$tmp = "upfile_p$gfc";
				if ($COOK{$tmp}){ $upfile_p[$gfc] = $COOK{$tmp}; }
			}
		}
		#	$gfin_sub = &get_cook_kigou2($gfin_sub);
		#	$c_name = &get_cook_kigou2($c_name);
	}

	# 記号アンエスケープ
	$c_name = &get_cook_kigou2($c_name);
	$gfin_sub = &get_cook_kigou2($gfin_sub);
	$c_url = &get_cook_kigou2($c_url);
	$gfin_com = &get_cook_kigou($gfin_com);
	if ($mode eq "imgset" || $mode eq "resimgset") { # アイコンを選択して戻ってきた
		$gfin_com =~ s/&/&amp;/g;
	}

	$sv_newno = $COOK{'newno'}; # 到着最新№
	($newno,$newno_now_sv,$newno_cflg,$t1,$newno_time,$newno_sign) = split(/#/, $sv_newno);
	if (!$co_new_day_ck){ # 新着期間のクッキー保存する (0=する 1=しない)
		if ($t1 || $t1 eq "0"){ $co_new_day = $t1; }
	} elsif ($in{'co_new_day'}){ # クッキー保存しない
		$co_new_day = $in{'conewday'};
	}
	$newno_cflg = "0";
	if ($COOK{'newclear'} eq "off"){ # javascriptで作った到着サインクリアの印 newclear<>off
		$newno_cflg = "1";
		&get_time; &set_cookie("newno"); # クッキーを再発行、newclearは無くなる
	}
}

sub get_cook_kigou { # コメント
	if (@_ ne ''){
		local($tmp) = @_;
		$tmp =~ s/<br>/\n/g;
		$tmp =~ s/wkakko-kigou/<>/g;
		$tmp =~ s/semicolon-kigou/;/g;
		$tmp =~ s/comma-kigou/,/g;
		$tmp =~ s/equal-kigou/=/g;
		return ($tmp);
	} else {
		return ("");
	}
}
sub get_cook_kigou2 { # 名前、題名
	if (@_ ne ''){
		local($tmp) = @_;
		$tmp =~ s/k1-kigou/&lt;/g;
		$tmp =~ s/k2-kigou/&gt;/g;
		$tmp =~ s/k1-kigou2/</g;
		$tmp =~ s/k2-kigou2/>/g;
		$tmp =~ s/semicolon-kigou/;/g;
		$tmp =~ s/comma-kigou/,/g;
		$tmp =~ s/equal-kigou/=/g;
		$tmp =~ s/w-quotation/'/g;
		return ($tmp);
	} else {
		return ("");
	}
}

sub get_cookie_part { # 新着一覧クッキー情報
	local($key, $val, @pairs);
	@pairs = split(/;/, $ENV{'HTTP_COOKIE'});
	foreach (@pairs) {
		($key,$val) = split(/=/);
		$key =~ s/\s//g;
		$GET{$key} = $val;
	}
	@pairs = split(/,/, $GET{$cookiename});
	foreach (@pairs) {
		($key,$val) = split(/<>/);
		$COOK{$key} = $val;
	}
	$sv_newno = $COOK{'newno'};
	($newno,$newno_now_sv,$newno_cflg,$t1,$newno_time,$newno_sign) = split(/#/, $sv_newno);
	if ($t1 || $t1 eq "0"){ $co_new_day = $t1; }
	if ($COOK{'newclear'} eq "off"){ # javascriptで作った到着サインクリアの印 newclear<>off
		$newno_cflg = "1";
		&get_time; &set_cookie("newno"); # クッキーを再発行、newclearは無くなる
	}
	if ($newno_cflg ne "1"){ $newno_cflg = "0"; }
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	# 1分以上古いロックは削除する
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) { &unlock; }
	}
	# symlink関数チェック
	if ($lockkey == 1) { # チェック結果で自動変更する
		$scheck = eval { symlink("",""); 1; };
		if ($scheck != 1) { $lockkey = 2; }
	}
	# symlink関数式ロック
	local($retry) = 5;
	if ($lockkey == 1) {
		while (!symlink(".", $lockfile)) {
			if (--$retry <= 0) {
				$lockfile_name = $lockfile; $lockfile_name =~ s/.*\/([^\/]*)$/$1/;
				$msg2 = "[管理用アドバイス]";
				$msg2 .= "<UL><LI>このエラーが連続して繰り返されるときは、lock ディレクトリの中の";
				$msg2 .= "「$lockfile_name」を消去してみてください";
				$msg2 .= "<LI>それでも改善しない時には、項目設定の「■ファイルロック」の";
				$msg2 .= "ファイルロック形式を「2=mkdir関数」に設定してください。</UL>";
				&error('LOCK is BUSY (symlink)<br>只今投稿が立て込んでいます、再度試みてください',$msg2,"t");
			}
			sleep(1);
		}
	# mkdir関数式ロック
	} elsif ($lockkey == 2) {
		while (!mkdir($lockfile, 0755)) {
			if (--$retry <= 0) {
				$lockfile_name = $lockfile; $lockfile_name =~ s/.*\/([^\/]*)$/$1/;
				$msg2 = "<DL><DT>[管理用アドバイス]";
				$msg2 .= "<DD>このエラーが連続して繰り返されるときは、lock ディレクトリの中の";
				$msg2 .= "「$lockfile_name」ディレクトリを消去してみてください";
				$msg2 .= "</DL>";
				&error('LOCK is BUSY (mkdir)<br>只今投稿が立て込んでいます、再度試みてください',$msg2,"t");
			}
			sleep(1);
		}
	}
	$lockflag=1;
}

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

#-----------------#
#  URLエンコード  #
#-----------------#
sub url_enc {
	local($_) = @_;
	s/(\W)/'%' . unpack('H2', $1)/eg;
	s/\s/+/g;
	$_;
}

#----------------------#
#  パスワード照合処理  #
#----------------------#
sub decrypt {
	local($inpw, $logpw) = @_;
	local($salt, $key, $check);
	$salt = $logpw =~ /^\$1\$(.*)\$/ && $1 || substr($logpw, 0, 2);
	$check = "no";
	if (crypt($inpw, $salt) eq "$logpw" || crypt($inpw, '$1$' . $salt) eq "$logpw")
		{ $check = "yes"; }
	return $check;
}

#--------------------------------#
#  日記帳記事パスワードチェック  #
#--------------------------------#
sub usr_diarypwdchk {
	&header;
	print "<center>\n";
	print "<b>- 記事No \"$in{'no'}\"のパスワード(修正キー)を入れてください -</b><br>\n";
	print "<form action=\"$script\" method=\"POST\">\n";
	print "この記事は日記帳の記事ではなく、掲示板の記事です。<br>\n";
	print "この記事を投稿したときのパスワード(修正キー)を入れてください。<br>\n";
	print "<br><br>\n";
	print "パスワード(修正キー)\n";
	print "<input class=form1 type=password name=pwd size=8 maxlength=20>\n";
	print "<input class=formb type=submit value=\"送信\"$on_mouse1>\n";
	print "<input type=hidden name=mode value=\"$in{'mode'}\">\n";
	print "<input type=hidden name=no value=\"$in{'no'}\">\n";
	print "<input type=hidden name=kpass value=\"$in{'kpass'}\">\n";
	print "</form></center>\n";
	if ($lockkey && $lockflag) { &unlock; }
	if ($test_sleep){ sleep($test_sleep_exit); }
	exit;
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	&unlock if ($lockflag);
	$pic_popup2 = 0; # ポップアップなし
	&header if (!$head_flag);
	# print "<center><hr width=400><h3>ERROR !</h3>\n";
	print "<center><TABLE bgcolor=\"#f8f8f8\" width=\"70%\" style=\"color : navy;\">\n";
	print "<TR><TD align=\"center\">\n";
	if ($_[3] eq "投稿済"){
		print "<hr width=400><h3>$_[0]</h3>\n";
	} else {
		print "<hr width=400><h3>ERROR !</h3>\n";
		print "<font color=red><B>$_[0]</B></font>\n";
	}
	if ($_[1]){
		print "<P>";
		if ($_[2] eq "t"){ print "<TABLE style=\"color : navy;\"><TR><TD>\n"; }
		print "$_[1]\n";
		if ($_[2] eq "t"){ print "</TD></TR></TABLE>\n"; }
	}
	# ● 追加
	if ($_[0] =~ /Open Error/){
		if ($_[0] =~ /$logfile_bk/){
			print "<P>自動生成した、ログのバックアップファイルを開けません<br>";
			print "FTP接続でこのファイルのパーミッションを「666」などに変更してください\n";
		} elsif ($_[0] =~ /$logrecov/){
			print "<P>自動生成した、ログ破損対策用のファイルを開けません<br>";
			print "FTP接続でこのファイルのパーミッションを「666」などに変更してください\n";
		} else {
			print "<P><a href='$script?mode=admin'>ファイルが開けません。管理者は、こちらからファイルチェックを行ってください。</a>\n";
		}
	}
	if ($_[0] =~ /Write Error : $logfile_bk/){
		print "<P><TABLE style=\"color : navy;\"><TR><TD>";
		print "ログのバックアップファイル($logfile_bk)を自動生成しようとしましたが、<br>";
		print "作成、もしくは書き込みに失敗しました。<br>";
		print "この掲示板の入っているディレクトリ(フォルダー)のパーミッションをチェックして変更してください。<br>";
		print "通常は「777」に変更します。<br>";
		print "サーバーによっては独自の指定があるかもしれません。その時には /img/ ディレクトリ等と同じにします。<br>";
		print "(サーバーがWindowsの場合には $logfile_bk が読み取り専用かどうかチェックしてください)<br>";
		print "<br>";
		print "[参考]<br>";
		print "  掲示板の入っているディレクトリとは、通常 /joyfulyy/ という名前で、<br>";
		print "  joyfulyy.cgi j_set.cgi などが入っているディレクトリのことです。</TD></TR></TABLE>\n";
	}
	print "<P><B>$ver</B>\n";
	print "<P><hr width=400>\n";
	print "</TD></TR>\n";

	if ($_[3] eq "投稿済"){ exit; }

	# 投稿ページへ戻る
	if ($in{mode} eq $access_mod_n || $in{mode} eq "usr_edt" ){ # mode="regist"
		# 投稿内容があるときには、ページへ戻るボタンの表示
		$toukou_ckflg = 0;
		foreach $gfc (0 .. $gf_maxno) { # 投稿画像がある時
			$gf_tmp = "upfile$gfc"; # if () { &UpFile; }
			if ($in{$gf_tmp}) { $toukou_ckflg = 1; }
		}
		if ($in{'comment'} || $in{'name'} || $in{'email'} || $in{'url'} || $in{'sub'}) { $toukou_ckflg = 1; }
		if ($toukou_ckflg){
			print "<TR><TD align=\"center\" nowrap>\n";
			if ($in{'reno'}){
				print "<form action=\"$script#RES\" method=\"POST\">\n";
			} elsif ($in{mode} eq $access_mod_n ){ # mode="regist"
				print "<form action=\"$script#regist\" method=\"POST\">\n";
			} else {
				print "<form action=\"$script\" method=\"POST\">\n";
			}
			print "<input type=hidden name=mode value=\"err-return\">\n";
			print "<input type=hidden name=re-mode value=\"$in{mode}\">\n";
			if ($logerror){print "<input type=hidden name=logerror value='$logerror'>\n";}

			if ($in{'formmode'}){print "<input type=hidden name=formmode value='$in{'formmode'}'>\n";}
			if ($in{'name'}){print "<input type=hidden name=name value='$in{name}'>\n";}
			if ($in{'email'}){print "<input type=hidden name=email value=\"$in{email}\">\n";}
			if ($in{'url'}){print "<input type=hidden name=url value=\"$in{url}\">\n";}
			if ($in{'sub'}){print "<input type=hidden name=sub value='$in{sub}'>\n";}

			if ($tagkey) { # 文章に &lt; &gt; を書いた所が < >に変換されないように
				$in{'comment'} =~ s/&/&amp;/g;
			}
			$in{'comment'} =~ s/'/kigou-Apostrophe-/g;
			if ($in{'comment'}){print "<input type=hidden name=comment value='$in{comment}'>\n";}

			if ($in{'piccom'}){print "<input type=hidden name=piccom value=\"$in{'piccom'}\">\n";}
			foreach $gfc (1 .. $gf_maxno) {
				if ($upfile_c[$gfc]){
					print "<input type=hidden name=upfile_c$gfc value=\"$upfile_c[$gfc]\">\n";
				}
				if ($upfile_p[$gfc]){
					print "<input type=hidden name=upfile_p$gfc value=\"$upfile_p[$gfc]\">\n";
				}
			}
			if ($in{'day'}){print "<input type=hidden name=day value=\"$in{'day'}\">\n";}
			if ($in{'no'}){print "<input type=hidden name=no value=\"$in{'no'}\">\n";}
			if ($in{'reno'}){print "<input type=hidden name=reno value=\"$in{'reno'}\">\n";}
			if ($in{'icon'}){print "<input type=hidden name=icon value=\"$in{'icon'}\">\n";}
			if ($in{'iconurl'}){print "<input type=hidden name=iconurl value=\"$in{'iconurl'}\">\n";}
			if ($in{'iconurl_dis'}){print "<input type=hidden name=iconurl_dis value=\"$in{'iconurl_dis'}\">\n";}
			if ($in{'pwd'}){print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";}
			if ($in{'kpass'}){print "<input type=hidden name=kpass value=\"$in{'kpass'}\">\n";}
			print "<br><INPUT class=formb type=submit name=\"err-ret\" value=\" 投稿ページへ戻る \"$on_mouse1>\n";

			print "<br><br><b>投稿画像の選択(参照ボタン)は、セキュリティーの為にクリア</b>されてしまいますので再選択してください。\n";
			print "<br><br>ブラウザの戻るボタンを使うと、投稿記事を書き込んだページに戻れない場合がありますので、\n";
			print "<br>このボタンを使って、投稿ページに戻るようにしてください。記入中の文章は消えません。\n";
			print "</form></TD></TR>\n";
		}
	}
	if (!$toukou_ckflg){ # その他も戻る
		print "<TR><TD align=\"center\">\n";
		if ($in{p_pos}){ # 戻り先$in{p_pos}があればもどる
			print "<form action=\"$script#$in{p_pos}\" method=\"POST\">\n";
			print "<input type=hidden name=mode value=\"err-return\">\n";
			if ($in{'pwd'}){print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";}
			if (!$in{'usr_diary'}){ # 日記帳モードの管理者modeに入る送信(ページ最下部)を除く
				if ($in{'kpass'}){print "<input type=hidden name=kpass value=\"$in{'kpass'}\">\n";}
			}
			if ($in{'no'}){print "<input type=hidden name=no value=\"$in{'no'}\">\n";}
			print "<br><INPUT class=formb type=submit name=\"err-ret\" value=\" 戻る. \"$on_mouse1>\n";
			print "</form>\n";
		} elsif ($in{'no'} || $in{'pwd'} || $in{'kpass'} ) { # その他の、記事の修正削除の依頼
			print "<form action=\"$script\" method=\"POST\">\n";
			if ($in{'pwd'}){print "<input type=hidden name=pwd value=\"$in{'pwd'}\">\n";}
			if ($in{'kpass'}){print "<input type=hidden name=kpass value=\"$in{'kpass'}\">\n";}
			print "<br><INPUT class=formb type=submit name=\"err-ret\" value=\" 戻る.. \"$on_mouse1>\n";
			print "</form>\n";
		}
		print "</TD></TR>\n";
	}
	print "</TABLE>\n";
	print "</center></body></html>\n";
	if ($lockkey && $lockflag) { &unlock; }
	if ($test_sleep){ sleep($test_sleep_error); } # 制作時メモリ使用量を見る
	elsif ($_[0] =~ /123sleep/){ sleep($test_sleep_error); }
	exit;
}


#------------------#
#  HTMLのヘッダー  #
#------------------#
# スクロールバー改変
# body,tr,td,th { font-size: $b_size; font-family: "$face" 
sub header {
	$head_flag=1;

	# 各種色を入れ替え
	if ($mode eq "new" || $mode eq "find" || $usr_ok_flg || $mode eq "admin" || $mode eq "usrok"){
		# 新着一覧、ワード検索、確認画面、管理
		$newpage_flg = 1;
	}
	# 特別に入力フォームの色を入れ替え
	if ($newpage_flg && $newpage == 2){ # 新着一覧独自設定
		if ($newpage_form_bdc)  { $form_bordercol = $newpage_form_bdc; }
		if ($newpage_form_bc)   { $form_bgcolor = $newpage_form_bc; }
		if ($newpage_button_on) { $button_on_col = $newpage_button_on; }
		if ($newpage_tx3) { $tx3 = $newpage_tx3; }
	}

	if ($lk_under == 0){ $linktxtdec1 = "text-decoration : none ;"; } else { $linktxtdec1 = ""; }
	if ($lk_bgcol ne ""){ $linktxtdec1 .= "background-color : $lk_bgcol ;"; }
	if ($lk_ho_under == 0){ $linktxtdec2 = "text-decoration : none ;"; } else { $linktxtdec2 = "text-decoration : underline ;"; }
	if ($lk_ho_bgcol ne ""){ $linktxtdec2 .= "background-color : $lk_ho_bgcol ;"; }

	# ともくんさんのご指摘で「charset指定」をここにも追加しました。
	# Locationでページを表示した時の文字化け回避策です。(v2.50y22)
	print "Content-type: text/html; charset=Shift_JIS\n\n";

	if ($html_pub) {
		print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
	}
	print "<html>\n<head>\n";

	if ($script_head0_flg) {
		print "<!-- option script -->\n";
		print "$script_head0<!-- option end -->\n";
	}
	# HTMLタグ用の、タイトルの作成
	$title0 = $title;
	$title0 =~ s/<br>//ig;
	$title0 =~ s/<[a-zA-Z][^>]*>//ig;
	$title0 =~ s/<\/[a-zA-Z][^>]*>//ig;

	$title_plus = "";
	if ($mode eq "new") { $title_plus = "新着一覧:"; } # 新着一覧

	# <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
	# <META HTTP-EQUIV="Content-Script-Type" content="text/javascript">
	print "<META HTTP-EQUIV=\"Content-type\" CONTENT=\"text/html; charset=Shift_JIS\">\n";
	print "<META HTTP-EQUIV=\"Content-Script-Type\" content=\"text/javascript\">\n";
	if ($tok2cookie_flg && $tok2cookie){ # ●Tok2 クッキー対策 クッキー保存内容があれば保存
		print "<meta http-equiv=\"Set-Cookie\" content=\"$tok2cookie\">";
	}

	print <<"EOM";
<title>$title_plus$title0</title>
<STYLE type="text/css">
<!--
body,tr,td,th { font-size: $b_size; 
scrollbar-face-color: $gf_scol1; /*スクロールバー本体の色*/
scrollbar-highlight-color: $gf_scol1; /*スクロールバー左側(上)の影*/
scrollbar-shadow-color: $gf_scol1; /*スクロールバー右側(上)の影*/
scrollbar-3dlight-color: $gf_scol2; /*スクロールバーの左側(下)の影*/
scrollbar-arrow-color: $gf_scol2; /*矢印の色*/
scrollbar-track-color: $gf_scol3; /*背面の色*/
scrollbar-darkshadow-color: $gf_scol2;/*スクロールバー右側(下)の影*/
font-family: "$face" 
}
.form1 { font-size: $b_size; color: $tx2; border-top: solid $form_bordercol 1px; border-bottom: solid $form_bordercol 1px; border-left: solid $form_bordercol 1px; border-right: solid $form_bordercol 1px; background-color: $form_bgcolor }
.form2 { font-size: $b_size; color: $tx2; border-width : 0px ;}
.formb{
font-size: $b_size; color : $tx3;
 border-top: solid $form_bordercol 1px; border-bottom: solid $form_bordercol 1px; border-left: solid $form_bordercol 1px; border-right: solid $form_bordercol 1px; border-color : $form_bordercol; background-color: $button_bg_col;
 }
.form1 { font-size: $b_size; color: $tx2; border-top: solid $form_bordercol 1px; border-bottom: solid $form_bordercol 1px; border-left: solid $form_bordercol 1px; border-right: solid $form_bordercol 1px; background-color: $form_bgcolor }
.form2 { font-size: $b_size; color: $tx2; border-width : 0px ;}
.formb{
font-size: $b_size; color : $tx3;
 border-top: solid $form_bordercol 1px; border-bottom: solid $form_bordercol 1px; border-left: solid $form_bordercol 1px; border-right: solid $form_bordercol 1px; border-color : $form_bordercol; background-color: $button_bg_col;
 }

a:link		{color : $lk; $linktxtdec1}
a:visited	{color : $vl; $linktxtdec1}
a:active	{color : $al; $linktxtdec1}
a:hover		{color : $al; $linktxtdec2}
HR{ color : $line_color; }
small { font-size: $b_size_small; }

EOM
	$tmplc = $line_color;
	if ($mode eq "new" || $mode eq "find"){ # 新着一覧、ワード検索
		if ($new_hr && $new_hr_col){ $tmplc = $new_hr_col; }
		print "HR{ color : $tmplc; }\n";
		print "small { font-size: $b_size_small; }\n";
	}

	if ($op_style_flg) {
		print "$op_style\n";
	}

	print <<"EOM";
-->
</STYLE>

EOM

	# JavaScript 出力
	if (($pic_popup2 || $mode eq "new") && !$keitai){ # 携帯を除く
		$script_flg = 1;
	}
	if ($script_flg){
		print <<"EOM";
<script language="JavaScript">
<!--
EOM
		if ($test_escape){ print "alert(\"Windows XP:JavaScript関連バグを回避します\");\n"; }
	}

	# ポップアップウィンドウで表示、新着一覧のポップウィンドウ
	if ( $pic_popup2 && $script_flg){ 
		if ( $pic_popup2 == 2 ){ # 2:従来表示、ブラウザお任せ
			$str = 'var pic_popup = 2;';
		#	$str = 'str = ",resizable";';
		} else { # 1:センター表示
			$str = 'var pic_popup = 1;';
		#	$str = 'str = ",left=" + Pwscr + ",top=" + Phscr + ",screenX=0,screenY=0,resizable";';
		}

		if ($r_click == 1){ # 右クリック 画像の種別とサイズを表示
			$alert_msg = "alert(tail+\"画像_サイズ=\"+Awidth+\"x\"+Aheight+\"(pixel)\");";
			$alert_msg2 = "alert('\"+tail+\"画像_サイズ=\"+Awidth+\"x\"+Aheight+\"(pixel)');";
		} elsif($r_click == 2) {
			$r_click_m =~ s/ //;
			$alert_msg2 = $alert_msg = "alert('$r_click_m');";
		}
		if ($r_click){ # IEで右クリック 記事の縮小表示
			# function PopWindowに挿入
			$r_click_s= <<"EOM";
	if(document.all){
		if(event.button == 2){
			tail=tail.replace(/\./,"");
			$alert_msg return(false);
		}
	}
EOM
		}
		# 拡大画像の制御
		if (!$r_click){ # 右クリック制御をしない
			$r_click_k= "<img src='\" + Aurl + \"' onclick=window.close(); style=cursor:pointer;>";
		} else { # 右クリック制御(NSではwindow.closeのみ機能)
			$r_click_k= "<img src='\" + Aurl + \"' onmousedown=JavaScript:flg='';if(document.all){if(event.button==2){$alert_msg2;flg=1;}}if(!flg){window.close()}; style=cursor:pointer;>";
		}

	# 掲示板での右クリック無効
	# onmousedownを使っているためか、NSで右クリック無効はなぜかこの方法のみ
	# <提供> コンテキストメニューを抑止する - Web標準普及プロジェクト
	# http://www.mozilla.gr.jp/standards/webtips1002.html
	# 別途、JOYFULYY独自SCRIPTにより、
	# IEでは掲示板で右クリック無効になるが画像右クリックで独自のアラートを出す
	# NSで画像右クリックすると拡大画像表示&閉じる
	if ($r_click){ 
		$click_sp = <<'EOM';
/*////////////<提供>
コンテキストメニューを抑止する - Web標準普及プロジェクト
http://www.mozilla.gr.jp/standards/webtips1002.html
=======================================================*/
function DisableOnContextMenu(ev) {
  return false;
}
function DisableContextMenu(ev) {
  if (ev) {
    if (ev.button && ev.button == 2) {
      return false;
    } else if (!ev.button && ev.which == 3) {
      return false;
    } else if (navigator.platform.indexOf('Mac')!=-1
      && navigator.appName == 'Netscape') {
      return false;
    }
  } else {
    if (event && event.button && event.button == 2) {
      return false;
    }
  }
}
if (navigator.appName == 'Netscape'
  && !(navigator.platform.indexOf('Mac')!=-1)) {
  document.captureEvents(Event.MOUSEDOWN);
}
if(navigator.appName=='Microsoft Internet Explorer'
    || navigator.appName=='Netscape'){
  document.onmousedown=DisableContextMenu;
  document.oncontextmenu=DisableOnContextMenu;
}
EOM
	# ↑ IE および NSに限定した(opera Safari Firebird Firfox Konqueror Gecko など利かない)

		print "$click_sp";

		$click_sp = "<script language='JavaScript'>$click_sp</script>";
		$click_sp =~ s/  //g;
		$click_sp =~ s/\n//g;
		$click_sp =~ s/\r//g;
	}

		print <<"EOM";
/*//////////// フルスクリ-ン幅get用指定用関数   UseFree
========================================================
 Win  n4 n6 moz e4 e5 e6,
 Mac  n4 n6 moz e4.5 e5,
 Linux n4 n6 moz         
========================================================
 ルスクリ-ン幅をピクセル単位で取得する
 Support http://game.gr.jp/js/
=======================================================*/
function getScreenWIDTH(){
	if(!!window.screen)
		return screen.width        //N4,N6,Moz,IE,共用
	else
		return null                //上記以外
}
function getScreenHEIGHT(){
	if(!!window.screen)
		return screen.height       //N4,N6,Moz,IE,共用
	else
		return null                //上記以外
}
/*//////////// フルスクリ-ン幅get用指定用関数ここまで */
var sw1; var sw2; var pitch1; var pitch2; var str;
function PopWindow(Aurl,Aname,Awidth,Aheight,tail){
$r_click_s
	sw1 = 0; sw2 = 0; pitch1 = 14; pitch2 = 36; pitch3 = 24;
	getSW = getScreenWIDTH();
	getSH = getScreenHEIGHT() - pitch2;
	if(getSW < (Awidth - 0) + (pitch1 * 2)){
		Pwidth = getSW - pitch1; sw1 = 1;
		Pwscr = 0;
	} else {
		Pwidth = (Awidth - 0) + pitch3 ;
		Pwscr = (getSW - pitch1 - Pwidth) / 2;
	}
	if(getSH < (Aheight - 0) + (pitch2 * 2)){
		Pheight = getSH - pitch2; sw2 = 1;
		Phscr = 0;
	} else {
		Pheight = (Aheight - 0) + pitch3 ;
		Phscr = (getSH - pitch2 - Pheight)/ 2 ;
	}
	if(!sw1 && sw2){
		Pwidth = (Pwidth - 0) + pitch1;
		Pwscr = (getSW - pitch1 - Pwidth) / 2;
	}
	if(sw1 && !sw2){
		Pheight = (Pheight - 0) + pitch2 / 2;
		Phscr = (getSH - pitch2 - Pheight)/ 2 ;
	}
	$str
	if ( pic_popup == 2 ){
		str = ",resizable";
	} else {
		str = ",left=" + Pwscr + ",top=" + Phscr + ",screenX=0,screenY=0,resizable";
	}
	if(sw1 || sw2){
		str += ",scrollbars";
	}
	if(Pwidth < 40){Pwidth = 40}
	if(Pheight < 80){Pheight = 80}
	Astr = "width=" + Pwidth + ",height=" + Pheight + str;
//	拡大画像をクリックすると閉じる
	subwin = window.open('','',Astr);
	subwin.document.open();
	subwin.document.write( "<ht" + "ml><he" + "ad>\\n");
	subwin.document.write( "</he" + "ad>\\n");
	subwin.document.write( "<bo" + "dy" +  ">\\n");
	subwin.document.write( "$click_sp\\n");
	subwin.document.write( "$r_click_k\\n");
	subwin.document.write( "");
	subwin.document.write( "</bo" + "dy></ht" + "ml>");
	subwin.document.close();
}

EOM
	}



	# 新着一覧のポップウィンドウ
	if ($mode eq "new" && $script_flg){
		print <<"EOM";
/* 新規一覧ページ自動更新のポップウィンドウ (広告挿入対策済み)*/
function PopWindow2(winname,ttl,msg1,msg2,tmpbodybg){
	newpop = window.open('',winname,'width=330,height=220,scrollbars,resizable');
	newpop.focus();
	newpop.window.document.open();
	newpop.window.document.write( "<ht" + "ml><he" + "ad><ti" + "tle>" + ttl);
	newpop.window.document.write( "</ti" + "tle></he" + "ad>\\n");
	newpop.window.document.write( "<STYLE type=text/css>");
	newpop.window.document.write( "<!-- ");
	newpop.window.document.write( "body,tr,td,th { ");
	newpop.window.document.write( "scrollbar-face-color: $gf_scol1; /*スクロールバー本体の色*/ ");
	newpop.window.document.write( "scrollbar-highlight-color: $gf_scol1; /*スクロールバー左側(上)の影*/ ");
	newpop.window.document.write( "scrollbar-shadow-color: $gf_scol1; /*スクロールバー右側(上)の影*/ ");
	newpop.window.document.write( "scrollbar-3dlight-color: $gf_scol2; /*スクロールバーの左側(下)の影*/ ");
	newpop.window.document.write( "scrollbar-arrow-color: $gf_scol2; /*矢印の色*/ ");
	newpop.window.document.write( "scrollbar-track-color: $gf_scol3; /*背面の色*/ ");
	newpop.window.document.write( "scrollbar-darkshadow-color: $gf_scol2;/*スクロールバー右側(下)の影*/ ");
	newpop.window.document.write( "} --> </STYLE>\\n" );
	newpop.window.document.write( "<bo" + "dy" + tmpbodybg + ">\\n" );
	newpop.window.document.write( "<center>" + msg1  + "\\n" );
	newpop.window.document.write( "<P style=font-size:12>" + msg2 + "</P>\\n" );
	newpop.window.document.write( "</bo" + "dy></ht" + "ml>" );
	newpop.window.document.close();
}
function cookieoff(){
	var coname;
	var thecookie = document.cookie+",";
	end = -1; end = thecookie.indexOf("GMT",0) + 3;
	if (end > -1){ thecookie = thecookie.substring(0,end)+","; }

	var codata1 = ""; coname = "gmta<>";
	var start = thecookie.indexOf(coname);
	if (start != -1){
		end = thecookie.indexOf(",",start);
		codata1 = thecookie.substring(start+coname.length,end);
	}
	var codata2 = ""; coname = "gmtb<>";
	start = thecookie.indexOf(coname);
	if (start != -1){
		end = thecookie.indexOf(",",start);
		codata2 = thecookie.substring(start+coname.length,end);
	}
	if (codata2.length > 0){
		var cookiedata = thecookie + "newclear<>off;expires=" + codata1 + "," + codata2;
		document.cookie = cookiedata;
		// クッキー失敗の時は、CGIを呼ぶ
		thecookie = document.cookie+",";
		codata1 = ""; coname = "newclear<>off";
		start = thecookie.indexOf(coname);
		if (start == -1){
			ifnooff.location="$script?mode=newnoclear";
		}
	}
}
function winclose(){
	if(window.newpop){ newpop.close(); }
}
/* 新規一覧ページと通常掲示板ウィンドウの相互オープン */
function WindowB(Aurl,name){
	if(!window.opener){
		jywn = window.open(Aurl,name);
		jywn.focus();
	} else {
		if(!window.opener.closed){
			window.opener.location=Aurl;
			window.opener.focus();
		} else {
			jywn = window.open(Aurl,name);
			jywn.focus();
		}
	}
}
EOM
	} # 新着一覧のポップウィンドウ 終わり

	if ($script_flg){
		print <<"EOM";
//-->
</script>
EOM
	} # 以上ポップアップウィンドウで表示 新着一覧のポップウィンドウ

#	以下未使用
#	//	var tflg = document.newform.newnock.value;
#	//	if (tflg == 1){
#	//	}
#	//alert("TEST document.cookie2" + document.cookie);

#	//	var tflg = document.newform.newnock.value;
#	//alert("TEST 22");

#	alert("TEST");

#	ポップヘルプスクリプト未使用
#	/* ポップヘルプ */
#	function setpopup(msg,event){
#		x=document.body.scrollLeft+event.clientX;
#		y=document.body.scrollTop+event.clientY + 15;
#		if (document.body.clientWidth < x + 310 ){
#			x = document.body.clientWidth - 310 ;
#		}
#		document.all("help0").style.pixelLeft = x;
#		document.all("help0").style.pixelTop = y;
#		document.all("help0").innerHTML = msg;
#		document.all("help0").style.visibility = 'visible';
#	}
#	function hidepopup(){
#		document.all("help0").style.visibility = 'hidden';
#	}


	if ($script_head_flg) {
		print "<!-- option script -->\n";
		print "$script_head<!-- option end -->\n";
	}

	if ($script_flg && $getjump_flg){ # 記事№もしくは、下メニュー表示でジャンプする
		print <<"EOM";
<SCRIPT Language="JavaScript">
<!--   
function Jump(url){
  if (url != ''){ window.location = url; }
}
// -->
</SCRIPT>
EOM
		# v2.50y24m47にて削除(ともくんさんが問題発見しました)
		#	if ($in{'getno'}){
		#		print "Jump('#getno$in{'getno'}');\n";
		#	} else {
		#		print "Jump('#conhd');\n";
		#	}
	}

	print "</head>\n";

	if ($test_escape){ # Windows XPのJavaScript関連バグを回避
		print "<B><FONT color=\"#ff00ff\">\$test_escape ::: JavaScript関連バグを回避</FONT></B>\n";
	}

	$tmpscp = "";
	if ($mode eq "new") { # 新着一覧
		if ($newno < $newno_now && $newno_sign >= 1 && $newno_sign < 19){
			$tmpscp = " onUnload='winclose()'";
		}
	}

	$tmpbg = "";
	if ($bg){ $tmpbg = " background=\"$bg\""; }
	$tmpbc = " bgcolor=\"$bc\"";
	$tmptx = " text=\"$tx\"";
	# 特別に基本色を入れ替え
	if ($newpage_flg && $newpage == 2){ # 新着一覧独自設定
		if ($newpage_bg){ $tmpbg = " background=\"$newpage_bg\""; } # 新着一覧
		if ($newpage_bc){ $tmpbc = " bgcolor=\"$newpage_bc\""; } # 新着一覧
		if ($newpage_txk){ $tmptx = " text=\"$newpage_txk\""; } # 新着一覧
	}

	# print "<body$tmpscp background=\"$bg\" bgcolor=\"$bc\" text=\"$tx\">\n";
	print "<body$tmpscp$tmpbg$tmpbc$tmptx>\n";

	if ($test_sleep){ # 制作時メモリ使用量を見る
		sleep($test_sleep_head);
		print "<B><FONT size=\"+1\" color=\"#ff00ff\">【只今指定秒スリープモードです】</FONT><br></B>\n";
	}

	# 単語分割処理を文字単位にする
	# IE5,N6(MacのIE5は動作しない)
	print "<SCRIPT Language=\"JavaScript\"><!--\n";
	print "document.body.style.wordBreak = \"break-all\";\n";
	print "// --></SCRIPT>\n";


	if ($script_body1_flg && !$imgpageflg) {
		print "<!-- option script -->\n";
		print "$script_body1<!-- option end -->\n";
	}
	# アクセスレポート:閲覧時のみ、一度のreport送信
	if ($script_accbd1_flg && $mode eq "" && $acc_timing_flg ==0) {
		print "<!-- option script -->\n";
		print "$script_accbd1<!-- option end -->\n";
	}

}

#-----------------#
#  タグ無効処理   #
#-----------------#
sub tag_off1 { # 無効処理
	$admtag = "";
	if ($tagkey_off == 1 || $tagkey_no_off) {
		# 改行タグを残す
		$_[0] =~s/<br>/kaigyou_nomi_escape/ig;
		# 管理者修正タグを残す
		if ( $_[0] =~ /(<adminedit>.*\[管理者修正\].*<\/adminedit>)/ ){
			$admtag = $1;
			$admtag =~ s/\[/\\\[/g; $admtag =~ s/\]/\\\]/g;
			$_[0] =~ s/$admtag/kanrisyuseiwo_escape/;
		}
	}
	# タグの無効化
	$_[0] =~ s/</&lt;/g;
	$_[0] =~ s/>/&gt;/g;
	if ($tagkey_off == 1 || $tagkey_no_off) {
		$_[0] =~ s/kaigyou_nomi_escape/<br>/ig;
		$admtag =~ s/\\\[/\[/g; $admtag =~ s/\\\]/\]/g;
		$_[0] =~ s/kanrisyuseiwo_escape/$admtag/;
	}
}
sub tag_off2 { # 削除無効処理
	$_[0] =~ s/<br>//ig;
	$_[0] =~ s/<[a-zA-Z][^>]*>//ig;
	$_[0] =~ s/<\/[a-zA-Z][^>]*>//ig;
	$_[0] =~ s/</&lt;/g;
	$_[0] =~ s/>/&gt;/g;
}
sub tag_add_kiji { # ●記事の不足タグを加える
	# テーブルタグとコメントタグを調査して閉じられていなかったら閉じる
	$tmp = $_[0];
	$tmp =~ s/(<[a-zA-Z][0-9a-zA-Z]*[^>]*=[ ]*")([^"]*)?(")/$1$3/ig; # タグ内のコンスタント
	$tmp =~ s/(<[a-zA-Z][0-9a-zA-Z]*[^>]*=[ ]*')([^']*)?(')/$1$3/ig; # タグ内のコンスタント
	$tag_add_flg = 0;
	if ($tmp =~ /<!--/){ # コメントタグはすべて消すので大注意
	#	$tmp =~ s/<!--.*?\/\/-->//g; # 有効なコメントを除外
		$tmp =~ s/<!--.*?-->//g; # 有効なコメントを除外
		if ($tmp =~ /<!--/){ # コメント開始タグがあるので大注意
			$_[0] .= '//-->'; #  # コメントを閉じる
			$tmp .= '//-->';
	#		$tmp =~ s/<!--.*?\/\/-->//g;
			$tmp =~ s/<!--.*?-->//g;
			$tag_add_flg = 1;
		}
	}
	if ($tmp =~ /TABLE/i){ # テーブルタグがある
		if ($tmp =~ /(.*?)<TABLE/i){
			$tmp2 = $1;
			if ($tmp2 =~ /<\/TABLE/i){ # はじめに閉じられたケース
				$_[0] = '<TABLE>' . $_[0];
				$tmp =~ s/(.*?)<\/TABLE(.*)/$1$2/i;
				$tag_add_flg = 1;
			}
		}
		$endflg = 0; $t1 = 0;
		while (!$endflg && $t1 < 10000) { # <TABLEの個数
			if ($tmp =~ /<TABLE/i){ $tmp =~ s/<TABLE//i; $t1++; }
			if ($tmp !~ /<TABLE/i){ $endflg = 1; }
		}
		$endflg = 0; $t2 = 0;
		while (!$endflg && $t2 < 10000) { # </TABLEの個数
			if ($tmp =~ /<\/TABLE/i){ $tmp =~ s/<\/TABLE//i; $t2++; }
			if ($tmp !~ /<\/TABLE/i){ $endflg = 1; }
		}
		if ($t1 > $t2){ # <TABLEタグが多い
			for ($i = 1; $i <= $t1 - $t2; $i ++){ $_[0] .= '</TABLE>'; }
			$tag_add_flg = 1;
		}
		if ($t1 < $t2){ # </TABLEタグが多い
			for ($i = 1; $i <= $t2 - $t1; $i ++){ $_[0] = '<TABLE>' . $_[0]; }
			$tag_add_flg = 1;
		}
	}
# &tag_off1($tmp);
# &tag_off1($_[0]);
# &error("123,tmp,$t1,$t2<br>$tmp<br>-----<br>$_[0]<br>-----<br>");		# エラー文サンプル
}


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

#------------------#
#  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 ad_mk_file { # !j_set.cgi と共通サブ
	# ●管理用ファイル
	open(OUT,">$kanrifile") || &error("Write Error : $kanrifile : make file error");
	# print OUT "";
	close(OUT);
	chmod (0666,$kanrifile);
}

# 最終行の書き込み確認データの削除(これはログ破損対策をしていなくても行う)
sub log_clend {
	# 注意:ログの配列は、@new のみ
	$log_check_tmp = $log_check2; $log_check_tmp =~ s/_(.*)//;
	$enddata = $new[$#new];
	if ($enddata =~ /^$log_check1/i && $enddata =~ /$log_check_tmp/i){
		pop @new;
		# もしもに備えて2行目まで削除
		$enddata = $new[$#new];
		if ($enddata =~ /^$log_check1/i && $enddata =~ /$log_check_tmp/i){
			pop @new;
		}
	}
}

#-----------------------------#
# ●ログのアイテム読み取り    #
#-----------------------------#
sub inperm1 { # 過去ログ移行用
		@gf_tail2 = ();
		($no2,$reno2,$d,$n,$m,$s,$com,$u,$ho,$p,$c,
			$gf_tail2[0],$gf_w[0],$gf_h[0],$chk,@gfdata) = split(/<>/);
		&inperm_sub("past",$d,$d2,$c); # 追加の解析
}
sub inperm2 { # 記事表示用
		@gf_tail = ();
		($no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,$pw,$color,
			$gf_tail[0],$gf_w[0],$gf_h[0],$chk,@gfdata) = split(/<>/);
		&inperm_sub("",$date,$date2,$color); # 追加の解析
}
sub inperm3 { # ユーザー記事修正削除用
		@gf_tail = ();
		($no,$reno,$date,$name,$mail,$sub,$com,$url,$host,$pw,$color,
			$gf_tail[0],$gf_w[0],$gf_h[0],$chk,@gfdata) = split(/<>/);
		&inperm_sub("",$date,$date2,$color); # 追加の解析
}
sub inperm4 { # 管理用
		@gf_tail = ();
		($no,$reno,$d,$n,$m,$s,$com,$u,$ho,$p,$c,
			$gf_tail[0],$gf_w[0],$gf_h[0],$chk,@gfdata) = split(/<>/);
		&inperm_sub("",$d,$d2,$c); # 追加の解析
}
sub inperm5 { # 新着、検索ページ用
		@gf_tail = ();
		($prt_no,$prtalt,$prtcom,$rescnt,$no,$reno,$date,$name,$mail,$sub,$comment,$url,$host,
			$pw,$color,$gf_tail[0],$gf_w[0],$gf_h[0],$chk,@gfdata) = split(/<>/, $newctt);
		&inperm_sub("",$date,$date2,$color); # 追加の解析
}
sub inperm_sub { # 追加の解析
	# yy-board 対策
	if ($chk !=0 && $chk !=1 && $chk !=-1 && $chk !=-2) { $chk =0; } 
	# 日付、実日付 @_[1],@_[2] ⇔ $d,$d2 $date,$date2
	@_[2] = ""; if (@_[1] =~ /#hide#/i){ (@_[1],@_[2]) = split(/#hide#/, @_[1]); }
	# 追加画像のセット
	$gfc = 1; $c_up = 1;
	foreach (@gfdata) { # 追加画像の$gf_tail[1]以降をセット(読み取りは画像数無制限)
		if ($c_up == 1){
			if (@_[1] eq "past"){
				$gf_tail2[$gfc] = $_;
			} else {
				$gf_tail[$gfc] = $_;
			}
		}
		if ($c_up == 2){ $gf_w[$gfc] = $_; }
		if ($c_up == 3){ $gf_h[$gfc] = $_; }
		$c_up++; if ($c_up > 3){ $c_up = 1; $gfc++; }
	}

	# ◆記事枠色背景色/新アイテム読み込み (引き続き解説あり)(v2.50y24m63より)
	($color,$col_bd,$col_bg,@new_item) = split(/-/, @_[3]);

		# 各色、他のログ形式に対応
		if ($color ne "" && $color !~ /^#/){ $color = "#".$color; }
		if ($col_bd ne "" && $col_bd !~ /^#/){ $col_bd = "#".$col_bd; }
		if ($col_bg ne "" && $col_bg !~ /^#/){ $col_bg = "#".$col_bg; }

	# ◆アイテム読み込み
	# アイテム読取り例→ ($dummy,$my_log,$my_item,$my_data) = split(/<.>/, $new_item[8]);
	# 以下の1行を追加する(コメント「#」を外す)だけで新アイテムのデータが読み込まれます
	# ($dummy,$my_log,$my_item,$my_data) = split(/<.>/, $new_item[8]);

	# $new_item[0] は製作者やまもとの予約フィールド(まだ未使用です)
	# ($dummy,$category,$topics,$permiss) = split(/<.>/, $new_item[0]);

	# **************************************************************************************
	# <高度な改造者向けの予約フィールドの解説> (v2.50y24m63より)
	# **************************************************************************************
	#                            参考:ログ形式とかログフォーマットと言いますが、
	#                                  その中の個別データをここではアイテムと言います
	# ログ形式を変更して、ログに新しいアイテムを追加したいときには
	# JOYFULYYが独自に用意した「予約フィールド」をお勧めします
	# 「予約フィールド」を使うとバージョンアップ、バージョンダウンや移行の時に
	# ログ変換の必要がなくなります(バージョンダウンした場合でもゴミ情報が出ない)
	# また、新アイテムのさらなる追加も簡単に出来る仕組みです
	# 投稿フォームに新アイテムを追加したサンプルを用意しましたのでお試し頂けます
	# 
	# 先ずこのすぐ上の「# ◆記事枠色背景色/新アイテム読み込み」の split の処理をご覧ください
	# 記事の色指定の場所に、新しいフィールド群(@new_item)を追加出来るようにしてあります
	# 
	#     $new_item[0] は、製作者やまもとが新しいアイテムを追加するための予約フィールドです
	#     $new_item[1] は、改造者ともくん氏の予約フィールドです
	#     $new_item[2] は、abc氏の予約フィールドです
	#     $new_item[3~7] は、お申し出があれば個人名でキープします(実績を考慮)
	#     $new_item[8~] の予約フィールドは通常の改造者がご自由にご利用ください
	# 
	# ○ 書込みは j_lib_w1.cgi の中の3ヶ所で行います
	#   「◆ログに新しいアイテムを追加」で検索すれば場所が分かります(説明あり)
	#    改造したい方はどなたでも $new_item[8] 以降を自由に追加して構いません
	#    コメント化したサンプルがあります、コメントを外すだけでログに書き込みます
	# ○ アイテム読み込みはこの上の「◆アイテム読み込み」の所で行います
	#    コメント化したサンプルがあります、コメントを外すだけでログから読み込みます
	# ○ 投稿フォームに新アイテムを追加するサンプルもあります
	#    j_lib_r1.cgi、j_lib_r2.cgi、j_lib_r3.cgi に各1か所コメント化したサンプルがあります
	#   「◆ログに新しいアイテムを追加:サンプル」で検索してください
	#    コメントを外すと、投稿フォームにチェックボックスを追加し、その内容をログに保存します
	#    記事を修正すると保存したチェックボックスの内容がチェックボックス内で選択されています
	# ○ 新アイテムをクッキー保存するサンプルもあります
	#    この joyfulyy.cgi 内に2ヶ所あります
	#   「◆ログに新しいアイテムを追加:クッキー」で検索してください
	#    コメントを外すと、クッキー保存とクッキー読取りを行います
	#    投稿しようとすると、前回投稿した時の保存内容がチェックボックス内で選択されています
	# 
	# 以上の全てのサンプルのコメント「#」を外すと、投稿・返信・修正の投稿フォームに
	# チェックボックスが追加され、その内容がクッキー保存されている状態になります
	# サンプルは全てコピーしてから、コメント「#」を外して試すことをお勧めします!
	# --------------------------------------------------------------------------------------
	# 以上はCGIの製作に慣れた方を前提にしています。詳しくは掲示板までお問い合わせください
	# **************************************************************************************
}



#----------------------#
# ●VUP新変数の初期値  #
#----------------------#
sub vupvalue {
	# *************************************
	# 特殊初期化確認項目
	# *************************************

	# ●追加投稿画像数の最大
	# (プログラム能力としての追加画像の最大数)
	# (注:投稿数を制限する時には「追加投稿画像数の制限:$gf_usermax 」を使う)
	$gf_maxno = 10;

	# 「●追加投稿画像数の制限」が無い場合、大きすぎる場合
	if ($gf_usermax eq "" || $gf_usermax > $gf_maxno){ 
		$gf_usermax = $gf_maxno; # 追加投稿画像数の制限に「追加投稿画像数の最大」を設定する
	}
	# 「●一度に投稿出来る枚数」が大きすぎる場合
	if ($gf_gradually >= $gf_usermax){ 
		$gf_gradually = 0; # 無効にする
	}

	# ★アイコンモードでは先頭画像を無しにする(将来どちらも可能にする予定)(v2.50y24)
	if ($icon_mode){ $gf_toppic = 0; }

	# 先頭画像、追加画像を合わせた数
	# ( ともくんさん発見の[画像の投稿方法]表記ミスの修正です v2.50y24)
	$gf_maxsum = $gf_usermax + $gf_toppic;


	# ■アイコンの時は、先頭画像は処理しない。先頭画像の有無
	if ($icon_mode || !$gf_toppic) { $upfst = 1; } else { $upfst = 0; }

	# ホームアイコンなどを表示するファイルパスの設定 (v2.50y13より)
	if (!$ImgUrl0){ $ImgUrl0 = $ImgUrl; } # 空白なら./img/のパスを使用
	if (!$ImgDir0){ $ImgDir0 = $ImgDir; } # 空白なら./img/のパスを使用
	# $p_log 1ページ当たりの記事表示数 /// 無効だと問題
	if ($p_log < 1){ $p_log = 5; }
	if (!$p_log){ $p_log = 5; }
	# 最大記事数 /// 無効だとログが消える
	if ($max eq ""){$max = 100;}
	# ログチェック用文字列の設定:これを変更するのは要注意!!!
	$log_check1 = "<><><><><>Count="; # ログ更新ナンバーセット用
	$log_check2 = "logcheck_fm1";     # ログ対策フォーマット名称
	                                  # 変更するなら末尾のみ、様式は fm1 → fm2
	$log_check2_cst = $log_check2; $log_check2_cst =~ s/_(.*)//;
	# BKログファイル名の作成
	# 例: ./j_log.cgi → ./j_log_bk.cgi
	$logfile_bk = $logfile; $logfile_bk =~ s/(.*)\.([\w].*)/$1_bk.$2/;
	$bktail = $2; # 予備
	if ($bktail =~ /([^\w])/){
		$tmp = "ログバックアップファイルのファイル名の作成に失敗しました<br>";
		$tmp .= "ログファイル($logfile)をダウンロード保存して安全を確保してから<br>";
		$tmp .= "ログファイル名 → $logfile に不正が無いか確認してください";
		&error("$tmp");
	}
	if ($stop_log){ # 緊急投稿禁止
		$sudden_stop = 1; $sudden_stop_msg = $stop_log_msg2;
		$undisplay_form = 1; # 投稿フォームを強制的非表示にする
		$undisplay_resbt = 1; # 返信・追加ボタンを強制的非表示にする
	}
	if ($rgm_kanri1){ # 一般の新規投稿を禁止する
		$undisplay_form = 1; # 投稿フォームを強制的非表示にする
	}

	if ($tgt_frame eq ""){ $tgt_frame = "_parent"; } # フレームに新着一覧ページを表示
	#	if (-e $trance_scr){ # 画像をSCRIPTで表示する v2.50y24m36で廃止
	#		if ($trance eq ""){ $trance = 1; } # 直リンク防止
	#	}

	# ライブラリはつねにチェックする
	if ($lib_r1 eq ""){ $lib_r1 = "./j_lib_r1.cgi"; } # ページ表示の共通サブルーチンのライブラリ
	if ($lib_r2 eq ""){ $lib_r2 = "./j_lib_r2.cgi"; } # 通常ページ表示のライブラリ
	if ($lib_r3 eq ""){ $lib_r3 = "./j_lib_r3.cgi"; } # その他のページ表示のライブラリ
	if ($lib_w1 eq ""){ $lib_w1 = "./j_lib_w1.cgi"; } # 記事書き込み関係のライブラリ
	if ($lib_w2 eq ""){ $lib_w2 = "./j_lib_w2.cgi"; } # メール送信のライブラリ
	if ($lib_x1 eq ""){ $lib_x1 = "./j_lib_x1.cgi"; } # その他のライブラリ
	if ($lib_x2 eq ""){ $lib_x2 = "./j_lib_x2.cgi"; } # ログ破損対策
	if ($lib_x3 eq ""){ $lib_x3 = "./j_lib_x3.cgi"; } # 項目設定用ライブラリ
 
	# 投稿処理のモード名(regist)はつねにチェックする
	if (!$access_mod || !$access_mod_n){
		$access_mod_n = "regist"; # 通常のモード名に設定 $mode="regist"
	} # 投稿処理のモード名(regist)を変える場合は$access_mod_nを使用する

	# 壁紙タイトル画像のパスを完成
	if ($bg && $bg !~ /\//){ $bg = "$ImgDir0$bg"; }
	if ($title_gif && $title_gif !~ /\//){ $title_gif = "$ImgDir0$title_gif"; }

	# *************************************
	# 特殊初期化確認項目終了
	# *************************************


	# ●バージョンアップに対応する、新変数の初期値の設定
	#    バージョンアップ後、項目設定の保存をしてあれば初期値の設定は行わない
	#		例	$ver = 'JOYFULYY v2.50y21';
	#		例	$param_ver = 'J_SET v1.77y21 [JOYFULYY JOYFULYY v2.50y21 対応]';
	$vertmp = $ver . " 対応]";
	if ($param_ver !~ /$vertmp$/){ # バージョンが違うので未設定項目に初期値を設定
		# 旧設定項目ファイルに対応
		if ($kanrifile eq ""){$kanrifile = "./kanri.dat";} # ●管理者ファイル
		if ($sub_len eq ""){$sub_len = 15;} # 題名の長さ
		# v2.3 よりup (v2.22以前に対応)
		if ($non_res eq ""){$non_res = 0;} # 「返信」ボタンを非表示にします。 (0=no 1=yes)
		# v2.31 よりup
		if ($icon_waku eq ""){$icon_waku = 0;} # アイコン選択ページの表枠の表示。 (0=no 1=yes)
		# v2.42 よりup
		if ($i_imgdir eq ""){$i_imgdir = $i_imgurl;} # アイコン画像をアップロードするディレクトリ(2)
		# v2.44 よりup
		if ($picresize eq ""){$picresize = 1;} # ●投稿画像表示サイズの変更許可
		if ($in_pwd eq ""){$in_pwd = 0;} # ●修正キー(パスワード)の入力必須 (0=no 1=yes)
		if ($sizecom1 eq ""){$sizecom1 = "大きなデジカメ写真などは、600~800ピクセル程度に縮小してから投稿されますようにお願い致します。";} # ●画像サイズを推奨する文章
		# v2.45 よりup
		if ($pic_layout eq ""){$pic_layout = 0;} # ●投稿画像を文章の上に載せる (0=no 1=yes)
		if ($diary_title eq ""){$diary_title = 1;} # 1:題名あり
		if ($diary_day eq ""){$diary_day = 1;} # 1:日付入力
		if ($diary_week eq ""){$diary_week = 1;} # 1:日本語曜日
		if ($diary_no eq ""){$diary_no = 0;} # 0:記事№表示なし
		if ($diary_comct eq ""){$diary_comct = 0;} # 日記帳の記事・センタリング
	
		# v2.46 よりup
		if ($prvd_mail eq ""){$prvd_mail = 0;} # ●特殊メール通知
		if ($date_color eq ""){$date_color = $tx;} # ●記事の投稿日の色
		if ($editcmt eq ""){$editcmt = 1;} # ●ページ最下部の記事の修正削除の案内文
		if ($editcmt && $editcmt1 eq "" && $editcmt2 eq ""){ # 同上
			$editcmt1 = "投稿記事の№と、投稿した時のパスワード(修正キー)を入れると修正・削除ができます";
			$editcmt2 = "記事の修正では、画像の追加削除も出来ます。お気軽にドーゾ。";
		}
		if ($editbgcl eq ""){$editbgcl = $kmsgbgcl;} # ●ページ最下部の記事の修正削除の案内文
		
		if ($diary_menu eq ""){ # ●閲覧者用メニューの表示項目の選択
			# v2.46x3 まで既に日記帳として使っている場合初期値は「0」、新規は「2」とする
			if ($diary == 1){ $diary_menu = 0; } else { $diary_menu = 2; }
		}
		if ($counter_disp eq ""){$counter_disp = 1;} # ●カウンターを 0:非表示 1:表示
		if ($menuposition eq ""){$menuposition = 0;} # ●メニューの表示位置
	
		if ($t_underbar eq ""){ # ●メニューの区切り線 0:無し 1:有り
			if ($diary){ $t_underbar = 0; } # すでに日記帳設定なら無し
			else { $t_underbar = 1; } # その他は有り
		}
		if ($tblwd_tn_kiji eq ""){$tblwd_tn_kiji = 0;} # ● 記事表示枠の幅、0:% 1:ピクセル
		if ($tblwd_size_kiji eq ""){$tblwd_size_kiji = 93;} # ●投稿記事枠の横幅、指定するサイズ
		if ($tblttl_kiji eq ""){$tblttl_kiji = 1;} # ●投稿記事の先頭部分の折り返し 
		if ($tblbg_kiji eq ""){$tblbg_kiji = 0;} # ● 記事のテーブルの透過 0:指定背景色 1:透過
		if ($tblbg_edt eq ""){$tblbg_edt = 0;} # ● 記事修正削除のテーブルの透過 0:指定背景色 1:透過
		if ($regist_form_page eq ""){$regist_form_page = 0;} # ● 投稿フォーム0:有り1:ボタン2:別ページ
		if ($formposition eq ""){$formposition = 0;} # ● 投稿フォーム0:標準位置 1:ページ下の位置
		if ($nam_len eq ""){$nam_len = 25;} # おなまえ、Eメール、URLの長さ
		if ($sub_len eq ""){$sub_len = 15;} # ●記事タイトル入力フォームの長さ
		if ($com_len eq ""){$com_len = 32;} # ●コメント入力域の幅(長さ
		if ($pic_len eq ""){$pic_len = 32;} # ●画像・ファイル投稿入力フォーム長さ 
		if ($formcomcnt eq ""){$formcomcnt = 7;} # ●投稿フォームの中の、コメント入力域の行数
		if ( $COLORSBD[0] eq "" && $COLORSBD[1] eq "" && $COLORSBD[2] eq "" && $COLORSBD[3] eq "" ){
			# ●「記事・投稿設定」の<親記事での記事枠色指定>を許可した時の枠色
			if ( $bc ne "#000000" ){
				@COLORSBD = (
					'#8080ff','#cc6666','#ff3333','#00CC00','#ff80ff','#CC33CC',
					'#ffbbff','#ff9b6a','#3333FF','#00AAAA','#999999'
				);
			} else { # 黒系
				@COLORSBD = (
					'#6666DD','#CCFF66','#9966DD','#999900','#DD9966','#DD6633',
					'#33DD66','#669999','#33DDDD','#99DD33','#DD99DD'
				);
			}
		}
		if ( $COLORSBG[0] eq "" && $COLORSBG[1] eq "" && $COLORSBG[2] eq "" && $COLORSBG[3] eq "" ){
			# ●「記事・投稿設定」の<親記事での記事背景色の指定>を許可した時の背景色
			if ( $bc ne "#000000" ){
				@COLORSBG = (
					'#F4F4FF','#FAF0F0','#FFECEC','#ECFFEC','#FFECFF','#F8ECFF',
					'#FFFBFF','#FFFFEC','#ECECFF','#F9FFFC','#F5F5F5'
				);
			} else { # 黒系
				@COLORSBG = (
					'#000000','#000033','#003300','#330000','#330033','#003333',
					'#333300','#333333','#330066','#003366','#660033'
				);
			}
		}
		if ($double_cnt eq ""){$double_cnt = 0;} # ●ダブルカウント許可 0:無し 1:許可
		if ($title_turn eq ""){$title_turn = 0;} # ●記事題名の後改行
		if ($name_guide eq ""){$name_guide = 0;} # ●親記事の投稿者名の表示をレスと同様に
		
		#    目次の作成
	
		if ($new_con eq ""){ $new_con = 1; } # 新着一覧の表示
		if ($co_new_day eq ""){ $co_new_day = 7; } # 期限内新着情報
		if ($contents eq ""){ $contents = 1; } # 目次の作成 0:なし 1:メニュー 2:表示
		if ($co_ttl eq ""){ $co_ttl = 1; } # 目次のタイトル有無
		if ($co_title eq ""){ $co_title = "*--- Contents ---*"; } # 目次のタイトル
		if (!$co_pos){ $co_pos = 2; } # 目次の位置 1:タイトル下 2:先頭メ下 3:ページ下
		if ($co_ph eq ""){ $co_ph = 0; } # 目次の形式 0:標準:ページ№あり
		if ($p_log == 1 && $co_ph < 10){ $co_ph = 21; } # 簡易webアルバムでは、初期値21
		if ($co_pgturn_cnt eq ""){ $co_pgturn_cnt = 3; } # 目次の強制改行の記事数
		if ($tblwd_tn_co eq ""){ $tblwd_tn_co = 0; } # 投稿記事枠の横幅指定方法
		if ($tblwd_size_co eq ""){ $tblwd_size_co = 88; } # 投稿記事枠の横幅
	
		if ($co_tbbd_phase eq ""){ $co_tbbd_phase = 2; } # 目次テーブルの枠 0:なし 1:横線 2:枠
		if ($co_size eq ""){ # 目次記事の文字サイズ、無指定「■記事本文文字大」
			$co_size = $b_size;
		}
		#	if ( $co_size !~ /pt/ ){ $co_size = "10pt"; }
		if ($co_size2 eq ""){ # 目次タイトルの文字サイズ、無指定「■本文の小さめの文字大きさ」
			$co_size2 = $b_size_small;
		}
		if ($co_pnum eq ""){ # 目次に表示する掲示板のページ数
			if ($p_log != 1){ $co_pnum = 5; } else { $co_pnum = 25; }
		} else {
			if ($p_log == 1 && $co_pnum == 5){ $co_pnum = 25; } # 自動変換
			if ($p_log != 1 && $co_pnum == 25){ $co_pnum = 5; } # 自動変換
		}
		if ($co_und eq ""){ $co_und = 1; } # 目次題名文字に背景色をつける
		# $co_over = 1; # これはミス・無効にします(目次題名文字にマウスが乗った変化あり)
		if ($co_new eq ""){ $co_new = 1; } # 新着情報を出す(「new」や「+9」の新着のしるし)
	
		if ($co_new_chr eq ""){ $co_new_chr = 'new '; } # 新着情報の「new」
	
		if ($co_btw_use eq ""){ $co_btw_use = 0; } # 区切り文字
		if (!$co_btw && !$co_btw_head && !$co_btw_end){
			if ($co_btw eq ""){ $co_btw = '/ '; } # 間
			if ($co_btw_head eq ""){ $co_btw_head = '< '; } # 頭
			if ($co_btw_end eq ""){ $co_btw_end = '>'; } # 終
		}
		if ($co_tbbg eq "" && $co_pgcol eq ""){
			if ($customcol != 9) { # 目次通常の初期色
				$co_tbbg = "#fefefe";
				$co_tbbd_col = "#dddddd";
				$co_pgcol = "#555555";
				$co_col0 = "#555555";
				$co_col1 = "#555555";
				$co_under0 = "#eeffee";
				$co_under1 = "#ffeeff";
				$co_under9 = "#aaffaa";
				$co_new_col = "#ff00ff";
			} else { #  # 目次黒系の初期色
				$co_tbbg = "#222222";
				$co_tbbd_col = "#999999";
				$co_pgcol = "#888888";
				$co_col0 = "#77cc77";
				$co_col1 = "#8888ee";
				$co_under0 = "#444444";
				$co_under1 = "#444444";
				$co_under9 = "#111111";
				$co_new_col = "#ff00ff";
			}
		}
		if ($co_new_col2 eq ""){ $co_new_col2 = "#ff00ff"; }# 目次や新着一覧での新着サインの色
	
		if ($new_hr eq ""){ $new_hr = 0; }# 新着一覧の記事の区切り線
		# if ($bc eq $tbl_color){ $new_hr = 1; }
		if ($kiji_kugyo eq ""){ $kiji_kugyo = 2; } # 投稿記事間の空行の数
	
		if ($newno_bgm1p eq ""){ $newno_bgm1p = "nifty460.wav"; } # 到着のBGM
		if ($newno_bgm2p eq ""){ $newno_bgm2p = "nifty457.wav"; }
		if ($newno_bgm3p eq ""){ $newno_bgm3p = "science.mid"; }
		if ($newpop eq ""){ $newpop = 1; } # 到着ポップウィンドウの仕様
	
		if ($b_size_ms eq ""){ $b_size_ms = $b_size; } # トップメニューの大きさ
		if ($p3p eq ""){ $p3p = 1; } # ●P3P対応
	
		if ($homepage_flg eq ""){ $homepage_flg = 1; } # 戻り先のホームページ
		if ($homepage2_flg eq ""){ $homepage2_flg = 0; } # 戻り先のホームページ
		if ($homepage3_flg eq ""){ $homepage3_flg = 0; } # 戻り先のホームページ
		if ($homepage_nm eq ""){ $homepage_nm = "トップに戻る"; } # 戻り先のホームページ
		if ($homepage2_nm eq ""){ $homepage2_nm = "サブページ"; } # 戻り先のホームページ
		if ($homepage2_nm eq ""){ $homepage2_nm = "サードページ"; } # 戻り先のホームページ
		if ($icon_bg eq ""){ $icon_bg = 0; } # アイコン選択画面などでの背景色
		if ($past_pcnt eq ""){ $past_pcnt = 1; } # 過去ログ記事をページ単位で表示する
	
		if ($Win_mode eq ""){ $Win_mode = 0; } # Windowsの自動判定によるホスト名の取得
	
		if ($res_position eq ""){ $res_position = 0; } # 「返信ボタン」の位置
		if ($res_position_side eq ""){ $res_position_side = 1; } # 「返信ボタン」の位置
		if ($res_position_blank eq ""){ $res_position_blank = 3; } # 「返信ボタン」の余白
	
		$st_taboo2 = "<IFRAME\n<*SCRIPT\n<*{\n<*&\n<META\n<FORM\n<INPUT\n<*onmouse\n<*onkey\n";
		if ($deny_flg eq "") { # v2.50y18 にバージョンアップしているが、項目設定の保存をしていない
			$taboo_d = ""; # foreach (@taboo) { if ($_){ $taboo_d .= "$_\n"; } }
			if ($taboo_flg) { # 既に制限している
				$taboo_d2 = "";
				foreach (@taboo) {
					$t_flg = 0;
					if ( $_ eq "FORM" ){ $t_flg = 1; }
					if ( $_ eq "INPUT" ){ $t_flg = 1; }
					if ( $_ eq "IFRAME" ){ $t_flg = 1; }
					if ( $_ eq "href*PopWindow" ){ $t_flg = 1; }
					if ( $_ eq "script*JavaScript" ){ $t_flg = 1; }
					if ( $t_flg ) {
						$taboo_d2_flg = 1;
					} else {
						if ($_){ $taboo_d2 .= "$_\n"; }
					}
				}
				if ($taboo_d2_flg) { # 緊急のタグ制限の指定は、正式のタグ制限の指定に自動変更
					$taboo_d = $taboo_d2;
					$taboo_d .= $st_taboo2;
				} else { # 緊急制限が無い場合は追加する
					$taboo_d .= $st_taboo2;
					$endcom = "";
				}
			} else { # まだ制限していなかった
				$taboo_d = $st_taboo2; # 初期値
			}
			@taboo = split(/\n/, $taboo_d);
		}
		# @tabooがクリアされていれば、初期値セット
		$t_flg = 0; foreach (@taboo) { if ($_){ $t_flg = 1; } }
		if ( !$t_flg ) { @taboo = split(/\n/, $st_taboo2); }
	
		if ($deny_flg eq "") { # v2.50y18 にバージョンアップして初めての読み込み
			$taboo_flg = 1; # 強制的に制限有効にする
		}
		if ($deny_flg eq ""){ # ■閲覧者のアクセス制限をする (0=no 1=yes)
			# 新たな設定がなければ、初期値を0にする
			$deny_d = ""; foreach (@deny) { if ($_){ $deny_d .= "$_\n"; } }
			$st_deny = "\*.anonymizer.com\ncache\*.\*.interlog.com\n211.154.120.\*\n";
			$deny_flg = 1; if ($deny_d eq $st_deny || !$deny_d){ $deny_flg = 0; }
		}
	
		if ($tagkey_off eq ""){ $tagkey_off = 0; } # ●すでに投稿された記事のタグを無効
		if ($tagkey_off_msg eq ""){ # ●タグを無効時のメッセージ
			$tagkey_off_msg = '<お知らせ><BR>只今メンテナンスのため、投稿記事のタグを無効にしています(文字として表示)<BR>URLの自動リンクも一時的に無効になっています。ご了承ください <(_ _)>';
		}
		if ($tagkey_no_off_msg eq ""){ # ●タグを無効時のメッセージ
			$tagkey_no_off_msg = '■■■ JOYFULYY 管理メッセージ 《 確認のため只今この記事のタグは無効になっています 》 ■■■';
		}
	
		if ( $icon_bg eq "" ){ # ●アイコンの背景色 :VUPの時だけ黒系なら「■記事表示部の下地の色」
			if ( $customcol == 9 ){ $icon_bg = 1; } else { $icon_bg = 0; }
		}
		if ($kiji_hr eq ""){ $kiji_hr = 0; } # ●記事間に横線
		if ($co_tbbd_thr eq ""){ $co_tbbd_thr = 0; } # ●目次テーブルの背景を透過
		if ($menu_cont_c eq ""){ $menu_cont_c = "-"; } # カウンターとメニューの間に表示する文字
		if ($pic_popup2 eq ""){ $pic_popup2 = 1; } # ●ポップアップウィンドウ表示 変数変更
		if ($cgi_lib'maxdata eq ""){ $cgi_lib'maxdata = 1024000; } # 投稿受理最大サイズ
		if ($kiji_usr_edt eq ""){ $kiji_usr_edt = 1; } # ●記事の修正 (初期値 1:許可)
		if ($picbod_size eq ""){ $picbod_size = 1; } # リンク枠の表示をした時の枠の太さ
		# ●再表示ボタンの案内コメント
		if ($fcom_piccl eq ""){ $fcom_piccl= 1; }
		if ($fcom_piccl_c eq ""){ $fcom_piccl_c = '(画像の参照はクリアされます)'; }
		# ●投稿画像数の変更ボタンの案内コメント
		if ($fcom_jpgno_c eq ""){ $fcom_jpgno_c = '投稿画像の数を変更できます→'; }
		# ●修正キー入力域の右側の案内コメント
		if ($fcom_delkey eq ""){ $fcom_delkey = 1; } 
		if ($fcom_delkey_c eq ""){ $fcom_delkey_c = '(英数字で8文字以内。自分の記事を修正・削除できて便利です) '; }
		if ($admin_st1 eq ""){ $admin_st1 = 1; } # ●管理処理(記事削除など)ページのスタイル
		# ●画像管理者チェックの案内コメント
		if ($ImageCheck1 eq ""){ $ImageCheck1 = 1; } 
		if ($ImageCheck1_c eq ""){ $ImageCheck1_c = '・・・画像は管理者が許可するまで「しばらくおまちください」のアイコンが表示されます・・・'; }
		# ●リンク枠の表示をした時の案内コメント
		if ($picbod_ms eq ""){ $picbod_ms = 1; } 
		if ($picbod_ms_c eq ""){ $picbod_ms_c = '・・・枠のある画像はクリックすると拡大表示します・・・'; }
		# ●投稿者が記事の修正で新しい画像をアップの案内コメント
		if ($ImageCheck2 eq ""){ $ImageCheck2 = 1; } 
		if ($ImageCheck2_c eq ""){ $ImageCheck2_c = '(追加画像がありましたので管理者の許可をお待ちください)'; }
		# ●後から許可を取消の案内コメント
		if ($ImageCheck3 eq ""){ $ImageCheck3 = 1; } 
		if ($ImageCheck3_c eq ""){ $ImageCheck3_c = '(画像の再チェックを行っていますので管理者の許可をお待ちください)'; }
		# ●管理者が不適切と判断する画像
		if ($pic_kan_ms eq ""){ $pic_kan_ms = '管理者が不適切と判断する画像もしくはファイル、他人の肖像権にかかわる可能性のある画像もしくはファイルは予告なく削除することがあります。'; }
	
		if ($co_new_pos eq ""){ $co_new_pos = 0; } # 各記事での新着サイン(new)を出す位置
		if ($co_popms_b eq ""){ $co_popms_b = 2; } # 目次の記事題名にカーソルが乗った時のポップ案内
		if ($mail_link eq ""){ $mail_link = 1; } # メールリンク
		if ($mail_gif_ps eq ""){ $mail_gif_ps = 1; } # リンクを貼る画像の縦位置
		if ($autolink_win eq ""){ $autolink_win = 1; } # URLをクリックしたときに新しいウィンドウ
	
		# v2.50y20
		if ($newpage eq ""){ $newpage = 1; } # ●新着一覧背景・文字色
		if ($script_body2_flgb eq ""){ $script_body2_flgb = 0; } # ●bodyタグの終了位置
		if ($kiji_kugyo2 eq ""){ $kiji_kugyo2 = 2; } # ●記事の先頭と最下部の空行の挿入
		if ($kiji_kugyo3 eq ""){ $kiji_kugyo3 = 2; } # ●記事の先頭と最下部の空行の挿入
		if ($page_d_move eq ""){ $page_d_move = 1; } # ●直接移動ボタンの表示
		if ($page_d_move_sp eq ""){ $page_d_move_sp = 1; } # ●直接移動ボタンの上の空行数
		if ($gf_toppic eq ""){ $gf_toppic = 1; } # ●先頭画像の投稿
		if ($adpage_pic eq ""){ $adpage_pic = 1; } # ●管理処理ページでの画像表示
		if ($adpage_picw eq ""){ $adpage_picw = 50; } # ●管理処理ページでの画像表示サイズ
		if ($sp_chara eq ""){ $sp_chara = 1; } # ●文字列の変
		if ($sp_nbsp eq ""){ $sp_nbsp = 1; } # ●半角スペース
		if ($sp_c_tab eq ""){ $sp_c_tab = 4; } # ●タブを半角スペース
		if ($formposition_u eq ""){ $formposition_u = 1; } # ●タブを半角スペース
		if ($maxpics_size eq ""){ $maxpics_size = 800; } # ●投稿画像のピクセルサイズ制限
		if ($xnm_form_submit eq ""){ $xnm_form_submit = ' 投 稿 す る '; } # ボタン表記文字
		if ($xnm_form_submit2 eq ""){ $xnm_form_submit2 = ' 返 信 す る '; } # ボタン表記文字
	#	if ($rmk_use eq ""){ $rmk_use = 1; } # ●JOYFULYYの標準改造版に対応
		if ($word_emphasis eq ""){ $word_emphasis = 1; } # ●ワード検索での検索結果の強調表示
		if ($dailyurl eq ""){ $dailyurl = 1; } # 日記帳の投稿で、URL項目を追加
	
		# v2.50y21
		if ($logbk eq ""){ $logbk = 1; } # ログの破損対策
		if ($logbk_nochk eq ""){ $logbk_nochk = 1; } # 破損対策・記事の存在確認も行う
		if ($logbk_ck eq ""){ $logbk_ck = 0; } # 管理者のみがログチェックモード可能
		if ($lock_tmpwt eq ""){ $lock_tmpwt = './lock/logrecov.cgi'; } # ログ破損対策の復旧記録
		if ($logbk_sp eq ""){ $logbk_sp = 1; } # 書込み前の空き容量確認
		if ($logrecov eq ""){ $logrecov = './lock/j_tmpwt.cgi'; } # ログ破損対策の復旧記録
		if ($html_pub eq ""){ $html_pub = 1; } # HTMLページのDOCタイプの記述
		if ($co_getno eq ""){ $co_getno = 1; } # 目次の該当記事題名を太文字
		if ($logrecov_max eq ""){ $logrecov_max = 100; } # ログ破損対策の復旧記録
		if ($gf_no_cookie eq ""){ $gf_no_cookie = 1; } # 追加画像の行数変更をクッキーに保存
		# v2.50y24
		if ($in_comment eq ""){ $in_comment = 1; } # コメントの入力必須
		# v2.50y25
		if ($mailto2_mode eq ""){ $mailto2_mode = 1; } # 追加のメールアドレスの形式
		if ($mailto_k2_mode eq ""){ $mailto_k2_mode = 1; } # 追加のメールアドレスの形式
		if ($mail_event[0] eq ""){ $mail_event[0] = 1; } # メール通知するイベント
		if ($mail_event[1] eq ""){ $mail_event[1] = 1; } # メール通知するイベント
		if ($mail_event[2] eq ""){ $mail_event[2] = 1; } # メール通知するイベント
		if ($mail_event[3] eq ""){ $mail_event[3] = 1; } # メール通知するイベント
		if ($picrs_esc6 eq ""){ $picrs_esc6 = "0.61"; } # [例外設定]表示倍率
		if ($mail_cnt_max eq ""){ $mail_cnt_max = 200; } # 一日のメール通知件数の最大値
		if ($mailto_tag eq ""){ $mailto_tag = 1; } # メールタグの扱い
		if ($in_name eq ""){ $in_name = 1; } # おなまえの入力必須
		if ($t_size[0] eq ""){ $t_size[0] = $t_size; } # タイトル
		if ($t_size[1] eq ""){ $t_size[1] = "<B>"; } # タイトル
		if ($t_size[2] eq ""){ $t_size[2] = "</B>"; } # タイトル
		if ($t_size2[0] eq ""){ $t_size2[0] = $t_size2; } # サブタイトル
		if ($t_size2[1] eq ""){ $t_size2[1] = "<B>"; } # サブタイトル
		if ($t_size2[2] eq ""){ $t_size2[2] = "</B>"; } # サブタイトル
		if ($sub_size[1] eq ""){ $sub_size[1] = "<B>"; } # 記事題名タグ
		if ($sub_size[2] eq ""){ $sub_size[2] = "</B>"; } # 記事題名タグ
		if ($name_size[1] eq ""){ $name_size[1] = "<B>"; } # おなまえタグ
		if ($name_size[2] eq ""){ $name_size[2] = "</B>"; } # おなまえタグ
		if ($title_dsp eq ""){ $title_dsp = 1; } # タイトルの表示
		if ($form_submit_pos eq ""){ $form_submit_pos = 0; } # 投稿ボタン位置/無くてもよい
		if ($new_menu eq ""){ $new_menu = '新着'; } # トップメニューの[新着]の文字
		if ($contents_menu eq ""){ $contents_menu = '目次'; } # トップメニューの[目次]の文字
		if ($kiji_spd eq ""){ $kiji_spd = 1; } # ●記事の余分な空白行の非表示
		if ($picresize eq ""){ $picresize = 1; } # 倍率を閲覧者のクッキーに保存する
		if ($picresize2 eq ""){ $picresize2 = 1; } # 倍率を閲覧者のクッキーに保存する
		if ($pic_incom eq ""){ $pic_incom = 4; } # ●通常画像のコメント内表\示
		if ($pic_incom_h eq ""){ $pic_incom_h = 200; } # ●通常画像のコメント内表\示
		if ($pic_incom_v eq ""){ $pic_incom_v = 1; } # ●動画のコメント内再生

	}
}




# ★★★以下はこの joyfulyy.cgi のサブルーチン

# ***** 処理開始 *****
#    処理実行    #
# sub libchk			# ●ライブラリ読み込み
# sub axs_check			# ●アクセス制限
# sub decode			# デコード処理
# sub get_time			# 時間を取得
# sub get_time_s		# 〃
# sub set_cookie		# クッキーの発行
# sub set_cook_kigou	# 〃
# sub set_cook_kigou2	# 〃
# sub get_cookie		# クッキーを取得
# sub get_cook_kigou	# 〃
# sub get_cook_kigou2	# 〃
# sub get_cookie_part	# 新着一覧クッキー情報

# sub lock				# ロック処理
# sub unlock			# ロック解除
# sub url_enc			# URLエンコード
# sub decrypt			# パスワード照合処理
# sub usr_diarypwdchk	# 日記帳記事パスワードチェック
# sub error				# エラー処理

# sub header			# HTMLのヘッダー ◆
# sub tag_off1			# ●タグ無効処理
# sub tag_off2			# ●タグ削除無効処理
# sub tag_add_kiji		# ●記事の不足タグを加える

# sub UpFile_size		# 画像実サイズ取得
# sub JpegSize			# JPEGサイズ認識
# sub GifSize			# GIFサイズ認
# sub PngSize			# PNGサイズ認識
# sub ad_mk_file		# ●管理用ファイル
# sub log_clend			# 最終行の書き込み確認データの削除

# sub inperm0			# ●入力変数セット、入力処
# sub inperm_sub		# 追加の解析
# sub vupvalue			# ●VUP新変数の初期値



# &error("123,,,");		# エラー文サンプル
# &error("123sleep,,,");# エラー文サンプル、$test_sleep = 0;でも停止する