/*
 * 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.common;

import java.io.Serializable;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

import jp.mosp.common.dto.CmAspUserDto;
import jp.mosp.common.dto.CmUserDto;

/**
 * Voの基本機能を提供する。<br>
 * <br>
 * MosPフレームワークでは、HTTPリクエストによって送られたパラメータを
 * Voインスタンスに設定し、ビジネスロジックを実行した後、UIに表示したい
 * 内容をVoに設定してViewに処理を委譲することを想定している。<br>
 * つまり、UIとビジネスロジックとの橋渡しをするのがVoの役割となる。<br>
 * <br>
 * 各アプリケーションにおいて、当クラスを拡張してVoクラスを
 * 作成することで、MosPフレームワークを有効に利用できる。<br>
 * <br>
 * Voは、基本的にフィールド及びアクセサメソッドを有する値保持用の
 * クラスとして定義する。<br>
 * <br>
 * BaseVoは、MosPフレームワークにおいて共通で用いられるフィールド及び
 * そのアクセサメソッド等を実装する。<br>
 * 
 */
public class BaseVo implements VoInterface, Serializable {

	private static final long serialVersionUID = -5856596970807014781L;

	// フィールド
	private String title;
	private String version;
	private String copy;
	private String aspUserId;
	private String aspName;
	private String userId;
	private String userName;
	private String commonCss;
	private String message;
	private String procSeq;
	private boolean isDialog;
	private List<String> extraJs;
	private List<String> extraCss;

	/**
	 * リクエストされたコマンド。<br>
	 */
	protected String cmd;

	/**
	 * 妥当性確認用フラグ。<br>
	 */
	protected boolean isValid;

	/**
	 * MosPアプリケーション設定(/WEB-INF/mosp.properties)。<br>
	 */
	protected Properties cfg;

	/**
	 * メッセージ設定(/WEB-INF/message.properties)。<br>
	 */
	protected Properties msg;

	/**
	 * 文言設定(/WEB-INF/naming.properties)。<br>
	 */
	protected Properties nam;


	/**
	 * エラーメッセージ。
	 */
	protected List<String> errMessage;

	/**
	 * エラーフィールド。
	 */
	protected ArrayList<String> errFields;

	/**
	 * エラーフィールド(明細)。
	 */
	protected ArrayList<DetailsVo> errDetails;

	/**
	 * javascript出力要否フラグ。<br>
	 * {@link #getDirectJs(Class, Object)}でjavascript出力要否判定基準となる。<br>
	 */
	protected boolean needDirectJs;

	/**
	 * フォワード先URL。<br>
	 * 各Voに対応するjspファイル等のURLを設定する。
	 */
	protected String retUrl;

	/**
	 * レスポンスとしてXMLを返す場合に利用する。<br>
	 */
	protected transient Document docXml;

	/**
	 * レスポンスと返すXMLに付加するリターンコード。<br>
	 */
	protected String xmlRetCode;

	/**
	 * サブタイトル。<br><br>
	 * {@link HtmlUtility#getSubTitle(BaseVo)}で、用いられる。<br>
	 */
	protected String subTitle;

	/**
	 * メニュー配列。<br><br>
	 * {@link HtmlUtility#getSubTitle(BaseVo)}で、用いられる。<br>
	 */
	protected String[][] aryMenu;

	/**
	 * VOの初期設定を行う。<br><br>
	 * <ul><li>
	 * {@link #needDirectJs}設定(false)<br>
	 * </li></ul>
	 */
	public BaseVo() {
		needDirectJs = false;
	}

	/**
	 * VOの初期設定を行う。<br><br>
	 * <ul><li>
	 * {@link #BaseVo()}
	 * </li><li>
	 * {@link #initVo(Properties, Properties, Properties, String, CmAspUserDto, CmUserDto)}
	 * </li><li>
	 * {@link #setSubTitle()}
	 * </li></ul>
	 * @param cfg     設定ファイル
	 * @param msg     メッセージファイル
	 * @param nam     文言ファイル
	 * @param cmd     コマンド
	 * @param aspUser ASPユーザー
	 * @param user    ユーザー
	 */
	public BaseVo(
			Properties   cfg,
			Properties   msg,
			Properties   nam,
			String       cmd,
			CmAspUserDto aspUser,
			CmUserDto    user
	) {
		this();
		initVo(cfg, msg, nam, cmd, aspUser, user);
		setFieldsName();
		setSubTitle();
	}

	/**
	 * VO初期化。<br><br>
	 * 以下の設定ファイルを設定する。<br>
	 * <ul><li>
	 * {@link #cfg}
	 * </li><li>
	 * {@link #msg}
	 * </li><li>
	 * {@link #nam}
	 * </li></ul><br><br>
	 * また、ユーザー情報等の初期化を行う。<br>
	 * @param cfg     設定ファイル
	 * @param msg     メッセージファイル
	 * @param cmd     コマンド
	 * @param aspUser ASPユーザー
	 * @param user    ユーザー
	 */
	public void initVo(
			Properties   cfg,
			Properties   msg,
			String       cmd,
			CmAspUserDto aspUser,
			CmUserDto    user
	) {
		this.cfg = cfg;
		this.msg = msg;
		this.cmd = cmd;
		this.title = cfg.getProperty(MospConst.PPT_APP_TITLE);
		this.version = cfg.getProperty(MospConst.PPT_APP_VERSION);
		this.copy = cfg.getProperty(MospConst.PPT_APP_COPY);
		if (aspUser != null) {
			this.aspUserId = aspUser.getAspUserId();
			this.aspName = aspUser.getAspName();
		}
		if (user != null) {
			this.userId = user.getUserId();
			this.userName = user.getUserName();
			this.commonCss = user.getCommonCss();
		}
		this.commonCss = this.commonCss == null || this.commonCss.equals("") ? MospConst.CSS_DEFAULT : this.commonCss;
		this.xmlRetCode = MospConst.XML_RETCODE_OK;
		this.isDialog = false;
	}

