blog.module 16.5 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
function blog_feed_user($uid = 0, $date = 0) {
Dries's avatar
   
Dries committed
30
31
  global $user;

Dries's avatar
   
Dries committed
32
33
34
35
36
37
38
39
40
41
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }

  if (!$date) {
    $date = time();
  }
Dries's avatar
   
Dries committed
42

Dries's avatar
   
Dries committed
43
  $result = db_query("SELECT n.nid, n.title, n.timestamp, b.body, u.name, u.uid FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid WHERE u.uid = '$uid' AND n.timestamp > '". ($date - 2592000) ."' ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
   
Dries committed
44
45
46
47
48
49
  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";
Dries's avatar
   
Dries committed
50
  $output .= format_rss_channel("$account->name's blog", path_uri() ."module.php?mod=blog&op=view&id=$account->uid", "$account->name's blog", $items);
Dries's avatar
   
Dries committed
51
52
  $output .= "</rss>\n";

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

Dries's avatar
   
Dries committed
55
56
57
58
59
  print $output;

}

function blog_feed_last() {
Dries's avatar
   
Dries committed
60
  $result = db_query("SELECT n.nid, n.title, n.timestamp, b.body, u.name, u.uid FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
   
Dries committed
61
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
62
    $items .= format_rss_item($blog->title, path_uri() ."module.php?mod=blog&op=view&id=". urlencode($blog->uid), $blog->body);
Dries's avatar
   
Dries committed
63
64
65
66
67
68
69
  }

  $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
70
71
  header("Content-Type: text/xml");

Dries's avatar
   
Dries committed
72
73
74
75
  print $output;

}

Dries's avatar
   
Dries committed
76
function blog_page_user($uid = 0, $date = 0) {
Dries's avatar
   
Dries committed
77
78
  global $theme, $user;

Dries's avatar
   
Dries committed
79
80
81
82
83
84
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }
Dries's avatar
   
Dries committed
85

Dries's avatar
   
Dries committed
86
87
88
89
90
  if (!$date) {
    $date = time();
  }

  $result = db_query("SELECT n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body, u.uid, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid LEFT JOIN comments c ON n.nid = c.lid WHERE u.uid = '$account->uid' 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
91

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

Dries's avatar
   
Dries committed
94
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
95

Dries's avatar
   
Dries committed
96
97
    $links = array();

Dries's avatar
   
Dries committed
98
99
    if ($date != date("dny", $blog->timestamp)) {
      $date = date("dny", $blog->timestamp);
Dries's avatar
   
Dries committed
100
      $output .= "<tr><td colspan=\"2\"><b><a href=\"module.php?mod=blog&id=$blog->uid&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
101
102
    }

Dries's avatar
   
Dries committed
103
    if ($user->uid && $user->name == $name) {
Dries's avatar
   
Dries committed
104
105
106
      $links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
    }

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

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

    $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
118
  }
Dries's avatar
   
Dries committed
119

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

Dries's avatar
   
Dries committed
123
  $theme->box(sprintf(t("%s's blog"), $account->name), $output, "main");
Dries's avatar
   
Dries committed
124
125
}

Dries's avatar
Dries committed
126
function blog_page_last() {
Dries's avatar
   
Dries committed
127
  global $theme, $user;
Dries's avatar
   
Dries committed
128

Dries's avatar
   
Dries committed
129
  $result = db_query("SELECT n.nid, n.title, n.comment, COUNT(c.cid) AS comments, n.timestamp, b.body, u.uid, u.name FROM blog b LEFT JOIN node n ON b.nid = n.nid LEFT JOIN user u ON n.author = u.uid 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
130

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

Dries's avatar
   
Dries committed
133
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
134

Dries's avatar
   
Dries committed
135
136
    $links = array();

Dries's avatar
   
Dries committed
137
    $links[] = "<a href=\"module.php?mod=blog&op=view&id=$blog->uid\">". sprintf("%s's blog", $blog->name) ."</a>";
Dries's avatar
   
Dries committed
138

Dries's avatar
   
Dries committed
139
    if ($blog->uid == $user->uid) {
Dries's avatar
   
Dries committed
140
141
142
      $links[] = "<a href=\"submit.php?mod=blog&op=edit&id=$blog->nid\">". t("edit") ."</a>";
    }

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

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

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

Dries's avatar
   
Dries committed
154
  }
Dries's avatar
   
Dries committed
155

Dries's avatar
   
Dries committed
156
  $output .= "</table>";
Dries's avatar
   
Dries committed
157
  $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
158

Dries's avatar
   
Dries committed
159
  $theme->box(t("User blogs"), $output, "main");
Dries's avatar
   
Dries committed
160
161
162
163
164
}

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

