/*
 * Aipo is a groupware program developed by Aimluck,Inc.
 * Copyright (C) 2004-2008 Aimluck,Inc.
 * http://aipostyle.com/
 *
 * 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 3 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, see <http://www.gnu.org/licenses/>.
 */
package com.aimluck.eip.officecalendar;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.cayenne.ObjectId;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.SelectQuery;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.services.TurbineServices;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;

import com.aimluck.commons.field.ALDateField;
import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALIllegalDateException;
import com.aimluck.commons.field.ALNumberField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipMFacility;
/** Del 20110915 小濵 Start --- */
//import com.aimluck.eip.cayenne.om.portlet.EipTSchedule;
//import com.aimluck.eip.cayenne.om.portlet.EipTScheduleMap;
/** Del 20110915 小濵 End   --- */
import com.aimluck.eip.cayenne.om.portlet.ImwTOffice;
import com.aimluck.eip.cayenne.om.portlet.ImwTOfficeCalendar;
import com.aimluck.eip.cayenne.om.portlet.ImwTOfficeCalendarMap;
import com.aimluck.eip.cayenne.om.security.TurbineUser;
import com.aimluck.eip.common.ALAbstractFormData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALEipManager;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.facilities.FacilityResultData;
import com.aimluck.eip.facilities.util.FacilitiesUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.officecalendar.util.OfficecalendarUtils;
import com.aimluck.eip.orm.DatabaseOrmService;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.services.accessctl.ALAccessControlFactoryService;
import com.aimluck.eip.services.accessctl.ALAccessControlHandler;
import com.aimluck.eip.util.ALEipUtils;

/**
 * スケジュールのフォームデータを管理するクラスです。
 * 
 */
public class OfficecalendarFormData extends ALAbstractFormData {

  /** <code>logger</code> logger */
  private static final JetspeedLogger logger = JetspeedLogFactoryService
      .getLogger(OfficecalendarFormData.class.getName());

  /** <code>FLAG_EDIT_REPEAT_DEF</code> デフォルト値（繰り返し編集範囲） */
  private static final int FLAG_EDIT_REPEAT_DEF = -1;

  /** <code>FLAG_EDIT_REPEAT_ALL</code> 個別日程を編集（繰り返し編集範囲） */
  private static final int FLAG_EDIT_REPEAT_ALL = 0;

  /** <code>FLAG_EDIT_SCHEDULE_ONE</code> 全日程を編集（繰り返し編集範囲） */
  private static final int FLAG_EDIT_REPEAT_ONE = 1;

  /** <code>FLAG_DEL_MEMBER_ALL</code> [削除フラグ] すべての共有メンバーからこのスケジュールを削除する */
  public static final int FLAG_DEL_MEMBER_ALL = 0;

  /** <code>FLAG_DEL_MEMBER_ONE</code> [削除フラグ] このスケジュールからログインユーザーだけを削除する */
  public static final int FLAG_DEL_MEMBER_ONE = 1;

  /** <code>FLAG_DEL_RANGE_ALL</code> [削除フラグ] この繰り返しスケジュールを削除する */
  public static final int FLAG_DEL_RANGE_ALL = 0;

  /** <code>FLAG_DEL_RANGE_ONE</code> [削除フラグ] この繰り返しスケジュールの特定スケジュールのみを削除する */
  public static final int FLAG_DEL_RANGE_ONE = 1;

  /** <code> calendar_date</code> */
  private String calendar_date;

  /** <code> office_id</code> */
  private String office_id;

  /** <code> office_id</code> */
  private String day;

  /** <code> office_id</code> */
  private boolean isHoliday;

  /** <code>start_date</code> 開始日時 */
  private ALDateTimeField start_date;

  /** <code>end_date</code> 終了日時 */
  private ALDateTimeField end_date;

  /** <code>note_name</code> 予定 */
  private ALStringField note_name;

  /** <code>place</code> 勤務先名 */
  private ALStringField office_name;

  /** <code>note</code> 内容 */
  private ALStringField note;

