/*********************************************************************
 *	All Rights reserved,Copyright (c) K-Opticom
 **********************************************************************
 *＜プログラム内容＞
 *	システム名		：eo顧客基幹システム
 *	モジュール名	：JCRGetDataUtil
 *	ソースファイル名：JCRGetDataUtil.java
 *	作成者			：富士通
 *	日付			：2011年10月26日
 *＜機能概要＞
 *	対応履歴管理システムWebデータ取得共通部品
 *＜修正履歴＞
 *	バージョン	修正日		修正者		修正内容
 *	v1.00.00	2011/04/05	富士通		新規作成
 *	v5.00.00	2013/04/26	FJ)伊藤		TAI-2013-0000025 静的解析による品質チェック対応
 *	v6.00.00	2013/09/05	FJ)伊藤		OM-2013-0001485  ズームの履歴表示を修正対応
 *	v6.00.01	2013/09/09	FJ)伊藤		OM-2013-0001887  対応記録履歴補正処理(setTaioKirokRireki)を画面と帳票で処理を変更するよう修正。
 *	v7.00.00	2014/02/03	FJ)伊藤		OM-2014-0000422  改行コード（CR、LF）対応
 *	v12.00.00	2014/10/31	FJ)伊藤		ANK-2356-00-00   【ＮＯ．１８３１】対応履歴画面へのリンク追加（ログ解析システムへのリンク）対応
 * ｖ29.00.00	2017/03/09	FJ)クウン	ANK-2918-00-00 (客B)コールバック期限超過時の赤字表示
 * ｖ29.00.00	2017/04/17	FJ)クウン	OM-2017-0000371_コールバック赤字強調表示
 *	v39.00.00	2018/09/12	FJ)北村		ANK-3475-00-00_eo顧客：対応履歴（ＣＡＳＥ）ファイル取り込み時に行われる「受付種別チェック仕様」の緩和等対応
 *	v41.00.00	2019/04/16	FJ)黒田		【ANK-3640-00-00】元号変更対応
 *	v42.00.00	2019/04/03	FJ)前田		ANK-3593-00-00_オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
 *	v42.00.01	2019/03/29	FJ)三原		ANK-3593-00-00 オペレータ支援対応に伴うeo顧客機能改修（お客さまカルテ）
 *	v53.00.00	2021/06/18  GDC)ジョバニー	ANK-4092-00-00_CX戦略WG方針対応（9月末リリース分） (送信SMS作成, SMS送信)
 *
 **********************************************************************/

package eo.web.webview.common;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import com.fujitsu.futurity.model.base.jcc.util.JCCCalendarException;
import com.fujitsu.futurity.model.base.jcc.util.JCCJapaneseCalendar;
import com.fujitsu.futurity.model.base.jcc.util.JCCWestCalendar;
import com.fujitsu.futurity.web.x31.X31CWebConst;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccess;
import com.fujitsu.futurity.web.x31.X31SDataBeanAccessArray;
import com.sun.enterprise.tools.common.util.StringUtils;

import eo.common.constant.JCRStrConst;
import eo.common.util.JCRUtilCommon;
import eo.common.util.JPCUtilCommon;
import eo.web.webview.CommonInfoCF.CommonInfoCFConst;

/**
 * 対応履歴管理システムWebデータ取得部品<p>
 * <BR>
 * @author 富士通
 */
public class JCRGetDataUtil
{

// v12.00.00 ANK-2356-00-00 ADD START
	/**
	 * REPLACE_MAP
	 */
	private static final Map<String, String> REPLACE_MAP = new HashMap<String, String>();

	/**
	 * 置換表
	 */
	static {
		REPLACE_MAP.put("0", "A");
		REPLACE_MAP.put("1", "C");
		REPLACE_MAP.put("2", "E");
		REPLACE_MAP.put("3", "G");
		REPLACE_MAP.put("4", "I");
		REPLACE_MAP.put("5", "K");
		REPLACE_MAP.put("6", "M");
		REPLACE_MAP.put("7", "O");
		REPLACE_MAP.put("8", "Q");
		REPLACE_MAP.put("9", "S");
	}
// v12.00.00 ANK-2356-00-00 ADD END

	// ANK-3593-00-00 ADD START
	/**
	 * 置き換え文字列：SYSID
	 */
	private static final String REPLACE_SYSID = "%SYSID%";

	/**
	 * 置き換え文字列：OP担当業務コード
	 */
	private static final String REPLACE_OP_TNT_WORK_CD = "%OPGMCD%";

	/**
	 * 置き換え文字列：ワンタイムパスワード
	 */
	private static final String REPLACE_ONET_PWD = "%ONET_PWD%";
	// ANK-3593-00-00 ADD END

	/**
	 * 業務個別設定組織コード取得処理です。
	 * 共有フォームBeanに設定されている業務個別設定組織コードを返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 業務個別設定組織コード
	 */
	protected static String getWkkbtOrgCd(X31SDataBeanAccess commoninfoBean)
	{
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = commoninfoBean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);

		// 権限リストの2レコード目を取得
		X31SDataBeanAccess bean = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織コードを取得
		String wkkbtOrgCd = bean.sendMessageString(CommonInfoCFConst.ORG_CD_01, X31CWebConst.DATABEAN_GET_VALUE);

