? pager.inc.patch
Index: pager.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/pager.inc,v
retrieving revision 1.62
diff -u -p -r1.62 pager.inc
--- pager.inc	2 Aug 2007 10:58:41 -0000	1.62
+++ pager.inc	13 Aug 2007 18:22:07 -0000
@@ -65,13 +65,27 @@ function pager_query($query, $limit = 10
     $count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query);
   }
 
-  // Convert comma-separated $page to an array, used by other functions.
-  $pager_page_array = explode(',', $page);
+  // Set up our initial $pager_page_array if needed.
+  if (!isset($pager_page_array)) {
+    $pager_page_array = array();
+    // Convert comma-separated $page to an array, used by other functions.
+    $temp_page_array = explode(',', $page);
+    foreach ($temp_page_array as $k => $v) {
+      // Convert the array to integer, and substitute -1 for "last".
+      $pager_page_array[$k] = (int) ($v=='last') ? -1 : $v;
+    }
+  }
 
   // We calculate the total of pages as ceil(items / limit).
   $pager_total_items[$element] = db_result(db_query($count_query, $args));
   $pager_total[$element] = ceil($pager_total_items[$element] / $limit);
-  $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1));
+
+  // Handle negative numbers as indexes from the end.
+  if ($pager_page_array[$element] < 0) {
+    $pager_page_array[$element] = max(0, (int)$pager_total[$element] + $pager_page_array[$element]);
+  } else {
+    $pager_page_array[$element] = max(0, min($pager_page_array[$element], ((int)$pager_total[$element]) - 1));
+  }
   return db_query_range($query, $args, $pager_page_array[$element] * $limit, $limit);
 }
 
