blog.module 16.9 KB
Newer Older
Dries's avatar
 
Dries committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

class Blog {
  function Blog($blog) {
    global $user;
    $this = new Node($blog);
    $this->body = $blog[body];
  }
}

function blog_help() {
 ?>
  <p>Drupal's blog module allows registered users to maintain an online blog or diary.  It provides easy-to-write and easy-to-read online diaries or journals that can be filled with daily thoughts, poetry, boneless blabber, spiritual theories, intimate details, valuable experiences, cynical rants, semi-coherent comments, writing experiments, artistic babblings, critics on current facts, fresh insights, diverse dreams, chronicles and mumbling madness available for public consumption.</p>
 <?php
}

function blog_perm() {
  return array("administer blogs", "access blogs", "post blogs");
}

Dries's avatar
   
Dries committed
21
22
function blog_status() {
  return array(dumped, posted);
Dries's avatar
 
Dries committed
23
24
}

Dries's avatar
   
Dries committed
25
26
27
28
function blog_summary($node) {
  return $node->body;
}

Dries's avatar
   
Dries committed
29
30
31
function blog_feed_user($name = 0, $date = 0) {
  global $user;

Dries's avatar
   
Dries committed
32
  $name = check_input($name ? $name : $user->name);
Dries's avatar
   
Dries committed
33
34
  $date = check_input($date ? $date : time());

Dries's avatar
   
Dries committed
35
  $result = db_query("SELECT n.nid, n.title, n.timestamp, b.body FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN users u ON n.author = u.id WHERE u.name = '$name' AND n.timestamp > '". ($date - 2592000) ."' ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
   
Dries committed
36
37
38
39
40
41
42
43
44
  while ($blog = db_fetch_object($result)) {
    $items .= format_rss_item($blog->title, path_uri() ."node.php?id=$blog->nid", $blog->body);
  }

  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
  $output .= "<rss version=\"0.91\">\n";
  $output .= format_rss_channel("$name's blog", path_uri() ."module.php?mod=blog&op=view&name=". urlencode($name), "$name's blog", $items);
  $output .= "</rss>\n";

Dries's avatar
   
Dries committed
45
46
  header("Content-Type: text/xml");

Dries's avatar
   
Dries committed
47
48
49
50
51
  print $output;

}

function blog_feed_last() {
Dries's avatar
   
Dries committed
52
  $result = db_query("SELECT n.nid, n.title, n.timestamp, b.body, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN users u ON n.author = u.id ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
   
Dries committed
53
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
54
    $items .= format_rss_item($blog->title, path_uri() ."module.php?mod=blog&op=view&name=". urlencode($blog->name), $blog->body);
Dries's avatar
   
Dries committed
55
56
57
58
59
60
61
  }

  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
  $output .= "<rss version=\"0.91\">\n";
  $output .= format_rss_channel(variable_get("site_name", "drupal") .": user blogs", path_uri() ."module.php?mod=blog", "Recently updated blogs.", $items);
  $output .= "</rss>\n";

Dries's avatar
   
Dries committed
62
63
  header("Content-Type: text/xml");

Dries's avatar
   
Dries committed
64
65
66
67
  print $output;

}

Dries's avatar
   
Dries committed
68
function blog_page_user($name = 0, $date = 0) {
Dries's avatar
 
Dries committed
69
70
  global $theme, $user;

Dries's avatar
   
Dries committed
71
  $name = check_input($name ? $name : $user->name);
Dries's avatar
   
Dries committed
72
  $date = check_input($date ? $date : time());
Dries's avatar
 
Dries committed
73

Dries's avatar
   
Dries committed
74
  $result = db_query("SELECT n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN users u ON n.author = u.id LEFT JOIN comments c ON n.nid = c.lid WHERE u.name = '$name' AND n.timestamp < '$date' AND n.timestamp > '". ($date - 2592000) ."' GROUP BY n.nid ORDER BY n.nid DESC LIMIT 20");
Dries's avatar
 
Dries committed
75

Dries's avatar
   
Dries committed
76
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
Dries's avatar
   
Dries committed
77

Dries's avatar
   
Dries committed
78
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
79

Dries's avatar
   
Dries committed
80
81
    $links = array();

Dries's avatar
   
Dries committed
82
83
    if ($date != date("dny", $blog->timestamp)) {
      $date = date("dny", $blog->timestamp);
Dries's avatar
   
Dries committed
84
85
86
      $output .= "<tr><td colspan=\"2\"><b><a href=\"module.php?mod=blog&name=$name&date=". mktime(23, 59, 59, date("n", $blog->timestamp), date("d", $blog->timestamp), date("Y", $blog->timestamp)) ."\">". format_date($blog->timestamp, custom, "d M Y") .":</a></b></td></tr>";
    }

Dries's avatar
   
Dries committed
87
    if ($user->id && $user->name == $name) {
Dries's avatar
   
Dries committed
88
89
90
91
      $links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
    }

    if ($user->id && user_access("post blogs")) {
Dries's avatar
   
Dries committed
92
      $links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
Dries's avatar
   
Dries committed
93
94
95
    }

    if ($blog->comment) {
Dries's avatar
   
Dries committed
96
      $links[] = "<a href=\"node.php?id=$blog->nid\">". format_plural($blog->comments, t("comment"), t("comments")) ."</a>";
Dries's avatar
   
Dries committed
97
98
99
100
101
    }

    $output .= "<tr><td><div style=\"margin-left: 20px;\"><b>". check_output($blog->title) ."</b></div></td><td align=\"right\">". $theme->links($links) ."</td></tr>";
    $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 40px;\">". check_output($blog->body, 1) ."</div><br /></td></tr>";

Dries's avatar
 
Dries committed
102
  }
Dries's avatar
   
Dries committed
103

Dries's avatar
   
Dries committed
104
  $output .= "</table>";
Dries's avatar
   
Dries committed
105
  $output .= "<a href=\"module.php?mod=blog&op=feed&name=". urlencode($name) ."\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" /></a>\n";
Dries's avatar
   
Dries committed
106
107

  $theme->box(strtr(t("%a's blog"), array("%a" => $name)), $output, "main");
Dries's avatar
 
Dries committed
108
109
}