		return wkkbtOrgCd;
	}

	/**
	 * 業務個別設定組織名取得処理です。
	 * 共有フォームBeanに設定されている業務個別設定組織名を返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 業務個別設定組織名
	 */
	protected static String getWkkbtOrgNm(X31SDataBeanAccess commoninfoBean)
	{
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = commoninfoBean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);

		// 権限リストの2レコード目を取得
		X31SDataBeanAccess bean = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から組織名を取得
		String wkkbtOrgNm = bean.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		return wkkbtOrgNm;
	}

	/**
	 * 業務個別設定立場コード取得処理です。
	 * 共有フォームBeanに設定されている業務個別設定立場コードを返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 業務個別設定立場コード
	 */
	protected static String getWkkbtPositionCd(X31SDataBeanAccess commoninfoBean)
	{
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = commoninfoBean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);

		// 権限リストの2レコード目を取得
		X31SDataBeanAccess bean = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から立場コードを取得
		String wkkbtPositionCd = bean.sendMessageString(CommonInfoCFConst.POSITION_CD_01, X31CWebConst.DATABEAN_GET_VALUE);

		return wkkbtPositionCd;
	}

	// ANK-3593-00-00 ADD START
	/**
	 * 組織名取得処理です。
	 * 共有フォームBeanに設定されている組織名を返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 組織名
	 */
	protected static String getOrgNm(X31SDataBeanAccess commoninfoBean)
	{
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = commoninfoBean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);

		// 権限リストの1レコード目を取得
		X31SDataBeanAccess bean = kggrpCdList.getDataBean(0);

		// 権限リストの2レコード目から組織名を取得
		String orgNm = bean.sendMessageString(CommonInfoCFConst.ORG_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		return orgNm;
	}
	// ANK-3593-00-00 ADD END

	/**
	 * 業務個別設定立場名取得処理です。
	 * 共有フォームBeanに設定されている業務個別設定立場名を返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 業務個別設定立場名
	 */
	protected static String getWkkbtPositionNm(X31SDataBeanAccess commoninfoBean)
	{
		// 共通フォームBeanから権限リストを取得
		X31SDataBeanAccessArray kggrpCdList = commoninfoBean.getDataBeanArray(CommonInfoCFConst.KGGRP_CD_LIST);

		// 権限リストの2レコード目を取得
		X31SDataBeanAccess bean = kggrpCdList.getDataBean(1);

		// 権限リストの2レコード目から立場名を取得
		String wkkbtPositionNm = bean.sendMessageString(CommonInfoCFConst.POSITION_NM_01, X31CWebConst.DATABEAN_GET_VALUE);

		return wkkbtPositionNm;
	}

	/**
	 * 業務個別設定組織名(ユーザー名)取得処理です。
	 * 共有フォームBeanに設定されている業務個別設定組織名、ユーザー名を "業務個別設定組織名(ユーザー名)"の表記で返却します。
	 * 
	 * @param commoninfoBean 共通フォームBean
	 * @return 業務個別設定組織名(ユーザー名)
	 */
	protected static String getWkkbtOrgNmWithUserNm(X31SDataBeanAccess commoninfoBean)
	{
		// 業務個別設定組織名
		String wkkbtOrgNm = getWkkbtOrgNm(commoninfoBean);

		// ログインユーザー名
		String loginUserNm = commoninfoBean.sendMessageString(CommonInfoCFConst.USER_NM, X31CWebConst.DATABEAN_GET_VALUE);

		// 業務個別設定組織名(ユーザー名)
		String wkkbtOrgNmWithUserNm = wkkbtOrgNm + "(" + loginUserNm + ")";

		return wkkbtOrgNmWithUserNm;
	}

	/**
	 * 漢字年号付和暦文字列取得処理です。
	 * 設定されている標準文字列に、漢字年号と区切り文字をつけた文字列を返します。
	 * 
	 * @param stdstr 西暦年月日の標準文字列（"YYYYMMDD"）
	 * @return 和暦年月日(例:平成3年7月21日)
	 */
	protected static String getJapaneseCalendar(String stdstr)
	{
		// 西暦年月日がない場合は空文字を返す
		if (JCRUtilCommon.isNull(stdstr))
		{
			return "";
		}

		// 漢字年号付和暦文字列取得
		String warekiDate = null;

		try
		{
			// 西暦クラスのインスタンス生成
			JCCWestCalendar jWestCal = new JCCWestCalendar(stdstr);
	
			// 和暦年月日の標準文字列を取得
			String jWestStdDate = jWestCal.toJapaneseCalendar();
	
			// 和暦クラスのインスタンス生成
			JCCJapaneseCalendar jJapaneseCal = new JCCJapaneseCalendar(jWestStdDate);
	
			// 漢字年号付和暦文字列取得
			warekiDate = jJapaneseCal.toCcString("", JCRStrConst.DATE_JAPANESE_CHARACTER_YEAR,
					JCRStrConst.DATE_JAPANESE_CHARACTER_MONTH, JCRStrConst.DATE_JAPANESE_CHARACTER_DAY);
		}
		catch (JCCCalendarException e)
		{
			warekiDate = "";
		}

		return warekiDate;

	}

	/**
	 * 和暦シンボル付和暦文字列取得処理です。
	 * 設定されている標準文字列に、和暦シンボルをつけた文字列を返します。
	 * 
	 * @param stdstr 西暦年月日の標準文字列（"YYYYMMDD"）
	 * @return 和暦シンボルと年(SYYMMDD)
	 */
	protected static String getJapaneseCalendar2(String stdstr)
	{
		// 西暦年月日がない場合は空文字を返す
		if (JCRUtilCommon.isNull(stdstr))
		{
			return "";
		}

		// 漢字年号付和暦文字列取得
		String warekiDate = null;

		try
		{
			// 西暦クラスのインスタンス生成
			JCCWestCalendar jWestCal = new JCCWestCalendar(stdstr);
			// 和暦年月日の標準文字列を取得
			warekiDate = jWestCal.toJapaneseCalendar();
		}
		catch (JCCCalendarException e)
		{
			warekiDate = "";
		}

		return warekiDate;

	}

	/**
	 * 漢字年号付和暦文字列取得処理です。
	 * 設定されている標準文字列に、漢字年号と区切り文字をつけた文字列を返します。
	 * 
	 * @param stdstr 和暦年月日の標準文字列（"SYYMMDD"）
	 * @return 和暦年月日(例:平成3年7月21日)
	 */
	protected static String toCcString(String stdstr)
	{
		// 和暦年月日がない場合は空文字を返す
		if (JCRUtilCommon.isNull(stdstr))
		{
			return "";
		}

		// 漢字年号付和暦文字列取得
		String warekiDate = null;

		try
		{
			// 和暦クラスのインスタンス生成
			JCCJapaneseCalendar jJapaneseCal = new JCCJapaneseCalendar(stdstr);
	
			// 漢字年号付和暦文字列取得
			warekiDate = jJapaneseCal.toCcString("", JCRStrConst.DATE_JAPANESE_CHARACTER_YEAR,
					JCRStrConst.DATE_JAPANESE_CHARACTER_MONTH, JCRStrConst.DATE_JAPANESE_CHARACTER_DAY);
		}
		catch (JCCCalendarException e)
		{
			warekiDate = "";
		}

		return warekiDate;

	}

	/**
	 * 西暦変換処理です。
	 * 和暦年月日を、西暦年月日に変換します。
	 * 
	 * @param stdstr 和暦年月日の標準文字列（"SYYMMDD"）
	 * @return 西暦年月日の標準文字列（"YYYYMMDD"）
	 */
	protected static String toWestCalendar(String stdstr)
	{
		// 和暦年月日がない場合は空文字を返す
		if (JCRUtilCommon.isNull(stdstr))
		{
			return "";
		}

		// 西暦文字列
		String seirekiDate = null;

		try
		{
			// 和暦クラスのインスタンス生成
			JCCJapaneseCalendar jJapaneseCal = new JCCJapaneseCalendar(stdstr);
	
			// 西暦文字列取得
			seirekiDate = jJapaneseCal.toWestCalendar();
		}
		catch (JCCCalendarException e)
		{
			seirekiDate = "";
		}

		return seirekiDate;

	}

	/**
	 * 郵便記号付郵便番号取得処理です。
	 * 郵便番号を前後（3桁,4桁）に分割しハイフンで区切り、郵便記号を付加した文字列を返却します。
	 * 
	 * @param arg0 	編集対象の郵便番号（例：1234567）
	 * @return String 書式編集された郵便番号（例：〒123-4567）
	 */
	protected static String getZipCodeCharactor(String arg0)
	{
		// 郵便番号がない場合は空文字を返す
		if (JCRUtilCommon.isNull(arg0))
		{
			return "";
		}

		// 郵便番号ハイフン処理をした文字列に郵便記号を付加
		String zipCode = JCRStrConst.ZIP_CODE_CHARACTER + JCRWebCommon.hyhunPcd(arg0);

		return zipCode;
	}

	/**
	 * 住所項目取得処理です。
	 * 7分割された住所項目を連結した文字列を返却します。
	 * 
	 * @param stateNm 都道府県
	 * @param cityNm 市区町村名
	 * @param oaztsuNm 大字通称名
	 * @param azchoNm 字丁目名
	 * @param bnchigoNm 番地号
	 * @param adrttm 住所補記・建物名
	 * @param adrrm 住所補記・部屋番号
	 * @return 都道府県、市区町村名、大字通称名、字丁目名、番地号、住所補記・建物名、住所補記・部屋番号を結合した文字列
	 */
	protected static String getConcatAddress(String stateNm, String cityNm, String oaztsuNm
			, String azchoNm, String bnchigoNm, String adrttm, String adrrm)
	{
		StringBuilder address = new StringBuilder();

		if (!JCRUtilCommon.isNull(stateNm))
		{
			address.append(stateNm);
		}

		if (!JCRUtilCommon.isNull(cityNm))
		{
			address.append(cityNm);
		}

		if (!JCRUtilCommon.isNull(oaztsuNm))
		{
			address.append(oaztsuNm);
		}

		if (!JCRUtilCommon.isNull(azchoNm))
		{
			address.append(azchoNm);
		}

		if (!JCRUtilCommon.isNull(bnchigoNm))
		{
			address.append(bnchigoNm);
		}

		if (!JCRUtilCommon.isNull(adrttm))
		{
			address.append(adrttm);
		}

		if (!JCRUtilCommon.isNull(adrrm))
		{
			address.append(adrrm);
		}

		return address.toString();
	}

	/**
	 * データタイプBean取得処理です。
	 * 指定した項目名のデータタイプBeanをArrayList<HashMap<String, Object>>に変換し、返します。
	 * 使用可能なデータタイプBeanの型は、以下のもののみです。
	 * ・データタイプBeanの要素にはStringのみ。
	 * ・サービスフォームBeanにはデータタイプBeanを可変個で持つ。
	 * 
	 * @param beanArray データタイプBean
	 * @return データタイプBean
	 */
	protected static ArrayList<HashMap<String, Object>> getArrayList(X31SDataBeanAccessArray beanArray)
	{

		// データタイプBean
		X31SDataBeanAccess dataTypeBaen = null;

		// データタイプBeanのキーリスト
		String[] keyList = null;

		// データタイプBean詳細
		HashMap<String, Object> dataBeanMap = null;

		// 戻り値のArrayList
		ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();

		for (int i= 0; i < beanArray.getCount() ; i++)
		{
			dataTypeBaen = beanArray.getDataBean(i);
			keyList = dataTypeBaen.getItemNameList();
			dataBeanMap = new HashMap<String, Object>();

			// キーリストから値を取得し、データタイプBean詳細に詰める
			for (int j = 0; j < keyList.length; j++) {
				dataBeanMap.put(keyList[j], dataTypeBaen.sendMessageObject(keyList[j], X31CWebConst.DATABEAN_GET_VALUE));
			}

			// 戻り値のArrayListにデータタイプBean詳細を追加
			arrayList.add(dataBeanMap);
		}

		return arrayList;

	}

	/**
	 * データタイプBean取得処理です。
	 * 指定した項目名のデータタイプBeanをArrayList<HashMap<String, Object>>に変換し、返します。
	 * 使用可能なデータタイプBeanの型は、以下のもののみです。
	 * ・データタイプBeanの要素にはインデックス(String)を1つと、String配列（可変個）のみを持つ。
	 * ・サービスフォームBeanにはデータタイプBeanを1件のみ持つ。
	 * 
	 * @param beanArray データタイプBean
	 * @param indexKeyName コンボボックスのindex名称
	 * @return データタイプBean
	 */
	protected static ArrayList<HashMap<String, Object>> getComboBoxArrayList(X31SDataBeanAccessArray beanArray, String indexKeyName)
	{

		// 戻り値のArrayList
		ArrayList<HashMap<String, Object>> arrayList = new ArrayList<HashMap<String, Object>>();

		// 戻り値のArrayListにセットするHashMap
		HashMap<String, Object> dataMap = new HashMap<String, Object>();

		if (beanArray.getCount() > 0)
		{
			// データタイプBeanを1件取得
			X31SDataBeanAccess dataTypeBaen = beanArray.getDataBean(0);

			// インデックス値を取得しmapにセット
			dataMap.put(indexKeyName, dataTypeBaen.sendMessageString(indexKeyName, X31CWebConst.DATABEAN_GET_VALUE));

			// キーリストを取得
			String[] keyList = dataTypeBaen.getItemNameList();

			for (int i = 1; i < keyList.length; i++)
			{
				// キー
				String key = keyList[i];

				// コンボボックスのデータ数
				int dataCount = ((Integer)dataTypeBaen.sendMessage(key, X31CWebConst.DATABEAN_GET_COUNT)).intValue();
				String[] dataValue = new String[dataCount];

				for (int j = 0; j < dataCount; j++)
				{
					dataValue[j] = dataTypeBaen.sendMessageString(key, X31CWebConst.DATABEAN_GET_VALUE, j);
				}

				// キーリストから値を取得し、String配列に詰める
				dataMap.put(key, dataValue);

			}

		}

		// 戻り値のArrayListにHashMapをセット
		arrayList.add(dataMap);

		return arrayList;

	}

	/**
	 * プルダウン項目設定処理です。
	 * プルダウン項目の、コード、名称を設定します。
	 * 
	 * @param bean フォームDataBean
	 * @param beanIdArray 項目ID
	 * @param mapParam 対象マップ
	 * @param serviceIdArray サービスインターフェイス項目リスト
	 * @param flgBlank 空白有無フラグ（true：空白あり、false：空白なし）
	 */
	@SuppressWarnings("unchecked")
	protected static void setPullDown(X31SDataBeanAccess bean, String[] beanIdArray, HashMap mapParam, String[] serviceIdArray, boolean flgBlank)
	{

		ArrayList<Object> childList = null;

		X31SDataBeanAccessArray listPullDown = bean.getDataBeanArray(beanIdArray[0]);
		childList = null;
		if(mapParam.containsKey(serviceIdArray[0]))
		{
			childList = (ArrayList)mapParam.get(serviceIdArray[0]);

			X31SDataBeanAccess subbean = null;

			if(listPullDown.getCount() - 1 >= 0)
			{
				subbean = listPullDown.getDataBean(0);
			}
			else
			{
				subbean = listPullDown.addDataBean();
			}

			if (flgBlank)
			{
				for (int i = 2; i < beanIdArray.length; i++) 
				{
					// コードリスト ← 空白
					subbean.sendMessageString(beanIdArray[i], X31CWebConst.DATABEAN_ADD_VALUE, "");
				}
			}
			
			for(int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				
				// コードリスト ← 空白
				subbean.sendMessageString(beanIdArray[2], X31CWebConst.DATABEAN_ADD_VALUE, (String)childMap.get(serviceIdArray[1]));

				String index = String.valueOf(i + 1) + ".";
				for (int j = 3; j < beanIdArray.length; j++) 
				{
					// 名称リスト ← 空白
					subbean.sendMessageString(beanIdArray[j], X31CWebConst.DATABEAN_ADD_VALUE, index + (String)childMap.get(serviceIdArray[j-1]));
				}

			}

		}

	}

	/**
	 * プルダウン項目・コード取得処理です。
	 * プルダウン項目から、選択されたコードを取得します。
	 * 
	 * @param bean フォームDataBean
	 * @param pullDownId プルダウン項目ID
	 * @param indexId インデックス項目ID
	 * @param codeListId コードリストID
	 * @param dataBeanIndex データBean要素番号
	 * @return 選択コード
	 */
	protected static String getPullDownCode(X31SDataBeanAccess bean, String pullDownId, String indexId, String codeListId, int dataBeanIndex)
	{

		// フォームDataBeanがnullの場合
		if (bean == null)
		{
			return null;
		}

		// プルダウン項目IDがnullの場合
		if (JCRUtilCommon.isNull(pullDownId))
		{
			return null;
		}

		// インデックス項目IDがnullの場合
		if (JCRUtilCommon.isNull(indexId))
		{
			return null;
		}

		// コードリストIDがnullの場合
		if (JCRUtilCommon.isNull(codeListId))
		{
			return null;
		}

		// プルダウンデータBeanの取得
		X31SDataBeanAccess comboBean = bean.getDataBeanArray(pullDownId).getDataBean(dataBeanIndex);
		
		// プルダウンデータBeanがnullの場合
		if (comboBean == null)
		{
			return null;
		}

		// 選択されたインデックスを取得する。
		if (JCRUtilCommon.isNull(comboBean.sendMessageString(indexId, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			return null;
		}
		int selectedIndex = Integer.parseInt(comboBean.sendMessageString(indexId, X31CWebConst.DATABEAN_GET_VALUE), 10);

		return comboBean.sendMessageString(codeListId, X31CWebConst.DATABEAN_GET_VALUE, selectedIndex);
	}

	/**
	 * プルダウン項目・名称取得処理です。
	 * プルダウン項目から、選択された名称を取得します。
	 * 
	 * @param bean フォームDataBean
	 * @param pullDownId プルダウン項目ID
	 * @param indexId インデックス項目ID
	 * @param codeListId コードリストID
	 * @param nameListId 名称リストID
	 * @param dataBeanIndex データBean要素番号
	 * @return 選択名称
	 */
	protected static String getPullDownName(X31SDataBeanAccess bean, String pullDownId, String indexId, String codeListId, String nameListId, int dataBeanIndex)
	{

		// フォームDataBeanがnullの場合
		if (bean == null)
		{
			return null;
		}

		// プルダウン項目IDがnullの場合
		if (JCRUtilCommon.isNull(pullDownId))
		{
			return null;
		}

		// インデックス項目IDがnullの場合
		if (JCRUtilCommon.isNull(indexId))
		{
			return null;
		}

		// コードリストIDがnullの場合
		if (JCRUtilCommon.isNull(codeListId))
		{
			return null;
		}

		// 名称リストIDがnullの場合
		if (JCRUtilCommon.isNull(nameListId))
		{
			return null;
		}

		// プルダウンデータBeanの取得
		X31SDataBeanAccess comboBean = bean.getDataBeanArray(pullDownId).getDataBean(dataBeanIndex);
		
		// プルダウンデータBeanがnullの場合
		if (comboBean == null)
		{
			return null;
		}

		// 選択されたインデックスを取得する。
		if (JCRUtilCommon.isNull(comboBean.sendMessageString(indexId, X31CWebConst.DATABEAN_GET_VALUE)))
		{
			return null;
		}
		int selectedIndex = Integer.parseInt(comboBean.sendMessageString(indexId, X31CWebConst.DATABEAN_GET_VALUE), 10);

		String pullDownValue = comboBean.sendMessageString(nameListId, X31CWebConst.DATABEAN_GET_VALUE, selectedIndex);
		
		return pullDownValue.substring(pullDownValue.indexOf(".") + 1);

	}

	/**
	 * プルダウン項目・インデックス取得処理です。
	 * プルダウン項目から、指定コードが設定された場合のインデックスを取得します。
	 * 
	 * @param bean フォームDataBean
	 * @param selectedCode 選択コード
	 * @param pullDownId プルダウン項目ID
	 * @param codeListId コードリストID
	 * @param dataBeanIndex データBean要素番号
	 * @return 選択インデックス
	 */
	protected static String getPullDownIndex(X31SDataBeanAccess bean, String selectedCode, String pullDownId, String codeListId, int dataBeanIndex)
	{

		// フォームDataBeanがnullの場合
		if (bean == null)
		{
			return null;
		}

		// 選択コードがnullの場合
		if (JCRUtilCommon.isNull(selectedCode))
		{
			return "0";
		}

		// プルダウン項目IDがnullの場合
		if (JCRUtilCommon.isNull(pullDownId))
		{
			return "0";
		}

		// コードリストIDがnullの場合
		if (JCRUtilCommon.isNull(codeListId))
		{
			return "0";
		}

		// プルダウンデータBeanの取得
		X31SDataBeanAccess comboBean = bean.getDataBeanArray(pullDownId).getDataBean(dataBeanIndex);
		
		// プルダウンデータBeanがnullの場合
		if (comboBean == null)
		{
			return "0";
		}

		// プルダウンの項目数を取得
		int itemCount = ((Integer)(comboBean.sendMessage(codeListId, X31CWebConst.DATABEAN_GET_COUNT))).intValue();

		int selectedIndex = 0;
		// プルダウン項目より、選択されたインデックスを取得
		for (int i = 0; i < itemCount; i++)
		{
			
			// 選択されたインデックスの場合、ループを終了し、その際のループカウンタをインデックスとする
			if (selectedCode.equals(comboBean.sendMessageString(codeListId, X31CWebConst.DATABEAN_GET_VALUE, i)))
			{
				selectedIndex = i;
				break;
			}
		}
		return String.valueOf(selectedIndex);
	}

	/**
	 * 初期コード取得処理です。
	 * コード名称管理の初期コードを取得します。
	 * 
	 * @param mapParam 対象マップ
	 * @return 初期コード
	 */
	protected static String getShkDspCd(HashMap mapParam)
	{
		ArrayList childList = (ArrayList)mapParam.get("EZM0171B012CBSMsg1List");
		for (int i = 0; i < childList.size(); i++)
		{
			HashMap childMap = (HashMap)childList.get(i);

			if (JCRStrConst.SHK_DSP_CD_SHK_DSP.equals(childMap.get("shk_dsp_cd")))
			{
				return (String) childMap.get("cd_div");
			}
		}
		return null;
	}

	/**
	 * 1レコード目項目取得処理
	 * 1レコード目の項目を取得します。
	 * 
	 * @param mapParam 対象マップ
	 * @param mapKey マップキー
	 * @param listKey リストキー
	 * @param itemKey 項目キー
	 * @return 取得文字列
	 */
	@SuppressWarnings("unchecked")
	protected static String getColumnValue(HashMap mapParam, String listKey, String itemKey)
	{

		// リストが存在しない場合
		if(!mapParam.containsKey(listKey))
		{
			return null;
		}

		// リストの取得
		ArrayList childList = (ArrayList)mapParam.get(listKey);

		// リストが存在しない場合
		if (childList == null || childList.size() == 0)
		{
			return null;
		}

		// １レコード目の取得
		HashMap childMap = (HashMap)childList.get(0);

		// 項目が存在しない場合
		if(!childMap.containsKey(itemKey))
		{
			return null;
		}
		
		return (String)childMap.get(itemKey);
		
	}

	/**
	 * 行スタイル取得処理です。
	 * 指定したインデックスの場合の、スタイルを取得します。
	 * 
	 * @param lineNo 行番号
	 * @return 行スタイル
	 */
	protected static String getLineStyle(int lineNo)
	{
		if (lineNo % 2 == 0)
		{
			return JCRStrConst.LINE_STYLE_EVEN;
		}
		else
		{
			return JCRStrConst.LINE_STYLE_ODD;
		}
	}

	/**
	 * 固定値取得処理です。
	 * 固定値を取得します。
	 * 
	 * @param param 固定値
	 * @return 固定値
	 */
	protected static String getConstantValue(String param)
	{
		return param;
	}
	
	/**
	 *  ユーザー情報編集処理です。
	 *  "ユーザーID(ユーザー名)"に編集した文字列を返します。
	 * 
	 * @param childMap 情報取得対象
	 * @param id ユーザーID
	 * @param name ユーザー名
	 * @return 編集後文字列
	 */
	protected static String getUserInfo(Map<String, String> childMap, String id, String name)
	{

		// 編集後文字列
		StringBuilder ret = new StringBuilder();

		if(childMap == null || id == null || name == null)
		{
			return ret.toString();
		}

		// ユーザーID
		String userid = childMap.get(id);

		if (!JCRUtilCommon.isNull(userid))
		{
			// 編集後文字列にユーザーIDを加える
			ret.append(userid);
		}

		// ユーザー名
		String username = childMap.get(name);

		if (!JCRUtilCommon.isNull(username))
		{
			// 編集後文字列に(ユーザー名)を加える
			ret.append("(").append(username).append(")") ;
		}

		return ret.toString();
	}

	/**
	 *  編集状態取得処理です。
	 *  アクションタイプコードにより編集状態を編集し、返します。
	 * 
	 * @param childMap 情報取得対象
	 * @param code アクションタイプコード
	 * @param state 編集状態
	 * @return 編集状態
	 */
	protected static String getEditInfo(Map<String, String> childMap, String code,  String state)
	{
		String ret = "";

		// 引数チェック
		if (childMap == null || code == null || state == null)
		{
			return ret;
		}

		String actionTypeCode = childMap.get(code);
		// アクションタイプコードが
		// 新規作成、資料送付、メール受信、クローズ、キャンセル、エスカレーション
		// アクセプト、リジェクト、一括エスカレーション、再開、強制取得の場合
		// 編集状態を'-'にする
		Set<String> checkSet = new HashSet<String>();
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_SHINKI);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_SHIRYO);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_MLJSN);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_CLOSE);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_CNCL);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_ESCL);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_ACCEPT);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_RJCT);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_IKT_ESCL);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_SAIKAI);
		checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_KYOUSEI);

		if(checkSet.contains(actionTypeCode))
		{
			ret = "-";
		}
		else
		{
			String name = childMap.get(state);
			if(!JCRUtilCommon.isNull(name)){
				ret = name;
			}
		}
		
		return ret;
	}

	
	
	/**
	 *  リンク有無取得処理です。
	 * @param childMap 情報取得対象
	 * @param code アクションタイプコード
	 * @return リンク有無(True:リンク有/False:リンク無)
	 */
	protected static boolean getLinkUm(Map<String, String> childMap,String code)
	{

		boolean ret = false;
		
		if (childMap == null)
		{
			return ret;
		}

		String actionTypeCode = childMap.get(code);

		if (!(JCRUtilCommon.isNull(actionTypeCode)))
		{
			// アクションタイプコードが
			// コール対応記録、メモ登録、メール受信、返信メール作成、メール送信、
			// 転送メール作成、メール転送、キャンセルの場合
			Set<String> checkSet = new HashSet<String>();
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_CALL);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_MEMO);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_MLJSN);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_HNSNML);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_MLSSN);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_TNSOML);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_MLTNSO);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_CNCL);
			// ANK-4092-00-00 ADD START
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_SND_SMS_SKSI);
			checkSet.add(JCRStrConst.CD_DIV_ACTION_TYPE_CD_SMS_SND);
			// ANK-4092-00-00 ADD END

			if(checkSet.contains(actionTypeCode))
			{
				ret = true;
			}
		}

		return ret;

	}

	/**
	 * 項目スタイル取得処理です。
	 * 指定した項目名の場合の、スタイルを取得します。
	 * 
	 * @param childMap 情報取得対象
	 * @param code     問合せ状態コード
	 * @return 行スタイル
	 */
	protected static String getItemStyle(Map<String, String> childMap, String code)
	{
		String ret = "";
		if(childMap == null)
		{
			return ret;
		}
		
		String stat = childMap.get(code);
		
		if (JCRStrConst.TOIAWASE_STAT_CD_OPEN.equals(stat))
		{
			ret = JCRStrConst.ITEM_STYLE_OPEN;
		}
		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_OPEN.equals(stat))
		{
			ret =  JCRStrConst.ITEM_STYLE_OPENOTH;
		}
		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_ESCL.equals(stat))
		{
			ret =  JCRStrConst.ITEM_STYLE_ESCL;
		}
		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CLOSE.equals(stat))
		{
			ret =  JCRStrConst.ITEM_STYLE_CLOSE;
		}
		if (JCRStrConst.CD_DIV_TOIAWASE_STAT_CD_CNCL.equals(stat))
		{
			ret =  JCRStrConst.ITEM_STYLE_CNCL;
		}
		
		return ret;
	}

	/**
	 * 項目スタイル取得処理です。
	 * 指定した項目名の場合の、スタイルを取得します。
	 * 
	 * @param childMap 情報取得対象
	 * @param code     お客様ランクコード
	 * @return 行スタイル
	 */
	protected static String getItemStyle2(Map<String, String> childMap, String code)
	{
		String ret = "";
		if(childMap == null)
		{
			return ret;
		}
		
		String stat = childMap.get(code);
		
		if (JCRStrConst.CD_DIV_CUST_RANK_VIP.equals(stat))
		{
			ret = JCRStrConst.ITEM_STYLE_CUST_RANK_VIP;
		}
		if (JCRStrConst.CD_DIV_CUST_RANK_CLAIMER.equals(stat))
		{
			ret =  JCRStrConst.ITEM_STYLE_CUST_RANK_CLAIMER;
		}
		
		return ret;
	}
	
	/**
	 * 対応記録履歴の補正処理です。
	 * アクションタイプに従い出力制御・背景色の設定を行います。
	 * 
	 * @param  taioKirokRireki 補正前データ
	 * @param  setColoer       色設定有無(True:設定有/False:設定無)
	 * @param  dispFlg         表示フラグ(True:画面/False:帳票)
	 * @param  footer          フッター（帳票の場合のみ指定）
	 * @return String          補正後データ
	 */
	protected static String setTaioKirokRireki(String taioKirokRireki, boolean setColoer, boolean dispFlg, String footer)
	{
		StringBuilder ret = new StringBuilder();

		ArrayList<String> listLine = new ArrayList<String>();
		ArrayList<ArrayList<String>> listBlock = new ArrayList<ArrayList<String>>();

		taioKirokRireki = taioKirokRireki.replace(JCRStrConst.KAIGYO_CD, JCRStrConst.KAIGYO_CD_LF).replace(JCRStrConst.KAIGYO_CD_CR, JCRStrConst.KAIGYO_CD_LF);
		String[] obj = taioKirokRireki.replace(JCRStrConst.TAB_CD, JCRStrConst.SPACE_4BYTE).split(JCRStrConst.KAIGYO_CD_LF);

		int maxlength = 60;

		for (int i = 0; i < obj.length; i++)
		{
			String rec = obj[i];

			// 行リストに追加
			listLine.add(rec);

			// 対応記録履歴ライン文字列の場合
			if (JCRStrConst.TAIO_KIROK_HISTORY_LINE.equals(rec)) {
				// ブロックリストに追加
				listBlock.add(listLine);
				// 行リスト初期化
				listLine = new ArrayList<String>();
			}
		}

		// 行リストが存在する場合
		if (listLine.size() > 0)
		{
			// ブロックリストに追加
			listBlock.add(listLine);
		}

		for (int i = 0; i < listBlock.size(); i++)
		{
			listLine = listBlock.get(i);

			for (int j = 0; j < listLine.size(); j++)
			{

				String rec = listLine.get(j);

				// 先頭行の先頭文字が「□」の場合スキップ
				if (j == 0 && rec.startsWith(JCRStrConst.TITLE_MARK_SQUARE_WHITE))
				{
					break;
				}

				// 「■メールヘッダー」の場合
				if (rec.startsWith(JCRStrConst.TAIO_KIROK_HISTORY_TAWS_MAIL_TRKM_TITLE))
				{

					for (j++; j < listLine.size(); j++)
					{
						rec = listLine.get(j);

						// 「■本文」までスキップ
						if (rec.startsWith(JCRStrConst.TAIO_KIROK_HISTORY_TAWS_MAIL_TRKM_TITLE2))
						{
							break;
						}
					}

				}

				// 色設定有の場合
				if (j == 0 && setColoer ==  true) 
				{
					if (rec.startsWith(JCRStrConst.TITLE_MARK_DIA_WHITE)) 
					{
						ret.append(JCRStrConst.TAG_COLOR_PINK ).append(rec).append(JCRStrConst.TAG_BR_COLOR);
					}
					else if (rec.startsWith(JCRStrConst.TITLE_MARK_DIA_BLACK)) 
					{
						ret.append(JCRStrConst.TAG_COLOR_BLUE).append(rec).append(JCRStrConst.TAG_BR_COLOR);
					}
					else if (rec.startsWith(JCRStrConst.TITLE_MARK_STAR_WHITE)) 
					{
						ret.append(JCRStrConst.TAG_COLOR_YELLOW).append(rec).append(JCRStrConst.TAG_BR_COLOR);
					}
					else if (rec.startsWith(JCRStrConst.TITLE_MARK_STAR_BLACK)) 
					{
						ret.append(JCRStrConst.TAG_COLOR_GREEN).append(rec).append(JCRStrConst.TAG_BR_COLOR);
					}
					else 
					{
						ret.append(rec).append(JCRStrConst.TAG_BR);
					}
				}
				else 
				{
					if (dispFlg)
					{
						// 画面の場合
						ret.append(rec).append(JCRStrConst.TAG_BR);
					}
					else
					{
						// 帳票の場合
						int length = rec.length();
						for (int k = 0; k < length; k+=maxlength)
						{
							ret.append(rec.substring(k, Math.min(length, k + maxlength))).append(footer);
						}
					}
				}
			}

		}

		return ret.toString();
	}

	/**
	 * プルダウン項目設定処理です。
	 * プルダウン項目の、コード、名称を設定します。
	 * @param bean フォームDataBean
	 * @param beanIdArray 項目ID
	 * @param serviceIdArray サービスインターフェイス項目リスト
	 * @param mapParam 対象マップ
	 * @param flgBlank 空白有無フラグ（true：空白あり、false：空白なし）
	 */
	@SuppressWarnings("unchecked")
	protected static void setDetailPullDown(X31SDataBeanAccess bean, String[] beanIdArray, String[] serviceIdArray, HashMap mapParam, boolean flgBlank)
	{
		ArrayList<Object> childList = null;

		X31SDataBeanAccessArray listPullDown = bean.getDataBeanArray(beanIdArray[0]);
		childList = null;
		if(mapParam.containsKey(serviceIdArray[0]))
		{
			childList = (ArrayList)mapParam.get(serviceIdArray[0]);

			X31SDataBeanAccess subbean = null;

			if (flgBlank || childList.size() == 0)
			{
				if(listPullDown.getCount() - 1 >= 0)
				{
					subbean = listPullDown.getDataBean(0);
				}
				else
				{
					subbean = listPullDown.addDataBean();
				}

				for (int j = 1; j < beanIdArray.length; j++) 
				{
					// コードリスト ← 空白
					subbean.sendMessageString(beanIdArray[j], X31CWebConst.DATABEAN_SET_VALUE, "");
				}
			}

			for(int i = 0; i < childList.size(); i++)
			{
				if(listPullDown.getCount() > i + 1)
				{
					subbean = listPullDown.getDataBean(i + 1);
				}
				else
				{
					subbean = listPullDown.addDataBean();
				}

				HashMap childMap = (HashMap)childList.get(i);

				// コードリスト ← 空白
				subbean.sendMessageString(beanIdArray[1], X31CWebConst.DATABEAN_SET_VALUE, (String)childMap.get(serviceIdArray[1]));

				String index = String.valueOf(i + 1) + ".";
				for (int j = 2; j < beanIdArray.length; j++) 
				{
					// コードリスト ← 空白
					subbean.sendMessageString(beanIdArray[j], X31CWebConst.DATABEAN_SET_VALUE, index + (String)childMap.get(serviceIdArray[j]));
				}
			}

		}

	}

	/**
	 * プルダウン項目・インデックス取得処理です。
	 * プルダウン項目から、指定コードが設定された場合のインデックスを取得します。
	 * 
	 * @param bean フォームDataBean
	 * @param selectedCode 選択コード
	 * @param codeListId コードリストID
	 * @param codeId コードID
	 * @return 選択インデックス
	 */
	protected static String getDetailPullDownIndex(X31SDataBeanAccess bean, String selectedCode, String codeListId, String codeId)
	{

		// フォームDataBeanがnullの場合
		if (bean == null)
		{
			return null;
		}

		// 選択コードがnullの場合
		if (JCRUtilCommon.isNull(selectedCode))
		{
			return "0";
		}

		// コードリストIDがnullの場合
		if (JCRUtilCommon.isNull(codeListId))
		{
			return "0";
		}

		// コードIDがnullの場合
		if (JCRUtilCommon.isNull(codeId))
		{
			return "0";
		}

		// コードリストデータBeanの取得
		X31SDataBeanAccessArray codeList = bean.getDataBeanArray(codeListId);
		
		int selectedIndex = 0;
		for (int i = 0; i < codeList.getCount(); i++)
		{
			X31SDataBeanAccess codeBean = codeList.getDataBean(i);
			// 選択されたインデックスの場合、ループを終了し、その際のループカウンタをインデックスとする
			if (selectedCode.equals(codeBean.sendMessageString(codeId, X31CWebConst.DATABEAN_GET_VALUE)))
			{
				selectedIndex = i;
				break;
			}
		}
		return String.valueOf(selectedIndex);
	}

	/**
	 * プルダウン項目・選択値取得処理です。
	 * プルダウン項目から、選択された値を取得します。
	 * 
	 * @param pullDwonList プルダウンリスト
	 * @param indexValue 選択インデックス値
	 * @param getValueId 取得対象項目ID
	 * @return 選択値
	 */
	protected static String getDetailPullDownValue(X31SDataBeanAccessArray pullDwonList, String indexValue, String getValueId)
	{
		if (pullDwonList == null)
		{
			return null;
		}

		if (indexValue == null)
		{
			return null;
		}

		X31SDataBeanAccess pullDownBean = pullDwonList.getDataBean(Integer.parseInt(indexValue));
		
		String pullDownValue = pullDownBean.sendMessageString(getValueId, X31CWebConst.DATABEAN_GET_VALUE);
		
		return pullDownValue.substring(pullDownValue.indexOf(".") + 1);

	}
	
	/**
	 * 添付ファイル有無の固定値取得処理です。
	 * 固定値を取得します。
	 * 
	 * @param childMap 情報取得対象
	 * @param code 添付ファイル管理番号
	 * @return 固定値
	 */
	protected static String getTempfiletValue(Map<String, String> childMap, String code)
	{
		if(childMap == null)
		{
			return null;
		}
		
		String stat = childMap.get(code);
		
		if (JCRUtilCommon.isNull(stat))
		{
			return null;
		}
		else
		{
			return JCRStrConst.STR_SQUARE;

		}
	}

	/**
	 * リストデータ作成処理です。
	 * 項目を「,」区切りにして返却します。
	 * 
	 * @param bean  フォームDataBean
	 * @param listNm リスト名
	 * @param selectItem 選択状態
	 * @param itemNm     返却項目名
	 * @return 入力リスト
	 */
	protected static Object makeList(X31SDataBeanAccess bean, String listNm, String selectItem, String itemNm)
	{
		
		StringBuilder retItem = new StringBuilder();
		
		X31SDataBeanAccessArray list = bean.getDataBeanArray(listNm);
		for(int i = 0; i < list.getCount(); i++)
		{
			X31SDataBeanAccess codeBean = list.getDataBean(i);
			
			if(codeBean.sendMessageBoolean(selectItem, X31CWebConst.DATABEAN_GET_VALUE) == true)
			{
				if(retItem.length() > 0)
				{
					retItem.append(JCRStrConst.STR_HALF_COMMA);
				}
				retItem.append(codeBean.sendMessageString(itemNm, X31CWebConst.DATABEAN_GET_VALUE));
			}
		}
		return retItem;
	}
	
	/**
	 * 年月日時の編集を行います。
	 * @param ymdh 編集前年月日時
	 * @return 年月日時編集結果(yyyy/MM/dd HH時頃)
	 */
	public static String editYmdh(String ymdh)
	{
		
		String ret = "";
		String ymd = "";
		String hh = "";
		
		if(ymdh == null || ymdh.getBytes().length < 10)
		{
			return ret;
		}
		ymd = ymdh.substring(0, 8);
		hh = ymdh.substring(8, 10);
		
		if(ymd != null && ymd.trim().length() > 0)
		{
			ret = JCRUtilCommon.formatDate(ymd);
		}
		
		if(hh != null && hh.trim().length() > 0)
		{
			ret = ret + " " + hh + "時頃";
		}
		
		
		return ret;
	}

	/**
	 * 強調文字スタイルの設定を行います。
	 * @param bean            フォームDataBean
	 * @param differenceTime  時間差
	 * @param cbsMsgListKmkNm 一覧の項目名
	 * @param dateNm          年月日名称
	 * @param timeNm          時分秒名称
	 * @param fontStyleNm     フォントスタイル名称
	 */
	public static void setFontStyle(X31SDataBeanAccess bean, String differenceTime, String cbsMsgListKmkNm, String dateNm, String timeNm, String fontStyleNm)
	{
		// 一覧のデータリストを取得する。
		X31SDataBeanAccessArray icrnData = bean.getDataBeanArray(cbsMsgListKmkNm);

		if(!(icrnData == null))
		{
			for (int i = 0; i < icrnData.getCount(); i++)
			{
				String sysDateTime = JCRWebCommon.getSysDateTime();
				String preDate = JCRWebCommon.addTime(sysDateTime, differenceTime, false);
				String backDate = JCRWebCommon.addTime(sysDateTime, differenceTime, true);
				preDate = JCRUtilCommon.formatDate(preDate, JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMDHM);
				backDate = JCRUtilCommon.formatDate(backDate, JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMDHM);

				// 行のデータを取得
				X31SDataBeanAccess rowData = icrnData.getDataBean(i);
				String dateTime = rowData.sendMessageString(dateNm, X31CWebConst.DATABEAN_GET_VALUE)
									+ rowData.sendMessageString(timeNm, X31CWebConst.DATABEAN_GET_VALUE);

				// 比較日時がシステム日付より前後20分以内の場合
				if (!JCRUtilCommon.isNull(dateTime) && !JCRUtilCommon.isNull(preDate) && !JCRUtilCommon.isNull(backDate))
				{
					if(Long.parseLong(preDate) <= Long.parseLong(dateTime) && Long.parseLong(dateTime) <= Long.parseLong(backDate))
					{
						// フォントスタイルを強調文字にする。
						rowData.sendMessageString(fontStyleNm, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.FONT_STYLE_EMPHASIS);
					}
				}
			}
		}
	}
	//---------v29.00.00 ANK-2918-00-00 追加開始---------//
	/**
	 * 強調文字スタイルの設定を行います。
	 * @param bean            フォームDataBean
	 * @param limitoverOkTime  業務パラーメタ@２０分
	 * @param limitoverOkFistTime  業務パラーメタA６０分
	 * @param cbsMsgListKmkNm 一覧の項目名
	 * @param dateNm          年月日名称
	 * @param timeNm          時分秒名称
	 * @param fontStyleNm     フォントスタイル名称
	 */
	public static void setFontStyle2(X31SDataBeanAccess bean, String limitoverOkTime, String limitoverOkFistTime,  String cbsMsgListKmkNm, String dateNm, String timeNm, String fontStyleNm)
	{
		// 一覧のデータリストを取得する。
		X31SDataBeanAccessArray icrnData = bean.getDataBeanArray(cbsMsgListKmkNm);

		if(!(icrnData == null))
		{
			for (int i = 0; i < icrnData.getCount(); i++)
			{
				String sysDateTime = JCRWebCommon.getSysDateTime();
				//業務パラメータ@：６０分前
				String beforeTime = JCRWebCommon.addTime(sysDateTime, limitoverOkFistTime, true);
				//業務パラメータ@：２０分前
				String afterTime = JCRWebCommon.addTime(sysDateTime, limitoverOkTime, true);
				
				sysDateTime = JCRUtilCommon.formatDate(sysDateTime, JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMDHM);
				beforeTime = JCRUtilCommon.formatDate(beforeTime, JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMDHM);
				afterTime = JCRUtilCommon.formatDate(afterTime, JCRStrConst.FMT_YMDHMS, JCRStrConst.FMT_YMDHM);
				// 比較用の境界値
				//20分前
				Long twentyMinutes = Long.parseLong(afterTime) - Long.parseLong(sysDateTime);
				//60分前
				Long sixttyMinutes = Long.parseLong(beforeTime) - Long.parseLong(sysDateTime);
				// 行のデータを取得
				X31SDataBeanAccess rowData = icrnData.getDataBean(i);
				//---------v29.00.00 OM-2017-0000371 DEL START---------//
//				String dateTime = rowData.sendMessageString(dateNm, X31CWebConst.DATABEAN_GET_VALUE)
//									+ rowData.sendMessageString(timeNm, X31CWebConst.DATABEAN_GET_VALUE);
				//---------v29.00.00 OM-2017-0000371 DEL END---------//

				//---------v29.00.00 OM-2017-0000371 ADD START---------//
				// 希望日、希望時間、希望日時
				String kiBoDate = rowData.sendMessageString(dateNm, X31CWebConst.DATABEAN_GET_VALUE);
				String kiBoTime = rowData.sendMessageString(timeNm, X31CWebConst.DATABEAN_GET_VALUE);
				String dateTime = null;

				// 希望日が「null」あるいは「空白」以外の場合
				if (!StringUtils.isEmpty(kiBoDate))
				{
					//希望時間が「null」あるいは「空白」の場合
					if (StringUtils.isEmpty(kiBoTime))
					{
						dateTime = kiBoDate + "0000";
					}
					//それ以外の場合
					else{
						dateTime = kiBoDate + kiBoTime;
					}
				}
				//---------v29.00.00 OM-2017-0000371 ADD END---------//
				
				if (!JCRUtilCommon.isNull(dateTime) && !JCRUtilCommon.isNull(beforeTime) && !JCRUtilCommon.isNull(afterTime)&&!JCRUtilCommon.isNull(sysDateTime))
				{
					//---------v29.00.00 OM-2017-0000371 DEL START---------//
					// 赤文字強調表示：「コールバック希望日時」-「運用日時」>= 0	あるいは「運用日時」-「コールバック希望日時」<=  20分
//					if( (Long.parseLong(sysDateTime) - Long.parseLong(dateTime)  ) >= 0
//							|| (Long.parseLong(dateTime) -Long.parseLong(sysDateTime)) <= twentyMinutes)
					//---------v29.00.00 OM-2017-0000371 DEL END---------//

					//---------v29.00.00 OM-2017-0000371 ADD START---------//
					// 赤文字強調表示：0分 <=「コールバック希望日時」-「運用日時」<=  20分
					if( (Long.parseLong(dateTime) -Long.parseLong(sysDateTime) ) >=0
						&& (Long.parseLong(dateTime) -Long.parseLong(sysDateTime)) <= twentyMinutes)
					//---------v29.00.00 OM-2017-0000371 ADD END---------//
					{
						// フォントスタイルを強調文字にする。
						rowData.sendMessageString(fontStyleNm, X31CWebConst.DATABEAN_SET_VALUE, JCRStrConst.FONT_STYLE_EMPHASIS);
					}
					//---------v29.00.00 OM-2017-0000371 DEL START---------//
					// 緑色文字強調表示：20分<「運用日時」-「コールバック希望日時」<=  60分
					//---------v29.00.00 OM-2017-0000371 DEL END---------//
					//---------v29.00.00 OM-2017-0000371 ADD START---------//
					// 緑色文字強調表示：20分<「コールバック希望日時」-「運用日時」<=  60分
					//---------v29.00.00 OM-2017-0000371 ADD END---------//
					else if ( (Long.parseLong(dateTime) - Long.parseLong(sysDateTime)  ) > twentyMinutes  
							&& (Long.parseLong(dateTime) - Long.parseLong(sysDateTime)) <= sixttyMinutes)
					{
						// フォントスタイルを強調文字にする。
						rowData.sendMessageString(fontStyleNm, X31CWebConst.DATABEAN_SET_VALUE, "EMPHASIS2");
					}
					//---------v29.00.00 OM-2017-0000371 ADD START---------//
					// オレンジ色強調表示：希望日時超過
					else if ((Long.parseLong(dateTime) -Long.parseLong(sysDateTime)) < 0)
					{
						// フォントスタイルを強調文字にする。
						rowData.sendMessageString(fontStyleNm, X31CWebConst.DATABEAN_SET_VALUE, "EMPHASIS3");
					//---------v29.00.00 OM-2017-0000371 ADD END---------//
					}
					
				}
			}
		}
	}
	//---------v29.00.00 ANK-2918-00-00 追加開始---------//
	/**
	 * 元号コードに紐づく元号（アルファベット1文字）を返します。
	 * @param 元号コード
	 * @return 元号
	 */
	public static String getGengoS(String gengoCd)
	{
		String ret = "";

		if(gengoCd.equals(JCRStrConst.CD_DIV_GENGO_CD_MEIJI))
		{
			ret = JCRStrConst.GENGO_MEIJI;
		}
		else if(gengoCd.equals(JCRStrConst.CD_DIV_GENGO_CD_TAISHO))
		{
			ret = JCRStrConst.GENGO_TAISHO;
		}
		else if(gengoCd.equals(JCRStrConst.CD_DIV_GENGO_CD_SHOWA))
		{
			ret = JCRStrConst.GENGO_SHOWA;
		}
		else if(gengoCd.equals(JCRStrConst.CD_DIV_GENGO_CD_HEISEI))
		{
			ret = JCRStrConst.GENGO_HEISEI;
		}
// ANK-3640-00-00 ADD START
		else if(gengoCd.equals(JCRStrConst.CD_DIV_GENGO_CD_REIWA))
		{
			ret = JCRStrConst.GENGO_REIWA;
		}
// ANK-3640-00-00 ADD END

		return ret;
	}

	/**
	 * 元号（アルファベット1文字）に紐づく元号コードを返します。
	 * @param 元号
	 * @return 元号コード
	 */
	public static String getGengoCdS(String gengoS)
	{
		String ret = "";

		if(gengoS.equals(JCRStrConst.GENGO_MEIJI))
		{
			ret = JCRStrConst.CD_DIV_GENGO_CD_MEIJI;
		}
		else if(gengoS.equals(JCRStrConst.GENGO_TAISHO))
		{
			ret = JCRStrConst.CD_DIV_GENGO_CD_TAISHO;
		}
		else if(gengoS.equals(JCRStrConst.GENGO_SHOWA))
		{
			ret = JCRStrConst.CD_DIV_GENGO_CD_SHOWA;
		}
		else if(gengoS.equals(JCRStrConst.GENGO_HEISEI))
		{
			ret = JCRStrConst.CD_DIV_GENGO_CD_HEISEI;
		}
// ANK-3640-00-00 ADD START
		else if(gengoS.equals(JCRStrConst.GENGO_REIWA))
		{
			ret = JCRStrConst.CD_DIV_GENGO_CD_REIWA;
		}
// ANK-3640-00-00 ADD END

		return ret;
	}

	/**
	 * 日付に対し、月の加減算を行い、結果の日付を返します。 <br>
	 * 
	 * @param arg0 加減算する日付 （８桁、１４桁、１７桁）
	 * @param arg1 加算する月数 （負値は減算）
	 * @return 加減算された日付
	 */
	public static String addSubtractMonth(String arg0, int arg1)
	{
		// 日付チェックを行う
		if (!dateCheck(arg0))
		{
			return null;
		}

		int arg0Length = arg0.length();

		Calendar calendar = transCalendar(arg0, arg0Length);

		SimpleDateFormat form = transFormat(arg0Length);

		calendar.add(Calendar.MONTH, arg1);

		return form.format(calendar.getTime());
	}

	/**
	 * String型で渡された日付をCalendar型に変換します。 <br>
	 * 
	 * @param date 変換する日付
	 * @param length 変換する日付書式の桁数
	 * @return 日付書式に変換された文字列
	 * */
	private static Calendar transCalendar(String date, int length)
	{
		SimpleDateFormat form = transFormat(length);

		Calendar carender = Calendar.getInstance();

		try
		{
			carender.setTime(form.parse(date));
		}
		catch (Exception e)
		{
			return null;
		}
		return carender;
	}

	/**
	 * int型で渡された桁数からSimpleDateFormat型を返します。 <br>
	 * 
	 * @param length 変換する日付書式の桁数
	 * @return 日付書式に変換された文字列
	 */
	private static SimpleDateFormat transFormat(int length)
	{
		SimpleDateFormat form;

		if (length == 8)
		{
			form = new SimpleDateFormat("yyyyMMdd");
		}
		else if (length == 14)
		{
			form = new SimpleDateFormat("yyyyMMddHHmmss");
		}
		else
		{
			form = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		}

		return form;
	}

	/**
	 * 日付のチェックを行います。 <br>
	 * 
	 * @param arg0 チェックを行う文字列
	 * @return チェック結果
	 */
	private static boolean dateCheck(String arg0)
	{
		if (Integer.parseInt(arg0.substring(0, 8)) == 0)
		{
			return false;
		}

		if (arg0.indexOf('-') != -1 || arg0.indexOf('.') != -1)
		{
			return false;
		}

		int arg0Length = arg0.length();

		if (arg0Length != 8 && arg0Length != 14 && arg0Length != 17)
		{
			return false;
		}

		return true;
	}

	/**
	 * 事務手数料計算処理
	 * 一時金設定コードの値によって事務手数料の算出を行い、結果に円を付与して返す。
	 * @param ichjknSetCd      一時金設定コード
	 * @param strIcjknSetAmnt  一時金設定額
	 * @param strTmpPayPrcAmnt 一時支払料金額
	 */
	public static String getJimFee(String ichjknSetCd, String strIcjknSetAmnt, String strTmpPayPrcAmnt)
	{
		BigDecimal jmFee = new BigDecimal(0);			// 事務手数料
		BigDecimal icjknSetAmnt = new BigDecimal(0);	// 一時金設定額
		BigDecimal tmpPayPrcAmnt = new BigDecimal(0);	// 一時支払料金額

		// BigDecimalに変換
		if(strTmpPayPrcAmnt != null && !("".equals(strTmpPayPrcAmnt)))
		{
			tmpPayPrcAmnt = new BigDecimal(strTmpPayPrcAmnt);
		}
		if(strIcjknSetAmnt != null && !("".equals(strIcjknSetAmnt)))
		{
			icjknSetAmnt = new BigDecimal(strIcjknSetAmnt);
		}

		// 一時金設定コードにより、事務手数料を計算する
		// 一時金設定コード：有
		if(JCRStrConst.ICHJKN_SETTE_CD_ARI.equals(ichjknSetCd))
		{
			jmFee = tmpPayPrcAmnt;
		}
		// 一時金設定コード：半額
		else if(JCRStrConst.ICHJKN_SETTE_CD_HALF.equals(ichjknSetCd))
		{
			jmFee = tmpPayPrcAmnt.divide(new BigDecimal("2"));
		}
		// 一時金設定コード：指定額
		else if(JCRStrConst.ICHJKN_SETTE_CD_SHITEI.equals(ichjknSetCd))
		{
			jmFee = icjknSetAmnt;
		}

		// 少数切り捨て
		jmFee = jmFee.setScale(0, BigDecimal.ROUND_DOWN);

		// 計算結果を返却
		return JPCUtilCommon.formatNumber(String.valueOf(jmFee.longValue())) + JCRStrConst.KINGAKU_YEN;
	}

	/**
	 * 終了年月日が20991231235959だった場合、ブランクに置換します。
	 * @param bean       フォームDataBean
	 * @param listKmkNm  一覧の項目名
	 * @param endDtmName 終了年月日時分秒名称
	 */
	public static void replaceEndDtm(X31SDataBeanAccess bean, String listKmkNm, String endDtmName)
	{
		// 一覧のデータリストを取得する。
		X31SDataBeanAccessArray icrnData = bean.getDataBeanArray(listKmkNm);

		if(!(icrnData == null))
		{
			for (int i = 0; i < icrnData.getCount(); i++)
			{
				
				// 行のデータを取得する。
				X31SDataBeanAccess rowData = icrnData.getDataBean(i);
				String ymd = rowData.sendMessageString(endDtmName, X31CWebConst.DATABEAN_GET_VALUE);
				if(JCRStrConst.ENDDTM.equals(ymd))
				{
					// ブランクを設定する。
					rowData.sendMessageString(endDtmName, X31CWebConst.DATABEAN_SET_VALUE, "");
				}
			}
		}
	}

