[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/misc/ -> tableheader.js (source)

   1  // $Id: tableheader.js,v 1.16.2.2 2009/03/30 12:48:09 goba Exp $
   2  
   3  Drupal.tableHeaderDoScroll = function() {
   4    if (typeof(Drupal.tableHeaderOnScroll)=='function') {
   5      Drupal.tableHeaderOnScroll();
   6    }
   7  };
   8  
   9  Drupal.behaviors.tableHeader = function (context) {
  10    // This breaks in anything less than IE 7. Prevent it from running.
  11    if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7) {
  12      return;
  13    }
  14  
  15    // Keep track of all cloned table headers.
  16    var headers = [];
  17  
  18    $('table.sticky-enabled thead:not(.tableHeader-processed)', context).each(function () {
  19      // Clone thead so it inherits original jQuery properties.
  20      var headerClone = $(this).clone(true).insertBefore(this.parentNode).wrap('<table class="sticky-header"></table>').parent().css({
  21        position: 'fixed',
  22        top: '0px'
  23      });
  24  
  25      headerClone = $(headerClone)[0];
  26      headers.push(headerClone);
  27  
  28      // Store parent table.
  29      var table = $(this).parent('table')[0];
  30      headerClone.table = table;
  31      // Finish initialzing header positioning.
  32      tracker(headerClone);
  33  
  34      $(table).addClass('sticky-table');
  35      $(this).addClass('tableHeader-processed');
  36    });
  37  
  38    // Define the anchor holding var.
  39    var prevAnchor = '';
  40  
  41    // Track positioning and visibility.
  42    function tracker(e) {
  43      // Save positioning data.
  44      var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
  45      if (e.viewHeight != viewHeight) {
  46        e.viewHeight = viewHeight;
  47        e.vPosition = $(e.table).offset().top - 4;
  48        e.hPosition = $(e.table).offset().left;
  49        e.vLength = e.table.clientHeight - 100;
  50        // Resize header and its cell widths.
  51        var parentCell = $('th', e.table);
  52        $('th', e).each(function(index) {
  53          var cellWidth = parentCell.eq(index).css('width');
  54          // Exception for IE7.
  55          if (cellWidth == 'auto') {
  56            cellWidth = parentCell.get(index).clientWidth +'px';
  57          }
  58          $(this).css('width', cellWidth);
  59        });
  60        $(e).css('width', $(e.table).css('width'));
  61      }
  62  
  63      // Track horizontal positioning relative to the viewport and set visibility.
  64      var hScroll = document.documentElement.scrollLeft || document.body.scrollLeft;
  65      var vOffset = (document.documentElement.scrollTop || document.body.scrollTop) - e.vPosition;
  66      var visState = (vOffset > 0 && vOffset < e.vLength) ? 'visible' : 'hidden';
  67      $(e).css({left: -hScroll + e.hPosition +'px', visibility: visState});
  68  
  69      // Check the previous anchor to see if we need to scroll to make room for the header.
  70      // Get the height of the header table and scroll up that amount.
  71      if (prevAnchor != location.hash) {
  72        if (location.hash != '') {
  73          var offset = $('td' + location.hash).offset();
  74          if (offset) {
  75            var top = offset.top;
  76            var scrollLocation = top - $(e).height();
  77            $('body, html').scrollTop(scrollLocation);
  78          }
  79        }
  80        prevAnchor = location.hash;
  81      }
  82    }
  83  
  84    // Only attach to scrollbars once, even if Drupal.attachBehaviors is called
  85    //  multiple times.
  86    if (!$('body').hasClass('tableHeader-processed')) {
  87      $('body').addClass('tableHeader-processed');
  88      $(window).scroll(Drupal.tableHeaderDoScroll);
  89      $(document.documentElement).scroll(Drupal.tableHeaderDoScroll);
  90    }
  91  
  92    // Track scrolling.
  93    Drupal.tableHeaderOnScroll = function() {
  94      $(headers).each(function () {
  95        tracker(this);
  96      });
  97    };
  98  
  99    // Track resizing.
 100    var time = null;
 101    var resize = function () {
 102      // Ensure minimum time between adjustments.
 103      if (time) {
 104        return;
 105      }
 106      time = setTimeout(function () {
 107        $('table.sticky-header').each(function () {
 108          // Force cell width calculation.
 109          this.viewHeight = 0;
 110          tracker(this);
 111        });
 112        // Reset timer
 113        time = null;
 114      }, 250);
 115    };
 116    $(window).resize(resize);
 117  };


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7