Index: misc/tabledrag.js
===================================================================
RCS file: /cvs/drupal/drupal/misc/tabledrag.js,v
retrieving revision 1.28
diff -u -p -r1.28 tabledrag.js
--- misc/tabledrag.js	27 Apr 2009 20:19:35 -0000	1.28
+++ misc/tabledrag.js	8 Jun 2009 23:52:08 -0000
@@ -79,13 +79,15 @@ Drupal.tableDrag = function (table, tabl
     // manually append 2 indentations in the first draggable row, measure
     // the offset, then remove.
     var indent = Drupal.theme('tableDragIndentation');
-    var testCell = $('tr.draggable:first td:first', table).prepend(indent).prepend(indent);
+    // Match immediate children of the parent element to allow nesting.
+    var testCell = $('> tbody > tr.draggable:first td:first, > tr.draggable:first td:first', table).prepend(indent).prepend(indent);
     this.indentAmount = $('.indentation', testCell).get(1).offsetLeft - $('.indentation', testCell).get(0).offsetLeft;
     $('.indentation', testCell).slice(0, 2).remove();
   }
 
   // Make each applicable row draggable.
-  $('tr.draggable', table).each(function () { self.makeDraggable(this); });
+  // Match immediate children of the parent element to allow nesting.
+  $('> tr.draggable, > tbody > tr.draggable', table).each(function() { self.makeDraggable(this); });
 
   // Hide columns containing affected form elements.
   this.hideColumns();
@@ -115,9 +117,10 @@ Drupal.tableDrag.prototype.hideColumns =
     // Hide the column containing this field.
     if (hidden && cell[0] && cell.css('display') != 'none') {
       // Add 1 to our indexes. The nth-child selector is 1 based, not 0 based.
-      var columnIndex = $('td', cell.parent()).index(cell.get(0)) + 1;
-      var headerIndex = $('td:not(:hidden)', cell.parent()).index(cell.get(0)) + 1;
-      $('tr', this.table).each(function () {
+      // Match immediate children of the parent element to allow nesting.
+      var columnIndex = $('> td', cell.parent()).index(cell.get(0)) + 1;
+      var headerIndex = $('> td:not(:hidden)', cell.parent()).index(cell.get(0)) + 1;
+      $('> thead > tr, > tbody > tr, > tr', this.table).each(function(){
         var row = $(this);
         var parentTag = row.parent().get(0).tagName.toLowerCase();
         var index = (parentTag == 'thead') ? headerIndex : columnIndex;
@@ -763,7 +766,8 @@ Drupal.tableDrag.prototype.setScroll = f
 Drupal.tableDrag.prototype.restripeTable = function () {
   // :even and :odd are reversed because jQuery counts from 0 and
   // we count from 1, so we're out of sync.
-  $('tr.draggable', this.table)
+  // Match immediate children of the parent element to allow nesting.
+  $('> tbody > tr.draggable, > tr.draggable', this.table)
     .filter(':odd').filter('.odd')
       .removeClass('odd').addClass('even')
     .end().end()