// v12.00.00 ANK-2356-00-00 ADD START
	/**
	 * Timestamp暗号化処理<br>
	 * Timestampの文字列(14桁)を暗号化した値を返します。
	 * 
	 * @param timestamp タイムスタンプ
	 * @return Timestampの文字列(14桁)を暗号化した値
	 */
	public static String encryptTimestamp(String timestamp)
	{
		// 年月日時分秒の下一桁
		String strLast = timestamp.substring(13, 14);
		int intLast = Integer.parseInt(strLast);

		// 置換表に従い、置換された文字列
		StringBuilder repStr = new StringBuilder();

		// 秒の下一桁自身以外に対する処理
		for (int i = 0; i < 13; i++)
		{
			// 年月日時分秒の各桁に秒の下一桁を足し、その足した値の下一桁を設定（秒の下一桁自身には足さない）
			char ch = timestamp.charAt(i);
			int num = (Character.digit(ch, 10) + intLast) % 10;

			// 置換表に従ってアルファベットに置換
			repStr.append(REPLACE_MAP.get(String.valueOf(num)));
		}

		// 下一桁を置換表に従ってアルファベットに置換
		repStr.append(REPLACE_MAP.get(strLast));

		// 固定のパターンに従って文字列を並び替え
		StringBuilder encStr = new StringBuilder();

		// 1文字目
		encStr.append(repStr.substring(0, 1));
		// 2文字目
		encStr.append(repStr.substring(12, 13));
		// 3文字目
		encStr.append(repStr.substring(2, 3));
		// 4文字目
		encStr.append(repStr.substring(10, 11));
		// 5文字目
		encStr.append(repStr.substring(4, 5));
		// 6文字目
		encStr.append(repStr.substring(8, 9));
		// 7文字目
		encStr.append(repStr.substring(6, 7));
		// 8文字目
		encStr.append(repStr.substring(13, 14));
		// 9文字目
		encStr.append(repStr.substring(1, 2));
		// 10文字目
		encStr.append(repStr.substring(11, 12));
		// 11文字目
		encStr.append(repStr.substring(3, 4));
		// 12文字目
		encStr.append(repStr.substring(9, 10));
		// 13文字目
		encStr.append(repStr.substring(5, 6));
		// 14文字目
		encStr.append(repStr.substring(7, 8));

		return encStr.toString();
	}
