cms/drupal/misc/collapse.js
changeset 541 e756a8c72c3d
equal deleted inserted replaced
540:07239de796bb 541:e756a8c72c3d
       
     1 (function ($) {
       
     2 
       
     3 /**
       
     4  * Toggle the visibility of a fieldset using smooth animations.
       
     5  */
       
     6 Drupal.toggleFieldset = function (fieldset) {
       
     7   var $fieldset = $(fieldset);
       
     8   if ($fieldset.is('.collapsed')) {
       
     9     var $content = $('> .fieldset-wrapper', fieldset).hide();
       
    10     $fieldset
       
    11       .removeClass('collapsed')
       
    12       .trigger({ type: 'collapsed', value: false })
       
    13       .find('> legend span.fieldset-legend-prefix').html(Drupal.t('Hide'));
       
    14     $content.slideDown({
       
    15       duration: 'fast',
       
    16       easing: 'linear',
       
    17       complete: function () {
       
    18         Drupal.collapseScrollIntoView(fieldset);
       
    19         fieldset.animating = false;
       
    20       },
       
    21       step: function () {
       
    22         // Scroll the fieldset into view.
       
    23         Drupal.collapseScrollIntoView(fieldset);
       
    24       }
       
    25     });
       
    26   }
       
    27   else {
       
    28     $fieldset.trigger({ type: 'collapsed', value: true });
       
    29     $('> .fieldset-wrapper', fieldset).slideUp('fast', function () {
       
    30       $fieldset
       
    31         .addClass('collapsed')
       
    32         .find('> legend span.fieldset-legend-prefix').html(Drupal.t('Show'));
       
    33       fieldset.animating = false;
       
    34     });
       
    35   }
       
    36 };
       
    37 
       
    38 /**
       
    39  * Scroll a given fieldset into view as much as possible.
       
    40  */
       
    41 Drupal.collapseScrollIntoView = function (node) {
       
    42   var h = document.documentElement.clientHeight || document.body.clientHeight || 0;
       
    43   var offset = document.documentElement.scrollTop || document.body.scrollTop || 0;
       
    44   var posY = $(node).offset().top;
       
    45   var fudge = 55;
       
    46   if (posY + node.offsetHeight + fudge > h + offset) {
       
    47     if (node.offsetHeight > h) {
       
    48       window.scrollTo(0, posY);
       
    49     }
       
    50     else {
       
    51       window.scrollTo(0, posY + node.offsetHeight - h + fudge);
       
    52     }
       
    53   }
       
    54 };
       
    55 
       
    56 Drupal.behaviors.collapse = {
       
    57   attach: function (context, settings) {
       
    58     $('fieldset.collapsible', context).once('collapse', function () {
       
    59       var $fieldset = $(this);
       
    60       // Expand fieldset if there are errors inside, or if it contains an
       
    61       // element that is targeted by the URI fragment identifier.
       
    62       var anchor = location.hash && location.hash != '#' ? ', ' + location.hash : '';
       
    63       if ($fieldset.find('.error' + anchor).length) {
       
    64         $fieldset.removeClass('collapsed');
       
    65       }
       
    66 
       
    67       var summary = $('<span class="summary"></span>');
       
    68       $fieldset.
       
    69         bind('summaryUpdated', function () {
       
    70           var text = $.trim($fieldset.drupalGetSummary());
       
    71           summary.html(text ? ' (' + text + ')' : '');
       
    72         })
       
    73         .trigger('summaryUpdated');
       
    74 
       
    75       // Turn the legend into a clickable link, but retain span.fieldset-legend
       
    76       // for CSS positioning.
       
    77       var $legend = $('> legend .fieldset-legend', this);
       
    78 
       
    79       $('<span class="fieldset-legend-prefix element-invisible"></span>')
       
    80         .append($fieldset.hasClass('collapsed') ? Drupal.t('Show') : Drupal.t('Hide'))
       
    81         .prependTo($legend)
       
    82         .after(' ');
       
    83 
       
    84       // .wrapInner() does not retain bound events.
       
    85       var $link = $('<a class="fieldset-title" href="#"></a>')
       
    86         .prepend($legend.contents())
       
    87         .appendTo($legend)
       
    88         .click(function () {
       
    89           var fieldset = $fieldset.get(0);
       
    90           // Don't animate multiple times.
       
    91           if (!fieldset.animating) {
       
    92             fieldset.animating = true;
       
    93             Drupal.toggleFieldset(fieldset);
       
    94           }
       
    95           return false;
       
    96         });
       
    97 
       
    98       $legend.append(summary);
       
    99     });
       
   100   }
       
   101 };
       
   102 
       
   103 })(jQuery);