]> CyberLeo.Net >> Repos - SourceForge/phpwiki.git/blob - lib/plugin/Calendar.php
*** empty log message ***
[SourceForge/phpwiki.git] / lib / plugin / Calendar.php
1 <?php // -*-php-*-
2 rcs_id('$Id: Calendar.php,v 1.2 2001-12-04 05:59:45 carstenklapp Exp $');
3
4 if (!defined('SECONDS_PER_DAY'))
5     define('SECONDS_PER_DAY', 24 * 3600);
6
7 // FIXME: Still needs:
8 //
9 //   o Better way to navigate to distant months.
10 //     (Maybe a form with selectors for month and year)?
11 //
12 //   o Docs.  Write a pgsrc/CalendarPlugin.
13 //
14 // It would be nice to have some way to get from the individual
15 // date pages back to the calendar page.  (Subpage support might
16 // make this easier.)
17
18 /**
19  */
20 class WikiPlugin_Calendar
21 extends WikiPlugin
22 {
23     var $name = 'Calendar';
24   
25     function getDefaultArguments() {
26         // FIXME: how to exclude multiple pages?
27         return array('prefix'           => '[pagename]:',
28                      'date_format'      => '%Y-%m-%d',
29                      'year'             => '',
30                      'month'            => '',
31                      'month_offset'     => 0,
32                      
33                      'month_format'     => '%B, %Y',
34                      'wday_format'      => '%a',
35                      'start_wday'       => '0');
36     }
37
38     function __header($pagename, $time)  {
39         $args = &$this->args;
40
41         $t = localtime($time - SECONDS_PER_DAY, 1);
42         $prev_url = WikiURL($pagename, array('month' => $t['tm_mon'] + 1,
43                                              'year' => $t['tm_year'] + 1900));
44         
45         $t = localtime($time + 32 * SECONDS_PER_DAY, 1);
46         $next_url = WikiURL($pagename, array('month' => $t['tm_mon'] + 1,
47                                              'year' => $t['tm_year'] + 1900));
48
49         $prev = QElement('a', array('href' => $prev_url,
50                                     'class' => 'cal-arrow',
51                                     'title' => gettext("Previous Month")),
52                          '<');
53         $next = QElement('a', array('href' => $next_url,
54                                     'class' => 'cal-arrow',
55                                     'title' => gettext("Next Month")),
56                          '>');
57
58
59         $row = Element('td', array('align' => 'left'), $prev);
60         $row .= Element('td', array('align' => 'center'),
61                         QElement('b', array('class' => 'cal-header'),
62                                  strftime($args['month_format'], $time)));
63         $row .= Element('td', array('align' => 'right'), $next);
64
65         $row =  Element('table', array('width' => '100%'),
66                         Element('tr', $row));
67
68         return Element('tr', Element('td', array('colspan' => 7,
69                                                  'align' => 'center'),
70                                      $row));
71     }
72     
73
74     function __daynames($start_wday) {
75         $time = mktime(12, 0, 0, 1, 1, 2001);
76         $t = localtime($time, 1);
77         $time += (7 + $start_wday - $t['tm_wday']) * SECONDS_PER_DAY;
78
79         $t = localtime($time, 1);
80         assert($t['tm_wday'] == $start_wday);
81         
82         $fs = $this->args['wday_format'];
83         for ($i = 0; $i < 7; $i++) {
84             $days[$i] = QElement('td', array('class' => 'cal-dayname',
85                                              'align' => 'center'),
86                                  strftime($fs, $time));
87             $time += SECONDS_PER_DAY;
88         }
89         return Element('tr', join('', $days));
90     }
91
92     function __date($dbi, $time) {
93         $args = &$this->args;
94
95         $page_for_date = $args['prefix'] . strftime($args['date_format'], $time);
96         $t = localtime($time, 1);
97         
98         if ($dbi->isWikiPage($page_for_date)) {
99             $date = Element('a', array('class' => 'cal-day',
100                                        'href'  => WikiURL($page_for_date),
101                                        'title' => $page_for_date),
102                             QElement('b', $t['tm_mday']));
103         }
104         else {
105             $date = QElement('a', array('class' => 'cal-hide',
106                                         'href'  => WikiURL($page_for_date,
107                                                            array('action' => 'edit')),
108                                         'title' => "Edit $page_for_date"),
109                              $t['tm_mday']);
110         }
111
112         return  Element('td', array('align' => 'center'),
113                         "&nbsp;${date}&nbsp;");
114     }
115             
116     function run($dbi, $argstr, $request) {
117         $this->args = $this->getArgs($argstr, $request);
118         $args = &$this->args;
119
120         $now = localtime(time(), 1);
121         foreach ( array('month' => $now['tm_mon'] + 1,
122                         'year' => $now['tm_year'] + 1900)
123                   as $param => $dflt) {
124             if (!($args[$param] = intval($args[$param])))
125                 $args[$param] = $dflt;
126             
127         }
128
129         $time = mktime(12, 0, 0,  // hh, mm, ss,
130                        $args['month'] + $args['month_offset'], // month (1-12)
131                        1, // mday (1-31)
132                        $args['year']);
133         
134         $rows[] = $this->__header($request->getArg('pagename'), $time);
135         $rows[] = $this->__daynames($args['start_wday']);
136
137         $t = localtime($time, 1);
138         $col = (7 + $t['tm_wday'] - $args['start_wday']) % 7;
139         $row = $col > 0 ? Element('td', array('colspan' => $col)) : '';
140         $done = false;
141         
142         while (!$done) {
143             $row .= $this->__date($dbi, $time);
144
145             if (++$col % 7 == 0) {
146                 $rows[] = Element('tr', $row);
147                 $col = 0;
148                 $row = '';
149             }
150             
151             $time += SECONDS_PER_DAY;
152             $t = localtime($time, 1);
153             $done = $t['tm_mday'] == 1;
154         }
155
156         if ($row) {
157             $row .= Element('td', array('colspan' => (42 - $col) % 7));
158             $rows[] = Element('tr', $row);
159         }
160         
161         return Element('table', array('cellspacing' => 0,
162                                       'cellpadding' => 2,
163                                       'class' => 'cal'),
164                        "\n" . join("\n", $rows) . "\n");
165     }
166 };
167
168 // For emacs users
169 // Local Variables:
170 // mode: php
171 // tab-width: 8
172 // c-basic-offset: 4
173 // c-hanging-comment-ender-p: nil
174 // indent-tabs-mode: nil
175 // End:
176 ?>