? book-589440-83.patch
Index: book.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.admin.inc,v
retrieving revision 1.8.2.3
diff -u -p -r1.8.2.3 book.admin.inc
--- book.admin.inc	22 Oct 2008 19:26:01 -0000	1.8.2.3
+++ book.admin.inc	15 Feb 2011 22:10:49 -0000
@@ -170,6 +170,11 @@ function _book_admin_table($node, &$form
  * @see book_admin_edit()
  */
 function _book_admin_table_tree($tree, &$form) {
+  // Adjust delta to be big enough to allow items to be moved from one chapter to another.
+  $keys = array_keys($tree);
+  $bid = $tree[$keys[0]]['link']['bid'];
+  $delta = _book_dynamic_delta($bid);
+
   foreach ($tree as $data) {
     $form['book-admin-'. $data['link']['nid']] = array(
       '#item' => $data['link'],
@@ -185,7 +190,7 @@ function _book_admin_table_tree($tree, &
       'weight' => array(
         '#type' => 'weight',
         '#default_value' => $data['link']['weight'],
-        '#delta' => 15,
+        '#delta' => $delta,
       ),
       'plid' => array(
         '#type' => 'textfield',
Index: book.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/book/book.module,v
retrieving revision 1.454.2.6
diff -u -p -r1.454.2.6 book.module
--- book.module	25 Feb 2009 11:47:37 -0000	1.454.2.6
+++ book.module	15 Feb 2011 22:10:50 -0000
@@ -386,7 +386,7 @@ function _book_add_form_elements(&$form,
     '#type' => 'weight',
     '#title' => t('Weight'),
     '#default_value' => $node->book['weight'],
-    '#delta' => 15,
+    '#delta' => _book_dynamic_delta($node->book['bid']),
     '#weight' => 5,
     '#description' => t('Pages at a given level are ordered first by weight and then by title.'),
   );
@@ -1094,3 +1094,22 @@ function book_menu_subtree_data($item) {
   return $tree[$cid];
 }
 
+/**
+ * Calculate a reasonable value for delta to be used in book management page or book edit form.
+ *
+ * @param $bid
+ *   Book id.
+ * @return
+ *   Delta value as an integer.
+ */
+function _book_dynamic_delta($bid) {
+  $delta = count(book_toc($bid, array(), MENU_MAX_DEPTH));
+  $delta = ceil($delta / 2);
+  
+  //Hard coded min delta value
+  if ($delta < 15) {
+    $delta = 15;
+  }
+
+  return $delta;
+}
