// Generate a table of contents from the headers (with ids) (function() { var headers = [].slice.call(document.querySelectorAll("h1,h2,h3,h4")).filter(function(e) { return !!e.id; }); if (headers.length <= 0) { return; } var html = ''; var stack = []; headers.forEach(function(header) { var tag = header.tagName; while (stack.length > 0 && stack[0] > tag) { html += '\n\n'; stack.shift(); } if (stack.length === 0 || stack[0] < tag) { stack.unshift(tag); html += '\n\n'; stack.shift(); } var toc = document.getElementById('toc'); if (toc) { toc.outerHTML = html; } })(); (function(){ var bottom_nav = document.querySelector('.bottom-nav'); if (bottom_nav) { var links = [].slice.call(document.querySelectorAll('#sidebar a.sidebar-link')); var pos = links.indexOf(document.querySelector('#sidebar a.sidebar-link.current')); if (pos < 0 || links.length <= 1) { bottom_nav.style.display = 'none'; } var prev = document.getElementById('bottom-nav-prev'); if (pos > 0) { prev.href = links[pos - 1].href; prev.innerHTML = links[pos - 1].innerHTML; } else { prev.parentNode.style.display = 'none'; } var next = document.getElementById('bottom-nav-next'); if ((pos + 1) < links.length) { next.href = links[pos + 1].href; next.innerHTML = links[pos + 1].innerHTML; } else { next.parentNode.style.display = 'none'; } } })(); if (window['FastClick']) { FastClick.attach(document.body); } var headerScrollOffset = 100; smoothScroll.init({ selector: 'a[href^="#"]', offset: headerScrollOffset, speed: 400, callback: function () { /* scroll complete */ } }); // Sidebar for mobile document.querySelector('#mobile-header .menu-button').addEventListener('click', function () { document.body.classList.toggle('sidebar-open'); }); document.getElementById('mobile-shade').addEventListener('click', function () { document.body.classList.remove('sidebar-open'); }); window.onhashchange = function() { document.body.classList.remove('sidebar-open'); if (window.location.hash.startsWith('#')) { var e = document.getElementById(window.location.hash.slice(1)); if (e) { var offsetTop = 0; do { offsetTop += e.offsetTop; e = e.offsetParent; } while (e); setTimeout(function() { window.scrollTo(0, offsetTop - headerScrollOffset); }, 30); } } else { var toc = document.getElementById('toc'); if (toc == null) { var subMenus = document.getElementsByClassName('sub-menu'); toc = ((subMenus != null) && (subMenus.length > 0)) ? subMenus[0] : null; } if (toc) { var offsetTop = 0; do { offsetTop += toc.offsetTop; toc = toc.offsetParent; } while (toc); setTimeout(function() { sidebar.scrollTo(0, offsetTop - headerScrollOffset); }, 30); } } }; window.onhashchange(); // Force scroll to link function setActiveMenu(link) { if (link && link.id !== '') { var previous = document.querySelector('.sub-menu .active'); var current = document.querySelector('.sub-menu a[href="#' + link.id + '"]'); if (current && current !== previous) { if (previous) { previous.classList.remove('active'); } current.classList.add('active'); } } } var sidebar = document.querySelector('#sidebar'); if (sidebar) { var sidebarHandle = null; function updateSidebar() { if (!sidebarHandle) { sidebarHandle = setTimeout(function() { sidebarHandle = null; var doc = document.documentElement; var top = doc && doc.scrollTop || document.body.scrollTop; var content = document.querySelector('#content'); if (content) { var links = content.querySelectorAll('h2[id],h3[id],h4[id]'); var last = null; for (var i = 0; i < links.length; i++) { var link = links[i]; if ((link.offsetTop - 120) > top) { last = last || link; break; } last = link; } setActiveMenu(last); } }, 100); } } window.addEventListener('scroll', updateSidebar); window.addEventListener('resize', updateSidebar); } // Support zooming of screenshots in a simple lightbox /* [].slice.call(document.querySelectorAll('.screenshot')).forEach(function(image) { image.addEventListener('click', function (e) { var shade = document.createElement('div'); shade.className = 'slightbox-shade'; var inner = document.createElement('div'); inner.className = 'slightbox-inner'; inner.style.backgroundImage = "url('" + image.src + "')"; shade.appendChild(inner); function dismiss(e) { window.removeEventListener('keydown', catchEscape); if (shade.parentElement != null) { shade.parentElement.removeChild(shade); } e.preventDefault(); return false; } shade.addEventListener('click', function (e) { return dismiss(e); }); function catchEscape(e) { if (e.key === 'Escape' || e.keyCode === 27) { return dismiss(e); } } window.addEventListener('keydown', catchEscape); document.body.appendChild(shade); e.preventDefault(); return false; }); }); */