default.js revision 541b494103857da31505ba745b0da5bdbe0499b9
1$(document).ready(function() {
2  // prep nav expandos
3  var pagePath = document.location.pathname;
4  if (pagePath.indexOf(SITE_ROOT) == 0) {
5    pagePath = pagePath.substr(SITE_ROOT.length);
6    if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') {
7      pagePath += 'index.html';
8    }
9  }
10
11  if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') {
12    // If running locally, SITE_ROOT will be a relative path, so account for that by
13    // finding the relative URL to this page. This will allow us to find links on the page
14    // leading back to this page.
15    var pathParts = pagePath.split('/');
16    var relativePagePathParts = [];
17    var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3;
18    for (var i = 0; i < upDirs; i++) {
19      relativePagePathParts.push('..');
20    }
21    for (var i = 0; i < upDirs; i++) {
22      relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]);
23    }
24    relativePagePathParts.push(pathParts[pathParts.length - 1]);
25    pagePath = relativePagePathParts.join('/');
26  } else {
27    // Otherwise the page path should be an absolute URL.
28    pagePath = SITE_ROOT + pagePath;
29  }
30
31  // select current page in sidenav and set up prev/next links if they exist
32  var $selNavLink = $('.nav-y').find('a[href="' + pagePath + '"]');
33  if ($selNavLink.length) {
34    $selListItem = $selNavLink.closest('li');
35
36    $selListItem.addClass('selected');
37    $selListItem.closest('li>ul').addClass('expanded');
38
39    // set up prev links
40    var $prevLink = [];
41    var $prevListItem = $selListItem.prev('li');
42    if ($prevListItem.length) {
43      if ($prevListItem.hasClass('nav-section')) {
44        // jump to last topic of previous section
45        $prevLink = $prevListItem.find('a:last');
46      } else {
47        // jump to previous topic in this section
48        $prevLink = $prevListItem.find('a:eq(0)');
49      }
50    } else {
51      // jump to this section's index page (if it exists)
52      $prevLink = $selListItem.parents('li').find('a');
53    }
54
55    if ($prevLink.length) {
56      var prevHref = $prevLink.attr('href');
57      if (prevHref == SITE_ROOT + 'index.html') {
58        // Don't show Previous when it leads to the homepage
59        $('.prev-page-link').hide();
60      } else {
61        $('.prev-page-link').attr('href', prevHref).show();
62      }
63    } else {
64      $('.prev-page-link').hide();
65    }
66
67    // set up next links
68    var $nextLink = [];
69    if ($selListItem.hasClass('nav-section')) {
70      // we're on an index page, jump to the first topic
71      $nextLink = $selListItem.find('ul').find('a:eq(0)')
72    } else {
73      // jump to the next topic in this section (if it exists)
74      $nextLink = $selListItem.next('li').find('a:eq(0)');
75      if (!$nextLink.length) {
76        // no more topics in this section, jump to the first topic in the next section
77        $nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)');
78      }
79    }
80    if ($nextLink.length) {
81      $('.next-page-link').attr('href', $nextLink.attr('href')).show();
82    } else {
83      $('.next-page-link').hide();
84    }
85  }
86
87  // Set up expand/collapse behavior
88  $('.nav-y li').has('ul').click(function() {
89    if ($(this).hasClass('expanded')) {
90      return;
91    }
92
93    // hide other
94    var $old = $('.nav-y li.expanded');
95    if ($old.length) {
96      var $oldUl = $old.children('ul');
97      $oldUl.css('height', $oldUl.height() + 'px');
98      window.setTimeout(function() {
99        $oldUl
100            .addClass('animate-height')
101            .css('height', '');
102      }, 0);
103      $old.removeClass('expanded');
104    }
105
106    // show me
107    $(this).addClass('expanded');
108    var $ul = $(this).children('ul');
109    var expandedHeight = $ul.height();
110    $ul
111        .removeClass('animate-height')
112        .css('height', 0);
113    window.setTimeout(function() {
114      $ul
115          .addClass('animate-height')
116          .css('height', expandedHeight + 'px');
117    }, 0);
118  });
119
120  // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away
121  // from the page)
122  $('.nav-y li').has('ul').find('a:eq(0)').click(function(evt) {
123    window.location.href = $(this).attr('href');
124    return false;
125  });
126
127  // Set up play-on-hover <video> tags.
128  $('video.play-on-hover').bind('click', function(){
129    $(this).get(0).load(); // in case the video isn't seekable
130    $(this).get(0).play();
131  });
132
133  // Set up tooltips
134  var TOOLTIP_MARGIN = 10;
135  $('acronym').each(function() {
136    var $target = $(this);
137    var $tooltip = $('<div>')
138        .addClass('tooltip-box')
139        .text($target.attr('title'))
140        .hide()
141        .appendTo('body');
142    $target.removeAttr('title');
143
144    $target.hover(function() {
145      // in
146      var targetRect = $target.offset();
147      targetRect.width = $target.width();
148      targetRect.height = $target.height();
149
150      $tooltip.css({
151        left: targetRect.left,
152        top: targetRect.top + targetRect.height + TOOLTIP_MARGIN
153      });
154      $tooltip.addClass('below');
155      $tooltip.show();
156    }, function() {
157      // out
158      $tooltip.hide();
159    });
160  });
161
162  // Set up <h2> deeplinks
163  $('h2').click(function() {
164    var id = $(this).attr('id');
165    if (id) {
166      document.location.hash = id;
167    }
168  });
169
170  // Set up fixed navbar
171  var navBarIsFixed = false;
172  $(window).scroll(function() {
173    var scrollTop = $(window).scrollTop();
174    var navBarShouldBeFixed = (scrollTop > (100 - 40));
175    if (navBarIsFixed != navBarShouldBeFixed) {
176      if (navBarShouldBeFixed) {
177        $('#nav')
178            .addClass('fixed')
179            .prependTo('#page-container');
180      } else {
181        $('#nav')
182            .removeClass('fixed')
183            .prependTo('#nav-container');
184      }
185      navBarIsFixed = navBarShouldBeFixed;
186    }
187  });
188});