  /** <code>on_off_class</code> 公開/非公開フラグ */
  private ALStringField on_off_class;

  /** <code>repeat_type</code> 繰り返し種別 */
  private ALStringField repeat_type;

  /** <code>week_0</code> 繰り返し曜日 */
  private ALStringField week_0;

  /** <code>week_1</code> 繰り返し曜日 */
  private ALStringField week_1;

  /** <code>week_2</code> 繰り返し曜日 */
  private ALStringField week_2;

  /** <code>week_3</code> 繰り返し曜日 */
  private ALStringField week_3;

  /** <code>week_4</code> 繰り返し曜日 */
  private ALStringField week_4;

  /** <code>week_5</code> 繰り返し曜日 */
  private ALStringField week_5;

  /** <code>week_6</code> 繰り返し曜日 */
  private ALStringField week_6;

  /** <code>limit_flag</code> 期限ありなし */
  private ALStringField limit_flag;

  /** <code>limit_date</code> 繰り返し期限（開始日） */
  private ALDateField limit_start_date;

  /** <code>limit_date</code> 繰り返し期限（終了日） */
  private ALDateField limit_end_date;

  /** <code>month_day</code> 繰り返す日 */
  private ALNumberField month_day;

  /** <code>currentYear</code> 現在の年 */
  private int currentYear;

  /** <code>login_user</code> ログインユーザー */
  private ALEipUser login_user;

  /** <code>tmpStart</code> 開始日時の初期値 */
  private String tmpStart;

  /** <code>tmpEnd</code> 終了日時の初期値 */
  private String tmpEnd;

  /** <code>edit_officecalendar_flag</code> 繰り返しスケジュールの編集フラグ */
  private ALNumberField edit_repeat_flag;

  /** <code>tmpView</code> 表示する日 */
  private String tmpView;

  /** <code>end_date</code> 終了日時 */
  private ALDateTimeField view_date;

  /** <code>edit_control_flag</code> 共有メンバーによる編集／削除権限フラグ */
  private ALStringField view_office_name;

  /** <code>enable_change_tmpreserve</code> 仮スケジュールに戻すかどうか */
  private ALStringField view_office_id;

  /** <code>isOwner</code> 所有者かどうか */
  private boolean is_owner;

  /** <code>todo_id</code> ToDo ID */
  private ALNumberField common_category_id;

  private DataContext dataContext;

  private int msg_type = 0;

  private String org_id;

  private ALEipUser loginUser;

  private String date_detail;

  /** 施設の重複チェック用 */
  private String db_officecalendarid;

  /** アクセス権限の機能名 */
  private String aclPortletFeature = null;

  private boolean ignore_duplicate_facility;

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#init(com.aimluck.eip.modules.actions.common.ALAction,
   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
   */
  public void init(ALAction action, RunData rundata, Context context)
      throws ALPageNotFoundException, ALDBErrorException {

    ignore_duplicate_facility = rundata.getParameters().getBoolean(
        "ignore_duplicate_facility", false);
    login_user = ALEipUtils.getALEipUser(rundata);

    is_owner = true;

    dataContext = DatabaseOrmService.getInstance().getDataContext();
    org_id = DatabaseOrmService.getInstance().getOrgId(rundata);
    loginUser = ALEipUtils.getALEipUser(rundata);
    date_detail = "";

    //

    db_officecalendarid = ALEipUtils.getTemp(rundata, context,
        ALEipConstants.ENTITY_ID);

    String officecalendarId = rundata.getParameters().getString(
        ALEipConstants.ENTITY_ID);
    if (officecalendarId == null || officecalendarId.equals("new")) {
      String str[] = rundata.getParameters().getStrings("member_to");
      if (str != null && str.length > 0) {
        aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_OTHER;
        String user_name = login_user.getName().toString();
        for (int i = 0; i < str.length; i++) {
          if (user_name.equals(str[i])) {
            aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_SELF;
            break;
          }
        }
      } else {
        aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_SELF;
      }
    /** Del 20110915 小濵 Start --- */
//    } else if (OfficecalendarUtils.hasRelation(rundata)) {
//      aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_SELF;
    /** Del 20110915 小濵 End   --- */
    } else {
      aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_OTHER;
    }

    /*
     */
    // スーパークラスのメソッドを呼び出す。
    super.init(action, rundata, context);
  }

