/*
 * MosP - Mind Open Source Project    http://www.mosp.jp/
 * Copyright (C) MIND Co., Ltd.       http://www.e-mind.co.jp/
 * 
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
package jp.mosp.common;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;

import jp.mosp.common.common.HtmlUtility;
import jp.mosp.common.common.ListVo;
import jp.mosp.common.common.MospConst;
import jp.mosp.common.common.MospException;
import jp.mosp.common.common.MospUtility;
import jp.mosp.common.common.ValidateUtility;
import jp.mosp.common.dto.CmAspUserDto;
import jp.mosp.common.dto.CmUserDto;
import jp.mosp.common.dto.MosPConfDto;
import jp.mosp.common.utils.NumberUtil;
import jp.mosp.common.utils.StringUtil;
import jp.mosp.common.utils.VariousUtil;

/**
 * @author yoshida
 *
 */
public class MosPVo extends ListVo {
	
	private static final long	serialVersionUID	= 2955340745357599845L;
	
	// メニューコマンド
	/**
	 * K1910
	 */
	public final String			CMD_MENU_INPUT		= CommonConst.CMD_MENU_INPUT;
	/**
	 * K2910
	 */
	public final String			CMD_MENU_MAMAGE		= CommonConst.CMD_MENU_MAMAGE;
	/**
	 * P1910
	 */
	public final String			CMD_MENU_PAYROLL	= CommonConst.CMD_MENU_PAYROLL;
	/**
	 * H1910
	 */
	public final String			CMD_MENU_HUMAN		= CommonConst.CMD_MENU_HUMAN;
	/**
	 * 未使用
	 */
	public final String			CMD_MENU_SYSTEM		= CommonConst.CMD_MENU_SYSTEM;
	/**
	 * S2910
	 */
	public final String			CMD_MENU_SYSTEM2	= CommonConst.CMD_MENU_SYSTEM2;
	/**
	 * namキー(コマンドNo.)
	 */
	public static final String	C_MENU_BTN_CMD		= "C_MENU_BTN_CMD";
	/**
	 * namキー(ボタン名称)
	 */
	public static final String	C_MENU_BTN_NAM		= "C_MENU_BTN_NAM";
	/**
	 * namキー(サブタイトル)
	 */
	public static final String	C_MENU_SUB_TITLE	= "C_MENU_SUB_TITLE";
	
	private String				lblKCode;
	private String				lblKName;
	private String				lblSectionName;
	

	/**
	 * コンストラクタ
	 */
	public MosPVo() {
		super();
		needDirectJs = true;
	}
	
	@Override
	public void initVo(Properties cfg, Properties msg, String cmd, CmAspUserDto aspUser, CmUserDto user) {
		super.initVo(cfg, msg, cmd, aspUser, user);
		// 拡張JSの設定
		setExtraJs();
	}
	
	/**
	 * サブタイトル取得
	 * @param subTitle サブタイトル
	 * @param cmdMenu  メニューコマンド
	 * @return サブタイトルHTML文字列
	 */
	@Deprecated
	public String getSubTitle(String subTitle, String cmdMenu) {
		return getSubTitle(subTitle, cmdMenu, cmdMenu, subTitle);
	}
	
	/**
	 * サブタイトル取得（サブメニュー内）
	 * @param subTitle 		サブタイトル
	 * @param cmdMenu  		メニューコマンド
	 * @param cmdUp			上位コマンド
	 * @param cmdUpName		上位コマンド名
	 * @return サブタイトルHTML文字列
	 */
	@Deprecated
	public String getSubTitle(String subTitle, String cmdMenu, String cmdUp, String cmdUpName) {
		String tag = null;
		if (useLogo()) {
			tag = getTagSubTitleLogo(subTitle, cmdMenu, cmdUp, cmdUpName);
		} else {
			tag = getTagSubTitleNoLogo(subTitle, cmdMenu, cmdUp, cmdUpName);
		}
		return tag;
	}
	
	/**
	 * サブタイトル取得（サブメニュー内）
	 * @param subTitle		サブタイトル
	 * @param cmdMenu		メニューコマンド
	 * @param cmdUp			上位コマンド
	 * @param cmdUpName		上位コマンド名
	 * @return サブタイトルHTML文字列
	 */
	@Deprecated
	private String getTagSubTitleLogo(String subTitle, String cmdMenu, String cmdUp, String cmdUpName) {
		StringBuffer sb = new StringBuffer();
		sb.append("<div class=\"Header\">");
		sb.append("<table><tr>");
		sb.append("<td id=\"logoTd\" >");
		sb.append("<div class=\"logoBar\">");
		sb.append(getTagLogoImage());
		sb.append("</div>");
		sb.append("</td><td>");
		sb.append("<div class=\"SubTitleBar\">");
		sb.append(subTitle);
		sb.append("</div>");
		sb.append("</td><td>");
		sb.append("<div class=\"MenuButtonBar\">");
		if (!cmdUp.equals(cmdMenu)) {
			sb.append(getButtonTag("", cmdUp, cmdUpName));
		}
		sb.append(getButtonTag("btnMenu", cmdMenu, CommonConst.NAM_TO_MENU));
		sb.append(getButtonTag("btnLogout", MospConst.CMD_LOGOUT, CommonConst.NAM_LOGOUT));
		sb.append("</div>");
		sb.append("</td></tr></table>");
		sb.append("</div>");
		return sb.toString();
	}
	
