/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
// カスタムアサイン入力フレーム用Beanクラス
// 
//
//	変更履歴
//	2004.01.08 新規作成		T.Nishiki
//
package jp.co.ntt.lms.xms.assign;

import java.util.Calendar;
import java.util.Date;

import jp.co.ntt.lms.xms.framework.XmsScreenBean;

/**
 * カスタムアサイン入力フレーム用アクションクラス。<br>
 * @author T.Nishiki
 */
public class CustomAssignInputBean extends XmsScreenBean {

	/**
	 * 操作種別。<br>
	 */
	private int operation;
	
	/**
	 * アサイン対象教材ID。
	 */
	private String loId;
	/**
	 * アサイン対象教材の親教材ID。
	 */
	private String parentLoId;
	/**
	 * アサイン対象グループ／人ID。
	 */
	private String personnelId;
	/**
	 * アサイン対象グループ／人の親ID。
	 */
	private String parentGroupId;
	
	/**
	 * アサイン種別。<br>
	 */
	private int assortType;
	/**
	 * 期間開始：制限の有無フラグ。<br>
	 */
	private boolean periodStartLimited;
	/**
	 * 期間開始日時：年。<br>
	 */
	private int periodStartYear;

	/**
	 * 期間開始日時：月。<br>
	 */
	private int periodStartMonth;

	/**
	 * 期間開始日時：日。<br>
	 */
	private int periodStartDay;

	/**
	 * 期間開始日時：時。<br>
	 */
	private int periodStartHour;

	/**
	 * 期間開始日時：分。<br>
	 */
	private int periodStartMinute;

	/**
	 * 期間終了：制限の有無フラグ。<br>
	 */
	private boolean periodEndLimited;

	/**
	 * 期間終了日時：年。<br>
	 */
	private int periodEndYear;

	/**
	 * 期間終了日時：月。<br>
	 */
	private int periodEndMonth;

	/**
	 * 期間終了日時：日。<br>
	 */
	private int periodEndDay;

	/**
	 * 期間終了日時：時。<br>
	 */
	private int periodEndHour;

	/**
	 * 期間終了日時：分。<br>
	 */
	private int periodEndMinute;

	/**
	 * 学習回数：制限の有無フラグ。<br>
	 */
	private boolean countLimited;
	
	/**
	 * 学習回数。<br>
	 */
	private String studyCount;
	
	/**
	 * メール送信フラグ。<br>
	 * メールを送信する場合は、true。
	 */
	private boolean submitMail;

	/**
	 * メール使用可能フラグ。<br>
	 * 環境・権限上メール送信可能な場合は、true。
	 */
	private boolean usableMail;

	/**
	 * 入力項目回数の表示／非表示フラグ。<br>
	 * 
	 */
	private boolean visibleCount;

	/**
	 * 入力項目期間の表示／非表示フラグ。<br>
	 * 
	 */
	private boolean visiblePeriod;

	/**
	 * コンストラクタ。<br>
	 */
	CustomAssignInputBean() {
	}

	/**
	 * アサイン種別の選択を取得する。<br>
	 * @return アサイン種別。
	 * @see CustomAssignConstant#ASSORT_TYPE_LEARN
	 * @see CustomAssignConstant#ASSORT_TYPE_MANAGE
	 * @see CustomAssignConstant#ASSORT_TYPE_LEARN_MANAGE
	 */
	public int getAssortType() {
		return assortType;
	}

	/**
	 * アサイン期間の開始が制限があるか戻す。<br>
	 * @return アサイン期間の開始の制限が有効な場合trueを、
	 *          制限が無効な場合falseを戻す。
	 */
	public boolean isPeriodStartLimited() {
		return periodStartLimited;
	}

	/**
	 * アサイン期間の終了が制限があるか戻す。<br>
	 * @return アサイン期間の終了の制限が有効な場合trueを、
	 *          制限が無効な場合falseを戻す。
	 */
	public boolean isPeriodEndLimited() {
		return periodEndLimited;
	}

