blog.module 17 KB
Newer Older
Dries's avatar
   
Dries committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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
}

Dries's avatar
   
Dries committed
17
18
19
20
21
22
23
24
25
function blog_cron() {
  $result = db_query("SELECT n.nid, n.timestamp, SUM(m.score) / COUNT(m.cid) AS score, COUNT(m.cid) AS votes FROM node n LEFT JOIN moderate m ON m.nid = n.nid WHERE n.type = 'blog' AND n.status = '". node_status("posted") ."' GROUP BY n.nid ORDER BY n.timestamp DESC LIMIT 30");
  while ($node = db_fetch_object($result)) {
    if ($node->score > 3 && $node->votes > 4) {
      db_query("UPDATE node SET promote = '1' WHERE nid = '$node->nid'");
    }
  }
}

Dries's avatar
   
Dries committed
26
27
28
29
function blog_perm() {
  return array("administer blogs", "access blogs", "post blogs");
}

Dries's avatar
   
Dries committed
30
31
function blog_status() {
  return array(dumped, posted);
Dries's avatar
   
Dries committed
32
33
}

Dries's avatar
   
Dries committed
34
35
36
37
function blog_summary($node) {
  return $node->body;
}

Dries's avatar
   
Dries committed
38
function blog_feed_user($uid = 0, $date = 0) {
Dries's avatar
   
Dries committed
39
40
  global $user;

Dries's avatar
   
Dries committed
41
42
43
44
45
46
47
48
49
50
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }

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

Dries's avatar
   
Dries committed
52
  $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
53
54
55
56
57
58
  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
59
  $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
60
61
  $output .= "</rss>\n";

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

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

}

function blog_feed_last() {
Dries's avatar
   
Dries committed
69
  $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
70
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
71
    $items .= format_rss_item($blog->title, path_uri() ."module.php?mod=blog&op=view&id=$blog->uid", $blog->body);
Dries's avatar
   
Dries committed
72
73
74
75
76
77
78
  }

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

Dries's avatar
   
Dries committed
81
82
83
84
  print $output;

}

Dries's avatar
   
Dries committed
85
function blog_page_user($uid = 0, $date = 0) {
Dries's avatar
   
Dries committed
86
87
  global $theme, $user;

Dries's avatar
   
Dries committed
88
89
90
91
92
93
  if ($uid) {
    $account = user_load(array("uid" => $uid, "status" => 1));
  }
  else {
    $account = $user;
  }
Dries's avatar
   
Dries committed
94

Dries's avatar
   
Dries committed
95
96
97
98
99
  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
100

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

Dries's avatar
   
Dries committed
103
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
104

Dries's avatar
   
Dries committed
105
106
    $links = array();

Dries's avatar
   
Dries committed
107
108
    if ($date != date("dny", $blog->timestamp)) {
      $date = date("dny", $blog->timestamp);
Dries's avatar
   
Dries committed
109
      $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
110
111
    }

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

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

    if ($blog->comment) {
Dries's avatar
   
Dries committed
121
      $links[] = "<a href=\"node.php?id=$blog->nid\">". t("moderate") ."</a>";
Dries's avatar
   
Dries committed
122
      $links[] = "<a href=\"node.php?id=$blog->nid\">". format_plural($blog->comments, t("comment"), t("comments")) ."</a>";
Dries's avatar
   
Dries committed
123
124
125
126
127
    }

    $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
128
  }
Dries's avatar
   
Dries committed
129

Dries's avatar
   
Dries committed
130
  $output .= "</table>";
Dries's avatar
   
Dries committed
131
  $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
132

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

Dries's avatar
Dries committed
136
function blog_page_last() {
Dries's avatar
   
Dries committed
137
  global $theme, $user;
Dries's avatar
   
Dries committed
138

Dries's avatar
   
Dries committed
139
  $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
140

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

Dries's avatar
   
Dries committed
143
  while ($blog = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
144

Dries's avatar
   
Dries committed
145
146
    $links = array();

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

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

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

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

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

Dries's avatar
   
Dries committed
165
  }
Dries's avatar
   
Dries committed
166

Dries's avatar
   
Dries committed
167
  $output .= "</table>";
Dries's avatar
   
Dries committed
168
  $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
169

Dries's avatar
   
Dries committed
170
  $theme->box(t("User blogs"), $output, "main");
Dries's avatar
   
Dries committed
171
172
173
174
175
}

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

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

Dries's avatar
   
Dries committed
178
  if ($blog && $blog->uid == $user->uid) {
Dries's avatar
   
Dries committed
179
    node_del(array(type => "blog", nid => $nid));
Dries's avatar
   
Dries committed
180
181
182
  }
}

Dries's avatar
   
Dries committed
183
function blog_view($node, $main = 0) {
Dries's avatar
   
Dries committed
184
  global $theme;
Dries's avatar
   
Dries committed
185

Dries's avatar
   
Dries committed
186
  $theme->node($node, $main);
Dries's avatar
   
Dries committed
187
188
189
}

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

Dries's avatar
   
Dries committed
192
  if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
193
    if ($mod == "node" || $edit[type] == "blog") {
Dries's avatar
   
Dries committed
194
      // do nothing
Dries's avatar
   
Dries committed
195
196
197
198
    }
    else if ($type == "blog") {
      $item = node_get_object(array(type => "blog", nid => $id));
      $edit["title"] = $item->title;
Dries's avatar
   
Dries committed
199
      $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
200
201
202
203
    }
    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
204
      $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
205
    }
Dries's avatar
   
Dries committed
206

Dries's avatar
   
