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 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
      $output .= "<tr><td colspan=\"2\"><b><a href=\"module.php?mod=blog&name=". urlencode($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
85 86
    }

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) ."</a><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=". 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
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=". urlencode($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;
  }
}

?>