	/**
	 * 学習回数に制限があるか戻す。<br>
	 * @return 学習回数の制限が有効な場合trueを、
	 *          制限が無効な場合falseを戻す。
	 */
	public boolean isCountLimited() {
		return countLimited;
	}
	/**
	 * 学習回数を戻す。<br>
	 * @return 学習回数。
	 */
	public String getStudyCount() {
		return studyCount;
	}

	/**
	 * メール送信の有無を戻す。<br>
	 * @return メール送信する場合はtrue、しない場合はfalseを戻します。
	 */
	public boolean isSubmitMail() {
		return submitMail;
	}

	/**
	 * 期間開始日時：年を取得する。<br>
	 * @return 期間開始日時の年を取得する。
	 */
	public int getPeriodStartYear() {
		return periodStartYear;
	}

	/**
	 * 期間開始日時：月を取得する。<br>
	 * @return 期間開始日時の月を取得する。
	 */
	public int getPeriodStartMonth() {
		return periodStartMonth;
	}

	/**
	 * 期間開始日時：日を取得する。<br>
	 * @return 期間開始日時の日を取得する。
	 */
	public int getPeriodStartDay() {
		return periodStartDay;
	}

	/**
	 * 期間開始日時：時を取得する。<br>
	 * @return 期間開始日時の時を取得する。
	 */
	public int getPeriodStartHour() {
		return periodStartHour;
	}

	/**
	 * 期間開始日時：分を取得する。<br>
	 * @return 期間開始日時の分を取得する。
	 */
	public int getPeriodStartMinute() {
		return periodStartMinute;
	}

	/**
	 * 期間終了日時：年を取得する。<br>
	 * @return 期間終了日時の年を取得する。
	 */
	public int getPeriodEndYear() {
		return periodEndYear;
	}

	/**
	 * 期間終了日時：月を取得する。<br>
	 * @return 期間終了日時の月を取得する。
	 */
	public int getPeriodEndMonth() {
		return periodEndMonth;
	}

	/**
	 * 期間終了日時：日を取得する。<br>
	 * @return 期間終了日時の日を取得する。
	 */
	public int getPeriodEndDay() {
		return periodEndDay;
	}

	/**
	 * 期間終了日時：時を取得する。<br>
	 * @return 期間終了日時の時を取得する。
	 */
	public int getPeriodEndHour() {
		return periodEndHour;
	}

	/**
	 * 期間終了日時：分を取得する。<br>
	 * @return 期間終了日時の分を取得する。
	 */
	public int getPeriodEndMinute() {
		return periodEndMinute;
	}
	
	/**
	 * メール送信可能か取得する。<br>
	 * メール環境を操作ユーザ権限から
	 * メール送信が可能であれば、trueを戻す。
	 * @return メール送信が可能であればtrueを、
	 * 不可であればfalseを戻す。
	 */
	public boolean isUsableMail() {
		return usableMail;
	}


	/**
	 * プロパティを新規入力用に設定する。<br>
	 */
	void setPropertiesAsNew( ) {
		// 操作種別
		operation =CustomAssignConstant.OPERATION_NEW;
		// アサイン種別。学習。
		assortType = CustomAssignConstant.ASSORT_TYPE_LEARN;
		// アサイン期間開始：制限の有無フラグ。制限無し。
		periodStartLimited = false;
		// アサイン期間開始日時（システム日付０時０分）
		Calendar periodStart =null;
		periodStart = Calendar.getInstance();
		periodStart.set( Calendar.HOUR_OF_DAY, 0);
		periodStart.set( Calendar.MINUTE, 0);
		periodStart.set( Calendar.SECOND, 0);
		setPeriodStartCalendar(periodStart);
		// アサイン期間終了：制限の有無フラグ。制限無し。
		periodEndLimited = false;
		// アサイン期間開始日時。開始日時の23:59後。
		Calendar periodEnd =null;
		periodEnd = (Calendar)periodStart.clone();
		periodEnd.add( Calendar.DATE, 1 );
		periodEnd.add(Calendar.SECOND, -1 );
		setPeriodEndCalendar(periodEnd);
		// 学習回数：制限の有無フラグ。制限なし。
		countLimited = false;
		// 学習回数
		studyCount = "";
		// メール送信。送信しない。
		submitMail = false;
		// メール送信可能。メール使用可能。
		usableMail = true;
	}

