2 rcs_id('$Id: Calendar.php,v 1.17 2002-02-06 02:41:25 carstenklapp Exp $');
4 if (!defined('SECONDS_PER_DAY'))
5 define('SECONDS_PER_DAY', 24 * 3600);
9 // o Better way to navigate to distant months.
10 // (Maybe a form with selectors for month and year)?
12 // o Docs. Write a pgsrc/CalendarPlugin.
14 // It would be nice to have some way to get from the individual date
15 // pages back to the calendar page. (Subpage support might make this
19 * A class representing a clickable day "button".
21 class DayButton extends HtmlElement {
25 function DayButton ($page_for_date, $mday, $isWikiPage, $istoday) {
27 $this->HtmlElement('td', array('align' => 'center'));
31 $title = $page_for_date;
32 $mday = HTML::em($mday);
36 $title = sprintf(_("Edit %s"), $page_for_date);
39 $mday = HTML::strong($mday);
40 $this->setAttr('class', 'cal-today');
42 $url = WikiURL($page_for_date, array('action' => 'edit'));
43 $this->pushContent(HTML::a(array('href' => $url,
45 'title' => $title), $mday));
52 class WikiPlugin_Calendar
59 function getDescription () {
63 function getDefaultArguments() {
64 return array('prefix' => '[pagename].',
65 'date_format' => '%Y-%m-%d',
70 'month_format' => '%B, %Y',
71 'wday_format' => '%a',
75 function __header($pagename, $time) {
78 $t = localtime($time - SECONDS_PER_DAY, 1);
79 $prev_url = WikiURL($pagename, array('month' => $t['tm_mon'] + 1,
80 'year' => $t['tm_year'] + 1900));
82 $t = localtime($time + 32 * SECONDS_PER_DAY, 1);
83 $next_url = WikiURL($pagename, array('month' => $t['tm_mon'] + 1,
84 'year' => $t['tm_year'] + 1900));
86 $prev = HTML::a(array('href' => $prev_url,
87 'class' => 'cal-arrow',
88 'title' => _("Previous Month")),
90 $next = HTML::a(array('href' => $next_url,
91 'class' => 'cal-arrow',
92 'title' => _("Next Month")),
96 $row = HTML::tr(HTML::td(array('align' => 'left'), $prev),
97 HTML::td(array('align' => 'center'),
98 HTML::strong(array('class' => 'cal-header'),
99 strftime($args['month_format'], $time))),
100 HTML::td(array('align' => 'right'), $next));
102 return HTML::tr(HTML::td(array('colspan' => 7,
103 'align' => 'center'),
104 HTML::table(array('width' => '100%',
105 'class' => 'cal-header'), $row)));
109 function __daynames($start_wday) {
110 $time = mktime(12, 0, 0, 1, 1, 2001);
111 $t = localtime($time, 1);
112 $time += (7 + $start_wday - $t['tm_wday']) * SECONDS_PER_DAY;
114 $t = localtime($time, 1);
115 assert($t['tm_wday'] == $start_wday);
117 $fs = $this->args['wday_format'];
119 for ($i = 0; $i < 7; $i++) {
120 $row->pushContent(HTML::td(array('class' => 'cal-dayname',
121 'align' => 'center'),
122 strftime($fs, $time)));
123 $time += SECONDS_PER_DAY;
128 function __date($dbi, $time) {
129 $args = &$this->args;
131 $page_for_date = $args['prefix'] . strftime($args['date_format'],
133 $t = localtime($time, 1);
134 $mday = $t['tm_mday'];
136 $isWikiPage = $dbi->isWikiPage($page_for_date);
137 $istoday = $mday == $this->_today;
139 return new DayButton($page_for_date, $mday, $isWikiPage, $istoday);
142 function run($dbi, $argstr, $request) {
143 $this->args = $this->getArgs($argstr, $request);
144 $args = &$this->args;
146 $now = localtime(time(), 1);
147 foreach ( array('month' => $now['tm_mon'] + 1,
148 'year' => $now['tm_year'] + 1900)
149 as $param => $dflt ) {
151 if (!($args[$param] = intval($args[$param])))
152 $args[$param] = $dflt;
156 $time = mktime(12, 0, 0, // hh, mm, ss,
157 $args['month'] + $args['month_offset'], // month (1-12)
161 $cal = HTML::table(array('cellspacing' => 0,
164 $this->__header($request->getArg('pagename'), $time),
165 $this->__daynames($args['start_wday']));
167 $t = localtime($time, 1);
168 $now = localtime(time(), 1);
170 if ($now['tm_year'] == $t['tm_year'] && $now['tm_mon'] == $t['tm_mon'])
171 $this->_today = $now['tm_mday'];
173 $this->_today = false;
178 $col = (7 + $t['tm_wday'] - $args['start_wday']) % 7;
180 $row->pushContent(HTML::td(array('colspan' => $col)));
184 $row->pushContent($this->__date($dbi, $time));
186 if (++$col % 7 == 0) {
187 $cal->pushContent($row);
192 $time += SECONDS_PER_DAY;
193 $t = localtime($time, 1);
194 $done = $t['tm_mday'] == 1;
197 if ($row->getContent()) {
198 $row->pushContent(HTML::td(array('colspan' => (42 - $col) % 7)));
199 $cal->pushContent($row);
210 // c-hanging-comment-ender-p: nil
211 // indent-tabs-mode: nil