Dries's avatar
Dries committed
110
function blog_page_last() {
Dries's avatar
   
Dries committed
111
  global $theme, $user;
Dries's avatar
 
Dries committed
112

Dries's avatar
   
Dries committed
113
  $result = db_query("SELECT n.author, n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN users u ON n.author = u.id LEFT JOIN comments c ON n.nid = c.lid GROUP BY n.nid ORDER BY n.nid DESC LIMIT 20");
Dries's avatar
 
Dries committed
114

Dries's avatar
   
Dries committed
115
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"4\">";
Dries's avatar
   
Dries committed
116

Dries's avatar
 
Dries committed
117
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
118

Dries's avatar
   
Dries committed
119
120
    $links = array();

Dries's avatar
   
Dries committed
121
    $links[] = "<a href=\"module.php?mod=blog&op=view&name=". urlencode($blog->name) ."\">". strtr(t("%a's blog"), array("%a" => $blog->name)) ."</a>";
Dries's avatar
   
Dries committed
122
123
124
125
126
127

    if ($blog->author == $user->id) {
      $links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
    }

    if ($user->id && user_access("post blogs")) {
Dries's avatar
   
Dries committed
128
      $links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
Dries's avatar
   
Dries committed
129
130
131
    }

    if ($blog->comment) {
Dries's avatar
   
Dries committed
132
      $links[] = "<a href=\"node.php?id=$blog->nid\">". format_plural($blog->comments, t("comment"), t("comments")) ."</a>";
Dries's avatar
   
Dries committed
133
    }
Dries's avatar
 
Dries committed
134

Dries's avatar
   
Dries committed
135
    $output .= "<tr><td><b>". check_output($blog->title) ."</b></td><td align=\"right\">". $theme->links($links) ."</td></tr>";
Dries's avatar
Dries committed
136
    $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">". check_output($blog->body, 1) ."</div><br /></td></tr>";
Dries's avatar
   
Dries committed
137

Dries's avatar
 
Dries committed
138
  }
Dries's avatar
   
Dries committed
139

Dries's avatar
   
Dries committed
140
  $output .= "</table>";
Dries's avatar
   
Dries committed
141
  $output .= "<a href=\"module.php?mod=blog&op=feed\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" /></a>\n";
Dries's avatar
 
Dries committed
142

Dries's avatar
   
Dries committed
143
  $theme->box(t("User blogs"), $output, "main");
