text: // $Id$
  (function ($) {
  
  /**
   * Provide the summary information for the block settings vertical tabs.
   */
  Drupal.behaviors.blockSettingsSummary = {
    attach: function (context) {
      // The drupalSetSummary method required for this behavior is not available
      // on the Blocks administration page, so we need to make sure this
      // behavior is processed only if drupalSetSummary is defined.
      if (typeof jQuery.fn.drupalSetSummary == 'undefined') {
        return;
      }
  
      $('fieldset#edit-path', context).drupalSetSummary(function (context) {
        if (!$('textarea[name="pages"]', context).val()) {
          return Drupal.t('Not restricted');
        }
        else {
          return Drupal.t('Restricted to certain pages');
        }
      });
  
      $('fieldset#edit-node-type', context).drupalSetSummary(function (context) {
        var vals = [];
        $('input[type="checkbox"]:checked', context).each(function () {
          vals.push($.trim($(this).next('label').text()));
        });
        if (!vals.length) {
          vals.push(Drupal.t('Not restricted'));
        }
        return vals.join(', ');
      });
  
      $('fieldset#edit-role', context).drupalSetSummary(function (context) {
        var vals = [];
        $('input[type="checkbox"]:checked', context).each(function () {
          vals.push($.trim($(this).next('label').text()));
        });
        if (!vals.length) {
          vals.push(Drupal.t('Not restricted'));
        }
        return vals.join(', ');
      });
  
      $('fieldset#edit-user', context).drupalSetSummary(function (context) {
        var $radio = $('input[name="custom"]:checked', context);
        if ($radio.val() == 0) {
          return Drupal.t('Not customizable');
        }
        else {
          return $radio.next('label').text();
        }
      });
    }
  };
  
  /**
   * Move a block in the blocks table from one region to another via select list.
   *
   * This behavior is dependent on the tableDrag behavior, since it uses the
   * objects initialized in that behavior to update the row.
   */
  Drupal.behaviors.blockDrag = {
    attach: function (context, settings) {
      // tableDrag is required and we should be on the blocks admin page.
      if (typeof Drupal.tableDrag == 'undefined' || typeof Drupal.tableDrag.blocks == 'undefined') {
        return;
      }
  
      var table = $('table#blocks');
      var tableDrag = Drupal.tableDrag.blocks; // Get the blocks tableDrag object.
  
      // Add a handler for when a row is swapped, update empty regions.
      tableDrag.row.prototype.onSwap = function (swappedRow) {
        checkEmptyRegions(table, this);
      };
  
      // A custom message for the blocks page specifically.
      Drupal.theme.tableDragChangedWarning = function () {
        return '<div class="messages warning">' + Drupal.theme('tableDragChangedMarker') + ' ' + Drupal.t('The changes to these blocks will not be saved until the <em>Save blocks</em> button is clicked.') + '</div>';
      };
  
      // Add a handler so when a row is dropped, update fields dropped into new regions.
      tableDrag.onDrop = function () {
        dragObject = this;
        // Use "region-message" row instead of "region" row because
        // "region-{region_name}-message" is less prone to regexp match errors.
        var regionRow = $(dragObject.rowObject.element).prevAll('tr.region-message').get(0);
        var regionName = regionRow.className.replace(/([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/, '$2');
        var regionField = $('select.block-region-select', dragObject.rowObject.element);
        // Check whether the newly picked region is available for this block.
        if ($('option[value=' + regionName + ']', regionField).length == 0) {
          // If not, alert the user and keep the block in its old region setting.
          alert(Drupal.t('The block cannot be placed in this region.'));
          // Simulate that there was a selected element change, so the row is put
          // back to from where the user tried to drag it.
          regionField.change();
        }
        else if ($(dragObject.rowObject.element).prev('tr').is('.region-message')) {
          var weightField = $('select.block-weight', dragObject.rowObject.element);
          var oldRegionName = weightField[0].className.replace(/([^ ]+[ ]+)*block-weight-([^ ]+)([ ]+[^ ]+)*/, '$2');
  
          if (!regionField.is('.block-region-' + regionName)) {
            regionField.removeClass('block-region-' + oldRegionName).addClass('block-region-' + regionName);
            weightField.removeClass('block-weight-' + oldRegionName).addClass('block-weight-' + regionName);
            regionField.val(regionName);
          }
        }
      };
  
      // Add the behavior to each region select list.
      $('select.block-region-select', context).once('block-region-select', function () {
        $(this).change(function (event) {
          // Make our new row and select field.
          var row = $(this).parents('tr:first');
          var select = $(this);
          tableDrag.rowObject = new tableDrag.row(row);
  
          // Find the correct region and insert the row as the first in the region.
          $('tr.region-message', table).each(function () {
            if ($(this).is('.region-' + select[0].value + '-message')) {
              // Add the new row and remove the old one.
              $(this).after(row);
              // Manually update weights and restripe.
              tableDrag.updateFields(row.get(0));
              tableDrag.rowObject.changed = true;
              if (tableDrag.oldRowElement) {
                $(tableDrag.oldRowElement).removeClass('drag-previous');
              }
              tableDrag.oldRowElement = row.get(0);
              tableDrag.restripeTable();
              tableDrag.rowObject.markChanged();
              tableDrag.oldRowElement = row;
              $(row).addClass('drag-previous');
            }
          });
  
          // Modify empty regions with added or removed fields.
          checkEmptyRegions(table, row);
          // Remove focus from selectbox.
          select.get(0).blur();
        });
      });
  
      var checkEmptyRegions = function (table, rowObject) {
        $('tr.region-message', table).each(function () {
          // If the dragged row is in this region, but above the message row, swap it down one space.
          if ($(this).prev('tr').get(0) == rowObject.element) {
            // Prevent a recursion problem when using the keyboard to move rows up.
            if ((rowObject.method != 'keyboard' || rowObject.direction == 'down')) {
              rowObject.swap('after', this);
            }
          }
          // This region has become empty.
          if ($(this).next('tr').is(':not(.draggable)') || $(this).next('tr').size() == 0) {
            $(this).removeClass('region-populated').addClass('region-empty');
          }
          // This region has become populated.
          else if ($(this).is('.region-empty')) {
            $(this).removeClass('region-empty').addClass('region-populated');
          }
        });
      };
    }
  };
  
  })(jQuery);
  