summaryrefslogtreecommitdiffstats
path: root/theme/javascript/core/navigation.js
diff options
context:
space:
mode:
Diffstat (limited to 'theme/javascript/core/navigation.js')
-rwxr-xr-xtheme/javascript/core/navigation.js151
1 files changed, 151 insertions, 0 deletions
diff --git a/theme/javascript/core/navigation.js b/theme/javascript/core/navigation.js
new file mode 100755
index 0000000..f5d03df
--- /dev/null
+++ b/theme/javascript/core/navigation.js
@@ -0,0 +1,151 @@
+define([
+ "jQuery",
+ "utils/url",
+ "core/events",
+ "core/state",
+ "core/progress",
+ "core/loading",
+ "core/search",
+ "core/glossary"
+], function($, URL, events, state, progress, loading, search, glossary) {
+ var prev, next;
+
+ var usePushState = (typeof history.pushState !== "undefined");
+
+ var handleNavigation = function(relativeUrl, push) {
+ var url = URL.join(window.location.pathname, relativeUrl);
+ console.log("navigate to ", url, "baseurl="+relativeUrl, "current="+window.location.pathname);
+
+ if (!usePushState) {
+ // Refresh the page to the new URL if pushState not supported
+ location.href = relativeUrl;
+ return
+ }
+
+ return loading.show($.get(url)
+ .done(function (html) {
+ // Push url to history
+ if (push) history.pushState({ path: url }, null, url);
+
+ // Replace html content
+ html = html.replace( /<(\/?)(html|head|body)([^>]*)>/ig, function(a,b,c,d){
+ return '<' + b + 'div' + ( b ? '' : ' data-element="' + c + '"' ) + d + '>';
+ });
+
+ var $page = $(html);
+ var $pageHead = $page.find("[data-element=head]");
+ var $pageBody = $page.find('.book');
+
+ // Merge heads
+ var headContent = $pageHead.html()
+
+ $("head style").each(function() {
+ headContent = headContent + this.outerHTML
+ });
+ $("head").html(headContent);
+
+ // Merge body
+ var bodyClass = $(".book").attr("class");
+ var scrollPosition = $('.book-summary .summary').scrollTop();
+ $pageBody.toggleClass("with-summary", $(".book").hasClass("with-summary"))
+
+ $(".book").replaceWith($pageBody);
+ $(".book").attr("class", bodyClass);
+ $('.book-summary .summary').scrollTop(scrollPosition);
+
+ // Update state
+ state.update($("html"));
+ // recover search keyword
+ search.recover();
+ preparePage();
+ })
+ .fail(function (e) {
+ location.href = relativeUrl;
+ }));
+ };
+
+ var updateNavigationPosition = function() {
+ var bodyInnerWidth, pageWrapperWidth;
+
+ bodyInnerWidth = parseInt($('.body-inner').css('width'), 10);
+ pageWrapperWidth = parseInt($('.page-wrapper').css('width'), 10);
+ $('.navigation-next').css('margin-right', (bodyInnerWidth - pageWrapperWidth) + 'px');
+ };
+
+ var preparePage = function() {
+ var $pageWrapper = $(".book-body .page-wrapper");
+
+ // Show progress
+ progress.show();
+
+ // Update navigation position
+ updateNavigationPosition();
+
+ // Set glossary items
+ glossary.prepare();
+
+ // Reset scroll
+ $pageWrapper.scrollTop(0);
+
+ // Focus on content
+ $pageWrapper.focus();
+
+ // Notify
+ events.trigger("page.change");
+ };
+
+ var handlePagination = function (e) {
+ e.stopPropagation();
+ e.preventDefault();
+
+ var url = $(this).attr('href');
+ if (url) handleNavigation(url, true);
+ };
+
+ var goNext = function() {
+ var url = $(".navigation-next").attr("href");
+ if (url) handleNavigation(url, true);
+ };
+
+ var goPrev = function() {
+ var url = $(".navigation-prev").attr("href");
+ if (url) handleNavigation(url, true);
+ };
+
+
+
+ var init = function() {
+ // Prevent cache so that using the back button works
+ // See: http://stackoverflow.com/a/15805399/983070
+ $.ajaxSetup({
+ cache: false
+ });
+
+ // Recreate first page when the page loads.
+ history.replaceState({ path: window.location.href }, '');
+
+ // Back Button Hijacking :(
+ window.onpopstate = function (event) {
+ if (event.state === null) {
+ return;
+ }
+ return handleNavigation(event.state.path, false);
+ };
+
+ $(document).on('click', ".navigation-prev", handlePagination);
+ $(document).on('click', ".navigation-next", handlePagination);
+ $(document).on('click', ".summary [data-path] a", handlePagination);
+
+ $(window).resize(updateNavigationPosition);
+
+ // Prepare current page
+ preparePage();
+ };
+
+ return {
+ init: init,
+ goNext: goNext,
+ goPrev: goPrev
+ };
+});
+