#!/usr/bin/perl
# ↑ご利用のプロバイダのPerl(JPerl不可)のあるパスを記述してください
#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃■ EventManager v1.06.004
#┃■ Copyright (c) 2001-2004 ゆき All rights reserved
#┃■ e-mail:kuwahara@anx.co.jp
#┃■ homepage:http://www1.anx.co.jp/~kuwahara/cgi/
#┃
#┃■ 2001/10/15	着手(v0.00)
#┃   2001/10/17	プロトタイプ完成(v0.01)
#┃   2001/10/19	プロトタイプ2完成(v0.02)
#┃   2001/10/20	プロトタイプ3完成(v0.03)
#┃   2001/10/22	プロトタイプ4完成(v0.04)
#┃   2001/10/23	プロトタイプ5完成(v0.05)
#┃   2001/10/24	プロトタイプ6完成(v0.06)
#┃   2001/10/25	プロトタイプ7完成(v0.07)
#┃   2001/10/29	v1.00		初期バージョン完成
#┃   2001/11/01	v1.01		イベント人数制限設定追加,参加登録可能条件のチェックの強化と箇所の追加,参加登録修正・削除のパスワードチェックの不具合を修正,細かい不具合を修正
#┃   2001/11/13	v1.02		イベント参加登録修正時のバグを修正,イベント追加時の自動削除のデフォルトを２ヶ月先に変更,細かい修正,参加登録削除時に通知メール送信を追加,参加登録通知メール内容変更,参加状況確認機能を追加,管理室模様替え,細かいバグ改修
#┃   2002/01/08	v1.03		細かい修正,TOPページの形式をユーザーが選択出来る機能を追加,各表示形式の見直し,非確定日時イベント機能追加,掲示板機能追加,『参加登録』を『出欠登録』に変更,旧暦表示機能の追加,アクセス制限処理追加,キーワード置換機能追加,細かいバグ改修,カウンター機能追加,旧暦表示のキャッシュ化による高速化,イベント案内と締め切りメッセージにタグの制限を追加,systemコマンドを不使用に変更,HI-HOプロバイダ対応,案内・出欠・掲示板の更新画像を表示するように,定員に含まれる出欠登録の区別機能,URL送信機能追加,イベント削除依頼送信機能,イベント削除時の通知機能追加,定員一杯時の扱いを変更
#┃   2002/01/09	v1.03.001	登録者以外による出欠登録修正時のメールアドレスの扱いが不適切だったのを修正,環境設定のデフォルト画像設定が正しくなかったのを修正
#┃   2002/01/09	v1.03.002	カレンダー表示時にフローティング表示の内容が正しくないのを修正
#┃   2002/01/12	v1.03.003	キーワード(未締め切りのイベント件数:OUT_LIMIT_EVENT_CNT)の計算が正しくないのを修正
#┃   2002/01/22	v1.03.004	出欠登録で登録者以外が修正する場合に起きる不具合を修正,ディレクトリクローズ関係の不具合を修正,イベント予定削除に１ステップ追加,細かい修正,非確定イベント確定時メール通知関係の不具合を修正
#┃   2002/03/17	v1.03.005	各種不具合を修正,出欠登録時のメールアドレス入力の必須・任意を選択に,各種チューニング,TOP形式が一覧デフォルトで変更可能時に一覧以外の時に月移動できない不具合を修正,管理室で出欠状況がおかしい不具合を修正,通常処理以外を別ファイルに分割して高速化,定員計算関係の不具合を修正,携帯対応のためのファイル構成を再構成,iモード対応処理を追加(途中)
#┃   2002/05/13	v1.04		環境設定直後でスタイルが反映されていない不具合を修正,配色設定の補助機能を追加,仮登録フォームにイベント時間を追加,案内更新メッセージ&更新メッセージ優先表示を追加,仮登録自動承認機能追加,案内更新メッセージ通知メール機能追加,月替わりのタイミングで前日のカウンタ値の不具合を修正,掲示板ページ件数MAXを環境設定に追加,閏年の月末処理の不具合を修正,配色設定項目の追加,セキュリティーちょっと向上,ファイルアップロード機能追加(案内用),一部の環境下でメールが文字化けした不具合を修正
#┃   2002/05/14	v1.04.001	ネスケでの更新優先表示での不具合を修正、一部サーバーでクッキー絡みの表示不具合を修正
#┃   2002/05/26	v1.04.002	ファイルロック関係を全面見直し,環境チェック機構の追加,細かい改良,細かい不具合の修正,TOP一覧形式時のページ替え処理を追加,配色関係の不具合を修正
#┃   2002/07/14	v1.05		出欠登録時のメアドの扱いが間違っていたのを修正,細かい調整,各種不具合修正,URL送信機能の不具合を修正,携帯関係の調整と機能追加,パスワード再発行機能の追加,Opera&ネスケ系での表示再現性ちょっとアップ(笑),カウンタ無効設定追加,sendmail不使用時の為の修正,予定追加通知メール機能追加
#┃   2002/09/05	v1.05.001	細かい調整,携帯でのProfileCGI関係の設定追加,デバッグコードが混入していた箇所を修正(パスワード再発行),幹事メール送信時に送信状況を分かりやすく修正,案内用にアップロードした画像のリンクが複数件出来なかった不具合を修正
#┃   2002/09/30	v1.05.002	細かい調整,細かい修正,一部サーバー(wakwak)でメール送信機能が利用できないのを修正,2003年施行祝日法改訂対応,案内更新通知メールの更新チェック処理がおかしかったのを修正,J-PHONEの絵文字のパケット対応機追加分に対応,未確定日時予定で締め切りを設定したときのJavaScriptエラーを修正,"を含んだ文字列を使用したときの不具合を修正,
#┃   2002/11/23	v1.05.003	セキュリティーに関する重大な不具合を修正
#┃   2003/03/31	v1.06		変更している可能性の高いファイル(EMan.cgi)記述設定を外部ファイル(EManSetting.pl)に出した,画像ファイルの場所を変更できるようにパスの設定を追加,細かい修正,案内の修正ページを全面リニューアル,[出欠登録フォームメッセージ設定]追加,[出欠登録追加項目設定]追加,通知メール全面見直し,仮登録関係の処理をリニューアル,ファイルアップロード機能強化,細かい不具合修正,表示速度チューニング,「自動削除しない」の設定を追加,オンラインヘルプを追加,メアドリンク関係の不具合の修正,メアドリンクの有無の設定追加,出欠状況表示形式変更,アドイン形式プロフィールＣＧＩ連動機能追加,日付入力補助JavaScript追加,Opera+クッキー関連の不具合を修正,アップロードフォームの不具合を修正,出欠登録有効・無効・停止設定追加,微調整
#┃   2003/04/07	v1.06.001	出欠登録通知メールに単位表示していないのを修正,仮登録承認時の通知メールに問題があったのを修正
#┃   2003/11/05	v1.06.002	出欠登録フォームメッセージのプレビューの不具合を修正,微調整,定期イベント生成機能追加,使用可能タグにSタグを追加,EZwebでのプロフィールリンクの処理の不具合を修正,〆切までの残時間表示の不具合を修正,自動リンクの設定を環境設定に追加(幹事の設定より優先される),掲示板の自動リンクの設定を追加,イベントの設定項目に「当日だけ通知するメールアドレス」を追加,強制的に広告が挿入されるサーバーでページが切れる問題に対応する設定を追加,独自拡張タグ周りの表示の問題を修正,イベント件数が増えた時の高速化,春分･秋分の日の計算が間違っていたので修正,Mozilla系ブラウザでCOOKIE周りに問題があったのを修正
#┃   2003/12/02	v1.06.003	Mozilla系のクッキー関係に不具合があったのを修正,細かい修正,イベント仮登録時に管理人室のイベント一覧に即時反映されない不具合を修正
#┃   2004/05/20	v1.06.004	TOPの残人数の計算に問題があったのを修正,XREA強制広告対応(怒),イベント名･幹事名に空白が含まれていた時に発生する不具合を修正,EZweb系で問題が発生する可能性を軽減,イベント削除時にキャッシュ情報が更新されない不具合を修正,広告付サーバーに手直し対応,
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#use strict;

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃外部ファイルリンク（変更不要）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
@require_list = ( './lib/jcode.pl:0' ,
				  './lib/util.pl:0' ,
				  './lib/cookie.pl:1' ,
				  './lib/string.pl:0' ,
				  './lib/date.pl:0' ,
				  './lib/web.pl:0' ,
				  './lib/js_code.pl:1' ,
				  './EManLib.pl:0' ,
				  './lib/mobile.pl:0' ,
				  './lib/qreki.pl:0' ,
				  './EManSetting.pl:0' );
