/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUSmartLinkEnqute
*   ソースファイル名：JFUSmartLinkEnqute.java
*   作成者          ：富士通
*   日付            ：2012年09月21日
*＜機能概要＞
*   eoスマートリンク申込アンケート内容出力部品です。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v4.00       2012/09/21   FJ)文元     新規作成
*   v4.00       2012/11/09   FJ)文元    【IT2-2012-0001673】巻A障害対応
*   v5.00       2013/02/06   FJ)文元    【ANK-1416-00-00】１１月案件対応
*
**********************************************************************/
package eo.web.webview.common;

import static com.fujitsu.futurity.web.x31.X31SWebLog.DEBUG_LOG;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.fujitsu.futurity.web.x33.DispatchContext;
import com.fujitsu.futurity.web.x33.DispatchContextFactory;
import com.fujitsu.futurity.web.x33.HttpDispatchContext;
import com.fujitsu.futurity.web.x33.X33SDataBeanAccessWrapper;
import com.fujitsu.futurity.web.x33.X33SErrorLog;
import com.fujitsu.futurity.web.x33.X33VCustomTagBase;
import com.fujitsu.futurity.web.x33.beans.X33VViewJSPBean;

import eo.common.constant.JFUStrConst;
import eo.web.webview.FUW10701SF.FUW10701SFConst;

/**
 * eoスマートリンク申込画面アンケート出力部品です。
 * <br>
 * @author 富士通
 */
@SuppressWarnings("serial")
public class JFUSmartLinkEnqute extends X33VCustomTagBase
{

	/** eoスマートリンクアンケート内容定義ファイルパス取得キー */
	private static final String KEY_XML_FILE_PATH = "SMARTLINK_ENQUTE_DIFINITION_FILE_PATH";
	/** eoスマートリンクアンケート内容定義ファイル */
	private static final String XML_FILE_PATH = JFUWebCommon.getApplicationConst(KEY_XML_FILE_PATH);

	/** タグ名 */
	private static final String BEFORE_SETTINGS = "BEFORE-SETTINGS";
	/** タグ名 */
	private static final String AFTER_SETTINGS = "AFTER-SETTINGS";
	/** タグ名 */
	private static final String OUTPUT = "OUTPUT";
	/** タグ名 */
	private static final String QUESTION_SETTINGS = "QUESTION-SETTINGS";
	/** タグ名 */
	private static final String QUESTIONS = "QUESTIONS";
	/** タグ名 */
	private static final String QUESTION_TEXT = "QUESTION-TEXT";
	/** タグ名 */
	private static final String ANSER_SETTINGS = "ANSER-SETTINGS";
	/** タグ名 */
	private static final String TYPE = "TYPE";
	/** タグ名 */
	private static final String ANSERS = "ANSERS";
	/** タグ名 */
	private static final String LABEL = "LABEL";
	/** タグ名 */
	private static final String DEFAULT = "DEFAULT";
	/** タグ名 */
	private static final String VALUE = "VALUE";
	/** タグ名 */
	private static final String WITHTEXT = "WITHTEXT";
	/** タグ名 */
	private static final String COMMENT_SETTINGS = "COMMENT-SETTINGS";
	/** タグ名 */
	private static final String COMMENT_TEXT = "COMMENT-TEXT";
	/** タグ名 */
	private static final String CNGDATE = "CNGDATE";
	/** 属性名 */
	private static final String ATTR_ORDER = "ORDER";
	/** 属性名 */
	private static final String ATTR_DEST = "DEST";
	/** 値：FALSE */
	private static final String FALSE = "FALSE";
	/** TYPE：CHECKBOX */
	private static final String CHECKBOX = "CHECKBOX";
	/** TYPE：RADIO */
	private static final String RADIO = "RADIO";
	/** ANSERS_LIST */
	private static final String ANSERS_LIST = "ANSERS_LIST";
	/** マップ名 */
	private static final String ANSERS_ORDER = "ANSERS_ORDER";

	/** screen */
	private static final String FUW107010PJP = "FUW107010PJP";

