| 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 }; |