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=\"node.php?id=$node->nid\">". 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;
  }
}

?>