<?php

// Set up the variables (today, month, year, cmd)
//  today = m/d/y
function setvars() {

  // Default is today
  $today = getdate();
  $month = $today['mon'];
  $year = $today['year'];
  $today = $month."/".$today['mday']."/".$year;

  // Return vars in an array
  return array("today" => $today,
               "month" => $month,
               "year" => $year);

}  // End setvars()


// Do the document header
function docheader($month,$year) {

  $month_text =  date("F",strtotime($month."/1/".$year));

  // If content header has not been sent,
  //   send it
  if (!headers_sent()) {
    header('Content-type: text/html');
  }

// Print the document header (up to first date row)
print <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1.dtd">
<html>
<head>
  <title>Calendar - $Month $Year</title>
  <style type="text/css">
    tr.weekdays td { width: 100px;
                     text-align: center;
                   }
    tr.week td { width: 100px;
                 height: 100px;
                 color: black;  }
  </style>
</head>
<body>
<table border="1">

<!-- Controls and calendar title (month) -->
<tr>
  <td colspan="7" align="center">
    <strong>
      $month_text $year
    </strong>
  </td>
</tr>

<!-- Day of week header row -->
<tr class="weekdays">
  <th>Sunday</th>
  <th>Monday</th>
  <th>Tuesday</th>
  <th>Wednesday</th>
  <th>Thursday</th>
  <th>Friday</th>
  <th>Saturday</th>
</tr>

<!-- Calendar (days) start here -->

HTML;

}  // End docheader()


// Do the document footer (close tags, end doc)
function docfooter() {

print <<<HTML
<!-- Close all open tags, end document -->
</table>
</body>
</html>

HTML;

} // End docfooter()


// Print an empty day (cell)
function emptyday() {

print <<<HTML
  <td align="right" valign="top">&nbsp;</td>

HTML;

} // End emptyday()


// Print a day cell
function day($today,$month,$day,$year) {

  $curday = $month."/".$day."/".$year;
  if ($curday == $today) {
    $font = " style=\"color: red;\"";
  } else {
    $font = "";
  }

print <<< HTML
  <td align="right" valign="top" $font>$day</td>

HTML;

} // End day()


// Open or close a row
function weekrow($cmd) {

  switch ($cmd) {
    case "open":
      print "<tr class=\"week\">\n";
      break;
    case "close":
      print "</tr>\n";
      break;
  }

}  // End weekrow()


// Main program body
function main() {

  // Set the date vars
  $vars = setvars();
  $today = $vars['today'];
  $month = $vars['month'];
  $year = $vars['year'];

  // Do the header and open first row
  docheader($month,$year);
  weekrow("open");

  // Set up first weekday and 1st day (m/1/y)
  $first_weekday = date("w",strtotime($month."/1/".$year)) + 1;
  $day = 1;

  // Print empty days up to the first weekday of month
  for ($weekday = 1; $weekday < $first_weekday; $weekday++) {
    emptyday();
  }

  // Do rest of month while we have a valid date
  while (checkdate($month,$day,$year)) {
    // If SUN, open the row
    if ($weekday == 1) {
      weekrow("open");
    }
    // Print day and increment
    day($today,$month,$day,$year);
    $weekday++;
    $day++;
    // If SAT, close row reset weekday
    if ($weekday > 7) {
      weekrow("close");
      $weekday = 1;
    }

  }

  // Close current week
  while ($weekday != 1 && $weekday <= 7) {
    emptyday();
    $weekday++;
  }

  // Close document
  docfooter();

} // End main();


// Kick it all off
main();

?>