"book_find", "page" => "book_page", "user" => "book_user", "admin" => "book_admin"); class Book { function Book($nid, $userid, $title, $body, $parent, $weight, $timestamp) { $this->nid = $nid; $this->userid = $userid; $this->title = $title; $this->body = $body; $this->parent = $parent; $this->weight = $weight; $this->timestamp = $timestamp; } } function book_post_threshold($node, $default) { return $default; } function book_dump_threshold($node, $default) { return $default; } function book_timout_threshold($node, $default) { return $default; } function book_status() { return array(dumped, expired, queued, posted); } function book_location($node, $nodes = array()) { $parent = db_fetch_object(db_query("SELECT n.nid, n.title, b.parent FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.nid = '$node->parent'")); if ($parent->title) { $nodes = book_location($parent, $nodes); array_push($nodes, $parent); } return $nodes; } function book_view($node, $page = 1) { global $theme; if ($node->nid && $node->parent) { $next = db_fetch_object(db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE b.parent = '$node->parent' AND b.weight > '$node->weight' ORDER BY b.weight ASC")); $prev = db_fetch_object(db_query("SELECT n.nid, n.title FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE b.parent = '$node->parent' AND b.weight < '$node->weight' ORDER BY b.weight DESC")); } $output .= "\n"; if ($node->title) { foreach (book_location($node) as $level) { $location .= "$indent nid\">$level->title
"; $indent .= "-"; } $output .= " \n"; $output .= " \n"; } if ($node->body) { $output .= " "; } $output .= " \n"; $output .= " \n"; $output .= "
$location". node_control($node) ."

"; $output .= "
". check_output($node->title) ."". ($node->body ? "
Last updated by ". format_username($node->userid) ." on ". format_date($node->timestamp) ." " : "") ."

". check_output($node->body, 1) ."

". book_tree($node->nid) .""; $output .= "

"; $output .= "
". ($prev ? "nid\">". t("previous") ."" : t("previous")) ."index". ($next ? "nid\">". t("next") ."" : t("next")) ."
". ($prev ? "". check_output($prev->title) ."" : " ") ."". ($node->parent ? "parent\">". t("up") ."" : t("up")) ."". ($next ? "". check_output($next->title) ."" : " ") ."
\n"; if ($page) $theme->header(); $theme->box(t("Book"), $output); if ($page) $theme->footer(); } function book_find($keys) { global $status, $user; $find = array(); $result = db_query("SELECT n.*, u.userid FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid LEFT JOIN users u ON n.author = u.id WHERE n.type = 'book' AND n.status = '$status[posted]' AND (n.title LIKE '%". check_input($keys) ."%' OR b.body LIKE '%". check_input($keys) ."%') ORDER BY n.timestamp DESC LIMIT 20"); while ($node = db_fetch_object($result)) { array_push($find, array("title" => check_output($node->title), "link" => (user_access($user, "book") ? "admin.php?mod=book&op=edit&id=$node->nid" : "node.php?id=$node->nid"), "user" => $node->userid, "date" => $node->timestamp)); } return $find; } function book_toc($parent = 0, $indent = "", $toc = array()) { global $status; $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.type = 'book' AND n.status = '$status[posted]' AND b.parent = '$parent' ORDER BY b.weight"); while ($node = db_fetch_object($result)) { $toc[$node->nid] = "$indent $node->title"; if ($node->pid) $toc = book_toc($node->pid, "$indent-", $toc); $toc = book_toc($node->nid, "$indent-", $toc); } return $toc; } function book_form($edit = array()) { global $allowed_html, $PHP_SELF, $REQUEST_URI, $user; $output .= "
\n"; $output .= "". t("Author") .":
\n"; $output .= "\n"; $output .= format_username(($edit[userid] ? $edit[userid] : $user->userid)) ."

\n"; if ($edit[pid]) { $node = node_get_object("nid", $edit[pid]); $output .= "". t("Parent") .":
\n"; $output .= "id\">". check_output($node->title) ."

\n"; $output .= "\n"; $output .= "". t("The parent subject or category the page belongs in.") ."

\n"; } else { $output .= "". t("Parent") .":
\n"; foreach (book_toc() as $key=>$value) $options2 .= ""; if (user_access($user, "book")) $options2 .= ""; $output .= "
\n"; $output .= "". t("The parent subject or category the page belongs in.") ."

\n"; } $output .= "". t("Subject") .":
\n"; $output .= "

\n"; $output .= "". t("Content") .":
\n"; $output .= "
\n"; $output .= "". t("Allowed HTML tags") .": ". htmlspecialchars($allowed_html) .".

\n"; $output .= "". t("Log message") .":
\n"; $output .= "
\n"; $output .= "". t("An explanation of the additions or updates being made to help the group understand your motivations.") ."

\n"; if (user_access($user, "book")) { $output .= "". t("Weight") .":
\n"; for ($count = 0; $count < 25; $count++) $options3 .= ""; $output .= "
\n"; $output .= "". t("The heavier nodes will sink and the lighter nodes will be positioned nearer the top.") ."

\n"; } if (!$edit) { $output .= "\n"; } else if (!$edit[title]) { $output .= "". t("Warning: you did not supply a title.") ."

\n"; $output .= "\n"; } else { $output .= "\n"; $output .= "\n"; } $output .= "\n"; $output .= "\n"; $output .= "

\n"; return $output; } function book_save($edit) { node_save(array_diff(array_merge($edit, array(nid => $edit[nid], type => "book")), array(userid => $edit[userid]))); } function book_tree($parent = "", $depth = 0) { global $PHP_SELF, $status; if (($depth < 3) || ($PHP_SELF == "/admin.php")) { $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE n.type = 'book' AND n.status = '$status[posted]' AND b.parent = '$parent' ORDER BY b.weight"); $output .= ""; } return $output; } function book_list() { return node_overview("type = 'book'"); } function book_admin() { global $op, $id, $edit, $mod, $keys, $user; print "add new page | search book | list overview | tree overview
\n"; switch ($op) { case "add": print book_form(); break; case "list": print book_list(); break; case "edit": print book_form(node_get_array(nid, $id)); break; case "search": print search_form($keys); print search_data($keys, $mod); break; case t("Preview"): book_view(new Book(($edit[nid] ? $edit[nid] : -1), ($edit[userid] ? $edit[userid] : $user->userid), $edit[title], $edit[body], $edit[parent], $edit[weight], ($edit[timestamp] ? $edit[timestamp] : time())), 0); print book_form($edit); break; case t("Submit"): book_save($edit); print book_tree(); break; default: print book_tree(); } } function book_page() { global $status, $theme; $result = db_query("SELECT n.*, b.* FROM node n LEFT JOIN book b ON n.nid = b.nid AND n.lid = b.lid WHERE b.parent = 0 AND n.status = $status[posted] ORDER BY b.weight"); while ($node = db_fetch_object($result)) { $output .= "
nid\">". check_output($node->title) ."
". check_output($node->body, 1) ."

"; } $theme->header(); $theme->box(t("Book"), "
$output
"); $theme->footer(); } function book_update($id) { global $status; if ($node = node_get_object("nid", $id)) { if ($node->status != $status[posted]) { return t("You can only update accepted pages: pages that are still queued or already expired can not be updated."); } else if (db_result(db_query("SELECT COUNT(nid) FROM node WHERE pid = '$node->nid' AND status = '$status[queued]'"))) { return t("There is already an update for this node in the queue: we can only process one update at once."); } else { return book_form(array(nid => -1, pid => $id, title => $node->title, body => $node->body, parent => $node->parent)); } } } function book_user() { global $edit, $id, $op, $theme, $user; $title = t("Submit a book page"); switch($op) { case "update": $theme->box($title, book_update($id)); break; case t("Preview"): book_view(new Book(($edit[nid] ? $edit[nid] : -1), $user->userid, $edit[title], $edit[body], $edit[parent], $edit[weight], ($edit[timestamp] ? $edit[timestamp] : time())), 0); $theme->box($title, book_form($edit)); break; case t("Submit"): book_save($edit); $theme->box($title, t("Thank you for your submission.")); break; default: $theme->box($title, book_form()); } } ?>