	/**
	 * 新規／更新区別を取得する。<br>
	 * @return OPERATION_NEWまたはOPERATION_UPDATEのいずれかの値。
	 * @see CustomAssignConstant#OPERATION_NEW
	 * @see CustomAssignConstant#OPERATION_UPDATE
	 * 
	 */
	public int getOperation() {
		return operation;
	}

	/**
	 * 新規／更新区別フラグを設定する。<br>
	 * 設定できる値は、OPERATION_NEWまたはOPERATION_UPDATEのどちらかである。
	 * 他の値を設定した場合、OPERATION_NEWを設定する。
	 * @param operation 設定する新規／更新区別。
	 * @see CustomAssignConstant#OPERATION_NEW 新規フラグ。
	 * @see CustomAssignConstant#OPERATION_UPDATE 更新フラグ。
	 */
	void setOperation(int operation) {
		if ( operation == CustomAssignConstant.OPERATION_UPDATE ) {
			this.operation = CustomAssignConstant.OPERATION_UPDATE;
		} else {
			this.operation = CustomAssignConstant.OPERATION_NEW;
		}
	}

	/**
	 * アサイン対象教材IDを取得する。
	 * @return アサイン対象教材ID。
	 */
	public String getLoId() {
		return loId;
	}

	/**
	 * アサイン対象グループ／人の親IDを取得する。
	 * @return アサイン対象グループ／人の親ID。
	 */
	public String getParentGroupId() {
		return parentGroupId;
	}

	/**
	 * アサイン対象教材の親IDを取得する。
	 * @return アサイン対象教材の親ID。
	 */
	public String getParentLoId() {
		return parentLoId;
	}

	/**
	 * アサイン対象グループ／人IDを取得する。
	 * @return アサイン対象グループ／人ID。
	 */
	public String getPersonnelId() {
		return personnelId;
	}

	/**
	 * アサイン対象教材IDを設定する。
	 * @param loId アサイン対象教材ID。
	 */
	void setLoId(String loId) {
		this.loId = loId;
	}

	/**
	 * アサイン対象グループ／人の親IDを設定する。
	 * @param parentGroupId アサイン対象グループ／人の親ID。
	 */
	void setParentGroupId(String parentGroupId) {
		this.parentGroupId = parentGroupId;
	}

	/**
	 * アサイン対象教材の親IDを設定する。
	 * @param parentLoId アサイン対象教材の親ID。
	 */
	void setParentLoId(String parentLoId) {
		this.parentLoId = parentLoId;
	}

	/**
	 * アサイン対象グループ／人のIDを設定する。
	 * @param personnelId アサイン対象グループ／人のID。
	 */
	void setPersonnelId(String personnelId) {
		this.personnelId = personnelId;
	}

	/**
	 * アサイン種別を設定する。<br>
	 * 引数にはASSORT_TYPE_LEARN、ASSORT_TYPE_MANAGE、
	 * ASSORT_TYPE_LEARN_MANAGEいずれかを渡す。
	 * 他の値を渡した場合はASSORT_TYPE_LEARNを指定したものとする。
	 * @param assortType アサイン種別。
	 * @see CustomAssignConstant#ASSORT_TYPE_LEARN
	 * @see CustomAssignConstant#ASSORT_TYPE_MANAGE
	 * @see CustomAssignConstant#ASSORT_TYPE_LEARN_MANAGE
	 */
	void setAssortType(int assortType) {
		if ( ( assortType ==CustomAssignConstant.ASSORT_TYPE_MANAGE )
				|| ( assortType == CustomAssignConstant.ASSORT_TYPE_LEARN_MANAGE ) ) {
			this.assortType = assortType;
		} else {
			this.assortType = CustomAssignConstant.ASSORT_TYPE_LEARN;
		}
	}

