/*********************************************************************
* All Rights reserved,Copyright (c) K-Opticom
**********************************************************************
*＜プログラム内容＞
*   システム名      ：eo顧客基幹システム
*   モジュール名    ：JCCBackyardCommonHeader2
*   ソースファイル名：JCCBackyardCommonHeader2.java
*   作成者          ：富士通
*   日付            ：2025年02月14日
*＜機能概要＞
*   バックヤード共通ヘッダのタグハンドラクラスです。
*＜修正履歴＞
*   バージョン  修正日       修正者      修正内容
*  v74.00.00    2025/02/14   FJ）中川    【ANK-4683-00-00】【eo】chrome化対応(2025年4Q分)
*
**********************************************************************/

package eo.web.webview.common;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;

import com.fujitsu.futurity.model.common.JCMAPLConstMgr;
import com.fujitsu.futurity.model.common.JCMCacheClearMgr;
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.Parameters;
import com.fujitsu.futurity.web.x33.X33VCustomTagBase;

/**
 * バックヤード共通ヘッダのタグハンドラクラス
 * <br>
 * @author 富士通
 *
 */
@SuppressWarnings("serial")
public class JCCBackyardCommonHeader2 extends X33VCustomTagBase {
	
	/**  タイトル */
	public static final String TITLE = "eo顧客基幹システム";
	
	/**  キャラクターセット */
	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 EMPHASIS_FL = "EM_FL";
	
	/** 拡張タグ表示モード */
	private String _mode;

	public void setMode( String mode ) {
		_mode = mode;
	}
	
	/**
	 * バックヤード共通ヘッダの出力処理を行う。
	 * <br>
	 * @return SKIP_BODY バックヤード共通ヘッダの拡張タグは空タグの為、ボディー部をスキップする。
	 * @throws JspException JSPエラー。
	 */
	@Override
	public int doStartTag() throws JspException
	{
		// コンテキストルートの取得
		String root = ((HttpServletRequest)pageContext.getRequest()).getContextPath();

		String charset = JCMAPLConstMgr.getString("DEFAULT_CHARSET");
		if(charset == null || charset.length()==0)
		{
			charset = CHARSET;
		}
		
		// metaタグの出力
		outputHtml("<meta http-equiv=\"Content-Type\" content=\"text/html; charset="+ charset +"\">" + "\n");
		outputHtml("<meta http-equiv=\"Content-Style-Type\" content=\"text/css\">" + "\n");
		outputHtml("<meta http-equiv=\"Content-Script-Type\" content=\"text/javascript\">" + "\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");
		
		// JavaScriptファイルの読込み部の出力
		outputHtml("<script src=\""+ root +"/js/jquery-1.5.1.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		outputHtml("<script src=\""+ root +"/js/charCodeChecker.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
		outputHtml("<script src=\""+ root +"/js/common.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
		outputHtml("<script src=\""+ root +"/js/checkField.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
		outputHtml("<script src=\""+ root +"/js/checkControl.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>" + "\n");
		outputHtml("<script src=\""+ root +"/js/focusCommon.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		outputHtml("<script src=\""+ root +"/js/ZM_commonUtil.js?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" type=\"text/javascript\" charset=\"UTF-8\"></script>\n");
		
		// CSSファイルの読込み部の出力
		outputHtml("<link type=\"text/css\" rel=\"stylesheet\" media=\"screen,tty,tv,projection,handheld,braille,embossed,speech\" href=\""+ root +"/wsd/ns/jpn/pc/css/css_lib.css?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" charset=\"UTF-8\">" + "\n");
		outputHtml("<link type=\"text/css\" rel=\"stylesheet\" media=\"print\" href=\""+ root +"/wsd/ns/jpn/pc/css/css_lib_print.css?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" charset=\"UTF-8\">" + "\n");
		outputHtml("<link type=\"text/css\" rel=\"stylesheet\" href=\""+ root +"/wsd/ns/jpn/pc/css/css_tab.css?v=" + JCMCacheClearMgr.getString("RELEASE_YMD") + "\" charset=\"UTF-8\">" + "\n");
		
		// Titleの出力
		String ttl = getSFBeanData_String("TagTemplate001","NEXT_SCREEN_NAME") + ":" +getSFBeanData_String("TagTemplate001","NEXT_SCREEN_ID") + " " + TITLE;
		outputHtml("<title>"+ ttl +"</title>" + "\n");
		
		// ページ組み込みのJavaScript生成
		outputHtml("<script type=\"text/javascript\">" + "\n");
		
		// バックヤード画面認識用変数
		outputHtml("var GAMEN_SBT = \"backyard\";" + "\n");
		
		if ( _mode != null && _mode.equals("SYSTEM") && !checkCommonInfo() ) {
			outputHtml("var INIT_EM = \"\";" + "\n");
			outputHtml("var messageList = new Array();" + "\n");
			
			outputHtml("</script>" + "\n");
			return SKIP_BODY;
		}
		
		// 強調表示フラグの取得
		String emFl = getSFBeanData_String(TEMPLATE_ID, EMPHASIS_FL);
		// 初期の強調表示有無認識用の変数
		outputHtml("var INIT_EM = " + emFl + ";" + "\n");
		
		// 共有フォームBeanのメッセージ情報を内包したリストの取得
		List<JCCBackyardMsgData> msgList = createMsgList();
		
		// 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() + "\", " + "[");
			for (int j=0; j<msgList.get(i).getKomokuIdList().size(); j++) {
				outputHtml("\"" + msgList.get(i).getKomokuIdList().get(j) + "\"");
				// 配列のカンマ処理
				if (j<msgList.get(i).getKomokuIdList().size() -1) {
					outputHtml(",");
				}
			}
			outputHtml("])");
			// 配列のカンマ処理
			if (i < msgList.size() -1) {
				outputHtml("," + "\n");
			}
		}
		
		outputHtml("];" + "\n");
		
		// メニューIDのhiddenタグを生成するファンクションをJSPに出力する。
		outputMenuIdFunction();
		
		outputHtml("</script>" + "\n");
		
		return SKIP_BODY;
	}

	/**
	 * 共有フォームBeanの情報を元にメッセージリストを生成する。<br>
	 * 共有フォームBeanに同一メッセージIDとメッセージのものが複数存在する場合、
	 * メッセージ情報としては1つとし、画面項目IDのリストに項目IDを追加する。
	 * @return メッセージ情報のリスト
	 * @throws JspException JSP例外
	 */
	private List<JCCBackyardMsgData> createMsgList() throws JspException {
		List<JCCBackyardMsgData> msgList = new ArrayList<JCCBackyardMsgData>();
		
		// メッセージリストの個数取得
		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);
		
			setMsgList(msgId, msg, gamenKomokuId, msgList);
		}
		return msgList;
	}