	/**
	 * カスタムタグ開始処理を行います。
	 * <br>
	 * @throws	JspException JSPで発生する例外
	 * @return 処理結果
	 * @see javax.servlet.jsp.tagext.TagSupport#doStartTag()
	 */
	@SuppressWarnings("unchecked")
	@Override
	public int doStartTag() throws JspException
	{
		X33VViewJSPBean jspBean = getJspBean();

		// サービスフォームビーンのIDのリストが取得できない場合はタグを作成しない。
		if (null == jspBean.getServiceFormIdList() || 0 == jspBean.getServiceFormIdList().size())
		{
			return SKIP_BODY;
		}

		// サービスフォームビーンのIDを取得する。
		String serviceFormId = null;
		for (int i = 0; i < jspBean.getServiceFormIdList().size(); i++)
		{

			String sessionServiceFormId = (String)jspBean.getServiceFormIdList().get(i);
			if (sessionServiceFormId.startsWith(FUW107010PJP))
			{
				serviceFormId = sessionServiceFormId;
				break;
			}
		}

		// 運用日付を取得
		String replaceKey = JFUStrConst.SLASH + serviceFormId + JFUStrConst.SLASH + FUW10701SFConst.OPEDATE;
		Object opaDateObj =
				X33SDataBeanAccessWrapper.execJSPBeanAccess(null, jspBean, replaceKey, X33SDataBeanAccessWrapper.REQ_GET_VALUE,
						X33SDataBeanAccessWrapper.SUBKEY_VALUE, null);
		String opeDate = opaDateObj.toString();

		// XML取得
		Element root = null;
		try
		{
			root = getNodeList();
		}
		catch (ParserConfigurationException e)
		{
			DEBUG_LOG.debug("★★★★★eoスマートリンク申込アンケート内容出力部品(JFUSmartLinkEnqute) xml取得時にParserConfigurationException発生★★★★★");
			return SKIP_BODY;
		}
		catch (SAXException e)
		{
			DEBUG_LOG.debug("★★★★★eoスマートリンク申込アンケート内容出力部品(JFUSmartLinkEnqute) xml取得時にSAXException発生★★★★★");
			return SKIP_BODY;
		}
		catch (IOException e)
		{
			DEBUG_LOG.debug("★★★★★eoスマートリンク申込アンケート内容出力部品(JFUSmartLinkEnqute) xml取得時にIOException発生★★★★★");
			return SKIP_BODY;
		}

		ArrayList<ArrayList<HashMap<String, Object>>> anserInfoMap = new ArrayList<ArrayList<HashMap<String, Object>>>();
		ArrayList<ArrayList<HashMap<String, Object>>> commentInfoMap = new ArrayList<ArrayList<HashMap<String, Object>>>();
		ArrayList<ArrayList<HashMap<String, Object>>> comInfoMap = new ArrayList<ArrayList<HashMap<String, Object>>>();
		// xmlより、アンケート内容取得
		boolean retFlg = getXmlInfo(root, anserInfoMap, commentInfoMap, comInfoMap, opeDate);
		if (!retFlg)
		{
			DEBUG_LOG.debug("★★★★★eoスマートリンク申込アンケート内容出力部品(JFUSmartLinkEnqute) xml定義内容により、アンケートを表示しない★★★★★");
			return SKIP_BODY;
		}

		// アンケート見出し編集
		setEnquteMidasi();

		// 設問単位の繰り返し処理
		for (int i = 0; i < comInfoMap.size(); i++)
		{

			// 設問文を編集する。
			ArrayList<HashMap<String, Object>> comItemList = comInfoMap.get(i);
			outputHtml("<ul>" + comItemList.get(0).get(QUESTION_TEXT).toString() + "</ul>" + JFUStrConst.RETURN_CODE);

			// 回答の選択肢表示用に表組みを編集する
			outputHtml("<table>" + JFUStrConst.RETURN_CODE);

			// 回答の編集を行う。
			ArrayList<HashMap<String, Object>> anserItemList = anserInfoMap.get(i);

			for (int j = 0; j < anserItemList.size(); j++)
			{
				HashMap<String, Object> anserItemMap = anserItemList.get(j);
				ArrayList<HashMap<String, Object>> ansersMapList = (ArrayList<HashMap<String, Object>>)anserItemMap.get(ANSERS_LIST);

				boolean chkFlg = false;
				String keepWithText = null;

				for (int k = 0; k < ansersMapList.size(); k++)
				{
					HashMap<String, Object> ansersMap = ansersMapList.get(k);

					// 回答編集
					editAnswer(ansersMapList, anserItemMap, ansersMap, keepWithText, chkFlg);
					
				}

			}

			// 回答用のフォーマットを作成完了するため、以下のタグを出力する。
			outputHtml("</table>" + JFUStrConst.RETURN_CODE);

			// コメント文を編集する。
			ArrayList<HashMap<String, Object>> commentItemList = commentInfoMap.get(i);
			for (int k = 0; k < commentItemList.size(); k++)
			{
				outputHtml("<ul>" + commentItemList.get(k).get(COMMENT_TEXT).toString() + "</ul>" + JFUStrConst.RETURN_CODE);
			}
		}

		// アンケート粋の終了タグを編集
		setEnquteEnd();

		return SKIP_BODY;
	}