  public void loadParametersViewDate(RunData rundata, Context context) {
    if (ALEipUtils.isMatch(rundata, context)) {
      if (rundata.getParameters().containsKey("view_date")) {
        ALDateTimeField dummy = new ALDateTimeField("yyyy-MM-dd");
        tmpView = rundata.getParameters().getString("view_date");
        ALEipUtils.setTemp(rundata, context, "tmpView", tmpView);
        dummy.setValue(tmpView);
        if (!dummy.validate(new ArrayList())) {
          ALEipUtils.removeTemp(rundata, context, "tmpView");
          logger.debug("[OfficecalendarFormData] Parameter cannot validate");
          ALEipUtils.redirectPageNotFound(rundata);
          return;
        }
      } else {
        if (tmpView == null || tmpView.equals("")) {
          if (tmpStart != null && !tmpStart.equals("")) {
            tmpView = tmpStart;
            ALEipUtils.setTemp(rundata, context, "tmpView", tmpView);
          }
        }
      }
    }
  }

  /**
   * パラメータを読み込みます。
   * 
   * @param rundata
   * @param context
   */
  public void loadParameters(RunData rundata, Context context) {
    ALDateTimeField dummy = new ALDateTimeField("yyyy-MM-dd-HH-mm");
    dummy.setNotNull(true);
    String cDate = rundata.getParameters().getString("start_date");
    if (cDate != null) {
      calendar_date = cDate;
    }
    String tempOfficeId = rundata.getParameters().getString("office_id");
    if (tempOfficeId != null) {
      office_id = tempOfficeId;
    }
    String tempDay = rundata.getParameters().getString("day");
    if (tempDay != null) {
      day = tempDay;
    }
    boolean tempIsHoliday = rundata.getParameters().getBoolean("isHoliday");
    isHoliday = tempIsHoliday;
    if (ALEipUtils.isMatch(rundata, context)) {
      if (rundata.getParameters().containsKey("form_start")) {
        tmpStart = rundata.getParameters().getString("form_start");
        ALEipUtils.setTemp(rundata, context, "tmpStart", tmpStart);
        dummy.setValue(tmpStart);
        if (!dummy.validate(new ArrayList())) {
          ALEipUtils.removeTemp(rundata, context, "form_start");
          ALEipUtils.removeTemp(rundata, context, "form_end");
          logger.debug("[OfficecalendarFormData] Parameter cannot validate");
          ALEipUtils.redirectPageNotFound(rundata);
          return;
        }
      } else {
        dummy.setValue(new Date());
        ALEipUtils.setTemp(rundata, context, "tmpStart", dummy.toString());
      }
      if (rundata.getParameters().containsKey("form_end")) {
        tmpEnd = rundata.getParameters().getString("form_end");
        ALEipUtils.setTemp(rundata, context, "tmpEnd", tmpEnd);
        dummy.setValue(tmpEnd);
        if (!dummy.validate(new ArrayList())) {
          ALEipUtils.removeTemp(rundata, context, "form_start");
          ALEipUtils.removeTemp(rundata, context, "form_end");
          logger.debug("[OfficecalendarFormData] Parameter cannot validate");
          ALEipUtils.redirectPageNotFound(rundata);
          return;
        }
      } else {
        dummy.setValue(new Date());
        ALEipUtils.setTemp(rundata, context, "tmpEnd", dummy.toString());
      }
    }
    tmpStart = ALEipUtils.getTemp(rundata, context, "tmpStart");
    tmpEnd = ALEipUtils.getTemp(rundata, context, "tmpEnd");

    loadParametersViewDate(rundata, context);
  }

