diff -r fcf75e232c5b -r 0ff3ba646492 web/drupal/misc/tableheader.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/drupal/misc/tableheader.js Fri Aug 21 16:26:26 2009 +0000 @@ -0,0 +1,117 @@ +// $Id: tableheader.js,v 1.16.2.2 2009/03/30 12:48:09 goba Exp $ + +Drupal.tableHeaderDoScroll = function() { + if (typeof(Drupal.tableHeaderOnScroll)=='function') { + Drupal.tableHeaderOnScroll(); + } +}; + +Drupal.behaviors.tableHeader = function (context) { + // This breaks in anything less than IE 7. Prevent it from running. + if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7) { + return; + } + + // Keep track of all cloned table headers. + var headers = []; + + $('table.sticky-enabled thead:not(.tableHeader-processed)', context).each(function () { + // Clone thead so it inherits original jQuery properties. + var headerClone = $(this).clone(true).insertBefore(this.parentNode).wrap('').parent().css({ + position: 'fixed', + top: '0px' + }); + + headerClone = $(headerClone)[0]; + headers.push(headerClone); + + // Store parent table. + var table = $(this).parent('table')[0]; + headerClone.table = table; + // Finish initialzing header positioning. + tracker(headerClone); + + $(table).addClass('sticky-table'); + $(this).addClass('tableHeader-processed'); + }); + + // Define the anchor holding var. + var prevAnchor = ''; + + // Track positioning and visibility. + function tracker(e) { + // Save positioning data. + var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight; + if (e.viewHeight != viewHeight) { + e.viewHeight = viewHeight; + e.vPosition = $(e.table).offset().top - 4; + e.hPosition = $(e.table).offset().left; + e.vLength = e.table.clientHeight - 100; + // Resize header and its cell widths. + var parentCell = $('th', e.table); + $('th', e).each(function(index) { + var cellWidth = parentCell.eq(index).css('width'); + // Exception for IE7. + if (cellWidth == 'auto') { + cellWidth = parentCell.get(index).clientWidth +'px'; + } + $(this).css('width', cellWidth); + }); + $(e).css('width', $(e.table).css('width')); + } + + // Track horizontal positioning relative to the viewport and set visibility. + var hScroll = document.documentElement.scrollLeft || document.body.scrollLeft; + var vOffset = (document.documentElement.scrollTop || document.body.scrollTop) - e.vPosition; + var visState = (vOffset > 0 && vOffset < e.vLength) ? 'visible' : 'hidden'; + $(e).css({left: -hScroll + e.hPosition +'px', visibility: visState}); + + // Check the previous anchor to see if we need to scroll to make room for the header. + // Get the height of the header table and scroll up that amount. + if (prevAnchor != location.hash) { + if (location.hash != '') { + var offset = $('td' + location.hash).offset(); + if (offset) { + var top = offset.top; + var scrollLocation = top - $(e).height(); + $('body, html').scrollTop(scrollLocation); + } + } + prevAnchor = location.hash; + } + } + + // Only attach to scrollbars once, even if Drupal.attachBehaviors is called + // multiple times. + if (!$('body').hasClass('tableHeader-processed')) { + $('body').addClass('tableHeader-processed'); + $(window).scroll(Drupal.tableHeaderDoScroll); + $(document.documentElement).scroll(Drupal.tableHeaderDoScroll); + } + + // Track scrolling. + Drupal.tableHeaderOnScroll = function() { + $(headers).each(function () { + tracker(this); + }); + }; + + // Track resizing. + var time = null; + var resize = function () { + // Ensure minimum time between adjustments. + if (time) { + return; + } + time = setTimeout(function () { + $('table.sticky-header').each(function () { + // Force cell width calculation. + this.viewHeight = 0; + tracker(this); + }); + // Reset timer + time = null; + }, 250); + }; + $(window).resize(resize); +};