Dries's avatar
 
Dries committed
144
145
146
147
148
}

function blog_remove($nid) {
  global $status, $user;

Dries's avatar
   
Dries committed
149
150
151
152
153
  $blog = node_get_object(array(nid => $nid, type => "blog"));

  if ($blog && $blog->author == $user->id) {
    node_save(array(nid => $nid), array(status => $status[dumped]));
    node_del(array(type => "blog", nid => $nid));
Dries's avatar
 
Dries committed
154
155
156
  }
}

Dries's avatar
   
Dries committed
157
function blog_view($node, $main = 0) {
Dries's avatar
   
Dries committed
158
  global $theme;
Dries's avatar
 
Dries committed
159

Dries's avatar
   
Dries committed
160
  $theme->node($node, $main);
Dries's avatar
 
Dries committed
161
162
163
}

function blog_form($edit = array()) {
Dries's avatar
   
Dries committed
164
  global $REQUEST_URI, $id, $mod, $type, $user, $theme;
Dries's avatar
 
Dries committed
165

Dries's avatar
   
Dries committed
166
  if ($user->id && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
167
    if ($mod == "node" || $edit[type] == "blog") {
Dries's avatar
   
Dries committed
168
      // do nothing
Dries's avatar
   
Dries committed
169
170
171
172
    }
    else if ($type == "blog") {
      $item = node_get_object(array(type => "blog", nid => $id));
      $edit["title"] = $item->title;
Dries's avatar
   
Dries committed
173
      $edit["body"] = "<i>". $item->body ."</i> [<a href=\"module.php?mod=blog&name=". urlencode($item->name) ."&date=$item->timestamp\">$item->name</a>]";
Dries's avatar
   
Dries committed
174
175
176
177
    }
    else if ($type == "import") {
      $item = db_fetch_object(db_query("SELECT i.*, f.title as ftitle, f.link as flink FROM item i, feed f WHERE i.iid = '". check_input($id) ."' AND i.fid = f.fid"));
      $edit["title"] = $item->title;
Dries's avatar
   
Dries committed
178
      $edit["body"] = "<a href=\"$item->link\">$item->title</a> - <i>". check_output($item->description) ."</i> [<a href=\"$item->flink\">$item->ftitle</a>]\n";
Dries's avatar
   
Dries committed
179
    }
Dries's avatar
 
Dries committed
180

Dries's avatar
   
Dries committed
181
    if ($edit["title"]) {
Dries's avatar
   
Dries committed
182
183
      $form .= blog_view(new Blog(node_preview($edit)));
    }
Dries's avatar
   
Dries committed
184

Dries's avatar
   
Dries committed
185
186
187
188
    $form .= form_textfield(t("Subject"), "title", $edit["title"], 50, 64);
    $form .= form_textarea(t("Body"), "body", $edit["body"], 70, 15, t("Allowed HTML tags") .": ". htmlspecialchars(variable_get("allowed_html", "")));

    $form .= form_hidden("type", "blog");
Dries's avatar
   
Dries committed
189

Dries's avatar
   
Dries committed
190
191
192
    if ($edit["nid"] > 0) {
      $form .= form_hidden("nid", $edit["nid"]);
    }
Dries's avatar
 
Dries committed
193

Dries's avatar
   
Dries committed
194
195
196
197
    if (!$edit) {
      $form .= form_submit(t("Preview"));
    }
    else if ($edit && !$edit["title"]) {
Dries's avatar
   
Dries committed
198
199
200
201
202
203
204
205
206
207
208
      $form .= "<font color=\"red\">". t("Warning: you did not supply a subject.") ."</font><p>\n";
      $form .= form_submit(t("Preview"));
    }
    else if ($edit && !$edit["body"]) {
      $form .= "<font color=\"red\">". t("Warning: you did not supply any text.") ."</font><p>\n";
      $form .= form_submit(t("Preview"));
    }
    else {
      $form .= form_submit(t("Preview"));
      $form .= form_submit(t("Submit"));
    }
Dries's avatar
   
Dries committed
209

Dries's avatar
   
Dries committed
210
    return form($REQUEST_URI, $form);
Dries's avatar
 
Dries committed
211
212
  }
  else {
Dries's avatar
   
Dries committed
213
    return message_access();
Dries's avatar
 
Dries committed
214
215
216
217
218
219
  }
}

