Index: custom_pagers.module
===================================================================
--- custom_pagers.module	(revision 95)
+++ custom_pagers.module	(working copy)
@@ -11,7 +11,8 @@
   $items['admin/build/custom_pagers'] = array(
     'title' => 'Custom pagers',
     'description' => 'Add custom pagers for content types.',
-    'page callback' => 'custom_pagers_page',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('custom_pagers_overview_form'),
     'access arguments' => array('administer custom pagers'),
     'file' => 'custom_pagers.admin.inc',
   );
@@ -53,6 +54,9 @@
       ),
       'template' => 'custom-pager',
     ),
+    'custom_pagers_overview_form' => array(
+      'arguments' => array('form' => array()),
+    ),
   );
 }
 
@@ -146,7 +150,7 @@
 function _custom_pagers_load_all_pagers($refresh = FALSE) {
   static $pagers;
   if ($refresh || !isset($pagers)) {
-    $sql = 'SELECT * FROM {custom_pager}';
+    $sql = 'SELECT * FROM {custom_pager} ORDER BY weight asc';
     $result = db_query($sql);
 
     $pagers = array();
@@ -264,7 +268,36 @@
   }
   $pager_cache[$pager->pid] = $list;
 
-  return pager_entries_by_val($node->nid, $list);
+  $entries =  pager_entries_by_val($node->nid, $list);
+
+  if ($entries['current_index'] != -1) {
+    $pagers = _custom_pagers_load_all_pagers();
+    $pager_keys = array_keys($pagers);
+    $ind = array_search($pager->pid, $pager_keys);
+    // Not at the beginning
+    if ($ind > 0) {
+      $previous = $pagers[$pager_keys[$ind - 1]];
+      if (empty($pager_cache[$previous->pid])) {
+        custom_pager_build_nav($previous, $node);
+      }
+      $prev_list = $pager_cache[$previous->pid];
+      $prev_entries = pager_entries_by_val($node->nid, $prev_list);
+      $entries['prev'] = $prev_entries['last'];
+    }
+
+    // Not at the end
+    if ($ind < (count($pagers) - 1)) {
+      $next = $pagers[$pager_keys[$ind + 1]];
+      if (empty($pager_cache[$next->pid])) {
+        custom_pager_build_nav($next, $node);
+      }
+      $next_list = $pager_cache[$next->pid];
+      $next_entries =  pager_entries_by_val($node->nid, $next_list);
+      $entries['next'] = $next_entries['first'];
+    }
+  }
+
+  return $entries;
 }
 
 // Helper functions to pull proper entries from a list of nids.
@@ -291,13 +324,11 @@
     'last' => $list[count($list) - 1],
     'full_list' => $list
   );
-
   foreach($nav as $k => $v) {
     if ($nav[$k] == $list[$key]) {
       $nav[$k] = NULL;
     }
   }
-
   $nav['current_index'] = $key;
   return $nav;
 }
Index: custom_pagers.install
===================================================================
--- custom_pagers.install	(revision 58)
+++ custom_pagers.install	(working copy)
@@ -79,6 +79,13 @@
         'size' => 'tiny',
         'description' => t("A boolean flag indicating that this {custom_pager}'s list of nodes should be cached.")
       ),
+      'weight' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The weight of this pager in relation to other pagers.',
+      ),
     ),
     'primary key' => array('pid'),
   );
@@ -118,6 +125,21 @@
   return $ret;
 }
 
+function custom_pagers_update_3() {
+  $ret = array();
+  switch ($GLOBALS['db_type']) {
+    case 'mysql':
+    case 'mysqli':
+      $ret[] = update_sql("ALTER TABLE {custom_pager} ADD weight tinyint NOT NULL default 0");
+      break;
+    case 'pgsql':
+      db_add_column($ret, 'custom_pager', 'weight', 'smallint', array('not null' => TRUE, 'default' => 0));
+      break;
+  }
+  return $ret;
+}
+
+
 function custom_pagers_uninstall() {
   drupal_uninstall_schema('custom_pagers');
 }
Index: custom_pagers.admin.inc
===================================================================
--- custom_pagers.admin.inc	(revision 58)
+++ custom_pagers.admin.inc	(working copy)
@@ -2,31 +2,83 @@
 // $Id: custom_pagers.admin.inc,v 1.1 2008/06/17 20:47:05 eaton Exp $
 
 // Lists all current custom pagers, and provides a link to the edit page.
