web/drupal/misc/tableheader.js
branchdrupal
changeset 74 0ff3ba646492
equal deleted inserted replaced
73:fcf75e232c5b 74:0ff3ba646492
       
     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 };