function blog_save($edit) {
  global $status, $user;

Dries's avatar
   
Dries committed
220
  if ($user->id && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
221
222
    if ($edit["nid"]) {
      node_save($edit, array(title, body, type => "blog"));
Dries's avatar
   
Dries committed
223
224
    }
    else {
Dries's avatar
   
Dries committed
225
      node_save($edit, array(attributes => node_attributes_save("blog", $edit), author => $user->id, body, comment => variable_get("blog_comment", 0), moderate => variable_get("blog_moderate", ""), promote => variable_get("blog_promote", 0), score => 0, status => variable_get("blog_status", $status[posted]), timestamp => time(), title, type => "blog", votes => 0));
Dries's avatar
   
Dries committed
226
    }
Dries's avatar
 
Dries committed
227
228
229
230
231
232
  }
}

function blog_edit_history($nid) {
  global $user;

Dries's avatar
   
Dries committed
233
  $result = db_query("SELECT n.nid, n.title, n.timestamp, b.body FROM blog b LEFT JOIN node n ON b.nid = n.nid WHERE n.author = '". check_input($user->id) ."' AND n.nid <= '". check_input($nid) ."' ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
 
Dries committed
234
235
236
237
238
239
240
241
242
243
244

  $output .= "<table cellpadding=\"3\" cellspacing=\"3\" border=\"0\" width=\"100%\">";
  while ($blog = db_fetch_object($result)) {
    $output .= "<tr><td><b>". check_output($blog->title) ."</b><br />". check_output($blog->body, 1) ."</td><td><a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a></td><td><a href=\"submit.php?mod=blog&op=delete&id=$blog->nid\">". t("delete") ."</a></td></tr>\n";
  }
  $output .= "</table>";

  return $output;
}

function blog_page() {
Dries's avatar
Dries committed
245
246
  global $theme, $op, $name, $date;

Dries's avatar
 
Dries committed
247
  if (user_access("access blogs")) {
Dries's avatar
   
Dries committed
248
249
250
251
252
253
254
255
256
257
    switch ($op) {
      case "feed":
        if ($name) {
          blog_feed_user($name, $date);
        }
        else {
          blog_feed_last();
        }
        break;
      default:
Dries's avatar
Dries committed
258
        $theme->header();
Dries's avatar
   
Dries committed
259
260
261
262
263
264
        if ($name) {
          blog_page_user($name, $date);
        }
        else {
          blog_page_last();
        }
Dries's avatar
Dries committed
265
        $theme->footer();
Dries's avatar
 
Dries committed
266
267
    }
  }
Dries's avatar
   
Dries committed
268
  else {
Dries's avatar
Dries committed
269
    $theme->header();
Dries's avatar
Dries committed
270
    $theme->box(t("Access denied"), message_access());
Dries's avatar
Dries committed
271
    $theme->footer();
Dries's avatar
   
Dries committed
272
  }
Dries's avatar
Dries committed
273

Dries's avatar
 
Dries committed
274
275
276
}

function blog_user() {
Dries's avatar
   
Dries committed
277
  global $op, $id, $edit, $theme, $user;
Dries's avatar
 
Dries committed
278
279
280
281
282

  if (user_access("post blogs")) {
    switch ($op) {
      case "delete":
        blog_remove($id);
Dries's avatar
   
Dries committed
283
        blog_page_user($user->name, time());
Dries's avatar
 
Dries committed
284
285
        break;
      case "edit":
Dries's avatar
   
Dries committed
286
287
        $theme->box(t("Submit a blog"), blog_form(node_get_array(array("nid" => $id, "type" => "blog"))), "main");
        $theme->box(t("Older blogs"), blog_edit_history($id), "main");
Dries's avatar
 
Dries committed
288
289
        break;
      case t("Preview"):
Dries's avatar
   
Dries committed
290
        $theme->box(t("Preview Blog"), blog_form($edit), "main");
Dries's avatar
 
Dries committed
291
292
293
        break;
      case t("Submit"):
        blog_save($edit);
Dries's avatar
   
Dries committed
294
        blog_page_user($user->name, time());
Dries's avatar
 
Dries committed
295
296
        break;
      default:
Dries's avatar
   
Dries committed
297
        $theme->box(t("Submit a blog"), blog_form($edit), "main");
Dries's avatar
 
Dries committed
298
299
300
301
302
    }
  }
}


Dries's avatar
   
Dries committed
303
function blog_link($type, $node = 0) {
Dries's avatar
 
Dries committed
304
305
306
  global $user;

  if ($type == "page" && user_access("access blogs")) {
Dries's avatar
   
Dries committed
307
    $links[] = "<a href=\"module.php?mod=blog\">". t("user blogs") ."</a>";
Dries's avatar
 
Dries committed
308
309
310
  }

  if ($type == "menu" && user_access("post blogs")) {
Dries's avatar
   
Dries committed
311
    $links[] = "<a href=\"submit.php?mod=blog\">". t("add blog entry") ."</a>";
Dries's avatar
   
Dries committed
312
    $links[] = "<a href=\"module.php?mod=blog&op=view&name=". urlencode($user->name) ."\">". t("view your blog") ."</a>";
Dries's avatar
 
Dries committed
313
314
  }

Dries's avatar
   
Dries committed
315
  if ($type == "node" && $node->type == "blog") {
Dries's avatar
   
Dries committed
316
    $links[] = "<a href=\"module.php?mod=blog&op=view&name=". urlencode($node->name) ."\">". strtr(t("%a's blog"), array("%a" => $node->name)) ."</a>";
Dries's avatar
   
Dries committed
317
318
  }

Dries's avatar
 
Dries committed
319
320
321
322
323
324
325
  return $links ? $links : array();
}


function blog_block() {
  global $name, $date, $user, $mod;

Dries's avatar
   
Dries committed
326
  $result = db_query("SELECT u.name, n.timestamp, n.title, n.nid FROM node n LEFT JOIN users u ON n.author = u.id WHERE n.type = 'blog' ORDER BY n.nid DESC LIMIT 10");
Dries's avatar
 
Dries committed
327
  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
328
    $output .= "<a href=\"module.php?mod=blog&op=view&name=". urlencode($node->name) ."\">". check_output($node->title) ."<br />\n";
Dries's avatar
 
Dries committed
329
330
  }

Dries's avatar
   
Dries committed
331
  $block[0]["subject"] = "<a href=\"module.php?mod=blog\">". t("User blogs") ."</a>";
Dries's avatar
 
Dries committed
332
  $block[0]["content"] = $output;
Dries's avatar
   
Dries committed
333
  $block[0]["info"] = t("User blogs");
Dries's avatar
 
Dries committed
334
335
  $block[0]["link"] = "module.php?mod=blog";

Kjartan's avatar
Kjartan committed
336
  $date = $date ? $date : time();
Dries's avatar
   
Dries committed
337
  $name = $name ? $name : $user->name;
Dries's avatar
 
Dries committed
338
339
340

  if (($mod == "blog") || ($mod == "block")) {
       // Only show this block on "blog pages" and in the admin block section.
Dries's avatar
   
Dries committed
341
342
    $calendar = new BlogCalendar($name, $date);
    $block[1]["subject"] = "<a href=\"module.php?mod=blog&name=". urlencode($name) ."\">" . t("Browse blog") . "</a>";
Dries's avatar
 
Dries committed
343
344
345
346
347
348
349
350
351
352
353
354
    $block[1]["content"] = $calendar->display();
    $block[1]["info"] = t("Calendar to browse blogs");
  }

  return $block;
}