	/**
	 * 同一メッセージIDとメッセージの場合、メッセージ情報の項目IDリストに項目IDを追加
	 * 同じものが無い場合、メッセージリストに新規メッセージ情報を追加するメソッド
	 * <br>
	 * @param msgId メッセージID
	 * @param msg メッセージ
	 * @param gamenKomokuId 画面項目ID
	 * @param msgList メッセージ情報リスト
	 */
	private void setMsgList(String msgId, String msg, String gamenKomokuId,
			List<JCCBackyardMsgData> msgList) {
		
		JCCBackyardMsgData target = getMsgDataFromMsgIdAndMsg(msgList, msgId, msg);
		if (target == null)
		{
			List<String> tmp = new ArrayList<String>();
			tmp.add(gamenKomokuId);
			msgList.add(new JCCBackyardMsgData(msgId, msg, tmp));
		} else {
			target.getKomokuIdList().add(gamenKomokuId);
		}
	}

	/**
	 * メッセージ情報リストに同じメッセージIDとメッセージを持った
	 * 情報が存在するかをチェックし、存在すればその情報を返却する。
	 * <br>
	 * @param msgList メッセージ情報リスト
	 * @param msgId メッセージID
	 * @param msg メッセージ
	 * @return 引数のメッセージIDとメッセージを持ったメッセージ情報（存在しない場合はnull)
	 */
	private JCCBackyardMsgData getMsgDataFromMsgIdAndMsg(List<JCCBackyardMsgData> msgList,
			String msgId, String msg) {
		for(int i=0; i<msgList.size(); i++) {
			JCCBackyardMsgData target = msgList.get(i);
			if (target.getMsgId().equals(msgId) && target.getMsg().equals(msg)) {
				return target;
			}
		}
		return null;
	}

	/**
	 * フォームにメニューIDの値を格納するhiddenタグを生成するためのファンクションをJSPに出力する。
	 * @throws JspException 
	 */
	private void outputMenuIdFunction() throws JspException {
		
		// アプリケーションプロパティファイルから、メニュー画面定義を取得
		String menuScreenIdDef = JCMAPLConstMgr.getString("MENU_SCREEN_ID");
		
		String ujiid = super.pageContext.getRequest().getParameter("uji.id");
		
		if(ujiid == null){
			DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
			Parameters param = ((HttpDispatchContext)context).getParameters();
			ujiid = param.getSingleValue("uji.id");
		}
		
		String menuid = null;
		if ( menuScreenIdDef != null && ujiid != null && menuScreenIdDef.equals(ujiid) ) {
			menuid = super.pageContext.getRequest().getParameter(JCCWebCommon.MENUID_PARAM_NAME);
		} else {
			menuid = super.pageContext.getRequest().getParameter("menuid_system");
			
			if(menuid == null){
				DispatchContext context = DispatchContextFactory.getInstance().getHttpDispatchContext();
				Parameters param = ((HttpDispatchContext)context).getParameters();
				menuid = param.getSingleValue("menuid_system");
			}
		}
		
		// メニューIDが取得できない場合は、JSを出力しない。
		if ( menuid == null) {
			return;
		}
		
		menuid = JCCWebCommon.escapeString(menuid);
		
		outputHtml("function createMenuIdObject() {" + "\n");
		
		// menuIdを受け渡すhiddenタグ　name:menuid_system
		outputHtml(		"var menuIdSystemObj = document.forms[0].menuid_system;" + "\n");
		
		// hiddenタグがあれば、値を設定する。
		outputHtml(		"if ( menuIdSystemObj != undefined && menuIdSystemObj.type == \"hidden\" ) {" + "\n");
		outputHtml(			"document.forms[0].menuid_system.value = \"" + menuid  + "\";" + "\n");
		
		// hiddenタグがなければ、タグを生成して値を設定する。
		outputHtml(		"} else {" + "\n");	
		
		outputHtml(			"var objVerb = document.createElement(\"input\");" + "\n");
		outputHtml(			"objVerb.type = \"hidden\";" + "\n");
		
		outputHtml(			"objVerb.name = \"menuid_system\";" + "\n");
		
		outputHtml(			"objVerb.value = \"" + menuid +"\";" + "\n");
		
		outputHtml(			"document.forms[0].appendChild(objVerb);" + "\n");
		outputHtml(		"}" + "\n");
		outputHtml("}" + "\n");
	}
	
	/**
	 * 共有フォームBeanが取得できるか調べる。
	 * @return
	 */
	private boolean checkCommonInfo() {
		try {
			countSFBeanList(TEMPLATE_ID, MSG_ID);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
}