Dries committed
207
    if ($edit["title"]) {
Dries's avatar
   
Dries committed
208
209
      $form .= blog_view(new Blog(node_preview($edit)));
    }
Dries's avatar
   
Dries committed
210

Dries's avatar
   
Dries committed
211
212
213
214
    $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
215

Dries's avatar
   
Dries committed
216
217
218
    if ($edit["nid"] > 0) {
      $form .= form_hidden("nid", $edit["nid"]);
    }
Dries's avatar
   
Dries committed
219

Dries's avatar
   
Dries committed
220
221
222
223
    if (!$edit) {
      $form .= form_submit(t("Preview"));
    }
    else if ($edit && !$edit["title"]) {
Dries's avatar
   
Dries committed
224
225
226
227
228
229
230
231
232
233
234
      $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
235

Dries's avatar
   
Dries committed
236
    return form($form);
Dries's avatar
   
Dries committed
237
238
  }
  else {
Dries's avatar
   
Dries committed
239
    return message_access();
Dries's avatar
   
Dries committed
240
241
242
243
244
245
  }
}

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

Dries's avatar
   
Dries committed
246
  if ($user->uid && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
   
Dries committed
247
248
    if ($edit["nid"]) {
      node_save($edit, array(title, body, type => "blog"));
Dries's avatar
   
Dries committed
249
250
    }
    else {
Dries's avatar
   
Dries committed
251
      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
252
    }
Dries's avatar
   
Dries committed
253
254
255
256
257
258
  }
}

function blog_edit_history($nid) {
  global $user;

Dries's avatar
   
Dries committed
259
  $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
260
261
262
263
264
265
266
267
268
269
270

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

Dries's avatar
   
Dries committed
273
  if (user_access("access blogs")) {
Dries's avatar
   
Dries committed
274
275
    switch ($op) {
      case "feed":
Dries's avatar
   
Dries committed
276
277
        if ($id) {
          blog_feed_user($id, $date);
Dries's avatar
   
Dries committed
278
279
280
281
282
283
        }
        else {
          blog_feed_last();
        }
        break;
      default:
Dries's avatar
Dries committed
284
        $theme->header();
Dries's avatar
   
Dries committed
285
286
        if ($id) {
          blog_page_user($id, $date);
Dries's avatar
   
Dries committed
287
288
289
290
        }
        else {
          blog_page_last();
        }
Dries's avatar
Dries committed
291
        $theme->footer();
Dries's avatar
   
Dries committed
292
293
    }
  }
Dries's avatar
   
Dries committed
294
  else {
Dries's avatar
Dries committed
295
    $theme->header();
Dries's avatar
Dries committed
296
    $theme->box(t("Access denied"), message_access());
Dries's avatar
Dries committed
297
    $theme->footer();
Dries's avatar
   
Dries committed
298
  }
Dries's avatar
Dries committed
299

Dries's avatar
   
Dries committed
300
301
302
}

function blog_user() {
Dries's avatar
   
Dries committed
303
  global $op, $id, $edit, $theme, $user;
Dries's avatar
   
Dries committed
304
305
306
307
308

  if (user_access("post blogs")) {
    switch ($op) {
      case "delete":
        blog_remove($id);
Dries's avatar
   
Dries committed
309
        blog_page_user($user->uid, time());
Dries's avatar
   
Dries committed
310
311
        break;
      case "edit":
Dries's avatar
   
Dries committed
312
313
        $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
314
315
        break;
      case t("Preview"):
Dries's avatar
   
Dries committed
316
        $theme->box(t("Preview Blog"), blog_form($edit), "main");
Dries's avatar
   
Dries committed
317
318
319
        break;
      case t("Submit"):
        blog_save($edit);
Dries's avatar
   
Dries committed
320
        blog_page_user($user->uid, time());
Dries's avatar
   
Dries committed
321
322
        break;
      default:
Dries's avatar
   
Dries committed
323
        $theme->box(t("Submit a blog"), blog_form($edit), "main");
Dries's avatar
   
Dries committed
324
325
326
327
328
    }
  }
}


Dries's avatar
   
Dries committed
329
function blog_link($type, $node = 0) {
Dries's avatar
   
Dries committed
330
331
332
  global $user;

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

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

Dries's avatar
   
Dries committed
341
  if ($type == "node" && $node->type == "blog") {
Dries's avatar
   
Dries committed
342
    $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
343
344
  }

Dries's avatar
   
Dries committed
345
346
347
348
349
  return $links ? $links : array();
}


function blog_block() {
Dries's avatar
   
Dries committed
350
351
352
  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
353
354

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

Dries's avatar
   
Dries committed
358
  $block[0]["subject"] = "<a href=\"module.php?mod=blog\">". t("User blogs") ."</a>";
Dries's avatar
   
Dries committed
359
  $block[0]["content"] = $output;
Dries's avatar
   
Dries committed
360
  $block[0]["info"] = t("User blogs");
Dries's avatar
   
Dries committed
361
362
363
364
365
366
367
  $block[0]["link"] = "module.php?mod=blog";

  return $block;
}


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

Dries's avatar
   
Dries committed
370
371
  $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
372
    $find[$i++] = array("title" => check_output($blog->title), "link" => (strstr($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
373
374
375
376
377
378
  }
  return $find;
}

class BlogCalendar {
  var $date;
Dries's avatar
   
Dries committed
379
  var $name;
Dries's avatar
   
Dries committed
380

Dries's avatar
   
Dries committed
381
382
  function BlogCalendar($name, $date) {
    $this->name = urlencode($name);
Dries's avatar
   
Dries committed
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416

    // 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
417
    $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
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445

    // 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
446
      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
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469

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

?>