function initSQLPopups() { /* initializes the [SQL] popup buttons that are in the 1.x tutorials. Currently this toggle is disabled and the SQL display is fixed at visible. */ $('div.popup_sql').hide(); $('a.sql_link').click(function () { $(this).nextAll('div.popup_sql:first').toggle(); return false; }); } _debug = true; function initFloatyThings() { /* switches the left navbar between css fixed and css flowing */ if (_debug) { console.log("initfloatingthing"); } if (!$("#fixed-sidebar.withsidebar")) { if (_debug) { console.log("no side bar, returning") } return; } if (_debug) { console.log("sidebar, doing things"); } var docsBodyOffset; var padding; var automatedBreakpoint; /* Before the introduction of responsive design which adds vertical elements when the window shrinks past a threshold, the variables here could be fixed. however, we now have to recalculate them when the window resizes since the rendered height of the top of the page can change. It's likely that the whole thing can just be in one function that runs for the resize and scroll events together, and that would be fine. It's unknown if jquery calls like css_element.height() are expensive or not on different browsers. it all certainly seems to be faster than instantaneous on any browser here. */ function setScrollWithRecalc() { docsBodyOffset = $("#docs-body").offset().top; padding = docsBodyOffset - ($("#docs-top-navigation-container").offset().top + $("#docs-top-navigation-container").height()); automatedBreakpoint = $("#docs-container").position().top + $("#docs-top-navigation-container").height(); if (_debug) { console.log("new breakpoint " + automatedBreakpoint); } setScroll(); } function setScroll() { var scrolltop = $(window).scrollTop(); var fix = scrolltop >= automatedBreakpoint; if (_debug) { console.log( "scrolltop: " + scrolltop + " breakpoint: " + automatedBreakpoint ); } if (fix) { $("#fixed-sidebar.withsidebar").css("top", padding); $("#fixed-sidebar.withsidebar").css("position", "fixed"); $("#fixed-sidebar.withsidebar").css("height", ''); if (_debug) { console.log("setting fixed sidebar, padding: " + padding); } } else { $("#fixed-sidebar.withsidebar").css("top", 0); $("#fixed-sidebar.withsidebar").css( "height", $(window).height() - docsBodyOffset + scrolltop); $("#fixed-sidebar.withsidebar").css("position", "absolute"); if (_debug) { console.log("setting flowing sidebar"); } } } $(window).scroll(setScroll); $(window).resize(setScrollWithRecalc); setScrollWithRecalc(); } function highlightLinks() { /* Highlights the active section in the left navbar */ function bisection(x) { var low = 0; var high = divCollection.length; var mid; while (low < high) { mid = (low + high) >> 1; if (x < divCollection[mid]['active']) { high = mid; } else { low = mid + 1; } } return low; } var divCollection = []; var currentIdx = -1; var docHeight = $(document).height(); $("div.section,section").each(function (index) { var active = $(this).offset().top - 20; divCollection.push({ 'id': this.id, 'active': active, }); }); function setLink() { var windowPos = $(window).scrollTop(); var windowHeight = $(window).height(); var idx; if (windowPos + windowHeight == docHeight) { idx = divCollection.length; } else { idx = bisection(windowPos); } if (idx != currentIdx) { var effectiveIdx = Math.max(0, idx - 1); currentIdx = idx; var ref; if (effectiveIdx == 0) { ref = ''; } else { ref = divCollection[effectiveIdx]['id']; } $("#docs-sidebar li.current").removeClass('current'); $("#docs-sidebar li a.reference[href='#" + ref + "']").parents("li").first().addClass('current'); } } $(window).scroll(setLink); setLink(); } $(document).ready(function () { /*initSQLPopups();*/ initFloatyThings(); highlightLinks(); });