/*
 * MosP - Mind Open Source Project         http://www.mosp.jp/
 * Copyright (C) 1987-2009 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.Iterator;
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.part.NumberPart;

public class MosPVo extends ListVo {

	private static final long serialVersionUID = 2955340745357599845L;

	// メニューコマンド
	public final String CMD_MENU_INPUT   = "K1910";
	public final String CMD_MENU_MAMAGE  = "K2910";
	public final String CMD_MENU_PAYROLL = "P1910";
	public final String CMD_MENU_HUMAN   = "H1910";
	public final String CMD_MENU_SYSTEM  = "S1910"; //未使用
	public final String CMD_MENU_SYSTEM2 = "S2910";

	protected transient CommonUtility util;

	/**
	 * コンストラクタ
	 */
	public MosPVo() {
		super();
		needDirectJs = true;
		initUtility();
	}

	private void initUtility() {
		if (util != null) {
			return;
		}
		util = new CommonUtility();
	}

	/**
	 * コンストラクタ
	 */
	public MosPVo(
			Properties   cfg,
			Properties   msg,
			Properties   nam,
			String       cmd,
			CmAspUserDto aspUser,
			CmUserDto    user
	) {
		this();
		initVo(cfg, msg, nam, cmd, aspUser, user);
	}

	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文字列
	 */
	public String getSubTitle(String subTitle, String cmdMenu) {
		return getSubTitle(subTitle, cmdMenu, cmdMenu, subTitle);
	}

	/**
	 * サブタイトル取得（サブメニュー内）
	 * @param subTitle 		サブタイトル
	 * @param cmdMenu  		メニューコマンド
	 * @param cmdUp			上位コマンド
	 * @param cmdUpName		上位コマンド名
	 * @return サブタイトルHTML文字列
	 */
	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文字列
	 */
	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文字列
	 */
	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 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();
	}

	/**
	 * ロゴイメージタグ取得
	 * @return ロゴイメージタグHTML文字列
	 */
	public String getTagLogoImage() {
		if (useLogo()) {
			return HtmlUtility.getTagLogoImage(CommonConst.FILE_LOGO, CommonConst.NAME_LOGO);
		}
		return "";
	}

	/**
	 * ロゴ利用可否判断
	 * @return
	 * <p>
	 * ロゴを利用する場合true、そうでない場合false
	 * </p>
	 */
	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 String getDefaultJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Object();");
		for (int i = 0; i < arySetting.length; i++) {
			sb.append(name);
			sb.append("[\"");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("\"] = \"");
			sb.append(escapeHTML(arySetting[i][1]));
			sb.append("\";");
		}
		return sb.toString();
	}

	/**
	 * JavaScript(設定配列)取得
	 * @param name       変数名
	 * @param arySetting 設定配列
	 * @return JavaScript(設定配列)文字列
	 */
	public String getSettingJs(String name, String[][] arySetting) {
		StringBuffer sb = new StringBuffer();
		sb.append("var ");
		sb.append(escapeHTML(name));
		sb.append(" = new Object();");
		for (int i = 0; i < arySetting.length; i++) {
			sb.append(name);
			sb.append("[\"");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("\"] = new Array(");
			sb.append(arySetting[i].length - 1);
			sb.append(");");
			for (int j = 1; j < arySetting[i].length; j++) {
				sb.append(name);
				sb.append("[\"");
				sb.append(escapeHTML(arySetting[i][0]));
				sb.append("\"][");
				sb.append(j - 1);
				sb.append("] = \"");
				sb.append(escapeHTML(arySetting[i][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 (int i = 0; i < arySetting.length; i++) {
			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("] = new Array(");
			sb.append(2);
			sb.append(");");

			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("][");
			sb.append(0);
			sb.append("] = \"");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("\";");

			sb.append(name);
			sb.append("[");
			sb.append(escapeHTML(arySetting[i][0]));
			sb.append("][");
			sb.append(1);
			sb.append("] = \"");
			sb.append(escapeHTML(arySetting[i][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 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 "";
		} else {
			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 対象配列
	 * @throws Exception
	 */
	public static String[] escapeArray(String[] array) {
		for (int i = 0; i < array.length; i++) {
			array[i] = escapeHTML(array[i]);
		}
		return array;
	}

	/**
	 * 配列エスケープ
	 * @param array 対象配列
	 * @throws Exception
	 */
	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 (int i = 0; i < array.length; i++) {
			String selected = "";
			if (value != null) {
				for (int j = 0; j < value.length; j++) {
					if (array[i][0].equals(value[j])) {
						selected = "selected=\"selected\"";
					}
				}
			}
			sb.append("<option value=\"");
			sb.append(array[i][0]);
			sb.append("\"");
			sb.append(selected);
			sb.append(">");
			sb.append(array[i][1]);
			sb.append("</option>");
		}
		return sb.toString();
	}

	/**
	 * 名称取得
	 * @param code  取得対象コード
	 * @return コード名称
	 */
	protected String getCodeName(String code, String[][] array) {
		String codeName = code;
		if (array == null) {
			return codeName;
		}
		for (int i = 0; i < array.length; i++) {
			if (code.equals(array[i][0])) {
				codeName = array[i][1];
				break;
			}
		}
		return codeName;
	}

	/**
	 * 日付妥当性確認(和暦)
	 * @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
	 */
	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 (Iterator<MosPConfDto> it = list.iterator(); it.hasNext();) {
			MosPConfDto dto = it.next();
			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 idYear    確認対象フィールドID
	 * @param idMonth   確認対象フィールドID
	 * @param idDay     確認対象フィールドID
	 * @param isDetails 明細フラグ
	 * @param rowNo     行番号
	 * @return 日付
	 * @throws MospException 
	 */
	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 (Iterator<MosPConfDto> it = list.iterator(); it.hasNext();) {
			MosPConfDto dto = it.next();
			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 
	 */
	public String[] getJpImperialCal(List<MosPConfDto> list, Date date) throws MospException {
		String[] aryJpDate = new String[4];
		if (date == null) {
			return aryJpDate;
		}
		for (Iterator<MosPConfDto> it = list.iterator(); it.hasNext();) {
			MosPConfDto dto = it.next();
			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 
	 */
	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
	 */
	protected Date getDate(
			List<MosPConfDto> list,
			String  strEra,
			String  strYear,
			String  strMonth,
			String  strDay
	) throws MospException {
		for (Iterator<MosPConfDto> it = list.iterator(); it.hasNext();) {
			MosPConfDto dto = it.next();
			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 date 日
	 * @return 日付文字列
	 * @throws MospException
	 */
	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
	 */
	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
	 * @throws MospException 
	 */
	public static boolean checkStrDate(String strDate) {
		String[] aryStrDate = strDate.split(CommonConst.SEPARATOR_DATE);
		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 (factor.equals("")) {
			return "&nbsp;";
		} else {
			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 = util.getCodeValue(name, aryFlag);
		if (value.equals(CommonConst.NAM_COMMON_FLAG_OFF)) {
			color = "blue";
		} else if (value.equals(CommonConst.NAM_COMMON_FLAG_ON)) {
			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
	 */
	protected void checkCodeExist(String value, String[][] aryTarget, String name, String id) throws MospException {
		if (value.equals(util.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 array			和暦表示配列
	 * @param targetDate	対象年月日
	 * @throws MospException
	 */
	public String getJapaneseDate(
			List<MosPConfDto> list,
			String[][] aryEra,
			Date targetDate
	) throws MospException {
		return getDateString(list, aryEra, targetDate);
	}

	/* (non-Javadoc)
	 * @see jp.mosp.common.common.BaseVo#getIntParam(java.lang.String)
	 */
	public int getIntParam(String input) {
		/*		
		int i = 0;
		if (input != null) {
			if (ValidateUtility.chkRegex("^-?\\d+", input)) {
				try {
					i = Integer.parseInt(input);
				} catch (NumberFormatException e) {
					i = 0;
				}
			}
		}
		return i;
		 */		
		return NumberPart.getIntParam(input);
	}

	/**
	 * 拡張JSのセット
	 */
	protected void setExtraJs() {
		// 拡張JSの設定
		initUtility();
		String appExtraJs = cfg.getProperty(CommonConst.PPT_APP_EXTRA_JS);
		if (!util.isNull(appExtraJs) && !getExtraJs().contains(appExtraJs)) {
			addExtraJs(appExtraJs);
		}
	}

	/**
	 * prototype.js、scriptaculous.jsをセット
	 */
	protected void setPrototypeLibrary() {
		// prototype.jsをセット
		if (util.isNotNull(cfg.getProperty(CommonConst.PPT_APP_PROTOTYPE_JS))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_PROTOTYPE_JS));
		}
		// scriptaculous.jsをセット
		if (util.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 (util.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_JQUERY));
		}
		// jQuery UIをセット
		if (util.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI))) {
			addExtraJs(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI));
		}
		// jQuery UI用CSSをセット
		if (util.isNotNull(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI_CSS))) {
			addExtraCss(cfg.getProperty(CommonConst.PPT_APP_JQUERY_UI_CSS));
		}
	}

}
