Index: modules/book/book.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.module,v
retrieving revision 1.429
diff -u -p -r1.429 book.module
--- modules/book/book.module	30 Jul 2007 18:20:21 -0000	1.429
+++ modules/book/book.module	3 Aug 2007 19:46:12 -0000
@@ -166,27 +166,37 @@ function book_block($op = 'list', $delta
       $block[0]['info'] = t('Book navigation');
       return $block;
     case 'view':
+      if (arg(0) == 'node' && is_numeric(arg(1))) {
+        $node = node_load(arg(1));
+      }
+      $current_bid = empty($node->book['bid']) ? 0 : $node->book['bid'];
       $mode = variable_get('book_block_mode', 'all pages');
       if ($mode == 'all pages') {
         $block['subject'] = t('Book navigation');
         $book_menus = array();
+        $pseudo_tree = array(0 => array('below' => FALSE));
         foreach (book_get_books() as $book) {
-          $book_menus[] = menu_tree_output(menu_tree_page_data($book['menu_name']));
+          if ($book['bid'] == $current_bid {
+            $book_menus[] = menu_tree_output(menu_tree_all_data($node->book['menu_name'], $node->book));
+          }
+          else {
+            // Since we know we will only display the top node, there is no
+            // reason to run an additional menu tree query for each book.
+            $pseudo_tree[0]['link'] = $book;
+            $book_menus[] = menu_tree_output($pseudo_tree);
+          }
         }
         $block['content'] = theme('book_all_books_block', $book_menus);
       }
-      elseif (arg(0) == 'node' && is_numeric(arg(1))) {
+      elseif ($current_bid) {
         // Only display this block when the user is browsing a book.
-        $node = node_load(arg(1));
-        if (isset($node->book['bid'])) {
-          $title = db_result(db_query(db_rewrite_sql('SELECT n.title FROM {node} n WHERE n.nid = %d'), $node->book['bid']));
-          // Only show the block if the user has view access for the top-level node.
-          if ($title) {
-            $tree = menu_tree_all_data($node->book['menu_name'], $node->book);
-            $data = array_shift($tree); // Should only be one element.
-            $block['subject'] = theme('book_title_link', $data['link']);
-            $block['content'] = ($data['below']) ? menu_tree_output($data['below']) : '';
-          }
+        $title = db_result(db_query(db_rewrite_sql('SELECT n.title FROM {node} n WHERE n.nid = %d'), $node->book['bid']));
+        // Only show the block if the user has view access for the top-level node.
+        if ($title) {
+          $tree = menu_tree_all_data($node->book['menu_name'], $node->book);
+          $data = array_shift($tree); // Should only be one element.
+          $block['subject'] = theme('book_title_link', $data['link']);
+          $block['content'] = ($data['below']) ? menu_tree_output($data['below']) : '';
         }
       }
       return $block;
