#
#	ページを作成する。
#
sub		MakePage()
{
	my($_in_, $_data_, $_grp_, $mode, $_html_) = @_;
	my($qcode, $qpath);
	my(@ibase);
	my(@qs, $q, @cols);
	my($qnum);
	my(@cols, $col);
	my($id, $id000);
	my($selstr);
	#	20120128 SHINODA
	my($cnt);
	my($nq, @ncols);
	my(@qsx);
	#	20120128 SHINODA
	my($ret)	= $FALSE;

	#	ページの雛型を読み込む。
	@$_html_ = &LoadTextFile($$_in_{'URLFORM'}, 'utf8');
	@ibase   = &LoadTextFile($$_in_{'ITMFORM'}, 'utf8');

	#	問題セットを読み込む。
	$qcode = $$_in_{'QCODE'};
	$qcode =~ s/\.//g;
	$qcode =~ s/\///g;
	$qpath = $$_in_{'DBQUESTION'};
	$qpath =~ s/#QCODEX#/${qcode}/g;
	@qs = &LoadTextFile($qpath, 'utf8');

	#	個人情報項目を置換する。
	#	20120228 SHINODA
	foreach $id000 (('010', '020', '030', '035', '040', '045', '050', '055', '060', '065', '990', '995'))
	#foreach $id000 (('010', '020', '030', '040', '045', '990'))
	#	20120228 SHINODA
	{
		my($iv);

		#	IV値を取得する。
		$iv = &_QF_GetIV($_data_, "ID${id000}");

		&ReplaceKey($_html_, "#ID${id000}IV#", &ToPlaneText($iv));
		&ReplaceKey($_html_, "#ID${id000}IX#", $iv);
		&ReplaceKey($_html_, "#ID${id000}ER#", &ToPlaneText(&_QF_GetValue($_data_, "ID${id000}", 'ER')));

		my($ev, @evs, $evi);
		my($id, $val);

		#	EV値を取得する。
		$ev = &_QF_GetValue($_data_, "ID${id000}", 'EV');

		#	EV値が設定されている場合は処理する。
		if ($ev ne '')
		{
			#	選択肢を分解する。
			@evs = split(m/,/, $ev);

			#	選択肢を走査する。
			foreach $evi (@evs)
			{
				#	選択肢をIDと値に分解する。
				($id, $val) = split(m/=/, $evi);

				#	値が一致している場合は選択する。
				&ReplaceKey($_html_, "#ID${id000}_${id}#", ($iv eq $id) ? 'SELECTED' : '');
			}
		}

		my($cd);

		#	EV値を取得する。
		$cd = &_QF_GetValue($_data_, "ID${id000}", 'CD');

		#	CD値が設定されている場合は処理する。
		if ($cd ne '')
		{
			#	値が設定されている場合はチェックする。
			&ReplaceKey($_html_, "#ID${id000}_CHEKCED#", ($iv ne '') ? 'CHECKED' : '');
		}
	}

	#	20120128 SHINODA

	#	予め不要な行を取り除く。
	@qsx = ();
	foreach $q (@qs)
	{
		#	改行を取り除く。
		$q =~ s/[\r\n]//g;

		#	空行であれば次へ。
		next if ($q eq '');

		#	コメント行であれば次へ。
		next if ($q =~ m/^#/);
		next if ($q =~ m/^;/);
		next if ($q =~ m#^//#);

		push(@qsx, $q);
	}

	#	20120128 SHINODA

	$id = 100;
	$qnum = '';
	@items = ();
	#	20120128 SHINODA
	for $cnt (0 .. $#qsx)
	#foreach $q (@qs)
	#	20120128 SHINODA
	{
		#	20120128 SHINODA

		$q  = $qsx[$cnt];
		$nq = $qsx[$cnt + 1];

		##	改行を取り除く。
		#$q =~ s/[\r\n]//g;

		##	空行であれば次へ。
		#next if ($q eq '');

		##	コメント行であれば次へ。
		#next if ($q =~ m/^#/);
		#next if ($q =~ m/^;/);
		#next if ($q =~ m#^//#);

		#	20120128 SHINODA

		#	列に分解する。
		@cols = split(m/\t/, $q);
		#	20120128 SHINODA
		@ncols = split(m/\t/, $nq);
		#	20120128 SHINODA

		#	設問の改行を置換する。
		$cols[3] =~ s#\\n#<br />#g;

		@item = @ibase;

		#	IDを作成する。
		$id000 = sprintf('%03d', $id);

		#	先頭行か否かで表示を切り替える。
		goto DO_ERROR if (&_ETC_SpliceBlocks('ISHEAD_T', 'ISHEAD_F', ($qnum ne $cols[0]) ? $TRUE : $FALSE, \@item) == $FALSE);

		#	20120128 SHINODA
		#	最終行か否かで表示を切り替える。
		goto DO_ERROR if (&_ETC_SpliceBlocks('ISFOOT_T', 'ISFOOT_F', (($cnt >= $#qsx) || ($cols[0] ne $ncols[0])) ? $TRUE : $FALSE, \@item) == $FALSE);
		#	20120128 SHINODA

		#	IDを置換する。
		&ReplaceKey(\@item, '#ID000#', $id000);

		#	問題番号を置換する。
		&ReplaceKey(\@item, '#QNUM#', $cols[0]);

		#	設問番号を置換する。
		&ReplaceKey(\@item, '#SNUM#', $cols[1]);

		#	設問を置換する。
		&ReplaceKey(\@item, '#QUESTION#', $cols[3]);

		#	選択肢を置換する。
		&ReplaceKey(\@item, '#ANSWERa#', $cols[4]);
		&ReplaceKey(\@item, '#ANSWERb#', $cols[5]);
		&ReplaceKey(\@item, '#ANSWERc#', $cols[6]);
		&ReplaceKey(\@item, '#ANSWERd#', $cols[7]);

		#	表示モードはフォーム？
		if ($mode eq 'form')
		{
			#	選択肢を走査する。
			foreach $selstr (('a', 'b', 'c', 'd'))
			{
				#	チェックしない。
				&ReplaceKey(\@item, "#CHECKED${selstr}#", '');
			}

			#	エラー文字列を消去する。
			&ReplaceKey(\@item, "#ID000ER#", '');
		}

		#	表示モードは確認画面？
		elsif ($mode eq 'conf')
		{
			my($ansstr);

			#	選択肢を走査する。
			foreach $selstr (('a', 'b', 'c', 'd'))
			{
				#	回答を取得する。
				$ansstr = &_QF_GetIV($_data_, "ID${id000}");

				#	回答と一致している要素であればチェックする。
				&ReplaceKey(\@item, "#CHECKED${selstr}#", ($selstr eq $ansstr) ? 'CHECKED' : '');
			}

			#	エラー文字列を表示する。
			&ReplaceKey(\@item, "#ID000ER#", &_QF_GetValue($_data_, "ID${id000}", 'ER'));
		}

		push(@items, join('', @item));

		#	現在の問題番号を表示する。
		$qnum = $cols[0];

		$id++;
	}

	#	自己紹介の問題番号を置換する。
	&ReplaceKey($_html_, '#QNUMX#', int($qnum) + 1);

	#	設問の一覧を置換する。
	&ReplaceKey($_html_, '#ITEMLIST#', join('', @items));

	#	表示モードがフォームか否かで表示を切り替える。
	goto DO_ERROR if (&_ETC_SpliceBlocks('ISFORM_T', 'ISFORM_F', ($mode eq 'form') ? $TRUE : $FALSE, $_html_) == $FALSE);

	#	問題コードを置換する。
	&ReplaceKey($_html_, '#QCODE#', $$_in_{'QCODE'});

	#	ドメイン名を置換する。
	&ReplaceKey($_html_, '#SERVER_NAME#', $ENV{'SERVER_NAME'});

DO_SUCCESS:

	#	正常終了。
	$ret = $TRUE;

DO_ERROR:

	#	処理結果を返す。
	return $ret;
}

#
#	エラーはあるか？
#
sub		IsError()
{
	my($_data_) = @_;
	my($ret)	= $FALSE;

	#	入力データを走査する。
	for $cnt (0 .. $#$_data_)
	{
		#	エラーでない場合は次へ。
		next if ($_data_->[$cnt]{'CR'} == $TRUE);

		#	エラーが検出された事をマークする。
		$ret = $TRUE;

		#	走査を終了する。
		last;
	}

DO_ERROR:

	#	処理結果を返す。
	return $ret;
}

1;	#	return true
