/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCFrontCommonHeader
*   ソースファイル名：JCCFrontCommonHeader.java
*   作成者          ：富士通
*   日付            ：2011年08月01日
*＜機能概要＞
*   フロント画面ヘッダ出力拡張タグクラスです
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v1.00.00    2011/08/01   FJ          新規作成
*   v41.00		2019/03/08   FJ) 澤田	【ANK-3534-00-00】社名変更対応の資料連携について
*   v53.00		2021/04/21   FJ) 岡井	【ANK-3952-00-00】一般Web画面の挙動改善
**********************************************************************/

package eo.web.webview.common;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;

import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
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.X33VCustomTagBase;
import com.fujitsu.futurity.web.x33.beans.X33VDataTypeList;
import com.fujitsu.futurity.web.x33.beans.X33VViewJSPBean;

@SuppressWarnings("serial")
public class JCCFrontCommonHeader extends X33VCustomTagBase 
{
	/**  metaタグのKeywords属性に設定する内容 */
	private String keywords = EMPTY;

	/**  metaタグのDescription属性に設定する内容 */
	private String description = EMPTY;

	/**  タイトルタグの設定値 */
	private String title = EMPTY;

	/** 拡張タグ表示モード */
	private String mode = EMPTY;

	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
	/** 表示区分 */
	private String dsp_kbn = EMPTY;
	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

	/** requestAttribute */
	private String W_SESSION_NEXT_PAGE_AREA_ID = "nextPageAreaId";

	/**
	 * keywordsフィールドのセッターメソッド
	 * @param keywords keywords属性
	 */
	public void setKeywords(String keywords) 
	{
		this.keywords = keywords;
	}

	/**
	 * Descriptionフィールドのセッターメソッド
	 * @param description description属性
	 */
	public void setDescription(String description)
	{
		this.description = description;
	}

	/**
	 * titleフィールドのセッターメソッド
	 * @param title title属性
	 */
	public void setTitle(String title)
	{
		this.title = title;
	}

	/**
	 * modeフィールドのセッターメソッド
	 * @param mode mode属性
	 */
	public void setMode(String mode)
	{
		this.mode = mode;
	}

	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
	/**
	 * dsp_kbnフィールドのセッターメソッド
	 * @param dsp_kbn dsp_kbn属性
	 */
	public void setDsp_kbn(String dsp_kbn)
	{
		this.dsp_kbn = dsp_kbn;
	}
	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

	/** キャラクターセット */
	public static final String CHARSET = "UTF-8";

	/** メッセージリストのテンプレートID */
	public static final String TEMPLATE_ID = "TagTemplate001";

	/** メッセージリストのメッセージIDの項目ID */
	public static final String MSG_ID = "MESSAGE_ID";

	/** メッセージリストのメッセージの項目ID */
	public static final String MSG = "MESSAGE";

	/** メッセージリストの項目IDの項目ID */
	public static final String ITEM_ID = "ITEM_ID";

	/** フロント区分の項目ID */
	public static final String FRONT_KBN = "FU_KBN";

	/** 遷移先画面IDの項目ID */
	public static final String NEXT_SCREEN_ID = "NEXT_SCREEN_ID";

	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
	/** 表示区分：PC */
	private static final String DSP_KBN_PC = "0";

	/** 表示区分：スマートフォン */
	private static final String DSP_KBN_SMART_PHONE = "1";

	/** 表示区分：UQ新規作成画面 */
	private static final String DSP_KBN_UQ_NEW = "2";

	/** 表示区分：UQ既存画面(入力項目無し) */
	private static final String DSP_KBN_UQ_KZN = "3";

	/** 表示区分：UQ既存画面(入力項目有り) */
	private static final String DSP_KBN_UQ_KZN_IN = "4";
	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */

	/** プロパティ値取得キー：フロント区分定義 */
	private static final String APL_CONST_DEFAULT_FRONT_KBN = "DEFAULT_FRONT_KBN";

	/** プロパティ値取得キー：デフォルトのCSSパス定義 */
	private static final String APL_CONST_CSS_PATH = "_CSS_PATH";

	/** プロパティ値取得キー：デフォルトのCSSリスト定義 */
	private static final String APL_CONST_CSS_LIST = "CSS_LIST";

	/** プロパティ値取得キー：スマホ用CSSパス定義 */
	private static final String APL_CONST__SP_CSS_PATH = "_SP_CSS_PATH";

	/** プロパティ値取得キー：スマホ用CSSリスト定義 */
	private static final String APL_CONST_SP_CSS_LIST = "SP_CSS_LIST";

