aboutsummaryrefslogtreecommitdiff
path: root/templates/docs/default.js
diff options
context:
space:
mode:
Diffstat (limited to 'templates/docs/default.js')
-rw-r--r--templates/docs/default.js155
1 files changed, 155 insertions, 0 deletions
diff --git a/templates/docs/default.js b/templates/docs/default.js
new file mode 100644
index 000000000..4be99c98e
--- /dev/null
+++ b/templates/docs/default.js
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+$(document).ready(function() {
+ prettyPrint();
+ preventParentScrolls('nav');
+
+ var sluggify_ = function(s) {
+ return (s || '').replace(/ /g, '-').replace(/[^\w-]/g, '').toLowerCase();
+ };
+
+ $('h2, h3, h4.includetoc').each(function() {
+ $(this).attr('id', 'toc_' + sluggify_($(this).data('tocid') || $(this).data('toctitle') || $(this).text()));
+ $(this).click(function() {
+ smoothScrollToId($(this).attr('id'));
+ });
+ });
+
+ var buildNav_ = function(queries, $contentRoot, $navRoot) {
+ if (!queries || !queries.length) {
+ return;
+ }
+
+ $contentRoot.find(queries[0]).each(function() {
+ var $navNode = $('<div>')
+ .text($(this).html())
+ .appendTo($navRoot);
+ buildNav_(queries.splice(1), $(this), $navNode);
+ });
+ };
+
+ buildNav();
+});
+
+function buildNav() {
+ var currentLevel = 2;
+ var $currentParent = $('nav');
+ var $currentNode = null;
+
+ $('#page-content').find('h2, h3, h4.includetoc').each(function() {
+ var level = $(this).get(0).tagName.substring(1);
+
+ if (level < currentLevel) {
+ // ascend
+ for (var i = 0; i < (currentLevel - level); i++) {
+ $currentParent = $currentParent.parents('div.children, nav').first();
+ }
+
+ } else if (level > currentLevel) {
+ // descend
+ $currentParent = $('<div>')
+ .addClass('children')
+ .appendTo($currentNode);
+ }
+
+ var tocId = $(this).attr('id');
+ var navId = tocId.replace(/toc_/, 'nav_');
+
+ $interactionNode = $('<span>')
+ .html($(this).data('toctitle') || $(this).html())
+ .data('target', tocId)
+ .click(function() {
+ smoothScrollToId($(this).data('target'));
+ });
+
+ $currentNode = $('<div>')
+ .attr('id', navId)
+ .addClass('item')
+ .append($interactionNode)
+ .appendTo($currentParent);
+
+ currentLevel = level;
+ });
+
+ var headerPositionCache = [];
+ var rebuildHeaderPositionCache_ = function() {
+ headerPositionCache = [];
+ $('#page-content').find('h2, h3, h4.includetoc').each(function() {
+ headerPositionCache.push({
+ id: $(this).attr('id').replace(/toc_/, 'nav_'),
+ top: $(this).offset().top
+ });
+ });
+ };
+
+ var updateSelectedNavPosition_ = function() {
+ $('nav .item').removeClass('selected');
+ var scrollTop = $(window).scrollTop();
+ for (var i = headerPositionCache.length - 1; i >= 0; i--) {
+ if (scrollTop >= headerPositionCache[i].top) {
+ $('#' + headerPositionCache[i].id).addClass('selected');
+ break;
+ }
+ }
+ };
+
+ rebuildHeaderPositionCache_();
+ $(window).resize(function() {
+ rebuildHeaderPositionCache_();
+ updateSelectedNavPosition_();
+ });
+
+ $(window).scroll(function() {
+ updateSelectedNavPosition_();
+ });
+}
+
+function smoothScrollToId(id) {
+ var $target = $('#' + id);
+ $('body').animate({ scrollTop: $target.offset().top }, 200, 'swing', function() {
+ document.location.hash = id;
+ });
+}
+
+// Based on http://stackoverflow.com/questions/5802467/prevent-scrolling-of-parent-element
+function preventParentScrolls($el) {
+ $($el).on('DOMMouseScroll mousewheel', function(ev) {
+ var $this = $(this),
+ scrollTop = this.scrollTop,
+ scrollHeight = this.scrollHeight,
+ height = $this.height(),
+ delta = (ev.type == 'DOMMouseScroll' ?
+ ev.originalEvent.detail * -40 :
+ ev.originalEvent.wheelDelta),
+ up = delta > 0;
+
+ if (!up && -delta > scrollHeight - height - scrollTop) {
+ // Scrolling down, but this will take us past the bottom.
+ $this.scrollTop(scrollHeight);
+ } else if (up && delta > scrollTop) {
+ // Scrolling up, but this will take us past the top.
+ $this.scrollTop(0);
+ } else {
+ $this.scrollTop(scrollTop - delta);
+ }
+
+ ev.stopPropagation();
+ ev.preventDefault();
+ ev.returnValue = false;
+ return false;
+ });
+} \ No newline at end of file