	/**
	 * サブタイトル取得（サブメニュー内）
	 * @param subTitle		サブタイトル
	 * @param cmdMenu		メニューコマンド
	 * @param cmdUp			上位コマンド
	 * @param cmdUpName		上位コマンド名
	 * @return サブタイトルHTML文字列
	 */
	@Deprecated
	private String getTagSubTitleNoLogo(String subTitle, String cmdMenu, String cmdUp, String cmdUpName) {
		StringBuffer sb = new StringBuffer();
		sb.append("<div class=\"Header\">");
		sb.append("<div class=\"MenuButtonBar\">");
		if (!cmdUp.equals(cmdMenu)) {
			sb.append(getButtonTag("", cmdUp, cmdUpName));
		}
		sb.append(getButtonTag("btnMenu", cmdMenu, CommonConst.NAM_TO_MENU));
		sb.append(getButtonTag("btnLogout", MospConst.CMD_LOGOUT, CommonConst.NAM_LOGOUT));
		sb.append("</div>");
		sb.append("<div class=\"SubTitleBar\">");
		sb.append(subTitle);
		sb.append("</div>");
		sb.append("</div>");
		return sb.toString();
	}
	
	/**
	 * ボタンタグ取得
	 * @param id		id
	 * @param cmd		コマンドNo.
	 * @param name		ボタン名称
	 * @return ボタンタグHTML文字列
	 */
	public static String getButtonTag(String id, String cmd, String name) {
		StringBuffer sb = new StringBuffer();
		sb.append("<button type=\"button\" ");
		if (id.length() != 0) {
			sb.append("id=\"");
			sb.append(id);
			sb.append("\"");
		}
		sb.append(" onclick=\"doSubmit(document.form, '");
		sb.append(cmd);
		sb.append("')\">");
		sb.append(name);
		sb.append("</button>");
		return sb.toString();
	}
	
	/**
	 * ボタンタグ取得
	 * @param id		id
	 * @param cssClass cssのクラス
	 * @param cmd		コマンドNo.
	 * @param name		ボタン名称
	 * @return ボタンタグHTML文字列
	 */
	public static String getButtonTag(String id, String cssClass, String cmd, String name) {
		StringBuffer sb = new StringBuffer();
		sb.append("<button type=\"button\" ");
		if (id.length() != 0) {
			sb.append("id=\"");
			sb.append(id);
			sb.append("\"");
		}
		sb.append(" class=\"");
		sb.append(cssClass);
		sb.append("\"");
		sb.append(" onclick=\"doSubmit(document.form, '");
		sb.append(cmd);
		sb.append("')\">");
		sb.append(name);
		sb.append("</button>");
		return sb.toString();
	}
	
	/**
	 * ロゴイメージタグ取得
	 * @return ロゴイメージタグHTML文字列
	 */
	@Deprecated
	public String getTagLogoImage() {
		if (useLogo()) {
			return HtmlUtility.getTagLogoImage(CommonConst.FILE_LOGO, CommonConst.NAME_LOGO);
		}
		return "";
	}
	
	/**
	 * ロゴ利用可否判断
	 * @return
	 * <p>
	 * ロゴを利用する場合true、そうでない場合false
	 * </p>
	 */
	@Deprecated
	public boolean useLogo() {
		return Boolean.parseBoolean(cfg.getProperty(CommonConst.PPT_USE_LOGO));
	}
	
	/**
	 * パラメータ設定
	 * @param request リクエスト
	 */
	public void setParams(HttpServletRequest request) {
		
	}
	
