Index: includes/common.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/common.inc,v
retrieving revision 1.1176
diff -u -p -r1.1176 common.inc
--- includes/common.inc	9 Jun 2010 14:55:30 -0000	1.1176
+++ includes/common.inc	9 Jun 2010 15:47:57 -0000
@@ -4277,6 +4277,7 @@
     // Add the table drag JavaScript to the page before the module JavaScript
     // to ensure that table drag behaviors are registered before any module
     // uses it.
+    drupal_add_js('misc/jquery.cookie.js', array('weight' => JS_DEFAULT - 2));
     drupal_add_js('misc/tabledrag.js', array('weight' => JS_DEFAULT - 1));
     $js_added = TRUE;
   }
Index: misc/tabledrag.js
===================================================================
RCS file: /cvs/drupal/drupal/misc/tabledrag.js,v
retrieving revision 1.38
diff -u -p -r1.38 tabledrag.js
--- misc/tabledrag.js	18 May 2010 06:46:45 -0000	1.38
+++ misc/tabledrag.js	9 Jun 2010 18:46:57 -0000
@@ -81,10 +81,29 @@
 
   // Make each applicable row draggable.
   // Match immediate children of the parent element to allow nesting.
-  $('> tr.draggable, > tbody > tr.draggable', table).each(function() { self.makeDraggable(this); });
+  $('> tr.draggable, > tbody > tr.draggable', table).each(function () { self.makeDraggable(this); });
 
-  // Hide columns containing affected form elements.
-  this.hideColumns();
+  // Add a link before the table for users to show or hide weight columns.
+  $(table).before($('<a href="#" class="tabledrag-toggle-weight"></a>')
+    .attr('title', Drupal.t('Accessibility improvement by making certain form fields directly accessible.'))
+    .click(function () {
+      if ($.cookie('Drupal.tableDrag.showWeight') == 1) {
+        self.hideColumns();
+      }
+      else {
+        self.showColumns();
+      }
+      return false;
+    })
+    .wrap('<div class="tabledrag-toggle-weight-wrapper"></div>')
+    .parent()
+  );
+
+  // Initialize the specified columns (for example, weight or parent columns)
+  // to show or hide according to user preference. This aids accessibility 
+  // so that, e.g., screen reader users can choose to enter weight values and 
+  // manipulate form elements directly, rather than using drag-and-drop..
+  self.initColumns();
 
   // Add mouse bindings to the document. The self variable is passed along
   // as event handlers do not have direct access to the tableDrag object.
@@ -93,10 +112,14 @@
 };
 
 /**
- * Hide the columns containing form elements according to the settings for
- * this tableDrag instance.
+ * Initialize columns containing form elements to be hidden by default,
+ * according to the settings for this tableDrag instance.
+ *
+ * Identify and mark each cell with a CSS class so we can easily toggle
+ * show/hide it. Finally, hide columns if user does not have a
+ * 'Drupal.tableDrag.showWeight' cookie.
  */
-Drupal.tableDrag.prototype.hideColumns = function () {
+Drupal.tableDrag.prototype.initColumns = function () {
   for (var group in this.tableSettings) {
     // Find the first field in this group.
     for (var d in this.tableSettings[group]) {
@@ -108,13 +131,13 @@
       }
     }
 
-    // Hide the column containing this field.
+    // Mark the column containing this field so it can be hidden.
     if (hidden && cell[0] && cell.css('display') != 'none') {
       // Add 1 to our indexes. The nth-child selector is 1 based, not 0 based.
       // 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(){
+      $('> 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;
@@ -128,18 +151,86 @@
         if (index > 0) {
           cell = row.children(':nth-child(' + index + ')');
           if (cell[0].colSpan > 1) {
-            // If this cell has a colspan, simply reduce it.
-            cell[0].colSpan = cell[0].colSpan - 1;
+            // If this cell has a colspan, mark it so we can reduce the colspan.
+            $(cell[0]).addClass('tabledrag-has-colspan');
           }
           else {
-            // Hide table body cells, but remove table header cells entirely
-            // (Safari doesn't hide properly).
-            parentTag == 'thead' ? cell.remove() : cell.css('display', 'none');
+            // Mark this cell so we can hide it.
+            $(cell[0]).addClass('tabledrag-hide');
           }
         }
       });
     }
   }