foreach( @require_list ){
	local( $path , $flg ) = split(/:/);
	if( $flg == 0 ){
		eval{
			require $path;
		};
	}
	if( $@ || ( $flg == 1 && !( -e $path ) ) ){
		print "Content-type: text/html\n\n";
print << "HTML";
<html><head><title>エラー</title></head><body text="crimson">ライブラリファイルが見つかりません[ $path ]($@)</body></html>
HTML
		exit(0);
	}
}

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃システム情報（変更不要）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$cookiename = 'EventManagerSystem';			# クッキー用の名前
$ENV{'TZ'} = "JST-9";							# 標準時間設定（海外サーバー向け？）
@ok_tag_def = ( 'font,<font.*>:</font>' ,
				'b,<b>:</b>' ,
				'i,<i>:</i>' ,
				'u,<u>:</u>' ,
				'img,<img src=.*>' ,
				'a,<a href=.*>:</a>' ,
				'table,<table.*>:</table>:<tbody>:</tbody>:<tr.*>:</tr>:<td.*>:</td>:<th.*>:</th>:<caption.*></caption>' ,
				'pre,<pre>:</pre>' ,
				'div,<div.*>:</div>' ,
				'center,<center>:</center>' ,
				'marquee,<marquee.*>:</marquee>' ,
				'br,<br>' ,
				'hr,<hr.*>' ,
				's,<s>:</s>'
				);

