Also brought up to date, and fixed some stylistic errors noted by Kondo, and set the default locale to the runtime default locale.
113 lines
3.4 KiB
JavaScript
113 lines
3.4 KiB
JavaScript
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)
|
|
})
|