	/**
	 * xml取得
	 * <br/>
	 * アンケート内容を定義しているxmlを取得します。
	 * 
	 * @return エレメント
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 * @throws IOException
	 */
	private Element getNodeList() throws ParserConfigurationException, SAXException, IOException
	{
		// XMLパース
		DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
		Document doc = builder.parse(new File(XML_FILE_PATH));

		return doc.getDocumentElement();
	}

	/**
	 * xml読み込み
	 * <br/>
	 * アンケート内容を定義しているxmlを読み込み、保持したマップを返却します。
	 * 
	 * @param root 設定元のプロパティファイル内容
	 * @param anserInfoMap 回答情報保持マップ
	 * @param commentInfoMap コメント情報保持マップ
	 * @param comInfoMap 共通情報保持マップ
	 * @param opeDate 運用日付 
	 * @return boolean true:アンケート出力する / false:アンケート出力しない
	 */
	private boolean getXmlInfo(Element root, 
			ArrayList<ArrayList<HashMap<String, Object>>> anserInfoMap,
			ArrayList<ArrayList<HashMap<String, Object>>> commentInfoMap, 
			ArrayList<ArrayList<HashMap<String, Object>>> comInfoMap, 
			String opeDate)
	{
		String txtQuestion = JFUStrConst.EMPTY;
		String anserSettingDest = JFUStrConst.EMPTY;
		String txtType = JFUStrConst.EMPTY;
		String txtLabel = JFUStrConst.EMPTY;
		String txtDefalut = JFUStrConst.EMPTY;
		String txtValue = JFUStrConst.EMPTY;
		String txtWithText = JFUStrConst.EMPTY;
		String txtCommentText = JFUStrConst.EMPTY;

		NodeList tempNodeList = null;
		Element tempElement = null;

		// 適用するアンケート情報の判定
		tempNodeList = root.getElementsByTagName(CNGDATE);
		tempElement = (Element)tempNodeList.item(0);
		String chkDateValue = getItemContent(tempElement);

		if (JFUWebCommon.isNull(chkDateValue))
		{
			return false;
		}

		String settings = AFTER_SETTINGS;
		if (JFUWebCommon.checkDate(chkDateValue, 8))
		{
			// 適用するアンケート情報の判定
			// (chkDateValue < opeDate) < 0
			// (chkDateValue = opeDate) = 0
			// (chkDateValue > opeDate) > 0
			if (chkDateValue.compareTo(opeDate) > 0)
			{
				settings = BEFORE_SETTINGS;
			}
		}
		
		// BEFORE-SETTINGS OR AFTER-SETTINGS を取得
		tempNodeList = root.getElementsByTagName(settings);
		tempElement = (Element)tempNodeList.item(0);

		NodeList childNodes = tempElement.getChildNodes();

		// 取得できない場合、falseを返却
		if (childNodes.getLength() == 0)
		{
			return false;
		}
		
		for (int i = 0; i < childNodes.getLength(); i++)
		{
			DEBUG_LOG.debug("★★★★★settings★★★★★(" + String.valueOf(i) + ")" + childNodes.item(i).getNodeName());

			// アンケートを表示するか否かを判断する
			if (OUTPUT.equals(childNodes.item(i).getNodeName()))
			{
				tempElement = (Element)childNodes.item(i);
				String chkOutputValue = getItemContent(tempElement);

				if (JFUWebCommon.isNull(chkOutputValue))
				{
					return false;
				}

				if (chkOutputValue.equals(FALSE))
				{
					return false;
				}
			}

			// QUESTION-SETTING を取得
			if (QUESTION_SETTINGS.equals(childNodes.item(i).getNodeName()))
			{
				// QUESTIONS を取得
				Element questionSettings = (Element)childNodes.item(i);
				NodeList questionsNodeList = questionSettings.getElementsByTagName(QUESTIONS);

				// ★説問ごとの編集開始--------------------------------

				int questCnt = 1;
				for (int j = 0; j < questionsNodeList.getLength(); j++)
				{
					DEBUG_LOG.debug("★★★★★questionsNodeList★★★★★(" + String.valueOf(j) + ")" + questionsNodeList.item(j).getNodeName());

					// ★共通マップ定義
					ArrayList<HashMap<String, Object>> comItemList = new ArrayList<HashMap<String, Object>>();
					
					Element questionElement = null;
					while (questionElement == null)
					{
						String orderNo = JFUWebCommon.fillZero(String.valueOf(questCnt), 3, false);

						// QUESTIONS ORDER = '001' から順に取得
						questionElement = getElement(questionSettings, QUESTIONS, ATTR_ORDER, orderNo);

						questCnt += 1;
					}

					// 設問
					tempNodeList = questionElement.getElementsByTagName(QUESTION_TEXT);
					tempElement = (Element)tempNodeList.item(0);
					txtQuestion = getItemContent(tempElement);

					// ★ANSERマップ定義
					ArrayList<HashMap<String, Object>> anserItemList = new ArrayList<HashMap<String, Object>>();

					// ANSER_SETTINGS を取得
					NodeList anserSettings = questionElement.getElementsByTagName(ANSER_SETTINGS);

					int ansNo = 1;
					for (int k = 0; k < anserSettings.getLength(); k++)
					{
						DEBUG_LOG.debug("★★★★★anserSettings★★★★★(" + String.valueOf(k) + ")" + anserSettings.item(k).getNodeName());

						Element anserElement = null;
						String orderAnsNo = null;
						while (anserElement == null)
						{
							orderAnsNo = JFUWebCommon.fillZero(String.valueOf(ansNo), 3, false);

							// ANSER_SETTINGS ORDER = '001' から順に取得
							anserElement = getElement(questionElement, ANSER_SETTINGS, ATTR_ORDER, orderAnsNo);

							ansNo += 1;
						}

						// DEST
						anserSettingDest = anserElement.getAttribute(ATTR_DEST);

						// TYPE を取得
						tempNodeList = anserElement.getElementsByTagName(TYPE);
						tempElement = (Element)tempNodeList.item(0);
						txtType = getItemContent(tempElement);

						// ANSERS を取得
						NodeList ansers = anserElement.getElementsByTagName(ANSERS);

						// ★ANSERSマップ定義
						ArrayList<HashMap<String, Object>> ansersList = new ArrayList<HashMap<String, Object>>();

						int aNo = 1;
						for (int n = 0; n < ansers.getLength(); n++)
						{
							DEBUG_LOG.debug("★★★★★ansers★★★★★(" + String.valueOf(n) + ")" + ansers.item(n).getNodeName());

							Element ansersElement = null;
							String ansersNo = null;
							while (ansersElement == null)
							{
								ansersNo = JFUWebCommon.fillZero(String.valueOf(aNo), 3, false);

								// ANSERS ORDER = '001' から順に取得
								ansersElement = getElement(anserElement, ANSERS, ATTR_ORDER, ansersNo);

								aNo += 1;
							}
							
							// LABEL を取得
							tempNodeList = ansersElement.getElementsByTagName(LABEL);
							tempElement = (Element)tempNodeList.item(0);
							txtLabel = getItemContent(tempElement);

							// DEFAULT を取得
							tempNodeList = ansersElement.getElementsByTagName(DEFAULT);
							tempElement = (Element)tempNodeList.item(0);
							txtDefalut = getItemContent(tempElement);

							// VALUE を取得
							tempNodeList = ansersElement.getElementsByTagName(VALUE);
							tempElement = (Element)tempNodeList.item(0);
							txtValue = getItemContent(tempElement);

							// WITHTEXT を取得
							tempNodeList = ansersElement.getElementsByTagName(WITHTEXT);
							tempElement = (Element)tempNodeList.item(0);
							txtWithText = getItemContent(tempElement);

							HashMap<String, Object> ansersMap = new HashMap<String, Object>();
							ansersMap.put(TYPE, txtType);
							ansersMap.put(LABEL, txtLabel);
							ansersMap.put(DEFAULT, txtDefalut);
							ansersMap.put(VALUE, txtValue);
							ansersMap.put(WITHTEXT, txtWithText);
							ansersMap.put(ATTR_ORDER, orderAnsNo);
							ansersMap.put(ANSERS_ORDER, ansersNo);
							ansersList.add(ansersMap);
						}
						// ★ANSERマップに編集
						HashMap<String, Object> anserItemMap = new HashMap<String, Object>();
						anserItemMap.put(ATTR_DEST, anserSettingDest);
						anserItemMap.put(ANSERS_LIST, ansersList);
						anserItemList.add(anserItemMap);
					}

					// ★COMMENT_SETTINGSマップ定義
					ArrayList<HashMap<String, Object>> commentItemList = new ArrayList<HashMap<String, Object>>();

					// COMMENT_SETTINGS を取得
					NodeList commentSettings = questionElement.getElementsByTagName(COMMENT_SETTINGS);

					int oComNo = 1;
					for (int comCnt = 0; comCnt < commentSettings.getLength(); comCnt++)
					{
						DEBUG_LOG.debug("★★★★★commentSettings★★★★★(" + String.valueOf(comCnt) + ")" + commentSettings.item(comCnt).getNodeName());

						Element commentSettingElement = null;
						while (commentSettingElement == null)
						{
							String orderComNo = JFUWebCommon.fillZero(String.valueOf(oComNo), 3, false);

							// COMMENT_SETTINGS ORDER = '001' から順に取得
							commentSettingElement = getElement(questionElement, COMMENT_SETTINGS, ATTR_ORDER, orderComNo);

							oComNo += 1;
						}
						
						// COMMENT-TEXT を取得
						tempNodeList = commentSettingElement.getElementsByTagName(COMMENT_TEXT);
						tempElement = (Element)tempNodeList.item(0);
						txtCommentText = getItemContent(tempElement);

						// ★COMMENT_SETTINGSマップに編集
						HashMap<String, Object> commentItemMap = new HashMap<String, Object>();
						commentItemMap.put(COMMENT_TEXT, txtCommentText);
						commentItemList.add(commentItemMap);
					}

					// ★共通マップに編集
					HashMap<String, Object> comItemMap = new HashMap<String, Object>();
					comItemMap.put(QUESTION_TEXT, txtQuestion);
					comItemList.add(comItemMap);

					// ★返却用ANSERマップ
					anserInfoMap.add(anserItemList);
					// ★返却用COMMENT_SETTINGSマップ
					commentInfoMap.add(commentItemList);
					// ★返却用共通マップ
					comInfoMap.add(comItemList);
				}
				
				// ★説問ごとの編集終了--------------------------------

				break;
			}
		}
		
		// ANSERマップが0件の場合、表示項目なしの為、falseを返却
		if (JFUWebCommon.isNull(anserInfoMap) || anserInfoMap.size() == 0)
		{
			return false;
		}

		return true;
	}