	/**
	 * VO初期化。<br><br>
	 * {@link #initVo(Properties, Properties, String, CmAspUserDto, CmUserDto)}
	 * に加え、{@link #nam}を設定する。
	 * @param cfg     設定ファイル
	 * @param msg     メッセージファイル
	 * @param nam     文言ファイル
	 * @param cmd     コマンド
	 * @param aspUser ASPユーザー
	 * @param user    ユーザー
	 */
	public void initVo(
			Properties   cfg,
			Properties   msg,
			Properties   nam,
			String       cmd,
			CmAspUserDto aspUser,
			CmUserDto    user
	) {
		initVo(cfg, msg, cmd, aspUser, user);
		this.nam = nam;
		setFieldsName();
		setSubTitle();
	}

	/**
	 * 項目名称を設定する。<br><br>
	 * {@link #nam}から文言を取得し、項目名称を設定する。<br>
	 * {@link BaseVo}を拡張したクラスでオーバーライドして用いる。<br>
	 */
	protected void setFieldsName() {
		// 処理無し
	}

	/**
	 * サブタイトルを設定する。<br><br>
	 * {@link #nam}から文言を取得し、以下のフィールドを設定する。<br>
	 * <ul><li>
	 * {@link #subTitle}
	 * </li><li>
	 * {@link #aryMenu}
	 * </li></ul><br><br>
	 * {@link BaseVo}を拡張したクラスでオーバーライドして用いる。<br>
	 */
	protected void setSubTitle() {
		subTitle = "";
		aryMenu = null;
	}

	/**
	 * アプリケーションタイトルを取得する。<br>
	 * アプリケーションタイトルは、
	 * {@link #initVo(Properties, Properties, String, CmAspUserDto, CmUserDto)}
	 * でmosp.propertiesから値を取得し、設定される。<br>
	 * @return アプリケーションタイトル
	 */
	public String getTitle() { return title; }

	/**
	 * アプリケーションタイトルを取得する。<br>
	 * アプリケーションタイトルはmosp.propertiesで設定する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return アプリケーションタイトル
	 */
	public String getEscTitle() { return escapeHTML(title); }

	/**
	 * アプリケーションタイトルを設定する。<br>
	 * @param title アプリケーションタイトル<br>
	 */
	public void setTitle(String title) { this.title = title; }

	/**
	 * アプリケーションバージョンを取得する。<br>
	 * アプリケーションバージョンはmosp.propertiesで設定する。<br>
	 * @return アプリケーションバージョン
	 */
	public String getVersion() { return version; }

	/**
	 * アプリケーションバージョンを取得する。<br>
	 * アプリケーションバージョンはmosp.propertiesで設定する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return アプリケーションバージョン
	 */
	public String getEscVersion() { return escapeHTML(version); }

	/**
	 * アプリケーションバージョンを設定する。
	 * @param version アプリケーションバージョン
	 */
	public void setVersion(String version) { this.version = version; }

	/**
	 * アプリケーション著作権表示を取得する。<br>
	 * アプリケーション著作権表示はmosp.propertiesで設定する。<br>
	 * @return アプリケーション著作権表示
	 */
	public String getCopy() { return copy; }

	/**
	 * アプリケーション著作権表示を取得する。<br>
	 * アプリケーション著作権表示はmosp.propertiesで設定する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return アプリケーション著作権表示
	 */
	public String getEscCopy() { return escapeHTML(copy); }

	/**
	 * アプリケーション著作権表示を設定する。<br>
	 * @param copy アプリケーション著作権表示
	 */
	public void setCopy(String copy) { this.copy = copy; }

	/**
	 * ASPユーザーIDを取得する。<br>
	 * @return ASPユーザーID
	 */
	public String getAspUserId() { return aspUserId; }

	/**
	 * ASPユーザーIDを取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return ASPユーザーID
	 */
	public String getEscAspUserId() { return escapeHTML(aspUserId); }

	/**
	 * ASPユーザーIDを設定する。<br>
	 * @param aspUserId ASPユーザーID
	 */
	public void setAspUserId(String aspUserId) { this.aspUserId = aspUserId; }

	/**
	 * ASPユーザー名を取得する。<br>
	 * @return ASPユーザー名
	 */
	public String getAspName() { return aspName; }

	/**
	 * ASPユーザー名を取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return ASPユーザー名
	 */
	public String getEscAspName() { return escapeHTML(aspName); }

	/**
	 * ASPユーザー名を設定する。<br>
	 * @param aspName ASPユーザー名
	 */
	public void setAspName(String aspName) { this.aspName = aspName; }

	/**
	 * ユーザーIDを取得する。<br>
	 * @return ユーザーID
	 */
	public String getUserId() { return userId; }

	/**
	 * ユーザーIDを取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return ユーザーID
	 */
	public String getEscUserId() { return escapeHTML(userId); }

	/**
	 * ユーザーIDを設定する。<br>
	 * @param userId ユーザーID
	 */
	public void setUserId(String userId) { this.userId = userId; }

