webmaster@1: // $Id: tableheader.js,v 1.16 2008/01/30 10:17:39 goba Exp $ webmaster@1: webmaster@1: Drupal.tableHeaderDoScroll = function() { webmaster@1: if (typeof(Drupal.tableHeaderOnScroll)=='function') { webmaster@1: Drupal.tableHeaderOnScroll(); webmaster@1: } webmaster@1: }; webmaster@1: webmaster@1: Drupal.behaviors.tableHeader = function (context) { webmaster@1: // This breaks in anything less than IE 7. Prevent it from running. webmaster@1: if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7) { webmaster@1: return; webmaster@1: } webmaster@1: webmaster@1: // Keep track of all cloned table headers. webmaster@1: var headers = []; webmaster@1: webmaster@1: $('table.sticky-enabled thead:not(.tableHeader-processed)', context).each(function () { webmaster@1: // Clone thead so it inherits original jQuery properties. webmaster@1: var headerClone = $(this).clone(true).insertBefore(this.parentNode).wrap('').parent().css({ webmaster@1: position: 'fixed', webmaster@1: top: '0px' webmaster@1: }); webmaster@1: webmaster@1: headerClone = $(headerClone)[0]; webmaster@1: headers.push(headerClone); webmaster@1: webmaster@1: // Store parent table. webmaster@1: var table = $(this).parent('table')[0]; webmaster@1: headerClone.table = table; webmaster@1: // Finish initialzing header positioning. webmaster@1: tracker(headerClone); webmaster@1: webmaster@1: $(table).addClass('sticky-table'); webmaster@1: $(this).addClass('tableHeader-processed'); webmaster@1: }); webmaster@1: webmaster@1: // Track positioning and visibility. webmaster@1: function tracker(e) { webmaster@1: // Save positioning data. webmaster@1: var viewHeight = document.documentElement.scrollHeight || document.body.scrollHeight; webmaster@1: if (e.viewHeight != viewHeight) { webmaster@1: e.viewHeight = viewHeight; webmaster@1: e.vPosition = $(e.table).offset().top - 4; webmaster@1: e.hPosition = $(e.table).offset().left; webmaster@1: e.vLength = e.table.clientHeight - 100; webmaster@1: // Resize header and its cell widths. webmaster@1: var parentCell = $('th', e.table); webmaster@1: $('th', e).each(function(index) { webmaster@1: var cellWidth = parentCell.eq(index).css('width'); webmaster@1: // Exception for IE7. webmaster@1: if (cellWidth == 'auto') { webmaster@1: cellWidth = parentCell.get(index).clientWidth +'px'; webmaster@1: } webmaster@1: $(this).css('width', cellWidth); webmaster@1: }); webmaster@1: $(e).css('width', $(e.table).css('width')); webmaster@1: } webmaster@1: webmaster@1: // Track horizontal positioning relative to the viewport and set visibility. webmaster@1: var hScroll = document.documentElement.scrollLeft || document.body.scrollLeft; webmaster@1: var vOffset = (document.documentElement.scrollTop || document.body.scrollTop) - e.vPosition; webmaster@1: var visState = (vOffset > 0 && vOffset < e.vLength) ? 'visible' : 'hidden'; webmaster@1: $(e).css({left: -hScroll + e.hPosition +'px', visibility: visState}); webmaster@1: } webmaster@1: webmaster@1: // Only attach to scrollbars once, even if Drupal.attachBehaviors is called webmaster@1: // multiple times. webmaster@1: if (!$('body').hasClass('tableHeader-processed')) { webmaster@1: $('body').addClass('tableHeader-processed'); webmaster@1: $(window).scroll(Drupal.tableHeaderDoScroll); webmaster@1: $(document.documentElement).scroll(Drupal.tableHeaderDoScroll); webmaster@1: } webmaster@1: webmaster@1: // Track scrolling. webmaster@1: Drupal.tableHeaderOnScroll = function() { webmaster@1: $(headers).each(function () { webmaster@1: tracker(this); webmaster@1: }); webmaster@1: }; webmaster@1: webmaster@1: // Track resizing. webmaster@1: var time = null; webmaster@1: var resize = function () { webmaster@1: // Ensure minimum time between adjustments. webmaster@1: if (time) { webmaster@1: return; webmaster@1: } webmaster@1: time = setTimeout(function () { webmaster@1: $('table.sticky-header').each(function () { webmaster@1: // Force cell width calculation. webmaster@1: this.viewHeight = 0; webmaster@1: tracker(this); webmaster@1: }); webmaster@1: // Reset timer webmaster@1: time = null; webmaster@1: }, 250); webmaster@1: }; webmaster@1: $(window).resize(resize); webmaster@1: };