blog.module 16.8 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 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";
  $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";

  print $output;

}

function blog_feed_last() {
Dries's avatar
 
Dries committed
50
  $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
51
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
52
    $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
53 54 55 56 57 58 59 60 61 62 63
  }

  $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";

  print $output;

}

Dries's avatar
 
Dries committed
64
function blog_page_user($name = 0, $date = 0) {
Dries's avatar
 
Dries committed
65 66
  global $theme, $user;

Dries's avatar
 
Dries committed
67
  $name = check_input($name ? $name : $user->name);
Dries's avatar
 
Dries committed
68
  $date = check_input($date ? $date : time());
Dries's avatar
 
Dries committed
69

Dries's avatar
 
Dries committed
70
  $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
71

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

Dries's avatar
 
Dries committed
74
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
75

Dries's avatar
 
Dries committed
76 77
    $links = array();

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

Dries's avatar
 
Dries committed
83
    if ($user->id && $user->name == $name) {
Dries's avatar
 
Dries committed
84 85 86 87
      $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
88
      $links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
Dries's avatar
 
Dries committed
89 90 91
    }

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

    $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
98
  }
Dries's avatar
 
Dries committed
99

Dries's avatar
 
Dries committed
100
  $output .= "</table>";
Dries's avatar
 
Dries committed
101
  $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
102 103

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

Dries's avatar
Dries committed
106
function blog_page_last() {
Dries's avatar
 
Dries committed
107
  global $theme, $user;
Dries's avatar
 
Dries committed
108

Dries's avatar
 
Dries committed
109
  $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
110

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

Dries's avatar
 
Dries committed
113
  while ($blog = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
114

Dries's avatar
 
Dries committed
115 116
    $links = array();

Dries's avatar
 
Dries committed
117
    $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
118 119 120 121 122 123

    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
124
      $links[] = "<a href=\"submit.php?mod=blog&type=blog&id=$blog->nid\">". t("blog it") ."</a>";
Dries's avatar
 
Dries committed
125 126 127
    }

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

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

Dries's avatar
 
Dries committed
134
  }
Dries's avatar
 
Dries committed
135

Dries's avatar
 
Dries committed
136
  $output .= "</table>";
Dries's avatar
 
Dries committed
137
  $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
138

Dries's avatar
 
Dries committed
139
  $theme->box(t("User blogs"), $output, "main");
Dries's avatar
 
Dries committed
140 141 142 143 144
}

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

Dries's avatar
 
Dries committed
145 146 147 148 149
  $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
150 151 152
  }
}

Dries's avatar
 
Dries committed
153
function blog_view($node, $main = 0) {
Dries's avatar
 
Dries committed
154
  global $theme;
Dries's avatar
 
Dries committed
155

Dries's avatar
 
Dries committed
156
  $theme->node($node, $main);
Dries's avatar
 
Dries committed
157 158 159
}

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

Dries's avatar
 
Dries committed
162
  if ($user->id && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
 
Dries committed
163
    if ($mod == "node" || $edit[type] == "blog") {
Dries's avatar
 
Dries committed
164
      // do nothing
Dries's avatar
 
Dries committed
165 166 167 168
    }
    else if ($type == "blog") {
      $item = node_get_object(array(type => "blog", nid => $id));
      $edit["title"] = $item->title;
Dries's avatar
 
Dries committed
169
      $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
170 171 172 173
    }
    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
174
      $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
175
    }
Dries's avatar
 
Dries committed
176

Dries's avatar
 
Dries committed
177
    if ($edit["title"]) {
Dries's avatar
 
Dries committed
178 179
      $form .= blog_view(new Blog(node_preview($edit)));
    }
Dries's avatar
 
Dries committed
180

Dries's avatar
 
Dries committed
181 182 183 184
    $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
185

Dries's avatar
 
Dries committed
186 187 188
    if ($edit["nid"] > 0) {
      $form .= form_hidden("nid", $edit["nid"]);
    }
Dries's avatar
 
Dries committed
189

Dries's avatar
 
Dries committed
190 191 192 193
    if (!$edit) {
      $form .= form_submit(t("Preview"));
    }
    else if ($edit && !$edit["title"]) {
Dries's avatar
 
Dries committed
194 195 196 197 198 199 200 201 202 203 204
      $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
205

Dries's avatar
 
Dries committed
206
    return form($REQUEST_URI, $form);
Dries's avatar
 
Dries committed
207 208
  }
  else {
Dries's avatar
 
Dries committed
209
    return message_access();
Dries's avatar
 
Dries committed
210 211 212 213 214 215
  }
}

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