	/**
	 * ユーザー名を取得する。<br>
	 * @return ユーザー名
	 */
	public String getUserName() { return userName; }

	/**
	 * ユーザー名を取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return ユーザー名
	 */
	public String getEscUserName() { return escapeHTML(userName); }

	/**
	 * ユーザー名を設定する。<br>
	 * @param userName ユーザー名
	 */
	public void setUserName(String userName) { this.userName = userName; }

	/**
	 * 共通cssファイルURLを取得する。<br>
	 * @return 共通cssファイルURL
	 */
	public String getCommonCss() { return commonCss; }

	/**
	 * 共通cssファイルURLを取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return 共通cssファイルURL
	 */
	public String getEscCommonCss() { return escapeHTML(commonCss); }

	/**
	 * 共通cssファイルURLを設定する。<br>
	 * @param commonCss 共通cssファイルURL
	 */
	public void setCommonCss(String commonCss) { this.commonCss = commonCss; }

	/**
	 * 個別javascriptファイルURLを取得する。<br>
	 * @return 個別javascriptファイルURL
	 */
	public List<String> getExtraJs() { return extraJs; }

	/**
	 * 個別javascriptファイルURLを設定する。<br>
	 * @param extraJs 個別javascriptファイルURL
	 */
	public void setExtraJs(String extraJs) {
		this.extraJs = new ArrayList<String>();
		this.extraJs.add(extraJs);
	}

	/**
	 * 個別javascriptファイルURLを追加する。<br>
	 * @param extraJs 個別javascriptファイルURL
	 */
	public void addExtraJs(String extraJs) {
		this.extraJs = this.extraJs != null ? this.extraJs : new ArrayList<String>();
		if (!this.extraJs.contains(extraJs)) {
			this.extraJs.add(extraJs);
		}
	}

	/**
	 * 個別cssファイルURLを取得する。<br>
	 * @return 個別cssファイルURL
	 */
	public List<String> getExtraCss() { return extraCss; }

	/**
	 * 個別cssファイルURLを設定する。<br>
	 * @param extraCss 個別cssファイルURL
	 */
	public void setExtraCss(String extraCss) {
		this.extraCss = new ArrayList<String>();
		this.extraCss.add(extraCss);
	}

	/**
	 * 個別cssファイルURLを追加する。<br>
	 * @param extraCss 個別cssファイルURL
	 */
	public void addExtraCss(String extraCss) {
		this.extraCss = this.extraCss != null ? this.extraCss : new ArrayList<String>();
		if (!this.extraCss.contains(extraCss)) {
			this.extraCss.add(extraCss);
		}
	}

	/**
	 * メッセージを取得する。<br>
	 * @return メッセージ
	 */
	public String getMessage() { return message; }

	/**
	 * メッセージを取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return メッセージ
	 */
	public String getEscMessage() { return escapeHTML(message); }

	/**
	 * メッセージを設定する。<br>
	 * @param message
	 */
	public void setMessage(String message) { this.message = message; }

	/**
	 * 処理シーケンスを取得する。<br>
	 * @return 処理シーケンス
	 */
	public String getProcSeq() { return procSeq; }

	/**
	 * 処理シーケンスを取得する。<br>
	 * 取得文字列はHTMLエスケープされる。<br>
	 * @return 処理シーケンス
	 */
	public String getEscProcSeq() { return escapeHTML(procSeq); }

	/**
	 * 処理シーケンスを設定する。<br>
	 * @param procSeq 処理シーケンス
	 */
	public void setProcSeq(String procSeq) { this.procSeq = procSeq; }

	/**
	 * エラーメッセージを設定する。<br>
	 * @param errMessage エラーメッセージリスト
	 */
	public void setErrMessage(List<String> errMessage) { this.errMessage = errMessage; }

	/**
	 * エラーメッセージを取得する。<br>
	 * @return エラーメッセージ
	 */
	public List<String> getErrMessage() { return errMessage; }

	/**
	 * フォワード先URLを取得する。<br>
	 * @return フォワード先URL
	 */
	public String getRetUrl() { return retUrl; }

	/**
	 * フォワード先URLを設定する。<br>
	 * @param retUrl フォワード先URL
	 */
	public void setRetUrl(String retUrl) { this.retUrl = retUrl; }

	/**
	 * XMLリターンコードを取得する。<br>
	 * @return XMLリターンコード
	 */
	public String getXmlRetCode() { return xmlRetCode; }

	/**
	 * XMLリターンコードを設定する。<br>
	 * @param xmlRetCode XMLリターンコード
	 */
	public void setXmlRetCode(String xmlRetCode) { this.xmlRetCode = xmlRetCode; }

	/**
	 * XMLドキュメントを取得する。<br>
	 * @return XMLドキュメント
	 */
	public Document getDocXml() { return docXml; }

	/**
	 * ダイアログフラグを取得する。<br>
	 * @return ダイアログフラグ
	 */
	public boolean getIsDialog() { return isDialog; }

	/**
	 * ダイアログフラグを設定する。<br>
	 * @param isDialog ダイアログフラグ
	 */
	public void setIsDialog(boolean isDialog) { this.isDialog = isDialog; }

	/**
	 * クラス名を取得する。<br>
	 * @return クラス名
	 */
	public String getClassName() {
		return getClass().getName();
	}

	/**
	 * {@link #subTitle}を取得する。<br>
	 * @return サブタイトル
	 */
	public String getSubTitle() {
		return subTitle;
	}