	/**
	 * アサイン期間の開始が制限を設定する。<br>
	 * @param periodStartLimited  アサイン期間の開始の制限が有効な場合trueを、
	 *          制限が無効な場合falseを渡す。
	 */
	void setPeriodStartLimited(boolean periodStartLimited) {
		this.periodStartLimited = periodStartLimited;
	}

	/**
	 * アサイン期間の開始日時（年）を設定する。<br>
	 * @param periodStartYear 開始年数。
	 */
	void setPeriodStartYear(int periodStartYear) {
		this.periodStartYear = periodStartYear;
	}

	/**
	 * アサイン期間の開始日時（月）を設定する。<br>
	 * @param periodStartMonth 開始月数。
	 */
	void setPeriodStartMonth(int periodStartMonth) {
		this.periodStartMonth = periodStartMonth;
	}

	/**
	 * アサイン期間の開始日時（日）を設定する。<br>
	 * @param periodStartDay 開始日数。
	 */
	void setPeriodStartDay(int periodStartDay) {
		this.periodStartDay = periodStartDay;
	}

	/**
	 * アサイン期間の開始日時（時）を設定する。<br>
	 * @param periodStartHour 開始時数。
	 */
	void setPeriodStartHour(int periodStartHour) {
		this.periodStartHour = periodStartHour;
	}

	/**
	 * アサイン期間の開始日時（分）を設定する。<br>
	 * @param periodStartMinute 分数。
	 */
	void setPeriodStartMinute(int periodStartMinute) {
		this.periodStartMinute = periodStartMinute;
	}

	/**
	 * アサイン期間の終了日時に制限の有無を設定する。<br>
	 * @param periodEndLimited 制限がある場合trueを、ない場合falseを渡す。
	 */
	void setPeriodEndLimited(boolean periodEndLimited) {
		this.periodEndLimited = periodEndLimited;
	}

	/**
	 * アサイン期間の終了日時（年）を設定する。<br>
	 * @param periodEndYear 終了年数。
	 */
	void setPeriodEndYear(int periodEndYear) {
		this.periodEndYear = periodEndYear;
	}

	/**
	 * アサイン期間の終了日時（月）を設定する。<br>
	 * @param periodEndMonth 終了月数。
	 */
	void setPeriodEndMonth(int periodEndMonth) {
		this.periodEndMonth = periodEndMonth;
	}

	/**
	 * アサイン期間の終了日時（日）を設定する。<br>
	 * @param periodEndDay 終了日数。
	 */
	void setPeriodEndDay(int periodEndDay) {
		this.periodEndDay = periodEndDay;
	}

	/**
	 * アサイン期間の終了日時（時）を設定する。<br>
	 * @param periodEndHour 終了時数。
	 */
	void setPeriodEndHour(int periodEndHour) {
		this.periodEndHour = periodEndHour;
	}

	/**
	 * アサイン期間の終了日時（分）を設定する。<br>
	 * @param periodEndMinute 終了分数。
	 */
	void setPeriodEndMinute(int periodEndMinute) {
		this.periodEndMinute = periodEndMinute;
	}

	/**
	 * 学習回数制限の有無を設定します。
	 * @param countLimited 制限する場合trueを、制限しない場合falseを渡す。
	 */
	void setCountLimited(boolean countLimited) {
		this.countLimited = countLimited;
	}

	/**
	 * 学習回数を設定する。<br>
	 * @param studyCount 学習回数。
	 */
	void setStudyCount(String studyCount) {
		if (studyCount == null) {
			this.studyCount = "";
		} else {
			this.studyCount = studyCount;
		}
	}

	/**
	 * メール送信の有無を設定する。<br>
	 * @param submitMail メールを送信する場合trueを
	 * 			送信しない場合falseを渡す。
	 */
	void setSubmitMail(boolean submitMail) {
		this.submitMail = submitMail;
	}