	/**
	 * アンケート見出し編集
	 * <br/>
	 * アンケート見出し編集を行ないます。
	 * 
	 * @throws JspException 例外
	 */
	private void setEnquteMidasi() throws JspException
	{
		outputHtml("<div class=\"mt40\" id=\"disp_address\">" + JFUStrConst.RETURN_CODE);
		outputHtml("<h2>アンケートへのご協力をお願いいたします</h2>" + JFUStrConst.RETURN_CODE);
		outputHtml("<div class=\"article\">" + JFUStrConst.RETURN_CODE);
		outputHtml("<div id=\"enquete_err\" class=\"MessageMain\">" + JFUStrConst.RETURN_CODE);
		outputHtml("<div class=\"message\"><span></span></div>" + JFUStrConst.RETURN_CODE);
		outputHtml("</div>" + JFUStrConst.RETURN_CODE);
		outputHtml("</div>" + JFUStrConst.RETURN_CODE);
		outputHtml("<div class=\"mt_em\"></div>" + JFUStrConst.RETURN_CODE);
		outputHtml("<div class=\"article\">" + JFUStrConst.RETURN_CODE);
		outputHtml("<ul>" + JFUStrConst.RETURN_CODE);
		outputHtml("今後の弊社サービス向上の参考とさせていただくため、よろしければアンケートのご協力にお願いいたします。<br/>" + JFUStrConst.RETURN_CODE);
		outputHtml("本アンケートにお答えいただいた情報は本アンケートの目的以外に使用いたしません。" + JFUStrConst.RETURN_CODE);
		outputHtml("</ul>" + JFUStrConst.RETURN_CODE);
	}

