Index: includes/pager.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/pager.inc,v
retrieving revision 1.63
diff -u -r1.63 pager.inc
--- includes/pager.inc	6 Dec 2007 09:58:30 -0000	1.63
+++ includes/pager.inc	31 Aug 2008 03:30:55 -0000
@@ -65,13 +65,28 @@
     $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);
 }