	/**
	 * メール送信可能か設定する。<br>
	 * @param usableMail メール送信可能であればtrueを、
	 * 			不可であればfalseを渡す。
	 */
	void setUsableMail(boolean usableMail) {
		this.usableMail = usableMail;
	}
	
	/**
	 * 開始日時を設定します。<br>
	 * @param startCalendar 開始日時。
	 */
	private void setPeriodStartCalendar( Calendar startCalendar ) {
		periodStartYear   = startCalendar.get( Calendar.YEAR );
		periodStartMonth  = startCalendar.get( Calendar.MONTH ) + 1;
		periodStartDay    = startCalendar.get( Calendar.DAY_OF_MONTH );
		periodStartHour   = startCalendar.get( Calendar.HOUR_OF_DAY );
		periodStartMinute = startCalendar.get( Calendar.MINUTE );
	}

	/**
	 * 終了日時を設定します。<br>
	 * @param endCalendar 終了日時。
	 */
	private void setPeriodEndCalendar( Calendar endCalendar ) {
		periodEndYear   = endCalendar.get( Calendar.YEAR );
		periodEndMonth  = endCalendar.get( Calendar.MONTH ) + 1;
		periodEndDay    = endCalendar.get( Calendar.DAY_OF_MONTH );
		periodEndHour   = endCalendar.get( Calendar.HOUR_OF_DAY );
		periodEndMinute = endCalendar.get( Calendar.MINUTE );
	}
	
	/**
	 * 開始日時を設定します。<br>
	 * nullを渡された場合、システム日付の0時0分を設定します。
	 * @param startCalendar 開始日時。
	 */
	void setPeriodStartDate( Date startDate ) {
		Calendar startCalendar = null;
		startCalendar = Calendar.getInstance();
		if ( startDate == null ) {
			startCalendar.set( Calendar.HOUR_OF_DAY, 0);
			startCalendar.set( Calendar.MINUTE, 0);
		} else {
			startCalendar.setTime(startDate);
		}
		setPeriodStartCalendar(startCalendar);
	}

	/**
	 * 終了日時を設定します。<br>
	 * nullを渡された場合、システム日付の23時59分を設定します。
	 * @param endCalendar 終了日時。
	 */
	void setPeriodEndDate( Date endDate ) {
		Calendar endCalendar = null;
		endCalendar = Calendar.getInstance();
		if ( endDate == null ) {
			endCalendar.set( Calendar.HOUR_OF_DAY, 0);
			endCalendar.set( Calendar.MINUTE, 0);
			endCalendar.set( Calendar.SECOND, 0);
			endCalendar.add( Calendar.DAY_OF_MONTH, 1);
			endCalendar.add( Calendar.SECOND, -1);
		} else {
			endCalendar.setTime(endDate);
		}
		setPeriodEndCalendar(endCalendar);
	}

	/**
	 * 入力項目「回数」の表示／非表示フラグを取得する。
	 * @return 入力項目「回数」を表示する場合はtrueを、
	 *          非表示とする場合falseを戻す。
	 */
	public boolean isVisibleCount() {
		return visibleCount;
	}

	/**
	 * 入力項目「期間」の表示／非表示フラグを取得する。
	 * @return 入力項目「期間」を表示する場合はtrueを、
	 *          非表示とする場合falseを戻す。
	 */
	public boolean isVisiblePeriod() {
		return visiblePeriod;
	}

	/**
	 * 入力項目「回数」の表示／非表示フラグを設定する。
	 * @param visableCount 入力項目「回数」を表示する場合はtrueを、
	 *          非表示とする場合falseを渡す。
	 */
	void setVisibleCount(boolean visibleCount) {
		this.visibleCount = visibleCount;
	}

	/**
	 * 入力項目「期間」の表示／非表示フラグを設定する。
	 * @param visablePeriod 入力項目「期間」を表示する場合はtrueを、
	 *          非表示とする場合falseを渡す。
	 */
	void setVisiblePeriod(boolean visablePeriod) {
		this.visiblePeriod = visablePeriod;
	}

}