	/**
	 * アンケート粋の終了タグを編集
	 * <br/>
	 * アンケート粋の終了タグ編集を行ないます。
	 * 
	 * @throws JspException 例外
	 */
	private void setEnquteEnd() throws JspException
	{
		outputHtml("</div>" + JFUStrConst.RETURN_CODE);
		outputHtml("</div>" + JFUStrConst.RETURN_CODE);
	}

	/**
	 * 回答編集
	 * <br/>
	 * 回答編集を行ないます。
	 * 
	 * @param ansersMapList アンケート回答を保持したマップ 
	 * @param anserItemMap アンケート回答を保持したマップ 
	 * @param ansersMap アンケート回答を保持したマップ
	 * @param keepWithText 保持しているテキスト文言
	 * @param chkFlg テキスト文言チェック有無を保持 true:チェック済 / false:チェックまだ
	 * @throws JspException 例外
	 */
	private void editAnswer(ArrayList<HashMap<String, Object>> ansersMapList,
			HashMap<String, Object> anserItemMap, 
			HashMap<String, Object> ansersMap,
			String keepWithText,
			boolean chkFlg) throws JspException
	{
		if (CHECKBOX.equals(ansersMap.get(TYPE)))
		{
			if (JFUWebCommon.isNull(ansersMap.get(WITHTEXT)))
			{
				outputHtml("<tr>" + JFUStrConst.RETURN_CODE);
				outputHtml("<td>" + JFUStrConst.RETURN_CODE);
				outputHtml("<label>" + JFUStrConst.RETURN_CODE);
				outputHtml("<input type=\"checkbox\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" id=\"chkbox_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" name=\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" onClick='doCheckBox(this" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(DEFAULT).toString() + "\");' />");
				outputHtml("&nbsp;");
				outputHtml(ansersMap.get(LABEL).toString() + JFUStrConst.RETURN_CODE);
				outputHtml("</label>" + JFUStrConst.RETURN_CODE);
				outputHtml("</td>" + JFUStrConst.RETURN_CODE);
				outputHtml("</tr>" + JFUStrConst.RETURN_CODE);
			}
			else
			{
				outputHtml("<tr>" + JFUStrConst.RETURN_CODE);
				outputHtml("<td>" + JFUStrConst.RETURN_CODE);
				outputHtml("<label>" + JFUStrConst.RETURN_CODE);
				outputHtml("<input type=\"checkbox\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" id=\"chkbox_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" name=\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" onClick='doCheckBoxWithText(this" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(DEFAULT).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"text_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(WITHTEXT).toString() + "\");' />");
				outputHtml("&nbsp;");
				outputHtml(ansersMap.get(LABEL).toString() + JFUStrConst.RETURN_CODE);
				outputHtml("</label>");
				outputHtml(JFUStrConst.RETURN_CODE);
				outputHtml("<div class = \"anquteExampleText\"><input type=\"text\" size=\"80\" maxlength=\"40\" value=\"\"" + JFUStrConst.RETURN_CODE);
				outputHtml("id=\"text_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml("name=\"" + ansersMap.get(WITHTEXT).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml("onblur='doTextBox(this" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(WITHTEXT).toString() + "\");' /></div>" + JFUStrConst.RETURN_CODE);
				outputHtml("</td>" + JFUStrConst.RETURN_CODE);
				outputHtml("</tr>" + JFUStrConst.RETURN_CODE);
			}
		}
		else if (RADIO.equals(ansersMap.get(TYPE)))
		{
			// ANSER要素配下のWITHTEXT要素を全て読み、テキスト入力が存在する(空以外があるか)かチェックする。
			// テキスト入力が存在する場合は、その内容を保持しておく。
			if (!chkFlg)
			{
				for (int comCnt = 0; comCnt < ansersMapList.size(); comCnt++)
				{
					HashMap<String, Object> ansersChkMap = ansersMapList.get(comCnt);

					if (!JFUWebCommon.isNull(ansersChkMap.get(WITHTEXT)))
					{
						keepWithText = ansersChkMap.get(WITHTEXT).toString();
					}
				}
				chkFlg = true;
			}

			// 上記でテキスト入力が存在しない場合、以下の回答編集を行う。
			if (JFUWebCommon.isNull(keepWithText))
			{
				outputHtml("<tr>" + JFUStrConst.RETURN_CODE);
				outputHtml("<td>" + JFUStrConst.RETURN_CODE);
				outputHtml("<label>" + JFUStrConst.RETURN_CODE);
				outputHtml("<input type=\"radio\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" id=\"radio_" + ansersMap.get(ATTR_ORDER).toString() + "_" + ansersMap.get(ANSERS_ORDER).toString() + "\""
						+ JFUStrConst.RETURN_CODE);
				outputHtml(" name=\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" value=\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(" onClick='doRadio(this" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
				outputHtml(",\"" + ansersMap.get(VALUE).toString() + "\");' />" + JFUStrConst.RETURN_CODE);
				outputHtml(JFUStrConst.RETURN_CODE);
				outputHtml(ansersMap.get(LABEL).toString() + JFUStrConst.RETURN_CODE);
				outputHtml("</label>" + JFUStrConst.RETURN_CODE);
				outputHtml("</td>" + JFUStrConst.RETURN_CODE);
				outputHtml("</tr>" + JFUStrConst.RETURN_CODE);
			}
			else
			{
				// テキスト入力がない(ANSER-SETTINGS[n]#ANSERS[n]#WITHTEXTが空)場合、以下のラジオボタンを編集する。
				if (JFUWebCommon.isNull(ansersMap.get(WITHTEXT)))
				{
					outputHtml("<tr>" + JFUStrConst.RETURN_CODE);
					outputHtml("<td>" + JFUStrConst.RETURN_CODE);
					outputHtml("<label>" + JFUStrConst.RETURN_CODE);
					outputHtml("<input type=\"radio\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" id=\"radio_" + ansersMap.get(ATTR_ORDER).toString() + "_" + ansersMap.get(ANSERS_ORDER).toString()
							+ "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" name=\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" value=\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" onClick='doRadioWithText(this" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"text_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",false" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + keepWithText + "\");' />" + JFUStrConst.RETURN_CODE);
					outputHtml(JFUStrConst.RETURN_CODE);
					outputHtml(ansersMap.get(LABEL).toString() + JFUStrConst.RETURN_CODE);
					outputHtml("</label>" + JFUStrConst.RETURN_CODE);
					outputHtml("</td>" + JFUStrConst.RETURN_CODE);
					outputHtml("</tr>" + JFUStrConst.RETURN_CODE);
				}
				else
				{
					// テキスト入力がある(ANSER-SETTINGS[n]#ANSERS[n]#WITHTEXTが空でない)場合、以下のラジオボタン等を編集する。
					outputHtml("<tr>" + JFUStrConst.RETURN_CODE);
					outputHtml("<td>" + JFUStrConst.RETURN_CODE);
					outputHtml("<label>" + JFUStrConst.RETURN_CODE);
					outputHtml("<input type=\"radio\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" id=\"radio_" + ansersMap.get(ATTR_ORDER).toString() + "_" + ansersMap.get(ATTR_ORDER).toString()
							+ "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" name=\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" value=\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" onClick='doRadioWithText(this" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + anserItemMap.get(ATTR_DEST).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + ansersMap.get(VALUE).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"text_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(",true" + JFUStrConst.RETURN_CODE);
					outputHtml(",\"" + keepWithText + "\");' />" + JFUStrConst.RETURN_CODE);
					outputHtml(JFUStrConst.RETURN_CODE);
					outputHtml(ansersMap.get(LABEL).toString() + JFUStrConst.RETURN_CODE);
					outputHtml("</label>");
					outputHtml("<div class = \"anquteExampleText\"><input type=\"text\" size=\"80\" maxlength=\"40\" value=\"\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" id=\"text_" + ansersMap.get(ATTR_ORDER).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" name=\"" + ansersMap.get(WITHTEXT).toString() + "\"" + JFUStrConst.RETURN_CODE);
					outputHtml(" onblur='doTextBox(this,\"" + ansersMap.get(WITHTEXT).toString() + "\");' /></div>"
							+ JFUStrConst.RETURN_CODE);
					outputHtml("</td>" + JFUStrConst.RETURN_CODE);
					outputHtml("</tr>" + JFUStrConst.RETURN_CODE);
				}
			}
		}

	}
	
	
	/**
	 * エレメント取得処理
	 * <br/>
	 * エレメント取得処理を行ないます。
	 * 
	 * @param root エレメント
	 * @param tagName 要素
	 * @param attr 属性
	 * @param attrName 属性の値
	 * @return 取得したエレメント
	 */
	private Element getElement(Element root, String tagName, String attr, String attrName)
	{
		NodeList repairRootList = root.getElementsByTagName(tagName);
		Element repairRoot = null;

		for (int i = 0; i < repairRootList.getLength(); i++)
		{
			repairRoot = (Element)repairRootList.item(i);

			if (JFUWebCommon.isNull(attr))
			{
				break;
			}

			if (attrName.equals(repairRoot.getAttribute(attr)))
			{
				break;
			}

			// 一致する定義がない場合、NULLを設定
			repairRoot = null;
		}

		return repairRoot;
	}

	/**
	 * エレメントより値を取得
	 * <br/>
	 * エレメントより値を取得します。取得できない場合は空を返します。
	 * 
	 * @param tempElement エレメント
	 * @return 取得した値
	 */
	private String getItemContent(Element tempElement)
	{
		if (tempElement == null)
		{
			return JFUStrConst.EMPTY;
		}

		return tempElement.getTextContent();
	}

	/**
	 * JSPビーン取得
	 * <br/>
	 * JSPビーンを取得します。
	 * 
	 * @return X33VViewJSPBean JSPビーン
	 * @throws JspException 例外
	 */
	private X33VViewJSPBean getJspBean() throws JspException
	{

		// JSPビーンを取得する（取得できなかったらエラーを投げる）
		X33VViewJSPBean jspBean = null;

		DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
		HttpServletRequest request = ((HttpDispatchContext)context).getServletRequest();

		Object areaIdObj = request.getAttribute("nextPageAreaId");

		if (areaIdObj != null && areaIdObj instanceof String)
		{
			jspBean = (X33VViewJSPBean)context.getResponseBean((String)areaIdObj);
		}
		if (jspBean == null)
		{
			DEBUG_LOG.debug("★★★★★eoスマートリンク申込アンケート内容出力部品(JFUSmartLinkEnqute) データビーン未取得エラー★★★★★");
			throwJspException("データビーンを取得できません。");
		}
		return jspBean;
	}

	/**
	 * エラー処理
	 * <br/>
	 * テンプレート定義に記述した画面定義に誤りがある場合、ログを出力してエラー画面に
	 * なります。ログには引数で指定したエラーメッセージが出力されます。 
	 *
	 * @param  errormsg エラーメッセージ
	 * @throws JspException 例外
	 */
	private void throwJspException(String errormsg) throws JspException
	{

		// テンプレートに記載した画面定義に誤りがある場合、警告ログを出力しエラーを投げる
		JspException se = new JspException(errormsg);
		X33SErrorLog.outputSystemError(this.getClass(), se, DispatchContextFactory.getInstance().getHttpDispatchContext());
		throw se;
	}

}
