~spreadubuntu/spreadubuntu/devel-drupal6

« back to all changes in this revision

Viewing changes to misc/tableheader.js

  • Committer: ruben
  • Date: 2009-06-08 09:38:49 UTC
  • Revision ID: ruben@captive-20090608093849-s1qtsyctv2vwp1x1
SpreadUbuntu moving to Drupal6. Based on ubuntu-drupal theme and adding our modules

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
};