annotate misc/collapse.js @ 20:e3d20ebd63d1 tip

Added tag 6.9 for changeset 3edae6ecd6c6
author Franck Deroche <franck@defr.org>
date Thu, 15 Jan 2009 10:16:10 +0100
parents c1f4ac30525a
children
rev   line source
webmaster@1 1 // $Id: collapse.js,v 1.17 2008/01/29 10:58:25 goba Exp $
webmaster@1 2
webmaster@1 3 /**
webmaster@1 4 * Toggle the visibility of a fieldset using smooth animations
webmaster@1 5 */
webmaster@1 6 Drupal.toggleFieldset = function(fieldset) {
webmaster@1 7 if ($(fieldset).is('.collapsed')) {
webmaster@1 8 // Action div containers are processed separately because of a IE bug
webmaster@1 9 // that alters the default submit button behavior.
webmaster@1 10 var content = $('> div:not(.action)', fieldset);
webmaster@1 11 $(fieldset).removeClass('collapsed');
webmaster@1 12 content.hide();
webmaster@1 13 content.slideDown( {
webmaster@1 14 duration: 'fast',
webmaster@1 15 easing: 'linear',
webmaster@1 16 complete: function() {
webmaster@1 17 Drupal.collapseScrollIntoView(this.parentNode);
webmaster@1 18 this.parentNode.animating = false;
webmaster@1 19 $('div.action', fieldset).show();
webmaster@1 20 },
webmaster@1 21 step: function() {
webmaster@1 22 // Scroll the fieldset into view
webmaster@1 23 Drupal.collapseScrollIntoView(this.parentNode);
webmaster@1 24 }
webmaster@1 25 });
webmaster@1 26 }
webmaster@1 27 else {
webmaster@1 28 $('div.action', fieldset).hide();
webmaster@1 29 var content = $('> div:not(.action)', fieldset).slideUp('fast', function() {
webmaster@1 30 $(this.parentNode).addClass('collapsed');
webmaster@1 31 this.parentNode.animating = false;
webmaster@1 32 });
webmaster@1 33 }
webmaster@1 34 };
webmaster@1 35
webmaster@1 36 /**
webmaster@1 37 * Scroll a given fieldset into view as much as possible.
webmaster@1 38 */
webmaster@1 39 Drupal.collapseScrollIntoView = function (node) {
webmaster@1 40 var h = self.innerHeight || document.documentElement.clientHeight || $('body')[0].clientHeight || 0;
webmaster@1 41 var offset = self.pageYOffset || document.documentElement.scrollTop || $('body')[0].scrollTop || 0;
webmaster@1 42 var posY = $(node).offset().top;
webmaster@1 43 var fudge = 55;
webmaster@1 44 if (posY + node.offsetHeight + fudge > h + offset) {
webmaster@1 45 if (node.offsetHeight > h) {
webmaster@1 46 window.scrollTo(0, posY);
webmaster@1 47 } else {
webmaster@1 48 window.scrollTo(0, posY + node.offsetHeight - h + fudge);
webmaster@1 49 }
webmaster@1 50 }
webmaster@1 51 };
webmaster@1 52
webmaster@1 53 Drupal.behaviors.collapse = function (context) {
webmaster@1 54 $('fieldset.collapsible > legend:not(.collapse-processed)', context).each(function() {
webmaster@1 55 var fieldset = $(this.parentNode);
webmaster@1 56 // Expand if there are errors inside
webmaster@1 57 if ($('input.error, textarea.error, select.error', fieldset).size() > 0) {
webmaster@1 58 fieldset.removeClass('collapsed');
webmaster@1 59 }
webmaster@1 60
webmaster@1 61 // Turn the legend into a clickable link and wrap the contents of the fieldset
webmaster@1 62 // in a div for easier animation
webmaster@1 63 var text = this.innerHTML;
webmaster@1 64 $(this).empty().append($('<a href="#">'+ text +'</a>').click(function() {
webmaster@1 65 var fieldset = $(this).parents('fieldset:first')[0];
webmaster@1 66 // Don't animate multiple times
webmaster@1 67 if (!fieldset.animating) {
webmaster@1 68 fieldset.animating = true;
webmaster@1 69 Drupal.toggleFieldset(fieldset);
webmaster@1 70 }
webmaster@1 71 return false;
webmaster@1 72 }))
webmaster@1 73 .after($('<div class="fieldset-wrapper"></div>')
webmaster@1 74 .append(fieldset.children(':not(legend):not(.action)')))
webmaster@1 75 .addClass('collapse-processed');
webmaster@1 76 });
webmaster@1 77 };