#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃著作権表示関係設定（変更禁止）
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
$soft_ver = '1.06.004';
$soft_name = 'EventManager';
$soft_adr = 'http://www1.anx.co.jp/~kuwahara/cgi/';
$soft_home_title = 'A-10 CGI Arms WebSite ...';
$soft_home_title_img = "<img src=\"http://www1.anx.co.jp/~kuwahara/cgi/banner.gif\" width=\"88\" height=\"31\" border=\"0\" alt=\"$soft_name v$soft_ver\">";


#┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
#┃プログラム開始
#┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

	# アクセスログの記録
	&access_log()		if( $access_log_flg == 1 );

	# パラメーター解析
	if( $ENV{'CONTENT_TYPE'} =~ /multipart\/form-data/ ){
		&decodeform;
	}else{
		&parseInput;
	}

	if( !( -e $env_file ) && ( $in{'mode'} ne "env_reg" && $in{'mode'} ne "env_form" ) ){
		# 設定ファイルが存在しない

		unless( -w "./" ){
			print "Content-type: text/html\n\n";
print << "HTML";
<html><head><title>エラー</title></head><body text="crimson">設置パスに書き込み権限がありません。</body></html>
HTML
			exit(0);
		}

print "Content-type: text/html\n\n";
print << "HTML";
<html>
	<head>
		<title>初期設定</title>
	<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
	</head>
	<body>
	<center>
		環境設定ファイルの設定を行います。パスワードを入力して「送信」ボタンを押してください。
		<hr width="80%">
		<form action="$cgi_path" method="POST">
			<input type="password" name="password">
			<input type="hidden" name="mode" value="env_form">
			<input type="submit" name="送信" value="送信" style="cursor:hand">
		</form>
	</center>
	</body>
</html>

HTML
		exit();
	}

	# 端末判別
	$agent = &AgentCheck( 0 );
	$agent = 1		if( $agent == 6 );		# Lモードで有れば i-Modeと言うことに・・・（一時処理）

	# クッキーの取得
	if( $agent == 0 ){
		require './lib/cookie.pl';
		&init_cookie( $cookiename );
	}

	# 環境設定読み込み
	&env_load()	if( $in{'mode'} ne "env_reg" && $in{'mode'} ne "env_form" && -e $env_file );
	if( ( $cookie{'top_type'} eq "0" && $env_top_change eq "1" ) || ( $env_top_type eq "0" && $env_top_change eq "0" ) && $agent == 0 ){
		$in{'year'} = "";
		$in{'month'} = "";
	}

	# アクセス元判定
	if( $env_ref_adr && !( $env_ref_adr =~ /\n/ ) && $agent == 0 ){		# ちょっと下位互換
		if( &PostSiteCheck( $env_ref_adr ) && &PostSiteCheck( $cgi_path ) ){	exitError( "正式アドレス以外からのリンクは拒否されています(".__LINE__.")" );	}
	}

	# アクセス拒否ホスト or IPチェック
	if( $env_deny ){
		( @check_deny_list ) = split(/,/,$env_deny);
		if( &DenyHostCheck( @check_deny_list ) ){	exitError( "アクセスは拒否されました(".__LINE__.")<br>ご不明な点がありましたら <a href=\"mailto:$env_mail\">管理人</a>までご連絡ください" );	}
	}

	# $cgi_path以外からのPOSTを拒否
	if( $ENV{'REQUEST_METHOD'} eq "POST" && &PostSiteCheck( $cgi_path ) ){
		exitError( "アクセスは拒否されました。不正なアクセスです。" );
	}

	# キーワード項目値の算出
	&event_count()			if( $in{'mode'} eq "" || $in{'mode'} eq "toptype_change" || $in{'mode'} eq "login" );

	# カウンター処理
	&counter()				if( $env_cnt_enable eq "1" );

	# 画像パスの最後のスラッシュチェック
	$img_file_base_path = $img_file_base_path . '/'		unless( $img_file_base_path =~ /\/$/ );

	if( $agent == 1 || $agent == 2 || $agent == 3 || $agent == 7 ){
		if( ( $agent == 1 && !( -e './EMan-i.pl' ) ) || ( $agent == 2 && !( -e './EMan-j.pl' ) ) || ( ( $agent == 3 || $agent == 7 ) && !( -e './EMan-e.pl' ) ) ){
			print "Content-type: text/html\n\n";
print << "HTML";
<html><body>対応していません</body></html>
HTML
			exit(0);
		}else{
			require './EMan-i.pl'		if( $agent == 1 );
			require './EMan-j.pl'		if( $agent == 2 );
			require './EMan-e.pl'		if( $agent == 3 || $agent == 7 );
		}

		$cgi_path_m = $cgi_path;
		if( $cgi_path =~ /\/.*/ ){
			$cgi_path =~ m/(.*)\/(.*)$/;
			$base = "<base href=\"$1/\">";
			$cgi_path = $2;
		}

		if( $in{'mode'} eq "user_reg_form" ){				&user_reg_form();	}			# ユーザー登録フォーム
		if( $in{'mode'} eq "user_reg" ){					&user_reg();	}				# ユーザー登録処理

		if( $in{'mode'} eq "login_form" ){					&login_form();	}				# ログインフォーム
		if( $in{'mode'} eq "login" ){						&login();	}					# ログイン処理

		&lifetime_check()		if( $in{'id'} ne "" && $in{'mode'} ne "login" && ( $in{'mode'} ne 'login_form' && $ENV{'REQUEST_METHOD'} eq "GET" ) );

		if( $in{'mode'} eq "" ){							&default_page();	}			# 初期ページ表示処理
		if( $in{'mode'} eq "show" ){						&show();	}					# イベント詳細表示
#		if( $in{'mode'} eq "send_url_form" ){				&send_url_form();	}			# イベントURLメール送信フォーム
		if( $in{'mode'} eq "send_url" ){					&send_url();	}				# イベントURLメール送信処理
		if( $in{'mode'} eq "mem_reg_form" ){				&mem_reg_form();	}			# 出欠登録フォーム
		if( $in{'mode'} eq "mem_reg" ){						&mem_reg();	}					# 出欠登録処理

		if( $in{'mode'} eq "bbs_list" ){					&bbs_list();	}				# 掲示板一覧表示処理
		if( $in{'mode'} eq "bbs_send_form" ){				&bbs_send_form();	}			# 掲示板投稿処理
		if( $in{'mode'} eq "bbs_send" ){					&bbs_send();	}				# 掲示板投稿処理

		if( $in{'mode'} eq "mark_info" ){					&mark_info();	}				# マークの説明
		if( $in{'mode'} eq "login_info" ){					&login_info();	}				# ログイン関係の説明
		if( $in{'mode'} eq "login_bk" ){					&login_bk();	}				# 簡単ログインブックマークの案内

		if( $in{'mode'} eq "decision_notice_reg_form" ){	&decision_notice_reg_form();}	# 日時確定通知登録フォーム
		if( $in{'mode'} eq "decision_notice_reg" ){			&decision_notice_reg();	}		# 日時確定通知登録処理



		if( $agent == 3 || $agent == 7 ){

			$out_buf =~ s/<br>/<br \/>/g;
			$out_buf =~ s/<hr>/<hr \/>/g;
			$out_buf =~ s/(<img[^>]*)>/$1 \/>/g;
			$out_buf =~ s/(<input[^>]*)>/$1 \/>/g;
			$out_buf =~ s/(<base[^>]*)>/$1 \/>/g;
			$out_buf =~ s/(<meta[^>]*)>/$1 \/>/g;
			$out_buf =~ s/&nbsp;/ /g;
		}
		&compact_buf();

		if( $agent == 3 || $agent == 7 ){
$html_front =<< "HTML_HEAD";
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" http://www.openwave.com/DTD/xhtml-basic.dtd>
HTML_HEAD

			$out_buf = $html_front . $out_buf;
		}
		
		printf( "Content-Length: %d\n" , length( $out_buf ) )		if( $agent == 1 && $force_bar_flg != 1 );
		print "Content-type: text/html\n\n";
		print "$out_buf";

	}elsif( $agent == 0 ){
		# PC
		require './EMan-pc.pl';

		# 一般利用者機能
		if( $in{'mode'} eq "" ){						&default_page();	}									# 初期ページ表示処理
		if( $in{'mode'} eq "show" ){					&show();	}											# イベント詳細表示
		if( $in{'mode'} eq "mem_reg_form" ){			&mem_reg_form();	}									# 出欠登録フォーム
		if( $in{'mode'} eq "mem_reg" ){					&mem_reg();	}											# 出欠登録処理
		if( $in{'mode'} eq "toptype_change" ){			&toptype_change();	}									# TOP形式変更処理
#		if( $in{'mode'} eq "send_url_form" ){			require './EManSub.pl';	&send_url_form();	}			# イベントURLメール送信フォーム
		if( $in{'mode'} eq "send_url" ){				require './EManSub.pl';	&send_url();	}				# イベントURLメール送信処理
		if( $in{'mode'} eq "decision_notice_reg" ){		require './EManSub.pl';	&decision_notice_reg();	}		# 未確定日時イベント通知メアド登録処理
		if( $in{'mode'} eq "reset_password_form" ){		require './EManSub.pl';	&reset_password_form();	}		# パスワード再発行フォーム
		if( $in{'mode'} eq "reset_password" ){			require './EManSub.pl';	&reset_password();	}			# パスワード再発行処理
		if( $in{'mode'} eq "event_notice_reg" ){		require './EManSub.pl';	&event_notice_reg();}			# 予定追加通知メール登録処理
		if( $in{'mode'} eq "help" ){					&help();	}											# 

		# 幹事機能
		if( $in{'mode'} eq "event_form" ){				require './EManSub.pl';	&event_form();	}				# イベント登録フォーム
		if( $in{'mode'} eq "event_reg" ){				require './EManSub.pl';	&event_reg();	}				# イベント登録処理
		if( $in{'mode'} eq "delete_mem" ){				require './EManSub.pl';	&delete_mem();	}				# 出欠登録削除処理
		if( $in{'mode'} eq "mem_sendmail_form" ){		require './EManSub.pl';	&mem_sendmail_form();	}		# 出欠登録者向け幹事メール送信フォーム
		if( $in{'mode'} eq "mem_sendmail" ){			require './EManSub.pl';	&mem_sendmail();	}			# 出欠登録者向け幹事メール送信処理
		if( $in{'mode'} eq "del_event_req" ){			require './EManSub.pl';	&del_event_req();	}			# イベント削除依頼送信
		if( $in{'mode'} eq "tmp_add_event_form" ){		require './EManSub.pl';	&tmp_add_event_form();	}		# イベント仮登録フォーム
		if( $in{'mode'} eq "tmp_add_event" ){			require './EManSub.pl';	&tmp_add_event();	}			# イベント仮登録処理

		# 管理人機能
		if( $in{'mode'} eq "show_der_option" ){			require './EManSub.pl';	&show_der_option();	}			# キーワード値一覧表示処理
		if( $in{'mode'} eq "env_form" ){				require './EManSub.pl';	&env_form();	}				# 設定ファイル登録フォーム表示
		if( $in{'mode'} eq "env_reg" ){					require './EManSub.pl';	&env_reg();	}					# 設定ファイル保存
		if( $in{'mode'} eq "admin_form" ){				require './EManSub.pl';	&admin_form();	}				# 管理者ページ表示
		if( $in{'mode'} eq "event_reg_sele_list" ){		require './EManSub.pl';	&event_reg_sele_list();	}		# イベント出欠登録種別別登録一覧
		if( $in{'mode'} eq "del_event" ){				&del_event();	}										# イベント削除
		if( $in{'mode'} eq "event_copy_form" ){			require './EManSub.pl';	&event_copy_form();	}			# 定期イベント生成フォーム
		if( $in{'mode'} eq "event_copy" ){				require './EManSub.pl';	&event_copy();	}				# 定期イベント生成

		# 掲示板関係
		if( $in{'mode'} eq "bbs_send" ){				&bbs_send();}											# 掲示板投稿処理
		if( $in{'mode'} eq "bbs_list" ){				&bbs_list();	}										# 掲示板一覧表示処理
		if( $in{'mode'} eq "bbs_delete" ){				&bbs_delete();	}										# 掲示板投稿削除処理

		# ファイルアップロード関係
		if( $in{'mode'} eq "file_upload_form" ){		require './EManSub.pl';	&file_upload_form()	}			# ファイルアップロード管理フォーム
		if( $in{'mode'} eq "file_upload" ){				require './EManSub.pl';	&file_upload()	}				# ファイルアップロード処理

$html_footer =<< "HTML";
	<br>
</body>
</html>
HTML

		if( $out_buf ){
			$out_buf .= $html_footer;
			&compact_buf_pc();
			
			print "Set-Cookie: $http_cookie_value;\n"		if( $http_cookie_value ne "" );
			printf( "Content-Length: %d\n" , length( $out_buf ) )	if( $force_bar_flg != 1 );
			print "Content-type: text/html\n\n";
			print $out_buf;
		}else{
			print $html_footer;
		}
	}