Dries's avatar
   
Dries committed
165
166
  $blog = node_get_object(array(nid => $nid, type => "blog"));

Dries's avatar
   
Dries committed
167
  if ($blog && $blog->uid == $user->uid) {
Dries's avatar
   
Dries committed
168
169
    node_save(array(nid => $nid), array(status => $status[dumped]));
    node_del(array(type => "blog", nid => $nid));
Dries's avatar
   
Dries committed
170
171
172
  }
}

Dries's avatar
   
Dries committed
173
function blog_view($node, $main = 0) {
Dries's avatar
   
Dries committed
174
  global $theme;
Dries's avatar
   
Dries committed
175

Dries's avatar
   
Dries committed
176
  $theme->node($node, $main);
Dries's avatar
   
Dries committed
177
178
179
}

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

Dries's avatar
   
Dries committed
182
  if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
183
    if ($mod == "node" || $edit[type] == "blog") {
Dries's avatar
   
Dries committed
184
      // do nothing
Dries's avatar
   
Dries committed
185
186
187
188
    }
    else if ($type == "blog") {
      $item = node_get_object(array(type => "blog", nid => $id));
      $edit["title"] = $item->title;
Dries's avatar
   
Dries committed
189
      $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
190
191
192
193
    }
    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
194
      $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
195
    }
Dries's avatar
   
Dries committed
196

Dries's avatar
   
Dries committed
197
    if ($edit["title"]) {
Dries's avatar
   
Dries committed
198
199
      $form .= blog_view(new Blog(node_preview($edit)));
    }
Dries's avatar
   
Dries committed
200

Dries's avatar
   
Dries committed
201
202
203
204
    $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
205

Dries's avatar
   
Dries committed
206
207
208
    if ($edit["nid"] > 0) {
      $form .= form_hidden("nid", $edit["nid"]);
    }
Dries's avatar
   
Dries committed
209

Dries's avatar
   
Dries committed
210
211
212
213
    if (!$edit) {
      $form .= form_submit(t("Preview"));
    }
    else if ($edit && !$edit["title"]) {
Dries's avatar
   
Dries committed
214
215
216
217
218
219
220
221
222
223
224
      $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
225

Dries's avatar
   
Dries committed
226
    return form($REQUEST_URI, $form);
Dries's avatar
   
Dries committed
227
228
  }
  else {
Dries's avatar
   
Dries committed
229
    return message_access();
Dries's avatar
   
Dries committed
230
231
232
233
234
235
  }
}

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

Dries's avatar
   
Dries committed
236
  if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
237
238
    if ($edit["nid"]) {
      node_save($edit, array(title, body, type => "blog"));
Dries's avatar
   
Dries committed
239
240
    }
    else {
Dries's avatar
   
Dries committed
241
      node_save($edit, array(attributes => node_attributes_save("blog", $edit), author => $user->uid, 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
242
    }
Dries's avatar
   
Dries committed
243
244
245
246
247
248
  }
}

function blog_edit_history($nid) {
  global $user;

Dries's avatar
   
Dries committed
249
  $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 = '$user->uid' AND n.nid <= '". check_input($nid) ."' ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
   
Dries committed
250
251
252
253
254
255
256
257
258
259
260

  $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
261
  global $theme, $id, $op, $date;
Dries's avatar
Dries committed
262

Dries's avatar
   
Dries committed
263
  if (user_access("access blogs")) {
Dries's avatar
   
Dries committed
264
265
    switch ($op) {
      case "feed":
Dries's avatar
   
Dries committed
266
267
        if ($id) {
          blog_feed_user($id, $date);
Dries's avatar
   
Dries committed
268
269
270
271
272
273
        }
        else {
          blog_feed_last();
        }
        break;
      default:
Dries's avatar
Dries committed
274
        $theme->header();
Dries's avatar
   
Dries committed
275
276
        if ($id) {
          blog_page_user($id, $date);
Dries's avatar
   
Dries committed
277
278
279
280
        }
        else {
          blog_page_last();
        }
Dries's avatar
Dries committed
281
        $theme->footer();
Dries's avatar
   
Dries committed
282
283
    }
  }
Dries's avatar
   
Dries committed
284
  else {
Dries's avatar
Dries committed
285
    $theme->header();
Dries's avatar
Dries committed
286
    $theme->box(t("Access denied"), message_access());
Dries's avatar
Dries committed
287
    $theme->footer();
Dries's avatar
   
Dries committed
288
  }
Dries's avatar
Dries committed
289

Dries's avatar
   
Dries committed
290
291
292
}