Dries's avatar
 
Dries committed
216
  if ($user->id && (user_access("administer blogs") || user_access("post blogs"))) {
Dries's avatar
 
Dries committed
217 218
    if ($edit["nid"]) {
      node_save($edit, array(title, body, type => "blog"));
Dries's avatar
 
Dries committed
219 220
    }
    else {
Dries's avatar
 
Dries committed
221
      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
222
    }
Dries's avatar
 
Dries committed
223 224 225 226 227 228
  }
}

function blog_edit_history($nid) {
  global $user;

Dries's avatar
 
Dries committed
229
  $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
230 231 232 233 234 235 236 237 238 239 240

  $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
241 242
  global $theme, $op, $name, $date;

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

Dries's avatar
 
Dries committed
270 271 272
}

function blog_user() {
Dries's avatar
 
Dries committed
273
  global $op, $id, $edit, $theme, $user;
Dries's avatar
 
Dries committed
274 275 276 277 278

  if (user_access("post blogs")) {
    switch ($op) {
      case "delete":
        blog_remove($id);
Dries's avatar
 
Dries committed
279
        blog_page_user($user->name, time());
Dries's avatar
 
Dries committed
280 281
        break;
      case "edit":
Dries's avatar
 
Dries committed
282 283
        $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
284 285
        break;
      case t("Preview"):
Dries's avatar
 
Dries committed
286
        $theme->box(t("Preview Blog"), blog_form($edit), "main");
Dries's avatar
 
Dries committed
287 288 289
        break;
      case t("Submit"):
        blog_save($edit);
Dries's avatar
 
Dries committed
290
        blog_page_user($user->name, time());
Dries's avatar
 
Dries committed
291 292
        break;
      default:
Dries's avatar
 
Dries committed
293
        $theme->box(t("Submit a blog"), blog_form($edit), "main");
Dries's avatar
 
Dries committed
294 295 296 297 298
    }
  }
}


Dries's avatar
 
Dries committed
299
function blog_link($type, $node = 0) {
Dries's avatar
 
Dries committed
300 301 302
  global $user;

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

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

Dries's avatar
 
Dries committed
311
  if ($type == "node" && $node->type == "blog") {
Dries's avatar
 
Dries committed
312
    $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
313 314
  }

Dries's avatar
 
Dries committed
315 316 317 318 319 320 321
  return $links ? $links : array();
}


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

Dries's avatar
 
Dries committed
322
  $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
323
  while ($node = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
324
    $output .= "<a href=\"module.php?mod=blog&op=view&name=". urlencode($node->name) ."\">". check_output($node->title) ."<br />\n";
Dries's avatar
 
Dries committed
325 326
  }

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

Kjartan's avatar
Kjartan committed
332
  $date = $date ? $date : time();
Dries's avatar
 
Dries committed
333
  $name = $name ? $name : $user->name;
Dries's avatar
 
Dries committed
334 335 336

  if (($mod == "blog") || ($mod == "block")) {
       // Only show this block on "blog pages" and in the admin block section.
Dries's avatar
 
Dries committed
337 338
    $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
339 340 341 342 343 344 345 346 347 348 349 350
    $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
351
    $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
352 353 354 355 356 357
  }
  return $find;
}

class BlogCalendar {
  var $date;
Dries's avatar
 
Dries committed
358
  var $name;
Dries's avatar
 
Dries committed
359

Dries's avatar
 
Dries committed
360 361
  function BlogCalendar($name, $date) {
    $this->name = urlencode($name);
Dries's avatar
 
Dries committed
362 363 364 365 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

    // 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
396
    $output .= " <TR><TD ALIGN=\"center\" COLSPAN=\"7\"><B><A HREF=\"module.php?mod=blog&name=$this->name&date=$prev\" STYLE=\"text-decoration: none;\">&lt;&lt;</A> &nbsp; ". date("F Y", $this->date) ." &nbsp; " . ($next <= $thislast ? "<A HREF=\"module.php?mod=blog&name=$this->name&date=$next\" STYLE=\"text-decoration: none;\">&gt;&gt;</A>" : "&gt;&gt;") . "<B></TD></TR>\n";
Dries's avatar
 
Dries committed
397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

    // 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
425
      else $output .= "  <TD ALIGN=\"center\"><A HREF=\"module.php?mod=blog&name=$this->name&date=$date\" STYLE=\"text-decoration: none;\">$nday</A></TD>\n";
Dries's avatar
 
Dries committed
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448

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

?>