	/**
	 * JavaScript(設定配列)取得
	 * @param name       変数名
	 * @param arySetting 設定配列(String[i][2])
	 * @return JavaScript(設定配列)文字列
	 */
	public static String getDefaultJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Object();");
		for (String[] element : arySetting) {
			sb.append(name);
			sb.append("[\"");
			sb.append(escapeHTML(element[0]));
			sb.append("\"] = \"");
			sb.append(escapeHTML(element[1]));
			sb.append("\";");
		}
		return sb.toString();
	}
	
	/**
	 * JavaScript(設定配列)取得
	 * @param name       変数名
	 * @param arySetting 設定配列
	 * @return JavaScript(設定配列)文字列
	 */
	public static String getSettingJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Object();");
		for (String[] element : arySetting) {
			sb.append(name);
			sb.append("[\"");
			sb.append(escapeHTML(element[0]));
			sb.append("\"] = new Array(");
			sb.append(element.length - 1);
			sb.append(");");
			for (int j = 1; j < element.length; j++) {
				sb.append(name);
				sb.append("[\"");
				sb.append(escapeHTML(element[0]));
				sb.append("\"][");
				sb.append(j - 1);
				sb.append("] = \"");
				sb.append(escapeHTML(element[j]));
				sb.append("\";");
			}
		}
		return sb.toString();
	}
	
	/**
	 * JavaScript(設定配列)取得
	 * @param name       変数名
	 * @param arySetting 設定配列
	 * @return JavaScript(設定配列)文字列
	 */
	public static String getArrayJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Array(");
		sb.append(arySetting.length);
		sb.append(");");
		for (String[] element : arySetting) {
			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(element[0]));
			sb.append("] = new Array(");
			sb.append(2);
			sb.append(");");
			
			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(element[0]));
			sb.append("][");
			sb.append(0);
			sb.append("] = \"");
			sb.append(escapeHTML(element[0]));
			sb.append("\";");
			
			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(element[0]));
			sb.append("][");
			sb.append(1);
			sb.append("] = \"");
			sb.append(escapeHTML(element[1]));
			sb.append("\";");
		}
		return sb.toString();
	}
	
	/**
	 * JavaScript(設定配列)取得
	 * @param name       変数名
	 * @param arySetting 設定配列
	 * @return JavaScript(設定配列)文字列
	 */
	public static String getArrayCodeJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Array(");
		sb.append(arySetting.length);
		sb.append(");");
		for (int i = 0; i < arySetting.length; i++) {
			sb.append(name);
			sb.append("[");
			sb.append(i);
			sb.append("] = new Array(");
			sb.append(2);
			sb.append(");");
			
			sb.append(name);
			sb.append("[");
			sb.append(i);
			sb.append("][");
			sb.append(0);
			sb.append("] = \"");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("\";");
			
			sb.append(name);
			sb.append("[");
			sb.append(i);
			sb.append("][");
			sb.append(1);
			sb.append("] = \"");
			sb.append(escapeHTML(arySetting[i][1]));
			sb.append("\";");
		}
		return sb.toString();
	}
	
	/**
	 * JavaScript(設定配列)取得
	 * @param name		変数名
	 * @param aryCodes	設定配列
	 * @return JavaScript(設定配列)文字列
	 */
	public static String getCodesJs(String name, ArrayList<String[][]> aryCodes) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Object();");
		for (int i = 0; i < aryCodes.size(); i++) {
			String[][] aryCode = aryCodes.get(i);
			if (aryCode.length == 0 || aryCode[0].length == 0) {
				break;
			}
			sb.append(name);
			sb.append("[\"");
			sb.append(escapeHTML(aryCode[0][0]));
			sb.append("\"] = new Array(");
			sb.append(aryCode.length);
			sb.append(");");
			for (int j = 0; j < aryCode.length; j++) {
				sb.append(name);
				sb.append("[\"");
				sb.append(escapeHTML(aryCode[j][0]));
				sb.append("\"][" + j + "] = new Array(");
				sb.append(aryCode[j].length - 1);
				sb.append(");");
				for (int k = 1; k < aryCode[j].length; k++) {
					sb.append(name);
					sb.append("[\"");
					sb.append(escapeHTML(aryCode[j][0]));
					sb.append("\"][" + j + "][");
					sb.append(k - 1);
					sb.append("] = \"");
					sb.append(escapeHTML(aryCode[j][k]));
					sb.append("\";");
				}
			}
		}
		return sb.toString();
	}
	
	/**
	 * チェックボックスリクエストパラメータ取得
	 * @param value チェックボックスリクエストパラメータ値
	 * @return 変換チェックボックスリクエストパラメータ値
	 */
	public String getCheckBoxParam(String value) {
		if (value == null) {
			return String.valueOf(CommonConst.CHECKBOX_OFF);
		} else if (value.equals(CommonConst.CHECKBOX_CHARACTER_ON)) {
			return String.valueOf(CommonConst.CHECKBOX_ON);
		} else {
			return value;
		}
	}
	
	/**
	 * チェックボックスリクエストパラメータ取得(配列用)
	 * @param aryValue チェックボックスリクエストパラメータ値(配列)
	 * @return 変換チェックボックスリクエストパラメータ値(配列)
	 */
	public String[] getAryCheckBoxParam(String[] aryValue) {
		String[] aryString;
		aryString = new String[aryValue.length];
		for (int i = 0; i < aryValue.length; i++) {
			if (aryValue[i] == null) {
				aryString[i] = String.valueOf(CommonConst.CHECKBOX_OFF);
			} else if (aryValue[i].equals(CommonConst.CHECKBOX_CHARACTER_ON)) {
				aryString[i] = String.valueOf(CommonConst.CHECKBOX_ON);
			} else {
				aryString[i] = aryValue[i];
			}
		}
		return aryString;
	}
	
	/**
	 * チェックボックスリクエストパラメータ取得
	 * @param value チェックボックスリクエストパラメータ値
	 * @return 変換チェックボックスリクエストパラメータ値
	 */
	public String getCheckBoxChecked(String value) {
		if (value == null) {
			return "";
		} else if (value.equals("0")) {
			return "";
		}
		return "checked=\"checked\"";
	}
	
	/**
	 * チェックボックスリクエストパラメータ取得(配列用)
	 * @param aryValue チェックボックスリクエストパラメータ値(配列)
	 * @return 変換チェックボックスリクエストパラメータ値(配列)
	 */
	public String[] getAryCheckBoxChecked(String[] aryValue) {
		String[] aryString;
		aryString = new String[aryValue.length];
		for (int i = 0; i < aryValue.length; i++) {
			if (aryValue[i] == null) {
				aryString[i] = "";
			} else if (aryValue[i].equals("0")) {
				aryString[i] = "";
			} else {
				aryString[i] = "checked=\"checked\"";
			}
		}
		return aryString;
	}
	
	/**
	 * 配列エスケープ
	 * @param array 対象配列
	 * @return エスケープ済みの配列
	 */
	public static String[] escapeArray(String[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i] = escapeHTML(array[i]);
		}
		return array;
	}
	
	/**
	 * 配列エスケープ
	 * @param array 対象配列
	 * @return エスケープ済みの配列
	 */
	public static String[][] escapeArray(String[][] array) {
		for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[i].length; j++) {
				array[i][j] = escapeHTML(array[i][j]);
			}
		}
		return array;
	}
	
	/**
	 * セレクトオプション出力
	 * @param array セレクトオプション内容
	 * @param value 初期選択値
	 * @return HTMLセレクトオプション文字列
	 */
	public static String getSelectOption(String[][] array, String[] value) {
		StringBuffer sb = new StringBuffer();
		for (String[] element : array) {
			String selected = "";
			if (value != null) {
				for (String element2 : value) {
					if (element[0].equals(element2)) {
						selected = "selected=\"selected\"";
					}
				}
			}
			sb.append("<option value=\"");
			sb.append(element[0]);
			sb.append("\"");
			sb.append(selected);
			sb.append(">");
			sb.append(element[1]);
			sb.append("</option>");
		}
		return sb.toString();
	}
	
	/**
	 * 名称取得
	 * @param code  取得対象コード
	 * @param array コードとコード名称を含んだ配列
	 * @return コード名称
	 */
	protected String getCodeName(String code, String[][] array) {
		return StringUtil.getCodeName(code, array);
	}
	
	/**
	 * 日付妥当性確認(和暦)
	 * @param list      和暦情報リスト
	 * @param era       年号
	 * @param year      年
	 * @param month     月(1〜12)
	 * @param day       日
	 * @param name      確認対象名称
	 * @param idYear    確認対象フィールドID
	 * @param idDay     確認対象フィールドID
	 * @param isDetails 明細フラグ
	 * @param rowNo     行番号
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	protected void checkDate(List<MosPConfDto> list, String era, int year, int month, int day, String name,
			String idYear, String idDay, boolean isDetails, int rowNo) throws MospException {
		for (MosPConfDto dto : list) {
			if (!dto.getConfId().equals(era)) {
				continue;
			}
			Date startDate = getDate(dto.getConfCode());
			Date endDate = getDate(dto.getConfValue());
			int gregorianYear = MospUtility.getYear(startDate) + year - 1;
			Date date = getDate(list, era, String.valueOf(year), String.valueOf(month), String.valueOf(day));
			if (isDetails) {
				checkDate(gregorianYear, month, day, name, rowNo, idDay);
				if (ValidateUtility.chkDate(year, month - 1, day)) {
					checkTerm(date, startDate, endDate, name, rowNo, idYear);
				}
			} else {
				checkDate(gregorianYear, month, day, name, idDay);
				if (ValidateUtility.chkDate(year, month - 1, day)) {
					checkTerm(date, startDate, endDate, name, idYear);
				}
			}
			return;
		}
		throw new MospException(MospConst.EX_DATE_INVALID);
	}
	
	/**
	 * 日付確認(必須でない和暦日付用)
	 * @param list      和暦情報リスト
	 * @param strEra    年号
	 * @param strYear   年
	 * @param strMonth  月(1〜12)
	 * @param strDay    日
	 * @param name      確認対象名称
	 * @param idEra    確認対象フィールドID
	 * @param idYear    確認対象フィールドID
	 * @param idMonth   確認対象フィールドID
	 * @param idDay     確認対象フィールドID
	 * @param isDetails 明細フラグ
	 * @param rowNo     行番号
	 * @return 日付
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	protected Date checkDateParam(List<MosPConfDto> list, String strEra, String strYear, String strMonth,
			String strDay, String name, String idEra, String idYear, String idMonth, String idDay, boolean isDetails,
			int rowNo) throws MospException {
		if ((strEra == null || strEra.equals("")) && (strYear == null || strYear.equals(""))
				&& (strMonth == null || strMonth.equals("")) && (strDay == null || strDay.equals(""))) {
			return null;
		}
		if (isDetails) {
			checkRequired(strEra, name, rowNo, idEra);
		} else {
			checkRequired(strEra, name, idEra);
		}
		if (!ValidateUtility.chkRequired(strEra)) {
			return null;
		}
		if (isDetails) {
			checkRequired(strYear, name, rowNo, idYear);
		} else {
			checkRequired(strYear, name, idYear);
		}
		if (!ValidateUtility.chkRequired(strYear)) {
			return null;
		}
		if (isDetails) {
			checkRequired(strMonth, name, rowNo, idMonth);
		} else {
			checkRequired(strMonth, name, idMonth);
		}
		if (!ValidateUtility.chkRequired(strMonth)) {
			return null;
		}
		if (isDetails) {
			checkRequired(strDay, name, rowNo, idDay);
		} else {
			checkRequired(strDay, name, idDay);
		}
		if (!ValidateUtility.chkRequired(strDay)) {
			return null;
		}
		Date startDate = null;
		Date endDate = null;
		for (MosPConfDto dto : list) {
			if (!dto.getConfId().equals(strEra)) {
				continue;
			}
			startDate = getDate(dto.getConfCode());
			endDate = getDate(dto.getConfValue());
			break;
		}
		checkDate(list, strEra, getIntParam(strYear), getIntParam(strMonth), getIntParam(strDay), name, idYear, idDay,
				isDetails, rowNo);
		int gregorianYear = MospUtility.getYear(startDate) + getIntParam(strYear) - 1;
		if (!ValidateUtility.chkDate(gregorianYear, getIntParam(strMonth) - 1, getIntParam(strDay))) {
			return null;
		}
		Date date = getDate(list, strEra, strYear, strMonth, strDay);
		if (!ValidateUtility.chkDate(MospUtility.getYear(date), MospUtility.getMonth(date) - 1, MospUtility
			.getDay(date))) {
			return null;
		}
		if (!ValidateUtility.chkTerm(date, startDate, endDate)) {
			return null;
		}
		return date;
	}
	
	/**
	 * 和暦取得
	 * @param list 和暦情報リスト
	 * @param date 日付
	 * @return 日付配列
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	public String[] getJpImperialCal(List<MosPConfDto> list, Date date) throws MospException {
		String[] aryJpDate = new String[4];
		if (date == null) {
			return aryJpDate;
		}
		for (MosPConfDto dto : list) {
			Date startDate = getDate(dto.getConfCode());
			Date endDate = getDate(dto.getConfValue());
			if (startDate.compareTo(date) <= 0 && endDate.compareTo(date) >= 0) {
				int year = MospUtility.getYear(date) - MospUtility.getYear(startDate) + 1;
				aryJpDate[0] = dto.getConfId();
				aryJpDate[1] = String.valueOf(year);
				aryJpDate[2] = String.valueOf(MospUtility.getMonth(date));
				aryJpDate[3] = String.valueOf(MospUtility.getDay(date));
				return aryJpDate;
			}
		}
		throw new MospException(MospConst.EX_DATE_INVALID);
	}
	
	/**
	 * 日付取得(/無し文字列用)
	 * @param strDate 日付文字列
	 * @return 日付
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	public Date getDate(String strDate) throws MospException {
		if (strDate == null || strDate.length() != 8) {
			throw new MospException(MospConst.EX_DATE_INVALID);
		}
		return MospUtility.getDate(strDate.substring(0, 4) + CommonConst.SEPARATOR_DATE + strDate.substring(4, 6)
				+ CommonConst.SEPARATOR_DATE + strDate.substring(6, 8));
	}
	
	/**
	 * 日付取得(和暦)
	 * @param list     和暦情報リスト
	 * @param strEra   年号
	 * @param strYear  年
	 * @param strMonth 月(1〜12)
	 * @param strDay   日
	 * @return 日付
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	protected Date getDate(List<MosPConfDto> list, String strEra, String strYear, String strMonth, String strDay)
			throws MospException {
		for (MosPConfDto dto : list) {
			if (!dto.getConfId().equals(strEra)) {
				continue;
			}
			Date startDate = getDate(dto.getConfCode());
			int gregorianYear = MospUtility.getYear(startDate) + getIntParam(strYear) - 1;
			return getDate(String.valueOf(gregorianYear), strMonth, strDay);
		}
		throw new MospException(MospConst.EX_DATE_INVALID);
	}
	
	/**
	 * 日付文字列取得(和暦)
	 * @param list 和暦情報リスト
	 * @param aryEra 和暦配列
	 * @param date 日
	 * @return 日付文字列
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	protected String getDateString(List<MosPConfDto> list, String[][] aryEra, Date date) throws MospException {
		if (date == null || list == null) {
			return "";
		}
		String[] strDate = getJpImperialCal(list, date);
		strDate[0] = getCodeName(strDate[0], aryEra);
		for (int i = 1; i < strDate.length; i++) {
			strDate[i] = strDate[i].length() < 2 ? CommonConst.SUPPRESS_DATE + strDate[i] : strDate[i];
		}
		return strDate[0] + strDate[1] + CommonConst.NAM_YEAR + strDate[2] + CommonConst.NAM_MONTH + strDate[3]
				+ CommonConst.NAM_DAY;
	}
	
	/**
	 * 日付取得(月)
	 * @param strMonth 月(1〜12)
	 * @return 日付
	 * @throws MospException 	MosP例外処理が発生した場合
	 */
	protected Date getDateForMonth(String strMonth) throws MospException {
		return getDate(String.valueOf(CommonConst.TIME_DEFAULT_YEAR), strMonth, String
			.valueOf(CommonConst.TIME_DEFAULT_DAY));
	}
	
	/**
	 * TextBox取得
	 * @param strClass  クラス
	 * @param strId     id
	 * @param strValue  値
	 * @param isTextBox TextBoxフラグ(true：TextBox、false：Label)
	 * @return コード名称
	 */
	public static String getTextBox(String strClass, String strId, String strValue, boolean isTextBox) {
		StringBuffer sb = new StringBuffer();
		if (isTextBox) {
			sb.append("<input type=\"text\" class=\"");
			sb.append(strClass);
			sb.append("\" id=\"");
			sb.append(strId);
			sb.append("\" name=\"");
			sb.append(strId);
			sb.append("\" value=\"");
			sb.append(strValue);
			sb.append("\" />");
		} else {
			sb.append("<span class=\"");
			sb.append(strClass);
			sb.append("\" id=\"");
			sb.append(strId);
			sb.append("\">");
			sb.append(strValue);
			sb.append("</span>");
		}
		return sb.toString();
	}
	
	/**
	 * 日付妥当性確認(文字列日付)
	 * @param strDate	文字列日付(yyyy/MM/dd)
	 * @return 日付が妥当であればtrue、そうでない場合false
	 */
	public static boolean checkStrDate(String strDate) {
		String[] aryStrDate = StringUtil.divideByComma(strDate);
		if (aryStrDate.length < 3) {
			return false;
		}
		if (ValidateUtility.chkDate(Integer.parseInt(aryStrDate[0]), Integer.parseInt(aryStrDate[1]) - 1, Integer
			.parseInt(aryStrDate[2]))) {
			return true;
		}
		return false;
	}
	
	/**
	 * CheckBox取得
	 * @param strid id
	 * @param strname name
	 * @param value checked
	 * @return sb
	 */
	public static String getCheckBox(String strid, String strname, String value) {
		StringBuffer sb = new StringBuffer();
		sb.append("<input type=\"checkbox\" class=\"CheckBox\" id=\"");
		sb.append(strid);
		sb.append("\" name=\"");
		sb.append(strname);
		sb.append("\" ");
		sb.append(value);
		sb.append(">");
		return sb.toString();
	}
	
	/**
	 * CheckBox可変表示（表示判断材料が空欄の場合、表示されない）
	 * @param strid id
	 * @param strname name
	 * @param value value
	 * @param factor 表示判断材料
	 * @return factor 表示判断材料が空欄の場合、表示されない
	 */
	public static String getVariableCheckBox(String strid, String strname, String value, String factor) {
		StringBuffer sb = new StringBuffer();
		sb.append("<input type=\"checkbox\" class=\"CheckBox\" id=\"");
		sb.append(strid);
		sb.append("\" name=\"");
		sb.append(strname);
		sb.append("\" value=\"");
		sb.append(value);
		sb.append("\">");
		if (StringUtil.isNull(factor)) {
			return "&nbsp;";
		}
		return sb.toString();
	}
	
	/**
	 * CheckBox取得（Javascript対応）
	 * <p>	2008/11/14	m.yoshida	予定登録機能追加対応	</p>
	 * @param strid 	id
	 * @param strname 	name
	 * @param value 	checked
	 * @param type		イベントタイプ
	 * @param function	function
	 * @return	sb
	 */
	public static String getCheckBoxWithJs(String strid, String strname, String value, String type, String function) {
		StringBuffer sb = new StringBuffer();
		sb.append("<input type=\"checkbox\" class=\"CheckBox\" id=\"");
		sb.append(strid);
		sb.append("\" name=\"");
		sb.append(strname);
		sb.append("\" ");
		sb.append(type);
		sb.append("=\"");
		sb.append(function);
		sb.append("\" ");
		sb.append(value);
		sb.append(">");
		return sb.toString();
	}
	
	/**
	 * フラグによる文字色の変更
	 * @param aryFlag フラグ配列
	 * @param name フラグ名称
	 * @return sb
	 */
	public String changeColorText(String[][] aryFlag, String name) {
		StringBuffer sb = new StringBuffer();
		String color = "black";
		String value = StringUtil.getCodeValue(name, aryFlag);
		if (StringUtil.isFlagOff(value)) {
			color = "blue";
		} else if (StringUtil.isFlagOn(value)) {
			color = "red";
		}
		sb.append("<span style=\"color: ");
		sb.append(color);
		sb.append(";\">");
		sb.append(name);
		sb.append("</span>");
		return sb.toString();
	}
	
	/**
	 * コード存在確認
	 * @param value 	確認対象コード
	 * @param aryTarget	確認対象配列
	 * @param name 		確認対象名称
	 * @param id 		確認対象フィールドID
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	protected void checkCodeExist(String value, String[][] aryTarget, String name, String id) throws MospException {
		if (value.equals(getCodeName(value, aryTarget))) {
			String errMsg = MospUtility.getMessage(msg, CommonConst.MSG_TARGET_NOT_EXIST, name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
		}
	}
	
	/**
	 * リスト情報出力。<br>
	 * 表示している頁数、全頁数及び前頁、次頁ボタンを出力する。<br>
	 * <p>	2009/02/25	m.yoshida	追加		</p>
	 * @param command コマンド
	 * @param selectPage 現在頁
	 * @param fullPage 全頁
	 * @return HTMLリスト情報文字列
	 */
	public static String getListInfo(String command, String selectPage, String fullPage) {
		StringBuffer sb = new StringBuffer();
		int select = Integer.parseInt(selectPage);
		int full = Integer.parseInt(fullPage);
		sb.append("<div class=\"ListPageInfo\">");
		sb.append("<table>");
		sb.append("<tr>");
		sb.append("<td>");
		if (select - 1 > 0) {
			sb.append("<button type=\"button\" onclick=\"doSubmitKey(document.form, '");
			sb.append(command);
			sb.append("', '");
			sb.append(select - 1);
			sb.append("', '')\">");
		} else {
			sb.append("<button type=\"button\" disabled=\"disabled\">");
		}
		sb.append("前頁</button>");
		sb.append("</td>");
		if (!fullPage.equals("0")) {
			int pageNum = select / 10 * 10;
			for (int i = -1; i < 11; i++) {
				if (pageNum + i > 0 && pageNum + i <= full) {
					if (select != pageNum + i) {
						sb.append("<td><button type=\"button\" class=\"ButtonListPage\" ");
						sb.append("onclick=\"doSubmitKey(document.form, '");
						sb.append(command);
						sb.append("', '");
						sb.append(pageNum + i);
						sb.append("', '')\">");
						sb.append(pageNum + i);
						sb.append("</button></td>");
					} else if (select == pageNum + i) {
						sb.append("<td>");
						sb.append(pageNum + i);
						sb.append("頁</td>");
					}
				}
			}
		}
		sb.append("<td>");
		if (select + 1 <= full) {
			sb.append("<button type=\"button\" onclick=\"doSubmitKey(document.form, '");
			sb.append(command);
			sb.append("', '");
			sb.append(select + 1);
			sb.append("', '')\">");
		} else {
			sb.append("<button type=\"button\" disabled=\"disabled\">");
		}
		sb.append("次頁</button>");
		sb.append("</td>");
		sb.append("</tr>");
		sb.append("</table>");
		sb.append("</div>");
		return sb.toString();
	}
	
	/**
	 * 和暦表示設定
	 * <p>	2009/02/25	m.yoshida	追加		</p>
	 * @param list			和暦設定リスト
	 * @param aryEra 和暦表示配列
	 * @param targetDate	対象年月日
	 * @return 和暦表示
	 * @throws MospException	MosP例外処理が発生した場合
	 */
	public String getJapaneseDate(List<MosPConfDto> list, String[][] aryEra, Date targetDate) throws MospException {
		return getDateString(list, aryEra, targetDate);
	}
	
	@Override
	public int getIntParam(String input) {
		return NumberUtil.getIntParam(input);
	}
	
	/**
	 * 拡張JSのセット
	 */
	protected void setExtraJs() {
		// 拡張JSの設定
		String appExtraJs = cfg.getProperty(CommonConst.PPT_APP_EXTRA_JS);
		List<String> extraJs = getExtraJs();
		if (StringUtil.isNotNull(appExtraJs) && VariousUtil.isNotNull(extraJs) && !extraJs.contains(appExtraJs)) {
			extraJs.add(0, appExtraJs);
		}
	}
	
	/**
	 * prototype.js、scriptaculous.jsをセット
	 */
	protected void setPrototypeLibrary() {
		// prototype.jsをセット
		if (StringUtil.isNotNull(cfg.getProperty(CommonConst.PPT_APP_PROTOTYPE_JS))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_PROTOTYPE_JS));
		}
		// scriptaculous.jsをセット
		if (StringUtil.isNotNull(cfg.getProperty(CommonConst.PPT_APP_SCRIPT_ACULO_US))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_SCRIPT_ACULO_US));
		}
	}
	
	/**
	 * jQuery、jQuery UIをセット
	 */
	protected void setJQueryLibrary() {
		// jQueryをセット
		if (StringUtil.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_JQUERY));
		}
		// jQuery UIをセット
		if (StringUtil.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI));
		}
		// jQuery UI用CSSをセット
		if (StringUtil.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI_CSS))) {
			addExtraCss(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI_CSS));
		}
	}
	
	/**
	 * @return	lblKCode
	 */
	public String getEscLblKCode() {
		return escapeHTML(lblKCode);
	}
	
	/**
	 * @return	lblKName
	 */
	public String getEscLblKName() {
		return escapeHTML(lblKName);
	}
	
	/**
	 * @return	lblSectionName
	 */
	public String getEscLblSectionName() {
		return escapeHTML(lblSectionName);
	}
	
	/**
	 * @param lblKCode	セットするlblKCode
	 */
	public void setLblKCode(String lblKCode) {
		this.lblKCode = lblKCode;
	}
	
	/**
	 * @param lblKName	セットするlblKName
	 */
	public void setLblKName(String lblKName) {
		this.lblKName = lblKName;
	}
	
	/**
	 * @param lblSectionName	セットするlblSectionName
	 */
	public void setLblSectionName(String lblSectionName) {
		this.lblSectionName = lblSectionName;
	}
	
	/**
	 * フィールド設定。
	 * @param list	対象リスト
	 * @throws Exception  例外処理が発生した場合
	 */
	public void setFields(List<?> list) throws Exception {
		// listの内容をVoにセットする。
	}
	
	/**
	 * @param menuCommand メニューへ遷移するコマンドNo.
	 * @param addButton ボタンの追加フラグ
	 */
	protected void createAryMenu(String menuCommand, boolean addButton) {
		aryMenu = new String[0][0];
		aryMenu = StringUtil.addArrayFirstRowValue(aryMenu, menuCommand, CommonConst.NAM_TO_MENU);
		if (addButton) {
			aryMenu = StringUtil.addArrayLastRowValue(aryMenu, getName(C_MENU_BTN_CMD), getName(C_MENU_BTN_NAM));
		}
	}
	
	/**
	 * @param menuCommand メニューへ遷移するコマンドNo.
	 * @param aryCommandInfo 追加するボタンの配列
	 */
	protected void createAryMenu(String menuCommand, String[] aryCommandInfo) {
		createAryMenu(menuCommand, aryCommandInfo[0], aryCommandInfo[1]);
	}
	
	/**
	 * @param menuCommand メニューへ遷移するコマンドNo.
	 */
	protected void createAryMenu(String menuCommand) {
		createAryMenu(menuCommand, false);
	}
	
	/**
	 * @param menuCommand  メニューへ遷移するコマンドNo.
	 * @param btnCmd 追加するボタンのコマンドNo.
	 * @param btnNam 追加するボタンの名称
	 */
	protected void createAryMenu(String menuCommand, String btnCmd, String btnNam) {
		boolean addButton = false;
		if (StringUtil.isNotNull(btnCmd) && StringUtil.isNotNull(btnNam)) {
			addButton = true;
			nam.setProperty(C_MENU_BTN_CMD, btnCmd);
			nam.setProperty(C_MENU_BTN_NAM, btnNam);
		}
		createAryMenu(menuCommand, addButton);
	}
	
}