	/**
	 * メニュー配列を取得する。<br>
	 * @return メニュー配列
	 */
	public String[][] getAryMenu() {
		return getAryField(aryMenu);
	}

	/**
	 * エラーメッセージを追加する。<br>
	 * @param errorMessage エラーメッセージ
	 */
	public void addErrMessage(String errorMessage) {
		this.errMessage = this.errMessage != null ? this.errMessage : new ArrayList<String>();
		this.errMessage.add(errorMessage);
	}

	/**
	 * エラーフィールドを追加する。<br>
	 * @param errorFieldId エラーフィールド
	 */
	public void addErrField(String errorFieldId) {
		this.errFields = this.errFields != null ? this.errFields : new ArrayList<String>();
		this.errFields.add(errorFieldId);
	}

	/**
	 * エラーフィールド(明細)を追加する。<br>
	 * @param rowNo   行番号
	 * @param fieldId エラーフィールド
	 */
	public void addErrDetails(int rowNo, String fieldId) {
		this.errDetails = this.errDetails != null ? this.errDetails : new ArrayList<DetailsVo>();
		this.errDetails.add(new DetailsVo(rowNo, fieldId));
	}

	/**
	 * メッセージ除去。<br>
	 */
	public void clearMessage() {
		if (errMessage != null) {
			errMessage.clear();
		}
		message = "";
	}

	/**
	 * エラーフィールド除去。<br>
	 */
	public void clearErrField() {
		this.errFields = this.errFields != null ? this.errFields : new ArrayList<String>();
		this.errFields.clear();
		this.errDetails = this.errDetails != null ? this.errDetails : new ArrayList<DetailsVo>();
		this.errDetails.clear();
	}

	/**
	 * 妥当性確認開始時処理。<br>
	 */
	protected void startValidation() {
		isValid = true;
		errMessage = new ArrayList<String>();
		errFields = new ArrayList<String>();
		errDetails = new ArrayList<DetailsVo>();
	}

	/**
	 * 妥当性確認終了時処理。<br>
	 * @throws MospException
	 */
	protected void endValidation() throws MospException {
		if (!isValid) {
			errMessage.add(0, MospUtility.getMessage(msg, "WC1007", ""));
			throw new MospException(MospConst.EX_PARAMS_INVALID);
		}
	}

