Index: nodequeue_dragdrop.js
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/nodequeue/nodequeue_dragdrop.js,v
retrieving revision 1.1
diff -u -p -r1.1 nodequeue_dragdrop.js
--- nodequeue_dragdrop.js	6 Jan 2009 15:23:00 -0000	1.1
+++ nodequeue_dragdrop.js	14 May 2009 17:35:52 -0000
@@ -1,4 +1,85 @@
-$(document).ready(function() {
+// $Id$
+
+Drupal.behaviors.nodequeueInit = function(context) {
+  Drupal.nodequeue = {changed: false};
+}
+
+Drupal.behaviors.nodequeueReverse = function(context) {
+  $('#edit-reverse').click(function(){
+    // reverse table rows...
+    $('tr.draggable').each(function(i){
+      $('.nodequeue-dragdrop tbody').prepend(this);
+    });
+
+    // ...and update node positions
+    var size = $('.node-position').size();
+    $('.node-position').each(function(i){
+      var val = $(this).val();
+      $(this).val(size - val + 1);
+    });
+
+    if (Drupal.nodequeue.changed == false) {
+      $(Drupal.theme('tableDragChangedWarning')).insertAfter('.nodequeue-dragdrop').hide().fadeIn('slow');
+      Drupal.nodequeue.changed = true;
+    }
+
+    nodequeueRestripeTable();
+
+    return false;
+  });
+};
+
+Drupal.behaviors.nodequeueShuffle = function(context) {
+  $('#edit-shuffle').click(function(){
+    // randomize table rows...
+    rows = $('table.nodequeue-dragdrop tbody tr:not(:hidden)').get();
+    rows.sort(function(){return (Math.round(Math.random())-0.5);});
+    $.each(rows, function(i, row) {
+      $('.nodequeue-dragdrop tbody').prepend(this);
+    });
+
+    // ...and update node positions
+    var size = $('.node-position').size();
+    $('.node-position').each(function(i){
+      var val = $(this).val();
+      $(this).val(size);
+      size--;
+    });
+
+    if (Drupal.nodequeue.changed == false) {
+      $(Drupal.theme('tableDragChangedWarning')).insertAfter('.nodequeue-dragdrop').hide().fadeIn('slow');
+      Drupal.nodequeue.changed = true;
+    }
+
+    nodequeueRestripeTable();
+
+    return false;
+  });
+};
+
+Drupal.behaviors.nodequeueClear = function(context) {
+  $('#edit-clear').click(function(){
+    // mark nodes for removal
+    $('.node-position').each(function(i){
+      $(this).val('r');
+    });
+
+    // remove table rows...
+    rows = $('table.nodequeue-dragdrop tbody tr:not(:hidden)').hide();
+
+    // display 'empty queue' message
+    $('.nodequeue-dragdrop tbody').prepend('<tr class="odd"><td colspan="5">No nodes in this queue.</td></tr>');
+
+    if (Drupal.nodequeue.changed == false) {
+      $(Drupal.theme('tableDragChangedWarning')).insertAfter('.nodequeue-dragdrop').hide().fadeIn('slow');
+      Drupal.nodequeue.changed = true;
+    }
+
+    return false;
+  });
+};
+
+Drupal.behaviors.nodequeueRemoveNode = function(context) {
   $('a.nodequeue-remove').css("display", "block");
   $('a.nodequeue-remove').click(function() {
     a = $(this).attr('id');
@@ -6,15 +87,23 @@ $(document).ready(function() {
     $(a).val('r');
     //Hide the current row
     $(this).parent().parent().addClass('hidden').hide();
-    //Restripe the table
-    // :even and :odd are reversed because jquery counts from 0 and
-    // we count from 1, so we're out of sync.
-    $('table.nodequeue-dragdrop tr:not(:hidden)')
-     .filter(':odd').filter('.odd')
-      .removeClass('odd').addClass('even')
-    .end().end()
-    .filter(':even').filter('.even')
-      .removeClass('even').addClass('odd');
+
+    nodequeueRestripeTable()
+
     return false;
   });
-});
\ No newline at end of file
+}
+
+/**
+ * Restripe the nodequeue table after removing an element or changing the
+ * order of the elements.
+ */
+function nodequeueRestripeTable() {
+  $('table.nodequeue-dragdrop tbody tr:not(:hidden)')
+   .filter(':odd') //.filter('.odd')
+    .removeClass('odd').addClass('even')
+      .end()
+  .filter(':even')
+    .removeClass('even').addClass('odd')
+      .end();
+}