	/** プロパティ値取得キー：デフォルトの共通CSSパス定義 */
	private static final String APL_CONST_COMMON_CSS_PATH = "COMMON_CSS_PATH";

	/** プロパティ値取得キー：UQ既存画面用CSSリスト定義 */
	private static final String APL_CONST_WMX_DSP_CSS_LIST = "WMX_DSP_CSS_LIST";

	/** プロパティ値取得キー：UQ新規画面用CSSリスト定義 */
	private static final String APL_CONST_WMX_CSS_LIST = "WMX_CSS_LIST";

	/** スラッシュ */
	private static final String HALF_SLASH = "/";

	/** 半角コンマ */
	private static final String HALF_COMMA = ",";

	/** 半角セミコロン */
	private static final String HALF_SEMICOLON = ";";

	/** 空文字 */
	public static final String EMPTY = "";

	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */

	/** フロント区分：一般WEB */
	public static final String FU_KBN_N = "N";

	/** フロント区分：量販訪販WEB */
	public static final String FU_KBN_R = "R";

	/** 画面論理ID：一般WEB(FUW001) */
	public static final String FUW001 = "FUW001";

	/** 画面論理ID：量販訪販WEB(FUW009) */
	public static final String FUW009 = "FUW009";

	@Override
	public int doStartTag() throws JspException
	{
		try 
		{
			/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
			// 属性値のチェックを実施
			chkAttributeValue();
			/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

			// コンテキストルートの取得
			String root = ((HttpServletRequest)pageContext.getRequest()).getContextPath();

			// metaタグの出力
			outputMetaData();

			// titleタグの出力
			outputHtml("<title>" + title + "</title>" + "\n");

			// JavaScriptファイル読み込み用<script>タグの出力
			outputJS(root);

// 2011/09/30 システムエラー画面時もCSSファイルを読み込む start
			// CSSファイルの読込み部の出力
			outputCSS();

			// 表示モードがSYSTEMの場合、metaタグ出力、JS読み込みで処理を中断する。
			if (null != mode && "SYSTEM".equals(mode))
			{
				return SKIP_BODY;
			}
// 2011/09/30 システムエラー画面時もCSSファイルを読み込む end

			// pageに直接組み込むJavaScriptの出力(メッセージ等)
			outputPageIncludeJS();
		}
		catch(Exception e)
		{
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), e, null, null, null);
			throw new JspException();
		}

		return SKIP_BODY;
	}

	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
	/**
	 * 属性値のチェックを実施する。
	 * @throws JspException 例外
	 */
	private void chkAttributeValue() throws JspException 
	{

		// 表示区分の値チェック
		if(!isNull(this.dsp_kbn))
		{

	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */
			// 処理対象リスト(0:PC,1:スマートフォン,2:,3,4)
			List<String> dspKbnList = Arrays.asList(DSP_KBN_PC, DSP_KBN_SMART_PHONE, DSP_KBN_UQ_NEW, DSP_KBN_UQ_KZN, DSP_KBN_UQ_KZN_IN);
	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 end ++++++++++ */

			// 処理対象外の場合、例外とする
			if (!dspKbnList.contains(this.dsp_kbn))
			{
				throw new JspException();
			}
		}
	}
	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

	/**
	 * meta情報を出力する。
	 * @throws JspException JSP例外
	 */
	private void outputMetaData() throws JspException
	{
		// 20111006 fst)yanagihara アプリケーションプロパティよりcharsetを取得
		String charset = JCMAPLConstMgr.getString("DEFAULT_CHARSET");
		if (isNull(charset))
		{
			charset = CHARSET;
		}

		outputHtml("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=" + charset +"\" />" + "\n");
		outputHtml("<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\" />" + "\n");
		outputHtml("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />" + "\n");
		outputHtml("<meta http-equiv=\"Pragma\" content=\"no-cache\" />" + "\n");
		outputHtml("<meta http-equiv=\"Cache-Control\" content=\"no-cache\" />" + "\n");
		outputHtml("<meta http-equiv=\"Expires\" content=\"-1\" />" + "\n");
		outputHtml("<meta http-equiv=\"imagetoolbar\" content=\"no\" />" + "\n");

// 20130201 fst)yanagihara IE10対応 start
		String emulateMode = JCMAPLConstMgr.getString("COMPATIBLE_CONTENT");
		if(emulateMode != null)
		{
			outputHtml("<meta http-equiv=\"X-UA-Compatible\" content=\"" + emulateMode + "\" />" + "\n");
		}
// 20130201 fst)yanagihara IE10対応 end
		/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */
		if (DSP_KBN_SMART_PHONE.equals(this.dsp_kbn))
		{
			outputHtml("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, min-scale=1.0, maximum-scale=1.0, user-scalable=no\" />" + "\n");
		}
		/* ++++++++++ 2013/02/22 050IP電話アプリ対応 end ++++++++++ */
		outputHtml("<meta name=\"Keywords\" content=\""+ keywords +"\" />" + "\n");
		outputHtml("<meta name=\"Description\" content=\""+ description +"\" />" + "\n");
		outputHtml("<meta name=\"author\" content=\"株式会社オプテージ\" />" + "\n");
		outputHtml("<meta name=\"copyright\" content=\"Copyright OPTAGE Inc. All Rights Reserved\" />" + "\n");
		outputHtml("<meta name=\"robots\" content=\"INDEX,FOLLOW\" />" + "\n");
	}

	/**
	 * JavaScriptファイルのscriptタグを出力する。
	 * @param root コンテキストルート
	 * @throws JspException JSP例外
	 */
	private void outputJS(String root) throws JspException {

		// フロント区分取得
		String frontKbn = null;
		try
		{
			frontKbn = getSFBeanData_String(TEMPLATE_ID, FRONT_KBN);
		}
		catch(Exception e)
		{
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
		}
		if (isNull(frontKbn))
		{
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
		}

		// 遷移先画面ID
		String nextScreenId = EMPTY;
		try
		{
			nextScreenId = getSFBeanData_String(TEMPLATE_ID, NEXT_SCREEN_ID);
		}
		catch(Exception e)
		{
			nextScreenId = EMPTY;
		}

	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */
	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */
		if (isNull(this.dsp_kbn) || DSP_KBN_PC.equals(this.dsp_kbn) || DSP_KBN_SMART_PHONE.equals(this.dsp_kbn))
		{
	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 end ++++++++++ */
			// 表示区分が設定されていない場合、または表示区分がPCの場合、通常の処理を実行
			outputHtml("<script src=\"" + root + "/js/jquery-1.5.1.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			
			// 2013/02/27 FST_mukuo)charCodeCheckerはインポートしない start
			//outputHtml("<script src=\"" + root + "/js/charCodeChecker.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			// 2013/02/27 FST_mukuo)charCodeCheckerはインポートしない end
			outputHtml("<script src=\"" + root + "/js/common.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
	/* ++++++++++ 2011/08/24 フロントのコントロールフレームレス対応 修正開始 ++++++++++ */
//			outputHtml("<script src=\""+ root +"/js/checkField.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			outputHtml("<script src=\"" + root + "/js/checkFieldF.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
	/* ++++++++++ 2011/08/24 フロントのコントロールフレームレス対応 修正終了 ++++++++++ */
			outputHtml("<script src=\"" + root + "/js/checkControl.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
	/* ++++++++++ 2013/01/29 印刷プレビュー時画像表示対応 修正開始 ++++++++++ */
			outputHtml("<script src=\"" + root + "/js/common/FUprint.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
	/* ++++++++++ 2013/01/29 印刷プレビュー時画像表示対応 修正終了 ++++++++++ */
			outputHtml("<script src=\"" + root + "/js/common/rollover.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			
			if((FU_KBN_N.equals(frontKbn) && nextScreenId.startsWith(FUW001)) || (FU_KBN_R.equals(frontKbn) && nextScreenId.startsWith(FUW009)))
			{
				// 一般WEB(FUW001)と量販訪販WEB(FUW009)が対象
				outputHtml("<script src=\"" + root + "/js/common/browserback.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			}
			
			outputHtml("<script src=\"" + root + "/js/common/FUcommon.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			outputHtml("<script src=\"" + root + "/js/focusCommon.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
	/* フロントメッセージ対応 START */
			outputHtml("<script src=\"" + root + "/js/message.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
	/* フロントメッセージ対応 END */
		}
		else if (DSP_KBN_UQ_NEW.equals(this.dsp_kbn))
		{
			// 表示区分がUQ新規作成画面の場合、以下の処理を実行
			
			// 2013/02/27 FST_mukuo)charCodeCheckerはインポートしない start
			//outputHtml("<script src=\"" + root + "/js/charCodeChecker.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			// 2013/02/27 FST_mukuo)charCodeCheckerはインポートしない end
			
			outputHtml("<script src=\"" + root + "/js/common.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			outputHtml("<script src=\"" + root + "/js/message.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		}
		else if (DSP_KBN_UQ_KZN.equals(this.dsp_kbn))
		{
			// 表示区分がUQ既存画面(入力項目無し)の場合、以下の処理を実行
			outputHtml("<script src=\"" + root + "/js/jquery-1.5.1.min.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			outputHtml("<script src=\"" + root + "/js/common.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			outputHtml("<script src=\"" + root + "/js/common/FUprint.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		}
		else if (DSP_KBN_UQ_KZN_IN.equals(this.dsp_kbn))
		{
			// 表示区分がUQ既存画面(入力項目有り)の場合、以下の処理を実行
			outputHtml("<script src=\"" + root + "/js/jquery-1.5.1.min.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
			outputHtml("<script src=\"" + root + "/js/common.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
			outputHtml("<script src=\"" + root + "/js/message.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		}
	/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

	}

	/**
	 * CSSファイルの読込み部の出力
	 * 
	 * <br>
	 * @throws JspException
	 */
	private void outputCSS() throws JspException
	{

// 2011/09/30 フロント区分取得時にExceptionが発生した場合は、固定のフロント区分を付与する。 start
		String frontKbn = null;
		try
		{
			// フロント区分取得
			frontKbn = getSFBeanData_String(TEMPLATE_ID, FRONT_KBN);
		}
		catch(Exception e)
		{
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
		}
// 2011/09/30 フロント区分取得時にExceptionが発生した場合は、固定のフロント区分を付与する。 end
		if (isNull(frontKbn))
		{
// 2012/02/15 フロント区分が取得できない場合は固定のフロント区分を付与する。 start
			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);
//			JSYwebLog.println(JSYwebLog.ERROR, getClass(), null, "BPCON0I002", new String[]{"フロント区分が取得できません。"}, null);
//			throw new JspException();
// 2012/02/15 フロント区分が取得できない場合は固定のフロント区分を付与する。 end
		}

		/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 start ++++++++++ */

		// CSSファイル情報の取得
		String cssFiles = null;
		if (isNull(this.dsp_kbn) || DSP_KBN_PC.equals(this.dsp_kbn))
		{
			// 表示区分が設定されていない場合、または表示区分がPCの場合、通常の処理を実行
			cssFiles = JCCWebCommon.getApplicationConst(APL_CONST_CSS_LIST);

	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 start ++++++++++ */
		}
		else if (DSP_KBN_SMART_PHONE.equals(this.dsp_kbn))
		{
			// 表示区分がスマートフォンの場合、以下の定義を取得
			cssFiles = JCCWebCommon.getApplicationConst(APL_CONST_SP_CSS_LIST);
	/* ++++++++++ 2013/02/22 050IP電話アプリ対応 end ++++++++++ */

		}
		else if (DSP_KBN_UQ_NEW.equals(this.dsp_kbn))
		{
			// 表示区分がUQ新規作成画面の場合、以下の定義を取得
			cssFiles = JCCWebCommon.getApplicationConst(APL_CONST_WMX_CSS_LIST);
		}
		else if (DSP_KBN_UQ_KZN.equals(this.dsp_kbn) || DSP_KBN_UQ_KZN_IN.equals(this.dsp_kbn))
		{
			// 表示区分がUQ既存画面(入力項目無し)またはUQ既存画面(入力項目有り)の場合、以下の定義を取得
			cssFiles = JCCWebCommon.getApplicationConst(APL_CONST_WMX_DSP_CSS_LIST);
		}

		/* ++++++++++ 2013/02/20 UQWiMAX白ロム申込における画面容量制限への対応 end ++++++++++ */

		if (isNull(cssFiles))
		{
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), null, "BPCON0I002", new String[]{"CSS_LISTが取得できません。"}, null);
			throw new JspException();
		}
		String[] temp = cssFiles.split(HALF_SEMICOLON);
		List<String> cssList = new ArrayList<String>();
		for (int i = 0; i < temp.length; i++)
		{
			cssList.add(temp[i].trim());
		}

		// common情報の取得
		String commonPathData = JCCWebCommon.getApplicationConst(APL_CONST_COMMON_CSS_PATH);
		// ファイル番号格納用
		List<String> commonFileNoList = new ArrayList<String>();
		// パス格納用
		String commonPath = EMPTY;

		if (isNull(commonPathData))
		{
			// commonの設定が無い場合、処理なし
		}
		else if (!EMPTY.equals(commonPathData) && !commonPathData.contains(HALF_SEMICOLON))
		{
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), null, "BPCON0I002", new String[]{"COMMON_CSS_PATHに\";\"が含まれていません。"}, null);
			throw new JspException();
		}
		else
		{
			temp = commonPathData.split(HALF_SEMICOLON);
			commonPath = getPath(temp[0]);
			String[] commonFileNos = temp[1].split(HALF_COMMA);
			for(int i = 0; i < commonFileNos.length; i++)
			{
				commonFileNoList.add(commonFileNos[i].trim());
			}
		}

		// フロント区分毎の情報
		String pathData = null;
		if(DSP_KBN_SMART_PHONE.equals(this.dsp_kbn))
		{
			pathData = JCCWebCommon.getApplicationConst(frontKbn + APL_CONST__SP_CSS_PATH);
		}
		else
		{
			pathData = JCCWebCommon.getApplicationConst(frontKbn + APL_CONST_CSS_PATH);
		}

		// ファイル番号格納用
		List<String> fileNoList = new ArrayList<String>();
		// パス格納用
		String path = EMPTY;
		if (isNull(pathData))
		{
			// 設定が無い場合、処理なし
		}
		else if (!EMPTY.equals(pathData) && !pathData.contains(HALF_SEMICOLON))
		{
			JSYwebLog.println(JSYwebLog.ERROR, getClass(), null, "BPCON0I002", new String[]{frontKbn + "_CSS_PATHに\";\"が含まれていません。"}, null);
			throw new JspException();
		}
		else
		{
			temp = pathData.split(HALF_SEMICOLON);
			path = getPath(temp[0]);
			String[] fileNos = temp[1].split(HALF_COMMA);
			for (int i = 0; i < fileNos.length; i++)
			{
				String tmpStr = fileNos[i].trim();
				if (!commonFileNoList.contains(tmpStr))
				{
					fileNoList.add(tmpStr);
				}
			}
		}

		//commonのタグ出力
		outputLinkTag(cssList, commonPath, commonFileNoList);
		// フロント区分に対応するタグ出力
		outputLinkTag(cssList, path, fileNoList);

		if (!DSP_KBN_SMART_PHONE.equals(this.dsp_kbn)) {

			// 共通cssの出力(表示区分：スマートフォン以外の場合に出力)
			outputHtml("<link type=\"text/css\" media=\"screen,tty,tv,projection,handheld,braille,embossed,speech\" rel=\"stylesheet\" href=\"" + path + "css_lib_front.css\" charset=\"UTF-8\" />" + "\n");
			outputHtml("<link type=\"text/css\" media=\"print\" rel=\"stylesheet\" href=\"" + path + "css_lib_front_print.css\" charset=\"UTF-8\" />" + "\n");
		}
	}

	/**
	 * 引数を元に、linkタグを生成する。
	 * @param cssList 対象のCSSファイルの名称を格納したファイル
	 * @param path linkのhrefに設定するパス部分
	 * @param fileNoList cssListの何番目を使用するかを格納したファイル
	 * @throws JspException JSP例外
	 */
	private void outputLinkTag(List<String> cssList, String path, List<String> fileNoList) throws JspException
	{
		for (int i = 0; i < fileNoList.size(); i++)
		{
			String cssFile = cssList.get(Integer.parseInt(fileNoList.get(i)));
			outputHtml("<link type=\"text/css\" rel=\"stylesheet\" href=\"" + path + cssFile + "\" charset=\"UTF-8\" />" + "\n");
		}
	}

	/**
	 * 引数の後ろにファイルセパレータを付与して返却する。
	 * @param str パス生成のもとになる文字列
	 * @return 処理後のパス
	 */
	private String getPath(final String str)
	{
		String path = str.trim();
		if (!HALF_SLASH.equals(path.substring(path.length() - 1)))
		{
			return path + HALF_SLASH;
		}
		return  path;
	}

	/**
	 * ページ内埋め込みJavaScriptの生成
	 * @throws JspException
	 */
	private void outputPageIncludeJS() throws JspException
	{

		// ページ組み込みのJavaScript生成
		outputHtml("<script type=\"text/javascript\">" + "\n");

		// フロント画面認識用変数
		outputHtml("var GAMEN_SBT = \"front\";" + "\n");

		// メッセージエリアに表示するメッセージ情報を保持するメッセージリスト
		List<JCCFrontMsgData> msgList = new ArrayList<JCCFrontMsgData>();

		// 項目上部に表示するメッセージ情報を保持する項目リスト
		List<JCCFrontMsgData> itemMsgList = new ArrayList<JCCFrontMsgData>();

		// メッセージリストと項目リストにメッセージ情報を設定
		setMsgListAndItemMsgList(msgList, itemMsgList);

		// JSのmessageListを生成
		outputHtml("var messageList = [" + "\n");
		for (int i = 0; i < msgList.size(); i++)
		{
			outputHtml("new Message(\"" + msgList.get(i).getMsgId() + "\", \"" + msgList.get(i).getMsg() + "\", [])");
			// 配列のカンマ処理
			if (i < msgList.size() -1)
			{
				outputHtml(HALF_COMMA + "\n");
			}
		}
		outputHtml("];" + "\n");

		// JSのitemMessageListを生成
		outputHtml("var itemMessageList = [" + "\n");
		for (int i = 0; i < itemMsgList.size(); i++)
		{
			outputHtml("new Message(\"" + itemMsgList.get(i).getMsgId() + "\", \"" + itemMsgList.get(i).getMsg() + "\", \"" + itemMsgList.get(i).getKomokuId() + "\")");
			// 配列のカンマ処理
			if (i < itemMsgList.size() -1)
			{
				outputHtml(HALF_COMMA + "\n");
			}
		}
		outputHtml("];" + "\n");
		outputHtml("</script>" + "\n");

	}

	/**
	 * 共有フォームBeanの情報を引数のメッセージリスト又は項目リストに設定する。
	 * <br>
	 * @param msgList メッセージリスト
	 * @param itemMsgList 項目リスト
	 * @throws JspException JSP例外
	 */
	private void setMsgListAndItemMsgList(List<JCCFrontMsgData> msgList,
			List<JCCFrontMsgData> itemMsgList) throws JspException
	{
		// JSPビーンを取得する
		X33VViewJSPBean jspBean = getJspBean();
		// JSPBeanから共有フォームBeanを取得
		X33VDataTypeList commonInfoBeanList = jspBean.getCommonInfo();
		// 共有フォームBeanがnullまたは未設定の場合は処理を抜ける
		if (commonInfoBeanList == null || commonInfoBeanList.size() == 0)
		{
			return;
		}
		
		// メッセージリストの個数取得
		int count = countSFBeanList(TEMPLATE_ID, MSG_ID);

		for (int index = 0; index < count; index++)
		{
			// メッセージIDの取得
			String msgId = getSFBeanData_String(TEMPLATE_ID, MSG_ID, index);
			// メッセージ文字列の取得
			String msg = getSFBeanData_String(TEMPLATE_ID, MSG, index);
			// 画面項目IDの取得
			String gamenKomokuId = getSFBeanData_String(TEMPLATE_ID, ITEM_ID, index);

			setDataToMsgListOrItemMsgList(msgId, msg, gamenKomokuId, msgList, itemMsgList);
		}
	}
	
	/**
	 * JSPBeanを取得します。
	 * <br>
	 * @return JspBean
	 * @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(W_SESSION_NEXT_PAGE_AREA_ID);

		if (areaIdObj != null && areaIdObj instanceof String)
		{
			jspBean = (X33VViewJSPBean)context.getResponseBean((String)areaIdObj);
		}
		if (jspBean == null)
		{
			throw new JspException();
		}
		
		return jspBean;
	}

	/**
	 * 引数のメッセージID,メッセージ,項目IDからメッセージ情報を生成し
	 * 項目IDの有無でメッセージリスト又は項目リストに設定する。<br>
	 * (項目ID有で項目リスト、無でメッセージリストに設定。)
	 * <br>
	 * @param msgId メッセージID
	 * @param msg メッセージ
	 * @param komokuId 項目ID
	 * @param msgList メッセージリスト
	 * @param itemMsgList 項目リスト
	 */
	private void setDataToMsgListOrItemMsgList(String msgId, String msg,
		String komokuId, List<JCCFrontMsgData> msgList,
		List<JCCFrontMsgData> itemMsgList)
	{

		JCCFrontMsgData jCCFrontMsgData = new JCCFrontMsgData(msgId, msg, komokuId);

		if (isNull(komokuId))
		{
			msgList.add(jCCFrontMsgData);
		}
		else
		{
			itemMsgList.add(jCCFrontMsgData);
		}

	}

	/**
	 * 値のNULLチェックを実施する。
	 * @param value 値
	 * @return 結果
	 */
	private boolean isNull(String value)
	{
		return value == null || value.length() == 0;
	}

}
