| 
webmaster@1
 | 
     1 // $Id: block.js,v 1.2 2007/12/16 10:36:53 goba Exp $ | 
| 
webmaster@1
 | 
     2  | 
| 
webmaster@1
 | 
     3 /** | 
| 
webmaster@1
 | 
     4  * Move a block in the blocks table from one region to another via select list. | 
| 
webmaster@1
 | 
     5  * | 
| 
webmaster@1
 | 
     6  * This behavior is dependent on the tableDrag behavior, since it uses the | 
| 
webmaster@1
 | 
     7  * objects initialized in that behavior to update the row. | 
| 
webmaster@1
 | 
     8  */ | 
| 
webmaster@1
 | 
     9 Drupal.behaviors.blockDrag = function(context) { | 
| 
webmaster@1
 | 
    10   var table = $('table#blocks'); | 
| 
webmaster@1
 | 
    11   var tableDrag = Drupal.tableDrag.blocks; // Get the blocks tableDrag object. | 
| 
webmaster@1
 | 
    12  | 
| 
webmaster@1
 | 
    13   // Add a handler for when a row is swapped, update empty regions. | 
| 
webmaster@1
 | 
    14   tableDrag.row.prototype.onSwap = function(swappedRow) { | 
| 
webmaster@1
 | 
    15     checkEmptyRegions(table, this); | 
| 
webmaster@1
 | 
    16   }; | 
| 
webmaster@1
 | 
    17  | 
| 
webmaster@1
 | 
    18   // A custom message for the blocks page specifically. | 
| 
webmaster@1
 | 
    19   Drupal.theme.tableDragChangedWarning = function () { | 
| 
webmaster@1
 | 
    20     return '<div class="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>'; | 
| 
webmaster@1
 | 
    21   }; | 
| 
webmaster@1
 | 
    22  | 
| 
webmaster@1
 | 
    23   // Add a handler so when a row is dropped, update fields dropped into new regions. | 
| 
webmaster@1
 | 
    24   tableDrag.onDrop = function() { | 
| 
webmaster@1
 | 
    25     dragObject = this; | 
| 
webmaster@1
 | 
    26     if ($(dragObject.rowObject.element).prev('tr').is('.region-message')) { | 
| 
webmaster@1
 | 
    27       var regionRow = $(dragObject.rowObject.element).prev('tr').get(0); | 
| 
webmaster@1
 | 
    28       var regionName = regionRow.className.replace(/([^ ]+[ ]+)*region-([^ ]+)-message([ ]+[^ ]+)*/, '$2'); | 
| 
webmaster@1
 | 
    29       var regionField = $('select.block-region-select', dragObject.rowObject.element); | 
| 
webmaster@1
 | 
    30       var weightField = $('select.block-weight', dragObject.rowObject.element); | 
| 
webmaster@1
 | 
    31       var oldRegionName = weightField[0].className.replace(/([^ ]+[ ]+)*block-weight-([^ ]+)([ ]+[^ ]+)*/, '$2'); | 
| 
webmaster@1
 | 
    32  | 
| 
webmaster@1
 | 
    33       if (!regionField.is('.block-region-'+ regionName)) { | 
| 
webmaster@1
 | 
    34         regionField.removeClass('block-region-' + oldRegionName).addClass('block-region-' + regionName); | 
| 
webmaster@1
 | 
    35         weightField.removeClass('block-weight-' + oldRegionName).addClass('block-weight-' + regionName); | 
| 
webmaster@1
 | 
    36         regionField.val(regionName); | 
| 
webmaster@1
 | 
    37       } | 
| 
webmaster@1
 | 
    38     } | 
| 
webmaster@1
 | 
    39   }; | 
| 
webmaster@1
 | 
    40  | 
| 
webmaster@1
 | 
    41   // Add the behavior to each region select list. | 
| 
webmaster@1
 | 
    42   $('select.block-region-select:not(.blockregionselect-processed)', context).each(function() { | 
| 
webmaster@1
 | 
    43     $(this).change(function(event) { | 
| 
webmaster@1
 | 
    44       // Make our new row and select field. | 
| 
webmaster@1
 | 
    45       var row = $(this).parents('tr:first'); | 
| 
webmaster@1
 | 
    46       var select = $(this); | 
| 
webmaster@1
 | 
    47       tableDrag.rowObject = new tableDrag.row(row); | 
| 
webmaster@1
 | 
    48  | 
| 
webmaster@1
 | 
    49       // Find the correct region and insert the row as the first in the region. | 
| 
webmaster@1
 | 
    50       $('tr.region-message', table).each(function() { | 
| 
webmaster@1
 | 
    51         if ($(this).is('.region-' + select[0].value + '-message')) { | 
| 
webmaster@1
 | 
    52           // Add the new row and remove the old one. | 
| 
webmaster@1
 | 
    53           $(this).after(row); | 
| 
webmaster@1
 | 
    54           // Manually update weights and restripe. | 
| 
webmaster@1
 | 
    55           tableDrag.updateFields(row.get(0)); | 
| 
webmaster@1
 | 
    56           tableDrag.rowObject.changed = true; | 
| 
webmaster@1
 | 
    57           if (tableDrag.oldRowElement) { | 
| 
webmaster@1
 | 
    58             $(tableDrag.oldRowElement).removeClass('drag-previous'); | 
| 
webmaster@1
 | 
    59           } | 
| 
webmaster@1
 | 
    60           tableDrag.oldRowElement = row.get(0); | 
| 
webmaster@1
 | 
    61           tableDrag.restripeTable(); | 
| 
webmaster@1
 | 
    62           tableDrag.rowObject.markChanged(); | 
| 
webmaster@1
 | 
    63           tableDrag.oldRowElement = row; | 
| 
webmaster@1
 | 
    64           $(row).addClass('drag-previous'); | 
| 
webmaster@1
 | 
    65         } | 
| 
webmaster@1
 | 
    66       }); | 
| 
webmaster@1
 | 
    67  | 
| 
webmaster@1
 | 
    68       // Modify empty regions with added or removed fields. | 
| 
webmaster@1
 | 
    69       checkEmptyRegions(table, row); | 
| 
webmaster@1
 | 
    70       // Remove focus from selectbox. | 
| 
webmaster@1
 | 
    71       select.get(0).blur(); | 
| 
webmaster@1
 | 
    72     }); | 
| 
webmaster@1
 | 
    73     $(this).addClass('blockregionselect-processed'); | 
| 
webmaster@1
 | 
    74   }); | 
| 
webmaster@1
 | 
    75  | 
| 
webmaster@1
 | 
    76   var checkEmptyRegions = function(table, rowObject) { | 
| 
webmaster@1
 | 
    77     $('tr.region-message', table).each(function() { | 
| 
webmaster@1
 | 
    78       // If the dragged row is in this region, but above the message row, swap it down one space. | 
| 
webmaster@1
 | 
    79       if ($(this).prev('tr').get(0) == rowObject.element) { | 
| 
webmaster@1
 | 
    80         // Prevent a recursion problem when using the keyboard to move rows up. | 
| 
webmaster@1
 | 
    81         if ((rowObject.method != 'keyboard' || rowObject.direction == 'down')) { | 
| 
webmaster@1
 | 
    82           rowObject.swap('after', this); | 
| 
webmaster@1
 | 
    83         } | 
| 
webmaster@1
 | 
    84       } | 
| 
webmaster@1
 | 
    85       // This region has become empty | 
| 
webmaster@1
 | 
    86       if ($(this).next('tr').is(':not(.draggable)') || $(this).next('tr').size() == 0) { | 
| 
webmaster@1
 | 
    87         $(this).removeClass('region-populated').addClass('region-empty'); | 
| 
webmaster@1
 | 
    88       } | 
| 
webmaster@1
 | 
    89       // This region has become populated. | 
| 
webmaster@1
 | 
    90       else if ($(this).is('.region-empty')) { | 
| 
webmaster@1
 | 
    91         $(this).removeClass('region-empty').addClass('region-populated'); | 
| 
webmaster@1
 | 
    92       } | 
| 
webmaster@1
 | 
    93     }); | 
| 
webmaster@1
 | 
    94   }; | 
| 
webmaster@1
 | 
    95 }; |