	/**
	 * 必須確認。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkRequired(String value, String name, String id) throws MospException {
		if (!ValidateUtility.chkRequired(value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0001", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 必須確認(明細)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkRequired(String value, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkRequired(value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0001", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(半角英数字)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkCode(String value, String name, String id) throws MospException {
		if (!ValidateUtility.chkRegex("\\w*", value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0002", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(半角英数字)(明細)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkCode(String value, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkRegex("\\w*", value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0002", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(数字)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkNumber(String value, String name, String id) throws MospException {
		if (!ValidateUtility.chkRegex("\\d*", value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0003", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(数字)(明細)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkNumber(String value, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkRegex("\\d*", value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0003", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(任意)。<br>
	 * @param value 確認対象文字列
	 * @param regex 正規表現文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkRegex(String value, String regex, String name, String id) throws MospException {
		if (!ValidateUtility.chkRegex(regex, value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0005", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(任意)(明細)。<br>
	 * @param value 確認対象文字列
	 * @param regex 正規表現文字列
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkRegex(String value, String regex, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkRegex(regex, value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0005", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(数値：double)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkNumeric(String value, String name, String id) throws MospException {
		if (!ValidateUtility.chkNumeric(value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0003", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(数値：double)(明細)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkNumeric(String value, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkNumeric(value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0003", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列長確認(最大文字数)。<br>
	 * @param value     確認対象文字列
	 * @param maxLength 最大文字数
	 * @param name      確認対象名称
	 * @param id        確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkLength(String value, int maxLength, String name, String id) throws MospException {
		String regex = ".{0," + String.valueOf(maxLength) + "}";
		if (!ValidateUtility.chkRegex(regex, value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0004", name + MospConst.DATA_SEPARATOR + String.valueOf(maxLength));
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 文字列長確認(最大文字数)(明細)。<br>
	 * @param value     確認対象文字列
	 * @param maxLength 最大文字数
	 * @param name      確認対象名称
	 * @param rowNo     行番号
	 * @param id        確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkLength(String value, int maxLength, String name, int rowNo, String id) throws MospException {
		String regex = ".{0," + String.valueOf(maxLength) + "}";
		if (!ValidateUtility.chkRegex(regex, value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0004", name + MospConst.DATA_SEPARATOR + String.valueOf(maxLength));
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + value + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 日付妥当性確認。<br>
	 * @param year  年
	 * @param month 月(1〜12)
	 * @param day   日
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkDate(int year, int month, int day, String name, String id) throws MospException {
		if (!ValidateUtility.chkDate(year, month - 1, day)) {
			String errMsg = MospUtility.getMessage(msg, "WC0006", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + String.valueOf(year) + "/" + String.valueOf(month) + "/" + String.valueOf(day) + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 日付妥当性確認(明細)。<br>
	 * @param year  年
	 * @param month 月(1〜12)
	 * @param day   日
	 * @param name  確認対象名称
	 * @param rowNo 行番号
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkDate(int year, int month, int day, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkDate(year, month - 1, day)) {
			String errMsg = MospUtility.getMessage(msg, "WC0006", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + String.valueOf(year) + "/" + String.valueOf(month) + "/" + String.valueOf(day) + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 日付期間妥当性確認。<br>
	 * @param date      確認対象日
	 * @param startDate 開始日
	 * @param endDate   終了日
	 * @param name      確認対象名称
	 * @param id        確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkTerm(
			Date date,
			Date startDate,
			Date endDate,
			String name,
			String id
	) throws MospException {
		if (startDate.compareTo(date) > 0 || endDate.compareTo(date) < 0) {
			String errMsg = MospUtility.getMessage(msg, "WC0006", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + name + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 日付期間妥当性確認(明細)。<br>
	 * @param date      確認対象日
	 * @param startDate 開始日
	 * @param endDate   終了日
	 * @param name      確認対象名称
	 * @param rowNo     行番号
	 * @param id        確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkTerm(
			Date date,
			Date startDate,
			Date endDate,
			String name,
			int rowNo,
			String id
	) throws MospException {
		if (!ValidateUtility.chkTerm(date, startDate, endDate)) {
			String errMsg = MospUtility.getMessage(msg, "WC0006", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + name + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 時間妥当性確認。<br>
	 * @param hour   時
	 * @param minute 分
	 * @param second 秒
	 * @param name   確認対象名称
	 * @param id     確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkTime(int hour, int minute, int second, String name, String id) throws MospException {
		if (!ValidateUtility.chkTime(hour, minute, second)) {
			String errMsg = MospUtility.getMessage(msg, "WC0007", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			errMsg = errMsg + "(" + String.valueOf(hour) + ":" + String.valueOf(minute) + ":" + String.valueOf(second) + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 時間妥当性確認(明細)。<br>
	 * @param hour   時
	 * @param minute 分
	 * @param second 秒
	 * @param name   確認対象名称
	 * @param rowNo  行番号
	 * @param id     確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkTime(int hour, int minute, int second, String name, int rowNo, String id) throws MospException {
		if (!ValidateUtility.chkTime(hour, minute, second)) {
			String errMsg = MospUtility.getMessage(msg, "WC0007", name);
			addErrMessage(errMsg);
			addErrDetails(rowNo, id);
			isValid = false;
			errMsg = errMsg + "(" + String.valueOf(hour) + ":" + String.valueOf(minute) + ":" + String.valueOf(second) + ")";
			logValid(errMsg);
		}
	}

	/**
	 * 値比較。<br>
	 * @param value1      比較値1
	 * @param value2      比較値2
	 * @param compareFlag 確認フラグ(0:値同一でtrue、1：値同一でfalse)
	 * @param name        確認対象名称
	 * @param id1         確認対象フィールドID1
	 * @param id2         確認対象フィールドID2
	 */
	protected void checkCompare(String value1, String value2, int compareFlag, String name, String id1, String id2) throws MospException {
		String messageCode = "";
		switch (compareFlag) {
		case 0:
			if (!value1.equals(value2)) {
				messageCode = "WC0008";
			}
			break;
		case 1:
			if (value1.equals(value2)) {
				messageCode = "WC0009";
			}
			break;
		default:
		}
		if (!messageCode.equals("")) {
			String errMsg = MospUtility.getMessage(msg, messageCode, name);
			addErrMessage(errMsg);
			addErrField(id1);
			addErrField(id2);
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 日付大小確認。<br>
	 * @param beforeDate  日付(前)
	 * @param afterDate   日付(後)
	 * @param isSameValid 同一日有効フラグ(true：同一日有効、false：同一日不可)
	 */
	public void checkDateBeforeAfter(
			Date     beforeDate , 
			Date     afterDate  ,
			boolean isSameValid,
			String    beforeName,
			String    afterName ,
			String    idYear    ,
			String    idMonth   ,
			String    idDay
	) throws MospException {
		if (beforeDate.compareTo(afterDate) > 0) {
			if (isSameValid) {
				if (beforeDate.compareTo(afterDate) == 0) {
					return;
				}
			}
			String errMsg = MospUtility.getMessage(msg, "WC0023", afterName + "," + beforeName);
			addErrMessage(errMsg);
			addErrField(idYear );
			addErrField(idMonth);
			addErrField(idDay  );
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(半角英数字)。<br>
	 * @param value 確認対象文字列
	 * @param name  確認対象名称
	 * @param id    確認対象フィールドID
	 * @throws MospException
	 */
	protected void checkPhone(String value, String name, String id) throws MospException {
		if (!ValidateUtility.chkRegex(MospConst.REG_PHONE, value)) {
			String errMsg = MospUtility.getMessage(msg, "WC0005", name);
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 文字列タイプ確認(少数)。<br>
	 * @param value   確認対象文字列
	 * @param integer 整数部桁数
	 * @param decimal 小数部桁数
	 * @param name    確認対象名称
	 * @param id      確認対象フィールドID
	 * @param isDetails 明細フラグ
	 * @param rowNo     行番号
	 * @throws MospException
	 */
	protected void checkDecimal(
			String  value,
			int     integer,
			int     decimal,
			String  name,
			String  id,
			boolean isDetails,
			int     rowNo
	) throws MospException {
		// 正規表現作成
		String regex =
			MospConst.REG_DECIMAL_PRE + String.valueOf(integer - 1) +
			MospConst.REG_DECIMAL_MID + String.valueOf(decimal    ) +
			MospConst.REG_DECIMAL_AFT
			;
		if (value != null && !value.equals("") && !ValidateUtility.chkRegex(regex, value)) {
			String errMsg = MospUtility.getMessage(
					msg, "WC0011",
					name +
					MospConst.DATA_SEPARATOR + String.valueOf(integer) +
					MospConst.DATA_SEPARATOR + String.valueOf(decimal)
			);
			addErrMessage(errMsg);
			if (isDetails) {
				addErrDetails(rowNo, id);
			} else {
				addErrField(id);
			}
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * 旧パスワード確認。<br>
	 * @param oldPassword 旧パスワード
	 * @param currentPass 現在のパスワード
	 * @param id         確認対象フィールドID
	 */
	protected void checkPassword(String oldPassword, String currentPass, String id) throws MospException {
		if (!oldPassword.equals(currentPass)) {
			String errMsg = MospUtility.getMessage(msg, "WC1004", "");
			addErrMessage(errMsg);
			addErrField(id);
			isValid = false;
			logValid(errMsg);
		}
	}

	/**
	 * intリクエストパラメータ取得。<br>
	 * @param value intリクエストパラメータ値
	 * @return 変換intリクエストパラメータ値
	 */
	public int getIntParam(String value) {
		if (value == null || value.equals("")) {
			return 0;
		}
		return Integer.parseInt(value);
	}

	/**
	 * longリクエストパラメータ取得。<br>
	 * @param value longリクエストパラメータ値
	 * @return 変換longリクエストパラメータ値
	 */
	public long getLongParam(String value) {
		if (value == null || value.equals("")) {
			return 0;
		}
		return Long.parseLong(value);
	}

	/**
	 * floatリクエストパラメータ取得。<br>
	 * @param value intリクエストパラメータ値
	 * @return 変換intリクエストパラメータ値
	 */
	public float getFloatParam(String value) {
		if (value == null || value.equals("")) {
			return 0;
		}
		return Float.parseFloat(value);
	}

	/**
	 * doubleリクエストパラメータ取得。<br>
	 * @param value doubleリクエストパラメータ値
	 * @return 変換doubleリクエストパラメータ値
	 */
	public double getDoubleParam(String value) {
		if (value == null || value.equals("")) {
			return 0;
		}
		return Double.parseDouble(value);
	}

	/**
	 * 日付取得。<br>
	 * @param time 時間(hh:MM)
	 * @return 日付
	 * @throws MospException 
	 */
	public Date getTime(String time) throws MospException {
		try{
			if (time == null) {
				return null;
			}
			DateFormat df = DateFormat.getTimeInstance();
			return df.parse(time + ":00");
		} catch(ParseException e) {
			throw new MospException(MospConst.EX_DATE_INVALID);
		}
	}

	/**
	 * 日付取得。<br>
	 * @param year  年
	 * @param month 月
	 * @param day   日
	 * @return 日付
	 * @throws MospException 
	 */
	public Date getDate(String year, String month, String day) throws MospException {
		Calendar cal = Calendar.getInstance();
		cal.setTime(MospUtility.getDate(year + "/" + month + "/" + day));
		cal.set(Calendar.HOUR_OF_DAY, 0);
		cal.set(Calendar.MINUTE, 0);
		cal.set(Calendar.SECOND, 0);
		cal.set(Calendar.MILLISECOND, 0);
		return cal.getTime();
	}

	/**
	 * 配列フィールド取得。<br>
	 * @param aryField 対象配列
	 * @return 配列
	 */
	protected String[] getAryField(String[] aryField) {
		return aryField == null ? null : aryField.clone();
	}

	/**
	 * 配列フィールド取得。<br>
	 * @param aryField 対象配列
	 * @return 配列
	 */
	protected String[][] getAryField(String[][] aryField) {
		return aryField == null ? null : aryField.clone();
	}

	/**
	 * 配列フィールド取得。<br>
	 * @param aryField 対象配列
	 * @return 配列
	 */
	protected Date[] getAryField(Date[] aryField) {
		return aryField == null ? null : aryField.clone();
	}

	/**
	 * 日付フィールド取得。<br>
	 * @param dateField 対象日付
	 * @return 日付
	 */
	protected Date getDateField(Date dateField) {
		return dateField == null ? null : (Date)dateField.clone();
	}

	/**
	 * 日付フィールド取得。<br>
	 * @param dateField 対象日付
	 * @return 年
	 */
	protected String getStrYear(Date dateField) {
		return dateField == null ? "" : String.valueOf(MospUtility.getYear (dateField));
	}

	/**
	 * 日付フィールド取得。<br>
	 * @param dateField 対象日付
	 * @return 月
	 */
	protected String getStrMonth(Date dateField) {
		return dateField == null ? "" : String.valueOf(MospUtility.getMonth(dateField));
	}

	/**
	 * 日付フィールド取得。<br>
	 * @param dateField 対象日付
	 * @return 日
	 */
	protected String getStrDay(Date dateField) {
		return dateField == null ? "" : String.valueOf(MospUtility.getDay  (dateField));
	}

	/**
	 * 整形数値取得。<br>
	 * @param value  対象値
	 * @param format フォーマット文字列
	 * @return 数値文字列
	 */
	protected String getFormatNumber(double value, String format) {
		DecimalFormat df = new DecimalFormat(format);
		return df.format(value);
	}

	/**
	 * HTMLエスケープ。<br>
	 * JSPで変数値(文字列)を表示させる場合に用いる。<br>
	 * @param aStr エスケープ対象文字列
	 * @return エスケープ後文字列
	 */
	public static String escapeHTML(String aStr) {
		return HtmlUtility.escapeHTML(aStr);
	}

	/**
	 * XMLDocument初期化。<br>
	 * レスポンスとしてXMLを出力する場合、
	 * 出力内容を格納する{@link #docXml}の準備を行う。<br>
	 * @throws ParserConfigurationException
	 */
	protected Element initXmlDoc() throws ParserConfigurationException {
		// Documentの作成
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
		docXml = documentBuilder.newDocument();
		// MospData要素(ルート要素)の生成及びDocumentへの追加
		Element elmMospData = createElement(MospConst.XML_ROOT_NODE);
		docXml.appendChild(elmMospData);
		// フィールド要素の作成
		Element elmFields = createElement(MospConst.XML_FIELD_NODE);
		// フィールド要素の設定
		appendElement(elmMospData, elmFields);
		return elmFields;
	}

	/**
	 * Element作成。<br>
	 * @param tagName タグ名
	 */
	protected Element createElement(String tagName) {
		return docXml.createElement(tagName);
	}

	/**
	 * Element追加。<br>
	 * @param parentElement 追加先エレメント
	 * @param childElement  追加エレメント
	 */
	protected void appendElement(Element parentElement, Element childElement) {
		parentElement.appendChild(childElement);
	}

	/**
	 * TextElement追加。<br>
	 * @param parentElement 追加先エレメント
	 * @param tagName       追加タグ名
	 * @param data          追加データ
	 */
	protected void appendTextElement(Element parentElement, String tagName, String data) {
		Element childElement = createElement(tagName);
		Text    textNode     = docXml.createTextNode(data);
		childElement.appendChild(textNode);
		appendElement(parentElement, childElement);
	}

	/**
	 * XML文字列取得。<br>
	 * {@link #docXml}を文字列に変換する。<br>
	 * @throws TransformerException
	 */
	public String getStrDocXml() throws TransformerException {
		// ルート要素の取得
		Element elmMospData = docXml.getDocumentElement();
		// XmlRetCode要素の生成及び追加
		Element elmXmlRetCode = docXml.createElement(MospConst.XML_RETCODE_NODE);
		Text txnXmlRetCode = docXml.createTextNode(escapeHTML(getXmlRetCode()));
		elmXmlRetCode.appendChild(txnXmlRetCode);
		elmMospData.appendChild(elmXmlRetCode);
		// ErrorMessage要素の生成及び追加
		if (errMessage != null) {
			for (int i = 0; i < errMessage.size(); i++) {
				Element elmErrorMessage = docXml.createElement(MospConst.XML_ERR_MSG_NODE);
				Text txnErrMessage = docXml.createTextNode(escapeHTML(String.valueOf(errMessage.get(i))));
				elmErrorMessage.appendChild(txnErrMessage);
				elmMospData.appendChild(elmErrorMessage);
			}
		}
		// ErrorFields要素の生成及び追加
		if (errFields != null) {
			for (int i = 0; i < errFields.size(); i++) {
				Element elmErrorFields = docXml.createElement(MospConst.XML_ERR_FIELD_NODE);
				Text txnErrFields = docXml.createTextNode(escapeHTML(String.valueOf(errFields.get(i))));
				elmErrorFields.appendChild(txnErrFields);
				elmMospData.appendChild(elmErrorFields);
			}
		}
		// ErrorDetails要素の生成及び追加
		if (errDetails != null) {
			for (int i = 0; i < errDetails.size(); i++) {
				DetailsVo vo = errDetails.get(i);
				Element elmErrorFields = docXml.createElement(MospConst.XML_ERR_DETAIL_NODE);
				elmErrorFields.setAttribute(MospConst.XML_ATT_ROW_NO, String.valueOf(vo.rowNo));
				Text txnErrFields = docXml.createTextNode(escapeHTML(String.valueOf(vo.fieldId)));
				elmErrorFields.appendChild(txnErrFields);
				elmMospData.appendChild(elmErrorFields);
			}
		}
		// Message要素の生成及び追加
		Element elmMessage = docXml.createElement(MospConst.XML_MESSAGE_NODE);
		Text txnMessage = docXml.createTextNode(escapeHTML(message));
		elmMessage.appendChild(txnMessage);
		elmMospData.appendChild(elmMessage);
		// ProcSeq要素の生成及び追加
		Element elmProcSeq = docXml.createElement(MospConst.XML_PROC_SEQ);
		Text txnProcSeq = docXml.createTextNode(getEscProcSeq());
		elmProcSeq.appendChild(txnProcSeq);
		elmMospData.appendChild(elmProcSeq);
		// XMLを文字列に変換
		TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
		Transformer transformer = transformerFactory.newTransformer(); 
		StringWriter sw = new StringWriter();
		transformer.setOutputProperty(OutputKeys.ENCODING, MospConst.XML_CHAR_ENC);
		transformer.transform(new DOMSource(docXml), new StreamResult(sw));
		return sw.toString();
	}

	/**
	 * 妥当性確認ログ出力。<br>
	 * @param errMsg
	 */
	private void logValid(String errMsg) {
		LogUtility.log(cfg, aspUserId, userId, cmd, 4, MospConst.LOG_VALID, errMsg);
	}

	/**
	 * javascript取得。<br>
	 * クラスのフィールドの内、publicで変数名が「PRM_」「NAM_」、
	 * 「REG_」、「LEN_」のものにつき、同一変数名で同一値を宣言する
	 * javascript文字列等を出力する。<br>
	 * @param cls クラス
	 * @param obj オブジェクト
	 * @return javascript文字列
	 * @throws IllegalAccessException
	 */
	public String getDirectJs(Class<?> cls, Object obj) throws IllegalAccessException {
		StringBuffer sb = new StringBuffer();
		if (needDirectJs) {
			sb.append(getJsFieldsInfo(cls, obj));
			sb.append(getJsErrFieldsId());
		}
		return sb.toString();
	}

	/**
	 * javascript取得。<br>
	 * クラスのフィールドの内、public staticで変数名が「PRM_」「NAM_」、
	 * 「REG_」、「LEN_」のものにつき、同一変数名で同一値を宣言する
	 * javascript文字列等を出力する。<br>
	 * @param cls クラス
	 * @return javascript文字列
	 * @throws IllegalAccessException
	 */
	public String getDirectJs(Class<?> cls) throws IllegalAccessException {
		StringBuffer sb = new StringBuffer();
		if (needDirectJs) {
			sb.append(getJsFieldsInfo(cls, null));
			sb.append(getJsErrFieldsId());
		}
		return sb.toString();
	}

	/**
	 * JavaScript(項目ID、項目名、項目長)取得。<br>
	 * @param cls dtoクラス
	 * @return JavaScript(項目ID、項目名、項目長)文字列
	 * @throws IllegalAccessException
	 */
	private String getJsFieldsInfo(Class<?> cls, Object obj) throws IllegalAccessException {
		StringBuffer sb = new StringBuffer();
		Field[] fields = cls.getFields();
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			String name = field.getName();
			if (name.indexOf("PRM_") == 0 || name.indexOf("NAM_") == 0 || name.indexOf("REG_") == 0) {
				sb.append("var " + name + " = \"");
				sb.append(field.get(obj));
				sb.append("\";");
			} else if (name.indexOf("LEN_") == 0) {
				sb.append("var " + name + " = ");
				sb.append(field.get(obj));
				sb.append(";");
			}
		}
		sb.append("var ARY_FIELDS_ID = new Array(");
		for (int i = 0; i < fields.length; i++) {
			Field field = fields[i];
			String name = field.getName();
			if (name.indexOf("PRM_") == 0) {
				sb.append(name + ", ");
			}
		}
		if (sb.charAt(sb.length() - 2) == ',' && sb.charAt(sb.length() - 1) == ' ') {
			sb.delete(sb.length() - 2, sb.length());
		}
		sb.append(");");
		return sb.toString();
	}

	/**
	 * JavaScript(エラー項目)取得。<br>
	 * @return JavaScript(エラー項目)文字列
	 */
	private String getJsErrFieldsId() {
		StringBuffer sb = new StringBuffer();
		sb.append("var ARY_ERR_FIELDS_ID = new Array(");
		if (errFields != null) {
			for (int i = 0; i < errFields.size(); i++) {
				sb.append("\"" + errFields.get(i) + "\", ");
			}
			if (errFields.size() > 0) {
				sb.delete(sb.length() - 2, sb.length());
			}
		}
		sb.append(");");
		sb.append("var ARY_ERR_DETAILS = new Array(");
		if (errDetails != null) {
			for (int i = 0; i < errDetails.size(); i++) {
				DetailsVo vo = errDetails.get(i);
				sb.append("new Array(\"" + vo.fieldId + "\", \"" +  vo.rowNo + "\"), ");
			}
			if (errDetails.size() > 0) {
				sb.delete(sb.length() - 2, sb.length());
			}
		}
		sb.append(");");
		return sb.toString();
	}

	/**
	 * 明細情報を格納する。<br><br>
	 */
	private static class DetailsVo implements Serializable {
		private static final long serialVersionUID = 8052715720150027371L;
		protected int rowNo;
		protected String fieldId;
		protected DetailsVo(int rowNo, String fieldId) {
			this.rowNo = rowNo;
			this.fieldId = fieldId;
		}
	}

	/**
	 * ロゴファイルのパスを取得する。<br><br>
	 * {@link #cfg}にロゴファイルパスが未設定の場合、
	 * 或いは空白の場合は、NULLを返す。
	 * @return ロゴファイルパス
	 */
	public String getLogoPath() {
		String pass = cfg.getProperty(MospConst.PPT_APP_LOGO);
		if (pass == null || pass.equals("")) {
			return null;
		}
		return pass;
	}

	/**
	 * 文言取得。<br>
	 * {@link #nam}から文言を取得する。
	 * @param key 設定キー
	 * @return 文言
	 */
	public String getName(String key) {
		if (nam == null) {
			return "";
		}
		return nam.getProperty(key, "");
	}

	/**
	 * MosPフレームワーク表示用ファイルパス設定
	 * @param className		対象VOクラス名
	 * <p>{@link BaseVo}を継承している対象VOの表示用ファイルパスを設定するメソッド。</p>
	 * <p>{@link BaseVo#BaseVo()}を呼び出した後、{@link BaseVo#getClassName()}をパラメータにセットすることで、<br>
	 * 対象VOに直接jsp、css、jsのファイルパスをハードコードしなくても呼び出すことができる。<br>
	 * その代わり、ファイルの場所は必ず規約通りの場所にしなければならない。<br>
	 * もちろん、このメソッドを利用せず、従来の方法を利用することも可能である。
	 * </p>
	 * <p>
	 * ファイルの場所の規約は{@link ViewFileLocationUtility#ViewFileLocationUtility(String)}を参照すること。
	 * </p>
	 */
	protected void setViewPath(String className) {
		ViewFileLocationUtility location = new ViewFileLocationUtility(className);
		setRetUrl(location.getRetUrl());
		addExtraCss(location.getExtraCss());
		addExtraJs(location.getExtraJs());
	}

}
