Index: nodequeue.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue.module,v
retrieving revision 1.107.2.10
diff -u -r1.107.2.10 nodequeue.module
--- nodequeue.module	13 Jan 2011 20:34:20 -0000	1.107.2.10
+++ nodequeue.module	7 Feb 2011 20:27:45 -0000
@@ -1097,8 +1097,10 @@
 
   // prepare the main part of the form which will be themed as a table
   $count = count($nodes);
+  $position = 0;
   foreach ($nodes as $node) {
     $form[$node->nid]['#node'] = (array) $node;
+    $position++;
     if ($node->visible) {
       $form[$node->nid]['#node'] = (array) $node;
       $form[$node->nid]['title'] = array('#value' => l($node->title, 'node/'. $node->nid));
@@ -1115,7 +1117,7 @@
     $form[$node->nid]['position'] = array(
       '#type' => 'position',
       '#delta' => $count,
-      '#default_value' => $node->position,
+      '#default_value' => $position,
       '#attributes' => array(
         'class' => 'node-position',
       ),
@@ -1219,24 +1221,31 @@
 function nodequeue_arrange_subqueue_form_submit($form, &$form_state, $reverse = FALSE, $shuffle = FALSE) {
   $nodes = array();
   foreach ($form_state['values'] as $nid => $element) {
-    if (is_numeric($nid)) {
+    if (is_numeric($nid) && is_numeric($form_state['values'][$nid]['position'])) {
       $nodes[$form_state['values'][$nid]['position']] = $nid;
     }
   }
 
   $message = t('The queue has been updated.');
+  $admin_reverse = $form['#queue']['reverse'];
 
-  if ($reverse || $shuffle) {
+  // Order the nodes by their current position.
+  ksort($nodes);
+
+  // Adjust the node order based on reversing or shuffling.
+  if ($admin_reverse || $reverse || $shuffle) {
     $keys = array_keys($nodes);
     $values = array_values($nodes);
 
-    // reverse the list if the reverse button was pressed
-    if ($reverse) {
+    // Reverse if the reverse button was pressed or the list is admin-reversed.
+    if ($admin_reverse || $reverse) {
       $values = array_reverse($values);
-      $message = t('The queue has been reversed.');
+      if ($reverse) {
+        $message = t('The queue has been reversed.');
+      }
     }
 
-    // shuffle the list if the shuffle button was pressed.
+    // Shuffle the list if the shuffle button was pressed.
     if ($shuffle) {
       shuffle($values);
       $message = t('The queue has been shuffled.');