  /*
   * @see com.aimluck.eip.common.ALData#initField()
   */
  public void initField() {
    Date now = new Date();
    Calendar cal = Calendar.getInstance();
    int min = cal.get(Calendar.MINUTE);

    if (min <= 5) {
      cal.set(Calendar.MINUTE, 5);
    } else if (min <= 10) {
      cal.set(Calendar.MINUTE, 10);
    } else if (min <= 15) {
      cal.set(Calendar.MINUTE, 15);
    } else if (min <= 20) {
      cal.set(Calendar.MINUTE, 20);
    } else if (min <= 25) {
      cal.set(Calendar.MINUTE, 25);
    } else if (min <= 30) {
      cal.set(Calendar.MINUTE, 30);
    } else if (min <= 35) {
      cal.set(Calendar.MINUTE, 35);
    } else if (min <= 40) {
      cal.set(Calendar.MINUTE, 40);
    } else if (min <= 45) {
      cal.set(Calendar.MINUTE, 45);
    } else if (min <= 50) {
      cal.set(Calendar.MINUTE, 50);
    } else if (min <= 55) {
      cal.set(Calendar.MINUTE, 55);
    } else {
      cal.set(Calendar.MINUTE, 60);
    }

    // 開始日時
    start_date = new ALDateTimeField("yyyy-MM-dd-HH-mm");
    if (tmpStart == null || tmpStart.equals("")) {
      start_date.setValue(now);
    } else {
      start_date.setValue(tmpStart);
    }
    start_date.setFieldName("開始日時");
    // 終了日時
    end_date = new ALDateTimeField("yyyy-MM-dd-HH-mm");
    if (tmpEnd == null || tmpEnd.equals("")) {
      if (tmpStart == null || tmpStart.equals("")) {
        end_date.setValue(now);
      } else {
        end_date.setValue(tmpStart);
      }
    } else {
      end_date.setValue(tmpEnd);
    }
    end_date.setFieldName("終了日時");
    // 繰り返しタイプ
    repeat_type = new ALStringField();
    repeat_type.setFieldName("繰り返しタイプ");
    repeat_type.setValue("D");
    repeat_type.setTrim(true);
    // 日
    week_0 = new ALStringField();
    week_0.setFieldName("日");
    week_0.setTrim(true);
    // 月
    week_1 = new ALStringField();
    week_1.setFieldName("月");
    week_1.setTrim(true);
    // 火
    week_2 = new ALStringField();
    week_2.setFieldName("火");
    week_2.setTrim(true);
    // 水
    week_3 = new ALStringField();
    week_3.setFieldName("水");
    week_3.setTrim(true);
    // 木
    week_4 = new ALStringField();
    week_4.setFieldName("木");
    week_4.setTrim(true);
    // 金
    week_5 = new ALStringField();
    week_5.setFieldName("金");
    week_5.setTrim(true);
    // 土
    week_6 = new ALStringField();
    week_6.setFieldName("土");
    week_6.setTrim(true);

    // 予定
    note_name = new ALStringField();
    note_name.setFieldName("休出区分 ");
    note_name.setTrim(true);
    // 場所
    office_name = new ALStringField();
    office_name.setFieldName("勤務先名");
    office_name.setTrim(true);
    // 内容
    note = new ALStringField();
    note.setFieldName("コメント");
    note.setTrim(false);
    // 公開区分
    on_off_class = new ALStringField();
    on_off_class.setTrim(true);
    //update 2010-08-27 wangchao Start--
//    if (isHoliday) {
//      on_off_class.setValue("1");
//    } else {
//      if (day != null && !day.equals("")) {
//        if (day.equals("0")) {
//          on_off_class.setValue("1");
//        } else if (day.equals("6")) {
//          on_off_class.setValue("1");
//        } else {
//          on_off_class.setValue("0");
//        }
//      } else {
//        on_off_class.setValue("0");
//      }     
//    }
    if (isHoliday) {
      on_off_class.setValue("0");
    } else {
      if (day != null && !day.equals("")) {
        if (day.equals("0")) {
          on_off_class.setValue("0");
        } else if (day.equals("6")) {
          on_off_class.setValue("0");
        } else {
          on_off_class.setValue("1");
        }
      } else {
        on_off_class.setValue("1");
      }     
    }
    //update 2010-08-27 wangchao End--
    // 繰り返しスケジュールの編集フラグ
    edit_repeat_flag = new ALNumberField();
    edit_repeat_flag.setFieldName("繰り返し編集範囲");
    edit_repeat_flag.setValue(FLAG_EDIT_REPEAT_DEF);

    // 指定日時
    view_date = new ALDateTimeField("yyyy-MM-dd");
    if (tmpView == null || tmpView.equals("")) {
      view_date.setValue(now);
    } else {
      view_date.setValue(tmpView);
    }
    view_date.setFieldName("指定日時");

    // 勤務先ID
    view_office_name = new ALStringField();
    if (office_id != null && !office_id.equals("") && !office_id.equals("0")) {
      view_office_name.setFieldName(getOfficeById(office_id.toString()));
    } else {
      view_office_name.setFieldName("");
    }
    view_office_name.setTrim(true);
    view_office_name.setValue("T");

    // 仮スケジュールに戻すかどうか
    view_office_id = new ALStringField();
    if (office_id != null && !office_id.equals("") && !office_id.equals("0")) {
      view_office_id.setFieldName(office_id);
    } else {
      view_office_id.setFieldName("");
    }
    view_office_id.setTrim(true);
    view_office_id.setValue("F");

    // 現在の年（年を選択するリストボックスに利用）
    currentYear = Calendar.getInstance().get(Calendar.YEAR);

  }