// v12.00.00 ANK-2356-00-00 ADD END

// ANK-3475-00-00 ADD START
	/**
	 * 受付種別のプルダウン項目設定処理です。
	 * プルダウン項目の、コード、名称を設定します。問合せ種別がコールの場合はコールを削除して設定します。
	 * 
	 * @param bean フォームDataBean
	 * @param beanIdArray 項目ID
	 * @param mapParam 対象マップ
	 * @param serviceIdArray サービスインターフェイス項目リスト
	 * @param flgBlank 空白有無フラグ（true：空白あり、false：空白なし）
	 * @param toiawaseUkSbtCd 問合せ受付種別コード
	 */
	@SuppressWarnings("unchecked")
	protected static void setPullDown(X31SDataBeanAccess bean, String[] beanIdArray, HashMap mapParam, String[] serviceIdArray, boolean flgBlank, String toiawaseUkSbtCd)
	{

		ArrayList<Object> childList = null;

		X31SDataBeanAccessArray listPullDown = bean.getDataBeanArray(beanIdArray[0]);
		childList = null;
		if(mapParam.containsKey(serviceIdArray[0]))
		{
			childList = (ArrayList)mapParam.get(serviceIdArray[0]);

			X31SDataBeanAccess subbean = null;

			if(listPullDown.getCount() - 1 >= 0)
			{
				subbean = listPullDown.getDataBean(0);
			}
			else
			{
				subbean = listPullDown.addDataBean();
			}

			if (flgBlank)
			{
				for (int i = 2; i < beanIdArray.length; i++) 
				{
					// コードリスト ← 空白
					subbean.sendMessageString(beanIdArray[i], X31CWebConst.DATABEAN_ADD_VALUE, "");
				}
			}
			
			for(int i = 0; i < childList.size(); i++)
			{
				HashMap childMap = (HashMap)childList.get(i);
				// 問合せ種別コードがコールではない場合
				if (!"007".equals(toiawaseUkSbtCd))
				{
					// コード区分がコールではない場合
					if (!"007".equals(childMap.get("cd_div")))
					{
						// コードリスト ← コード区分
						subbean.sendMessageString(beanIdArray[2], X31CWebConst.DATABEAN_ADD_VALUE, (String)childMap.get(serviceIdArray[1]));
					}
				}
				else
				{
					// コードリスト ← コード区分
					subbean.sendMessageString(beanIdArray[2], X31CWebConst.DATABEAN_ADD_VALUE, (String)childMap.get(serviceIdArray[1]));
				}
				String index = String.valueOf(i + 1) + ".";
				for (int j = 3; j < beanIdArray.length; j++) 
				{
					// 問合せ受付種別コードがコールの場合
					if ("007".equals(toiawaseUkSbtCd))
					{
						// 名称リスト ← インデックス番号.受付種別名
						subbean.sendMessageString(beanIdArray[j], X31CWebConst.DATABEAN_ADD_VALUE, index + (String)childMap.get(serviceIdArray[j-1]));
					}
					// 問合せ受付種別コードがコールではない場合
					else if (!"007".equals(toiawaseUkSbtCd))
					{
						// コード区分がコールでない場合
						if (!"007".equals(childMap.get("cd_div")))
						{
							// 名称リスト ← インデックス番号.受付種別名
							subbean.sendMessageString(beanIdArray[j], X31CWebConst.DATABEAN_ADD_VALUE, index + (String)childMap.get(serviceIdArray[j-1]));
						}
					}
				}

			}

		}

	}
// ANK-3475-00-00 ADD END

	// ANK-3593-00-00 ADD START
	/**
	 * 対応履歴外部接続ＵＲＬ（お客さまカルテ画面起動用）の文字列置換処理です。
	 * URLの置き換え文字SYSID、OP担当業務コード、ワンタイムパスワード
	 * 
	 * @param url
	 * @param sysid
	 * @param opTntWorkCd
	 * @param onetPwd
	 */
	public static String urlCkan(String url, String sysid, String opTntWorkCd, String onetPwd)
	{
		// ＳＹＳＩＤ
		String repUrl = url.replaceAll(REPLACE_SYSID, sysid);
		// ＯＰ担当業務コード
		repUrl = repUrl.replaceAll(REPLACE_OP_TNT_WORK_CD, opTntWorkCd);
		// ワンタイムパスワード
		repUrl = repUrl.replaceAll(REPLACE_ONET_PWD, onetPwd);
		
		return repUrl;
	}
	// ANK-3593-00-00 ADD END
}
