/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JFUFrontResponsiveHeader
*   ソースファイルパス：JFUFrontResponsiveHeader.java
*   作成者          ：富士通
*   日付            ：2015年07月03日
*＜機能概要＞
*   レスポンシブデザイン適応用のヘッダー情報をHTMLデータ内に書き出す拡張タグ用クラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*   v15.00.00   2015/07/03   FJ          新規作成
*
**********************************************************************/

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.JSYLogBase;
import com.fujitsu.futurity.common.JSYwebLog;
import com.fujitsu.futurity.web.x33.X33VCustomTagBase;

import eo.common.constant.JFUStrConst;

/**
 * レスポンシブデザイン適応用のヘッダー情報をHTMLデータ内に書き出す。
 * 拡張タグ用クラス
 * @author 富士通
 *
 */
@SuppressWarnings("serial")
public class JFUFrontResponsiveHeader extends X33VCustomTagBase
{

	/** メッセージリストのテンプレートID */
	private static final String TEMPLATE_ID = "TagTemplate001";

	/** 出力パターン属性 */
	private String pattern = "";

	/** 出力パターン（全て出力） */
	private static final String PATTERN_ALL = "00";

	/** 出力パターン（JSのみ除外） */
	private static final String PATTERN_EXCLUDE_JS = "01";

	/** 出力パターン（JS除外、efo用設定追加） */
	private static final String PATTERN_EXCLUDE_JS_AND_EFO = "02";

	/** 出力パターン */
	private static final List<String> PATTERNS = Arrays.asList(PATTERN_ALL, PATTERN_EXCLUDE_JS, PATTERN_EXCLUDE_JS_AND_EFO);

	/** フロント区分の項目ID */
	private static final String FRONT_KBN = "FU_KBN";

	/** プロパティ値取得キー：フロント区分定義 */
	private static final String APL_CONST_DEFAULT_FRONT_KBN = "DEFAULT_FRONT_KBN";

	/** プロパティ値取得キー：デフォルトのCSSパス定義 */
	private static final String APL_CONST_RESP_CSS_PATH = "_RESP_CSS_PATH";

	/** プロパティ値取得キー：デフォルトのCSSリスト定義 */
	private static final String APL_CONST_RESP_CSS_LIST = "RESP_CSS_LIST";

	/** プロパティ値取得キー：デフォルトの共通CSSパス定義 */
	private static final String APL_CONST_COMMON_CSS_PATH = "COMMON_CSS_PATH";

	/** 半角セミコロン */
	private static final String HALF_SEMICOLON = ";";

	/** レスポンシブ用EFOのCSS定義ファイル名称 */
	private static final String EFO_REP_FILE_NAME = "efo_rsp.css";


	@Override
	public int doStartTag() throws JspException
	{
		try
		{
			// パターンが空の場合
			if (JFUWebCommon.isNull(pattern))
			{
				// 出力パターン（全て出力）として扱う
				pattern = PATTERN_ALL;
			}

			// パターンに含まれていない場合はタグを作成しない
			if (!PATTERNS.contains(pattern))
			{
				return SKIP_BODY;
			}

			// コンテキストルートの取得
			String root = ((HttpServletRequest)pageContext.getRequest()).getContextPath();

			if (!(PATTERN_EXCLUDE_JS.equals(pattern) || PATTERN_EXCLUDE_JS_AND_EFO.equals(pattern) ))
			{
				// JavaScriptファイル読み込み用<script>タグの出力
				outputJS(root);
			}

			// meta情報の出力
			outputMetaData();

			// CSSファイルの読込み部の出力
			outputCSS();

		}
		catch(Exception e)
		{
			JSYwebLog.println(JSYLogBase.ERROR, getClass(), e, null, null, null);
			throw new JspException();
		}

		return SKIP_BODY;
	}