-function custom_pagers_page() {
+function custom_pagers_overview_form() {
   $pagers = _custom_pagers_load_all_pagers(TRUE);
+  $form = array('#tree' => TRUE);
 
-  $header = array(t('Title'), t('Node list'), t('Visibility'), '');
+  foreach ($pagers as $pager) {
+    $form[$vocabulary->vid]['#pager'] = (array)$pager;
+    $form[$pager->pid]['weight'] = array('#type' => 'weight', '#delta' => 10, '#default_value' => $pager->weight);
+    $form[$pager->pid]['title'] = array('#value' => $pager->title);
+    $form[$pager->pid]['node_list'] = array('#value' => !empty($pager->list_php) ? t('PHP snippet') : $pager->view . t(' view'));
+    $form[$pager->pid]['visibility'] = array('#value' => !empty($pager->visibility_php) ? t('PHP snippet') : $pager->node_type . t(' nodes'));
+    $form[$pager->pid]['edit'] = array('#value' => l(t('edit'), 'admin/build/custom_pagers/edit/' . $pager->pid));
+  }
 
+  // Only make this form include a submit button and weight if more than one
+  // pager exists.
+  if (count($pagers) > 1) {
+    $form['submit'] = array('#type' => 'submit', '#value' => t('Save'));
+  }
+  elseif (isset($pager)) {
+    unset($form[$pager->pid]['weight']);
+  }
+  return $form;
+}
+
+/**
+ * Submit handler for pagers overview. Updates changed pager weights.
+ *
+ * @see custom_pagers_overview_form()
+ */
+function custom_pagers_overview_form_submit($form, &$form_state) {
+  foreach ($form_state['values'] as $pid => $pager) {
+    if (is_numeric($pid) && $form[$pid]['#pager']['weight'] != $form_state['values'][$pid]['weight']) {
+      $pager = _custom_pagers_load_pager($pid);
+      $pager->weight = $form_state['values'][$pid]['weight'];
+      _custom_pagers_save_pager($pager);
+    }
+  }
+}
+
+/**
+ * Theme the pagers overview as a sortable list of pagers.
+ *
+ * @ingroup themeable
+ * @see custom_pagers_overview_form()
+ */
+function theme_custom_pagers_overview_form($form) {
   $rows = array();
-  foreach ($pagers as $pager) {
-    $row = array();
-    $row[] = $pager->title;
-    $row[] = !empty($pager->list_php) ? t('PHP snippet') : $pager->view . t(' view');
-    $row[] = !empty($pager->visibility_php) ? t('PHP snippet') : $pager->node_type . t(' nodes');
-    $row[] =  l(t('edit'), 'admin/build/custom_pagers/edit/' . $pager->pid);
-    $rows[] = $row;
+  foreach (element_children($form) as $key) {
+    if (isset($form[$key]['title'])) {
+      $pager = &$form[$key];
+
+      $row = array();
+
+      if (isset($pager['weight'])) {
+        $row[] = drupal_render($pager['weight']);
+      }
+      $row[] = drupal_render($pager['title']);
+      $row[] = drupal_render($pager['node_list']);
+      $row[] = drupal_render($pager['visibility']);
+      $row[] = drupal_render($pager['edit']);
+
+      $rows[] = array('data' => $row, 'class' => 'draggable');
+    }
   }
-  if (count($rows) == 0) {
-    $rows[] = array(array('data' => t('No custom pagers have been defined.'), 'colspan' => 3));
+  if (empty($rows)) {
+    $rows[] = array(array('data' => t('No custom pagers have been defined.'), 'colspan' => 4));
   }
+  $rows[] = array(array('data' => l(t('Add a new custom pager'), 'admin/build/custom_pagers/add'), 'colspan' => 4));
 
-  $rows[] = array(array('data' => l(t('Add a new custom pager'), 'admin/build/custom_pagers/add'), 'colspan' => 2));
+  $header = array(t('Weight'), t('Title'), t('Node list'), t('Visibility'), '');
+  if (isset($form['submit'])) {
+    //drupal_add_tabledrag('pagers', 'order', 'sibling', 'pager-weight');
+  }
 
-
-  return theme('table', $header, $rows);
+  return theme('table', $header, $rows, array('id' => 'pagers')) . drupal_render($form);
 }
 
-
 // Displays an edit form for a custom pager record.
 function custom_pagers_form(&$form_state, $pid = NULL) {
   if (isset($pid) && $pager = _custom_pagers_load_pager($pid)) {
@@ -36,6 +88,12 @@
     );
   }
 
+  $form['weight'] = array(
+    '#type' => 'weight',
+    '#delta' => 10,
+    '#default_value' => $vocabulary->weight,
+  );
+
   $form['title'] = array(
     '#type' => 'textfield',
     '#title' => t('Title'),