  public static String getOfficeById(String officeId) {
    if (officeId == null || officeId.toString().equals("0")) {
      return null;
    }
    String result = null;
    DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
    SelectQuery query = new SelectQuery(ImwTOffice.class);
    Expression exp14 = ExpressionFactory.matchDbExp(
        ImwTOffice.OFFICE_ID_PK_COLUMN, Integer.parseInt(officeId));
    query.setQualifier(exp14);
    List list = dataContext.performQuery(query);
    ImwTOffice tempOffice = (ImwTOffice) list.get(0);
    result = tempOffice.getOfficeName();
    return result;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#setFormData(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context, java.util.ArrayList)
   */
  protected boolean setFormData(RunData rundata, Context context,
      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
    boolean res = super.setFormData(rundata, context, msgList);
    return res;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#setValidator()
   */
  protected void setValidator() {

    /** Add 20110908 小濵 Start */
    note.setNotNull(true);
    /** Add 20110908 小濵 End   */
    note.limitMaxLength(1000);

  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#validate(java.util.ArrayList)
   */
  protected boolean validate(ArrayList msgList) throws ALDBErrorException,
      ALPageNotFoundException {

    note.validate(msgList);
    return (msgList.size() == 0);

  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#loadFormData(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context, java.util.ArrayList)
   */
  protected boolean loadFormData(RunData rundata, Context context,
      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
    try {
      // オブジェクトモデルを取得
      ImwTOfficeCalendar record = OfficecalendarUtils.getImwTOfficeCalendar(
          rundata, context, false);
      if (record == null) {
        return false;
      } else {
        note.setValue(record.getNote());
        //add 2010-08-27 wangchao Start--
        start_date.setValue(record.getCalendarDate());
        //add 2010-08-27 wangchao End--
        on_off_class.setValue(record.getOnOffClass());
      }
    } catch (Exception e) {
      // TODO: エラー処理
      logger.error("[OfficecalendarFormData]", e);
      throw new ALDBErrorException();
    }
    return true;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#insertFormData(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context, java.util.ArrayList)
   */
  protected boolean insertFormData(RunData rundata, Context context,
      ArrayList msgList) throws ALDBErrorException {

    ImwTOfficeCalendar officeCalendar = null;
    try {
      if (office_id == null || office_id.equals("") || office_id.equals("none")) {
        return false;
      }

      int ownerid = ALEipUtils.getUserId(rundata);
      // 新規オブジェクトモデル
      officeCalendar = (ImwTOfficeCalendar) dataContext
          .createAndRegisterNewObject(ImwTOfficeCalendar.class);

      SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
      Date date = sdf.parse(calendar_date);

      // 対象日
      officeCalendar.setCalendarDate(date);
      // コメント
      officeCalendar.setNote(note.getValue());
      // 無効
      officeCalendar.setDisabled("F");
      // 作成日
      Date now = new Date();
      officeCalendar.setCreateDate(now);
      officeCalendar.setCreateUserId(Integer.valueOf(ownerid));
      // 更新日
      officeCalendar.setUpdateDate(now);
      officeCalendar.setUpdateUserId(Integer.valueOf(ownerid));
      // 勤務先ID
/** Update 2010/08/27 金廣 Start--- */
// リレーション対応
      //officeCalendar.setOfficeId(Integer.parseInt(office_id));
      officeCalendar.setImwTOffice(OfficecalendarUtils.getImwTOffice(dataContext, office_id));
 /** Update 2010/08/27 金廣 End----- */     
      // 休出区分
      officeCalendar.setOnOffClass(on_off_class.getValue());
      dataContext.commitChanges();

    } catch (Exception e) {

      // TODO: エラー処理
      logger.error("[OfficeCalendarFormData]", e);
      // throw new ALDBErrorException();
      return false;
    }
    return true;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#updateFormData(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context, java.util.ArrayList)
   */
  protected boolean updateFormData(RunData rundata, Context context,
      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
    boolean res = true;
    try {
      ImwTOfficeCalendar officecalendar = (ImwTOfficeCalendar) OfficecalendarUtils
          .getImwTOfficeCalendar(rundata, context, true);
      if (officecalendar == null)
        return false;

      int ownerid = ALEipUtils.getUserId(rundata);
      // 休出区分
      officecalendar.setOnOffClass(on_off_class.getValue());
      // コメント
      officecalendar.setNote(note.getValue());
      // 無効
      officecalendar.setDisabled("F");
      // 更新日
      Date now = new Date();
      officecalendar.setUpdateDate(now);
      officecalendar.setUpdateUserId(Integer.valueOf(ownerid));

      dataContext.commitChanges();

    } catch (Exception e) {
      logger.error("Exception", e);
      res = false;
    }
    return res;
  }

  /** Del 20110915 小濵 Start --- */
//  private EipTScheduleMap getOfficecalendarMap(List officecalendarMaps,
//      int userid, String type) {
//    EipTScheduleMap map = null;
//    int size = officecalendarMaps.size();
//    for (int i = 0; i < size; i++) {
//      map = (EipTScheduleMap) officecalendarMaps.get(i);
//      if (map.getUserId().intValue() == userid && type.equals(map.getType())) {
//        return map;
//      }
//    }
//    return null;
//  }
  /** Del 20110915 小濵 End   --- */

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#deleteFormData(org.apache.turbine.util.RunData,
   *      org.apache.velocity.context.Context, java.util.ArrayList)
   */
  protected boolean deleteFormData(RunData rundata, Context context,
      ArrayList msgList) throws ALPageNotFoundException, ALDBErrorException {
    String entityId = ALEipUtils.getTemp(rundata, context,
        ALEipConstants.ENTITY_ID);

    if (entityId == null)
      return false;

    // 削除
    DataContext dataContext = DatabaseOrmService.getInstance().getDataContext();
    ObjectId oid_user = new ObjectId("ImwTOfficeCalendar",
        ImwTOfficeCalendar.CALENDAR_ID_PK_COLUMN, entityId);
    ImwTOfficeCalendar officeCalendar = (ImwTOfficeCalendar) dataContext
        .refetchObject(oid_user);

    officeCalendar.setDisabled("T");

    officeCalendar.setUpdateUserId(ALEipUtils.getUserId(rundata));

    Date now = new Date();

    officeCalendar.setUpdateDate(now);
    dataContext.commitChanges();
    return true;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#doViewForm(com.aimluck.eip.modules.actions.common.ALAction,
   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
   */
  public boolean doViewForm(ALAction action, RunData rundata, Context context) {
    boolean res = super.doViewForm(action, rundata, context);
    // post(action, rundata, context);
    return res;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#doInsert(com.aimluck.eip.modules.actions.common.ALAction,
   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
   */
  public boolean doInsert(ALAction action, RunData rundata, Context context) {
    boolean res = super.doInsert(action, rundata, context);
    // post(action, rundata, context);
    return res;
  }

  /*
   * @see com.aimluck.eip.common.ALAbstractFormData#doUpdate(com.aimluck.eip.modules.actions.common.ALAction,
   *      org.apache.turbine.util.RunData, org.apache.velocity.context.Context)
   */
  public boolean doUpdate(ALAction action, RunData rundata, Context context) {
    boolean res = super.doUpdate(action, rundata, context);
    // post(action, rundata, context);
    return res;
  }

  private boolean facilityCheckAclPermission(int f_size, ArrayList msgList,
      RunData rundata, int aclType) {
    if (f_size > 0) {
      ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices
          .getInstance())
          .getService(ALAccessControlFactoryService.SERVICE_NAME);
      ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler();

      hasAuthority = aclhandler.hasAuthority(ALEipUtils.getUserId(rundata),
          ALAccessControlConstants.POERTLET_FEATURE_OFFICE_CALENDAR_FACILITY,
          aclType);

      if (!hasAuthority) {
        msgList.add(" 施設を予約する権限がありません ");
        return false;
      }
    }
    return true;
  }

  /**
   * 指定した曜日が，選択範囲に入っているかを検証する．
   * 
   * @param selectedWeek
   *            指定曜日
   * @param startWeek
   *            期間開始曜日
   * @param endWeek
   *            期間終了曜日
   * @return 選択範囲に入っている場合，true．
   */
  private boolean includeWeek(int selectedWeek, int startWeek, int endWeek) {
    if (startWeek <= endWeek) {
      if (startWeek <= selectedWeek && selectedWeek <= endWeek) {
        return true;
      } else {
        return false;
      }
    } else {
      if (selectedWeek < startWeek && endWeek < selectedWeek) {
        return false;
      } else {
        return true;
      }
    }
  }

  /**
   * 開始日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getStartDate() {
    return start_date;
  }

  /**
   * 開始日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getStartDateSub() {
    ALDateTimeField tmpDate = new ALDateTimeField("yyyy/MM/dd");
    tmpDate.setValue(start_date.getValue());
    return tmpDate;
  }

  /**
   * 開始日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getStartDateTime() {
    ALDateTimeField tmpDate = new ALDateTimeField("HH:mm");
    tmpDate.setValue(start_date.getValue());
    return tmpDate;
  }

  /**
   * 終了日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getEndDate() {
    return end_date;
  }

  /**
   * 終了日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getEndDateSub() {
    ALDateTimeField tmpDate = new ALDateTimeField("yyyy/MM/dd");
    tmpDate.setValue(end_date.getValue());
    return tmpDate;
  }

  /**
   * 終了日時を取得します。
   * 
   * @return
   */
  public ALDateTimeField getEndDateTime() {
    ALDateTimeField tmpDate = new ALDateTimeField("HH:mm");
    tmpDate.setValue(end_date.getValue());
    return tmpDate;
  }

  /**
   * 指定したグループ名のユーザーを取得します。
   * 
   * @param groupname
   * @return
   */
  public List getUsers(String groupname) {
    return ALEipUtils.getUsers(groupname);
  }

  /**
   * 部署マップを取得します。
   * 
   * @return
   */
  public Map getPostMap() {
    return ALEipManager.getInstance().getPostMap();
  }

  /**
   * 予定を取得します。
   * 
   * @return
   */
  public ALStringField getNoteName() {
    return note_name;
  }

  /**
   * 内容を取得します。
   * 
   * @return
   */
  public ALStringField getNote() {
    return note;
  }

  /**
   * 場所を取得します。
   * 
   * @return
   */
  public ALStringField getOfficeName() {
    return office_name;
  }

  /**
   * 終了日時を取得します。
   * 
   * @return
   */
  public int getCurrentYear() {
    return currentYear;
  }

  /**
   * 
   * @return
   */
  public boolean isOwner() {
    return is_owner;
  }

  /**
   * ログインユーザを取得します。
   * 
   * @return
   */
  public ALEipUser getLoginUser() {
    return login_user;
  }

  /**
   * 公開/非公開フラグを取得します。
   * 
   * @return
   */
  public ALStringField getOnOffClass() {
    return on_off_class;
  }

  /**
   * 繰り返すかどうか。
   * 
   * @return
   */

  /**
   * 期限を取得します。
   * 
   * @return
   */
  public ALDateField getLimitStartDate() {
    return limit_start_date;
  }

  /**
   * 期限を取得します。
   * 
   * @return
   */
  public ALDateTimeField getLimitStartDateSub() {
    ALDateTimeField tmpDate = new ALDateTimeField("yyyy/MM/dd");
    try {
      tmpDate.setValue(limit_start_date.getValue().getDate());
    } catch (Exception e) {
      logger.error("[OfficecalendarFormData]", e);

    }
    return tmpDate;
  }

  /**
   * 期限を取得します。
   * 
   * @return
   */
  public ALDateField getLimitEndDate() {
    return limit_end_date;
  }

  /**
   * 期限を取得します。
   * 
   * @return
   */
  public ALDateTimeField getLimitEndDateSub() {
    ALDateTimeField tmpDate = new ALDateTimeField("yyyy/MM/dd");
    try {
      tmpDate.setValue(limit_end_date.getValue().getDate());
    } catch (Exception e) {
      logger.error("[OfficecalendarFormData]", e);

    }
    return tmpDate;
  }

  /**
   * 期限フラグを取得します。
   * 
   * @return
   */
  public ALStringField getLimitFlag() {
    return limit_flag;
  }

  /**
   * 毎月繰り返す日を取得します。
   * 
   * @return
   */
  public ALNumberField getMonthDay() {
    return month_day;
  }

  /**
   * 繰り返しタイプを取得します。
   * 
   * @return
   */
  public ALStringField getRepeatType() {
    return repeat_type;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek0() {
    return week_0;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek1() {
    return week_1;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek2() {
    return week_2;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek3() {
    return week_3;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek4() {
    return week_4;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek5() {
    return week_5;
  }

  /**
   * 繰り返し曜日を取得します。
   * 
   * @return
   */
  public ALStringField getWeek6() {
    return week_6;
  }

  /**
   * 繰り返しスケジュールの編集フラグ
   * 
   * @return
   */
  public ALNumberField getEditRepeatFlag() {
    return edit_repeat_flag;
  }

  /**
   * 共有メンバーによる編集／削除権限フラグ
   * 
   * @return
   */
  public ALStringField getViewOfficeName() {
    return view_office_name;
  }

  public ALStringField getViewOfficeId() {
    return view_office_id;
  }

  public ALDateTimeField getViewDate() {
    return view_date;
  }

  public int getInt(long num) {
    return (int) num;
  }

  /**
   * 共有カテゴリ ID
   * 
   * @return
   */
  public ALNumberField getCommonCategoryId() {
    return common_category_id;
  }

  public int getMsgType() {
    return msg_type;
  }

  /**
   * アクセス権限チェック用メソッド。<br />
   * アクセス権限の機能名を返します。
   * 
   * @return
   */
  public String getAclPortletFeature() {
    return aclPortletFeature;
  }

  public String getCalendar_date() {
    return calendar_date;
  }

  public void setCalendar_date(String calendar_date) {
    this.calendar_date = calendar_date;
  }

  public String getOffice_id() {
    return office_id;
  }

  public void setOffice_id(String office_id) {
    this.office_id = office_id;
  }

  public String getDay() {
    return day;
  }

  public void setDay(String day) {
    this.day = day;
  }

  public boolean getIsHoliday() {
    return isHoliday;
  }

  public void setIsHoliday(boolean isHoliday) {
    this.isHoliday = isHoliday;
  }

}