	/**
	 * meta情報を出力する。
	 * @throws JspException JSP例外
	 */
	private void outputMetaData() throws JspException
	{

		outputHtml("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no\" />" + "\n");
		outputHtml("<meta name=\"format-detection\" content=\"telephone=no\" />" + "\n");

	}

	/**
	 * JavaScriptファイルのscriptタグを出力する。
	 * @param root コンテキストルート
	 * @throws JspException JSP例外
	 */
	private void outputJS(String root) throws JspException {

		outputHtml("<script src=\"" + root + "/js/common/FUResponsiveCommon.js\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");

	}

	/**
	 * CSSファイルの読込み部の出力
	 *
	 * <br>
	 * @throws JspException
	 */
	private void outputCSS() 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 (JFUWebCommon.isNull(frontKbn))
		{

			frontKbn = JCCWebCommon.getApplicationConst(APL_CONST_DEFAULT_FRONT_KBN);

		}

		 // CSSファイル情報の取得
		 String cssFiles = JCCWebCommon.getApplicationConst(APL_CONST_RESP_CSS_LIST);

		if (JFUWebCommon.isNull(cssFiles))
		{
			JSYwebLog.println(JSYLogBase.ERROR, getClass(), null, "BPCON0I002", new String[]{"RESP_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 = JFUStrConst.EMPTY;

		if (JFUWebCommon.isNull(commonPathData))
		{
			// commonの設定が無い場合、処理なし
		}
		else if (!JFUStrConst.EMPTY.equals(commonPathData) && !commonPathData.contains(HALF_SEMICOLON))
		{
			JSYwebLog.println(JSYLogBase.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(JFUStrConst.COMMA);
			for(int i = 0; i < commonFileNos.length; i++)
			{
				commonFileNoList.add(commonFileNos[i].trim());
			}
		}

		// フロント区分毎の情報
		String pathData = JCCWebCommon.getApplicationConst(frontKbn + APL_CONST_RESP_CSS_PATH);

		// ファイル番号格納用
		List<String> fileNoList = new ArrayList<String>();
		// パス格納用
		String path = JFUStrConst.EMPTY;
		if (JFUWebCommon.isNull(pathData))
		{
			// 設定が無い場合、処理なし
		}
		else if (!JFUStrConst.EMPTY.equals(pathData) && !pathData.contains(HALF_SEMICOLON))
		{
			JSYwebLog.println(JSYLogBase.ERROR, getClass(), null, "BPCON0I002", new String[]{frontKbn + "_RESP_CSS_PATHに\";\"が含まれていません。"}, null);
			throw new JspException();
		}
		else
		{
			temp = pathData.split(HALF_SEMICOLON);
			path = getPath(temp[0]);
			String[] fileNos = temp[1].split(JFUStrConst.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 (PATTERN_EXCLUDE_JS_AND_EFO.equals(pattern))
		{
			// efo用設定の出力が必要な場合
			List<String> efoCssList = new ArrayList<String>();
			efoCssList.add(EFO_REP_FILE_NAME);
			List<String> efoFileNoList = new ArrayList<String>();
			efoFileNoList.add(JFUStrConst.S_ZERO);
			outputLinkTag(efoCssList, commonPath, efoFileNoList);
		}

	}

	/**
	 * 引数を元に、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\" media=\"screen and (max-width: 799px) and (min-width: 0px)\" href=\"" + path + cssFile + "\" charset=\"UTF-8\" />" + "\n");
		}
	}

	/**
	 * 引数の後ろにファイルセパレータを付与して返却する。
	 * @param str パス生成のもとになる文字列
	 * @return 処理後のパス
	 */
	private String getPath(final String str)
	{
		String path = str.trim();
		if (!JFUStrConst.SLASH.equals(path.substring(path.length() - 1)))
		{
			return path + JFUStrConst.SLASH;
		}
		return  path;
	}

	/**
	 * パターンを設定します。
	 * <br>
	 * @param pattern パターン
	 */
	public void setPattern(String pattern)
	{
		this.pattern = pattern;
	}

}
