#!/usr/bin/perl
$version='2.24';

#************************************************
# 変数初期設定
#************************************************
sub setup{
	#####----------------------------------------------------------
	#####クイズのログのファイル名の付け方を設定する。
	#####初期設定では、挑戦者ログのファイル名が『log数字.cgi』
	#####各クイズの回答状況ログのファイル名が『qu数字.cgi』となる
	#####----------------------------------------------------------

	#####パーミッション
	$mod_cgi		='0755';			#CGIスクリプトファイルのパーミッション
	$mod_dat		='0666';			#データファイルのパーミッション
	$mod_dir		='0777';			#ディレクトリのパーミッション

	#####オプション
	$edit_pass		=1;					#パスワード変更オプション 0:禁止 1:許可
	$method			='post';

	if($ENV{'HTTP_X_JPHONE_MSNAME'} ne ''){$imode='mb';}			#J-PHONE判定
	elsif($ENV{'HTTP_USER_AGENT'} =~ /J-PHONE/){$imode='mb';}		#J-PHONE判定
	elsif($ENV{'HTTP_USER_AGENT'} =~ /DoCoMo/){$imode='mb';}		#DoCoMo判定
	elsif($ENV{'HTTP_USER_AGENT'} =~ /UP\.Browser/){$imode='mb';}	#Ezweb判定
	elsif($ENV{'HTTP_USER_AGENT'} =~ /PDXGW/){$imode='mb';}		#H"判定
	elsif($ENV{'HTTP_USER_AGENT'} =~ /ASTEL/){$imode='mb';}		#ASTEL判定
	else{$imode='pc';}
	$header			='log';
	$quiz_header	='qu';
	$mondai_		='mondai_';
	$mes_			='mes_';
	$high1_			='high1_';
	$hst1_			='hst1_';
	$high2_			='high2_';
	$hst2_			='hst2_';

	$id		= $ENV{'REMOTE_HOST'};	#####IPアドレス
	$ip		= $ENV{'REMOTE_HOST'};	#####IPアドレス
	if($id eq ''){
		$id=$ENV{'REMOTE_ADDR'};
		$ip=$ENV{'REMOTE_ADDR'};
	}
	
	$sys_color		='#dfdfff';		#####管理人室の表の色
	$sys_color2		='#ddffdd';		#####管理人室の表の色
	$border			='3';			#####表ののborder
	$tblw			='700';
	$sys_tbl_opt	="border=3 width=$tblw cellspacing=1 cellpadding=2";		#####全テーブルのオプション
	$sys_tbl_opt2	="border=3 cellspacing=1 cellpadding=2";					#####全テーブルのオプション
	$time_lag		=0;				#####海外サーバーなどで時刻表示がおかしい場合の表示時刻の調整。単位(秒)
	$max_en			=30;			#####ハイスコア登録名の最大長さ
	$max_com		=100;			#####ハイスコア登録コメントの最大長さ
	$graph_w		=300;			#####成績グラフの長さ
	$graph_h		=10;			#####成績グラフの幅
	$now			= time();		#####アクセス時刻
	$high_i			=5;				#####携帯用ハイスコア表示人数初期値
	$charset		="x-sjis";		#####ページのキャラセット
	
	#####ファイル名
	$genre_cgi		='genre.cgi';			#####クイズのジャンル情報が載っているデータファイル
	$design_cgi		='design.cgi';			#####クイズのデザイン情報が載っているデータファイル
	$sysdesign_cgi	='sysdesign.cgi';		#####システムのデザイン情報が載っているデータファイル
	$pass_cgi		='pass.cgi';			#####管理人パスワードを暗号化したファイル
	$system_cgi		='system.cgi';			#####システム設定ファイル
	$contribute_cgi	='contribute.cgi';		#####投稿問題記録ファイル
	$quiz_op_cgi	='quiz_op.cgi';			#####管理人用プログラムファイル
	$quiz_cgi		='quiz.cgi';			#####クイズプログラムファイル
	$function_cgi	='function.cgi';		#####共有関数ファイル
	$index_cgi		='index.cgi';			#####メニューページプログラムファイル
	$data_dir		='data';				#####プレイログ保存ディレクトリ
	$file_lock		='file.lock';			#####ファイルロック用ファイル
	$count_file		='count_file';			#####ログファイル番号記録ファイル
	$guard_cgi		='guard.cgi';			#####アクセス制限IP一覧
	
	$_try			='挑戦';				#####挑戦
	$_underconst	='工事中';				#####工事中
	$_high			='高成績者';			#####高成績者
	$_graph			='成績分布';			#####成績分布
	$_score			='出題状況';			#####出題状況
	$_add			='問題投稿';			#####問題投稿
	$_imode			='携帯専用';			#####携帯専用
	$_op			='管理人室';			#####管理人室
	$_top			='TOP';					#####TOP

}
#************************************************
# パスワードのチェック
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_pwd{
	local($pass)=@_;
	open(DB,$pass_cgi);@line=<DB>;close(DB);
	$line[0]=~ s/\n//g;
	if(&crypt_pwd($pass) ne $line[0]){return 1;}
	else{return 0;}
}
#************************************************
# パスワード生成関数
#************************************************
sub crypt_pwd{
	return crypt($_[0],"ARRAY(0xb74f5c)");
}


#************************************************
# アドレスチェック関数
# 引数から、4桁一定の数字を返します。
##
## 引数		$key		キーとなる数字
##
## 広域		$LOG{seed}	プレイごとの変数決定seed値
#************************************************
sub ch_address {
	local($key)=@_;
	local($sin,$r);
	$sin=sin($key*$LOG{seed}*10);
	if($sin<0){$sin=-$sin;}
	$r=int(9999*$sin);
	if($r<10){$r="000$r";}
	elsif($r<100){$r="00$r";}
	elsif($r<1000){$r="0$r";}
	return $r;
}

#************************************************
# クイズ初期化関数
##
## 特定ジャンルの全クイズをロードしてあるメモリをクリアする
#************************************************
sub refresh_quiz{
	(@mondai,@ans,@misans1,@misans2,@misans3,@misans4,@anscom,@misanscom,@cf,@digest,@misanscom1,@misanscom2,@misanscom3,@misanscom4,@anstype,@author,@misanscorrect1,@misanscorrect2,@misanscorrect3,@misanscorrect4)=();
}


#************************************************
# ファイルサイズを返す(kb)
#************************************************
sub file_size_kb{
	local($file_name)=@_;
	local($mon_size)=-s $file_name;
	local($mon_size2)=int($mon_size/1024);
	if(0 < $mon_size % 1024){$mon_size2++;}
	return $mon_size2;
}



#************************************************
# system.datを新規作成処理
#************************************************
sub make_new_system_dat{
	&def_sys;						#####デフォルトのシステム情報をメモリ上に読み込む
	return &write_system_dat;		#####メモリ上のシステム情報をファイルに書き込む
}


