diff --git a/cal.php b/cal.php
index 8d27de4c7..ed02e43d0 100644
--- a/cal.php
+++ b/cal.php
@@ -129,25 +129,43 @@ $bom = mktime(0, 0, 1, $cm, 1, $cy);
$eom = mktime(0, 0, 1, $cm+1, 0, $cy);
// Link to previous month (but do not link to too early dates)
-$lm = mktime(0, 0, 1, $cm, 0, $cy);
-if (valid_year(date("Y", $lm))) {
- $prev_link = '%B, %Y', $lm);
-} else {
- $prev_link = ' ';
-}
+$prev_link = (function() use ($cm, $cy) {
+ $lm = mktime(0, 0, 1, $cm, 0, $cy);
+ $year = date('Y', $lm);
+ if (!valid_year($year)) {
+ return ' ';
+ }
+
+ $month = date('m', $lm);
+ $monthName = date('F', $lm);
+ return sprintf('%s, %s',
+ urlencode($month),
+ urlencode($year),
+ htmlentities($monthName),
+ htmlentities($year));
+})();
// Link to next month (but do not link to too early dates)
-$nm = mktime(0, 0, 1, $cm+1, 1, $cy);
-if (valid_year(date("Y", $nm))) {
- $next_link = '%B, %Y', $nm);
-} else {
- $next_link = ' ';
-}
+$next_link = (function() use ($cm, $cy) {
+ $nm = mktime(0, 0, 1, $cm+1, 1, $cy);
+ $year = date('Y', $nm);
+ if (!valid_year($year)) {
+ return ' ';
+ }
+
+ $month = date('m', $nm);
+ $monthName = date('F', $nm);
+ return sprintf('%s, %s',
+ urlencode($month),
+ urlencode($year),
+ htmlentities($monthName),
+ htmlentities($year));
+})();
// Print out navigation links for previous and next month
echo '
| ', $prev_link, ' | ', - '', strftime('%B, %Y | ', $bom), + '', htmlentities(date('F, Y', $bom)), ' | ', '', $next_link, " |