// info  nam="SAMPLE02B"  tit="カレンダー"  dsc="ＦＤケースサイズ"  pro=3

  // サイズ
#define  WD  90.0
#define  HI  94.0
#define  X0  ((210.0 - 2 * WD) / 2)
#define  Y0  ((297.0 - 3 * HI) / 2)

  // 開始月
PCSTR SR0 = "2026/01";

  // 祝日リスト
PCSTR HOL[17] = {
  "2026/01/01", // 元日
  "2026/01/12", // 成人の日
  "2026/02/11", // 建国記念の日
  "2026/02/23", // 天皇誕生日
  "2026/03/20", // 春分の日
  "2026/04/29", // 昭和の日
  "2026/05/04", // みどりの日
  "2026/05/05", // こどもの日
  "2026/05/06", // 振替休日
  "2026/07/20", // 海の日
  "2026/08/11", // 山の日
  "2026/09/21", // 敬老の日
  "2026/09/22", // 国民の休日
  "2026/09/23", // 秋分の日
  "2026/10/12", // スポーツの日
  "2026/11/03", // 文化の日
  "2026/11/23", // 勤労感謝の日
};
#define  NHO  (sizeof(HOL) / sizeof(HOL[0]))

int  HO[NHO];

BOOL ishol(int sr)
{ // 祝日
  int i;

  for (i = 0; i < NHO; i++) {
    if (sr == HO[i]) return TRUE;
  }
  return FALSE;
}

void MonthlyCalendar(HREP rp, int sr)
{ // 当月カレンダー
  int i, j, yo, dm, dy, tco;
  CELL cel;
  GRID grd;
  static BGRC mc[12] = {
    0x004488, 0x006666, 0x008844, 0x00cc00, 0x448800, 0x666600,
    0x884400, 0xcc0000, 0x880044, 0x660066, 0x440088, 0x0000cc,
  };
  static PCSTR wk[7] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };

  FillCell(rp, SetCell(&cel, 0.0, 0.0, WD, HI * 2 / 7), RST_MED, mc[month(sr) - 1]);
  SetTextFont(rp, NULL,  4.0, 0, 0xffffff);
  CellText(rp, SetCell(&cel, 0.0, 0.0, 26.0, 10.0), format("%d", year(sr)), DT_CEN);
  SetTextFont(rp, NULL, 16.0, 0, 0xffffff);
  CellText(rp, SetCell(&cel, 0.0, 7.0, 26.0, 23.0), format("%d", month(sr)), DT_CEN);
  SetGrid0(&grd, 0.0, HI / 7, 7, 6, WD / 7, HI / 7);
  yo = youbi(sr);
  dm = days_of_month(year(sr), month(sr));
  dy = 0;
  for (i = 0; i < grd.nr; i++) {
    for (j = 0; j < grd.nc; j++) {
      GridCell(&cel, &grd, i, j);
      if (i == 0) {
        SetTextFont(rp, NULL, 3.0, 0, 0xffffff);
        CellText(rp, &cel, wk[j], DT_CEN|DT_BTM);
      } else {
        DrawGridCell(rp, &grd, i, j, RST_R_M);
        if (i == 1 && j == yo) dy = 1;
        tco = (j == 0 || (dy > 0 && ishol(sr + dy - 1)))? 0x0000ff: (j == 6)? 0xff0000: 0;
        SetTextFont(rp, NULL, 4.0, 0, tco);
        if (dy > 0 && dy <= dm) {
          if (i == grd.nr - 1 && dy + 7 <= dm) {
            CellText(rp, &cel, format("%d", dy), DT_LFT|DT_FRC);
            DrawLine(rp, cel.x2 - 3.0, cel.y1 + 3.0, cel.x1 + 3.0, cel.y2 - 3.0);
            CellText(rp, &cel, format("%d", dy + 7), DT_RGT|DT_BTM);
          } else {
            CellText(rp, &cel, format("%d", dy), DT_LFT|DT_FRC);
          }
          dy++;
        }
      }
    }
  }
}

BOOL ReportMain(HREP rp, int msg, int pg, UINT pa)
{ // カレンダー
  int i, sr;
  static int sr0;

  if (msg == REPM_SETUP) {

    sr0 = ztod(SR0);
    for (i = 0; i < NHO; i++) {
      HO[i] = ztod(HOL[i]);
    }
    SetReqBodyWidth(rp, 0.0, RSW_SKP);
    SetNPages(rp, 2);

  } else if (msg == REPM_DRAWPAGE) {

    for (i = 0; i < 6; i++) {
      sr = date_serial(year(sr0), month(sr0) + (pg - 1) * 6 + i, 1);
      SetOrigin(rp, X0 + (i % 2) * WD, Y0 + (i / 2) * HI);
      MonthlyCalendar(rp, sr); 
    }

  }
  return TRUE;
}