#************************************************
# クイズで使用するジャンルリストを生成する
##
##@genre_dir_useに、クイズに使用するジャンルのリストをセットする
##%genre_numに、ジャンルごとの使用問題数をセットする
#************************************************
sub get_genre_dir_use{
	if($GNR{mondai_cgi} =~ /\//){			#####総合問題ジャンルの場合
		@mondai_dat=split(/\t/,$GNR{mondai_cgi});	#####ジャンルリストの取得
		foreach(@mondai_dat){
			local($dir,$val)=split(/\//,$_);	#####ジャンル名と問題数を取得
			push(@genre_dir_use,$dir);
			if($val eq 'all'){$val ='-1';}
			$genre_num{$dir}=$val;				#####利用問題数制限のセット
		}
	}else{
		push(@genre_dir_use,$FORM{d});
		$genre_num{$FORM{d}}=$GNR{quiz_max};		#####クイズ開始時、問題数maxの意味
	}
}


#************************************************
# 問題番号から、ジャンル名を取得する
##
## 総合問題ジャンルの場合、問題の生成場所が違うので
## 問題がどこのジャンルからきたものかを知る必要があるため。
##
## 引数		$num	問題番号
##
## 戻り値	ジャンル名
##
#************************************************
sub get_question_dir{
	local($num)=@_;
	local($count);
	foreach $genre(@genre_dir_use){				#####使用するジャンルを記憶
		$count = $count + $genre_num{$genre};
		if($num < $count){
			return $genre;
		}
	}
}



#************************************************
# MAX最適化関数
##
## $GNR{quiz_max},$GNR{play_max},$GNR{lose_max}の値を補正する
#************************************************
sub max_set{
	if($GNR{quiz_max} eq ''){$GNR{quiz_max} = $#mondai+1;}
	elsif($GNR{quiz_max} > $#mondai+1){$GNR{quiz_max} = $#mondai+1;}
	if($GNR{play_max} eq ''){$GNR{play_max} = $GNR{quiz_max};}
	elsif($GNR{play_max} > $GNR{quiz_max}){$GNR{play_max} = $GNR{quiz_max};}
	if($GNR{lose_max} eq ''){$GNR{lose_max} = $GNR{play_max};}
	elsif($GNR{lose_max} > $GNR{play_max}){$GNR{lose_max} = $GNR{play_max};}
}

#************************************************
# html出力用に引数1を変換し引数2に格納
#************************************************
sub conv_for_html{
	$_[0]=$_[1];
	$_[0]=~ s/</&lt;/g;
	$_[0]=~ s/>/&gt;/g;
	$_[0]=~ s/"/&quot;/g;
	@_;
}
#************************************************
# ラジオボタンのチェック用に%FORMから%FORMにchecked文字列を格納
#************************************************
sub form_to_formch{
	foreach $pal(@_){
		$FORM{"$pal-".$FORM{$pal}}=' checked';
	}
}
#************************************************
# html出力用に%FORMを変換し%FORM2に格納
#************************************************
sub form_to_form2{
	foreach $pal(@_){&conv_for_html($FORM2{$pal},$FORM{$pal});}
}
#************************************************
# 改行タグを改行に変換し%FORM3に格納
#************************************************
sub form_to_form3{
	foreach $pal(@_){
		$FORM3{$pal}=$FORM{$pal};
		$FORM3{$pal}=~ s/<br>/\n/ig;
		&conv_for_html($FORM3{$pal},$FORM3{$pal});
	}
}


#************************************************
# 改行を改行タグに変換し%FORM4に格納
#************************************************
sub form_to_form4{
	foreach $pal(@_){
		$FORM4{$pal}=$FORM{$pal};
		$FORM4{$pal}=~ s/\n/<br>/g;
	}
}
#************************************************
# 改行を削除し%FORM5に格納
#************************************************
sub form_to_form5{
	foreach $pal(@_){
		$FORM5{$pal}=$FORM{$pal};
		$FORM5{$pal}=~ s/\n//g;
	}
}
#************************************************
# FORMからの入力値のバリエーションフォーマットの作成
#************************************************
sub form_to_form{
	foreach(keys %FORM){
		&form_to_formch($_);
		&form_to_form2($_);
		&form_to_form3($_);
		&form_to_form4($_);
	}
}
#************************************************
# FORM変数をクリア
#************************************************
sub clear_form{
	foreach $pal(@_){
		($FORM{$pal},$FORM2{$pal},$FORM3{$pal},$FORM4{$pal})=();
	}
}
#************************************************
# ファイルへの書き込み
##
## 引数		$file_name		ファイル名
##			@value			書き込み内容
#************************************************
sub write_file{
	local($file_name,@value)=@_;
	local($opt);
	if($file_name =~ /^(>)(.*)$/){$opt=$1;$file_name=$2;}		#####ファイル名をオプションとファイル名に分離
	local($exist)=-f $file_name;								#####ファイルの存在チェック
	local($edit)=-M $file_name;									#####ファイルの更新日時を取得
	open(DB,">$opt$file_name");print DB @value;close(DB);		#####ファイルに書き込む
	chmod(oct($mod_dat),$file_name);							#####パーミッションの変更
	if(!(-f $file_name)){										#####ファイルが存在しなければ、書き込み不可エラー
		&error(731,$file_name);
		return 1;
	}elsif(!($exist)){											#####ファイルを新規作成したかどうか
		&mes(450,$file_name);
	}elsif((-M $file_name eq $edit)&&($edit > 0)){														#####ファイルの更新日時に変化がなければ更新不可エラー
		&error(741,$file_name);
		return 1;
	}
	return 0;
}


#************************************************
# 時刻表記関数
#************************************************
sub time_set{
	my($epoc,$lag)=@_;
	if($lag eq '' && $SYS{lag} ne '' && $SYS{lag} =~ /\d+/){$lag=$SYS{lag}*60*60;}
	elsif($lag eq '' && $SYS{lag} eq ''){$lag = $time_lag;}
	
	local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($epoc+$lag);
	$month = ($mon + 1);
	$year=$year+1900;
	if ($sec < 10)  { $sec = "0$sec";   }
	if ($min < 10)  { $min = "0$min";   }
	if ($hour < 10) { $hour = "0$hour"; }
	if ($mday < 10) { $mday = "0$mday"; }
	if ($month < 10) { $month = "0$month"; }
	if($year<10){$year="0$year";}
	
	return "[$year/$month/$mday $hour'$min\"$sec]";
}
#************************************************
# スコア用時刻表記関数
#************************************************
sub score_time{
	local($hour,$min,$sec);
	$hour=int($_[0]/60/60);
	$min=int($_[0]%(60*60)/60);
	$sec=($_[0])%60;
	$min='0' x (2-length($min)) .$min;
	$sec='0' x (2-length($sec)) .$sec;
	return ($sec,$min,$hour);
}


#************************************************
# パーミッション表示処理
#************************************************
sub permition {
	local(@permit)=('---','--x','-w-','-wx','r--','r-x','rw-','rwx');
	return "\($permit[substr($_,length($_[0])-3,1)]$permit[substr($_,length($_[0])-2,1)]$permit[substr($_,length($_[0])-1,1)]\)";
}

#************************************************
# フォーカス移動スクリプト生成
#************************************************
sub focus_move {
	local($field)=@_;
	$ret=<<"_HTML_";
	<script language=javascript>
//<!--
document.frm.${field}.focus();
//-->
</script>
_HTML_
}

#************************************************
# メッセージ表示処理
#************************************************
sub mes {
	
	$mesno="  message($_[0])";
	if (!($_[0] =~ /^\d+$/)){
		$system_mes .= $_[0];
		$mesno='';
	}elsif ($_[0] <= 149) {
		$system_mes .= "$_[1]の新規作成が正常に終了しました。";
	}elsif ($_[0] <= 199) {
		$system_mes .= "$_[1]の追加が正常に終了しました。";
	}elsif ($_[0] <= 249) {
		$system_mes .= "$_[1]の編集が正常に終了しました。";
	}elsif ($_[0] <= 299) {
		$system_mes .= "$_[1]の削除、順序変更が正常に終了しました。";
	}elsif ($_[0] <= 349) {
		$system_mes .= "$_[1]の削除が正常に終了しました。";
	}elsif ($_[0] <= 399) {
		$system_mes .= "$_[1]の一括追加が正常に終了しました。";
	}elsif ($_[0] <= 449) {
		$system_mes .= "$_[1]の順序変更が正常に終了しました。";
	}elsif ($_[0] <= 499) {
		$system_mes .= "$_[1]の自動作成が正常に終了しました。";
	}elsif ($_[0] <= 549) {
		$system_mes .= "$_[1]を問題ファイルに追加しました。";
	}elsif ($_[0] <= 599) {
		$system_mes .= "$_[1]を問題ファイルに追加しました。";
	}elsif ($_[0] <= 649) {
		$system_mes .= "$_[1]の一括追加が正常に終了しました。";
	}elsif ($_[0] <= 699) {
		$system_mes .= "$_[1]の一括追加が正常に終了しました。";
	}elsif ($_[0] <= 749) {
		$system_mes .= "$_[1]の一括追加が正常に終了しました。";
	}elsif ($_[0] <= 759) {
		$system_mes .= "$_[1]の複製が正常に終了しました。";
	}elsif ($_[0] <= 999) {
		$system_mes .= "$_[1]";
	}
	
	$system_mes .="$mesno<br><br>";
}
#************************************************
# メッセージ表示処理
#************************************************
sub mes_html {
	
	if($system_mes ne ''){
		return <<"_HTML_";
<table $sys_tbl_opt bgcolor="#eeeeaa"><tr><td>
<center><big><b>■■■システムメッセージ■■■<br></b><big><br>
<table border=0><tr><td><small><b>$system_mes</b></small></td></tr></table>
</center>
</td></tr></table><br>
_HTML_
	}
}


#************************************************
# 小数点位統一関数
#************************************************
sub point {
	local($num,$point)=@_;
	local($over,$under)=split(/\./,$num);
	$under=substr($under,0,$point);
	$under=$under . '0' x ($point - length($under));
	return "$over.$under";
}


#************************************************
# フッタ表示処理
#
#_HTML_と_HTML_とのあいだに
#クイズのページのフッター部分のHTMLを記入してください。
#普通のHTML表記でかまいません。
#
#その際、著作権表記は消さないでください。
#
#************************************************
sub footer_html {
	$footer_html = <<"_HTML_";
<hr width="100%"><div align=right><span>
</span>
</div></body></html>
_HTML_
}
#************************************************
# 出題状況表示処理
#************************************************
sub rec_html {
	local(@line);
	local($type)=@_;
	if($type eq 'op'){$cgi_file=$quiz_op_cgi;}
	else{$cgi_file=$quiz_cgi;}
	
	($QU_ALL{play_win},$QU_ALL{play_num})=(0,0);
	if($type eq 'op'){
		&refresh_quiz();
		#####使用するジャンルリストを取得する
		&get_genre_dir_use();
		#####使用ジャンルからの問題の読み込み。%genre_numの値を補正する
		&quiz_read_all();
		#####$GNR{quiz_max},$GNR{play_max},$GNR{lose_max}の値を補正する
		&max_set();
	}
	#####問題が無い場合
	if($GNR{quiz_max} < 1){
		&error(692);
		return;
	}

	if($type eq 'op'){
		$td=" bgcolor='$sys_color'";
		$th=" bgcolor='$sys_color'";
		$opt=$sys_tbl_opt;
		$opt2=$sys_tbl_opt2;
		$bdc=$DSN{td_color};
	}else{
		$td=" bgcolor='$DSN{td_color}'";
		$th=" bgcolor='$DSN{th_color}'";
		$opt=$tbl_opt;
		$opt2=$tbl_opt;
		$bdc=$DSN{border_color};
	}
	


	local(@mon_type)=('単一選択問題','テキスト入力問題','複数選択問題');
	local(%multi_ans);
	$multi_ans{1}="[正解]";
	
	#####問題ごとの出題状況集計
	for($quiz_index=0;$quiz_index<$GNR{quiz_max};$quiz_index++){
		&quiz_log_read();
		
		#####問題文の編集
		my($mondai_str);
		if($GENRE_LST{$FORM{d}}{show_auth} eq 0){
			$mondai_str=$mondai[$quiz_index];
		}elsif($author[$quiz_index] ne ''){
			$mondai_str=$mondai[$quiz_index]."<div align=right>by $author[$quiz_index]</div>";
		}else{
			$mondai_str=$mondai[$quiz_index];
		}
		
		@mon_name=('選択肢1[正解]','選択肢2','選択肢3','選択肢4','選択肢5');
		if($FORM{item} eq 'list'){
			$per[int($QU{win_ratio}/5)]++;
		#####管理人用出題状況表示
		}elsif($type eq 'op'){
			
			##########
			$dumy=$quiz_index+1;
			$value=<<"_HTML_";
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td>
<table $opt>
<tr>
<td$td nowrap>
$mon_type[$anstype[$quiz_index]]
</td>
<td$td colspan=3>
Q$dumy\.$mondai_str
</td></tr>
<tr>
<td$td colspan=4>
$QU{play_num}人中$QU{play_win}人正解 正解時間 $QU{ave2} 秒
_HTML_
			local(@ans_list)=($ans[$quiz_index],$misans1[$quiz_index],$misans2[$quiz_index],$misans3[$quiz_index],$misans4[$quiz_index]);
			local(@ans_correct_list)=(0,$misanscorrect1[$quiz_index],$misanscorrect2[$quiz_index],$misanscorrect3[$quiz_index],$misanscorrect4[$quiz_index]);
			for($i=0;$i<5;$i++){
				$qu[$i]=$qu[$i]+0;
				#####選択肢ごとの正解率
				if($QU{play_num} > 0){
					$per=&point($qu[$i]*100/$QU{play_num},1);
				}else{
					$per='0.0';
				}
				if($ans_list[$i] ne ''){
					$value=$value."<tr><td$td nowrap>$mon_name[$i]$multi_ans{$ans_correct_list[$i]}</td><td$td nowrap>$qu[$i]人</td><td$td nowrap>$per%</td><td$td width=100%>$ans_list[$i]</td></tr>\n"
				}
			}
			#####テキスト入力形式の場合
			if($anstype[$quiz_index] eq '1'){
				local($qu_else)=$QU{play_num};
				foreach(@qu){
					$qu_else=$qu_else - $_;
					if($QU{play_num} > 0){
						$per=&point($qu_else*100/$QU{play_num},1);
					}else{
						$per='0.0';
					}
				}
				$value=$value."<tr><td$td nowrap>誤答(その他)</td><td$td nowrap>$qu_else人</td><td$td nowrap>$per%</td><td$td width=100%> </td></tr>\n"
			}
			$value=$value.'</table></td></tr></table><br>';
		#####一般用出題状況表示
		}else{
			$dumy=$quiz_index+1;
			
			#####問題コメントの取得
			if($GNR{show_digest} eq 1){
				$mon_digest=$digest[$quiz_index];
			}else{
				$mon_digest=$mondai_str
			}
			if($mon_digest eq ''){
				$mon_digest='------';
			}
			
			#####総合問題の場合、ジャンル名の取得
			if($#genre_dir_use > 1){
				$genre_name="<td nowrap bgcolor='$DSN{td_color}'>$GENRE_LST{&get_question_dir($quiz_index)}{title}</td>";
			}else{
				$genre_name='';
			}
			$value=<<"_HTML_";
<tr>
<td bgcolor='$DSN{td_color}' nowrap>$walign1Q$dumy.$walign2</td>
<td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{play_num}人中$QU{play_win}人正解$walign2</td>
<td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{win_ratio}%$walign2</td>
<td bgcolor='$DSN{td_color}' nowrap>$walign1$QU{ave2}秒$walign2</td>
<td bgcolor='$DSN{td_color}' nowrap>$walign1$author[$quiz_index]  $walign2</td>
<td bgcolor='$DSN{td_color}' nowrap>$walign1$mon_digest$walign2</td>
$genre_name
</tr>
_HTML_
		}
		#####全問題の総計を計算する
		$QU_ALL{play_num}=$QU_ALL{play_num}+$QU{play_num};
		$QU_ALL{play_win}=$QU_ALL{play_win}+$QU{play_win};
		$QU_ALL{ave_sum} =$QU_ALL{ave_sum}+$QU{ave}*$QU{play_win};
		
		#####ソート条件の作成
		push(@line,$value);
		if($FORM{item} eq 'num'){
			push(@sort,"$QU{play_num}\t$quiz_index");
		}elsif($FORM{item} eq 'aper'){
			push(@sort,"$QU{win_ratio}\t$quiz_index");
		}elsif($FORM{item} eq 'time'){
			push(@sort,"$QU{ave2}\t$quiz_index");
		}elsif($FORM{item} eq 'auth'){
			push(@sort,"$author[$quiz_index] \t$quiz_index");
		}else{
			push(@sort,"$quiz_index\t$quiz_index");
		}
	}
	#####全問題の正解時間の計算
	if($QU_ALL{play_win} > 0){
		$QU_ALL{ave2}=&point($QU_ALL{ave_sum}/$QU_ALL{play_win},2);
	}else{$QU_ALL{ave2}='0.00';}
	if($QU_ALL{play_num} > 0){
		$QU_ALL{win_ratio}=&point($QU_ALL{play_win}*100/$QU_ALL{play_num},2);
	}else{
		$QU_ALL{win_ratio}='0.00';
	}
	$QU_ALL{play_lose}=$QU_ALL{play_num}-$QU_ALL{play_win};

	$FORM{"item-$FORM{item}"}=' selected';
	$FORM{"sort-$FORM{sort}"}=' selected';
	$main_html=<<"_HTML_";
<br><span><b>■$_score情報■</b></span>
$align1
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td>
<table $opt>
<tr><td$th><small>$walign1総問題数$walign2</small></td>
<td$td width=100%><small>$walign1$GNR{quiz_max}問$walign2</small></td></tr>
<tr><td$th><small>$walign1総出題回数$walign2</small></td>
<td$td><small>$walign1$QU_ALL{play_num}回$walign2</small></td></tr>
<tr><td$th><small>$walign1総正解回数$walign2</small></td>
<td$td><small>$walign1$QU_ALL{play_win}回$walign2</small></td></tr>
<tr><td$th nowrap><small>$walign1平均正解時間$walign2</small></td>
<td$td><small>$walign1$QU_ALL{ave2}秒$walign2</small></td></tr>
<tr><td$th><small>$walign1総正解率$walign2</small></td>
<td$td><small>$walign1$QU_ALL{win_ratio}%$walign2</small></td></tr></table>
</td></tr></table>
<form action="$cgi_file" method="$method">
_HTML_

	#####管理者用hiddenタグ
	if($type eq 'op'){
		$main_html.=<<"_HTML_";
<input type=hidden name=passch value="$FORM2{passch}">
<input type=hidden name=menu value=1>
<input type=hidden name=type value=score>
_HTML_
	#####一般用hiddenタグ
	}else{
		$main_html.='<input type=hidden name=s value=1>';
		if($FORM{passch} ne ''){
			$main_html.="<input type=hidden name=passch value='$FORM2{passch}'>";
		}
	}
	
	$main_html.=<<"_HTML_";
<input type=hidden name=d value="$FORM{d}">
<table border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td>
<table $opt2>
<tr>
<td$td><select name=item>
<option value=mon$FORM{'item-mon'}>問題番号順</option>
<option value=num$FORM{'item-num'}>出題数順</option>
<option value=aper$FORM{'item-aper'}>正解率順</option>
<option value=time$FORM{'item-time'}>正解時間順</option>
<option value=list$FORM{'item-list'}>正解率分布</option>
<option value=auth$FORM{'item-auth'}>作成者</option>
</select></td>
<td$td><select name=sort>
<option value=up$FORM{'sort-up'}>昇順</option>
<option value=down$FORM{'sort-down'}>降順</option>
</select></td>
<td$td>
<input type=submit value=表\示>
</td></tr></table></td></tr></table></form><hr>
_HTML_
	
	#####出題状況のソート
	if($FORM{sort} eq 'down'){
		if($FORM{item} eq 'auth'){
			@sort=sort {$b cmp $a} @sort;
		}else{@sort=sort {$b <=> $a} @sort;}
	}else{
		if($FORM{item} eq 'auth'){
			@sort=sort {$a cmp $b} @sort;
		}else{@sort=sort {$a <=> $b} @sort;}
	}
	
	if($#genre_dir_use > 1){$genre_name="<td nowrap bgcolor='$DSN{th_color}'>ジャンル</td>";}
	else{$genre_name='';}
	if($FORM{item} eq 'list'){
		$main_html.='<span><b>■正解率分布■</b></span>';

		$main_html.="<table width='$SYS{tblw}'border=0 cellpadding=0 cellspacing=0 bgcolor='$bdc'><tr><td><table $opt>";
		$max=0;$sum=0;
		for($i=0;$i<=20;$i++){
			$sum=$sum+$per[$i];
			if($max < $per[$i]){$max=$per[$i];}
		}
		for($i=0;$i<=20;$i++){
			$per[$i]=$per[$i]+0;
			if($max > 0){
				$rate=&point($per[$i]/$sum*100,1);
				$width=int($per[$i]/$max*$graph_w);
			}else{$rate=0.0;$width=1;}
			if($width < 1){$width=1;}
			$from=$i*5;$to=$i*5+5;
			if($i<20){
				$main_html.="<tr><td$th nowrap>$walign1$from\%-$to\%$walign2</td><td$td nowrap><img src='$SYS{b_gif}' width='$width' height='$graph_h'> $per[$i]問\($rate%\)</td></tr>";
			}else{
				$main_html.="<tr><td$th nowrap>$walign1$from\%$walign2</td><td$td nowrap><img src='$SYS{b_gif}' width='$width' height='$graph_h'> $per[$i]問\($rate%\)</td></tr>";
			}
		}
		$main_html.='</table></td></tr></table>';
	#####一般出題状況表示
	}elsif($type ne 'op'){
		$main_html.=<<"_HTML_";
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$bdc"><tr><td>
<table $opt><tr>
<td nowrap bgcolor="$DSN{th_color}">$walign1問題番号$walign2</td>
<td nowrap bgcolor="$DSN{th_color}">$walign1成績$walign2</td>
<td nowrap bgcolor="$DSN{th_color}">$walign1正解率$walign2</td>
<td nowrap bgcolor="$DSN{th_color}">$walign1正解時間$walign2</td>
<td nowrap bgcolor="$DSN{th_color}">$walign1作成者$walign2</td>
<td nowrap bgcolor="$DSN{th_color}">$walign1問題内容$walign2</td>
$genre_name
</tr>
_HTML_
	}
	foreach(@sort){
		($dum,$num)=split(/\t/,$_);
		$main_html.= $line[$num];
	}
	if($type ne 'op'){$main_html.='</table></td></tr></table>';}
	$main_html.= "$align2\n";
}

#************************************************
# 問題入力form用Script
#************************************************
sub edit_quiz_form_script{
	$main_html.=<<"_HTML_";
<script language="javascript">
<!--
function setAnsType(){
	if(!document.frm.atype){return;}
	if(!document.frm.atype[1]){return;}

	if(document.frm.atype[1].checked){
		com_color="#bbbbbb";
		com_disabled=true;
		cor_disabled=false;
	}else{
		com_color="#ffffff";
		com_disabled=false;
		cor_disabled=true;
	}
	document.frm.qmasc1.disabled=cor_disabled;
	document.frm.qmasc2.disabled=cor_disabled;
	document.frm.qmasc3.disabled=cor_disabled;
	document.frm.qmasc4.disabled=cor_disabled;
	if(document.frm.qmac1){
		document.frm.qmac1.disabled=com_disabled;
		document.frm.qmac2.disabled=com_disabled;
		document.frm.qmac3.disabled=com_disabled;
		document.frm.qmac4.disabled=com_disabled;
		document.frm.qmac1.style.background=com_color;
		document.frm.qmac2.style.background=com_color;
		document.frm.qmac3.style.background=com_color;
		document.frm.qmac4.style.background=com_color;
	}
}
//-->
</script>
_HTML_

}


#************************************************
# 引数のうち最大数を返す。
#************************************************
sub max{
	local(@list)=@_;
	local($max);$max=$list[0];
	foreach(@list[1..$#list]){if($max < $_){$max = $_;}}
	return $max;
}

#************************************************
# 引数のうち最大数を返す。
#************************************************
sub mygrep{
	local($item);
	local($sorce,@list)=@_;
	foreach $item(@list){
		if($sorce eq $item){return 1;}
	}
	return 0;
}

#************************************************
# ファイル内容を返す
#************************************************
sub getFileLine{
	local($ret,@list);
	local($path)=@_;
	open(DB,"$path");
	@list=<DB>;
	close(DB);
	foreach $line(@list){
		$ret.=$line;
	}
	return $ret;
}

#************************************************
# エラー表示処理
#************************************************
sub error {
	local($errno);
	$errno="  message($_[0])";
	if (!($_[0] =~ /^\d+$/)){
		$error_mes .= $_[0];
		$errno='';
	}elsif ($_[0] <= 199) {
		$error_mes .= "$_[1]が不正です。";
	}elsif ($_[0] <= 299) {
		$error_mes .= "$_[1]が入力されていません";
	}elsif ($_[0] <= 349) {
		$error_mes .= "$_[1]が不正です。半角数字を入力してください";
	}elsif ($_[0] <= 399) {
		$error_mes .= "$_[1]が不正です。半角数字または0%~100%を入力してください";
	}elsif ($_[0] <= 499) {
		$error_mes .= "$_[1]が正しく選択されていません";
	}elsif ($_[0] <= 509) {
		$error_mes .= "$_[1]は半角で$max_en文字までです。<br>$_[1]が長すぎます。<br>登録できませんでした。";
	}elsif ($_[0] <= 519) {
		$error_mes .= "$_[1]は半角で$max_com文字までです。<br>$_[1]が長すぎます。<br>登録できませんでした。";
	}elsif ($_[0] <= 529) {
		$error_mes .= "$_[1]が長すぎます。<br>半角20文字以内で入力して下さい。";
	}elsif ($_[0] <= 539) {
		$error_mes .= "$_[1]が範囲外です。";



	}elsif ($_[0] <= 549) {
		$error_mes .= "$_[1]が一致しません。<br>再入力してください。";


	}elsif ($_[0] <= 609) {
		$error_mes .= 'ずるをした可能性があります。正常に処理されませんでした。<br><br>なお、管理者が作業を行っていた可能性があります。しばらくしてからリロードしてみて下さい。';
	}elsif ($_[0] <= 619) {
		$error_mes .= 'このジャンルでは、より多くの方に登録していただくために、<br>同一IPアドレスによる同一スコアの登録は出来ません。';
	}elsif ($_[0] <= 629) {
		$error_mes .= "このハイスコアは、上位$GNR{num_limit}人をのスコアを記録しています。<br>残念ながらこの記録は登録できませんでした。";
	}elsif ($_[0] <= 639) {
		$error_mes .= 'すでにこの記録は登録されています。登録出来ませんでした。';
	}elsif ($_[0] <= 649) {
		$error_mes .= 'このクイズは、高成績者を登録できません。';
	}elsif ($_[0] <= 659) {
		$error_mes .= "このクイズは現在$_underconstです。\nまたのおこしをお待ちしています。";
	}elsif ($_[0] <= 669) {
		$error_mes .= "現在同時プレイ人数限度$SYS{max_player}人がプレイ中です。<br>しばらくしてからお越しください。";
	}elsif ($_[0] <= 679) {
		$error_mes .= '登録された問題がありません。<br><br>しばらくしてから、またお越しください。';
	}elsif ($_[0] <= 689) {
		$error_mes .= 'クイズのジャンルが登録されていません。';
	}elsif ($_[0] <= 699) {
		$error_mes .= 'このジャンルは、問題が未登録です。';
	}elsif ($_[0] <= 704) {
		$error_mes .= 'このジャンルは、問題ファイルがありません。';
	}elsif ($_[0] <= 709) {
		$error_mes .= '一括出題形式の問題は、携帯モードではチャレンジできません。';



	}elsif ($_[0] <= 719) {
		$error_mes .= 'システムファイルの読み込みに失敗しました。<br>管理者にお問い合わせ下さい。';
	}elsif ($_[0] <= 729) {
		$error_mes .= 'ジャンルファイルの読み込みに失敗しました。<br>管理者にお問い合わせ下さい。';
	}elsif ($_[0] <= 739) {
		local($permition);
		$permition=&permition($mod_dir);
		$error_mes .="$_[1]を自動作成できませんでした。<br>本プログラムを設置しているディレクトリのパーティションを<br>$mod_dir$permitionにしてください。<br>なお、プロバイダの関係上パーミッションに制限があり、<br>このエラーが発生する場合は、<br>FTPを使い手動で$_[1]を作成して下さい。";
	}elsif ($_[0] <= 749) {
		local($permition);
		$permition=&permition($mod_dat);
		$error_mes .="$_[1]に書き込みができませんでした。<br>ファイルのパーティションを<br>$mod_dat$permitionにしてください。";
	}elsif ($_[0] <= 759) {
		$error_mes .= 'このジャンルは、問題の投稿ができません。';
	}elsif ($_[0] <= 769) {
		$error_mes .= '現在、高成績者は登録されていません。';
	}elsif ($_[0] <= 779) {
		$error_mes .= "$_[1]はすでに登録されています。";
	}elsif ($_[0] <= 789) {
		$error_mes .= "同じ問題を何度も回答することはできません。";
	}elsif ($_[0] <= 799) {
		$error_mes .= "このジャンルは、登録されている投稿問題がありません。";


	}elsif ($_[0] <= 809) {
		$error_mes .= "$_[1]が存在しません。";
	}elsif ($_[0] <= 819) {
		$error_mes .= "$_[1]が存在しません。ファイル構\成を確認してください。";
	}elsif ($_[0] <= 829) {
		$error_mes .= "$_[1]は空です";
	}elsif ($_[0] <= 839) {
		$error_mes .= "$_[1]は現在使用中です。<br>削除できませんでした。";
	}elsif ($_[0] <= 849) {
		$error_mes .= "$_[1]は使用できません。<br>別のディレクトリ名を入力してください。";
	}elsif ($_[0] <= 859) {
		$error_mes .= "$_[1]はすでに登録されています。<br>別の名前を入力してください。";
	}elsif ($_[0] <= 869) {
		$error_mes .= "$_[1]のタイムスタンプが違います。<br>作業中に変更されたか、二度送信を行った可能\性があります。<br>正しく変更されているか確認してください。";


	}elsif ($_[0] <= 909) {
		$error_mes .= '問題が一問も登録されませんでした。';
	}elsif ($_[0] <= 919) {
		$error_mes .= "$_[1]行目にエラーがあります。";
	}elsif ($_[0] <= 929) {
		$error_mes .= "$_[1]問目の問題文がありません。";
	}elsif ($_[0] <= 939) {
		$error_mes .= "$_[1]問目の正解がありません。";
	}elsif ($_[0] <= 949) {
		$error_mes .= "$_[1]問目の選択肢1がありません。";
	}elsif ($_[0] <= 959) {
		$error_mes .= "パスワードは変更できません。";
	}else {
		$error_mes .= '処理に何らかのエラーが発生し作業は中止されました。';
		$errno='';
	}
	$error_mes .="$errno<br><br>";
#	open(DB,">>error.dat");
#	print DB &time_set(time)."$error_mes\n";
#	close(DB);
}

#************************************************
# エラー表示処理
#************************************************
sub error_html{
	local($return,$color);
	if($error_mes ne ''){
		if($DSN{com_color} eq ''){$color='#eeeebb';}
		else{$color=$DSN{com_color};}
		$return = <<"_HTML_";
<hr><br>
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0><tr><td>
<table $top_tbl_opt bgcolor="$color"><tr><td$nowrap>
<center><big><font color=#ff0000>◆ お知らせ ◆</font><br><br> </big>
<table border=0><tr><td><span><b>$error_mes</b></span></td></tr></table>
</center>
</td></tr></table>
</td></tr></table><br>
_HTML_
	}
	return $return;
}

#************************************************
# HTML出力
#************************************************
sub output{
	local($er);
	$er=&error_html;
	print"Content-type: text/html\n";
	if($SYS{nocache} ne '0'){
		print "Pragma: no-cache\n";
		print "Cache-Control: no-cache\n";
		print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n";
	}
	print "\n";

	print <<"_HTML_";
$header_html
$align1
$er
$start_html
$test
$main_html
$align2
$midi_html
$footer_html
_HTML_
	exit;
}
#************************************************
# HTML出力(携帯用)
#************************************************
sub output_i{
	print"Content-type: text/html\n";
	if($SYS{nocache} ne '0'){
		print "Pragma: no-cache\n";
		print "Cache-Control: no-cache\n";
		print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\n";
	}
	print "\n";
	print <<"_HTML_";
$header_i_html
$error_mes
$start_i_html
$test
$main_i_html
$footer_i_html
_HTML_
	exit;
}


#************************************************
# ビジー表示
#************************************************
sub busy_html{
	$header_html=<<"_HTML_";
<html>
<head>
<title>ビジー</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$charset">
_HTML_

	if($SYS{nocache} ne '0'){
		$header_html.=<<"_HTML_";
<META http-equiv="Pragma" content="no-cache">
<META http-equiv="Cache-Control" content="no-cache">
<META http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"> 
_HTML_
	}
	$header_html.=<<"_HTML_";
</head>
<BODY bgcolor='$sys_color'>

<br><br><b>
■ファイルを読み込めませんでした■<br></b>
<br>
管理人が作業中の可能\性があります。<br>
もう一度その場でリロードしてください。<br><br><br>
_HTML_
}
#************************************************
# アクセス制限表示
#************************************************
sub guard_html{
	$header_html=<<"_HTML_";
<html>
<head>
<title>アクセス制限</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$charset">
_HTML_

	if($SYS{nocache} ne '0'){
		$header_html.=<<"_HTML_";
<META http-equiv="Pragma" content="no-cache">
<META http-equiv="Cache-Control" content="no-cache">
<META http-equiv="Expires" content="Thu, 01 Dec 1994 16:00:00 GMT"> 
_HTML_
	}
	$header_html.=<<"_HTML_";
</head>
<BODY bgcolor='$sys_color'>

<br><br><b>
■アクセスできませんでした■<br></b>
<br>
現在、管理人によりアクセス制限がかかっております。<br><br>
_HTML_
}

#************************************************
# ファイルロック
#************************************************
sub file_lock{
	open(DB,">$_[0]");
	close(DB);
}
#************************************************
# ファイルアンロック
#************************************************
sub file_unlock{
	unlink "$_[0]";
}

#************************************************
# ロック状態をチェック。
##
## 戻り値	0:正常	1:busy
##
## ロックファイルが1分以内に作成されていれば、1秒待機する
## 指定回数連続busyならば、0を返す
#************************************************
sub ch_lock{
	local($file,$count)=@_;
	while($count--){
		if(-f $file){
			if((-M $file)*60*60*24 < 60){sleep(1);}
			else{return 0;}
		}else{return 0;}
	}
	return 1;
}




###############以下、アダプター###############




#************************************************
# 管理人が作業中でないことをチェック
##
## 戻り値	0:正常	1:busy
#************************************************
sub ch_sys_lock{
	return &ch_lock("$data_dir/$file_lock",10);
}
#************************************************
# 管理人作業開始によるロック
#************************************************
sub sys_lock{
	return &file_lock("$data_dir/$file_lock");
}
#************************************************
# 管理人作業終了によるアンロック
#************************************************
sub sys_unlock{
	return &file_unlock("$data_dir/$file_lock");
}



#************************************************
# ハイスコアファイルが更新中でないことをチェック
##
## 戻り値	0:正常	1:busy
##
## 引数		$dir_name	ジャンル名
#************************************************
sub ch_hist_lock{
	local($dir_name)=@_;
	return &ch_lock("$dir_name/$GNR{scorehst_cgi}\.lock",10);
}
#************************************************
# ハイスコアファイルの更新開始によるロック
## 引数		$dir_name	ジャンル名
#************************************************
sub hist_lock{
	local($dir_name)=@_;
	return &file_lock("$dir_name/$GNR{scorehst_cgi}\.lock");
}
#************************************************
# ハイスコアファイルの更新終了によるアンロック
## 引数		$dir_name	ジャンル名
#************************************************
sub hist_unlock{
	local($dir_name)=@_;
	return &file_unlock("$dir_name/$GNR{scorehst_cgi}\.lock");
}



#************************************************
# クッキーから読み込み
#************************************************
sub get_cookie{
	local(@pairs,$pair,$name,$value);
	if($imode eq 'mb'){return;}
	@pairs = split(/;/,$ENV{'HTTP_COOKIE'});
	foreach $pair (@pairs) {
		($name,$value) = split(/=/,$pair,2);
		$name =~ s/ //g;
		$DUMMY{$name} = $value;
	}
	@pairs = split(/,/,$DUMMY{$SYS{cookie}});
	foreach $pair (@pairs) {
		($name,$value) = split(/:/,$pair,2);
		$COOKIE{$name} = $value;
	}
}
#************************************************
# クッキーへ書き込み
#************************************************
sub set_cookie{
	if($imode eq 'mb'){return;}
	($secg,$ming,$hourg,$mdayg,$mong,$yearg,$wdayg,$ydayg,$isdstg) = gmtime(time + 90*24*60*60);
	$y0='Sunday'; $y1='Monday'; $y2='Tuesday'; $y3='Wednesday'; $y4='Thursday'; $y5='Friday'; $y6='Saturday';
	@youbi = ($y0,$y1,$y2,$y3,$y4,$y5,$y6);
	$m0='Jan'; $m1='Feb'; $m2='Mar'; $m3='Apr'; $m4='May'; $m5='Jun';
	$m6='Jul'; $m7='Aug'; $m8='Sep'; $m9='Oct'; $m10='Nov'; $m11='Dec';
	@monthg = ($m0,$m1,$m2,$m3,$m4,$m5,$m6,$m7,$m8,$m9,$m10,$m11);
	$date_gmt = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT",$youbi[$wdayg],$mdayg,$monthg[$mong],$yearg +1900,$hourg,$ming,$secg);

	@data=();
	foreach(sort{$a cmp $b} keys %COOKIE){
		push(@data,"$_\:$COOKIE{$_}");
	}
	$data=join(',',@data);
	print "Set-Cookie: $SYS{cookie}=$data; expires=$date_gmt\n";
}#このクッキーはだいたい3ヶ月間有効です。



#************************************************
# ファイルのバックアップ処理
##
## 引数		$file		バックアップ元ファイル
## 			$write		0:蓄積モード	1:上書きモード
##			$span		バックアップ間隔(日)
#************************************************
sub backup_file{
	local($file,$write,$span)=@_;

	#####バックアップ時刻の取得
	local($backuptime)=&get_recent_backuptime($file,$write);
	#####バックアップ間隔を超えていたらバックアップを取る
	if($now - $backuptime > $span*60*60*24){
		&copy_file($file,$write);
	}
}

#************************************************
# ファイルヘッダの更新時刻を更新
##
## 1行目に更新時刻を印字する
##
## 引数		$file_name	ファイル名
#************************************************
sub renew_date{
	local($file_name)=@_;
	open(DB,"$file_name");local(@list)=<DB>;close(DB);
	
	#####1行目に更新時刻が記載されていれば削除する
	if($list[0]=~ /^date/){$list[0]='';}
	
	#####1行目に更新時刻を付け、ファイルに書き込む
	&write_file($file_name,('date'.time."\n",@list));
}

#************************************************
# バックアップファイルを作成
##
## 引数		$fromfile		バックアップ元ファイル
## 			$LOG{write}		0:蓄積モード	1:上書きモード
#************************************************
sub copy_file{
	local($fromfile,$LOG{write})=@_;
	local(@list,$tofile,$max);
	#####バックアップ先ファイル名を取得する
	$tofile=&buckup_filename($fromfile,$LOG{write},$update);
	
	#####バックアップファイルを作成する
	open(DB,"$fromfile");
	@list=<DB>;
	close(DB);
	if($list[0] =~ /^date/){$list[0]='';}
	if(&write_file($tofile,("date$now\n",@list))){return;}
	
	#####作成したバックアップファイル名を返す
	return $tofile;
}
#************************************************
# バックアップファイル名を返す
##
## 引数		$fromfile		バックアップ元ファイル
## 			$write			0:蓄積モード	1:上書きモード
## 			$update			1行目に更新時刻を追加するかどうか
#************************************************
sub buckup_filename{
	local($fromfile,$write,$update)=@_;
	local($head,$dir);
	$max=0;
	if($fromfile =~ /(.*)\/(.*)\.cgi$/){
		$dir="$1/";
		$head=$2;
	}elsif($fromfile =~ /(.*)\.cgi$/){
		$head=$1;
	}
	#####上書きモードの場合
	if($write){
		#####バックアップ先ファイル名を返す
		return "${dir}${head}_bak.cgi";
	#####蓄積モードの場合
	}else{
		#####最新のバックアップファイル番号を取得する
		opendir(DIR,$FORM{d});
		local(@dir_files)=readdir(DIR);
		close(DIR);
		foreach $file(@dir_files){
			if($file=~ /^${head}_bak(\d+).cgi/){
				if($max < $1){$max=$1;}
			}
		}
		$max++;
		
		#####バックアップ先ファイル名を返す
		return "${dir}${head}_bak${max}.cgi";
	}
}
#************************************************
# 最新のバックアップ時刻を取得する
##
## 戻り値	最新バックアップファイルのバックアップ時刻を取得する
##
## 引数		$fromfile		バックアップ元ファイル
## 			$write			0:蓄積モード	1:上書きモード
#************************************************
sub get_recent_backuptime{
	local($fromfile,$write,$update)=@_;
	$max=0;
	local($head,$dir,$backup_file);
	if($fromfile =~ /(.*)\/(.*)\.cgi$/){
		$dir="$1/";
		$head=$2;
	}elsif($fromfile =~ /(.*)\.cgi$/){
		$head=$1;
	}

	#####上書きモードの場合
	if($write){
		#####バックアップ先ファイル名を返す
		$backup_file = "${dir}${head}_bak.cgi";
	#####蓄積モードの場合
	}else{
		#####最新のバックアップファイル番号を取得する
		opendir(DIR,$FORM{d});
		local(@dir_files)=readdir(DIR);
		close(DIR);
		foreach $file(@dir_files){
			if($file=~ /^${dir}${head}_bak(\d+).cgi/){
				if($max < $1){$max=$1;}
			}
		}
		
		#####バックアップ先ファイル名を返す
		$backup_file = "${dir}${head}_bak${max}.cgi";
	}
	open (DB,$backup_file);
	local(@list)=<DB>;
	close(DB);
	
	if($list[0] =~ /^date(\d+)/){
		return $1;
	}else{
		return 0;
	}
}
#************************************************
# %SYS変数の初期値
#************************************************
sub def_sys{
	$SYS{design}			='デフォルトシステムデザイン';
											#####メニューページのデザイン名
	$SYS{limit}				=10;			#####プレイヤのログ保護期間(分)
	$SYS{max_player}		=50;			#####同時にプレイできる人数(人数×1kbの容量を必要とします)
	$SYS{cookie}			='QQQ';			#####クッキーID
	$SYS{quiz_form}			=2;				#####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型
	$SYS{main_title}		='無題';		#####クイズタイトル
	$SYS{header}			='<table cellspacing=0 cellpadding=0 width="100%"><tr>'
								.'<td Valign=TOP><small>$top$quiz_op$imode</small></td>'
								.'<td><div align=right><p><B><BIG>$title</BIG></B></p></div></td></tr></table>';
											#####メニューページのヘッダー
	$SYS{sub_header}		='<table cellspacing=0 cellpadding=0 width="100%"><tr>'
								.'<td nowarap Valign=TOP><small>$index$challenge$high$graph$score$add</small></td>'
								.'<td><div align=right><p><big><B>$genre</B>$sub_title<br> </big><br>'
								.'<span>$mode</span></p></div></td></tr></table>';
	$SYS{style}				='BIG{font-size:12pt;}<br>'
								.'SPAN{font-size:9pt;}<br>'
								.'SMALL{font-size:8pt;}<br>'
								.'BODY,TD{font-size:8pt;}';
	$SYS{top_message}		='';			#####メニューページのメッセージ
	$SYS{top_table}			=1;				#####メニューページのコメントのテーブル表記
	$SYS{top_url}			='';			#####トップぺージへのURL
	$SYS{easy}				=0;				#####メニューページの表レイアウトの項目数
	$SYS{'time'}			='1';			#####回答時間による高成績者順位付けを行う。0の場合同順位。
	$SYS{wrap}				='0';			#####自動文字折り返し
	$SYS{nocache}			=1;				#####no-cache設定 1:有り 0:無し
	$SYS{lag}				='0';			#####サーバー時刻のタイムラグ(単位時間)
	$SYS{tblw}				='80%';			#####テーブル幅
}
#************************************************
# %SYSDESIGN_LST変数の初期値
#
# 引数:$dtitle   システムデザイン名
#************************************************
sub def_sysdesign{
	my($dtitle)=$_[0];
	undef(%{$SYSDESIGN_LST{$dtitle}});
	$SYSDESIGN_LST{$dtitle}{pc}{sysdesign_title}	=$dtitle;		#####デザイン名
	$SYSDESIGN_LST{$dtitle}{mb}{sysdesign_title}	=$dtitle;		#####デザイン名
	$SYSDESIGN_LST{$dtitle}{pc}{top_wall}			='';			#####メニューページの壁紙
	$SYSDESIGN_LST{$dtitle}{pc}{top_back_color}		='#ddffdd';		#####メニューページの背景色
	$SYSDESIGN_LST{$dtitle}{pc}{top_table_color}	='#ffffdd';		#####メニューページの表の色
	$SYSDESIGN_LST{$dtitle}{pc}{top_genre_color}	='#ffffdd';		#####メニューページのジャンル名色
	$SYSDESIGN_LST{$dtitle}{pc}{top_info_color}		='#cceeee';		#####メニューページの情報色
	$SYSDESIGN_LST{$dtitle}{pc}{top_com_color}		='#ddffff';		#####メニューページのコメント色
	$SYSDESIGN_LST{$dtitle}{pc}{top_high_color}		='#ffdddd';		#####メニューページの高成績者色
	$SYSDESIGN_LST{$dtitle}{pc}{top_border_color}	='#99ff99';		#####メニューページの表の枠の色
	$SYSDESIGN_LST{$dtitle}{pc}{top_text_color}		='#000000';		#####文字色
	$SYSDESIGN_LST{$dtitle}{pc}{top_link_color}		='#0000EE';		#####リンク色
	$SYSDESIGN_LST{$dtitle}{pc}{top_vlink_color}	='#551A8B';		#####既訪問リンク色
	$SYSDESIGN_LST{$dtitle}{pc}{top_border_high}	='1';			#####メニューページの表の高さ
	$SYSDESIGN_LST{$dtitle}{pc}{top_border}			='2';			#####メニューページの表の幅
	$SYSDESIGN_LST{$dtitle}{pc}{top_border_in}		='1';			#####メニューページの表の内幅
	$SYSDESIGN_LST{$dtitle}{pc}{a_gif}				='a.gif';		#####履歴グラフ画像1
	$SYSDESIGN_LST{$dtitle}{pc}{b_gif}				='b.gif';		#####履歴グラフ画像2
	$SYSDESIGN_LST{$dtitle}{pc}{align}				='c';			#####表のレイアウト
	$SYSDESIGN_LST{$dtitle}{pc}{walign}				='l';			#####表内文字レイアウト
}

#************************************************
# %GENRE_LSTの初期設定
#************************************************
sub def_genre {
	my($dir)=$_[0];
	$GENRE_LST{$dir}{dir}					=$dir;
	$GENRE_LST{$dir}{design}				='デフォルトジャンルデザイン';
	$GENRE_LST{$dir}{title}					='無題';
	$GENRE_LST{$dir}{top_comment}			='';
	$GENRE_LST{$dir}{start_comment}			='<center>$titleにようこそ。現在、挑戦者数は$challenge人です。<br>'
										.'クイズの総問題数は$quiz_max問で、出題数は$play_max問ですが、<br>'
										.'$lose_max問間違えるとゲームオーバーです。<br>'
										.'なお制限時間は$time秒で、正答率$high%以上で合格です。<br>'
										.'$champion最高成績目指してがんばってください。</center>';
	$GENRE_LST{$dir}{mondai_cgi}			='';
	$GENRE_LST{$dir}{mes_cgi}				="$mes_$dir";
	$GENRE_LST{$dir}{mente}					=0;
	$GENRE_LST{$dir}{cont}					=1;
	$GENRE_LST{$dir}{notext}				=0;
	$GENRE_LST{$dir}{direct_cont}			=0;
	$GENRE_LST{$dir}{show_digest}			=1;
	$GENRE_LST{$dir}{show_auth}				=1;
	$GENRE_LST{$dir}{show_genre}			=1;
	$GENRE_LST{$dir}{result_cf}				=0;
	$GENRE_LST{$dir}{result_digest}			=0;
	$GENRE_LST{$dir}{portable_high_num}		=10;
	$GENRE_LST{$dir}{challenge_code}		='';

	$GENRE_LST{$dir}{1}{mode_name}			="勝ち抜き戦モード";
	$GENRE_LST{$dir}{1}{show_ans}			=0;
	$GENRE_LST{$dir}{1}{random}				=1;
	$GENRE_LST{$dir}{1}{quiz_max}			='';
	$GENRE_LST{$dir}{1}{play_max}			='';
	$GENRE_LST{$dir}{1}{lose_max}			=3;
	$GENRE_LST{$dir}{1}{time_limit}			=60;
	$GENRE_LST{$dir}{1}{high_border}		=80;
	$GENRE_LST{$dir}{1}{high_cgi}			="$high1_$dir";
	$GENRE_LST{$dir}{1}{high_back_day}		=0;
	$GENRE_LST{$dir}{1}{high_back_w}		=1;
	$GENRE_LST{$dir}{1}{scorehst_cgi}		="$hst1_$dir";
	$GENRE_LST{$dir}{1}{scorehst_back_day}	=0;
	$GENRE_LST{$dir}{1}{scorehst_back_w}	=1;
	$GENRE_LST{$dir}{1}{graph_border}		=20;
	$GENRE_LST{$dir}{1}{histry_div}			=5;
	$GENRE_LST{$dir}{1}{day_limit}			='';
	$GENRE_LST{$dir}{1}{num_limit}			='';
	$GENRE_LST{$dir}{1}{no_limit}			=10;
	$GENRE_LST{$dir}{1}{rec_com}			=1;
	$GENRE_LST{$dir}{1}{double_high}		=1;
	$GENRE_LST{$dir}{1}{bundle}				=0;
	$GENRE_LST{$dir}{1}{show_result}		=1;
	
	$GENRE_LST{$dir}{2}{mode_name}			="20問モード";
	$GENRE_LST{$dir}{2}{show_ans}			=0;
	$GENRE_LST{$dir}{2}{random}				=1;
	$GENRE_LST{$dir}{2}{quiz_max}			='';
	$GENRE_LST{$dir}{2}{play_max}			=20;
	$GENRE_LST{$dir}{2}{lose_max}			=20;
	$GENRE_LST{$dir}{2}{time_limit}			=60;
	$GENRE_LST{$dir}{2}{high_border}		=80;
	$GENRE_LST{$dir}{2}{high_cgi}			="$high2_$dir";
	$GENRE_LST{$dir}{2}{high_back_day}		=0;
	$GENRE_LST{$dir}{2}{high_back_w}		=1;
	$GENRE_LST{$dir}{2}{scorehst_cgi}		="$hst2_$dir";
	$GENRE_LST{$dir}{2}{scorehst_back_day}	=0;
	$GENRE_LST{$dir}{2}{scorehst_back_w}	=1;
	$GENRE_LST{$dir}{2}{graph_border}		=40;
	$GENRE_LST{$dir}{2}{histry_div}			=2;
	$GENRE_LST{$dir}{2}{day_limit}			='';
	$GENRE_LST{$dir}{2}{num_limit}			='';
	$GENRE_LST{$dir}{2}{no_limit}			=10;
	$GENRE_LST{$dir}{2}{rec_com}			=1;
	$GENRE_LST{$dir}{2}{double_high}		=1;
	$GENRE_LST{$dir}{2}{bundle}				=0;
	$GENRE_LST{$dir}{2}{show_result}		=1;
}

#************************************************
# %DESIGNの初期設定
#
# 引数:$dtitle   ジャンルデザイン名
#************************************************
sub def_design {
	my($dtitle)=$_[0];
	undef(%{$DESIGN_LST{$dtitle}});
	$DESIGN_LST{$dtitle}{pc}{design_title}	=$_[0];
	$DESIGN_LST{$dtitle}{mb}{design_title}	=$_[0];
	$DESIGN_LST{$dtitle}{pc}{text_color}	='#000000';
	$DESIGN_LST{$dtitle}{pc}{link_color}	='#0000ee';
	$DESIGN_LST{$dtitle}{pc}{vlink_color}	='#551A8B';
	$DESIGN_LST{$dtitle}{pc}{champ_color}	='#ff0000';
	$DESIGN_LST{$dtitle}{pc}{main_color}	='#cccccc';
	$DESIGN_LST{$dtitle}{pc}{win_color}		='#ccccff';
	$DESIGN_LST{$dtitle}{pc}{lose_color}	='#ffcccc';
	$DESIGN_LST{$dtitle}{pc}{com_color}		='#eeeebb';
	$DESIGN_LST{$dtitle}{pc}{th_color}		='#bbeebb';
	$DESIGN_LST{$dtitle}{pc}{td_color}		='#ddffdd';
	$DESIGN_LST{$dtitle}{pc}{border_color}	='#ffdddd';
	$DESIGN_LST{$dtitle}{pc}{border_high}	='3';
	$DESIGN_LST{$dtitle}{pc}{border}		='1';
	$DESIGN_LST{$dtitle}{pc}{border_in}		='2';
	$DESIGN_LST{$dtitle}{pc}{win_sign}		='<font color="blue"><big><b>正解!</b></big></font>';
	$DESIGN_LST{$dtitle}{mb}{win_sign}		='<font color="blue"><b>正解!</b></font>';
	$DESIGN_LST{$dtitle}{pc}{lose_sign}		='<font color="red"><big><b>不正解!</b></big></font>';
	$DESIGN_LST{$dtitle}{mb}{lose_sign}		='<font color="red"><b>不正解!</b></font>';
	$DESIGN_LST{$dtitle}{pc}{over_sign}		='<font color="red"><big><b>時間オーバー!</b></big></font>';
	$DESIGN_LST{$dtitle}{mb}{over_sign}		='<font color="red"><b>時間オーバー!</b></font>';
}

#************************************************
# プレイログの初期化
#************************************************
sub def_log{
	srand();
	if($FORM{m} eq ''){$FORM{m}=1;}
	$LOG{num}		=0;									#####問題数
	$LOG{win}		=0;									#####正解数
	$LOG{lose}		=0;									#####不正回数
	$LOG{seed}		=int(rand(1000)*100+1);				#####シーズ
	$LOG{old}		=0;									#####前回分回答
	$LOG{write}		='';								#####ハイスコア登録フラグ
	$LOG{name}		=$COOKIE{N};						#####ハイスコア登録名
	$LOG{'time'}	="";								#####初回アクセス時刻
	$LOG{lap}		=$now;								#####前回回答時刻
	$LOG{last_lap}	=0;									#####前回回答時間
	$LOG{genre}		=$FORM{d};							#####ジャンル名
	$LOG{mode}		=$FORM{m};							#####モード
	$LOG{ck_s}		=$COOKIE{"S$FORM{m}$FORM{d}"};		#####
	$LOG{ck_n}		=$COOKIE{N};						#####
	$LOG{bundle}	=$GNR{bundle};						#####一括出題
	$LOG{ip}		='';								#####IP
}


#************************************************
# 設問別成績
#************************************************
sub def_qu{
	@qu=();
	$QU{play_num}	=0;				#####回答者数
	$QU{play_win}	=0;				#####正解者数
	$QU{ave}		=0;				#####平均正解時間
	$QU{ave2}		='0.00';		#####平均正解時間(小数第2位)
	$QU{win_ratio}	='0.0';			#####正解確率
}

#************************************************
# バッファを変数に読み込む
#************************************************
sub buf_read {
	if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }
	else { $buffer = $ENV{'QUERY_STRING'}; }
	if($buffer ne ''){
		@pairs = split(/&/,$buffer);
		foreach $pair (@pairs){
			local($name, $value) = split(/=/, $pair);
			$value =~ tr/+/ /;
			$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
			if(($name ne 'newq')
				&&($name ne 'qqu')
				&&($name ne 'qas')
				&&($name ne 'qmas1')
				&&($name ne 'qmas2')
				&&($name ne 'qmas3')
				&&($name ne 'qmas4')
				&&($name ne 'qac')
				&&($name ne 'qmac')
				&&($name ne 'qmac1')
				&&($name ne 'qmac2')
				&&($name ne 'qmac3')
				&&($name ne 'qmac4')
				&&($name ne 'qcf')
				&&($name ne 'auth')
				&&($name ne 'tc')
				&&($name ne 'stc')
				&&($name ne 'tmes')
				&&($name ne 'stl-2')
				&&($name ne 'iplist'))
				{$value =~ s/\n//g;}
			#####名前の登録と、コメントにはhtmlタグは許可しない。
			if($name eq 'EntryName' || $name eq 'com' ){
				$value =~ s/</&lt;/g;
				$value =~ s/>/&gt;/g;
			}
			$value =~ s/\t//g;
			$value =~ s/\r//g;
			&jcode'convert(*value,'sjis');
			$FORM{$name} = $value;
			&form_to_form2($name);
			&form_to_form3($name);
			&form_to_form4($name);
			if($FORM{j} ne ''){$imode='mb';}
			if($name =~ /^type_(.*)/){
				$FORM{type}=$1;
			}
		}
	}
	&form_tag;
	if($buffer ne ''){
		return 0;
	}else{
		return 1;
	}
	return 0;
}
#************************************************
# FORM変数の設定
#************************************************
sub form_tag{
	#####FORMのヘッダータグのセット
	if($FORM2{passch} ne ''){
		$formop_p	="<input type=hidden name=passch value='$FORM2{passch}'>\n";
	}
	$formop_h	="<form action='$quiz_op_cgi' method='$method' >\n$formop_p";
	$formop_hb	="<form action='$quiz_op_cgi' method='$method' target='_blank'>\n$formop_p";
	$formop_nh	="<form action='$quiz_op_cgi' method='$method' name=frm>\n$formop_p";
	$formop_nhb	="<form action='$quiz_op_cgi' method='$method' name=frm target='_blank'>\n$formop_p";
	$form_d		="<input type=hidden name=d value=$FORM{d}>";
	$formop_hd	="$formop_h$form_d";
	$formop_nhd	="$formop_nh$form_d";
	if($FORM{m} eq ''){
		$cid="1$FORM{d}";
	}else{
		$cid="$FORM{m}$FORM{d}";
	}
	if($buffer ne ''){
		return 0;
	}else{
		return 1;
	}
}

#************************************************
# ジャンル情報ファイルを全ジャンル管理配列に読み込む
#
# パラメータが1で終わるものはモード1用設定
# パラメータが2で終わるものはモード2用設定
#************************************************
sub all_genre_read {
	my($dir);
	#####ジャンル情報ファイルを開く
	open(DB,$genre_cgi);@genres=<DB>;close(DB);
	undef %GENRE_LST;
	@GENRE_DIR_ALL=();
	
	if(($genres[0]=~ /^ver/)||($genres[0] eq '')||($genres[0] eq "\n")){
		#####ジャンル情報は、dirキーから始まるので、
		#####dirキーが現れる毎に、ジャンル情報をメモリ上にセットする
		foreach $genre(@genres[1..$#genres]){
			$genre=~ s/\n//g;
			local($key,$val)=split(/\t/,$genre,2);
			if($key eq 'dir'){
				$dir=$val;
				#####全ジャンルディレクトリの配列に追加
				push(@GENRE_DIR_ALL,$dir);
				
				#####デフォルトジャンル情報の読み込み
				&def_genre($dir);
			}elsif($dir ne ''){
				#モード1の設定
				if($key =~ /^(.*)1$/){
					$GENRE_LST{$dir}{1}{$1}=$val;
				#モード2の設定
				}elsif($key =~ /^(.*)2$/){
					$GENRE_LST{$dir}{2}{$1}=$val;
				#その他の設定
				}else{
					$GENRE_LST{$dir}{$key}=$val;
				}
			}
		}
	}
	
	#ジャンル情報に関するグローバル配列の初期化
	foreach $dir(@GENRE_DIR_ALL){
		&set_genre_global_array($dir);
	}
}
#************************************************
# デザイン情報ファイルを全デザイン管理配列に読み込む
#************************************************
sub all_design_read {
	my($dtitle);
	local(%HASH);
	#####デザイン情報ファイルを開く
	open(DB,$design_cgi);@designs=<DB>;close(DB);
	undef %DESIGN;
	@DESIGN_ALL=();
	
	if(($designs[0]=~ /^ver/)||($designs[0] eq '')||($designs[0] eq "\n")){
		#####デザイン情報は、design_titleキーから始まるので、
		#####design_titleキーが現れる毎に、ジャンル情報をメモリ上にセットする
		foreach $line(@designs[1..$#designs]){
			$line=~ s/\n//g;
			local($key,$val)=split(/\t/,$line,2);
			if($key eq 'design_title'){
				$dtitle=$val;
				
				#####重複設定読み込み防止
				if($HASH{$dtitle} eq ""){
					$HASH{$dtitle}='1';
					
					#####全ジャンルデザイン名の配列に追加
					push(@DESIGN_ALL,$dtitle);
					#####デフォルトデザイン情報の読み込み
					&def_design($dtitle);
				}
			}elsif($dtitle ne ''){
				#携帯用設定
				if($key =~ /^(.*)_m$/){
					$DESIGN_LST{$dtitle}{mb}{$1}=$val;
				#PC用設定
				}else{
					$DESIGN_LST{$dtitle}{pc}{$key}=$val;
				}
			}
		}
	}

	#下位互換用の設定値補完
	#色に関する携帯用の設定が無い場合、PC用設定をコピー
	&design_color_copy();
}

#************************************************
# システムデザイン情報ファイルを全デザイン管理配列に読み込む
#************************************************
sub all_sysdesign_read {
	my($dtitle);
	local(%HASH);
	#####デザイン情報ファイルを開く
	open(DB,$sysdesign_cgi);@designs=<DB>;close(DB);
	undef %SYSDESIGN_LST;
	@SYSDESIGN_ALL=();
	
	if(($designs[0]=~ /^ver/)||($designs[0] eq '')||($designs[0] eq "\n")){
		#####デザイン情報は、sysdesign_titleキーから始まるので、
		#####sysdesign_titleキーが現れる毎に、ジャンル情報をメモリ上にセットする
		foreach $line(@designs[1..$#designs]){
			$line=~ s/\n//g;
			local($key,$val)=split(/\t/,$line,2);

			if($key eq 'sysdesign_title'){
				$dtitle=$val;
				#####重複設定読み込み防止
				if($HASH{$dtitle} eq ""){
					$HASH{$dtitle} = 1;
					
					#####全システムデザイン名の配列に追加
					push(@SYSDESIGN_ALL,$dtitle);
					
					#####デフォルトデザイン情報の読み込み
					&def_sysdesign($dtitle);
				}
			}elsif($dtitle ne ''){
				#携帯用設定
				if($key =~ /^(.*)_m$/){
					$SYSDESIGN_LST{$dtitle}{mb}{$1}=$val;
				#PC用設定
				}else{
					$SYSDESIGN_LST{$dtitle}{pc}{$key}=$val;
				}
			}
		}
	}
	#下位互換用の設定値補完
	#色に関する携帯用の設定が無い場合、PC用設定をコピー
	&sysdesign_color_copy();
}




#************************************************
# ジャンル設定用のグローバル配列に値をセット
#************************************************
sub set_genre_global_array{
	my($dir)=$_[0];
	#####ジャンルデザイン使用リストに追加
	$DESIGN_USE{$GENRE_LST{$dir}{design}}	.="\t$dir";

	#####オリジナル問題ファイルを持っているジャンルリストを作成する(工事中含まず)
	if(($GENRE_LST{$dir}{mente} eq 1)&&($GENRE_LST{$dir}{mondai_cgi} ne '.')&& !($GENRE_LST{$dir}{mondai_cgi} =~ /\//)){
		push(@GENRE_DIR_ORIGN,$dir);
	}
	#####オリジナル問題ファイルを持っているジャンルリストを作成する(工事中含む)
	if(($GENRE_LST{$dir}{mondai_cgi} ne '.')&& !($GENRE_LST{$dir}{mondai_cgi} =~ /\//)){
		push(@GENRE_DIR_ORIGN_ALL,$dir);
	}
	
	#####メンテ中でないジャンルリスト
	if($GENRE_LST{$dir}{mente} eq 1){
		push(@GENRE_DIR_AVAILABLE,$dir);
	}
}

#************************************************
# 特定ジャンル情報を変数に読み込む
#************************************************
sub genre_read {
	my($dir)=$_[0];
	#####ジャンル情報ファイルを全ジャンル管理配列に読み込む
	&all_genre_read;
	#####指定ジャンルが存在するかチェックする

	if(!mygrep($dir,@GENRE_DIR_ALL)){
		&error(805,'指定したジャンル');
		return 1;
	}
	
	#####特定デザインを読み込む
	&design_read($GENRE_LST{$dir}{design});
	
	#####ジャンルにモード2が無ければ強制的にモード1へ
	if($GENRE_LST{$dir}{2}{mode_name} eq ''){$FORM{m}=1;}
	elsif($FORM{m} ne '1' && $FORM{m} ne '2'){$FORM{m}=1;}
	
	#####ジャンルモード設定の読み込み
	undef(%GNR);
	%GNR				=%{$GENRE_LST{$dir}{$FORM{m}}};
	#####ジャンルモード設定以外の設定の読み込み
	foreach $key(keys %{$GENRE_LST{$dir}}){
		if($key ne '1' && $key ne '2'){
			$GNR{$key}=$GENRE_LST{$dir}{$key};
		}
	}
	return 0;
}

#************************************************
# 特定デザイン情報を変数に読み込む
#************************************************
sub design_read {
	local($dtitle)=@_;
	#####全デザイン情報を読み込む
	&all_design_read();
	#####指定したジャンルデザインが存在しない場合
	if(!mygrep($dtitle,@DESIGN_ALL)){
		&def_design($dtitle);
		push(@DESIGN_ALL,$dtitle);
		
		#下位互換用の設定値補完
		#色に関する携帯用の設定が無い場合、PC用設定をコピー
		&design_color_copy();
	}
	undef(%DSN);
	%DSN=%{$DESIGN_LST{$dtitle}{$imode}};
	$tbl_opt			="border='$DSN{border_high}' width=100% cellspacing='$DSN{border}' cellpadding='$DSN{border_in}'";		#####ジャンル別ページの表のオプション
}

#************************************************
# ジャンルデザインの色設定補完
#
# 携帯用の色設定が無い場合、PC用の設定をコピー(下位互換用)
#************************************************
sub design_color_copy{
	my($id,$key);
	foreach $id(@DESIGN_ALL){
		foreach $key(keys ( %{$DESIGN_LST{$id}{pc}})){
			if($key =~ /color$/ && $DESIGN_LST{$id}{mb}{$key} eq ''){
				$DESIGN_LST{$id}{mb}{$key} = $DESIGN_LST{$id}{pc}{$key};
			}
		}
	}
}
#************************************************
# システムデザインの色設定補完
#
# 携帯用の色設定が無い場合、PC用の設定をコピー(下位互換用)
#************************************************
sub sysdesign_color_copy{
	my($dtitle,$key);
	foreach $dtitle(@SYSDESIGN_ALL){
		foreach $key(keys ( %{$SYSDESIGN_LST{$dtitle}{pc}})){
			if($key =~ /color$/ && $SYSDESIGN_LST{$dtitle}{mb}{$key} eq ''){
				$SYSDESIGN_LST{$dtitle}{mb}{$key} = $SYSDESIGN_LST{$dtitle}{pc}{$key};
			}
		}
	}
}


#************************************************
# 設定編集パラメーターの読み込み
#************************************************
sub sys_read{
	#####デフォルトのシステム情報をメモリ上に読み込む
	&def_sys;
	
	#####システムファイルを開く。なければ新規作成。
	if(!open(DB,"$system_cgi")){&make_new_system_dat;}
	else{
		@sys=<DB>;close(DB);
		
		#####システム情報をメモリ上に読み込む
		if(($sys[0] =~ /^ver/)||($sys[0] eq '')||($sys[0] eq "\n")){
			foreach(@sys){
				$_=~ s/\n//g;
				local($key,$val)=split(/\t/,$_);
				$SYS{$key}=$val;
			}
			if($SYS{top_junle_color} ne ''){$SYS{top_genre_color}=$SYS{top_junle_color};}
		}
	}
	&def_sysdesign();
	&sysdesign_read($SYS{design});
	
	#####このあたり何とかしたい
	if($SYS{align} eq 'r'){$align1='<div align=right>';$align2='</div>';}
	elsif($SYS{align} eq 'c'){$align1='<center>';$align2='</center>';}
	else{$align1='';$align2='';}
	
	if($SYS{walign} eq 'r'){$walign1='<div align=right>';$walign2='</div>';}
	elsif($SYS{walign} eq 'c'){$walign1='<center>';$walign2='</center>';}
	else{$walign1='';$walign2='';}
	$style = $SYS{style};
	$style=~ s/<br>/\n/g;
	
	return 0;
}
#************************************************
# メニューページのデザインの読み込み
#************************************************
sub sysdesign_read{
	my($param);
	local($dtitle)=$SYS{design};
	&all_sysdesign_read();
	#####指定したシステムデザインが存在しない場合
	if(!mygrep($dtitle,@SYSDESIGN_ALL)){
		&def_sysdesign($dtitle);
		
		#下位互換用の設定値補完
		#色に関する携帯用の設定が無い場合、PC用設定をコピー
		&sysdesign_color_copy();
	}
	foreach $param(keys %{$SYSDESIGN_LST{$dtitle}{$imode}}){
		$SYS{$param}=$SYSDESIGN_LST{$dtitle}{$imode}{$param};
	}
	
	$top_tbl_opt			="border='$SYS{top_border_high}' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'";		#メニューページの表のオプション
	if($SYS{wrap} eq 0){
		$nowrap=' nowrap';
	}
}


#************************************************
# プレイログを読み込む
##
## %LOGと、@genre_dir_use,%genre_numに読み込む
#************************************************
sub play_log_read {
	local(@list,@log);
	local($quiz_id)=@_;
	#####プレイログを読み込む
	open(DB,"$data_dir/$header${quiz_id}.cgi");
	@log = <DB>;
	close(DB);
	$log[0]=~ s/\n//g;
	($LOG{num}			#####問題数
	,$LOG{win}			#####正解数
	,$LOG{lose}			#####不正回数
	,$LOG{seed}			#####シーズ
	,$LOG{old}			#####前回分回答
	,$LOG{write}		#####
	,$LOG{name}			#####
	,$LOG{'time'}		#####初回アクセス時刻
	,$LOG{lap}			#####前回回答時刻
	,$LOG{last_lap}		#####前回回答時間
	,$LOG{genre}		#####ジャンル名
	,$LOG{mode}			#####モード
	,$LOG{ck_s}			#####
	,$LOG{ck_n}			#####
	,$LOG{bundle}		#####一括出題
	,$LOG{ip}			#####IP
	) = split(/\t/,$log[0]);

	($LOG{sec}			#####
	,$LOG{min}			#####
	)=&score_time($LOG{lap}-$LOG{'time'});
	
	$cid="$LOG{mode}$LOG{genre}";
	
	@genre_dir_use=();
	foreach(@log[1..$#log]){
		local($genre,$num)=split(/\t/,$_);
		push(@genre_dir_use,$genre);			#####使用するジャンルを記憶
		$genre_num{$genre}=$num;				#####使用する問題数制限を記憶
	}
}



#************************************************
# 使用ジャンル全てのクイズを読み込み
#************************************************
sub quiz_read_all{
	my($multiquiz);
	if($GNR{mondai_cgi} =~ /\// && $GNR{show_genre} ne '0'){
		$multiquiz=1;
	}
	foreach(@genre_dir_use){
		$quiz_num_dir{$_}=$#mondai+1;							#####このジャンルからの問題開始番号を格納
		&quiz_read($_,$genre_num{$_},$multiquiz);				#####問題読み込み
		$genre_num{$_}=$#mondai + 1 - $quiz_num_dir{$_};		#####このジャンルの問題数を格納
	}
}

#************************************************
# 指定ジャンルのクイズ追加関数
##
## 引数		$dir_name	ディレクトリ名
## 			$maxnum		読み込み問題制限数
## 			$multi		総合問題ジャンルフラグ
##			$file_name	問題ファイル名(nullならデフォルトファイル名)
#************************************************
sub quiz_read{
	local($dir_name,$maxnum,$multi,$file_name)=@_;
	local(@lines,$line,$max,$i);
	#####ファイル名の決定
	if($file_name eq ''){$file_name = "$mondai_$dir_name\.cgi";}
	
	open(DB,"$dir_name/$file_name");@lines=<DB>;close(DB);
	if($maxnum ne ''){
		if($maxnum > $#lines+1){$maxnum=$#lines + 1;}
		elsif($maxnum < 0){$maxnum=$#lines + 1;}
	}else{$maxnum=$#lines + 1;}
	$i=0;
	foreach $line(@lines){
		$line=~ s/\n//g;
		if($line eq '') {next;}			#####空行ならとばす
		if($line=~ /^#/){next;}			#####「#」から始まる行はコメント行
		if($i >= $maxnum)  {last;}		#####最大読み込み行による制限
		
		$i++;
		local($mondai,$ans,$misans1,$misans2,$misans3,$misans4,$anscom,$misanscom,$cf,$digest,$misanscom1,$misanscom2,$misanscom3,$misanscom4,$anstype,$author,$misanscorrect1,$misanscorrect2,$misanscorrect3,$misanscorrect4)=split(/\t/,$line);
		
		#####問題情報をメモリ上に読み込む
		if($multi > 0){			#####総合問題ジャンルは、問題文にジャンル名を付加する
			push(@mondai,"$mondai<br><div align=right>【$GENRE_LST{$dir_name}{title}】より</div>");
		}else{push(@mondai,$mondai);}
		push(@ans,$ans);
		push(@misans1,$misans1);
		push(@misans2,$misans2);
		push(@misans3,$misans3);
		push(@misans4,$misans4);
		push(@anscom,$anscom);
		push(@misanscom,$misanscom);
		push(@cf,$cf);
		push(@digest,$digest);
		push(@misanscom1,$misanscom1);
		push(@misanscom2,$misanscom2);
		push(@misanscom3,$misanscom3);
		push(@misanscom4,$misanscom4);
		push(@anstype,$anstype);
		push(@author,$author);
		push(@misanscorrect1,($misanscorrect1 eq '1') ? 1 : 0);
		push(@misanscorrect2,($misanscorrect2 eq '1') ? 1 : 0);
		push(@misanscorrect3,($misanscorrect3 eq '1') ? 1 : 0);
		push(@misanscorrect4,($misanscorrect4 eq '1') ? 1 : 0);
	}
}


#************************************************
# 設問別成績ファイルの読み込み
#************************************************
sub quiz_log_read{
	#####設問番号の取得
	$QU{dir}   = &get_question_dir($quiz_index);
	$QU{index} = $quiz_index - $quiz_num_dir{$QU{dir}};
	
	&def_qu();
	#####ファイルの読み込み
	if (open(DB,$QU{dir}."/$quiz_header$QU{index}\.cgi")){
		local(@log)= <DB>;
		close(DB);
		
		#####選択肢別選択人数の取得
		$log[0] =~ s/\n//g;
		@qu = split(/\t/, $log[0]);

		for($i=0;$i<5;$i++){
			$qu[$i]=$qu[$i]+0;
		}
		
		#####平均正解時間と回答者数の取得
		$log[1] =~ s/\n//g;
		($QU{ave},$QU{play_num},$QU{play_win}) = split(/\t/,$log[1]);
		$QU{play_num}=$QU{play_num}+0;
		$QU{ave}=$QU{ave}+0;
		
		#####その他項目の導出
		&quiz_log_calc();
	}
}

#************************************************
# 設問別成績の計算
#************************************************
sub quiz_log_calc{
	#####平均正解時間と正解者数の取得
	if($QU{ave} eq ''){$QU{ave}='0';}

	#####正解者数の取得
	if($QU{play_win} eq ''){
		$QU{play_win} = $qu[0]+0;
	}
	
	#####正解率の取得
	if($QU{play_num} > 0){
		$QU{win_ratio}=&point($QU{play_win}*100/$QU{play_num},1);
	}
	
	#####平均正解時間(小数第2位)の取得
	$QU{ave2}=&point($QU{ave},2);
}



##genre_array_to_form
##form_to_genre_array
##genre_array_to_line
##sys_to_system_dat
##sys_to_form
##form_to_sys
##quiz_array_to_form
##push_quiz_palam
##mes_dat_to_form

#************************************************
# %SYSから%FORMへ
#************************************************
sub sys_to_form{
	$FORM{sdes}						=$SYS{design};
	$FORM{li}						=$SYS{limit};				#####プレイヤのログ保護期間(分)
	$FORM{mp}						=$SYS{max_player};			#####同時にプレイできる人数(人数×1kbの容量を必要とします)
	$FORM{cok}						=$SYS{cookie};					#####クッキーID
	$FORM{qf}						=$SYS{quiz_form};			#####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型
	$FORM{"qf-$SYS{quiz_form}"}		=' checked';
	$FORM{mt}						=$SYS{main_title};
	$FORM{hd}						=$SYS{header};
	$FORM{shd}						=$SYS{sub_header};
	if($SYS{style} eq ''){$FORM{'stl-2'}='BIG{font-size:12pt;}<br>SPAN{font-size:9pt;}<br>SMALL{font-size:8pt;}<br>BODY,TD{font-size:8pt;}';$FORM{'stl-0'}=' checked';}
	else{$FORM{'stl-2'}=$SYS{style};$FORM{'stl-1'}=' checked';}
	$FORM{tmes}						=$SYS{top_message};
	$FORM{tu}						=$SYS{top_url};
	$FORM{"tt-$SYS{top_table}"}		=' checked';
	$FORM{"ey-$SYS{easy}"}			=' checked';
	$FORM{"rt-$SYS{'time'}"}		=' checked';
	$FORM{wr}						=$wrap{$id};
	$FORM{"wr-$SYS{wrap}"}			=' checked';
	$FORM{lag}						=$SYS{lag};
	$FORM{tblw}						=$SYS{tblw};
	$FORM{"nc-$SYS{nocache}"}		=' checked';
}
#************************************************
# メモリ上のgenre配列を、%FORMにセットする
#************************************************
sub genre_array_to_form{
	$dir=$FORM{d};
	$FORM{gdes}						=$GENRE_LST{$dir}{design};
	$FORM{t}						=$GENRE_LST{$dir}{title};
	$FORM{tc}						=$GENRE_LST{$dir}{top_comment};
	$FORM{stc}						=$GENRE_LST{$dir}{start_comment};
	if($GENRE_LST{$dir}{mondai_cgi} eq '.'){
		$FORM{md}=1;
		$FORM{'md-1'}=' checked';
		foreach(@GENRE_DIR_ALL){
			if(($dir eq $_)||($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;}
			$FORM2{"smd-$_"}='all';
		}
	}elsif($GENRE_LST{$dir}{mondai_cgi} =~ /\//){
		$FORM{'md-1'}=' checked';
		@mondai_dat=split(/\t/,$GENRE_LST{$dir}{mondai_cgi});
		foreach(@mondai_dat){
			local($d,$val)=split(/\//,$_);
			$FORM2{"smd-$d"}=$val;
		}
	}else{
		$FORM{'md-0'}=' checked';
		foreach(@GENRE_DIR_ALL){
			if(($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;}
			&refresh_quiz;
			&quiz_read($_);
			$FORM2{"smd-$_"}=$#mondai+1;
		}
	}
	$FORM{me}							=$GENRE_LST{$dir}{mente};
	$FORM{ct}							=$GENRE_LST{$dir}{cont};
	$FORM{nt}							=$GENRE_LST{$dir}{notext};
	$FORM{dc}							=$GENRE_LST{$dir}{direct_cont};
	$FORM{sd}							=$GENRE_LST{$dir}{show_digest};
	$FORM{ath}							=$GENRE_LST{$dir}{show_auth};
	$FORM{sgr}							=$GENRE_LST{$dir}{show_genre};
	$FORM{rcf}							=$GENRE_LST{$dir}{result_cf};
	$FORM{rdg}							=$GENRE_LST{$dir}{result_digest};
	$FORM{phn}							=$GENRE_LST{$dir}{portable_high_num};
	$FORM{ccd}							=$GENRE_LST{$dir}{challenge_code};

	foreach $mod(1,2){
		$FORM{"mn$mod"}						=$GENRE_LST{$dir}{$mod}{mode_name};
		$FORM{"sa$mod"}						=$GENRE_LST{$dir}{$mod}{show_ans};
		$FORM{"sr$mod"}						=$GENRE_LST{$dir}{$mod}{show_result};
		$FORM{"r$mod"}						=$GENRE_LST{$dir}{$mod}{random};
		if($GENRE_LST{$dir}{$mod}{quiz_max} eq ''){
			$FORM{"qm$mod-1"}=' checked';
		}else{
			$FORM{"qm$mod-0"}=' checked';
			$FORM{"qm$mod-2"}=$GENRE_LST{$dir}{$mod}{quiz_max};
		}
		
		if($GENRE_LST{$dir}{$mod}{play_max} eq ''){
			$FORM{"pm$mod-1"}=' checked';
		}else{
			$FORM{"pm$mod-0"}=' checked';
			$FORM{"pm$mod-2"}=$GENRE_LST{$dir}{$mod}{play_max};
		}
		if($GENRE_LST{$dir}{$mod}{lose_max} eq ''){
			$FORM{"lm$mod-1"}=' checked';
		}else{
			$FORM{"lm$mod-0"}=' checked';
			$FORM{"lm$mod-2"}=$GENRE_LST{$dir}{$mod}{lose_max};
		}
		if($GENRE_LST{$dir}{$mod}{time_limit} eq ''){
			$FORM{"tl$mod-1"}=' checked';
			$FORM{"tl$mod-2"}=60;
		}else{
			$FORM{"tl$mod-0"}=' checked';
			$FORM{"tl$mod-2"}=$GENRE_LST{$dir}{$mod}{time_limit};
		}

		$FORM{"hb$mod"}						=$GENRE_LST{$dir}{$mod}{high_border};
		if($GENRE_LST{$dir}{$mod}{high_back_day} > 0){
			$FORM{"hbu$mod-1"}=' checked';
			$FORM{"hbu$mod-2"}=$GENRE_LST{$dir}{$mod}{high_back_day};
		}else{
			$FORM{"hbu$mod-0"}=' checked';
			$FORM{"hbu$mod-2"}=30;
		}
		$FORM{"hbw$mod"}					=$GENRE_LST{$dir}{$mod}{high_back_w};
		if($GENRE_LST{$dir}{$mod}{scorehst_back_day} > 0){
			$FORM{"sbu$mod-1"}=' checked';
			$FORM{"sbu$mod-2"}=$GENRE_LST{$dir}{$mod}{scorehst_back_day};
		}else{
			$FORM{"sbu$mod-0"}=' checked';
			$FORM{"sbu$mod-2"}=30;
		}
		$FORM{"sbw$mod"}						=$GENRE_LST{$dir}{$mod}{scorehst_back_w};
		$FORM{"gb$mod"}						=$GENRE_LST{$dir}{$mod}{graph_border};
		$FORM{"hd$mod"}						=$GENRE_LST{$dir}{$mod}{histry_div};

		if($GENRE_LST{$dir}{$mod}{day_limit} eq ''){
			$FORM{"dl$mod-1"}=' checked';
			$FORM{"dl$mod-2"}=30;
		}else{
			$FORM{"dl$mod-0"}=' checked';
			$FORM{"dl$mod-2"}=$GENRE_LST{$dir}{$mod}{day_limit};
		}
		if($GENRE_LST{$dir}{$mod}{num_limit} eq ''){
			$FORM{"nl$mod-1"}=' checked';
			$FORM{"nl$mod-2"}=100;
		}else{
			$FORM{"nl$mod-0"}=' checked';
			$FORM{"nl$mod-2"}=$GENRE_LST{$dir}{$mod}{num_limit};
		}
		$FORM{"no$mod"}						=$GENRE_LST{$dir}{$mod}{no_limit};
		$FORM{"rc$mod"}						=$GENRE_LST{$dir}{$mod}{rec_com};
		$FORM{"dh$mod"}						=$GENRE_LST{$dir}{$mod}{double_high};
		$FORM{"bd$mod"}						=$GENRE_LST{$dir}{$mod}{bundle};
	}
	&form_to_form;
}
#************************************************
# %SYSDESIGN_LSTから%FORMへ
#************************************************
sub sysdesign_to_form{
	local($id)=@_;
	my(%mob);
	$mob{mb}='_m';

	foreach $pc('pc','mb'){
		$FORM{"tw".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_wall};
		$FORM{"tbc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_back_color};
		$FORM{"ttc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_table_color};
		$FORM{"tjc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_genre_color};
		$FORM{"tic".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_info_color};
		$FORM{"tcc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_com_color};
		$FORM{"thc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_high_color};
		$FORM{"tbdc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_border_color};
		$FORM{"txc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_text_color};
		$FORM{"lc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_link_color};
		$FORM{"vc".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_vlink_color};
		$FORM{"tbdh".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_border_high};
		$FORM{"tbd".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_border};
		$FORM{"tbdi".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{top_border_in};
		$FORM{"ag".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{a_gif};
		$FORM{"bg".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{b_gif};
		$FORM{"al".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{align};
		$FORM{"al-".$SYSDESIGN_LST{$id}{$pc}{align}.$mob{$pc}}			=' checked';
		$FORM{"wal".$mob{$pc}}						=$SYSDESIGN_LST{$id}{$pc}{walign};
		$FORM{"wal-".$SYSDESIGN_LST{$id}{$pc}{walign}.$mob{$pc}}		=' checked';
	}
}
#************************************************
# %DESIGNから%FORMへ
#************************************************
sub design_to_form{
	local($id)=@_;
	my(%mob);
	$mob{mb}='_m';
	foreach $pc('pc','mb'){
		$FORM{"gtc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{text_color};
		$FORM{"glc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{link_color};
		$FORM{"gvc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{vlink_color};
		$FORM{"gcc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{champ_color};
		$FORM{"gmc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{main_color};
		$FORM{"gwi".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{win_color};
		$FORM{"glo".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{lose_color};
		$FORM{"gcm".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{com_color};
		$FORM{"thc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{th_color};
		$FORM{"tdc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{td_color};
		$FORM{"bdc".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{border_color};
		$FORM{"bdh".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{border_high};
		$FORM{"bd".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{border};
		$FORM{"bdi".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{border_in};
		$FORM{"gw".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{wall};
		$FORM{"gww".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{win_wall};
		$FORM{"glw".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{lose_wall};
		$FORM{"wsg".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{win_sign};
		$FORM{"lsg".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{lose_sign};
		$FORM{"osg".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{over_sign};
		$FORM{"wmd".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{win_midi};
		$FORM{"lmd".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{lose_midi};
		$FORM{"emd".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{end_midi};
		$FORM{"hmd".$mob{$pc}}					=$DESIGN_LST{$id}{$pc}{high_midi};
	}
}
#************************************************
# メモリ上の問題情報を、問題入力form用変数にセットする
#************************************************
sub quiz_array_to_form{
	local($quiz_num)=$FORM{qn}-1;
	$FORM{qqu}   =$mondai[$quiz_num];
	$FORM{qas}   =$ans[$quiz_num];
	$FORM{qmas1} =$misans1[$quiz_num];
	$FORM{qmas2} =$misans2[$quiz_num];
	$FORM{qmas3} =$misans3[$quiz_num];
	$FORM{qmas4} =$misans4[$quiz_num];
	$FORM{qac}   =$anscom[$quiz_num];
	$FORM{qmac}  =$misanscom[$quiz_num];
	$FORM{qcf}   =$cf[$quiz_num];
	$FORM{qdg}   =$digest[$quiz_num];
	$FORM{qmac1} =$misanscom1[$quiz_num];
	$FORM{qmac2} =$misanscom2[$quiz_num];
	$FORM{qmac3} =$misanscom3[$quiz_num];
	$FORM{qmac4} =$misanscom4[$quiz_num];
	$FORM{atype} =$anstype[$quiz_num];
	$FORM{auth} =$author[$quiz_num];
	$FORM{qmasc1} =$misanscorrect1[$quiz_num];
	$FORM{qmasc2} =$misanscorrect2[$quiz_num];
	$FORM{qmasc3} =$misanscorrect3[$quiz_num];
	$FORM{qmasc4} =$misanscorrect4[$quiz_num];
}

#************************************************
# %FORMから%SYSへ
#************************************************
sub form_to_sys{
	$SYS{design}			=$FORM{sdes};	#####システムデザインID
	$SYS{limit}				=$FORM{li};		#####プレイヤのログ保護期間(分)
	$SYS{max_player}		=$FORM{mp};		#####同時にプレイできる人数(人数×1kbの容量を必要とします)
	$SYS{cookie}			=$FORM{cok};	#####クッキーID
	$SYS{quiz_form}			=$FORM{qf};		#####選択肢の形式 0=リンク型 1=ラジオボタン型 その他=ボタン型
	$SYS{main_title}		=$FORM{mt};		#####メニューページのタイトル
	$SYS{header}			=$FORM{hd};		#####メニューページのヘッダー
	$SYS{sub_header}		=$FORM{shd};	#####サブページのヘッダー
	if($FORM{stl} eq '1'){$SYS{style}=$FORM4{'stl-2'};}
	else{$SYS{style}='';}					#####スタイルシート
	$SYS{top_message}		=$FORM4{tmes};	#####メニューページのコメント
	$SYS{top_table}			=$FORM{tt};		#####メニューページのコメントのtable表記
	$SYS{top_url}			=$FORM{tu};		#####トップページへのURL
	$SYS{easy}				=$FORM{ey};		#####メニューページの表示項目
	$SYS{'time'}				=$FORM{rt};	#####メニューページの表示項目
	$SYS{wrap}				=$FORM{wr};		#####自動改行
	$SYS{lag}				=$FORM{lag};	#####サーバー時刻とのタイムラグ
	$SYS{tblw}				=$FORM{tblw};	#####表の幅
	$SYS{nocache}			=$FORM{nc};		#####no-cache設定
}

#************************************************
# %FORMの内容を、メモリ上のgenre配列にセットする
#************************************************
sub form_to_genre_array{
	$dir=$FORM{d};
	$GENRE_LST{$dir}{design}			=$FORM{gdes};
	$GENRE_LST{$dir}{title}				=$FORM{t};
	$GENRE_LST{$dir}{top_comment}		=$FORM4{tc};
	$GENRE_LST{$dir}{start_comment}		=$FORM4{stc};
	$GENRE_LST{$dir}{mondai_cgi}		='';
	if($FORM{md}){
		foreach(@GENRE_DIR_ALL){
			if(($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)||($FORM{"smd-$_"} eq '')){next;}
			$GENRE_LST{$dir}{mondai_cgi}.="$_\/".$FORM{"smd-$_"}."\t";
		}
	}
	$GENRE_LST{$dir}{mente}				=$FORM{me};
	$GENRE_LST{$dir}{cont}				=$FORM{ct};
	$GENRE_LST{$dir}{notext}			=$FORM{nt};
	$GENRE_LST{$dir}{direct_cont}		=$FORM{dc};
	$GENRE_LST{$dir}{show_digest}		=$FORM{sd};
	$GENRE_LST{$dir}{show_auth}			=$FORM{ath};
	$GENRE_LST{$dir}{show_genre}		=$FORM{sgr};
	$GENRE_LST{$dir}{result_cf}			=$FORM{rcf};
	$GENRE_LST{$dir}{result_digest}		=$FORM{rdg};
	$GENRE_LST{$dir}{portable_high_num}	=$FORM{phn};
	$GENRE_LST{$dir}{challenge_code}	=$FORM{ccd};


	foreach $mod(1,2){
		$GENRE_LST{$dir}{$mod}{mode_name}		=$FORM{"mn$mod"};
		$GENRE_LST{$dir}{$mod}{show_ans}		=$FORM{"sa$mod"};
		$GENRE_LST{$dir}{$mod}{show_result}		=$FORM{"sr$mod"};
		$GENRE_LST{$dir}{$mod}{random}			=$FORM{"r$mod"};

		if($FORM{"hbu$mod"}){
			$GENRE_LST{$dir}{$mod}{high_back_day}=$FORM{"hbu$mod-2"};
		}else{
			$GENRE_LST{$dir}{$mod}{high_back_day}='0';
		}
		$GENRE_LST{$dir}{$mod}{high_back_w}		=$FORM{"hbw$mod"};

		if($FORM{"dl$mod"}){
			$GENRE_LST{$dir}{$mod}{day_limit}='';
		}else{
			$GENRE_LST{$dir}{$mod}{day_limit}=$FORM{"dl$mod-2"};
		}
		if($FORM{"nl$mod"}){
			$GENRE_LST{$dir}{$mod}{num_limit}='';
		}else{
			$GENRE_LST{$dir}{$mod}{num_limit}=$FORM{"nl$mod-2"};
		}
		$GENRE_LST{$dir}{$mod}{no_limit}=$FORM{"no$mod"};
		$GENRE_LST{$dir}{$mod}{rec_com}=$FORM{"rc$mod"};
		$GENRE_LST{$dir}{$mod}{double_high}		=$FORM{"dh$mod"};
		$GENRE_LST{$dir}{$mod}{bundle}			=$FORM{"bd$mod"};
		
		if($FORM{"sbu$mod"}){
			$GENRE_LST{$dir}{$mod}{scorehst_back_day}=$FORM{"sbu$mod-2"};
		}else{
			$GENRE_LST{$dir}{$mod}{scorehst_back_day}='0';
		}
		$GENRE_LST{$dir}{$mod}{scorehst_back_w}		=$FORM{"sbw$mod"};
		
		$GENRE_LST{$dir}{$mod}{graph_border}	=$FORM{"gb$mod"};
		$GENRE_LST{$dir}{$mod}{histry_div}		=$FORM{"hd$mod"};
		if($FORM{"qm$mod"}){
			$GENRE_LST{$dir}{$mod}{quiz_max}='';
		}else{
			$GENRE_LST{$dir}{$mod}{quiz_max}=$FORM{"qm$mod-2"};
		}
		if($FORM{"pm$mod"}){
			$GENRE_LST{$dir}{$mod}{play_max}='';
		}else{
			$GENRE_LST{$dir}{$mod}{play_max}=$FORM{"pm$mod-2"};
		}
		if($FORM{"lm$mod"}){
			$GENRE_LST{$dir}{$mod}{lose_max}='';
		}else{
			$GENRE_LST{$dir}{$mod}{lose_max}=$FORM{"lm$mod-2"};
		}
		if($FORM{"tl$mod"}){
			$GENRE_LST{$dir}{$mod}{time_limit}='';
		}else{
			$GENRE_LST{$dir}{$mod}{time_limit}=$FORM{"tl$mod-2"};
		}
		$GENRE_LST{$dir}{$mod}{high_border}		=$FORM{"hb$mod"};
	}

}
#************************************************
# %FORMからメモリ上のsysdesign配列にセットする
#************************************************
sub form_to_sysdesign_array{
	$id=$FORM{sdt};
	my(%mob);
	$mob{mb}='_m';
	foreach $pc('pc','mb'){
		$SYSDESIGN_LST{$id}{$pc}{sysdesign_title}	=$FORM{"sdt".$mob{$pc}};	#####システムデザイン
		$SYSDESIGN_LST{$id}{$pc}{top_wall}			=$FORM{"tw".$mob{$pc}};		#####メニューページの壁紙
		$SYSDESIGN_LST{$id}{$pc}{top_back_color}	=$FORM{"tbc".$mob{$pc}};	#####メニューページの背景色
		$SYSDESIGN_LST{$id}{$pc}{top_table_color}	=$FORM{"ttc".$mob{$pc}};	#####メニューページの表の色
		$SYSDESIGN_LST{$id}{$pc}{top_genre_color}	=$FORM{"tjc".$mob{$pc}};	#####メニューページのジャンル名色
		$SYSDESIGN_LST{$id}{$pc}{top_info_color}	=$FORM{"tic".$mob{$pc}};	#####メニューページの情報色
		$SYSDESIGN_LST{$id}{$pc}{top_com_color}		=$FORM{"tcc".$mob{$pc}};	#####メニューページのコメント色
		$SYSDESIGN_LST{$id}{$pc}{top_high_color}	=$FORM{"thc".$mob{$pc}};	#####メニューページの高成績者色
		$SYSDESIGN_LST{$id}{$pc}{top_border_color}	=$FORM{"tbdc".$mob{$pc}};	#####メニューページの枠の色
		$SYSDESIGN_LST{$id}{$pc}{top_text_color}	=$FORM{"txc".$mob{$pc}};	#####文字色
		$SYSDESIGN_LST{$id}{$pc}{top_link_color}	=$FORM{"lc".$mob{$pc}};		#####リンク色
		$SYSDESIGN_LST{$id}{$pc}{top_vlink_color}	=$FORM{"vc".$mob{$pc}};		#####既訪問リンク色
		$SYSDESIGN_LST{$id}{$pc}{top_border_high}	=$FORM{"tbdh".$mob{$pc}};	#####メニューページの枠の高さ
		$SYSDESIGN_LST{$id}{$pc}{top_border}		=$FORM{"tbd".$mob{$pc}};	#####メニューページの枠の幅
		$SYSDESIGN_LST{$id}{$pc}{top_border_in}		=$FORM{"tbdi".$mob{$pc}};	#####メニューページの枠の内幅
		$SYSDESIGN_LST{$id}{$pc}{a_gif}				=$FORM{"ag".$mob{$pc}};		#####成績履歴画像1
		$SYSDESIGN_LST{$id}{$pc}{b_gif}				=$FORM{"bg".$mob{$pc}};		#####成績履歴画像2
		$SYSDESIGN_LST{$id}{$pc}{align}				=$FORM{"al".$mob{$pc}};		#####表レイアウト
		$SYSDESIGN_LST{$id}{$pc}{walign}			=$FORM{"wal".$mob{$pc}};	#####表内文字レイアウト
	}
}

#************************************************
# %FORMからメモリ上のdesign配列にセットする
#************************************************
sub form_to_design_array{
	$id=$FORM{gdt};
	my(%mob);
	$mob{mb}='_m';
	foreach $pc('pc','mb'){
		$DESIGN_LST{$id}{$pc}{design_title}		=$FORM{"gdt".$mob{$pc}};	#####デザイン名
		$DESIGN_LST{$id}{$pc}{text_color}		=$FORM{"gtc".$mob{$pc}};	#####文字色
		$DESIGN_LST{$id}{$pc}{link_color}		=$FORM{"glc".$mob{$pc}};	#####リンク文字色
		$DESIGN_LST{$id}{$pc}{vlink_color}		=$FORM{"gvc".$mob{$pc}};	#####既訪問リンク文字色
		$DESIGN_LST{$id}{$pc}{champ_color}		=$FORM{"gcc".$mob{$pc}};	#####殿堂入り者色
		$DESIGN_LST{$id}{$pc}{main_color}		=$FORM{"gmc".$mob{$pc}};	#####基本背景色
		$DESIGN_LST{$id}{$pc}{win_color}		=$FORM{"gwi".$mob{$pc}};	#####正解時背景色
		$DESIGN_LST{$id}{$pc}{lose_color}		=$FORM{"glo".$mob{$pc}};	#####不正解時背景色
		$DESIGN_LST{$id}{$pc}{com_color}		=$FORM{"gcm".$mob{$pc}};	#####情報ウインドウの色
		$DESIGN_LST{$id}{$pc}{th_color}			=$FORM{"thc".$mob{$pc}};	#####表のヘッダー色
		$DESIGN_LST{$id}{$pc}{td_color}			=$FORM{"tdc".$mob{$pc}};	#####表の色
		$DESIGN_LST{$id}{$pc}{border_color}		=$FORM{"bdc".$mob{$pc}};	#####表の枠の色
		$DESIGN_LST{$id}{$pc}{border_high}		=$FORM{"bdh".$mob{$pc}};	#####表の枠の高さ
		$DESIGN_LST{$id}{$pc}{border}			=$FORM{"bd".$mob{$pc}};		#####表の枠の幅
		$DESIGN_LST{$id}{$pc}{border_in}		=$FORM{"bdi".$mob{$pc}};	#####表の枠の内幅
		$DESIGN_LST{$id}{$pc}{wall}				=$FORM{"gw".$mob{$pc}}; 	#####基本壁紙
		$DESIGN_LST{$id}{$pc}{win_wall}			=$FORM{"gww".$mob{$pc}};	#####正解時壁紙
		$DESIGN_LST{$id}{$pc}{lose_wall}		=$FORM{"glw".$mob{$pc}};	#####不正解時壁紙
		$DESIGN_LST{$id}{$pc}{win_sign}			=$FORM{"wsg".$mob{$pc}};	#####正解表示
		$DESIGN_LST{$id}{$pc}{lose_sign}		=$FORM{"lsg".$mob{$pc}};	#####不正解表示
		$DESIGN_LST{$id}{$pc}{over_sign}		=$FORM{"osg".$mob{$pc}};	#####タイムオーバー表示
		$DESIGN_LST{$id}{$pc}{win_midi}			=$FORM{"wmd".$mob{$pc}};	#####正解時MIDI
		$DESIGN_LST{$id}{$pc}{lose_midi}		=$FORM{"lmd".$mob{$pc}};	#####不正解時MIDI
		$DESIGN_LST{$id}{$pc}{end_midi}			=$FORM{"emd".$mob{$pc}};	#####クイズ終了時MIDI
		$DESIGN_LST{$id}{$pc}{high_midi}		=$FORM{"hmd".$mob{$pc}};	#####高成績者用MIDI
	}
}

#************************************************
# dirから、genre.cgi用のログを返す
#************************************************
sub genre_array_to_line{
	local($dir)=@_;
	local($id,$ret,$mod);
	foreach $id('dir'
				,'design'
				,'title'
				,'top_comment'
				,'start_comment'
				,'mondai_cgi'
				,'mente'
				,'cont'
				,'notext'
				,'direct_cont'
				,'show_digest'
				,'show_auth'
				,'show_genre'
				,'result_cf'
				,'result_digest'
				,'portable_high_num'
				,'challenge_code'
				){
		$ret.="$id\t".$GENRE_LST{$dir}{$id}."\n";
	}
	foreach $mod (1,2){
		foreach $id('mode_name'
					,'show_ans'
					,'random'
					,'quiz_max'
					,'play_max'
					,'lose_max'
					,'time_limit'
					,'high_border'
					,'high_back_day'
					,'high_back_w'
					,'scorehst_back_day'
					,'scorehst_back_w'
					,'graph_border'
					,'histry_div'
					,'day_limit'
					,'num_limit'
					,'no_limit'
					,'rec_com'
					,'double_high'
					,'bundle'
					,'show_result'
					){
			$ret.="$id$mod\t".$GENRE_LST{$dir}{$mod}{$id}."\n";
		}
	}
	
	return $ret;

}
#************************************************
# idから、sysdesign.cgi用のログを返す
#************************************************
sub sysdesign_array_to_line{
	local($dtitle)=@_;
	local($id,$ret,$pc,%mob);
	$mob{mb}='_m';
	foreach $id('sysdesign_title'
				,'top_border_high'
				,'top_border'
				,'top_border_in'
				,'top_table_color'
				,'top_genre_color'
				,'top_info_color'
				,'top_com_color'
				,'top_high_color'
				,'top_border_color'
				,'a_gif'
				,'b_gif'
				,'align'
				,'walign'
				){
		$ret.="$id\t".$SYSDESIGN_LST{$dtitle}{pc}{$id}."\n";
	}
	
	foreach $pc ('pc','mb'){
		foreach $id('top_wall'
				,'top_back_color'
				,'top_text_color'
				,'top_link_color'
				,'top_vlink_color'
				){
			$ret.="$id$mob{$pc}\t".$SYSDESIGN_LST{$dtitle}{$pc}{$id}."\n";
		}
	}

	return $ret;
}
#************************************************
# idから、design.cgi用のログを返す
#************************************************
sub design_array_to_line{
	local($dtitle)=@_;
	local($id,$ret,$pc,%mob);
	$mob{mb}='_m';
	foreach $id('design_title'
				,'com_color'
				,'th_color'
				,'td_color'
				,'border_color'
				,'border_high'
				,'border'
				,'border_in'
				,'win_midi'
				,'lose_midi'
				,'end_midi'
				,'high_midi'
				){
		$ret.="$id\t".$DESIGN_LST{$dtitle}{pc}{$id}."\n";
	}
	
	foreach $pc ('pc','mb'){
		foreach $id('text_color'
				,'link_color'
				,'vlink_color'
				,'champ_color'
				,'main_color'
				,'win_color'
				,'lose_color'
				,'wall'
				,'win_wall'
				,'lose_wall'
				,'win_sign'
				,'lose_sign'
				,'over_sign'
				){
			$ret.="$id$mob{$pc}\t".$DESIGN_LST{$dtitle}{$pc}{$id}."\n";
		}
	}

	return $ret;

}
#************************************************
# %SYSからsystem.dat形式の出力
#************************************************
sub sys_to_system_dat{
	local($return);$return="ver2\n";
	foreach(
		'design'
		,'limit'
		,'max_player'
		,'cookie'
		,'quiz_form'
		,'main_title'
		,'header'
		,'sub_header'
		,'style'
		,'top_message'
		,'top_table'
		,'top_url'
		,'easy'
		,'time'
		,'wrap'
		,'lag'
		,'tblw'
		,'nocache'
		){
		$return.="$_\t$SYS{$_}\n";
	}
	return $return;
}









#************************************************
# 引数を、メモリ上の問題配列変数に格納
#************************************************
sub push_quiz_palam{
	local($mondai,$ans,$misans1,$misans2,$misans3,$misans4,$anscom,$misanscom,$cf,$digest,$misanscom1,$misanscom2,$misanscom3,$misanscom4,$anstype,$author,$misanscorrect1,$misanscorrect2,$misanscorrect3,$misanscorrect4)=@_;
	if($anstype ne 2){
		$misanscorrect1='';
		$misanscorrect2='';
		$misanscorrect3='';
		$misanscorrect4='';
	}else{
		$misanscom1='';
		$misanscom2='';
		$misanscom3='';
		$misanscom4='';
	}

	push(@mondai,$mondai);
	push(@ans,$ans);
	push(@misans1,$misans1);
	push(@misans2,$misans2);
	push(@misans3,$misans3);
	push(@misans4,$misans4);
	push(@anscom,$anscom);
	push(@misanscom,$misanscom);
	push(@cf,$cf);
	push(@digest,$digest);
	push(@misanscom1,$misanscom1);
	push(@misanscom2,$misanscom2);
	push(@misanscom3,$misanscom3);
	push(@misanscom4,$misanscom4);
	push(@anstype,$anstype);
	push(@author,$author);
	push(@misanscorrect1,($misanscorrect1 eq '1') ? 1 : 0);
	push(@misanscorrect2,($misanscorrect2 eq '1') ? 1 : 0);
	push(@misanscorrect3,($misanscorrect3 eq '1') ? 1 : 0);
	push(@misanscorrect4,($misanscorrect4 eq '1') ? 1 : 0);
}

#************************************************
# 問題配列から、問題ファイル用ログを返す
#************************************************
sub quiz_to_line{
	local($ret);
	local($id,$num)=@_;
	if($num ne ''){
		$ret=('#' x 5) ."$num".('#' x 5)."\n";
	}
	if($anstype[$id] ne 2){
		$misanscorrect1[$id]=0;
		$misanscorrect2[$id]=0;
		$misanscorrect3[$id]=0;
		$misanscorrect4[$id]=0;
	}else{
		$misanscom1[$id]='';
		$misanscom2[$id]='';
		$misanscom3[$id]='';
		$misanscom4[$id]='';
	}
	$ret.=join("\t",$mondai[$id],$ans[$id],$misans1[$id],$misans2[$id],$misans3[$id],$misans4[$id],$anscom[$id],$misanscom[$id],$cf[$id],$digest[$id],$misanscom1[$id],$misanscom2[$id],$misanscom3[$id],$misanscom4[$id],$anstype[$id],$author[$id],$misanscorrect1[$id],$misanscorrect2[$id],$misanscorrect3[$id],$misanscorrect4[$id],"\n");
	return $ret;
}

#************************************************
# 終了時メッセージパラメータ読み込み
#************************************************
sub mes_dat_to_form{
	unless(-f "$FORM{d}/$GENRE_LST{$FORM{d}}{mes_cgi}\.cgi"){&make_mes_cgi;}
	open(DB,"$FORM{d}/$GENRE_LST{$FORM{d}}{mes_cgi}\.cgi");@lines= <DB>;close(DB);
	$FORM{mn}=-1;
	$i=0;
	foreach $line(@lines){
		$line=~ s/\n//g;
		if($line eq ''){next;}
		
		local($per,$mes,$mod1,$mod2)=split(/\t/,$line);
		if($mod1 ne '0'){$mod1 = ' checked';}else{$mod1='';}
		if($mod2 ne '0'){$mod2 = ' checked';}else{$mod2='';}
		if($per eq 'top'){$FORM{'mes-top1'}=$mes;$FORM{'mes-top2'}=$mes;}		#####下位互換用
		elsif($per eq 'top1'){$FORM{'mes-top1'}=$mes;}
		elsif($per eq 'top2'){$FORM{'mes-top2'}=$mes;}
		else{
			$FORM{mn}++;
			$FORM{"per-$i"}=$per;
			$FORM{"mes-$i"}=$mes;
			$FORMCH{"ch1-$i"}=$mod1;
			$FORMCH{"ch2-$i"}=$mod2;
			$i++;
		}
	}
}





#************************************************
# 構成ファイルのチェック
##
## 必要とするcgiファイルの存在とバージョンを確認する
## 必要とするディレクトリの存在を確認する。
#************************************************
sub ch_files{
	local($i,$mes,@cgis,@dirs,$err_files,$err_cgis,$err_dirs);
	@cgis=($quiz_op_cgi,$quiz_cgi,$index_cgi,$function_cgi);
	@dirs=($data_dir);

	#####cgiファイルの存在チェック
	foreach $cgi(@cgis){
		&ch_file_exist($cgi,$cgi);
	}
	
	#####cgiファイルのバージョンチェック
	&ch_file_ver(@cgis);
	
	#####ディレクトリの存在チェック
	foreach $dir(@dirs){
		&ch_dir_exist("$dirディレクトリ",$dir);
	}
}

#************************************************
# ファイルのバージョンチェック
##
## 各cgiファイルのバージョンをチェックする。
## バージョンナンバーは各ファイルの2行目。
#************************************************
sub ch_file_ver{
	local(@cgis)=@_;
	local($mes,$ver_max,%cgis_ver);
	$ver_max=0;
	
	#####各cgiファイルのバージョンをチェックする
	foreach $cgi(@cgis){
		unless(-f $cgi){next;}
		open(DB,$cgi);@list=<DB>;close(DB);
		if($list[1]=~ /\$version=\'(.*)\'/){
			$cgis_ver{$cgi}=$1;					#####バージョン番号の取得
			if($ver_max < $1){$ver_max=$1;}		#####最新バージョン番号の取得
		}
	}
	
	#####最新でないファイルリストの作成
	foreach(keys %cgis_ver){
		if($ver_max > $cgis_ver{$_}){$mes.="【$_】<br>";}
	}
	
	#####メッセージ作成
	if($mes ne ''){
		&mes(901,$mes.'上記のスクリプトは、最新バージョンではありません。<br>動作に支障をきたす可能性があります。');
	}
}

#************************************************
# ディレクトリの名前チェックと存在確認。無ければ作成
##
## 引数		$dir_nick	ディレクトリニックネーム
##			$dir_name	ディレクトリ名
##
## 戻り値	0:正常
##			1:名前不正エラー
##			2:作成不可エラー
#************************************************
sub ch_dir_exist{
	local($dir_nick,$dir_name)=@_;
	#####ディレクトリ名チェック
	if($dir_name eq ''){&error(202,$dir_nick);return 1;}
	if($dir_name=~ /\W/){&error(106,$dir_nick);return 1;}
	
	#####存在チェック
	if(!(-d $dir_name)){
		mkdir($dir_name,$mod_dir);					#####ディレクトリ作成
		chmod(oct($mod_dir),$dir_name);				#####パーミッション変更
		if(!(-d $dir_name)){						#####再度存在チェック
			&error(732,"$dir_nameディレクトリ");
			return 2;
		}
		else{&mes(451,"$dir_nameディレクトリ");}
	}
	return 0;
}

#************************************************
# ファイルの名前チェックと存在確認。
##
## 引数		$file_nick	ファイルニックネーム
##			$file_name	ファイル名
##
## 戻り値	0:存在する
##			1:存在しない
#************************************************
sub ch_file_exist{
	local($file_nick,$file_name)=@_;
	if($file_name eq ''){return 0;}
	if($file_name =~ /^http:\/\//){return 0;}
	if(!(-f $file_name)){
		&error(813,"【$file_nick】");
		return 1;
	}
	return 0;
}

#************************************************
# ファイルスタンプチェック
##
## 引数		$file_name	ファイル名
##			$file_nick	ファイルニックネーム
##			$file_stump	ファイルスタンプ
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_file_stump{
	local($file_age);
	local($file_name,$file_nick,$file_stump)=@_;
	
	#####ファイルの作成日時(秒単位)を取得
	$file_age = $now - (-M "$file_name")*60*60*24;
	
	#####ファイルスタンプチェック(誤差±10秒)
	if(($file_stump > $file_age+10)||($file_stump < $file_age-10)){
		&error(861,$file_nick);
		return 1;
	}
	return 0;
}

#************************************************
# パスワードチェック処理
#************************************************
sub ch_pwd_html {
	local(@line);
	open(DB,$pass_cgi);@line=<DB>;close(DB);
	$line[0]=~ s/\n//g;
	#####パスワードが登録されていない場合
	if($line[0] eq ''){
		#####パスワード登録中の場合
		if($FORM{passnew} ne ''){
			#####パスワードが入力されていない場合
			if($FORM{passnew1} eq ''){
				&header_html("パスワードエラー");
				&error(209,'新規パスワード');
				&pass_new_html;											#####パスワード新規登録ページ
			#####確認用パスワードと一致しない場合
			}elsif($FORM{passnew1} ne $FORM{passnew2}){
				&header_html("パスワードエラー");
				&error(541,'新規パスワードと確認用パスワード');
				&pass_new_html;											#####パスワード新規登録ページ
			#####パスワードファイルに書き込む
			}else{
				$pass=&crypt_pwd($FORM2{passnew1});						#####パスワード暗号化文字列作成
				if(&write_file($pass_cgi,$pass)){
					&header_html("パスワード新規登録失敗");
				}else{
					&header_html("パスワード新規登録完了");
					&mes(902,"管理者用パスワードを登録しました<br>パスワードを初期化したい場合は、$pass_cgiファイルを消去してください。");
				}
			}
		}else{
			&header_html("パスワード新規登録");
			&pass_new_html;												#####パスワード新規登録ページ
		}
		return 1;
	#####パスワードパラメータがある場合
	}elsif($FORM{passch} ne ''){
		#####パスワードチェック
		if(&ch_pwd($FORM2{passch})){
			&header_html("パスワードエラー");
			&error(542,'パスワード');
			&pass_enter_html;											#####パスワード入力用ページ
			return 1;
		}
	#####パスワード入力画面から、パスワードが空欄の場合
	}elsif($FORM{passch1} ne ''){
		&header_html("パスワードエラー");
		&error(209,'パスワード');
		&pass_enter_html;												#####パスワード入力用ページ
		return 1;
	#####パスワードパラメータが全くないときパスワード入力を促す
	}else{
		&header_html("パスワード入力");
		&pass_enter_html;												#####パスワード入力用ページ
		return 1;
	}
	return 0;
}
#************************************************
# ジャンル情報の存在判定
##
## 引数		$dir	ジャンル名
##
## 戻り値	0:存在する
##			1:存在しない
#************************************************
sub ch_genre_exist{
	local($dir)=@_;
	#####ジャンルの存在チェック
	foreach(@GENRE_DIR_ALL){
		if(($_ ne '')&&($_ eq $dir)){return 1;}
	}
	return 0;
}

#************************************************
# 独自の問題ファイルを持つかどうかチェック
##
## 総合問題型ジャンルの場合は問題ファイルを持たないため、
## 問題の編集はできない。そのためのチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_mondai_exist{
	#####総合問題型ジャンルかどうかのチェック
	if(($GENRE_LST{$FORM{d}}{mondai_cgi} eq '.')||($GENRE_LST{$FORM{d}}{mondai_cgi} =~ /\//)){
		&error(701);
		&menu_html;
		return 1;
	}
	return 0;
}

#************************************************
# ファイル名の妥当性チェック
#************************************************
sub ch_file_format{
	#####総合問題型ジャンルかどうかのチェック
	unless($_[0]=~ /^[\w\$\#\~\.\/\-\?\=\&:]+$/){
		return 1;
	}
	return 0;
}




#************************************************
# 問題追加時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_add_quiz_param{
	#####入力内容チェック
	if($FORM{atype} eq ""){&error(203,'回答方式');}										#####回答方式未入力
	elsif($FORM{atype} !~ /^[012]$/){&error(409,'回答方式');}							#####回答方式不正入力
	if($FORM{qqu} eq ''){&error(203,'問題文');return 1;}								#####問題文未入力
	if($FORM{qas} eq ''){&error(203,'選択肢1');return 1;}								#####選択肢1未入力
	if(($FORM{qmas1} eq '')&&($FORM{atype} ne '1')){&error(203,'選択肢2');return 1;}	#####選択肢2未入力かつ選択問題
	return 0;
}

#************************************************
# 問題追加時の重複登録チェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_duplic_quiz{
	#####重複登録防止チェック
	local($i);
	foreach(@mondai){
		if(join("\t",$mondai[$i],$ans[$i],$misans1[$i],$misans2[$i],$misans3[$i],$misans4[$i]) eq
			join("\t",$FORM4{qqu},$FORM4{qas},$FORM4{qmas1},$FORM4{qmas2},$FORM4{qmas3},$FORM4{qmas4})){
			my($num)=$i+1;
			&error('この問題はすでに登録されています。'."($num問目)");return 1;
		}
		$i++;
	}
	return 0;
}

#************************************************
# 問題編集時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_edit_quiz_param{
	local($error)=$error_mes;															#####現時点のエラーを記録

	#####入力内容チェック
	if($FORM{atype} eq ""){&error(204,'回答方式');}										#####回答方式未入力
	elsif($FORM{atype} !~ /^[012]$/){&error(410,'回答方式');}							#####回答方式不正入力
	if($FORM{qn} eq ''){&error(204,'問題番号');}										#####問題番号が未入力
	elsif($FORM{qn} =~/\D/){&error(302,'問題番号');}									#####問題番号が非整数
	elsif(($FORM{qn}>$#mondai+1)&&($FORM{qn}<=0)){&error(531,'問題番号');}				#####問題番号が範囲外
	if($FORM{qqu} eq ''){&error(204,'問題文');}											#####問題文が未入力
	if($FORM{qas} eq ''){&error(204,'選択肢1');}										#####選択肢1が未入力
	if(($FORM{qmas1} eq '')&&($FORM{atype} ne '1')){&error(204,'選択肢2');}			#####選択肢2未入力かつ選択問題
	
	if($error eq $error_mes){return 0;}													#####エラー発生なし
	else{return 1;}																		#####エラー発生有り
}

#************************************************
# システム設定編集時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_sys_palam{
	local(@return,$error);
	#####ラジオボタン用変数初期化
	$FORM{"qf-$FORM{qf}"}   =' checked';
	$FORM{"stl-$FORM{stl}"} =' checked';
	$FORM{"tt-$FORM{tt}"}   =' checked';
	$FORM{"ey-$FORM{ey}"}     =' checked';
	$FORM{"rt-$FORM{rt}"}     =' checked';
	$FORM{"wr-$FORM{wr}"}     =' checked';
	$FORM{"nc-$FORM{nc}"}     =' checked';
	
	#####現時点のエラーを記録
	$error=$error_mes;

	#####入力内容チェック
	if($FORM{li} eq ''){&error(205,'(1)プレイログ保護期間');}
	elsif($FORM{li} =~ /\D/){&error(303,'(1)プレイログ保護期間');}
	if($FORM{mp} eq ''){&error(205,'(2)同時プレイ人数');}
	elsif($FORM{mp} =~ /\D/){&error(303,'(2)同時プレイ人数');}
	if($FORM{cok} eq ''){&error(205,'(3)クッキーID');}
	elsif($FORM{cok} =~ /\W/){&error(106,'(3)クッキーID');}
	if(!mygrep($FORM{qf},(0,1,2))){&error(401,'(4)選択肢形式');}
	if($FORM{mt} eq ''){&error(205,'(6)メニューページのタイトル');}
	if(!mygrep($FORM{stl},(0,1))){&error(401,'(10)スタイルシート');}
	if(!mygrep($FORM{ey},(0,1,2,3))){&error(401,'(12)メニューページ表示項目');}
	if(!mygrep($FORM{rt},(0,1))){&error(401,'(13)回答時間による順位付け');}
	if(!mygrep($FORM{wr},(0,1))){&error(401,'(14)自動文字折り返し');}
	if(!mygrep($FORM{nc},(0,1))){&error(401,'(15)ブラウザによるキャッシュ');}
	if($FORM{lag} eq ''){&error(205,'(16)サーバー時間の時間差補正');}
	elsif(!($FORM{lag} =~ /^\d+$/) && !($FORM{lag} =~ /^-[\d+]$/)){&error(303,'(16)サーバー時間の時間差補正');}
	elsif($FORM{lag} > 23 || $FORM{lag} < -23){&error(532,'(16)サーバー時間の時間差補正');}
	if($FORM{tblw} eq ''){&error(205,'(17)表の幅');}
	elsif(!($FORM{tblw} =~ /^\d+$|^\d{1,2}\%$|^100\%$/)){&error(350,'(17)表の幅');}
	if($error eq $error_mes){return 0;}			#####エラー発生なし
	else{return 1;}								#####エラー発生有り
}
#************************************************
# システムデザイン設定編集時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_sysdesign_palam{
	local(@return,$error);
	#####ラジオボタン用変数初期化
	$FORM{"al-$FORM{al}"}   =' checked';
	$FORM{"wal-$FORM{wal}"} =' checked';
	
	#####現時点のエラーを記録
	$error=$error_mes;
	
	#####入力内容チェック
	if($FORM{sdt} eq ''){&error(206,'(2)システムデザイン名');}
	foreach $id(@SYSDESIGN_ALL){
		##名前の重複チェック(新規、複製)
		if($id eq $FORM{sdt} && $FORM{edittype} ne 'edit'){
			&error(853,'(2)システムデザイン名');
		##名前の重複チェック(編集)
		}elsif($id eq $FORM{sdt} && $FORM{sdt} ne $FORM{id} && $FORM{edittype} eq 'edit'){
			&error(854,'(2)システムデザイン名');
		}
	}

	if(($FORM{tw} ne '')&&(&ch_file_format($FORM{tw}))){&error(305,'(3)メニューページの壁紙');}
	elsif(&ch_file_exist('(3)メニューページの壁紙',$FORM{tw}) eq 1){;}
	elsif(($FORM{tw_m} ne '')&&(&ch_file_format($FORM{tw_m}))){&error(305,'(3)メニューページの壁紙');}
	elsif(&ch_file_exist('(3)メニューページの壁紙',$FORM{tw_m}) eq 1){;}
	if($FORM{tbc} eq '')					{&error(206,'(4)メニューページの背景色');}
	elsif($FORM{tbc_m} eq '')				{&error(206,'(4)メニューページの背景色');}
	if($FORM{ttc} eq '')					{&error(206,'(5)メニューページの表の色');}
	if($FORM{tjc} eq '')					{&error(206,'(6)メニューページのジャンル色');}
	if($FORM{tic} eq '')					{&error(206,'(7)メニューページの情報色');}
	if($FORM{tcc} eq '')					{&error(206,'(8)メニューページのコメント色');}
	if($FORM{thc} eq '')					{&error(206,'(9)メニューページの高成績者色');}
	if($FORM{tbdc} eq '')					{&error(206,'(10)メニューページの表の枠の色');}
	if($FORM{txc} eq '')					{&error(206,'(11)ページの文字色');}
	elsif($FORM{txc_m} eq '')				{&error(206,'(11)ページの文字色');}
	if($FORM{lc} eq '')						{&error(206,'(12)ページのリンク色');}
	elsif($FORM{lc_m} eq '')				{&error(206,'(12)ページのリンク色');}
	if($FORM{vc} eq '')						{&error(206,'(13)ページの既訪問リンク色');}
	elsif($FORM{vc_m} eq '')				{&error(206,'(13)ページの既訪問リンク色');}
	if($FORM{tbdh} eq '')					{&error(206,'(14)メニューページの表の枠の高さ');}
	elsif($FORM{tbdh} =~/\D/)				{&error(305,'(14)メニューページの表の枠の高さ');}
	if($FORM{tbd} eq '')					{&error(206,'(15)メニューページの表の枠の幅');}
	elsif($FORM{tbd} =~/\D/)				{&error(305,'(15)メニューページの表の枠の幅');}
	if($FORM{tbdi} eq '')					{&error(206,'(16)メニューページの表の枠の内幅');}
	elsif($FORM{tbdi} =~/\D/)				{&error(305,'(16)メニューページの表の枠の内幅');}
	if($FORM{ag} eq '')						{&error(206,'(17)成績履歴グラフ画像1');}
	elsif(&ch_file_format($FORM{ag}))		{&error(305,'(17)成績履歴グラフ画像1');}
	elsif(&ch_file_exist('(17)成績履歴グラフ画像1',$FORM{ag}) eq 1){;}
	if($FORM{bg} eq '')						{&error(206,'(18)成績履歴グラフ画像2');}
	elsif(&ch_file_format($FORM{bg}))		{&error(305,'(18)成績履歴グラフ画像2');}
	elsif(&ch_file_exist('(18)成績履歴グラフ画像2',$FORM{bg}) eq 1){;}
	if(!mygrep($FORM{al},('l','c','r')))	{&error(402,'(19)表のレイアウト');}
	if(!mygrep($FORM{wal},('l','c','r')))	{&error(402,'(20)表内文字レイアウト');}
	
	if($error eq $error_mes){					#####エラー発生なし
		#####ジャンルの追加(新規、複製)
		if($FORM{edittype} ne 'edit'){
			push(@SYSDESIGN_ALL,$FORM{sdt});
		#####ジャンル名の変更(編集)
		}else{
			$i=0;
			foreach $id(@SYSDESIGN_ALL){
				if($id eq $FORM{id}){
					$SYSDESIGN_ALL[$i] = $FORM{sdt};
					last;
				}
				$i++;
			}
		}
		return 0;
	}	else{return 1;}								#####エラー発生有り
}
#************************************************
# ジャンルデザイン設定編集時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_design_palam{
	local(@return,$error);
	
	#####現時点のエラーを記録
	$error=$error_mes;
	
	#####入力内容チェック
	if($FORM{gdt} eq ''){&error(207,'(2)ジャンルデザイン名');}
	foreach $id(@DESIGN_ALL){
		##名前の重複チェック(新規、複製)
		if($id eq $FORM{gdt} && $FORM{edittype} ne 'edit'){
			&error(855,'(2)ジャンルデザイン名');
		##名前の重複チェック(編集)
		}elsif($id eq $FORM{gdt} && $FORM{gdt} ne $FORM{id} && $FORM{edittype} eq 'edit'){
			&error(856,'(2)ジャンルデザイン名');
		}
	}
	
	if($FORM{gtc} eq '')			{&error(207,'(3)文字色');}
	elsif($FORM{gtc_m} eq '')		{&error(207,'(3)文字色');}
	if($FORM{glc} eq '')			{&error(207,'(4)リンク文字色');}
	elsif($FORM{glc_m} eq '')		{&error(207,'(4)リンク文字色');}
	if($FORM{gvc} eq '')			{&error(207,'(5)既訪問リンク文字色');}
	elsif($FORM{gvc_m} eq '')		{&error(207,'(5)既訪問リンク文字色');}
	if($FORM{gcc} eq '')			{&error(207,'(6)殿堂入り者色');}
	elsif($FORM{gcc_m} eq '')		{&error(207,'(6)殿堂入り者色');}
	if($FORM{gmc} eq '')			{&error(207,'(7)基本背景色');}
	elsif($FORM{gmc_m} eq '')		{&error(207,'(7)基本背景色');}
	if($FORM{gwi} eq '')			{&error(207,'(8)正解時背景色');}
	elsif($FORM{gwi_m} eq '')		{&error(207,'(8)正解時背景色');}
	if($FORM{glo} eq '')			{&error(207,'(9)不正解時背景色');}
	elsif($FORM{glo_m} eq '')		{&error(207,'(9)不正解時背景色');}
	if($FORM{gcm} eq '')			{&error(207,'(10)情報ウインドウの色');}
	if($FORM{thc} eq '')			{&error(207,'(11)表のヘッダー色');}
	if($FORM{tdc} eq '')			{&error(207,'(12)表の色');}
	if($FORM{bdc} eq '')			{&error(207,'(13)表の枠の色');}
	if($FORM{bdh} eq '')			{&error(207,'(14)表の枠の高さ');}
	elsif($FORM{bdh} =~/\D/)		{&error(306,'(14)表の枠の高さ');}
	if($FORM{bd} eq '')				{&error(207,'(15)表の枠の幅');}
	elsif($FORM{bd} =~/\D/)			{&error(306,'(15)表の枠の幅');}
	if($FORM{bdi} eq '')			{&error(207,'(16)表の枠の内幅');}
	elsif($FORM{bdi} =~/\D/)		{&error(306,'(16)表の枠の内幅');}
	if(($FORM{gw} ne '')&& (&ch_file_format($FORM{gw}))){&error(104,'(17)基本壁紙');}
	elsif(&ch_file_exist('(17)基本壁紙',$FORM{gw}) eq 1){;}
	elsif(($FORM{gw_m} ne '')&& (&ch_file_format($FORM{gw_m}))){&error(104,'(17)基本壁紙');}
	elsif(&ch_file_exist('(17)基本壁紙',$FORM{gw_m}) eq 1){;}
	if(($FORM{gww} ne '')&& (&ch_file_format($FORM{gww}))){&error(104,'(18)正解時壁紙');}
	elsif(&ch_file_exist('(18)正解時壁紙',$FORM{gww}) eq 1){;}
	elsif(($FORM{gww_m} ne '')&& (&ch_file_format($FORM{gww_m}))){&error(104,'(18)正解時壁紙');}
	elsif(&ch_file_exist('(18)正解時壁紙',$FORM{gww_m}) eq 1){;}
	if(($FORM{glw} ne '')&& (&ch_file_format($FORM{glw}))){&error(104,'(19)不正解時壁紙');}
	elsif(&ch_file_exist('(19)不正解時壁紙',$FORM{glw}) eq 1){;}
	elsif(($FORM{glw_m} ne '')&& (&ch_file_format($FORM{glw_m}))){&error(104,'(19)不正解時壁紙');}
	elsif(&ch_file_exist('(19)不正解時壁紙',$FORM{glw_m}) eq 1){;}
	if($FORM{wsg} eq '')			{&error(207,'(20)正解表示');}
	elsif($FORM{wsg_m} eq '')		{&error(207,'(20)正解表示');}
	if($FORM{lsg} eq '')			{&error(207,'(21)不正解表示');}
	elsif($FORM{lsg_m} eq '')		{&error(207,'(21)不正解表示');}
	if($FORM{osg} eq '')			{&error(207,'(22)タイムオーバー表示');}
	elsif($FORM{osg_m} eq '')		{&error(207,'(22)タイムオーバー表示');}
	if(($FORM{wmd} ne '')&& (&ch_file_format($FORM{wmd}))){&error(104,'(23)正解時MIDI');}
	elsif(&ch_file_exist('(23)正解時MIDI',$FORM{wmd}) eq 1){;}
	if(($FORM{lmd} ne '')&& (&ch_file_format($FORM{lmd}))){&error(104,'(24)不正解時MIDI');}
	elsif(&ch_file_exist('(24)不正解時MIDI',$FORM{lmd}) eq 1){;}
	if(($FORM{emd} ne '')&& (&ch_file_format($FORM{emd}))){&error(104,'(25)クイズ終了時MIDI');}
	elsif(&ch_file_exist('(25)クイズ終了時MIDI',$FORM{emd}) eq 1){;}
	if(($FORM{hmd} ne '')&& (&ch_file_format($FORM{hmd}))){&error(104,'(26)高成績者用MIDI');}
	elsif(&ch_file_exist('(26)高成績者用MIDI',$FORM{hmd}) eq 1){;}

	if($error eq $error_mes){					#####エラー発生なし
		#####ジャンルの追加(新規、複製)
		if($FORM{edittype} ne 'edit'){
			push(@DESIGN_ALL,$FORM{gdt});
		#####ジャンル名の変更(編集)
		}else{
			$i=0;
			foreach $id(@DESIGN_ALL){
				if($id eq $FORM{id}){
					$DESIGN_ALL[$i] = $FORM{gdt};
					last;
				}
				$i++;
			}
		}
		return 0;
	}	else{return 1;}								#####エラー発生有り
}

#************************************************
# 終了時メッセージ編集のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_edit_mes_param{
	#####指定正解率が範囲外です
	for($i=0;$i<$FORM{mn};$i++){
		if($FORM{"per-$i"} eq ''){next;}
		if(($FORM{"per-$i"}<0.00000001)||($FORM{"per-$i"}>100)){
			&error(531,'正解率の指定');
			return 1;
		}
	}
	return 0;
}

#************************************************
# ジャンル編集時のパラメータチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_edit_genre_palam{
	#####現時点のエラーを記録
	$error=$error_mes;

	#####ラジオボタン用変数初期化
	$FORM{"md-$FORM{md}"}		=' checked';
	$FORM{"me-$FORM{me}"}		=' checked';
	$FORM{"ct-$FORM{ct}"}		=' checked';
	$FORM{"nt-$FORM{nt}"}     	=' checked';
	$FORM{"dc-$FORM{dc}"}     	=' checked';
	$FORM{"sd-$FORM{sd}"}     	=' checked';
	$FORM{"ath-$FORM{ath}"} 	=' checked';
	$FORM{"rcf-$FORM{rcf}"} 	=' checked';
	$FORM{"rdg-$FORM{rdg}"} 	=' checked';
	$FORM{"sa1-$FORM{sa1}"}		=' checked';$FORM{"sa2-$FORM{sa2}"}		=' checked';
	$FORM{"sr1-$FORM{sr1}"}		=' checked';$FORM{"sr2-$FORM{sr2}"}		=' checked';
	$FORM{"r1-$FORM{r1}"}		=' checked';$FORM{"r2-$FORM{r2}"}		=' checked';
	$FORM{"qm1-$FORM{qm1}"}		=' checked';$FORM{"qm2-$FORM{qm2}"}		=' checked';
	$FORM{"pm1-$FORM{pm1}"}		=' checked';$FORM{"pm2-$FORM{pm2}"}		=' checked';
	$FORM{"lm1-$FORM{lm1}"}		=' checked';$FORM{"lm2-$FORM{lm2}"}		=' checked';
	$FORM{"tl1-$FORM{tl1}"}		=' checked';$FORM{"tl2-$FORM{tl2}"}		=' checked';
	$FORM{"dl1-$FORM{dl1}"}		=' checked';$FORM{"dl2-$FORM{dl2}"}		=' checked';
	$FORM{"nl1-$FORM{nl1}"}		=' checked';$FORM{"nl2-$FORM{nl2}"}		=' checked';
	$FORM{"dh1-$FORM{dh1}"}		=' checked';$FORM{"dh2-$FORM{dh2}"}		=' checked';
	$FORM{"bd1-$FORM{bd1}"}		=' checked';$FORM{"bd2-$FORM{bd2}"}		=' checked';
	$FORM{"hbu1-$FORM{hbu1}"}	=' checked';$FORM{"hbu2-$FORM{hbu2}"}	=' checked';
	$FORM{"hbw1-$FORM{hbw1}"}	=' checked';$FORM{"hbw2-$FORM{hbw2}"}	=' checked';
	$FORM{"sbu1-$FORM{sbu1}"}	=' checked';$FORM{"sbu2-$FORM{sbu2}"}	=' checked';
	$FORM{"sbw1-$FORM{sbw1}"}	=' checked';$FORM{"sbw2-$FORM{sbw2}"}	=' checked';
	$FORM{"rc1-$FORM{rc1}"}		=' checked';$FORM{"rc2-$FORM{rc2}"}		=' checked';

	#####ラジオボタン付きテキストボックスの内容をクリア
	if($FORM{qm} eq 1){$FORM{'qm-2'}='';}
	if($FORM{pm} eq 1){$FORM{'pm-2'}='';}
	if($FORM{lm} eq 1){$FORM{'lm-2'}='';}
	if($FORM{dl} eq 1){$FORM{'dl-2'}='';}
	if($FORM{nl} eq 1){$FORM{'nl-2'}='';}

	#####入力内容チェック
	if($FORM{t} eq ''){&error(208,'(2)タイトル');}
	if(!mygrep($FORM{md},(0,1)))						{&error(403,"(2-4)問題ファイル");}
	elsif($FORM{md} eq 1){
		foreach(@GENRE_DIR_ORIGN){
			if(($FORM{d} eq $_)||($GENRE_LST{$_}{mondai_cgi} eq '.')||($GENRE_LST{$_}{mondai_cgi} =~ /\//)){next;}
			if(!($FORM{"smd-$_"} =~ /^\d+$/)&&($FORM{"smd-$_"} ne 'all')){&error(304,'(2-4)問題ファイル');last;}
		}
	}
	if(!mygrep($FORM{me},(0,1)))								{&error(403,'(2-5)ジャンルの動作状態');}
	if(!mygrep($FORM{ct},(0,1)))								{&error(403,'(2-6)投稿問題の受付');}
	if(!mygrep($FORM{nt},(0,1)))								{&error(403,'(2-7)テキスト形式の投稿問題');}
	if(!mygrep($FORM{dc},(0,1)))								{&error(403,'(2-8)投稿問題の自動採用');}
	if(!mygrep($FORM{ath},(0,1)))								{&error(403,'(2-10)問題文への作成者表示');}
	if(!mygrep($FORM{rcf},(0,1)))								{&error(403,'(2-11)回答結果への参考文献表示');}
	if(!mygrep($FORM{rdg},(0,1)))								{&error(403,'(2-12)回答結果への問題内容表示');}
	if($FORM{'phn'} eq '')										{&error(208,'(2-13)携帯電話モードでの高成績者表示数');}
	elsif($FORM{'phn'}=~ /\D/)									{&error(304,'(2-13)携帯電話モードでの高成績者表示数');}
	if($FORM{mn1} eq '')										{&error(208,'(3-1)モード1の名前');}
	if(!mygrep($FORM{sa1},(0,1)))								{&error(403,'(3-2)正解表示');}
	if(!mygrep($FORM{sr1},(0,1)))								{&error(403,'(3-3)回答結果表示');}
	if(!mygrep($FORM{r1},(0,1)))								{&error(403,'(3-4)出題順序');}
	if(!mygrep($FORM{qm1},(0,1)))								{&error(403,'(3-5)使用問題数');}
	elsif(($FORM{qm1} eq '0')&&($FORM{'qm1-2'} eq ''))			{&error(208,'(3-5)使用問題数');}
	elsif(($FORM{qm1} eq '0')&&($FORM{'qm1-2'}=~ /\D/))			{&error(304,'(3-5)使用問題数');}
	if(!mygrep($FORM{pm1},(0,1)))								{&error(403,'(3-6)出題問題数');}
	elsif(($FORM{pm1} eq '0')&&($FORM{'pm1-2'} eq ''))			{&error(208,'(3-6)出題問題数');}
	elsif(($FORM{pm1} eq '0')&&($FORM{'pm1-2'}=~ /\D/))			{&error(304,'(3-6)出題問題数');}
	if(!mygrep($FORM{bd1},(0,1)))								{&error(403,'(3-7)一括出題');}
	if(!mygrep($FORM{lm1},(0,1)))								{&error(403,'(3-8)終了条件誤答数');}
	elsif(($FORM{lm1} eq '0')&&($FORM{'lm1-2'} eq ''))			{&error(208,'(3-8)終了条件誤答数');}
	elsif(($FORM{lm1} eq '0')&&($FORM{'lm1-2'}=~ /\D/))			{&error(304,'(3-8)終了条件誤答数');}
	if(!mygrep($FORM{tl1},(0,1)))								{&error(403,'(3-9)制限時間');}
	elsif(($FORM{tl1} eq '0')&&($FORM{'tl1-2'} eq ''))			{&error(208,'(3-9)制限時間');}
	elsif(($FORM{tl1} eq '0')&&($FORM{'tl1-2'}!~ /^[0-9]+\.?[0-9]*$/))			{&error(304,'(3-9)制限時間');}
	if($FORM{hb1} eq '')										{&error(208,'(3-10)合格点');}
	elsif($FORM{hb1} =~ /\D/)									{&error(304,'(3-10)合格点');}
	if(!mygrep($FORM{hbu1},(0,1)))								{&error(403,'(3-11)高成績者のBACK UP');}
	elsif(($FORM{hbu1} eq '1')&&($FORM{'hbu1-2'} eq ''))		{&error(208,'(3-11)高成績者のBACK UP間隔(日)');}
	elsif(($FORM{hbu1} eq '1')&&($FORM{'hbu1-2'}=~ /\D/))		{&error(304,'(3-11)高成績者のBACK UP間隔(日)');}
	if(!mygrep($FORM{hbw1},(0,1)))								{&error(403,'(3-12)高成績者のBACK UP方式');}
	if(!mygrep($FORM{sbu1},(0,1)))								{&error(403,'(3-13)成績分布のBACK UP');}
	elsif(($FORM{sbu1} eq '1')&&($FORM{'sbu1-2'} eq ''))		{&error(208,'(3-13)成績分布のBACK UP間隔(日)');}
	elsif(($FORM{sbu1} eq '1')&&($FORM{'sbu1-2'}=~ /\D/))		{&error(304,'(3-13)成績分布のBACK UP間隔(日)');}
	if(!mygrep($FORM{sbw1},(0,1)))								{&error(403,'(3-14)成績分布のBACK UP方式');}
	if($FORM{gb1} eq '')										{&error(208,'(3-15)成績分布省略表\示');}
	elsif($FORM{gb1} =~ /\D/)									{&error(304,'(3-15)成績分布省略表\示');}
	if($FORM{hd1} eq '')										{&error(208,'(3-16)成績分布集計単位');}
	elsif($FORM{hd1} =~ /\D/)									{&error(304,'(3-16)成績分布集計単位');}
	if(!mygrep($FORM{dl1},(0,1)))								{&error(403,'(3-17)高成績者日数制限');}
	elsif(($FORM{dl1} eq '0')&&($FORM{'dl1-2'} eq ''))			{&error(208,'(3-17)高成績者日数制限');}
	elsif(($FORM{dl1} eq '0')&&($FORM{'dl1-2'}=~ /\D/))			{&error(304,'(3-17)高成績者日数制限');}
	if(!mygrep($FORM{nl1},(0,1)))								{&error(403,'(3-18)高成績者人数制限');}
	elsif(($FORM{nl1} eq '0')&&($FORM{'nl1-2'} eq ''))			{&error(208,'(3-18)高成績者人数制限');}
	elsif(($FORM{nl1} eq '0')&&($FORM{'nl1-2'}=~ /\D/))			{&error(304,'(3-18)高成績者人数制限');}
	if($FORM{no1} eq '')										{&error(208,'(3-19)殿堂入り人数');}
	elsif($FORM{no1} =~ /\D/)									{&error(304,'(3-19)殿堂入り人数');}
	if(!mygrep($FORM{rc1},(0,1)))								{&error(403,'(3-20)高成績者コメント記録');}
	if(!mygrep($FORM{dh1},(0,1)))								{&error(403,'(3-21)同ホスト同スコア');}
	if($FORM{mn2} ne ''){
		if(!mygrep($FORM{sa2},(0,1)))							{&error(403,'(4-2)モード2正解表示');}
		if(!mygrep($FORM{sr2},(0,1)))							{&error(403,'(4-3)回答結果表示');}
		if(!mygrep($FORM{r2},(0,1)))							{&error(403,'(4-4)出題順序');}
		if(!mygrep($FORM{qm2},(0,1)))							{&error(403,'(4-5)使用問題数');}
		elsif(($FORM{qm2} eq '0')&&($FORM{'qm2-2'} eq ''))		{&error(208,'(4-5)使用問題数');}
		elsif(($FORM{qm2} eq '0')&&($FORM{'qm2-2'}=~ /\D/))		{&error(304,'(4-5)使用問題数');}
		if(!mygrep($FORM{pm2},(0,1)))							{&error(403,'(4-6)出題問題数');}
		elsif(($FORM{pm2} eq '0')&&($FORM{'pm2-2'} eq ''))		{&error(208,'(4-6)出題問題数');}
		elsif(($FORM{pm2} eq '0')&&($FORM{'pm2-2'}=~ /\D/))		{&error(304,'(4-6)出題問題数');}
		if(!mygrep($FORM{bd2},(0,1)))							{&error(403,'(4-7)一括出題');}
		if(!mygrep($FORM{lm2},(0,1)))							{&error(403,'(4-8)終了条件誤答数');}
		elsif(($FORM{lm2} eq '0')&&($FORM{'lm2-2'} eq ''))		{&error(208,'(4-8)終了条件誤答数');}
		elsif(($FORM{lm2} eq '0')&&($FORM{'lm2-2'}=~ /\D/))		{&error(304,'(4-8)終了条件誤答数');}
		if(!mygrep($FORM{tl2},(0,1)))							{&error(403,'(4-9)制限時間');}
		elsif(($FORM{tl2} eq '0')&&($FORM{'tl2-2'} eq ''))		{&error(208,'(4-9)制限時間');}
		elsif(($FORM{tl2} eq '0')&&($FORM{'tl2-2'}!~ /^[0-9]+\.?[0-9]*$/))		{&error(403,'(4-9)制限時間');}
		if($FORM{hb2} eq '')									{&error(208,'(4-10)合格点');}
		elsif($FORM{hb2} =~ /\D/)								{&error(304,'(4-10)合格点');}
		if(!mygrep($FORM{hbu2},(0,1)))							{&error(403,'(4-11)高成績者のBACK UP');}
		elsif(($FORM{hbu2} eq '1')&&($FORM{'hbu2-2'} eq ''))	{&error(208,'(4-11)高成績者のBACK UP間隔(日)');}
		elsif(($FORM{hbu2} eq '1')&&($FORM{'hbu2-2'}=~ /\D/))	{&error(304,'(4-11)高成績者のBACK UP間隔(日)');}
		if(!mygrep($FORM{hbw2},(0,1)))							{&error(403,'(4-12)高成績者のBACK UP方式');}
		if(!mygrep($FORM{sbu2},(0,1)))							{&error(403,'(4-13)成績分布のBACK UP');}
		elsif(($FORM{sbu2} eq '1')&&($FORM{'sbu2-2'} eq ''))	{&error(208,'(4-13)成績分布のBACK UP間隔(日)');}
		elsif(($FORM{sbu2} eq '1')&&($FORM{'sbu2-2'}=~ /\D/))	{&error(304,'(4-13)成績分布のBACK UP間隔(日)');}
		if(!mygrep($FORM{sbw2},(0,1)))							{&error(403,'(4-14)成績分布のBACK UP方式');}
		if($FORM{gb2} eq '')									{&error(208,'(4-15)成績分布省略表\示');}
		elsif($FORM{gb2} =~ /\D/)								{&error(304,'(4-15)成績分布省略表\示');}
		if($FORM{hd2} eq '')									{&error(208,'(4-16)成績分布集計単位');}
		elsif($FORM{hd2} =~ /\D/)								{&error(304,'(4-16)成績分布集計単位');}
		if(!mygrep($FORM{dl2},(0,1)))							{&error(403,'(4-17)高成績者日数制限');}
		elsif(($FORM{dl2} eq '0')&&($FORM{'dl2-2'} eq ''))		{&error(208,'(4-17)高成績者日数制限');}
		elsif(($FORM{dl2} eq '0')&&($FORM{'dl2-2'}=~ /\D/))		{&error(304,'(4-17)高成績者日数制限');}
		if(!mygrep($FORM{nl2},(0,1)))							{&error(403,'(4-18)高成績者人数制限');}
		elsif(($FORM{nl2} eq '0')&&($FORM{'nl2-2'} eq ''))		{&error(208,'(4-18)高成績者人数制限');}
		elsif(($FORM{nl2} eq '0')&&($FORM{'nl2-2'}=~ /\D/))		{&error(304,'(4-18)高成績者人数制限');}
		if($FORM{no2} eq '')									{&error(208,'(4-19)殿堂入り人数');}
		elsif($FORM{no2} =~ /\D/)								{&error(304,'(4-19)殿堂入り人数');}
		if(!mygrep($FORM{rc2},(0,1)))							{&error(403,'(4-20)高成績者コメント記録');}
		if(!mygrep($FORM{dh2},(0,1)))							{&error(403,'(4-21)同ホスト同スコア');}
	}

	if($error eq $error_mes){return 0;}			#####エラー発生なし
	else{return 1;}								#####エラー発生有り
}
#************************************************
# アクセス制限IPチェック
##
## 戻り値	0:正常
##			1:エラー
#************************************************
sub ch_guard_ip{
	open(DB,$guard_cgi);
	@list=<DB>;
	close(DB);
	if($list[0] eq "guard\n"){
		$guard=1;
		$permit=0;
		$list[0]='';
	}elsif($list[0] eq "permit\n"){
		$guard=0;
		$permit=1;
		$list[0]='';
	}else{
		$guard=1;
		$permit=0;
	}
	foreach $line(@list){
		$line=~ s/\n//g;
		$line=~ s/ //g;
		if($line eq ''){next;}
		if($ip =~ /^$line/){
			return $guard;
		}
	}
	return $permit;
}
#************************************************
# パスワード変更チェック
#************************************************
sub ch_edit_pass{
	if(&ch_pwd($FORM2{op}))			{&error(543,'(1)旧パスワード');return 1}
	if($FORM2{np1} eq "")			{&error(211,'(2)新パスワード');return 1;}
	if($FORM2{np1} ne $FORM2{np2})	{&error(544,'(2)新規パスワードと(3)新パスワード(確認用)');return 1;}
	return 0;
}


#************************************************
# システムファイルの書き込み
#************************************************
sub write_system_dat{
	return &write_file($system_cgi,&sys_to_system_dat);
}
#************************************************
# ジャンルファイルの書き込み
#************************************************
sub write_genre_dat{
	local($value);
	
	#####書き込みデータの作成
	$value = "ver2\n";
	foreach $dir(@GENRE_DIR_ALL){
		if($dir ne ''){$value .= &genre_array_to_line($dir);}
	}
	
	#####書き込み
	return &write_file($genre_cgi,$value);
}
#************************************************
# デザインファイルの書き込み
#************************************************
sub write_design_dat{
	local($value);
	
	#####書き込みデータの作成
	$value = "ver2\n";
	foreach $id(@DESIGN_ALL){
		if($id ne ''){$value .= &design_array_to_line($id);}
	}
	
	#####書き込み
	return &write_file($design_cgi,$value);
}
#************************************************
# システムデザインファイルの書き込み
#************************************************
sub write_sysdesign_dat{
	local($value);
	
	#####書き込みデータの作成
	$value = "ver2\n";
	
	foreach $id(@SYSDESIGN_ALL){
		if($id ne '' && $SYSDESIGN_LST{$id}{pc}{sysdesign_title} ne ''){$value .= &sysdesign_array_to_line($id);}
	}
	
	#####書き込み
	return &write_file($sysdesign_cgi,$value);
}


#************************************************
# 問題ファイル上書き処理
##
## 引数		$file_name	問題ファイル名
#************************************************
sub write_mondai{
	local(@lines);
	local($file_name,$dir) = @_;
	if($dir eq ""){$dir=$FORM{d};}
	$i=0;$j=0;
	foreach(@mondai){
		if($mondai[$i] ne ''){
			$j++;
			
			#####書き込みデータの作成
			push(@lines,&quiz_to_line($i,$j));
		}
		$i++;
	}
	
	#####ディレクトリの存在チェック
	if(&ch_dir_exist('ディレクトリ名',$dir)){return 1;}
	
	#####書き込み
	
	return &write_file("$dir/$file_name",@lines);
}