    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.hayabusa.taglib;
    017
    018import org.opengion.hayabusa.common.HybsSystem;
    019import org.opengion.hayabusa.common.HybsSystemException;
    020import org.opengion.hayabusa.resource.CalendarData;
    021import org.opengion.hayabusa.resource.CalendarFactory;
    022import org.opengion.hayabusa.html.ViewStackTableParam;
    023import org.opengion.fukurou.util.StringUtil;
    024import static org.opengion.fukurou.util.StringUtil.nval ;
    025
    026import java.util.Calendar;
    027import java.util.Date;
    028import java.util.List;
    029import java.util.ArrayList;
    030import java.util.Locale ;
    031import java.text.DateFormat;
    032import java.text.SimpleDateFormat;
    033
    034/**
    035 * ガントチャート用のヘッダー情報(日付け等)を出力するタグです。
    036 *
    037 * スライドバー式ガントチャートの表示時に、スライドバーの長さと日付とを関連付けるための
    038 * ヘッダー情報(日付け等)を出力します。スライドバーと日付間隔は、zoom 属性によって、
    039 * CSSファイルのフォントサイズと、JavaScript の内部配列に依存しています。
    040 * また、このヘッダーでは、日付の休日情報を、カレンダテーブルを参照することで取得しています。
    041 * calDB 属性への指定は、CalendarFactory で生成されるテーブル名(CalendarDataの実装クラス)
    042 * を指定します。
    043 *
    044 * @og.formSample
    045 * ●形式：&lt;og:ganttHeader startDate="…" endDate="…" zoom="[…]" /&gt;
    046 * ●body：なし
    047 *
    048 * ●Tag定義：
    049 *   &lt;og:ganttHeader
    050 *       startDate          【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式)
    051 *       endDate            【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式)
    052 *       zoom               【TAG】ズーム変数(0〜13,20〜31,40〜49)を設定します(初期値:2)
    053 *       calDB              【TAG】DB検索するＤＢを指定します
    054 *       arg1               【TAG】ＤＢ検索する場合の第１のキーを指定します
    055 *       arg2               【TAG】ＤＢ検索する場合の第２のキーを指定します
    056 *       arg3               【TAG】ＤＢ検索する場合の第３のキーを指定します
    057 *       arg4               【TAG】ＤＢ検索する場合の第４のキーを指定します
    058 *       daySpan            【TAG】１日の開始終了時間を24時間形式(HHmm-HHmm)で設定します(初期値:0700-2000)
    059 *       breakTimes         【TAG】時間軸での休憩時間の開始-終了時刻をカンマ区切りで複数指定します(HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm形式、または、yyyyMMddHHmm-yyyyMMddHHmm形式)
    060 *       breakTimeStyle     【TAG】時間軸での休憩時間の表示スタイルを設定します(初期値:top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;)
    061 *       baseTimes          【TAG】時間軸でのベース時刻の開始時刻をカンマ区切りで複数指定します(HHmm形式、または、yyyyMMddHHmm形式)
    062 *       baseTimeStyle      【TAG】時間軸でのベース時刻の表示スタイルを設定します(初期値:top:20px;background-color:transparent;border-left:2px dashed red;)
    063 *       skipHoliday        【TAG】時間ガントで休日を表示する/しないを設定します (初期値:USE_GANTTHEADER_SKIP_HOLIDAY[=true])
    064 *       useMultiClm        【TAG】時間ヘッダーの上段に日付を、下段の時間を表示します (初期値:USE_GANTTHEADER_MULTIPLE_COLUMN[=false])
    065 *       debug              【TAG】デバッグ情報を出力するかどうか[true/false]を指定します(初期値:false)
    066 *   /&gt;
    067 *
    068 * ●使用例
    069 *    参照：jsp/GANTT06 フォルダ
    070 *
    071 *     &lt;og:ganttHeader
    072 *         startDate = "{&#064;VIEW_DATE}"
    073 *         endDate   = "{&#064;DYMAX}"
    074 *         zoom      = "{&#064;VIEW_ZOOM}"
    075 *         calDB     = "GF13"
    076 *         arg1      = "{&#064;CDJGS}"
    077 *         arg2      = ""
    078 *     /og:ganttHeader&gt;
    079 *
    080 *     &lt;og:ganttHeader
    081 *         startDate  = "{&#064;VIEW_DATE}"
    082 *         endDate    = "{&#064;DYMAX}"
    083 *         daySpan    = "0700-2000"                               HHmm-HHmm 形式で１日の時間範囲を指定
    084 *         breakTimes = "1200-1245,1645-1650,200508200700-1200;"  休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm形式、または、yyyyMMddHHmm-yyyyMMddHHmm形式です。
    085 *         breakTimeStyle = "top:20px;background-color:yellow;"   休憩時間のスタイルに追加します。
    086 *         zoom       = "20"
    087 *     /og:ganttHeader&gt;
    088 *
    089 * ●定義・解説
    090 *   PL/SQL の VIEW_ZOOM メソッドを用いて、実際の日付けから画面表示ピクセルへ
    091 *   変換する割合を求めます。これと、jsp\GANTT\image の ganttBGx.gif(x は ZOOM変数)
    092 *   を対応付けて、日付けのヘッダーを求めます。
    093 *   jsp\custom\custom.css の th.zoomx(x は ZOOM変数) により、日付けヘッダー文字の
    094 *   表示間隔を制御していますので、これらの関係を正確に把握しておいて下さい。
    095 *   日付けヘッダーは、イメージ変数を用いている関係上、固定の日数を加算して、
    096 *   求めます。(週:7日, 半月:15日, 月:30日, 4半期:90日, 年:360日)
    097 *
    098 * ヘッダー部のカレンダに、calDB で指定された カレンダテーブルを使用出来ます。
    099 * 使用する場合は、arg1(事業所ｺｰﾄﾞ等)〜arg4(WCｺｰﾄﾞ等) の属性を指定する事ができます。
    100 * zoom="10"(週単位) を使用の週数の計算は、年初の最初の７日間が含まれる週を、第１週と数えます。
    101 *
    102 * zoom="20"(時)間 では、１日の時間範囲をdaySpanでHHmm-HHmm形式で指定します。
    103 * 開始時刻は、内部で１時間単位に変換されます。８時３０分〜は、８時〜になります。
    104 * 終了時間は、その時間を「含みません」
    105 * 開始終了は、startDate、endDateで指定しますが、yyyyMMdd または、yyyyMMddHHmm 形式とします。
    106 * calDB で指定された カレンダテーブルを見て、休日の場合は、表示をスキップします。
    107 * 休憩時間は、breakTimes で指定します。(HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、
    108 * または、yyyyMMddHHmm-yyyyMMddHHmm形式)
    109 * カンマ区切りで複数指定できます。日付指定がない場合は、毎日、日付指定がある場合は、
    110 * その日のみ有効です。休憩時間は、日をまたぐ事は可能です。
    111 * breakTimeStyle として、休憩時間の指定に追加するスタイル属性を追加します。
    112 * 通常は、バックカラーと上からの位置です。ヘッダー表示は、１時間単位です。
    113 * 初期値は、"top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" です。
    114 *
    115 * ベース時刻(baseTimes)は、HHmm形式、または、yyyyMMddHHmm形式で指定した箇所に、線を引きます。
    116 * 例えば、検索した時刻を指定すると、現在時刻の箇所を示す線になります。
    117 * また、業務自体の開始時刻や終了時刻の箇所を表すことも可能です。
    118 * baseTimeStyle は、このベース時刻のスタイルを決めます。breakTimeStyle との違いは、
    119 * 帯の幅を、このスタイルシートで指定していることです。
    120 * 初期値は、top:20px;background-color:transparent;border-left:2px dashed red; です。
    121 *
    122 * zoom="21"(時)間 では、一時間のピクセルを"20"(時)の半分に変更します。
    123 *
    124 * useMultiClm  パラメータを設定すると、ガントヘッダーにおいて、２段組を使用するかどうかを、
    125 * 指定できます。時間ヘッダーの上段に日付を、下段の時間軸の(h)の削除を行います。
    126 * 日付は、表示開始時刻の上と、それの６時間ごとに表示します。
    127 * 初期値は、システムリソースの USE_GANTTHEADER_MULTIPLE_COLUMN で指定します。
    128 *
    129 * システムリソースに USE_GANTTHEADER_MONTH_DATE パラメータを設定すると、
    130 * ガントヘッダーにおいて、30日、90日、180日のヘッダー表示で、日付まで
    131 * 表示するか、月のみ表示するかを指定します。
    132 * ガントヘッダーの繰返し表示でバックグラウンドイメージは固定日なので、一月表示を
    133 * 30日単位で表示していますが、先頭日付が 1日でないため、判りにくいと苦情がありました。
    134 * そこで、30日、90日、180日のヘッダー表示時に、日付を表示しないようにするフラグです。
    135 * 月表示は、その月が 20日以降の場合、翌月を表示します。
    136 * 初期値は、互換性の為、false です。
    137 *
    138 * zoom 40(DAY),41(WEEK),42(MONTH) は、積み上げガント用のヘッダー処理を行います。
    139 * 積み上げガントは、固定日処理ではなく、月単位に加算します。
    140 *
    141 * @og.rev 3.5.4.8 (2004/02/23) 新規作成
    142 * @og.group 画面部品
    143 *
    144 * @version  4.0
    145 * @author      Kazuhiko Hasegawa
    146 * @since    JDK5.0,
    147 */
    148public class GanttHeaderTag extends CommonTagSupport {
    149        //* このプログラムのVERSION文字列を設定します。   {@value} */
    150        private static final String VERSION = "5.7.6.2 (2014/05/16)" ;
    151
    152        private static final long serialVersionUID = 576220140516L ;
    153
    154        // 5.6.2.3 (2013/03/22) 日付をセンターに表示させる場合の両端スペースの元ネタ
    155        private static final String SPACE = "                                   " ;             // 日付(31日分)より多いスペース
    156
    157        // 5.6.5.0 (2013/06/07) 曜日データを配列で持っておきます。
    158        private static final String[] DAY_OF_WEEK_ja = new String[] { " ","日 ","月 ","火 ","水 ","木 ","金 ","土 " };
    159        private static final String[] DAY_OF_WEEK_en = new String[] { " ","Su" ,"Mo" ,"Tu" ,"We" ,"Th" ,"Fr" ,"Sa"  };
    160
    161        private String  startDate       = null;
    162        private String  endDate         = null;
    163        private String  daySpan         = "0700-2000";  // １日の時間範囲(HHmm-HHmm) 3.8.0.5 (2005/08/26)
    164        private int             zoom            = 2;
    165        private String  breakTimes      = null;         // 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-HHmmyyyyMMdd形式です。
    166        private String  breakTimeStyle  = "top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" ;   // 5.6.4.3 (2013/05/24) 初期値変更
    167        private String  calDB   = null; // 3.6.0.0 (2004/09/17) DB検索するＤＢのキー
    168        private String  arg1    = null; // 3.6.0.0 (2004/09/17) DB検索の第１キー(事業所コードなど)
    169        private String  arg2    = null; // 3.6.0.0 (2004/09/17) DB検索の第２キー(ＷＣコードなど)
    170        private String  arg3    = null; // 3.6.0.0 (2004/09/17) DB検索の第３キー(事業所コードなど)
    171        private String  arg4    = null; // 3.6.0.0 (2004/09/17) DB検索の第４キー(ＷＣコードなど)
    172        private boolean skipHoliday     = HybsSystem.sysBool( "USE_GANTTHEADER_SKIP_HOLIDAY" );         // 4.0.0.0 (2007/09/07) 休日をスキップするかどうか
    173        private String  calStr  = null; // 5.5.4.0 (2012/07/02) 出勤日・休日のフラグ
    174
    175        private static final int         TIME_PIXEL             = 48;   // 3.8.1.1 (2005/11/21) 時間ヘッダー時の１時間のピクセル数
    176//      private static final boolean USE_MULTI_CLM      = HybsSystem.sysBool( "USE_GANTTHEADER_MULTIPLE_COLUMN" );      // 3.8.1.4 (2006/03/13)
    177        private boolean useMultiClm     = HybsSystem.sysBool( "USE_GANTTHEADER_MULTIPLE_COLUMN" );      // 5.6.1.2 (2013/02/22)
    178
    179        private static final boolean USE_MONTH_DATE     = HybsSystem.sysBool( "USE_GANTTHEADER_MONTH_DATE" );   // 3.8.5.2 (2006/06/09)
    180        private static final int         MONTH_DATE_LIMITER = 20;       // 当月 20 日以降は、翌月扱いとなる。
    181
    182        private static final String BLUE_COLOR  = "<span style=\"color:Blue;\">" ;                // 5.6.2.3 (2013/03/22) 廃止
    183        private static final String RED_COLOR   = "<span style=\"color:Red;\">" ;         // 5.6.2.3 (2013/03/22) 廃止
    184        private static final String TODAY_CLASS         = "gntToday" ;                                          // 5.6.2.3 (2013/03/22) 当日を示すクラス名
    185        private static final String HOLIDAY_CLASS       = "gntHoliday" ;                                        // 5.6.2.3 (2013/03/22) 休日を示すクラス名
    186        private static final String END_SPAN    = "</span>" ;
    187        private static final String BR                  = "<br/>" ;
    188
    189        //private static final String ODD_CLASS = "<span class=\"oddColor\">" ;                   // 5.6.2.3 (2013/03/22) 奇数月の色設定
    190        //private static final String EVEN_CLASS        = "<span class=\"evenColor\">" ;          // 5.6.2.3 (2013/03/22) 偶数月の色設定
    191        // 5.9.2.0 (2015/11/06) ヘッダー列幅の固定対応
    192        private static final String DIV_ZOOMWEEK_START  = "<div class=\"zoomWeekBlock\">";                                        // 週の設定
    193        private static final String DIV_ZOOMEVENCOLOR = "<div class=\"zoomHeaderDiv evenColor\">";                        // 奇数色の設定
    194        private static final String DIV_ZOOMODDCOLOR = "<div class=\"zoomHeaderDiv oddColor\">";                  // 偶数色の設定
    195        private static final String DIV_ZOOMHEADER2 = "<div class=\"zoomHeaderDiv zoomHeaderDiv2\">";             // 列幅の設定
    196        private static final String DIV_ZOOMWEEKDAY = "<div class=\"zoomWeekDay\">";                                              // 日の設定
    197        private static final String END_DIV             = "</div>";
    198
    199        private String  baseTimes               = null;                                                                         // 5.6.1.2 (2013/02/22) ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式です。
    200        private String  baseTimeStyle   = "top:20px;background-color:transparent;border-left:2px dashed red;" ;         // 5.6.1.2 (2013/02/22) ベース時刻を赤線表示します。
    201
    202        private static final boolean useMdheader        = HybsSystem.sysBool( "USE_MDHEADER_ONTIME" ); // 5.7.0.0 (2013/11/07)
    203
    204        /**
    205         * Taglibの終了タグが見つかったときに処理する doEndTag() を オーバーライドします。
    206         *
    207         * @og.rev 3.1.1.2 (2003/04/04) Tomcat4.1 対応。release2() を doEndTag()で呼ぶ。
    208         * @og.rev 3.6.0.0 (2004/09/17) zoom 3 の時の計算値を変更
    209         * @og.rev 3.7.1.0 (2005/04/15) zoom 10 の追加
    210         * @og.rev 3.8.1.6 (2006/04/25) zoom 21 の追加
    211         * @og.rev 3.8.5.2 (2006/06/09) makeZoom メソッドの USE_MONTH_DATE パラメータ追加
    212         * @og.rev 3.8.9.2 (2007/07/28) makeZoomTime メソッドの 時間間隔パラメータ追加
    213         * @og.rev 5.5.4.0 (2012/07/02) ヘッダー属性情報の出力追加
    214         * @og.rev 5.6.3.2 (2013/04/12) 曜日を出力する場合の段組みでは、全角スペースを使う(firefox対応)
    215         *
    216         * @return      後続処理の指示
    217         */
    218        @Override
    219        public int doEndTag() {
    220                debugPrint();           // 4.0.0 (2005/02/28)
    221                if( startDate == null || endDate == null ||
    222                         startDate.length() < 8 || endDate.length() < 8 ) {
    223                                String errMsg = "開始日と終了日は、どちらも yyyyMMdd 形式で、必須です。"
    224                                                + " startDate=[" + startDate + "] endDate=[" + endDate + "]" ;
    225                                throw new HybsSystemException( errMsg );
    226                }
    227
    228                // 月単位の処理に30,60,90などの固定日を使用しているのは、ガントバーの長さが
    229                // 日単位の固定長なので、長期間のガントを使用すると後ろの方でずれてくるため。
    230                String header = "";
    231                String md = (USE_MONTH_DATE) ? "MM   " : "MM/dd";
    232                switch( zoom ) {
    233                        case  0: header = makeZoom( "MM/   "     ,"dd(EE)"     ,  1 ,false ) ; break;
    234                        case  1: header = makeZoom( "MM/"        ,"dd "        ,  1 ,false ) ; break;
    235                        case  2: header = makeZoom2( 1 ) ; break;
    236                        case  3: header = makeZoom( "yyyy/  "    ,"MM/dd  "    ,  7 ,false ) ; break;
    237                        case  4: header = makeZoom( "yyyy/  "    ,"MM/dd  "    , 14 ,false ) ; break;
    238                        case  5: header = makeZoom( "yyyy/     " ,md + "     " , 30 ,USE_MONTH_DATE ) ; break;
    239                        case  6: header = makeZoom( "yyyy/ "     ,md + " "     , 30 ,USE_MONTH_DATE ) ; break;
    240                        case  7: header = makeZoom( "yyyy/     " ,md + "     " , 90 ,USE_MONTH_DATE ) ; break;
    241                        case  8: header = makeZoom( "yyyy/     " ,md + "     " ,180 ,USE_MONTH_DATE ) ; break;
    242                        case  9: header = makeZoom( "yyyy/ "     ,md + " "     ,180 ,USE_MONTH_DATE ) ; break;
    243                        case 10: header = makeZoom( "ww'W'"      ,"'<span title=\"'MM/dd'\">'dd '</span>'" ,7 ,false ) ; break;
    244        //              case 11: break; // 他物件予約済み
    245        //              case 12: break; // 他物件予約済み
    246                        case 13: header = makeZoom3( "yyyy/MM" , "dd"  ,"EE"  ,  1 ) ; break;           // 5.6.2.3 (2013/03/22) 月、曜日表示
    247                        case 20: header = makeZoomTime( TIME_PIXEL  ,  1,true  ) ; break;       // 3.8.1.1 (2005/11/21)
    248                        case 21: header = makeZoomTime( TIME_PIXEL/2,  1,false ) ; break;       // 3.8.1.6 (2006/04/25)
    249                        case 22: header = makeZoomTime( TIME_PIXEL  ,  2,true  ) ; break;       // 3.8.9.2 (2007/07/28)
    250                        case 23: header = makeZoomTime( TIME_PIXEL/2,  2,false ) ; break;       // 3.8.9.2 (2007/07/28)
    251                        case 24: header = makeZoomTime( TIME_PIXEL  ,  4,true  ) ; break;       // 3.8.9.2 (2007/07/28)
    252                        case 25: header = makeZoomTime( TIME_PIXEL/2,  4,false ) ; break;       // 3.8.9.2 (2007/07/28)
    253                        case 26: header = makeZoomTime( TIME_PIXEL  ,  6,true  ) ; break;       // 3.8.9.2 (2007/07/28)
    254                        case 27: header = makeZoomTime( TIME_PIXEL/2,  6,false ) ; break;       // 3.8.9.2 (2007/07/28)
    255                        case 28: header = makeZoomTime( TIME_PIXEL  ,  8,true  ) ; break;       // 3.8.9.2 (2007/07/28)
    256                        case 29: header = makeZoomTime( TIME_PIXEL/2,  8,false ) ; break;       // 3.8.9.2 (2007/07/28)
    257                        case 30: header = makeZoomTime( TIME_PIXEL  , 12,true  ) ; break;       // 3.8.9.2 (2007/07/28)
    258                        case 31: header = makeZoomTime( TIME_PIXEL/2, 12,false ) ; break;       // 3.8.9.2 (2007/07/28)
    259                        // 5.6.1.2 (2013/02/22) 積み上げガント
    260                        case 40: header = makeZoomStack( "MM/   "     ,"dd(EE)"     ,  1,false ) ; break;       // 5.6.1.2 (2013/02/22)
    261                        case 41: header = makeZoomStack( "ww'W'   "   ,"MM/dd "     ,  7,false ) ; break;       // 5.6.1.2 (2013/02/22)
    262                        case 42: header = makeZoomStack( "yyyy/     " ,"MM        " ,  1,true  ) ; break;       // 5.6.1.2 (2013/02/22)
    263        //              case 43: break;         // 日単位ヘッダー予約済み
    264        //                       〜
    265        //              case 49: break;         // 日単位ヘッダー予約済み
    266                        default: break;
    267                }
    268
    269                jspPrint( header );
    270                jspPrint(makeHeaderData()); // 5.5.4.0 (2012/07/02)
    271                return(EVAL_PAGE);
    272        }
    273
    274        /**
    275         * タグリブオブジェクトをリリースします。
    276         *
    277         * キャッシュされて再利用されるので、フィールドの初期設定を行います。
    278         *
    279         * @og.rev 3.6.0.0 (2004/09/17) 事業所コード cdjgs 属性を追加
    280         * @og.rev 3.8.0.2 (2005/07/11) startTime,timePeriod,breakTimes 属性を追加
    281         * @og.rev 3.8.0.5 (2005/08/26) daySpan,breakTimes,breakTimeStyle 属性を追加
    282         * @og.rev 5.5.4.0 (2012/07/02) calStr追加
    283         * @og.rev 5.6.1.2 (2013/02/22) baseTimes、baseTimeStyle追加,useMultiClm追加
    284         */
    285        @Override
    286        protected void release2() {
    287                super.release2();
    288                startDate       = null;
    289                endDate         = null;
    290                daySpan         = "0700-2000";  // 開始時刻(HHmm-HHmm) 3.8.0.5 (2005/08/26)
    291                zoom            = 2;
    292                calDB           = null; // 3.6.0.0 (2004/09/17) DB検索するＤＢのキー
    293                arg1            = null; // 3.6.0.0 (2004/09/17) DB検索の第１キー(事業所コードなど)
    294                arg2            = null; // 3.6.0.0 (2004/09/17) DB検索の第２キー(ＷＣコードなど)
    295                arg3            = null; // 3.6.0.0 (2004/09/17) DB検索の第３キー
    296                arg4            = null; // 3.6.0.0 (2004/09/17) DB検索の第４キー
    297                breakTimes      = null;         // 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-HHmmyyyyMMdd形式です。
    298                breakTimeStyle  = "top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60;" ;
    299                skipHoliday = HybsSystem.sysBool( "USE_GANTTHEADER_SKIP_HOLIDAY" ); // 4.0.0.0 (2007/09/10)
    300                calStr          = null; // 5.5.4.0 (2012/07/02)
    301                baseTimes               = null;                                                                         // 5.6.1.2 (2013/02/22) ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式です。
    302                baseTimeStyle   = "top:20px;background-color:transparent;border-left:2px dashed red;" ;         // 5.6.1.2 (2013/02/22) ベース時刻を赤線表示します。
    303                useMultiClm             = HybsSystem.sysBool( "USE_GANTTHEADER_MULTIPLE_COLUMN" );      // 5.6.1.2 (2013/02/22)
    304        }
    305
    306        /**
    307         * 上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。
    308         *
    309         * @og.rev 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用
    310         * @og.rev 3.7.1.0 (2005/04/15) zoom == 10 週単位の場合の特殊処理を追加
    311         * @og.rev 3.7.1.1 (2005/05/23) 本日は、青色で示します。
    312         * @og.rev 3.8.5.2 (2006/06/09) makeZoom メソッドの USE_MONTH_DATE パラメータ追加
    313         * @og.rev 5.5.4.0 (2012/07/02) カレンダーフラグ対応
    314         * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    315         * @og.rev 5.6.5.0 (2013/06/07) 上段ヘッダーが MM の場合、週単位で月を表示し、色バーを使用します。
    316         * @og.rev 5.7.2.0 (2014/01/10) 上段は、休日を出さないので、END_SPAN 不要
    317         * @og.rev 5.9.2.0 (2015/11/06) ヘッダー列幅の固定対応
    318         *
    319         * @param       upper   上段の表示フォーマット
    320         * @param       lower   下段の表示フォーマット
    321         * @param       add     表示日付けの加算
    322         * @param       useMonth        月日表示でなく、月表示のみにする。(20日以降を翌月表示する。)
    323         *
    324         * @return  ヘッダー文字列
    325         */
    326        private String makeZoom( final String upper ,final String lower ,final int add, final boolean useMonth ) {
    327                boolean colBar = upper.startsWith( "MM" );              // 5.6.5.0 (2013/06/07) 色バー使用 true
    328
    329                DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN );
    330                DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN );
    331
    332                Calendar str = HybsSystem.getCalendar( startDate );
    333                Calendar end = HybsSystem.getCalendar( endDate );
    334
    335                // zoom == 10 週単位の場合の特殊処理。
    336                // 年の第一週を完全な一週間分(７日間)として、設定します。
    337                if( zoom == 10 ) {
    338                        str.setMinimalDaysInFirstWeek( 7 );
    339                        format1.setCalendar( str );
    340                        format2.setCalendar( str );
    341                }
    342
    343                StringBuilder buf1   = new StringBuilder( HybsSystem.BUFFER_SMALL );
    344                StringBuilder buf2   = new StringBuilder( HybsSystem.BUFFER_SMALL );
    345                StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL ); // 5.5.4.0 (2012/07/02) 休日判定用
    346
    347                // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。
    348                //buf1.append( "<pre>" ); // 5.9.2.0 (2015/11/06) DEL
    349
    350                // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加
    351                CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
    352
    353                boolean modifyFlag = false;
    354                // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    355//              while( str.before( end ) ) {
    356                int cnt  = 0;                                                                   // 5.6.5.0 (2013/06/07) 色バー対応
    357
    358
    359                //if( colBar ) { buf1.append( EVEN_CLASS ); }           // 5.6.5.0 (2013/06/07) 色バー対応
    360                if( colBar ) {buf1.append( DIV_ZOOMWEEK_START ); } // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応 spanをdivに変更し、1週間をdivで囲む。
    361
    362                boolean isFirst = true;                                                 // 5.6.5.0 (2013/06/07) 色バー対応で、最初だけ、月を表示する。
    363
    364                while( str.compareTo( end ) <= 0 ) {
    365                        boolean monday = ( Calendar.MONDAY == str.get( Calendar.DAY_OF_WEEK ) );        // 5.6.5.0 (2013/06/07) 色バー対応
    366                        if( colBar && monday ) {
    367                                // 5.6.5.0 (2013/06/07) 色バー対応  5.9.2.0 (2015/11/06) DEL
    368                                //buf1.append( END_SPAN );
    369
    370                                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応 週をdivで囲むため、buf1にbuf2を追加。
    371                                buf1.append( buf2.toString() ).append( END_DIV );
    372                                buf2.setLength( 0 );
    373
    374                                cnt++;
    375                                isFirst = true;
    376
    377                                buf1.append( DIV_ZOOMWEEK_START ); // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    378                        }
    379
    380                        Date dt = str.getTime();
    381                        // 3.8.5.2 (2006/06/09) useMonth ﾌﾗｸﾞにより 月表示のみに変更します。
    382                        // MONTH_DATE_LIMITER で指定の日以降は、翌月扱いとなる。
    383                        if( useMonth && str.get( Calendar.DATE ) >= MONTH_DATE_LIMITER ) {
    384                                Calendar calPlus = (Calendar)str.clone();
    385                                calPlus.set( Calendar.DATE , 1 );               // １日にセットします。
    386                                calPlus.add( Calendar.MONTH , 1 );              // 月を１ヶ月プラスします。
    387                                dt = calPlus.getTime();
    388                        }
    389
    390                        // 3.7.1.1 (2005/05/31) 本日は、青色で示します。
    391                        if( calData.isContainedToday( str,add ) ) {
    392//                              buf1.append( BLUE_COLOR );
    393                                buf2.append( BLUE_COLOR );
    394                                bufcal.append( "0" ); // 5.5.4.0 (2012/07/02)
    395                                modifyFlag = true;
    396                        }
    397
    398                        // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用
    399                        // modifyFlag が立っていない場合 を条件に追加します。
    400                        if( !modifyFlag && add == 1 && calData.isHoliday( str ) ) {
    401//                              buf1.append( RED_COLOR );
    402                                buf2.append( RED_COLOR );
    403                                bufcal.append( "1" ); // 5.5.4.0 (2012/07/02) 休日
    404                                modifyFlag = true;
    405                        }
    406
    407                        // 5.6.5.0 (2013/06/07) 色バー対応。色バーで、かつ、先頭でなければ、スペースを出力
    408                        if( colBar && !isFirst ) {
    409                                buf1.append( SPACE.substring( 0,upper.length() ) );
    410                        }
    411                        else {
    412                                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    413                                if( colBar ){
    414                                        if( cnt % 2 == 0)       { buf1.append( DIV_ZOOMEVENCOLOR ); }   // 奇数の色設定
    415                                        else                            { buf1.append( DIV_ZOOMODDCOLOR ); }    // 偶数の色設定
    416                                }else{
    417                                        buf1.append( DIV_ZOOMHEADER2 ); // 色無しの設定
    418                                }
    419
    420                                buf1.append( format1.format( dt ) );
    421
    422
    423                                buf1.append( END_DIV ); // 5.9.2.0 (2015/11/06)
    424
    425                                isFirst = false;
    426                        }
    427
    428                        buf2.append( DIV_ZOOMHEADER2 ); // 5.9.2.0 (2015/11/06)
    429
    430                        buf2.append( format2.format( dt ) );
    431
    432                        buf2.append( END_DIV ); // 5.9.2.0 (2015/11/06)
    433
    434                        if( modifyFlag ) {
    435//                              buf1.append( END_SPAN );                // 5.7.2.0 (2014/01/10) 上段は、休日を出さないので、END_SPAN 不要
    436                                buf2.append( END_SPAN );
    437                                modifyFlag = false;
    438                        }
    439                        else{
    440                                bufcal.append( "0" ); // 5.5.4.0 (2012/07/02)
    441                        }
    442                        str.add(Calendar.DATE, add);
    443                }
    444                calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02)
    445
    446                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    447                if(colBar){
    448                        buf1.append( buf2 ).append( END_DIV );
    449                }else{
    450                        buf1.append( BR ).append( buf2 );
    451                }
    452                buf2.setLength( 0 );
    453
    454
    455                //if( colBar ) { buf1.append( END_SPAN ); }             // 5.6.5.0 (2013/06/07) 色バー対応 5.9.2.0 (2015/11/06) DEL
    456
    457                //return "<pre>" + buf1.toString() + BR + buf2.toString() + "</pre>"; // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一
    458                return buf1.toString(); // 5.9.2.0 (2015/11/06)
    459        }
    460
    461        /**
    462         * zoom = 2 の場合のヘッダーを出力します。
    463         * このヘッダーだけ特別なので、別メソッドを作成します。
    464         *
    465         * type=1 の場合
    466         * [ 0   ･･･]&lt;br/&gt;[ 2   ･･･]&lt;br/&gt;[ /   ･･･]&lt;br/&gt;[0000 ･･･]&lt;br/&gt;[1234 ･･･]
    467         *
    468         * という月情報を毎週月曜日にヘッダーに出力します。(上記は、２月１日〜２月４日まで)
    469         *
    470         * @og.rev 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用
    471         * @og.rev 3.6.0.7 (2004/11/06) 月の情報も出力します。
    472         * @og.rev 3.7.1.1 (2005/05/23) 本日は、青色で示します。
    473         * @og.rev 5.5.4.0 (2012/07/02) カレンダーフラグ対応
    474         * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    475         * @og.rev 5.6.5.0 (2013/06/07) 日付欄の段組みを廃止し、色バーに変更します。
    476         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    477         * @og.rev 5.9.24.0 (2017/09/01) 当日、休日の色の不具合対応
    478         *
    479         * @param       add     表示日付けの加算
    480         *
    481         * @return  ヘッダー文字列
    482         */
    483        private String makeZoom2( final int add ) {
    484                Calendar str = HybsSystem.getCalendar( startDate );
    485                Calendar end = HybsSystem.getCalendar( endDate );
    486
    487                StringBuilder buf1   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 月の１桁目
    488//              StringBuilder buf2   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 月の２桁目        5.6.5.0 (2013/06/07) 色バーに変更
    489//              StringBuilder buf3   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 区切り記号        5.6.5.0 (2013/06/07) 色バーに変更
    490                StringBuilder buf4   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 日の１桁目
    491                StringBuilder buf5   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 日の２桁目
    492                StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 5.5.4.0 (2012/07/02) 休日判定用
    493
    494                // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。
    495                //buf1.append( "<pre>" ); // 5.9.2.0 (2015/11/06) DEL
    496
    497                // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加
    498                CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
    499
    500                boolean modifyFlag = false;
    501
    502                // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    503//              while( str.before( end ) ) {
    504                int cnt  = 0;                                   // 5.6.5.0 (2013/06/07) 色バー対応
    505                int hCnt = 0;                                   // 月欄は、３文字分
    506
    507                // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    508                //buf1.append( EVEN_CLASS );            // 5.6.5.0 (2013/06/07) 色バー対応
    509                buf1.append(DIV_ZOOMWEEK_START);
    510                buf1.append(DIV_ZOOMEVENCOLOR);
    511
    512                while( str.compareTo( end ) <= 0 ) {
    513                        int mt = str.get( Calendar.MONTH ) + 1;
    514                        int dt = str.get( Calendar.DATE );
    515                        boolean monday = ( Calendar.MONDAY == str.get( Calendar.DAY_OF_WEEK ) );
    516
    517                        // 5.9.24.0 (2017/09/01) BLUE,REDの後ろに置いていた処理を移動（翌週の月曜にデータが出力されるので余分なデータが出ていた）
    518                        if( monday ) {
    519                                buf1.append(END_DIV).append( buf4.toString() ).append( BR ).append(buf5.toString()).append(END_DIV);
    520                                buf4.setLength( 0 );
    521                                buf5.setLength( 0 );
    522
    523                                cnt++;
    524                                hCnt = 0;
    525
    526                                buf1.append( DIV_ZOOMWEEK_START );
    527                                if( cnt % 2 == 0) {buf1.append( DIV_ZOOMEVENCOLOR );}
    528                                else                    {buf1.append( DIV_ZOOMODDCOLOR ); }
    529                        }
    530
    531                        // 3.7.1.1 (2005/05/31) 本日は、青色で示します。
    532                        if( calData.isContainedToday( str,add ) ) {
    533//                              buf1.append( BLUE_COLOR );
    534//                              buf2.append( BLUE_COLOR );
    535//                              buf3.append( BLUE_COLOR );
    536                                buf4.append( BLUE_COLOR );
    537                                buf5.append( BLUE_COLOR );
    538                                bufcal.append("0"); // 5.5.4.0 (2012/07/02)
    539                                modifyFlag = true;
    540                        }
    541
    542                        // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用
    543                        // modifyFlag が立っていない場合 を条件に追加します。
    544                        if( !modifyFlag && add == 1 && calData.isHoliday( str ) ) {
    545//                              buf1.append( RED_COLOR );
    546//                              buf2.append( RED_COLOR );
    547//                              buf3.append( RED_COLOR );
    548                                buf4.append( RED_COLOR );
    549                                buf5.append( RED_COLOR );
    550                                bufcal.append("1"); // 5.5.4.0 (2012/07/02)
    551                                modifyFlag = true;
    552                        }
    553
    554//                      if( monday ) {
    555//                              // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    556//                              buf1.append(END_DIV).append( buf4.toString() ).append( BR ).append(buf5.toString()).append(END_DIV);
    557//                              buf4.setLength( 0 );
    558//                              buf5.setLength( 0 );
    559//
    560//                              // 5.6.5.0 (2013/06/07) 色バー対応
    561//                              //buf1.append( END_SPAN ); // 5.9.2.0 (2015/11/06) DEL
    562//
    563//                              cnt++;
    564//                              hCnt = 0;
    565//
    566//                              // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    567//                              //if( cnt % 2 == 0 )    { buf1.append( EVEN_CLASS ); }          // 偶数の色
    568//                              //else                          { buf1.append( ODD_CLASS  ); }          // 奇数の色
    569//                              buf1.append( DIV_ZOOMWEEK_START );
    570//                              if( cnt % 2 == 0) {buf1.append( DIV_ZOOMEVENCOLOR );}
    571//                              else                    {buf1.append( DIV_ZOOMODDCOLOR ); }
    572//
    573////                            buf1.append( (mt/10) );
    574////                            buf2.append( mt%10 );
    575////                            buf3.append( "/" );
    576//                      }
    577////                    else {
    578////                            buf1.append( " " );
    579////                            buf2.append( " " );
    580////                            buf3.append( " " );
    581////                    }
    582
    583                        // 5.6.5.0 (2013/06/07) 色バー対応
    584                        switch( hCnt++ ) {
    585                                case 0 :        buf1.append( (mt/10) ); break;          // 月の1文字目
    586                                case 1 :        buf1.append(  mt%10  ); break;          // 月の2文字目
    587                                case 2 :        buf1.append(   "/"   ); break;          // 月の区切り文字
    588                                default :       buf1.append(   " "   ); break;          // 空欄
    589                        }
    590
    591                        // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    592                        //buf4.append( (dt/10) );
    593                        //buf5.append( dt%10 );
    594                        buf4.append( DIV_ZOOMHEADER2 ).append( (dt/10) ).append( END_DIV );
    595                        buf5.append( DIV_ZOOMHEADER2 ).append( dt%10 ).append( END_DIV );
    596
    597                        if( modifyFlag ) {
    598//                              buf1.append( END_SPAN );
    599//                              buf2.append( END_SPAN );
    600//                              buf3.append( END_SPAN );
    601                                buf4.append( END_SPAN );
    602                                buf5.append( END_SPAN );
    603                                modifyFlag = false;
    604                        }
    605                        else{
    606                                bufcal.append("0"); // 5.5.4.0 (2012/07/02)
    607                        }
    608                        str.add(Calendar.DATE, add);
    609                }
    610
    611                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    612                buf1.append(END_DIV).append( buf4.toString() ).append( BR ).append(buf5.toString()).append(END_DIV);
    613                buf4.setLength( 0 );
    614                buf5.setLength( 0 );
    615
    616//              buf1.append( BR ).append( buf2 );
    617//              buf1.append( BR ).append( buf3 );
    618                //buf1.append( END_SPAN );                              // 5.6.5.0 (2013/06/07) 色バー対応 5.9.2.0 (2015/11/06) DEL
    619
    620//              buf1.append( BR ).append( buf4 );
    621//              buf1.append( BR ).append( buf5 );
    622                calStr = bufcal.toString();                             // 5.5.4.0 (2012/07/02)
    623
    624//              //              return "<pre>" + buf1.toString() + "</pre>";
    625
    626                //return buf1.append( BR ).append( buf4 ).append( BR ).append( buf5 ).append( "</pre>" ).toString();              // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一
    627                return buf1.toString(); // 5.9.2.0 (2015/11/06)
    628        }
    629
    630        /**
    631         * ヘッダー、上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。
    632         * これは特殊で、ヘッダーに、年/月、上段は日、下段は、曜日を想定しています。
    633         * ヘッダー部分は、月として横持で表示させます。
    634         *
    635         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
    636         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    637         *
    638         * @param       header  年月のヘッダー部分
    639         * @param       upper   上段の表示フォーマット(日)
    640         * @param       lower   下段の表示フォーマット(曜日)
    641         * @param       add     表示日付けの加算
    642         *
    643         * @return  ヘッダー文字列
    644         */
    645        private String makeZoom3( final String header ,final String upper ,final String lower ,final int add ) {
    646                DateFormat formatH = new SimpleDateFormat( header,Locale.JAPAN );
    647                DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN );
    648                DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN );
    649
    650                StringBuilder bufH   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 年月のヘッダー部分(11Byte目から)
    651                StringBuilder buf1   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 日(２桁)
    652                StringBuilder buf2   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 曜日
    653                StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 5.5.4.0 (2012/07/02) 休日判定用
    654
    655                // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一。pre タグを最初に設定しておく。
    656                //bufH.append( "<pre>" ); // 5.9.2.0 (2015/11/06) DEL
    657
    658                Calendar str = HybsSystem.getCalendar( startDate );
    659                Calendar end = HybsSystem.getCalendar( endDate );
    660
    661                // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加
    662                CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
    663
    664                int     dtsu            = lower.length();                                               // 日付欄(下段)の文字数
    665                int     dayCount        = 0;                                                                    // ヘッダー部の文字が入るかどうかの基準
    666                int     mtCnt           = str.get( Calendar.MONTH ) + 1;                // 月をチェック(色設定用) 初期値は、開始時の月
    667                String tmpH             = null;                                                                 // ヘッダー部のテンポラリ情報
    668
    669                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    670                bufH.append(DIV_ZOOMWEEK_START);
    671
    672                // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    673//              while( str.before( end ) ) {
    674                while( str.compareTo( end ) <= 0 ) {
    675                        Date dt = str.getTime();
    676
    677                        if( tmpH == null ) { tmpH = formatH.format( dt ); }     // 初期値。最初にセット
    678
    679                        // ここから一連の処理は、月表示ヘッダーの作成
    680                        int day = str.get( Calendar.DATE );                     // ヘッダー部の制御用に、日付が必要
    681                        if( day == 1 && dayCount > 0 ) {
    682
    683                                makeHeaderYM( bufH , dayCount*dtsu , mtCnt++ , tmpH );          // このヘッダー出力は、ひと月前の情報
    684
    685                                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    686                                bufH.append( buf1 ).append(BR).append(buf2).append( "</div>" );
    687                                buf1.setLength( 0 );
    688                                buf2.setLength( 0 );
    689                                bufH.append( DIV_ZOOMWEEK_START );
    690
    691                                dayCount = 0 ;
    692                                tmpH     = formatH.format( dt );
    693                        }
    694                        dayCount ++ ;   //
    695
    696                        // 5.6.2.3 (2013/03/22) 休日、本日の処理を class属性化で、合成可能とします。
    697                        String span = null;
    698                        // 3.6.0.0 (2004/09/17) 休日判断を、事業所カレンダを使用
    699                        if( calData.isHoliday( str ) ) {
    700                                span = HOLIDAY_CLASS ;
    701                                bufcal.append( "1" ); // 5.5.4.0 (2012/07/02) 休日
    702                        }
    703                        else {
    704                                bufcal.append( "0" ); // 5.5.4.0 (2012/07/02)
    705                        }
    706
    707                        if( calData.isContainedToday( str,add ) ) {                             // 本日かどうか
    708                                span = (span == null) ? TODAY_CLASS : span + " " + TODAY_CLASS ;
    709                        }
    710
    711                        if( span != null ) {
    712                                buf1.append( "<span class=\"" ).append( span ).append( "\">" );
    713                                buf2.append( "<span class=\"" ).append( span ).append( "\">" );
    714                        }
    715
    716                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    717                        buf1.append( DIV_ZOOMHEADER2 );
    718                        buf2.append( DIV_ZOOMHEADER2 );
    719
    720                        buf1.append( format1.format( dt ) );
    721                        buf2.append( format2.format( dt ) );
    722
    723                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    724                        buf1.append( END_DIV );
    725                        buf2.append( END_DIV );
    726
    727                        if( span != null ) {
    728                                buf1.append( END_SPAN );
    729                                buf2.append( END_SPAN );
    730                        }
    731                        str.add(Calendar.DATE, add);
    732                }
    733
    734                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    735                // 処理の最後に、ヘッダーの出力は必要
    736                makeHeaderYM( bufH , dayCount*dtsu , mtCnt , tmpH );
    737
    738                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    739                bufH.append( buf1 ).append( BR ).append( buf2 ).append( END_DIV );
    740                buf1.setLength( 0 );
    741                buf2.setLength( 0 );
    742
    743                calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02)
    744
    745//              return "<pre>" + bufH.toString() + BR + buf1.toString() + BR + buf2.toString() + "</pre>";
    746
    747
    748                //return bufH.append( BR ).append( buf1 ).append( BR ).append( buf2 ).append( "</pre>" ).toString();              // 5.6.5.0 (2013/06/07) 文字列の作成方法の統一
    749                return bufH.toString(); // 5.9.2.0 (2015/11/06)
    750        }
    751
    752        /**
    753         * 時間軸での月ヘッダーデータを作成します。
    754         *
    755         * 月ヘッダーは、1日〜月末までの日付の上段に、年月(yyyy/MM)表示のヘッダーを作成します。
    756         * ヘッダーは、できるだけセンター表示になるように、前後にスペースを入れて調整します。
    757         * ヘッダー表示領域が少ない場合、スペースのみになります。
    758         * ヘッダーは月が偶数月か奇数月かで、背景色を切り替えることで、判りやすくします。
    759         *
    760         * @og.rev 5.6.2.3 (2013/03/22) 新規追加
    761         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    762         *
    763         * @param               bufH    ヘッダーを追記していく StringBuilder
    764         * @param               dayCnt  日付欄の文字数カウント。日数＊桁数(DTSU)。通常、横持なら 2桁 となる。
    765         * @param               mtCnt   月数に基づいた色の設定用の数字。月の連番にします。
    766         * @param               ymStr   ヘッダーに表示する文字列。年月(yyyy/MM)
    767         *
    768         * @return  ヘッダーが追記された StringBuilder
    769         */
    770        private StringBuilder makeHeaderYM( final StringBuilder bufH , final int dayCnt , final int mtCnt , final String ymStr ) {
    771                // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    772                // 奇数月と偶数月で色を変える。将来的に % 3 で判定すれば、３色で廻せる。
    773                //if( mtCnt % 2 == 0 )  { bufH.append( EVEN_CLASS ); }          // 偶数月の色
    774                //else                                  { bufH.append( ODD_CLASS  ); }          // 奇数月の色
    775                if( mtCnt % 2 == 0 )    { bufH.append( DIV_ZOOMEVENCOLOR ); }
    776                else                                    { bufH.append( DIV_ZOOMODDCOLOR ); }
    777
    778                // 表示すべき文字列が、日付欄の幅よりも小さい場合、スペースのみとする。
    779                if( dayCnt < ymStr.length() ) {
    780                        bufH.append( SPACE.substring( 0,dayCnt ) );
    781                }
    782                // 大きい場合は、前後にスペースを入れて、センター配置
    783                else {
    784                        int lcnt = (dayCnt-ymStr.length())/2 ;          // 左の個数。端数が切り捨てられる。
    785                        int rcnt = dayCnt-lcnt-ymStr.length();          // 右の個数。端数を考慮し、引き算のみで求める。
    786
    787                        bufH.append( SPACE.substring( 0,lcnt ) );
    788                        bufH.append( ymStr );
    789                        bufH.append( SPACE.substring( 0,rcnt ) );
    790                }
    791
    792                //bufH.append( END_SPAN );
    793                bufH.append( END_DIV ); // 5.9.2.0 (2015/11/06)
    794
    795                return bufH;
    796        }
    797
    798        /**
    799         * 時間軸でのヘッダー表示を行います。
    800         *
    801         * 時間軸の為、ヘッダーの上下段組は行いません。
    802         * ヘッダーは、１時間単位に表示します。また、休憩時刻も求めています。
    803         *
    804         * @og.rev 3.8.0.5 (2005/08/26) 新規追加
    805         * @og.rev 3.8.1.1 (2005/11/21) 日付title,範囲class,
    806         * @og.rev 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、２段組(USE_MULTI_CLM)
    807         * @og.rev 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、２文字分(24ピクセル)化する。
    808         * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加
    809         * @og.rev 4.0.0.0 (2007/09/03) 休日の場合でも表示されるように対応(システムリソースで切り替え)
    810         * @og.rev 5.5.4.0 (2012/07/02) ガントの一日表示枠の計算を切り上げするようにする。カレンダーフラグ対応。
    811         * @og.rev 5.6.1.2 (2013/02/22) ベース時刻を管理。 ym2int 廃止 ⇒ hm2int に変更。 USE_MULTI_CLM ⇒ useMultiClm 変更。
    812         * @og.rev 5.6.4.3 (2013/05/24) ヘッダーずれ対応。"日" を２文字の、"日 " に修正。
    813         * @og.rev 5.6.5.0 (2013/06/07) 色バーに変更します。
    814         * @og.rev 5.6.7.0 (2013/11/03) 時間軸の上段ヘッダーに月日を表示
    815         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    816         *
    817         * @param               hourOfPixcel １時間あたりのピクセル数。
    818         * @param               step  時間間隔の指定(1:１時間間隔、2:２時間間隔････)
    819         * @param               useTani  日や時間の単位表示を行う(true)か、行わない(false)か
    820         *
    821         * @return  ヘッダー文字列
    822         */
    823//      private String makeZoomTime( final int hourOfPixcel,final boolean useTani ) {
    824        private String makeZoomTime( final int hourOfPixcel,final int step,final boolean useTani ) {
    825//              DateFormat format1 = new SimpleDateFormat( "yyyy/MM/dd",Locale.JAPAN );
    826                DateFormat format1 = new SimpleDateFormat( "yyyy/MM/dd(EE)",Locale.JAPAN );             // 5.6.5.0 (2013/06/07) 曜日を、tipsに出す。
    827                DateFormat format2 = new SimpleDateFormat( "MM/dd",Locale.JAPAN );                              // 5.7.0.0 (2013/11/03) 上段
    828
    829                StringBuilder bufBT  = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更)
    830                StringBuilder buf1   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 下段の時刻データ
    831//              StringBuilder buf2   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 休憩の管理
    832                StringBuilder bufH   = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 3.8.1.4 (2006/03/13) 段組みヘッダー
    833                StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL );            // 5.5.4.0 (2012/07/02) 休日判定用
    834                StringBuilder bufDY      = new StringBuilder( HybsSystem.BUFFER_SMALL );                // 5.7.0.0 (2013/11/03) 上段用
    835
    836                String  last_title = null; // 5.7.0.0 (2013/11/03)
    837                int             day_length = 0; // 5.7.0.0 (2013/11/03)
    838                int     base = 2;               // 5.7.0.0 (2013/11/03) 時間単位の標準桁数
    839                if( useTani ){ base = 4;}
    840
    841                // daySpan      = "0700-2000";  // 開始時刻(HHmm-HHmm) 3.8.0.5 (2005/08/26)
    842                // 分の少数計算を行います。加算は１時間(0100)単位です。
    843//              int startTime = ym2int( daySpan.substring( 0,2 ),daySpan.substring( 2,4 ) ) ;
    844//              int endTime   = ym2int( daySpan.substring( 5,7 ),daySpan.substring( 7 ) ) ;
    845                // 5.6.1.2 (2013/02/22)
    846                int ad = daySpan.indexOf( '-' );
    847                int startTime = hm2int( daySpan.substring( 0,ad ) ) ;
    848                int endTime   = hm2int( daySpan.substring( ad+1 ) ) ;
    849
    850                // 開始時刻より終了時刻が同じか小さい場合は、翌日なので2400加算します。
    851                if( endTime <= startTime ) { endTime += 2400; }
    852
    853                // 休憩時間を管理する BreakTimes オブジェクトを作成します。
    854//              BreakTimes breakTimeObj = new BreakTimes( hourOfPixcel,breakTimes,breakTimeStyle,startTime,endTime );
    855                BreakTimes breakTimeObj = new BreakTimes( hourOfPixcel/step,breakTimes,breakTimeStyle,startTime,endTime );
    856
    857                // 5.6.1.2 (2013/02/22) ベース時刻を管理する BreakTimes オブジェクトを作成します。(利用するクラスは同じ)
    858                BreakTimes baseTimeObj = new BreakTimes( hourOfPixcel/step,baseTimes,baseTimeStyle,startTime,endTime );
    859
    860                // 現在時刻を求めておきます。 現在時刻に５分加算しておきます。(余計なお世話?)
    861                Calendar rightNow = Calendar.getInstance();
    862                rightNow.add( Calendar.MINUTE,5 );              // ５分 加算
    863                int now = rightNow.get( Calendar.HOUR_OF_DAY ) ;
    864
    865                // 3.8.5.0 (2006/02/06)
    866                boolean isDebug = isDebug();
    867                if( isDebug ) {
    868                        System.out.println( "startDate=" + startDate );
    869                        System.out.println( "endDate  =" + endDate );
    870                }
    871
    872                Calendar str = HybsSystem.getCalendar( startDate );
    873                Calendar end = HybsSystem.getCalendar( endDate );
    874
    875                // 3.6.0.0 (2004/09/17) カレンダDB検索機能を追加
    876                CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
    877
    878                // １時間=hourOfPixcel(px) なので、１日分のピクセルを求めておく。(休憩時刻表示用)
    879//              int dayOfPixel = (int)(hourOfPixcel * (endTime-startTime)/100.0 );
    880//              int dayOfPixel = (int)(hourOfPixcel/step * (endTime-startTime)/100.0 );
    881                int dayOfPixel = (int)(hourOfPixcel * Math.ceil((endTime-startTime)/100.0/step) ); // 5.5.4.0 (2012/07/02) 切り上げ
    882
    883                // 休憩表示における画面上の表示日数。これが、左のバイアス値として１日分と乗算される。
    884                int totalDay = 0;
    885
    886                // １日分の表示範囲の開始時刻とデータの表示開始時刻との差(オフセット)ピクセル
    887//              int offsetPixel = (int)(hourOfPixcel * (startTime - (int)(str.get( Calendar.HOUR_OF_DAY )*100 + str.get( Calendar.MINUTE )*10.0/6.0))/100.0 );
    888                int offsetPixel = (int)(hourOfPixcel/step * (startTime - (int)(str.get( Calendar.HOUR_OF_DAY )*100 + str.get( Calendar.MINUTE )*10.0/6.0))/100.0 );
    889
    890                // 3.8.1.4 (2006/03/13) 時間単位(h)の表示有無を USE_MULTI_CLM と関係させます。
    891                // 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、２文字分(24ピクセル)化する。
    892                final String tani ;
    893//              if( useTani ) { tani = ( USE_MULTI_CLM ) ? "  " : "h " ; }
    894//              if( useTani ) { tani = ( useMultiClm ) ? "  " : "h " ;  }               // 5.6.1.2 (2013/02/22) useMultiClm 追加
    895                if( useTani ) { tani = "h " ;   }               // 5.6.5.0 (2013/06/07) useMultiClm を無視します。
    896                else {                  tani = "";                                                              }
    897
    898                boolean modifyFlag = false;
    899                int cnt = 0;    // 3.8.1.1 (2005/11/21)
    900
    901                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    902                StringBuilder bufSave = new StringBuilder();
    903
    904                while( str.before( end ) ) {    // 終了時間は、「含まない」仕様
    905                        if( isDebug ) { System.out.println( "Calendar str =" + str.getTime() ); }       // 3.8.5.0 (2006/02/06)
    906
    907                        // 5.6.5.0 (2013/06/07) 日付と曜日の対応
    908                        int day = str.get( Calendar.DATE );
    909                        String dayStr = ((day >= 10) ? day : ("0" + day) ) + ((useTani) ? DAY_OF_WEEK_ja[str.get( Calendar.DAY_OF_WEEK )] : "") ;
    910
    911                        // 5.5.4.0 (2012/07/02) この場合は枠単位ではなく、日単位で出力する
    912                        // skipHolidayは無視して、範囲内の全てのカレンダーを出力
    913                        if(calData.isHoliday( str )){
    914                                bufcal.append("1");
    915                        }
    916                        else{
    917                                bufcal.append("0");
    918                        }
    919
    920                        // 休日判断を、事業所カレンダを使用:休日なら、日付を進める。
    921                        if( calData.isHoliday( str ) && skipHoliday ) {
    922                                if( isDebug ) { System.out.println( "Holiday =" + str.getTime() ); }    // 3.8.5.0 (2006/02/06)
    923                                str.add(Calendar.DATE, 1);
    924                                continue;
    925                        }
    926
    927
    928                        // 3.8.1.1 (2005/11/21) 日付のツールチップ表示
    929                        //String ganttClass = "class=\"GNT_" + (cnt % 2) + "\"" ;
    930                        String ganttClass = "class=\"GNT_" + (cnt % 2) + " zoomHeaderDiv2\""; // 5.9.2.0 (2015/11/06)
    931
    932                        Date dt = str.getTime();
    933                        String title = format1.format( dt );
    934
    935                        // 5.9.2.0 (2015/11/06) MODIFY
    936                        //buf1.append( "<span " ).append( ganttClass );
    937                        buf1.append( "<div " ).append( ganttClass );
    938                        buf1.append( " title=\"" ).append( title ).append( "\">" );
    939
    940                        // 5.7.0.0 (2013/11/03) 上段
    941                        if( last_title != null & day_length > 0 ){
    942                                makeHeaderMD(bufDY , day_length*base , 0 , last_title);
    943                                day_length = 0;
    944                        }
    945                        last_title = format2.format( dt );
    946
    947                        if( isDebug ) { System.out.println( "title =" + title ); }      // 3.8.5.0 (2006/02/06)
    948
    949                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    950                        if( cnt > 0 ){
    951                                bufSave.append( DIV_ZOOMWEEK_START );
    952                                if( useMdheader ){ // 5.7.0.0 （2013/11/03）月日を冗談に表示する
    953                                        bufSave.append( bufDY );
    954                                }
    955                                bufSave.append( bufH );
    956                                bufDY.setLength( 0 );
    957                                bufH.setLength( 0 );
    958                        }
    959
    960                        // 5.6.5.0 (2013/06/07) 色バー対応
    961                        if( useMultiClm ) {
    962                                // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    963                                //if( cnt % 2 == 0 )    { bufH.append( EVEN_CLASS ); }          // 偶数の色
    964                                //else                          { bufH.append( ODD_CLASS  ); }          // 奇数の色
    965                                if( cnt % 2 == 0 )      { bufH.append( DIV_ZOOMEVENCOLOR ); }                   // 偶数の色
    966                                else                            { bufH.append( DIV_ZOOMODDCOLOR ); }            // 奇数の色
    967                        }
    968                        cnt++;          // 5.6.5.0 (2013/06/07) 他の処理は、cnt++ を先にしているが、ここでは初期設定指定ない為、cnt++ を、処理の後で行う。
    969
    970                        // 本日かどうかを判断する。
    971                        boolean isToday = calData.isContainedToday( str,1 );
    972
    973                        int tmHd = startTime/100 ;
    974                        int dayOut = tmHd;              // 3.8.1.4 (2006/03/13)
    975                        boolean isTodayNow = false;             // 3.8.9.2 (2007/07/28) 時間ステップ対応
    976
    977                        for( int h=startTime; h<endTime; h+=100 ) {          // 加算は１時間単位
    978                                if( isDebug ) { // 3.8.5.0 (2006/02/06)
    979                                        System.out.println( "hour =" + h );
    980                                        System.out.println( "tmHd =" + tmHd );
    981                                }
    982                                // 3.8.9.2 (2007/07/28) 時間ステップ対応
    983                                isTodayNow = isTodayNow || ( isToday && tmHd == now );
    984                                if( ( dayOut - tmHd ) % step != 0 ) { tmHd++; continue; }
    985
    986                                day_length++; // 5.7.0.0 (2013/11/03)
    987
    988                                if( tmHd >= 24 ) {
    989                                        tmHd = 0;
    990
    991                                        // 3.8.1.1 (2005/11/21) 日付のツールチップを次の日に設定します。
    992                                        Date dt2 = new Date( str.getTimeInMillis() + 24*3600*1000L );
    993                                        title = format1.format( dt2 );
    994
    995                                        // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    996                                        buf1.append(END_DIV).append( "<div " ).append( ganttClass );
    997                                        buf1.append( " title=\"" ).append( title ).append( "\">" );
    998                                }
    999
    1000                                // 本日の現在時刻は、青色で示します。
    1001//                              if( isToday && tmHd == now ) {
    1002                                if( isTodayNow ) {
    1003                                        buf1.append( BLUE_COLOR );
    1004                                        bufH.append( BLUE_COLOR );
    1005                                        modifyFlag = true;
    1006                                        isTodayNow = false;             // 初期化
    1007                                }
    1008                                // 4.0.0.0 休日の場合は赤色で表示
    1009                                else if( calData.isHoliday( str ) && !skipHoliday ) {
    1010                                        buf1.append( RED_COLOR );
    1011                                        bufH.append( RED_COLOR );
    1012                                        modifyFlag = true;
    1013                                }
    1014
    1015                                // 実質表示日数(totalDay) * １日分のピクセル(dayOfPixel) - オフセット(offsetPixel)
    1016//                              String bt = breakTimeObj.makeSpan( totalDay*dayOfPixel-offsetPixel,str,h );
    1017                                String bt = breakTimeObj.makeSpan( totalDay*dayOfPixel-offsetPixel,str,h,step );
    1018//                              if( bt != null ) { buf2.append( bt ); }
    1019                                if( bt != null ) { bufBT.append( bt ); }                // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更)
    1020
    1021                                // 5.6.1.2 (2013/02/22) ベース時刻のタグを出力します。
    1022                                bt = baseTimeObj.makeSpan( totalDay*dayOfPixel-offsetPixel,str,h,step );
    1023//                              if( bt != null ) { buf2.append( bt ); }
    1024                                if( bt != null ) { bufBT.append( bt ); }                // 5.6.5.0 (2013/06/07) 休憩の管理(buf2 ⇒ bufBT 名称変更)
    1025
    1026
    1027                                buf1.append( DIV_ZOOMWEEKDAY ); // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1028
    1029                                // 時間当たりの文字数は、４文字： 文字列を詰める。
    1030                                if( tmHd < 10 ) { buf1.append( '0' ); }              // 桁数あわせ
    1031                                buf1.append( tmHd ).append( tani );                     // 3.8.1.4 (2006/03/13)
    1032
    1033                                buf1.append(END_DIV); // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1034
    1035                                // 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、２段組(USE_MULTI_CLM)
    1036                                // 3.8.1.6 (2006/04/25) 日や時間の単位表示を止め、２文字分(24ピクセル)化する。
    1037//                              if( USE_MULTI_CLM ) {
    1038                                if( useMultiClm ) {                                             // 5.6.1.2 (2013/02/22) useMultiClm 追加
    1039//                                      if( ( dayOut - tmHd ) % 6 == 0 ) {
    1040                                        if( ( dayOut - tmHd ) == 0 ) {          // 5.6.5.0 (2013/06/07) 色バー対応
    1041//                                              if( useTani ) { bufH.append( title.substring( 8 ) ).append( "日" ); }
    1042//                                              if( useTani ) { bufH.append( title.substring( 8 ) ).append( "日 " ); }   // 5.6.4.3 (2013/05/24) ヘッダーずれ対応。"日" を２文字の、"日 " に修正。
    1043//                                              else {                  bufH.append( title.substring( 8 ) );                            }
    1044                                                bufH.append( dayStr );                  // 5.6.5.0 (2013/06/07) 先に日付＋曜日の文字列を作成する。"日" を２文字の、"日 " に修正済み。
    1045                                        }
    1046                                        else {
    1047                                                if( useTani ) { bufH.append( "    " ); }
    1048                                                else {                  bufH.append( "  " );   }
    1049                                        }
    1050                                }
    1051
    1052                                if( modifyFlag ) {
    1053                                        buf1.append( END_SPAN );
    1054                                        bufH.append( END_SPAN );
    1055
    1056                                        modifyFlag = false;
    1057                                }
    1058
    1059                                tmHd++; // ヘッダーに記述する時刻
    1060                        }
    1061
    1062                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1063                        if( useMultiClm ){
    1064                                bufH.append(END_DIV);
    1065                        }
    1066                        bufH.append( buf1.toString() ).append(END_DIV);
    1067                        buf1.setLength( 0 );
    1068
    1069                        str.add(Calendar.DATE, 1);
    1070                        totalDay++ ;
    1071
    1072
    1073                        // if( useMultiClm ) { bufH.append( END_SPAN ); }       // 5.6.5.0 (2013/06/07) 色バー対応
    1074                        if( useMultiClm ) { bufH.append(  END_DIV ); } // 5.9.2.0 (2015/11/06)
    1075                }
    1076
    1077                // 3.8.1.4 (2006/03/13) 日付表示、時刻単位(h)削除、２段組(USE_MULTI_CLM)
    1078//              buf2.append( "<pre>" );
    1079//              buf1.append( "</pre>" );
    1080
    1081//              if( USE_MULTI_CLM ) {
    1082//              if( useMultiClm ) {                             // 5.6.1.2 (2013/02/22) useMultiClm 追加
    1083//                      buf2.append( bufH.toString() ).append( "<br />" );
    1084//              }
    1085
    1086                // 5.9.2.0 (2015/11/06) DELETE ヘッダー列幅の固定対応
    1087                //if( useMultiClm ) {                           // 5.6.1.2 (2013/02/22) useMultiClm 追加
    1088                //      bufH.append( BR );
    1089                //}
    1090                calStr = bufcal.toString(); // 5.5.4.0 (2012/07/02)
    1091
    1092                // 5.7.0.0 (2013/11/03) 最後の上段
    1093                if( last_title != null & day_length > 0 ){
    1094                        makeHeaderMD(bufDY , day_length*base , 0 , last_title);
    1095                        day_length = 0;
    1096                }
    1097
    1098                // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1099                bufSave.append( DIV_ZOOMWEEK_START );
    1100                if( useMdheader ){                              // 5.7.0.0 (2013/11/03) 月日を上段に表示する
    1101                        bufSave.append( bufDY );
    1102                }
    1103                bufSave.append( bufH );
    1104                bufDY.setLength( 0 );
    1105                bufH.setLength( 0 );
    1106
    1107//              return buf2.append( buf1.toString() ).toString() ;
    1108
    1109                // 5.9.2.0 (2015/11/06) DEL ヘッダー列幅の固定対応
    1110                //if( useMdheader ){ // 5.7.0.0 (2013/11/03) 月日を上段に表示する
    1111                //      bufH = bufDY.append( BR ).append(bufH);
    1112                //}
    1113
    1114
    1115                //return bufBT.append( "<pre>" ).append( bufH ).append( buf1 ).append( "</pre>" ).toString() ;
    1116                //return bufBT.append( bufH ).append( buf1 ).toString();
    1117                return bufBT.append( bufSave ).toString(); // 5.9.2.0 (2015/11/06)
    1118        }
    1119
    1120        /**
    1121         * 時間軸での日ヘッダーデータを作成します。
    1122         *
    1123         * ヘッダーは、時間表示の場合に上段にMM/ddを表示します。
    1124         *
    1125         * @og.rev 5.7.0.0 (2013/11/07) 新規追加
    1126         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    1127         *
    1128         * @param               bufH    ヘッダーを追記していく StringBuilder
    1129         * @param               fillCnt 日付欄の文字数カウント。通常は2*時間数か、4*時間数のどちらか。
    1130         * @param               mtCnt   月数に基づいた色の設定用の数字。(将来的な拡張用）
    1131         * @param               mdStr   ヘッダーに表示する文字列。月日(MM/dd)
    1132         *
    1133         * @return  ヘッダーが追記された StringBuilder
    1134         */
    1135        private StringBuilder makeHeaderMD( final StringBuilder bufH , final int fillCnt , final int mtCnt ,  final String mdStr ) {
    1136                // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    1137                //if( mtCnt % 2 == 0 )  { bufH.append( EVEN_CLASS ); }          // 偶数色
    1138                //else                                  { bufH.append( ODD_CLASS  ); }          // 奇数色
    1139                if( mtCnt % 2 == 0 )    { bufH.append( DIV_ZOOMEVENCOLOR ); }                   // 偶数の色
    1140                else                            { bufH.append( DIV_ZOOMODDCOLOR ); }            // 奇数の色
    1141
    1142                // 表示すべき文字列が、表示すべき幅よりも小さい場合、スペースのみとする。
    1143                if( fillCnt < mdStr.length() ) {
    1144                        bufH.append( StringUtil.stringXFill(" ",fillCnt) );
    1145                }
    1146                // 大きい場合は、前後にスペースを入れて、センター配置
    1147                else {
    1148                        bufH.append( StringUtil.stringXFill(mdStr,fillCnt) );
    1149                }
    1150
    1151
    1152                //bufH.append( END_SPAN );
    1153                bufH.append( END_DIV ); // 5.9.2.0 (2015/11/06)
    1154
    1155                return bufH;
    1156        }
    1157
    1158        /**
    1159         * 上段・下段のフォーマットと、加算日に応じたヘッダー文字列を作成します。
    1160         *
    1161         * @param       upper   上段の表示フォーマット
    1162         * @param       lower   下段の表示フォーマット
    1163         * @param       add     表示日付けの加算
    1164         * @param       useMonth        月日表示でなく、月表示のみにする
    1165         *
    1166         * @og.rev 5.6.1.2 (2013/02/22) 新規作成
    1167         * @og.rev 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    1168         * @og.rev 5.9.2.0 (2015/11/06) ヘッダ対応
    1169         *
    1170         * @return  ヘッダー文字列
    1171         */
    1172        private String makeZoomStack( final String upper ,final String lower ,final int add, final boolean useMonth ) {
    1173                DateFormat format1 = new SimpleDateFormat( upper,Locale.JAPAN );
    1174                DateFormat format2 = new SimpleDateFormat( lower,Locale.JAPAN );
    1175
    1176                DateFormat formatCal = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
    1177
    1178                // 5.5.8.3 (2012/11/17) スタック用にカレンダー枠の情報を保持(開始、休日判定、次枠開始)
    1179                ArrayList<String[]> calList = new ArrayList<String[]>();                    // 個人的には Listを渡す方が好き
    1180                String[] calArray = new String[3]; // 開始、休日判定、次枠開始
    1181
    1182                Calendar str = HybsSystem.getCalendar( startDate );
    1183                Calendar end = HybsSystem.getCalendar( endDate );
    1184
    1185                // 週単位の場合の特殊処理。
    1186                // 年の第一週を完全な一週間分(７日間)として、設定します。
    1187                if( zoom == 41 ) {              // ViewStackTableParam.STACK_ZOOM_WEEK
    1188                        str.setMinimalDaysInFirstWeek( 7 );
    1189                        format1.setCalendar( str );
    1190                        format2.setCalendar( str );
    1191                }
    1192
    1193                if( useMonth ){
    1194                        str.set(Calendar.DAY_OF_MONTH, 1);
    1195                        startDate = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN ).format(str.getTime());
    1196                }
    1197
    1198                StringBuilder buf1   = new StringBuilder( HybsSystem.BUFFER_SMALL );
    1199                StringBuilder buf2   = new StringBuilder( HybsSystem.BUFFER_SMALL );
    1200                StringBuilder bufcal = new StringBuilder( HybsSystem.BUFFER_SMALL );
    1201
    1202                //  カレンダDB検索機能
    1203                CalendarData calData = CalendarFactory.getCalendarData( calDB,arg1,arg2,arg3,arg4 );
    1204
    1205                boolean modifyFlag = false;
    1206                // 5.6.2.3 (2013/03/22) 日付の終了日は、「含む」に変更
    1207//              while( str.before( end ) ) {
    1208                while( str.compareTo( end ) <= 0 ) {
    1209                        Date dt = str.getTime();
    1210                        calArray[0] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17)
    1211
    1212                        // 本日は、青色で示します。
    1213                        if( calData.isContainedToday( str,add ) ) {
    1214                                buf1.append( BLUE_COLOR );
    1215                                buf2.append( BLUE_COLOR );
    1216                                bufcal.append( "0" );
    1217                                calArray[1] = "0"; // 5.5.8.3 (2012/11/17)
    1218                                modifyFlag = true;
    1219                        }
    1220
    1221                        // 休日判断を、事業所カレンダを使用
    1222                        // modifyFlag が立っていない場合 を条件に追加します。
    1223                        if( !modifyFlag && add == 1 && calData.isHoliday( str ) && !useMonth) {
    1224                                buf1.append( RED_COLOR );
    1225                                buf2.append( RED_COLOR );
    1226                                bufcal.append( "1" ); // 休日
    1227                                calArray[1] = "1"; // 5.5.8.3 (2012/11/17)
    1228                                modifyFlag = true;
    1229                        }
    1230
    1231                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1232                        buf1.append( DIV_ZOOMHEADER2 );
    1233                        buf2.append( DIV_ZOOMHEADER2 );
    1234
    1235                        buf1.append( format1.format( dt ) );
    1236                        buf2.append( format2.format( dt ) );
    1237
    1238                        // 5.9.2.0 (2015/11/06) ADD ヘッダー列幅の固定対応
    1239                        buf1.append( END_DIV );
    1240                        buf2.append( END_DIV );
    1241
    1242                        if( modifyFlag ) {
    1243                                buf1.append( END_SPAN );
    1244                                buf2.append( END_SPAN );
    1245                                modifyFlag = false;
    1246                        }
    1247                        else{
    1248                                bufcal.append( "0" );
    1249                                calArray[1] = "0"; // 5.5.8.3 (2012/11/17)
    1250                        }
    1251
    1252                        // カレンダーを進める
    1253                        if( useMonth ){
    1254                                str.add(Calendar.MONTH, add);
    1255                        }
    1256                        else{
    1257                                str.add(Calendar.DATE, add);
    1258                        }
    1259
    1260                        dt = str.getTime();
    1261                        calArray[2] = formatCal.format( dt ); // 5.5.8.3 (2012/11/17)
    1262                        calList.add( calArray.clone() );
    1263                }
    1264
    1265                // スタックガント用の特別な処理。
    1266                // 上位の ViewForm_HTMLStackedGanttTable クラスに対して、「開始、休日判定、次枠開始」リストを渡します。
    1267                ViewFormTag viewform = (ViewFormTag)findAncestorWithClass( this,ViewFormTag.class );
    1268                viewform.setViewArrayList( calList );
    1269
    1270                calStr = bufcal.toString();
    1271
    1272                // return "<pre>" + buf1.toString() + BR + buf2.toString() + "</pre>";
    1273                return buf1.toString() + BR + buf2.toString(); // 5.9.2.0 (2015/11/06) MODIFY ヘッダー列幅の固定対応
    1274        }
    1275
    1276        /**
    1277         * ganttHeaderの属性情報をdisplay:noneで作成します。
    1278         * ganttHeaderというタグで、id,class共にganttHeaderDataという名称で出力します。
    1279         *
    1280         * @og.rev 5.5.4.0 (2012/07/02) 新規作成
    1281         * @og.rev 5.6.1.2 (2013/02/22) baseTimes 追加
    1282         *
    1283         * @return  ヘッダー情報の文字列
    1284         */
    1285        private String makeHeaderData() {
    1286
    1287                StringBuilder buf1 = new StringBuilder( HybsSystem.BUFFER_SMALL );
    1288
    1289                buf1.append( "\n" )
    1290                        .append( "<ganttHeader style='display:none' id='ganttHeaderData' class='ganttHeaderData' " )
    1291                        .append( "startDate='"  ).append( startDate             ).append( "' " )
    1292                        .append( "endDate='"    ).append( endDate               ).append( "' " )
    1293                        .append( "zoom='"               ).append( zoom                  ).append( "' " )
    1294                        .append( "daySpan='"    ).append( daySpan               ).append( "' " )
    1295                        .append( "calDB='"              ).append( calStr                ).append( "' " )
    1296                        .append( "breakTimes='" ).append( breakTimes    ).append( "' " )
    1297                        .append( "baseTimes='"  ).append( baseTimes             ).append( "' " )                // 5.6.1.2 (2013/02/22) baseTimes 追加
    1298                        .append( "skipHoliday='" ).append( skipHoliday  ).append( "' " )
    1299                        .append( "useMultiClm='" ).append( useMultiClm  ).append( "' " )                // 5.6.1.2 (2013/02/22) useMultiClm 追加
    1300                        .append( " />" );
    1301
    1302                return buf1.toString();
    1303        }
    1304
    1305        /**
    1306         * 【TAG】表示開始日付けを設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。
    1307         *
    1308         * @og.tag
    1309         * この値は、ヘッダーの先頭に表示する日付けを指定します。
    1310         * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、
    1311         * yyyyMMddHHmm 形式で指定します。
    1312         *
    1313         * @param       val 表示開始日付(yyyyMMdd または、yyyyMMddHHmm 形式)
    1314         */
    1315        public void setStartDate( final String val ) {
    1316                startDate = nval( getRequestParameter( val ),startDate );
    1317        }
    1318
    1319        /**
    1320         * 【TAG】表示最終日を設定します(yyyyMMdd または、yyyyMMddHHmm 形式)。
    1321         *
    1322         * @og.tag
    1323         * 表示開始日から終了日までを、zoom 変数の値に応じてヘッダーラベルを
    1324         * 作成します。
    1325         * 通常の日付ヘッダーの場合は、 yyyyMMdd 形式ですが、時間ヘッダーの場合は、
    1326         * yyyyMMddHHmm 形式で指定します。
    1327         *
    1328         * @param       val 表示最終日(yyyyMMdd または、yyyyMMddHHmm 形式)
    1329         */
    1330        public void setEndDate( final String val ) {
    1331                endDate = nval( getRequestParameter( val ),endDate );
    1332        }
    1333
    1334        /**
    1335         * 【TAG】１日の開始終了時間を24時間形式(HHmm-HHmm または HH-HH)で設定します(初期値:0700-2000)。
    1336         *
    1337         * @og.tag
    1338         * この値は、１日の開始終了時間を指定します。
    1339         * 開始時刻は、内部で１時間単位に変換されます。８時３０分〜は、８時〜になります。
    1340         * 終了時間は、その時間を「含みません」
    1341         * 開始時刻より終了時刻が小さい場合は、翌日への日またぎとして計算します。
    1342         * たとえば、夜勤等で、17:00-07:00 という指定が可能です。
    1343         * 初期値は、朝の7:00から夜の20:00までです。(0700-2000)です。
    1344         *
    1345         * @og.rev 3.8.0.5 (2005/08/26) 本日は、青色で示します。
    1346         * @og.rev 5.6.1.2 (2013/02/22) daySpan（時刻表示範囲）は、内部では１時間単位
    1347         *
    1348         * @param       val 開始終了時間(HHmm-HHmm)形式
    1349         */
    1350        public void setDaySpan( final String val ) {
    1351                daySpan = nval( getRequestParameter( val ),daySpan );
    1352
    1353                // 5.6.1.2 (2013/02/22) daySpan（時刻表示範囲）は、内部では１時間単位
    1354                if( daySpan.length() == 5 && daySpan.charAt(2) == '-' ) {
    1355                        daySpan = daySpan.substring( 0,2 ) + "00-" + daySpan.substring( 3 ) + "00" ;    // HH-HH ⇒ HH00-HH00
    1356                }
    1357                else if( daySpan.length() == 9 && daySpan.charAt(4) == '-' ) {
    1358                        daySpan = daySpan.substring( 0,2 ) + "00-" + daySpan.substring( 5 ) ;                   // HHmm-HHmm  ⇒ HH00-HHmm
    1359                }
    1360                else {
    1361//              if( daySpan.length() != 9 || daySpan.charAt(4) != '-' ) {               // 5.6.1.2 (2013/02/22)
    1362//                      String errMsg = "１日の開始終了時間は24時間制で(HHmm-HHmm)形式で指定してください。"
    1363                        String errMsg = "１日の開始終了時間は24時間制で(HHmm-HHmm または HH-HH)形式で指定してください。"
    1364                                        + " value=[" + val + "]"
    1365                                        + " daySpan=[" + daySpan + "]" ;                // 5.1.8.0 (2010/07/01) errMsg 修正
    1366                        throw new HybsSystemException( errMsg );
    1367                }
    1368        }
    1369
    1370        /**
    1371         * 【TAG】ズーム変数(0〜9,10,11,12,20〜31,40〜42)を設定します(初期値:2)。
    1372         *
    1373         * @og.tag
    1374         * CSSファイルでの定義と、背景画像との関係で、作成します。
    1375         * ズーム変数は、CSSファイルや、JavaScript、PL/SQLと連動して、日付間隔
    1376         * あたりのピクセルを計算して、ヘッダーを作成しています。
    1377         * また、現在の標準的なクライアントでの換算になる為、高解像度のディスプレイや
    1378         * 特殊設定された環境では、表示間隔にずれが発生する可能性があります。
    1379         *
    1380         *    ZOOM  ラベル        日数ピクセル変換率          ヘッダ上      ヘッダ下    1文字(CSS)
    1381         *  ========================================================================================
    1382         *      0 : １週間 日数 *  8 * 6       48    48px =  1日  [02/   ]      [23(EE)]       8px
    1383         *      1 : ２週間 日数 *  8 * 3       24    24px =  1日  [02/]         [23 ]          8px
    1384         *      2 : １ヶ月 日数 *  12* 1       12    12px =  1日  [2]           [3]           12px
    1385         *      3 : ２ヶ月 日数 *  8 * 7  /  7  8    56px =  7日  [2004/  ]     [02/03  ]      8px
    1386         *      4 : ３ヶ月 日数 *  8 * 7  / 14  4    56px = 14日  [2004/  ]     [02/03  ]      8px
    1387         *      5 : ４ヶ月 日数 *  9 * 10 / 30  3    90px = 30日  [2004/     ]  [02/03     ]   9px
    1388         *      6 : ６ヶ月 日数 * 10 / 6  / 30  2    60px = 30日  [2004/ ]      [02/03 ]      10px
    1389         *      7 : １年   日数 *  9 / 10 / 90  1    90px = 90日  [2004/     ]  [02/03     ]   9px
    1390         *      8 : ２年   日数 *  9 / 10 /180  0.5  90px =180日  [2004/     ]  [02/03     ]   9px
    1391         *      9 : ３年   日数 * 10 / 6  /180  0.33 60px =180日  [2004/ ]      [02/03 ]      10px
    1392         *     10 : 週単位 日数 *  8 / 3  /  7  3.43 24px =  7日  [19W]         [12 ]          8px
    1393         *     11 : 予約済み(他物10件使用済み)
    1394         *     12 : 予約済み(他物 8件使用済み)
    1395         *     13 : 日(週) 日数 *  8 * 2       16    16px =  1日  [23]          [EE]           8px
    1396         *  ========================================================================================
    1397         *     20 :  1時間   時間 * 12 * 4        48 48px = 1時間 [02EE]        [07h ]        12px
    1398         *     21 :  1時間2  時間 * 12 * 2        24 24px = 1時間 [02]          [07]          12px
    1399         *     22 :  2時間   時間 * 12 * 4  /  2  24 48px = 2時間 [02EE]        [07h ]        12px
    1400         *     23 :  2時間2  時間 * 12 * 2  /  2  12 24px = 2時間 [02]          [07]          12px
    1401         *     24 :  4時間   時間 * 12 * 4  /  4  12 48px = 4時間 [02EE]        [07h ]        12px
    1402         *     25 :  4時間2  時間 * 12 * 2  /  4   6 24px = 4時間 [02]          [07]          12px
    1403         *     26 :  6時間   時間 * 12 * 4  /  6   8 48px = 6時間 [02EE]        [07h ]        12px
    1404         *     27 :  6時間2  時間 * 12 * 2  /  6   4 24px = 6時間 [02]          [07]          12px
    1405         *     28 :  8時間   時間 * 12 * 4  /  8   6 48px = 8時間 [02EE]        [07h ]        12px
    1406         *     29 :  8時間2  時間 * 12 * 2  /  8   3 24px = 8時間 [02]          [07]          12px
    1407         *     30 : 12時間   時間 * 12 * 4  / 12   4 48px =12時間 [02EE]        [07h ]        12px
    1408         *     31 : 12時間2  時間 * 12 * 2  / 12   2 24px =12時間 [02]          [07]          12px
    1409         *  ========================================================================================
    1410         *     40 : 積上(日)                    48   48px =  1日  [02/   ]      [23(EE)]       8px
    1411         *     41 : 積上(週)                    3.43 48px =  7日  [19W]         [12 ]          8px
    1412         *     42 : 積上(月) 月数 * 1            1   90px = 30日  [2004/     ]  [02/03     ]   9px
    1413         *     43 : 日単位ヘッダー予約済み
    1414         *     〜
    1415         *     49 : 日単位ヘッダー予約済み
    1416         *
    1417         * @og.rev 5.7.6.2 (2014/05/16) stackHeaderタグの互換機能として、DAY⇒40,WEEK⇒41,MONTH⇒42 対応する。
    1418         *
    1419         * @param       val ズーム変数(0〜9,10,11,12,20〜31,40〜42)
    1420         */
    1421        public void setZoom( final String val ) {
    1422//              zoom = nval( getRequestParameter( val ),zoom );
    1423
    1424                String zm = nval( getRequestParameter( val ),null );
    1425
    1426                // 6.0.0.1 (2014/04/25) zoom の、DAY⇒40,WEEK⇒41,MONTH⇒42 対応
    1427                if( ViewStackTableParam.STACK_ZOOM_DAY.equalsIgnoreCase( zm ) ) {
    1428                        zoom = 40;
    1429                } else if( ViewStackTableParam.STACK_ZOOM_WEEK.equalsIgnoreCase( zm ) ) {
    1430                        zoom = 41;
    1431                } else if( ViewStackTableParam.STACK_ZOOM_MONTH.equalsIgnoreCase( zm ) ) {
    1432                        zoom = 42;
    1433                }
    1434                else {
    1435                        zoom = nval( zm,zoom );
    1436                }
    1437
    1438                if( zoom < 0 || (13 < zoom && zoom < 20) || (31 < zoom && zoom < 40) || 42 < zoom ) {
    1439                        String errMsg = "ズーム変数は、(0〜9,10,11,12,20〜31,40〜42)の範囲で指定してください。"
    1440                                        + " zoom=[" + val + "]" ;
    1441                        throw new HybsSystemException( errMsg );
    1442                }
    1443        }
    1444
    1445        /**
    1446         * 【TAG】DB検索するＤＢを指定します。
    1447         *
    1448         * @og.tag
    1449         * カレンダデータは、システムパラメータ の CalendarQuery_**** で
    1450         * 指定する、CalendarQuery クラスの QUERY 文で、実際に取得します。
    1451         * 上記の **** 部分に、ここで指定するキーワードを設定して置きます。
    1452         * 通常は、データベースID (GE13, ZY01 など)を指定します。
    1453         * このキーワードに対する実装クラスを、先のシステムパラメータ の
    1454         * キーワード以下に記述しておきます。
    1455         * {@og.doc03Link calDB CalendarQuery_****}
    1456         *
    1457         * @og.rev 3.6.0.0 (2004/09/17) DB検索するＤＢのキー
    1458         *
    1459         * @param       db      DB検索するＤＢを指定
    1460         */
    1461        public void setCalDB( final String db ) {
    1462                calDB = nval( getRequestParameter( db ),calDB );
    1463        }
    1464
    1465        /**
    1466         * 【TAG】時間軸での休憩時間の開始-終了時刻をカンマ区切りで複数指定します。
    1467         *
    1468         * @og.tag
    1469         * 休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、
    1470         * yyyyMMddHHmm-yyyyMMddHHmm形式で複数指定できます。
    1471         * これは、開始-終了というハイフン形式でつなげます。
    1472         * このセットを、カンマで複数指定できます。
    1473         * 例えば、200508201200-1245,200508201300-1315 という感じです。
    1474         * - の前後が、４桁の場合は、HHmm-HHmm 形式として、日付に関係なく、常にこの時分
    1475         * で休憩が入るという認識をします。つまり、開始は、12桁か、4桁の日付形式、
    1476         * 終了も、12桁か、4桁の日付形式になります。
    1477         *
    1478         * @og.rev 3.8.0.5 (2005/08/26) 新規追加
    1479         * @og.rev 3.8.0.7 (2005/09/20) 日付またがり追加追加
    1480         *
    1481         * @param       times   休憩時間の開始-終了時刻(CSV区切り)
    1482         */
    1483        public void setBreakTimes( final String times ) {
    1484                breakTimes = nval( getRequestParameter( times ),null );
    1485        }
    1486
    1487        /**
    1488         * 【TAG】時間軸での休憩時間の表示スタイルを設定します。
    1489         *
    1490         * @og.tag
    1491         * 通常は、ヘッダーのトップからの位置と、色です。
    1492         * それ以外にも、スタイルシート属性(キー:値;) というセットを指定できます。
    1493         * class="breakTime" を出力していますので、そちらを使用したい場合は、breakTimeStyleを無効化してください。
    1494         * そうしないと、こちらは、直接 style属性で設定しているので、強いです。
    1495         * 初期値は、top:20px;background-color:yellow;filter:alpha(opacity=60);opacity:0.60; です。
    1496         * IE8以下のために、filter:alpha(opacity=60); しています。
    1497         * 設定の後ろに、; を付ける様にしてください。
    1498         *
    1499         * @og.rev 3.8.0.5 (2005/08/26) 新規追加
    1500         *
    1501         * @param       style   休憩時間の表示スタイル
    1502         */
    1503        public void setBreakTimeStyle( final String style ) {
    1504                breakTimeStyle = nval( getRequestParameter( style ),breakTimeStyle );
    1505        }
    1506
    1507        /**
    1508         * 【TAG】時間軸でのベース時刻の開始時刻をカンマ区切りで複数指定します。
    1509         *
    1510         * @og.tag
    1511         * ベース時刻は、HHmm形式、または、yyyyMMddHHmm形式で複数指定できます。
    1512         * このセットを、カンマで複数指定できます。
    1513         * 例えば、1700,200508201300 という感じです。
    1514         *
    1515         * @og.rev 5.6.1.2 (2013/02/22) 新規追加
    1516         *
    1517         * @param       times   ベース時刻の開始時刻(CSV区切り)
    1518         */
    1519        public void setBaseTimes( final String times ) {
    1520                baseTimes = nval( getRequestParameter( times ),null );
    1521        }
    1522
    1523        /**
    1524         * 【TAG】時間軸でのベース時刻の表示スタイルを設定します。
    1525         *
    1526         * @og.tag
    1527         * 通常は、ベース時刻の幅と、ヘッダーのトップからの位置と、色です。
    1528         * それ以外にも、スタイルシート属性(キー:値;) というセットを指定できます。
    1529         * 初期値は、top:20px;background-color:transparent;border-left:2px dashed red; です。
    1530         * 設定の後ろに、; を付ける様にしてください。
    1531         *
    1532         * @og.rev 5.6.1.2 (2013/02/22) 新規追加
    1533         *
    1534         * @param       style   ベース時刻の表示スタイル
    1535         */
    1536        public void setBaseTimeStyle( final String style ) {
    1537                baseTimeStyle = nval( getRequestParameter( style ),baseTimeStyle );
    1538        }
    1539
    1540        /**
    1541         * 【TAG】ＤＢ検索する場合の第１のキーを指定します。
    1542         *
    1543         * @og.tag
    1544         * 例えば、GE13, ZY01 では、事業所コード(CDJGS)を設定します。
    1545         * この値は、システムパラメータ の CalendarQuery_**** で
    1546         * 指定する、CalendarQuery クラスの QUERY 文に依存します。
    1547         * データベース定義の統一を望むところです。
    1548         *
    1549         * @og.rev 3.6.0.0 (2004/09/17) DB検索の第１キー(事業所コードなど)を追加
    1550         *
    1551         * @param       arg DB検索の第１キー(事業所コードなど)
    1552         */
    1553        public void setArg1( final String arg ) {
    1554                arg1 = nval( getRequestParameter( arg ),arg1 );
    1555        }
    1556
    1557        /**
    1558         * 【TAG】ＤＢ検索する場合の第２のキーを指定します。
    1559         *
    1560         * @og.tag
    1561         * 例えば、TP652 では、事業部コード(CDJGS) と 物件工程コード(CDKTEI)の２つの
    1562         * キーで、カレンダを取得します。(＋年月で、行を決定)
    1563         * 引数が、２つまで対応しています
    1564         * この値は、システムパラメータ の CalendarQuery_**** で
    1565         * 指定する、CalendarQuery クラスの QUERY 文に依存します。
    1566         * データベース定義の統一を望むところです。
    1567         *
    1568         * @og.rev 3.6.0.0 (2004/09/17) DB検索の第２キー(ＷＣコードなど)を追加
    1569         *
    1570         * @param       arg DB検索の第２キー(ＷＣコードなど)
    1571         */
    1572        public void setArg2( final String arg ) {
    1573                arg2 = nval( getRequestParameter( arg ),arg2 );
    1574        }
    1575
    1576        /**
    1577         * 【TAG】ＤＢ検索する場合の第３のキーを指定します。
    1578         *
    1579         * @og.tag
    1580         * この値は、システムパラメータ の CalendarQuery_**** で
    1581         * 指定する、CalendarQuery クラスの QUERY 文に依存します。
    1582         * データベース定義の統一を望むところです。
    1583         *
    1584         * @og.rev 3.6.0.0 (2004/09/17) DB検索の第３キーを追加
    1585         *
    1586         * @param       arg DB検索の第３キー
    1587         */
    1588        public void setArg3( final String arg ) {
    1589                arg3 = nval( getRequestParameter( arg ),arg3 );
    1590        }
    1591
    1592        /**
    1593         * 【TAG】ＤＢ検索する場合の第４のキーを指定します。
    1594         *
    1595         * @og.tag
    1596         * この値は、システムパラメータ の CalendarQuery_**** で
    1597         * 指定する、CalendarQuery クラスの QUERY 文に依存します。
    1598         * データベース定義の統一を望むところです。
    1599         *
    1600         * @og.rev 3.6.0.0 (2004/09/17) DB検索の第４キーを追加
    1601         *
    1602         * @param       arg DB検索の第４キー
    1603         */
    1604        public void setArg4( final String arg ) {
    1605                arg4 = nval( getRequestParameter( arg ),arg4 );
    1606        }
    1607
    1608        /**
    1609         * 【TAG】時間ガントで休日を表示する/しないを設定します
    1610         *              (初期値:USE_GANTTHEADER_SKIP_HOLIDAY[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY}])。
    1611         *
    1612         * @og.tag
    1613         * この値をfalseにすると、時間ガントでも休日が赤色で表示
    1614         * されるようになります。trueにした場合は、休日は表示されません。
    1615         * (初期値:システム定数のUSE_GANTTHEADER_SKIP_HOLIDAY[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY}])。
    1616         *
    1617         * @og.rev 4.0.0.0 (2007/09/07) 新規作成
    1618         *
    1619         * @param       skipHol 休日をスキップするかどうか。
    1620         * @see         org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_SKIP_HOLIDAY
    1621         */
    1622        public void setSkipHoliday( final String skipHol) {
    1623                skipHoliday = nval( getRequestParameter( skipHol ),skipHoliday );
    1624        }
    1625
    1626        /**
    1627         * 【TAG】時間ガントで２段組を使用する/しないを設定します
    1628         *              (初期値:USE_GANTTHEADER_MULTIPLE_COLUMN[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN}])。
    1629         *
    1630         * @og.tag
    1631         * ガントヘッダーにおいて、時間ヘッダーの上段に日付を、下段の時間軸の(h)の削除を行います。
    1632         * 日付は、表示開始時刻の上と、それの６時間ごとに表示します。
    1633         * (初期値:システム定数のUSE_GANTTHEADER_MULTIPLE_COLUMN[={@og.value org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN}])。
    1634         *
    1635         * @og.rev 5.6.1.2 (2013/02/22) 新規作成
    1636         *
    1637         * @param       multiClm        時間ガントで２段組を使用するかどうか(true:する/false:しない)。
    1638         * @see         org.opengion.hayabusa.common.SystemData#USE_GANTTHEADER_MULTIPLE_COLUMN
    1639         */
    1640        public void setUseMultiClm( final String multiClm ) {
    1641                useMultiClm = nval( getRequestParameter( multiClm ),useMultiClm );
    1642        }
    1643
    1644        /**
    1645         * 日付、時刻の文字列を時間整数に変換します。
    1646         *
    1647         * 時間を扱う場合は、厄介なのは、時間と分の単位の違いです。
    1648         * 分に換算してしまうと、時間の取得に６０進数で扱う必要が出てきます。
    1649         * そこで、単純に時間に換算するのではなく、１時間を100として、
    1650         * 分を０から９９までの整数に換算して計算しています。
    1651         * これにより時間の足し算や引き算が可能になり、かつ、時間を求めるのに
    1652         * 100で割るだけで求めることが可能になります。
    1653         *
    1654         * @og.rev 5.6.1.2 (2013/02/22) 廃止
    1655         *
    1656         * @param       yy      時間の文字列
    1657         * @param       mm      分の文字列
    1658         *
    1659         * @return １時間を100として、分を０から９９までの整数に換算した値
    1660         */
    1661//      private static int ym2int( final String yy,final String mm ) {
    1662//              return (int)(Integer.parseInt( yy ) * 100 + Integer.parseInt( mm )*10.0/6.0 ) ;
    1663//      }
    1664
    1665        /**
    1666         * 日付、時刻の文字列を時間整数に変換します。
    1667         *
    1668         * 時間を扱う場合は、厄介なのは、時間と分の単位の違いです。
    1669         * 分に換算してしまうと、時間の取得に６０進数で扱う必要が出てきます。
    1670         * そこで、単純に時間に換算するのではなく、１時間を100として、
    1671         * 分を０から９９までの整数に換算して計算しています。
    1672         * これにより時間の足し算や引き算が可能になり、かつ、時間を求めるのに
    1673         * 100で割るだけで求めることが可能になります。
    1674         *
    1675         * ここでは、引数に、HHmm 、 HHmmss 、yyyyMMddHHmm 、yyyyMMddHHmmss 、null が扱えます。
    1676         * null の場合は、-1 を返します。
    1677         * yyyyMMdd 部分は、無視されます。
    1678         *
    1679         * @og.rev 5.6.1.2 (2013/02/22) 日付、秒、null 対応
    1680         *
    1681         * @param       hhmm    時分の文字列
    1682         *
    1683         * @return １時間を100として、分を０から９９までの整数に換算した値
    1684         */
    1685        private static int hm2int( final String hhmm ) {
    1686                int rtn = -1;
    1687
    1688                if( hhmm != null ) {
    1689                        int len = hhmm.length();
    1690                        String hh = null;
    1691                        String mm = null;
    1692                        if( len == 4 || len == 6 ) {                    // HHmm 、HHmmss
    1693                                hh = hhmm.substring( 0,2 );
    1694                                mm = hhmm.substring( 2,4 );
    1695                        }
    1696                        else if( len == 12 || len == 14 ) {             // yyyyMMddHHmm 、yyyyMMddHHmmss
    1697                                hh = hhmm.substring( 8,10 );
    1698                                mm = hhmm.substring( 10,12 );
    1699                        }
    1700                        else {
    1701                                String errMsg = "指定できる時間形式は、HHmm 、HHmmss 、yyyyMMddHHmm 、yyyyMMddHHmmss です。"
    1702                                                        + HybsSystem.CR
    1703                                                        + "hm2int=[" + hhmm + "]" ;
    1704                                throw new HybsSystemException( errMsg );
    1705                        }
    1706                        rtn = (int)(Integer.parseInt( hh ) * 100 + Integer.parseInt( mm )*10.0/6.0 ) ;
    1707                }
    1708
    1709                return rtn;
    1710        }
    1711
    1712        /**
    1713         * 休憩時間のデータを管理する内部クラスです。
    1714         *
    1715         * @og.rev 3.8.0.7 (2005/09/20) 内部クラス新規作成
    1716         * @og.group 画面部品
    1717         *
    1718         * @version  4.0
    1719         * @author      Kazuhiko Hasegawa
    1720         * @since    JDK5.0,
    1721         */
    1722        private static class BreakTimeData {
    1723                private final String startDay   ;               // 開始日付。null の場合は、毎日
    1724                private final int        startTime      ;               // 開始時刻のhm2int変換済み値
    1725                private final int        timeSpan       ;               // 開始時刻と終了時刻の時間差(hm2int変換済み)
    1726                private final String viewTime   ;               // ツールチップ表示用の文字列(HHmm-HHmm)
    1727
    1728                /**
    1729                 * コンストラクター
    1730                 *
    1731                 * 開始日付(startDay)、開始時刻(startTime)、時間差(timeSpan)、表示ラベル(viewTime)
    1732                 * を指定して、休憩時間のデータオブジェクトを構築します。
    1733                 * 開始日付(startDay)は、null の場合は、毎日、つまり、定常的な休憩時刻として
    1734                 * 認識します。日付が指定された場合は、その日のみの特別な休憩時間と認識します。
    1735                 * 開始時刻は、hm2int変換済み値で、１時間が100となり、分は、10進数に変換されている
    1736                 * 値として認識します。7：30 の場合は、750 という値になります。
    1737                 * 開始時刻と終了時刻の時間差(timeSpan)も hm2int変換済み値です。
    1738                 * 表示用の文字列(viewTime)は、休憩時間の HTML表記時の title 属性として
    1739                 * 設定される為、マウスオーバー時のツールチップに現れます。
    1740                 *
    1741                 * @param       startDay        yyyyMMdd 形式の開始日付。null の場合は、毎日
    1742                 * @param       startTime       開始時刻のhm2int変換済み値
    1743                 * @param       timeSpan        開始時刻と終了時刻の時間差(hm2int変換済み)
    1744                 * @param       viewTime        ツールチップ表示用の文字列(HHmm-HHmm)
    1745                 */
    1746                BreakTimeData( final String startDay,final int startTime,final int timeSpan,final String viewTime ) {
    1747                        this.startDay   = startDay;
    1748                        this.startTime  = startTime;
    1749                        this.timeSpan   = timeSpan;
    1750                        this.viewTime   = viewTime;
    1751                }
    1752
    1753                /**
    1754                 * 指定の日付と時刻が、この BreakTimeData の開始日時とマッチするかどうかをチェックします。
    1755                 *
    1756                 * 開始日時とマッチするとは、内部日付がマッチし、開始時刻が、指定の time の
    1757                 * １時間(+100)*stepの範囲に含まれている場合を指します。(true を返します。)
    1758                 * 内部の日付(startDay)が null の場合は、毎日が対象となります。
    1759                 * 開始時刻がマッチした場合は、timeSpan 分だけの幅を持った休憩時間を認識します。
    1760                 * 境界条件の都合で、timeSpan == 0 の状態も存在しますが、これはマッチしないと判断します。
    1761                 *
    1762                 * @og.rev 3.8.1.1 (2005/11/21) timeSpan が 0 より大きい場合 条件追加
    1763                 * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加
    1764                 *
    1765                 * @param       inDay   yyyyMMdd 形式の日付。
    1766                 * @param       time    休憩時間の開始時刻のhm2int変換済み値
    1767                 * @param       step    時間間隔
    1768                 * @return 含まれる(対象)場合は、true そうでない場合は、false
    1769                 */
    1770//              boolean startsWith( final String inDay,final int time ) {
    1771                boolean startsWith( final String inDay,final int time,final int step ) {
    1772                        return ( timeSpan > 0 &&
    1773                                         time <= startTime &&
    1774                                         startTime < time+100*step &&
    1775                                         ( startDay == null || inDay.equals( startDay ) ) );
    1776                }
    1777
    1778                /**
    1779                 * 休憩時間を表す SPANタグを作成します。
    1780                 *
    1781                 * １時間=hourOfPixcel(px) で換算します。分は、すでに分数計算(hm2int)済み
    1782                 *
    1783                 * @og.rev 3.8.8.4 (2007/02/17) class="breaktime"  追加
    1784                 * @og.rev 5.6.1.2 (2013/02/22) ベース時刻対応。width が 0 の場合は、2 をセット
    1785                 *
    1786                 * @param       offset  表示開始ピクセル数(実質表示日数 * １日分のピクセル - オフセット)
    1787                 * @param       hourOfPixcel    １時間あたりのピクセル数
    1788                 * @param       breakTimeStyle  休憩時間の指定に追加するスタイル属性
    1789                 * @return 休憩時間を表す SPANタグ
    1790                 */
    1791                String getBreakTime( final int offset,final int hourOfPixcel,final String breakTimeStyle ) {
    1792                        int left  = offset + (startTime*hourOfPixcel/100) ;
    1793                        int width = (timeSpan*hourOfPixcel/100) ;
    1794                        if( width == 0 ) { width = 2; }         // 5.6.1.2 (2013/02/22) ベース時刻対応。width が 0 の場合は、2 をセット
    1795
    1796                        return "<span class=\"breaktime\" title=\"" + viewTime + "\""
    1797                                        + " style=\"position:absolute;z-index:100;height:500000px;"
    1798                                        + "left:"       + left  + "px;"
    1799                                        + "width:"      + width + "px;"
    1800                                        + breakTimeStyle        + "\" ></span>"
    1801                                        + HybsSystem.CR ;
    1802                }
    1803        }
    1804
    1805        /**
    1806         * 休憩時間を管理する内部クラスです。
    1807         *
    1808         * 内部的に、休憩時間以外に、ベース時刻も処理できるようにします。
    1809         * これは、終了時刻を指定されていない場合でも対応できるようにすることを意味します。
    1810         * また、時間指定方法を、時分だけでなく、時分秒指定時でも処理できるようにします。（秒は無視）
    1811         *
    1812         * @og.rev 3.8.0.7 (2005/09/20) 内部クラスBreakTimeDataを使用するように修正
    1813         * @og.rev 3.8.1.6 (2006/04/25) 変数の final 化
    1814         * @og.rev 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し
    1815         *
    1816         * @og.group 画面部品
    1817         *
    1818         * @version  4.0
    1819         * @author      Kazuhiko Hasegawa
    1820         * @since    JDK5.0,
    1821         */
    1822        private static class BreakTimes {
    1823                private final List<BreakTimeData> timeList        = new ArrayList<BreakTimeData>();
    1824                private final int               hourOfPixcel    ; // １時間あたりのピクセル数(例:TIME_PIXEL)
    1825                private final String    breakTimeStyle  ; // 休憩時間の指定に追加するスタイル属性
    1826                private final int               viewStartTime   ; // 数値化(hm2int)された表示開始時刻(例:0700)
    1827                private final int               viewEndTime             ; // 数値化(hm2int)された表示終了時刻(例:2000)
    1828
    1829                /**
    1830                 * コンストラクター
    1831                 * 必要な情報を設定して、オブジェクトを構築します。
    1832                 * 表示終了時刻は、表示開始時刻 >= 表示終了時刻 の場合、2400加算されている。
    1833                 *
    1834                 * @og.rev 3.8.0.7 (2005/09/20) breakTimesの日付またがり追加
    1835                 * @og.rev 3.8.1.1 (2005/11/21) timeSpan の計算方法を見直し
    1836                 * @og.rev 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し
    1837                 *
    1838                 * @param       hOfpx   １時間あたりのピクセル数
    1839                 * @param       breakTimes      休憩時間を、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-yyyyMMddHHmm形式で指定します。
    1840                 * @param       style   休憩時間の指定に追加するスタイル属性
    1841                 * @param       vStartTime      数値化(hm2int)された表示開始時刻
    1842                 * @param       vEndTime        数値化(hm2int)された表示終了時刻
    1843                 */
    1844                BreakTimes( final int hOfpx,final String breakTimes,final String style,
    1845                                        final int vStartTime,final int vEndTime ) {
    1846                        hourOfPixcel    = hOfpx;
    1847                        breakTimeStyle  = ( style == null ) ? "" : style ;
    1848                        viewStartTime   = vStartTime;
    1849                        viewEndTime             = vEndTime;
    1850                        boolean time24          = ( viewEndTime > 2400 );    // 3.8.1.1 (2005/11/21) 開始終了が逆転している場合 true
    1851
    1852                        // 3.8.1.1 (2005/11/21) timeSpan の計算方法を見直し
    1853                        DateFormat format = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
    1854                        String[] startEnds = StringUtil.csv2Array( breakTimes );
    1855                        int len = startEnds.length;
    1856
    1857                        String  startDay        ;               // null の場合は、毎日
    1858                        String  endDay          ;               // 一時変数
    1859                        int             startTime       ;               // 開始時刻のhm2int変換済み値
    1860                        int             endTime         ;               // 終了時刻のhm2int変換済み値
    1861                        int             timeSpan        ;               // 開始時刻と終了時刻の時間差(hm2int変換済み値)
    1862                        String  viewTime        ;               // ツールチップ表示用の文字列(HH:mm-HH:mm)
    1863
    1864                        Calendar str ;
    1865                        Calendar end ;
    1866
    1867                        for( int i=0; i<len; i++ ) {
    1868                                String startEnd = startEnds[i];
    1869                                if( startEnd != null ) {
    1870                                        // startEnd     = "0700ss-2000ss";                                              // 開始-終了時刻(HHmm-HHmm)
    1871                                        // startEnd     = "200508200700ss-2000ss";                              // 開始-終了時刻(yyyyMMddHHmm-HHmm)
    1872                                        // startEnd     = "200508200700ss-200508212000ss";              // 開始-終了時刻(yyyyMMddHHmm-yyyyMMddHHmm)
    1873
    1874                                        // 5.6.1.2 (2013/02/22) breakTimesの処理方法の見直し
    1875                                        int idx = startEnd.indexOf( '-' );      // ハイフンを見つける。
    1876                                        if( idx > 0 ) {
    1877                                                String st = startEnd.substring( 0,idx );
    1878                                                String ed = startEnd.substring( idx+1 );
    1879
    1880                                                startDay        = (st.length() >= 8) ? st.substring( 0,8 ) : null ;          // ８ケタ以上で、yyyyMMdd 取得
    1881                                                endDay          = (ed.length() >= 8) ? ed.substring( 0,8 ) : null ;          // ８ケタ以上で、yyyyMMdd 取得
    1882                                                startTime       = hm2int( st );
    1883                                                endTime         = hm2int( ed );
    1884                                        }
    1885                                        // startEnd     = "0700ss";                                             // 開始時刻(HHmm)
    1886                                        // startEnd     = "200508200700ss";                             // 開始時刻(yyyyMMddHHmm)
    1887                                        // startEnd     = "200508200700ss";                             // 開始時刻(yyyyMMddHHmm)
    1888                                        else {
    1889                                                String st = startEnd;
    1890                                                startDay        = (st.length() >= 8) ? st.substring( 0,8 ) : null ;          // ８ケタ以上で、yyyyMMdd 取得
    1891                                                endDay          = null ;
    1892                                                startTime       = hm2int( st );
    1893                                                endTime         = startTime + 1;                                                                                // 差分を出すため、startTime に 1 だけ加算
    1894                                        }
    1895
    1896                                        // 5.6.1.2 (2013/02/22) 処理見直し
    1897//                                      // startEnd     = "0700-2000";  // 開始-終了時刻(HHmm-HHmm)
    1898//                                      if( startEnd.length() == 9 && startEnd.charAt(4) == '-' ) {
    1899//                                              startDay        = null;
    1900//                                              endDay          = null;
    1901//                                              startTime       = ym2int( startEnd.substring( 0,2 ),startEnd.substring( 2,4 ) );
    1902//                                              endTime         = ym2int( startEnd.substring( 5,7 ),startEnd.substring( 7 ) );
    1903//                                      }
    1904//                                      // startEnd     = "200508200700-2000";  // 開始-終了時刻(yyyyMMddHHmm-HHmm)
    1905//                                      else if( startEnd.length() == 17 && startEnd.charAt(12) == '-' ) {
    1906//                                              startDay        = startEnd.substring( 0,8 );
    1907//                                              endDay          = null;
    1908//                                              startTime       = ym2int( startEnd.substring( 8,10  ),startEnd.substring( 10,12 ) );
    1909//                                              endTime         = ym2int( startEnd.substring( 13,15 ),startEnd.substring( 15 ) );
    1910//                                      }
    1911//                                      // startEnd     = "200508200700-200508212000";  // 開始-終了時刻(yyyyMMddHHmm-yyyyMMddHHmm)
    1912//                                      else if( startEnd.length() == 25 && startEnd.charAt(12) == '-' ) {
    1913//                                              startDay        = startEnd.substring( 0,8 );
    1914//                                              endDay          = startEnd.substring( 13,21 );
    1915//                                              startTime       = ym2int( startEnd.substring( 8,10  ),startEnd.substring( 10,12 ) );
    1916//                                              endTime         = ym2int( startEnd.substring( 21,23 ),startEnd.substring( 23 ) );
    1917//                                      }
    1918//                                      else {
    1919//                                              String errMsg = "休憩時間は、HHmm-HHmm形式、または、yyyyMMddHHmm-HHmm、または、yyyyMMddHHmm-yyyyMMddHHmm形式です。"
    1920//                                                                      + HybsSystem.CR
    1921//                                                                      + "breakTimes=[" + breakTimes + "] Bad=[" + startEnd + "]" ;
    1922//                                              throw new HybsSystemException( errMsg );
    1923//                                      }
    1924
    1925                                        str = null;
    1926                                        end = null;
    1927                                        if( startDay != null ) { str = HybsSystem.getCalendar( startDay ); }
    1928                                        if( endDay   != null ) { end = HybsSystem.getCalendar( endDay   ); }
    1929
    1930                                        // 表示終了時刻 が 2400 より大きい場合、表示開始時刻 >= 表示終了時刻 である。
    1931                                        if( time24 ) {
    1932                                                // 開始時刻 <  表示終了時刻 => 開始時刻に2400加算する。
    1933                                                if( startTime < viewEndTime-2400 ) {
    1934                                                        if( str != null ) {
    1935                                                                str.add(Calendar.DATE, -1 );    // -1 日しておく
    1936                                                                startDay = format.format( str.getTime() );
    1937                                                        }
    1938                                                        startTime += 2400;
    1939                                                }
    1940
    1941                                                // 終了時刻 <= 表示終了時刻 => 終了時刻に2400加算する。
    1942                                                if( endTime <= viewEndTime-2400 ) {
    1943                                                        if( end != null ) {
    1944                                                                end.add(Calendar.DATE, -1 );    // -1 日しておく
    1945                                                                endDay = format.format( end.getTime() );
    1946                                                        }
    1947                                                        endTime += 2400;
    1948                                                }
    1949                                        }
    1950
    1951                                        // 3.8.1.1 (2005/11/21) 判定条件修正
    1952                                        // 開始時刻 < 表示開始時刻 => 開始時刻に表示開始時刻をセット。
    1953                                        if( startTime < viewStartTime ) { startTime = viewStartTime; }
    1954
    1955                                        // 開始時刻 > 表示終了時刻 => 開始時刻に表示終了時刻をセット。
    1956                                        if( startTime > viewEndTime ) { startTime = viewEndTime; }
    1957
    1958                                        // 終了時刻 < 表示開始時刻 => 終了時刻に表示開始時刻をセット。
    1959                                        if( endTime < viewStartTime ) { endTime = viewStartTime; }
    1960
    1961                                        // 終了時刻 > 表示終了時刻 => 終了時刻に表示終了時刻をセット。
    1962                                        if( endTime > viewEndTime ) { endTime = viewEndTime; }
    1963                                        timeSpan = endTime - startTime ;
    1964                                        viewTime = startEnd ;
    1965                                }
    1966                                // null の場合は、カンマが連続したり、最後に余分に付いたケースなので、無視する。
    1967                                else {
    1968                                        continue;
    1969                                }
    1970
    1971                                // 終了日が入っていないか、開始日と終了日が同じ日の場合。
    1972                                if( timeSpan >= 0 && (
    1973                                        endDay == null || ( startDay != null && startDay.equals( endDay ) ) ) ) {
    1974                                                timeSpan = endTime - startTime ;
    1975                                                timeList.add( new BreakTimeData( startDay,startTime,timeSpan,viewTime ) );
    1976                                }
    1977                                else {
    1978                                        // 終了日が入っていると複数日に分かれているので、分解する必要がある。
    1979
    1980                                        // 初日の timeSpan は、startTime から viewEndTime まで
    1981                                        timeSpan = viewEndTime - startTime ;
    1982                                        timeList.add( new BreakTimeData( startDay,startTime,timeSpan,viewTime ) );
    1983
    1984                                        // 最終日の timeSpan は、viewStartTime から endTime まで
    1985                                        timeSpan = endTime - viewStartTime ;
    1986                                        timeList.add( new BreakTimeData( endDay,viewStartTime,timeSpan,viewTime ) );
    1987
    1988                                        // 中日の timeSpan は、viewStartTime から viewEndTime まで
    1989                                        timeSpan = viewEndTime - viewStartTime ;
    1990                                        if( str != null && end != null ) {
    1991                                                str.add(Calendar.DATE, 1 );             // +1 日しておく
    1992                                                while( str.before( end ) ) {    // 終了時間は、「含まない」仕様
    1993                                                        Date dt = str.getTime();
    1994                                                        String tempStartDay = format.format( dt );
    1995                                                        timeList.add( new BreakTimeData( tempStartDay,viewStartTime,timeSpan,viewTime ) );
    1996                                                        str.add(Calendar.DATE, 1);
    1997                                                }
    1998                                        }
    1999                                }
    2000                        }
    2001                }
    2002
    2003                /**
    2004                 * その日のその時間の休憩時間を表す SPANタグ群(複数ありうる)を作成します。
    2005                 *
    2006                 * @og.rev 3.8.9.2 (2007/07/28) 時間間隔パラメータ追加
    2007                 *
    2008                 * @param       offset  表示開始ピクセル数(実質表示日数 * １日分のピクセル - オフセット)
    2009                 * @param day Calendar 処理すべき日付のカレンダ
    2010                 * @param       time    処理すべき時間
    2011                 * @param       step    時間間隔
    2012                 * @return その日のその時間の休憩時間を表す SPANタグ群(複数ありうる)
    2013                 */
    2014//              String makeSpan( final int offset,final Calendar day,final int time ) {
    2015                String makeSpan( final int offset,final Calendar day,final int time,final int step ) {
    2016                        DateFormat format1 = new SimpleDateFormat( "yyyyMMdd",Locale.JAPAN );
    2017                        String inDay = format1.format( day.getTime() );
    2018
    2019                        StringBuilder buf = new StringBuilder();
    2020                        int size = timeList.size();
    2021                        for( int i=0; i<size; i++ ) {
    2022                                BreakTimeData timeData = timeList.get(i);
    2023//                              if( timeData.startsWith( inDay,time ) ) {
    2024                                if( timeData.startsWith( inDay,time,step ) ) {
    2025                                        buf.append( timeData.getBreakTime( offset,hourOfPixcel,breakTimeStyle ) );
    2026                                }
    2027                        }
    2028
    2029                        String rtn = null;
    2030
    2031                        if( buf.length() > 0 ) { rtn = buf.toString(); }
    2032                        return rtn;
    2033                }
    2034        }
    2035
    2036        /**
    2037         * このオブジェクトの文字列表現を返します。
    2038         * 基本的にデバッグ目的に使用します。
    2039         *
    2040         * @return このクラスの文字列表現
    2041         */
    2042        @Override
    2043        public String toString() {
    2044                return org.opengion.fukurou.util.ToString.title( this.getClass().getName() )
    2045                                .println( "VERSION"                     ,VERSION                )
    2046                                .println( "startDate"           ,startDate              )
    2047                                .println( "endDate"                     ,endDate                )
    2048                                .println( "daySpan"                     ,daySpan                )
    2049                                .println( "zoom"                        ,zoom                   )
    2050                                .println( "breakTimes"          ,breakTimes             )
    2051                                .println( "breakTimeStyle"      ,breakTimeStyle )
    2052                                .println( "baseTimes"           ,baseTimes              )               // 5.6.1.2 (2013/02/22) ベース時刻
    2053                                .println( "baseTimeStyle"       ,baseTimeStyle  )               // 5.6.1.2 (2013/02/22) ベース時刻スタイル
    2054                                .println( "calDB"                       ,calDB                  )
    2055                                .println( "arg1"                        ,arg1                   )
    2056                                .println( "arg2"                        ,arg2                   )
    2057                                .println( "arg3"                        ,arg3                   )
    2058                                .println( "arg4"                        ,arg4                   )
    2059                                .println( "skipHoliday"         ,skipHoliday    )
    2060                                .println( "TIME_PIXEL"          ,TIME_PIXEL     )
    2061                                .println( "Other..."            ,getAttributes().getAttribute() )
    2062                                .fixForm().toString() ;
    2063        }
    2064}