/**
   * <br>
   * 時間帯情報を画面表示用に格納します
   *
   * @param chList チャートモデルリスト
   * @param admConf タイムカード基本設定モデル
   * @return ArrayList < TcdTimezoneMeiModel >
   */
  private ArrayList<TcdTimezoneMeiModel> __getDspTimeZoneList(
      ArrayList<TcdTimezoneMeiModel> chList, TcdAdmConfModel admConf) {

    ArrayList<TcdTimezoneMeiModel> dspList = new ArrayList<TcdTimezoneMeiModel>();

    TcdTimezoneMeiModel valueMdl = null;
    // 時間帯情報無し
    log__.debug("時間帯情報件数==>" + chList.size());
    if (chList.size() == 0) {
      valueMdl = new TcdTimezoneMeiModel();
      valueMdl.setTimeZoneSID(GSConstTimecard.BLANK_ZONE_SID);
      valueMdl.setRows(__getMaxRowsCount(admConf.getTacInterval()));
      valueMdl.setIndex(1);
      chList.add(valueMdl);
      return chList;
    }

    // 出力済情報の格納用
    HashMap<String, TcdTimezoneMeiModel> map = new HashMap<String, TcdTimezoneMeiModel>();

    while (chList.size() != map.size()) {
      // 1行分を作成する
      dspList = __getDailyLineMdl(chList, map, admConf, dspList);
    }

    return dspList;
  }
  /**
   * <br>
   * 1行分の時間帯モデルを生成する <br>
   * [備考]出力済みの時間帯情報はHashMapに格納します
   *
   * @param tzhList 時間帯情報
   * @param map 出力済みの時間帯情報情報
   * @param admConf タイムカード基本設定
   * @param dspList 表示情報リスト
   * @return ArrayList
   */
  private ArrayList<TcdTimezoneMeiModel> __getDailyLineMdl(
      ArrayList<TcdTimezoneMeiModel> tzhList,
      HashMap<String, TcdTimezoneMeiModel> map,
      TcdAdmConfModel admConf,
      ArrayList<TcdTimezoneMeiModel> dspList) {

    TcdTimezoneMeiModel valueMdl = null;
    TcdTimezoneMeiModel tzMdl = null;

    int tzSid = 0;
    int maxRows = __getMaxRowsCount(admConf.getTacInterval());
    int endIndex = 1;

    for (int i = 0; i < tzhList.size(); i++) {

      tzMdl = tzhList.get(i);
      tzSid = tzMdl.getTimeZoneSID();
      if (map.containsKey(String.valueOf(tzSid))) {
        // 出力済みは除外
        continue;
      }

      // 空白部分を設定
      valueMdl = __getBlankTimeZone(tzMdl, admConf, endIndex);
      if (valueMdl != null) {
        dspList.add(valueMdl);
        endIndex = endIndex + valueMdl.getRows();
        log__.debug("空白部分==>" + valueMdl.getRows());
      }
      // 時間帯部分を設定
      int rows = __getRows(tzMdl, admConf, endIndex);
      log__.debug("時間帯部分row==>" + rows);
      valueMdl = new TcdTimezoneMeiModel();
      valueMdl.setRows(rows);
      valueMdl.setTimeZoneSID(tzMdl.getTimeZoneSID());
      valueMdl.setTimeZoneKbn(tzMdl.getTimeZoneKbn());
      valueMdl.setTimeZoneStr(tzMdl.getTimeZoneStr());
      valueMdl.setIndex(endIndex);
      dspList.add(valueMdl);
      endIndex = endIndex + rows;
      map.put(String.valueOf(tzSid), tzMdl);

      // 格納先インデックスがMAXの場合breakする
      if (endIndex == maxRows) {
        break;
      }
    }
    // 表示終了時刻までの空白を設定
    valueMdl = __getEndBlankTimeZone(tzMdl, admConf, endIndex);
    if (valueMdl != null) {
      dspList.add(valueMdl);
      endIndex = endIndex + valueMdl.getRows();
    }

    return dspList;
  }
  /**
   * <br>
   * 表示開始時刻と時間帯情報から時間帯終了時刻のインデックスを取得する
   *
   * @param tzMdl 時間帯情報
   * @param admConf 基本設定
   * @return int 開始時刻のインデックス
   */
  private int __getEndIndex(TcdTimezoneMeiModel tzMdl, TcdAdmConfModel admConf) {
    int index = 1;
    UDate dspDate = new UDate();
    dspDate.setZeroHhMmSs();
    Time toTime = tzMdl.getToTime();
    UDate toDate = dspDate.cloneUDate();
    toDate.setHour(TimecardUtil.getTimeHour(toTime));
    toDate.setMinute(TimecardUtil.getTimeMin(toTime));

    if (dspDate.compareDateYMDHM(toDate) == UDate.EQUAL) {
      index = __getMaxRowsCount(admConf.getTacInterval());
    } else {
      int intHour = toDate.getIntHour();
      int min = toDate.getIntMinute();
      int ans1 = intHour * __getHourRowsCount(admConf.getTacInterval());
      int ans2 = __getMinRowsCount(admConf.getTacInterval(), min);
      index = ans1 + ans2;
    }

    return index;
  }
  /**
   * <br>
   * 表示開始時刻と時間帯情報から時間帯開始時刻のインデックスを取得する
   *
   * @param tzMdl 時間帯情報
   * @param admConf 基本設定情報
   * @return int 開始時刻のインデックス
   */
  private int __getIndex(TcdTimezoneMeiModel tzMdl, TcdAdmConfModel admConf) {
    int index = 1;
    UDate dspDate = new UDate();
    dspDate.setZeroHhMmSs();

    Time frTime = tzMdl.getFrTime();
    UDate frDate = dspDate.cloneUDate();
    frDate.setHour(TimecardUtil.getTimeHour(frTime));
    frDate.setMinute(TimecardUtil.getTimeMin(frTime));

    if (dspDate.compareDateYMDHM(frDate) != UDate.LARGE) {
      index = 1;
    } else {
      int intHour = frDate.getIntHour();
      int min = frDate.getIntMinute();
      int ans1 = index + (intHour * __getHourRowsCount(admConf.getTacInterval()));
      int ans2 = __getMinRowsCount(admConf.getTacInterval(), min);
      index = ans1 + ans2;
    }
    return index;
  }
  /**
   * <br>
   * 表示終了時刻と出力済みポインタから空時間帯を必要に応じて生成する
   *
   * @param schMdl 時間帯情報
   * @param admConf タイムカード基本設定
   * @param endIndex 出力済みポインタ
   * @return TcdTimezoneMeiModel
   */
  private TcdTimezoneMeiModel __getEndBlankTimeZone(
      TcdTimezoneMeiModel schMdl, TcdAdmConfModel admConf, int endIndex) {
    TcdTimezoneMeiModel valueMdl = null;
    int index = __getMaxRowsCount(admConf.getTacInterval()) + 1;
    int rows = index - endIndex;
    if (rows > 0) {
      // 空の時間帯を生成する
      valueMdl = new TcdTimezoneMeiModel();
      valueMdl.setRows(rows);
      valueMdl.setTimeZoneSID(GSConstTimecard.BLANK_ZONE_SID);
      valueMdl.setIndex(endIndex);
    }

    return valueMdl;
  }
  /**
   * <br>
   * TcdTimezoneMeiModelからHTML文字列を取得します。 <br>
   * 1ユーザの日間タイムカード情報
   *
   * @param writer ライター
   * @param admConf 基本設定情報
   * @param valueList 画面表示用時間帯設定
   * @throws Exception IOエラー時にスロー
   */
  private static void __writeHtmlString(
      JspWriter writer, TcdAdmConfModel admConf, ArrayList<TcdTimezoneMeiModel> valueList)
      throws Exception {

    TcdTimezoneMeiModel valueMdl = null;

    GsMessage gsMsg = new GsMessage();
    String memory = gsMsg.getMessage(req__, "cmn.memory");
    String timeBelt = gsMsg.getMessage(req__, "tcd.tcd070.01");

    // タイムチャート部分出力
    writer.println("<td width=\"40%\" align=\"center\" valign=\"top\">");

    writer.println(
        "  <table width=\"200\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\""
            + " class=\"tl0\">");
    writer.println("  <tr>");
    writer.println("  <th width=\"0%\" class=\"td_gray\" scope=\"col\"></th>");
    writer.println("  <th width=\"0%\" class=\"td_gray\" scope=\"col\">");
    writer.println(
        "  <img src=\"./images/space10.gif\" alt=\"" + memory + "\" width=\"3\" height=\"7\">");
    writer.println("  </th>");
    writer.println(
        "  <th width=\"100%\" align=\"center\" class=\"td_gray\" scope=\"col\">" + timeBelt);
    writer.println("  </th>");
    writer.println("  </tr>");
    // 0時~23時ループ
    int dspHour = 0;
    int counter = __getHourRowsCount(admConf.getTacInterval());
    int hourRows = __getHourRowsCount(admConf.getTacInterval());
    int maxRows = __getMaxRowsCount(admConf.getTacInterval());

    for (int i = 0; i < maxRows; i++) {

      if (counter == hourRows) {
        writer.println("<tr align=\"center\">");
        writer.println(
            "<th class=\"td_gray\" width=\"30\"" + " rowspan=\"" + hourRows + "\" nowrap>");

        writer.println("" + dspHour + "</th>");
        writer.println("<td class=\"td_gray\">");
        writer.println(
            "<img src=\"./images/space10.gif\" alt=\""
                + memory
                + "\""
                + " width=\"3\" height=\"7\">");
        writer.println("</td>");

        dspHour++;
        counter = 1;
      } else {
        writer.println("<tr align=\"center\">");
        writer.println("<td class=\"td_gray\">");
        writer.println(
            "<img src=\"./images/space10.gif\" alt=\""
                + memory
                + "\""
                + " width=\"3\" height=\"7\">");
        writer.println("</td>");
        counter++;
      }
      // 挿入する時間帯を検索
      valueMdl = __getTargetModel(valueList, i + 1);
      if (valueMdl != null) {
        // 時間帯情報セット

        if (valueMdl.getTimeZoneSID() != GSConstTimecard.BLANK_ZONE_SID) {
          String time = valueMdl.getTimeZoneStr();
          String title = __getTitleString(Integer.parseInt(valueMdl.getTimeZoneKbn()));
          String color = __getStyleBgColor(Integer.parseInt(valueMdl.getTimeZoneKbn()));
          writer.println(
              "<td class=\""
                  + color
                  + "\" "
                  + " title=\""
                  + time
                  + " "
                  + title
                  + "\""
                  + " rowspan=\""
                  + valueMdl.getRows()
                  + "\">");

          if (valueMdl.getRows() > GSConstTimecard.MAIN_DSP_HOURS) {
            writer.println("" + time + "<br>");
            writer.println("" + title + "");
          }

        } else {
          writer.println("<td class=\"td_type1\"");
          writer.println("rowspan=\"" + valueMdl.getRows() + "\" >");
        }
        writer.println("</td>");
      }
      writer.println("</tr>");
    }
    writer.println("</table>");
    writer.println("</td>");
  }