exit(0);


#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ 環境設定ファイル読み込み処理
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub env_load(){

	open( FH , "<$env_file" ) or exitError( "ファイルがオープン出来ません。[環境設定ファイル](".__LINE__.")" );
	( $env_title , 
	  $env_top_type , 
	  $env_max , 
	  $env_mail , 
	  $env_notice , 
	  $env_back_adr , 
	  $env_back_img , 
	  $env_back_color , 
	  $env_fore_color , 
	  $env_th_back_color , 
	  $env_th_fore_color , 
	  $env_td_back_img1 , 
	  $env_td_back_color1 , 
	  $env_td_back_color2 , 
	  $env_td_fore_color1 , 
	  $env_link , 
	  $env_vlink , 
	  $env_alink , 
	  $env_eg_color , 
	  $env_sun_back_color , 
	  $env_sat_back_color , 
	  $env_header , 
	  $env_footer , 
	  $env_top_change , 
	  $env_roku , 
	  $env_sekki , 
	  $env_bbs , 
	  $env_bbs_ip , 
	  $env_ref_adr , 
	  $env_deny , 
	  $env_header_auto_br , 
	  $env_footer_auto_br , 
	  $env_ok_taglist , 
	  $env_end_img , 
	  $env_flag_img , 
	  $env_info_update_day , 
	  $env_info_update_img , 
	  $env_list_update_day , 
	  $env_list_update_img , 
	  $env_bbs_update_day , 
	  $env_bbs_update_img , 
	  $env_url_send ,
	  $env_recognition ,
	  $env_imode_img_path ,
	  $env_bbs_page_max ,
	  $env_th_back_img ,
	  $env_td_back_img2 ,
	  $env_td_fore_color2 ,
	  $env_sun_fore_color ,
	  $env_sun_back_img ,
	  $env_sat_fore_color ,
	  $env_sat_back_img ,
	  $env_upload_flg ,
	  $env_upload_cnt ,
	  $env_upload_size_limit ,
	  $env_upload_list ,
	  $env_jsky_img_path ,
	  $env_top_page_max ,
	  $env_back_adr_i ,
	  $env_back_adr_j ,
	  $env_cnt_enable ,
	  $env_profile_flg ,
	  $env_reg_item_max ,
	  $env_adr_link ,
	  $env_profile ,
	  $env_back_adr_e ,
	  $env_auto_del_option ,
	  $env_auto_link_mode
	  ) = split(/\t/,<FH>);
	close FH;

$body =<<"HTML";
<body bgcolor="$env_back_color" text="$env_fore_color" link="$env_link" vlink="$env_vlink" alink="$env_alink" background="$env_back_img">
HTML

	if( ( $in{'mode'} ne "env_form" && $in{'mode'} ne "env_reg" ) || ( $in{'mode'} eq "env_reg" && !$err ) ){
		$env_td_fore_color2 = $env_td_fore_color1		if( $env_td_fore_color2 eq "" );
		$env_td_back_color2 = $env_td_back_color1		if( $env_td_back_color2 eq "" );
		$env_td_back_img2 = $env_td_back_img1			if( $env_td_back_img2 eq "" );

		$env_sat_fore_color = $env_td_fore_color		if( $env_sat_fore_color eq "" );
		$env_sat_back_color = $env_td_back_color		if( $env_sat_back_color eq "" );
		$env_sat_back_img = $env_td_back_img			if( $env_sat_back_img eq "" );

		$env_sun_fore_color = $env_td_fore_color		if( $env_sun_fore_color eq "" );
		$env_sun_back_color = $env_td_back_color		if( $env_sun_back_color eq "" );
		$env_sun_back_img = $env_td_back_img			if( $env_sun_back_img eq "" );

		$env_top_page_max = 0		unless( $env_top_page_max > 0 );

		$env_bbs_page_max = 10		unless( $env_bbs_page_max > 0 );		# 下位互換
	}

	# スタイルシート設定
	&style_load();

	if( $env_bbs && -e './EManBbs.pl' ){
		require './EManBbs.pl';
		
	}else{
		$env_bbs = "";
	}

	@upload_list = split(/,/,$env_upload_list);

	$env_back_adr_i =~ s/\x0D\x0A|\x0D|\x0A//g;
	$env_back_adr_j =~ s/\x0D\x0A|\x0D|\x0A//g;
	$env_back_adr_e =~ s/\x0D\x0A|\x0D|\x0A//g;
	$env_auto_link_mode =~ s/\x0D\x0A|\x0D|\x0A//g;

	$env_reg_item_max = "0"		unless( $env_reg_item_max > 0 );						# 下位互換
	$env_adr_link = "0"			if( $env_adr_link ne "1" && $env_adr_link ne "2" );		# 下位互換

	$env_profile =~ s/\x0D\x0A|\x0D|\x0A//g;		# 下位互換
	if( $env_profile ne "" ){
		require "./prof_addin/$env_profile";
	}
}