function blog_search($keys) {
  global $status, $user;
  $result = db_query("SELECT n.*, b.* FROM blog b LEFT JOIN node n ON n.nid = b.nid AND n.lid = b.lid WHERE (n.title LIKE '%$keys%' OR b.body LIKE '%$keys%') ORDER BY n.timestamp DESC LIMIT 20");
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
355
    $find[$i++] = array("title" => check_output($blog->title), "link" => (user_access("administer nodes") ? "admin.php?mod=node&type=blog&op=edit&id=$blog->nid" : "node.php?id=$blog->nid"), "user" => $blog->name, "date" => $blog->timestamp);
Dries's avatar
 
Dries committed
356
357
358
359
360
361
  }
  return $find;
}

class BlogCalendar {
  var $date;
Dries's avatar
   
Dries committed
362
  var $name;
Dries's avatar
 
Dries committed
363

Dries's avatar
   
Dries committed
364
365
  function BlogCalendar($name, $date) {
    $this->name = urlencode($name);
Dries's avatar
 
Dries committed
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399

    // Prevent future dates:
    $today = mktime(23, 59, 59, date("n", time()), date("d", time()), date("Y", time()));
    $this->date = (($date && $date <= $today) ? $date : $today);
    $this->date = mktime(23, 59, 59, date("n", $this->date), date("d", $this->date), date("Y", $this->date));
  }