function blog_user() {
Dries's avatar
   
Dries committed
293
  global $op, $id, $edit, $theme, $user;
Dries's avatar
   
Dries committed
294
295
296
297
298

  if (user_access("post blogs")) {
    switch ($op) {
      case "delete":
        blog_remove($id);
Dries's avatar
   
Dries committed
299
        blog_page_user($user->uid, time());
Dries's avatar
   
Dries committed
300
301
        break;
      case "edit":
Dries's avatar
   
Dries committed
302
303
        $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
304
305
        break;
      case t("Preview"):
Dries's avatar
   
Dries committed
306
        $theme->box(t("Preview Blog"), blog_form($edit), "main");
Dries's avatar
   
Dries committed
307
308
309
        break;
      case t("Submit"):
        blog_save($edit);
Dries's avatar
   
Dries committed
310
        blog_page_user($user->uid, time());
Dries's avatar
   
Dries committed
311
312
        break;
      default:
Dries's avatar
   
Dries committed
313
        $theme->box(t("Submit a blog"), blog_form($edit), "main");
Dries's avatar
   
Dries committed
314
315
316
317
318
    }
  }
}


Dries's avatar
   
Dries committed
319
function blog_link($type, $node = 0) {
Dries's avatar
   
Dries committed
320
321
322
  global $user;

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

  if ($type == "menu" && user_access("post blogs")) {
Dries's avatar
   
Dries committed
327
    $links[] = "<a href=\"submit.php?mod=blog\">". t("add blog entry") ."</a>";
Dries's avatar
   
Dries committed
328
    $links[] = "<a href=\"module.php?mod=blog&op=view&id=$user->uid\">". t("view your blog") ."</a>";
Dries's avatar
   
Dries committed
329
330
  }

Dries's avatar
   
Dries committed
331
  if ($type == "node" && $node->type == "blog") {
Dries's avatar
   
Dries committed
332
    $links[] = "<a href=\"module.php?mod=blog&op=view&id=$node->uid\">". strtr(t("%a's blog"), array("%a" => $node->name)) ."</a>";
Dries's avatar
   
Dries committed
333
334
  }

Dries's avatar
   
Dries committed
335
336
337
338
339
  return $links ? $links : array();
}


function blog_block() {
Dries's avatar
   
Dries committed
340
341
342
  global $user;

  $result = db_query("SELECT u.uid, u.name, n.timestamp, n.title, n.nid FROM node n LEFT JOIN user u ON n.author = u.uid WHERE n.type = 'blog' ORDER BY n.nid DESC LIMIT 10");
Dries's avatar
   
Dries committed
343
344

  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
345
    $output .= "<a href=\"module.php?mod=blog&op=view&id=$node->nid\">". check_output($node->title) ."</a><br />\n";
Dries's avatar
   
Dries committed
346
347
  }

Dries's avatar
   
Dries committed
348
  $block[0]["subject"] = "<a href=\"module.php?mod=blog\">". t("User blogs") ."</a>";
Dries's avatar
   
Dries committed
349
  $block[0]["content"] = $output;
Dries's avatar
   
Dries committed
350
  $block[0]["info"] = t("User blogs");
Dries's avatar
   
Dries committed
351
352
353
354
355
356
357
  $block[0]["link"] = "module.php?mod=blog";

  return $block;
}


function blog_search($keys) {
Dries's avatar
   
Dries committed
358
  global $PHP_SELF, $status;
Dries's avatar
   
Dries committed
359

Dries's avatar
   
Dries committed
360
361
  $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
362
    $find[$i++] = array("title" => check_output($blog->title), "link" => ($PHP_SELF == "/admin.php" ? "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
363
364
365
366
367
368
  }
  return $find;
}

class BlogCalendar {
  var $date;
Dries's avatar
   
Dries committed
369
  var $name;
Dries's avatar
   
Dries committed
370

Dries's avatar
   
Dries committed
371
372
  function BlogCalendar($name, $date) {
    $this->name = urlencode($name);
Dries's avatar
   
Dries committed
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
400
401
402
403
404
405
406

    // 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
407
    $output .= " <TR><TD ALIGN=\"center\" COLSPAN=\"7\"><B><A HREF=\"module.php?mod=blog&name=". urlencode($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=". urlencode($this->name) ."&date=$next\" STYLE=\"text-decoration: none;\">&gt;&gt;</A>" : "&gt;&gt;") . "<B></TD></TR>\n";
Dries's avatar
   
Dries committed
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435

    // 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
436
      else $output .= "  <TD ALIGN=\"center\"><A HREF=\"module.php?mod=blog&name=". urlencode($this->name) ."&date=$date\" STYLE=\"text-decoration: none;\">$nday</A></TD>\n";
Dries's avatar
   
Dries committed
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459

      // 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;
  }
}

?>