#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ 共通スタイル(CSS)設定処理
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub style_load(){

$style =<< "HTML";

<style type="text/css">
<!--
a:link			{ text-decoration:none; }
a:visited		{ text-decoration:none; }
a:active		{ text-decoration:none; }
a:hover			{ text-decoration : underline; }

TD.head{
  color : $env_th_fore_color;
  background-color : $env_th_back_color;
  ${\style_load_stylesub( $env_th_back_img )}
  font-weight : bolder;
}
TD.td1{
  color : $env_td_fore_color1;
  background-color : $env_td_back_color1;
  ${\style_load_stylesub( $env_td_back_img1 )}
}
TD.td2{
  color : $env_td_fore_color2;
  background-color : $env_td_back_color2;
  ${\style_load_stylesub( $env_td_back_img2 )}
}
TD.sat{
  color : $env_sat_fore_color;
  background-color : $env_sat_back_color;
  ${\style_load_stylesub( $env_sat_back_img )}
}
TD.sun{
  color : $env_sun_fore_color;
  background-color : $env_sun_back_color;
  ${\style_load_stylesub( $env_sun_back_img )}
}
.eg{
  color : $env_eg_color;
}
CAPTION{
  color : $env_fore_color;
  text-align : left;
}
.td_helper_link{
  color : $env_td_back_color1;
  background-color : $env_td_fore_color1;
  font-weight : bold;
  cursor : help;
}
.td_helper_link2{
  background-color : $env_td_back_color1;
  color : $env_td_fore_color1;
  font-weight : bold;
  cursor : help;
}
// -->
</style>

HTML

$header_meta =<< "HTML";
	<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="Content-Script-Type" content="text/javascript">
	<meta http-equiv="Content-Style-Type" content="text/css">
HTML

}