  function display() {
    // Extract information from the given date:
    $month  = date("n", $this->date);
    $year = date("Y", $this->date);
    $day = date("d", $this->date);

    // Extract today's date:
    $today = mktime(23, 59, 59, date("n", time()), date("d", time()), date("Y", time()));

    // Extract the timestamp of the last day of today's month:
    $thislast = mktime(23, 59, 59, date("n", time()), date("t", time()), date("Y", time()));

    // Extract first day of the month:
    $first = date("w", mktime(0, 0, 0, $month, 1, $year));

    // Extract last day of the month:
    $last = date("t", mktime(0, 0, 0, $month, 1, $year));

    // Calculate previous and next months dates and check for shorter months (28/30 days)
    $prevmonth = mktime(23, 59, 59, $month - 1, 1, $year);
    $prev = mktime(23, 59, 59, $month - 1, min(date("t", $prevmonth), $day), $year);
    $nextmonth = mktime(23, 59, 59, $month + 1, 1, $year);
    $next = mktime(23, 59, 59, $month + 1, min(date("t", $nextmonth), $day), $year);

    // Generate calendar header:
    $output .= "\n<!-- calendar -->\n";
    $output .= "<TABLE WIDTH=\"100%\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"1\">\n";
Dries's avatar
   
Dries committed
400
    $output .= " <TR><TD ALIGN=\"center\" COLSPAN=\"7\"><B><A HREF=\"module.php?mod=blog&name=$this->name&date=$prev\" STYLE=\"text-decoration: none;\">&lt;&lt;</A> &nbsp; ". date("F Y", $this->date) ." &nbsp; " . ($next <= $thislast ? "<A HREF=\"module.php?mod=blog&name=$this->name&date=$next\" STYLE=\"text-decoration: none;\">&gt;&gt;</A>" : "&gt;&gt;") . "<B></TD></TR>\n";
Dries's avatar
 
Dries committed
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428

    // Generate the days of the week:
    $output .= " <TR>";
    $somesunday = mktime(0, 0, 0, 3, 20, 1994);
    for ($i = 0; $i < 7; $i++) {
      $output .= "<TD ALIGN=\"center\">" . substr(ucfirst(t(date("l", $somesunday + $i * 86400))), 0, 1) . "</TD>";
    }
    $output .= "</TR>\n";

    // Initialize temporary variables:
    $nday = 1;
    $sday = $first;

    // Loop through all the days of the month:
    while ($nday <= $last) {
      // Set up blank days for first week of the month:
      if ($first) {
        $output .= " <TR><TD COLSPAN=\"$first\">&nbsp</TD>\n";
        $first = 0;
      }

      // Start every week on a new line:
      if ($sday == 0) $output .=  " <TR>\n";

      // Print one cell:
      $date = mktime(23, 59, 59, $month, $nday, $year);
      if ($date == $this->date) $output .= "  <TD ALIGN=\"center\" BGCOLOR=\"#CCCCCC\"><B>$nday</B></TD>\n";
      else if ($date > $today) $output .= "  <TD ALIGN=\"center\">$nday</TD>\n";
Dries's avatar
   
Dries committed
429
      else $output .= "  <TD ALIGN=\"center\"><A HREF=\"module.php?mod=blog&name=$this->name&date=$date\" STYLE=\"text-decoration: none;\">$nday</A></TD>\n";
Dries's avatar
 
Dries committed
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452

      // Start every week on a new line:
      if ($sday == 6) $output .=  " </TR>\n";

      // Update temporary variables:
      $sday++;
      $sday = $sday % 7;
      $nday++;
    }

    // Complete the calendar:
    if ($sday) {
      $end = 7 - $sday;
      $output .= "  <TD COLSPAN=\"$end\">&nbsp;</TD>\n </TR>\n";
    }
    $output .= "</TABLE>\n\n";

    // Return calendar:
    return $output;
  }
}

?>