blog.module 16.7 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 users 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
  while ($blog = db_fetch_object($result)) {
    $items .= format_rss_item($blog->title, path_uri() ."node.php?id=$blog->nid", $blog->body);
  }

Dries's avatar
 
Dries committed
48 49
  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
  $output .= "<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\">\n";
Dries's avatar
 
Dries committed
50 51
  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
  $output .= "<rss version=\"0.91\">\n";
Dries's avatar
 
Dries committed
52
  $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
53 54
  $output .= "</rss>\n";

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

Dries's avatar
 
Dries committed
57 58 59 60 61
  print $output;

}

function blog_feed_last() {
Dries's avatar
 
Dries committed
62
  $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 users u ON n.author = u.uid ORDER BY b.lid DESC LIMIT 15");
Dries's avatar
 
Dries committed
63
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
64
    $items .= format_rss_item($blog->title, path_uri() ."module.php?mod=blog&op=view&id=$blog->uid", $blog->body);
Dries's avatar
 
Dries committed
65 66 67 68 69 70 71
  }

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

Dries's avatar
 
Dries committed
74 75 76 77
  print $output;

}

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

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

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

Dries's avatar
 
Dries committed
92
  $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 users 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, n.title, n.comment, n.timestamp, b.body, u.uid, u.name ORDER BY n.nid DESC LIMIT 20");
Dries's avatar
 
Dries committed
93

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

Dries's avatar
 
Dries committed
96
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
97

Dries's avatar
 
Dries committed
98 99
    $links = array();

Dries's avatar
 
Dries committed
100 101
    if ($date != date("dny", $blog->timestamp)) {
      $date = date("dny", $blog->timestamp);
Dries's avatar
 
Dries committed
102
      $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
103 104
    }

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

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

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

    $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
120
  }
Dries's avatar
 
Dries committed
121

Dries's avatar
 
Dries committed
122
  $output .= "</table>";
Dries's avatar
 
Dries committed
123
  $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
124

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

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

Dries's avatar
 
Dries committed
131
  $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 users u ON n.author = u.uid LEFT JOIN comments c ON n.nid = c.lid GROUP BY n.nid, n.title, n.comment, n.timestamp, b.body, u.uid, u.name ORDER BY n.nid DESC LIMIT 20");
Dries's avatar
 
Dries committed
132

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

Dries's avatar
 
Dries committed
135
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
136

Dries's avatar
 
Dries committed
137 138
    $links = array();

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

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

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

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

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

Dries's avatar
 
Dries committed
156
  }
Dries's avatar
 
Dries committed
157

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

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

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

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

Dries's avatar
 
Dries committed
169
  if ($blog && $blog->uid == $user->uid) {
Dries's avatar
 
Dries committed
170
    node_del(array(type => "blog", nid => $nid));
Dries's avatar
 
Dries committed
171 172 173
  }
}

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

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

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

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

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

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

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

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

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

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

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

function blog_edit_history($nid) {
  global $user;

Dries's avatar
 
Dries committed
250
  $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
251 252 253 254 255 256 257 258 259 260 261

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

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

Dries's avatar
 
Dries committed
291 292 293
}

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

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


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

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

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

Dries's avatar
 
Dries committed
332
  if ($type == "node" && $node->type == "blog") {
Dries's avatar
 
Dries committed
333
    $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
334 335
  }

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


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

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

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

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

  return $block;
}


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

Dries's avatar
 
Dries committed
361 362
  $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
363
    $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
364 365 366 367 368 369
  }
  return $find;
}

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

Dries's avatar
 
Dries committed
372 373
  function BlogCalendar($name, $date) {
    $this->name = urlencode($name);
Dries's avatar
 
Dries committed
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 407

    // 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
408
    $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
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 436

    // 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
437
      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
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460

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

?>