+
+  // Now hide cells and reduce colspans unless cookie indicates previous choice.
+  // Set a cookie if it is not already present.
+  if ($.cookie('Drupal.tableDrag.showWeight') === null) {
+    $.cookie('Drupal.tableDrag.showWeight', 0, {
+      path: Drupal.settings.basePath,
+      // The cookie expires in one year.
+      expires: 365
+      }
+    );
+    this.hideColumns();
+  }
+  // Check cookie value and show/hide weight columns accordingly.
+  else {
+    if ($.cookie('Drupal.tableDrag.showWeight') == 1) {
+      this.showColumns();
+    }
+    else {
+      this.hideColumns();
+    }
+  }
+};
+
+/**
+ * Hide the columns containing weight/parent form elements.
+ * Undo showColumns().
+ */
+Drupal.tableDrag.prototype.hideColumns = function () {
+  // Hide weight/parent cells and headers.
+  $('.tabledrag-hide', 'table.tabledrag-processed').css('display', 'none');
+  // Show TableDrag handles.
+  $('.tabledrag-handle', 'table.tabledrag-processed').css('display', '');
+  // Reduce the colspan of any effected multi-span columns.
+  $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () {
+    this.colSpan = this.colSpan - 1;
+  });
+  // Change link text.
+  $('.tabledrag-toggle-weight').text(Drupal.t('Show row weights'));
+  // Change cookie.
+  $.cookie('Drupal.tableDrag.showWeight', 0, {
+    path: Drupal.settings.basePath,
+    // The cookie expires in one year.
+    expires: 365
+    }
+  );
+};
+
+/**
+ * Show the columns containing weight/parent form elements
+ * Undo hideColumns().
+ */
+Drupal.tableDrag.prototype.showColumns = function () {
+  // Show weight/parent cells and headers.
+  $('.tabledrag-hide', 'table.tabledrag-processed').css('display', '');
+  // Hide TableDrag handles.
+  $('.tabledrag-handle', 'table.tabledrag-processed').css('display', 'none');
+  // Increase the colspan for any columns where it was previously reduced.
+  $('.tabledrag-has-colspan', 'table.tabledrag-processed').each(function () {
+    this.colSpan = this.colSpan + 1;
+  });
+  // Change link text.
+  $('.tabledrag-toggle-weight').text(Drupal.t('Hide row weights'));
+  // Change cookie.
+  $.cookie('Drupal.tableDrag.showWeight', 1, {
+    path: Drupal.settings.basePath,
+    // The cookie expires in one year.
+    expires: 365
+    }
+  );
 };
 
 /**
@@ -442,7 +533,7 @@
       // fields in the entire dragged group.
       for (var group in self.tableSettings) {
         var rowSettings = self.rowSettings(group, droppedRow);
-        if (rowSettings.relationship == 'group') {
+        if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'group') {
           for (var n in self.rowObject.children) {
             self.updateField(self.rowObject.children[n], group);
           }
@@ -594,11 +685,11 @@
   var rowSettings = this.rowSettings(group, changedRow);
 
   // Set the row as it's own target.
-  if (rowSettings.relationship == 'self' || rowSettings.relationship == 'group') {
+  if (typeof rowSettings != 'undefined' && (rowSettings.relationship == 'self' || rowSettings.relationship == 'group')) {
     var sourceRow = changedRow;
   }
   // Siblings are easy, check previous and next rows.
-  else if (rowSettings.relationship == 'sibling') {
+  else if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'sibling') {
     var previousRow = $(changedRow).prev('tr').get(0);
     var nextRow = $(changedRow).next('tr').get(0);
     var sourceRow = changedRow;
@@ -625,7 +716,7 @@
   }
   // Parents, look up the tree until we find a field not in this group.
   // Go up as many parents as indentations in the changed row.
-  else if (rowSettings.relationship == 'parent') {
+  else if (typeof rowSettings != 'undefined' && rowSettings.relationship == 'parent') {
     var previousRow = $(changedRow).prev('tr');
     while (previousRow.length && $('.indentation', previousRow).length >= this.rowObject.indents) {
       previousRow = previousRow.prev('tr');
@@ -660,8 +751,10 @@
     rowSettings.source = rowSettings.target;
   }
 
-  var targetClass = '.' + rowSettings.target;
-  var targetElement = $(targetClass, changedRow).get(0);
+  if (typeof rowSettings != 'undefined') {
+    var targetClass = '.' + rowSettings.target;
+    var targetElement = $(targetClass, changedRow).get(0);
+  }
 
   // Check if a target element exists in this row.
   if (targetElement) {
Index: modules/block/block.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/block/block.admin.inc,v
retrieving revision 1.80
diff -u -p -r1.80 block.admin.inc
--- modules/block/block.admin.inc	13 May 2010 07:53:02 -0000	1.80
+++ modules/block/block.admin.inc	1 Jun 2010 16:18:40 -0000
@@ -80,6 +80,8 @@
       '#type' => 'weight',
       '#default_value' => $block['weight'],
       '#delta' => $weight_delta,
+      '#title_display' => 'invisible',
+      '#title' => t('Weight for @row', array('@row' => $block['info'])),
     );
     $form[$key]['region'] = array(
       '#type' => 'select',
Index: modules/field_ui/field_ui.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/field_ui/field_ui.admin.inc,v
retrieving revision 1.52
diff -u -p -r1.52 field_ui.admin.inc
--- modules/field_ui/field_ui.admin.inc	31 May 2010 18:15:20 -0000	1.52
+++ modules/field_ui/field_ui.admin.inc	9 Jun 2010 18:58:10 -0000
@@ -137,7 +137,9 @@
         '#type' => 'textfield',
         '#default_value' => $weight,
         '#size' => 3,
-       ),
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for @row', array('@row' => $instance['label'])),
+      ),
       'hidden_name' => array(
         '#type' => 'hidden',
         '#default_value' => $instance['field_name'],
@@ -159,7 +161,7 @@
     $weight = $extra_field['weight'];
     $form[$name] = array(
       'label' => array(
-        '#markup' => check_plain($extra_field['label']),
+        '#markup' => $label,
       ),
       'name' => array(
         '#markup' => $name,
@@ -171,6 +173,8 @@
         '#type' => 'textfield',
         '#default_value' => $weight,
         '#size' => 3,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for @row', array('@row' => $extra_field['label'])),
       ),
       'edit' => array(
         '#markup' => isset($extra_field['edit']) ? $extra_field['edit'] : '',
@@ -226,6 +230,8 @@
         '#type' => 'textfield',
         '#default_value' => $weight,
         '#size' => 3,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for new field'),
       ),
       'hidden_name' => array(
         '#type' => 'hidden',
@@ -263,6 +269,8 @@
         '#type' => 'textfield',
         '#default_value' => $weight,
         '#size' => 3,
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for added field'),
       ),
       'hidden_name' => array(
         '#type' => 'hidden',
Index: modules/menu/menu.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/menu/menu.admin.inc,v
retrieving revision 1.79
diff -u -p -r1.79 menu.admin.inc
--- modules/menu/menu.admin.inc	4 May 2010 20:31:53 -0000	1.79
+++ modules/menu/menu.admin.inc	1 Jun 2010 16:18:40 -0000
@@ -106,15 +106,16 @@
         '#type' => 'weight',
         '#delta' => 50,
         '#default_value' => isset($form_state[$mlid]['weight']) ? $form_state[$mlid]['weight'] : $item['weight'],
+        '#title_display' => 'invisible',
+        '#title' => t('Weight for @row', array('@row' => $item['title'])),
       );
       $form[$mlid]['mlid'] = array(
         '#type' => 'hidden',
         '#value' => $item['mlid'],
       );
       $form[$mlid]['plid'] = array(
-        '#type' => 'textfield',
+        '#type' => 'hidden',
         '#default_value' => isset($form_state[$mlid]['plid']) ? $form_state[$mlid]['plid'] : $item['plid'],
-        '#size' => 6,
       );
       // Build a list of operations.
       $operations = array();
Index: modules/system/system-behavior-rtl.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system-behavior-rtl.css,v
retrieving revision 1.3
diff -u -p -r1.3 system-behavior-rtl.css
--- modules/system/system-behavior-rtl.css	28 Apr 2010 20:08:39 -0000	1.3
+++ modules/system/system-behavior-rtl.css	9 Jun 2010 18:56:48 -0000
@@ -75,6 +75,9 @@
 div.tree-child-last {
   background-position: -65px center;
 }
+.tabledrag-toggle-weight-wrapper {
+  text-align: left; /* RTL */
+}
 
 /**
  * Multiselect form
Index: modules/system/system-behavior.css
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system-behavior.css,v
retrieving revision 1.9
diff -u -p -r1.9 system-behavior.css
--- modules/system/system-behavior.css	28 Apr 2010 20:08:39 -0000	1.9
+++ modules/system/system-behavior.css	1 Jun 2010 16:18:41 -0000
@@ -130,6 +130,12 @@
 div.tree-child-horizontal {
   background: url(../../misc/tree.png) no-repeat -11px center;
 }
+.tabledrag-toggle-weight-wrapper {
+  text-align: right; /* LTR */
+}
+.tabledrag-toggle-weight {
+  font-size: 0.9em;
+}
 
 /**
  * Progress bar

