| function visibleInParent(element) { |
| var position = $(element).position().top |
| return position > -50 && position < ($(element).offsetParent().height() - 50) |
| } |
| |
| function hasFragment(link, fragment) { |
| return $(link).attr("href").indexOf("#" + fragment) != -1 |
| } |
| |
| function findLinkByFragment(elements, fragment) { |
| return $(elements).filter(function(i, e) { return hasFragment(e, fragment)}).first() |
| } |
| |
| function scrollToCurrentVarLink(elements) { |
| var elements = $(elements); |
| var parent = elements.offsetParent(); |
| |
| if (elements.length == 0) return; |
| |
| var top = elements.first().position().top; |
| var bottom = elements.last().position().top + elements.last().height(); |
| |
| if (top >= 0 && bottom <= parent.height()) return; |
| |
| if (top < 0) { |
| parent.scrollTop(parent.scrollTop() + top); |
| } |
| else if (bottom > parent.height()) { |
| parent.scrollTop(parent.scrollTop() + bottom - parent.height()); |
| } |
| } |
| |
| function setCurrentVarLink() { |
| $('.secondary a').parent().removeClass('current') |
| $('.anchor'). |
| filter(function(index) { return visibleInParent(this) }). |
| each(function(index, element) { |
| findLinkByFragment(".secondary a", element.id). |
| parent(). |
| addClass('current') |
| }); |
| scrollToCurrentVarLink('.secondary .current'); |
| } |
| |
| var hasStorage = (function() { try { return localStorage.getItem } catch(e) {} }()) |
| |
| function scrollPositionId(element) { |
| var directory = window.location.href.replace(/[^\/]+\.html$/, '') |
| return 'scroll::' + $(element).attr('id') + '::' + directory |
| } |
| |
| function storeScrollPosition(element) { |
| if (!hasStorage) return; |
| localStorage.setItem(scrollPositionId(element) + "::x", $(element).scrollLeft()) |
| localStorage.setItem(scrollPositionId(element) + "::y", $(element).scrollTop()) |
| } |
| |
| function recallScrollPosition(element) { |
| if (!hasStorage) return; |
| $(element).scrollLeft(localStorage.getItem(scrollPositionId(element) + "::x")) |
| $(element).scrollTop(localStorage.getItem(scrollPositionId(element) + "::y")) |
| } |
| |
| function persistScrollPosition(element) { |
| recallScrollPosition(element) |
| $(element).scroll(function() { storeScrollPosition(element) }) |
| } |
| |
| function sidebarContentWidth(element) { |
| var widths = $(element).find('.inner').map(function() { return $(this).innerWidth() }) |
| return Math.max.apply(Math, widths) |
| } |
| |
| function calculateSize(width, snap, margin, minimum) { |
| if (width == 0) { |
| return 0 |
| } |
| else { |
| return Math.max(minimum, (Math.ceil(width / snap) * snap) + (margin * 2)) |
| } |
| } |
| |
| function resizeSidebars() { |
| var primaryWidth = sidebarContentWidth('.primary') |
| var secondaryWidth = 0 |
| |
| if ($('.secondary').length != 0) { |
| secondaryWidth = sidebarContentWidth('.secondary') |
| } |
| |
| // snap to grid |
| primaryWidth = calculateSize(primaryWidth, 32, 13, 160) |
| secondaryWidth = calculateSize(secondaryWidth, 32, 13, 160) |
| |
| $('.primary').css('width', primaryWidth) |
| $('.secondary').css('width', secondaryWidth).css('left', primaryWidth + 1) |
| |
| if (secondaryWidth > 0) { |
| $('#content').css('left', primaryWidth + secondaryWidth + 2) |
| } |
| else { |
| $('#content').css('left', primaryWidth + 1) |
| } |
| } |
| |
| $(window).ready(resizeSidebars) |
| $(window).ready(setCurrentVarLink) |
| $(window).ready(function() { persistScrollPosition('.primary')}) |
| $(window).ready(function() { |
| $('#content').scroll(setCurrentVarLink) |
| $(window).resize(setCurrentVarLink) |
| }) |