sub style_load_stylesub(){
	return "background-image : url($_[0]);" if( $_[0] ne "" );
}


#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ 自動削除チェック処理
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub auto_del_check(){

	local( $del_date ) = @_;


	return 		if( $del_date eq "" );		# 下位互換

	$del_date =~ s/ //g;
	$del_date =~ s/://g;
	$del_date =~ s/\///g;

	&GetNowDate();
	$now_s = sprintf( "%04d%02d%02d" , $now_date{'year'} , $now_date{'month'} , $now_date{'day'} );

	return ( $now_s > $del_date );
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub toptype_change(){

	$cookie{'top_type'} = $in{'top_type'};

	&default_page();
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub keyword_replace(){

	( $target ) = @_;

	$target =~ s/__%(.+?)%__/$KEYWORD{$1}/g;

	return $target;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub ConvertReturn2(){

	my( $str , $sw ) = @_;

	if( $sw ){
		# 逆転

		$str =~ s/<bbrr>/\n/gi;
	}else{
		# 正転

		$str =~ s/\x0D\x0A|\x0D|\x0A/<bbrr>/g;
	}

	return $str;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub counter(){

	my( $ip , $date , $total_cnt , $today_cnt , $yesterday_cnt , $this_month_cnt , $last_month_cnt );

	&GetNowDate();

	$filename = "./$cnt_file";

	if( -e $filename ){
		openLock( FH , "<$filename" ) or exitError( "ファイルがオープン出来ません。[カウンター情報ファイル](".__LINE__.")" );
		( $ip , $date , $total_cnt , $today_cnt , $yesterday_cnt , $this_month_cnt , $last_month_cnt ) = split(/,/,<FH>);
		close FH;

		if( $now_date{'year'} != substr( $date , 0 , 4 ) || $now_date{'month'} != substr( $date , 4 , 2 ) || $now_date{'day'} != substr( $date , 6 , 2 ) ){
			# 日が違う
			if( $now_date{'month'} != substr( $date , 4 , 2 ) ){
				# 月が違う
				if( ( $now_date{'month'} == 1 && substr( $date , 4 , 2 ) == 12 && $now_date{'year'} - 1 == substr( $date , 0 , 4 ) ) || ( $now_date{'month'} - 1 == substr( $date , 4 , 2 ) ) ){
					# 先月である
					$last_month_cnt = $this_month_cnt;

					if( substr( $date , 6 , 2 ) == &GetLastDay( ( $now_date{'month'} eq "1" ? $now_date{'year'} - 1 : $now_date{'year'} ) , ( $now_date{'month'} eq "1" ? 12 : $now_date{'month'} - 1 ) ) ){
						# 昨日である
						$yesterday_cnt = $today_cnt;
					}else{
						$yesterday_cnt = 0;
					}
				}else{
					# 先月じゃない
					$last_month_cnt = 0;
				}
				$today_cnt = 1;
				$this_month_cnt = 1;
			}else{
				# 同月
				$this_month_cnt++;

				if( $now_date{'day'} - 1 == substr( $date , 6 , 2 ) ){
					# 昨日である
					$yesterday_cnt = $today_cnt;
				}else{
					$yesterday_cnt = 0;
				}
				$today_cnt = 1;
			}
			$total_cnt++;
		}else{
			# 同日

			if( $ip ne $ENV{'REMOTE_ADDR'} ){
				$today_cnt++;
				$this_month_cnt++;
				$total_cnt++;
			}
		}

		open( FH , ">$filename" ) or exitError( "ファイルがオープン出来ません。[カウンター情報ファイル](".__LINE__.")" );

	}else{

		$total_cnt = 1;
		$today_cnt = 1;
		$yesterday_cnt = 0;
		$this_month_cnt = 1;
		$last_month_cnt = 0;

		openLock( FH , ">$filename" ) or exitError( "ファイルがオープン出来ません。[カウンター情報ファイル](".__LINE__.")" );
	}

	$ip = $ENV{'REMOTE_ADDR'};
	$date = sprintf( "%04d%02d%02d" , $now_date{'year'} , $now_date{'month'} , $now_date{'day'} );
	print FH "$ip,$date,$total_cnt,$today_cnt,$yesterday_cnt,$this_month_cnt,$last_month_cnt";

	closeUnlock( FH , $filename );

	$KEYWORD{'TOTAL_VISIT_CNT'} = $total_cnt;
	$KEYWORD{'TODAY_VISIT_CNT'} = $today_cnt;
	$KEYWORD{'YESTERDAY_VISIT_CNT'} = $yesterday_cnt;
	$KEYWORD{'THIS_MONTH_VISIT_CNT'} = $this_month_cnt;
	$KEYWORD{'LAST_MONTH_VISIT_CNT'} = $last_month_cnt;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub del_dir(){

	local( $d_dir ) = @_;

	opendir( D_DIR , "$d_dir" ) or exitError( "ディレクトリ($d_dir)がオープン出来ません(".__LINE__.")" );
	local @list = readdir( D_DIR );
	closedir D_DIR;

	foreach $buf( @list ){
		$buf = "$d_dir/$buf";
		if( -d $buf ){
		}else{
			if( -w $buf ){
				unlink $buf or $d_err .= "削除できませんでした[$buf]<br>";
			}else{
				$d_err .= "書き込み権限がありません[$buf]<br>";
			}
		}
	}
	rmdir "$d_dir" or $d_err .= "ディレクトリが削除出来ませんでした[$d_dir]<br>";

	return $d_err;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub event_msg_tran(){

	local ( $work ) = @_;


	if( $agent ne "0" ){					$work =~ s/<target_pc>.*?(<\/target_pc>)//gi;	}	# PC向けタグ除去		PCで無いので
	if( $agent eq "0" ){					$work =~ s/<target_m>.*?(<\/target_m>)//gi;		}	# 携帯向けタグ除去		携帯で無いので
	if( $agent ne "1" ){					$work =~ s/<target_i>.*?(<\/target_i>)//gi;		}	# iMode向けタグ除去		iModeで無いので
	if( $agent ne "2" ){					$work =~ s/<target_j>.*?(<\/target_j>)//gi;		}	# J-Sky向けタグ除去		J-Skyで無いので
	if( $agent ne "3" && $agent ne "7" ){	$work =~ s/<target_e>.*?(<\/target_e>)//gi;		}	# EZWeb向けタグ除去		J-Skyで無いので

	return $work;
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■ イベント削除
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub del_event(){

	exitError( "パスワードが正しくありません(".__LINE__.")" )	if( $in{'step'} && $in{'password'} ne $admin_pass && $admin_pass ne $cookie{'password'} );

	&read_event_file();

	if( $in{'step'} eq "1" ){

		$date = &format_date( $date ) . "〜";

print "Content-type: text/html\n\n";
print << "HTML";
<html>
	<head>
		<title>$title</title>
		$header_meta
		$style
		$js_code
	</head>
	$body

	以下の$P_CAP予\定を削除しますがよろしいでしょうか？
	<hr>
	$P_CAP名称：$event_name<br>
	日時：$date<br>
	案内文：<br>
	$event_msg

	<form action="$cgi_path" method="post">
		<input type="hidden" name="mode" value="del_event">
		<input type="hidden" name="dir" value="$in{'dir'}">
		<input type="hidden" name="step" value="2">
		<input type="submit" name="削除" value="削除する" style="cursor:hand">
	</form>

	<a href="$cgi_path?mode=admin_form">管理室に戻る</a>

HTML

	}else{

		if( ( &auto_del_check( $auto_del_date ) && $auto_del_date ne "" ) || $tmp_flg eq "1" ){
			$msg = "自動削除";
		}else{
			$msg = "手動削除";
		}

		# 未確定予定が削除されて通知メールの登録が有る場合は削除の通知を送る
		if( substr( $date , 8 , 2 ) > 31 ){
			# 非確定日時イベントから確定へ

			$filename = "./$in{'dir'}/$event_mail";
			if( -e $filename ){
				# 通知メールアドレスリスト取得
				open( FH , "<$filename" ) or exitError( "ファイルがオープン出来ません。[通知メールリストファイル](".__LINE__.")" );
				@data = <FH>;
				close FH;
			}
		}

		$err = &del_dir( $in{'dir'} );

		if( $err eq "" ){

			$date_w = &format_date( $date );

$mail_body =<< "HTML";
$env_title【$event_name】$M_CAP様へ
EventManager よりの自動送信通知メールです。

以下の$P_CAPが$msgされました

■$P_CAP名称：$event_name
■開催日時：$date_w
■$M_CAP：$master
■自動削除日付：$auto_del_date
HTML
			$mail_body .= &mail_footer( $master_mail );

			&MailSend( $env_mail , $master_mail , "【$event_name】が削除されました" , $mail_body , $env_mail );

			if( scalar @data > 0 ){

$mail_body_f =<< "HTML";
$env_title【$event_name】の日時確定通知を希望された方へ
EventManager よりの自動送信通知メールです。

【$event_name】は$msgされました
HTML

				if( $mail_hide eq "0" && $master_mail ){
					$from = $master_mail
				}else{
					$from = $env_mail;
				}

				foreach( @data ){
					chomp;
					$from = $env_mail	if( &MobileMailCheck( $_ ) );
					$mail_body = $mail_body_f . &mail_footer( $_ );
					&MailSend( $from , $_ , "【$event_name】削除通知" , $mail_body )		if( $_ ne "" );
				}
			}
		}

		if( $in{'step'} eq "2" ){
#			$in{'dir'} = "";

			# イベントキャッシュファイル再生成
			&event_cache_create();

		
			require './EManSub.pl';
			&admin_form();
#			&default_page();
#			exit();

		}
	}
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
sub access_log(){

	&GetNowDate();

	$buf = sprintf( "%04d/%02d/%02d %02d:%02d:%02d\t$ENV{'REQUEST_URI'}\t$ENV{'REMOTE_ADDR'}\t$ENV{'HTTP_USER_AGENT'}\t$ENV{'HTTP_REFERER'}\t\n" , $now_date{'year'} , $now_date{'month'} , $now_date{'day'} , $now_date{'hour'} , $now_date{'min'} , $now_date{'sec'} );
	
	openLock( FH , ">>./access.log" );
	print FH $buf;
	closeUnlock( FH , "./access.log" );
}

#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
#┏━━━━━━━━━━━━━━━━━━━━━━━
#┃■
#┃
#┃呼び出し方法	：
#┃引数			：
#┃戻り値		：
#┃注意事項		：
#┗━━━━━━━━━━━━━━━━━━━━━━━
