summaryrefslogtreecommitdiff
path: root/manual/src/html_processing/js/navigation.js
blob: 7e21ffebf36bfd3a8b86d03121bb7c851a61c8c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
// NaVigation helpers for the manual, especially in mobile mode.

// copyright 2020 San Vu Ngoc
//

// Permission to use, copy, modify, and/or distribute this software
// for any purpose with or without fee is hereby granted, provided
// that the above copyright notice and this permission notice appear
// in all copies.

// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

// In mobile mode, both left navigation bar and top part menu are
// closed by default.

var MENU_HEIGHT = 0;

function closeSidebarExceptSearch (event) {
    if ( event && event.target && event.target.classList.contains("api_search") ) {
	false;
    } else {
	closeSidebar ();
	true;
    }
}

// This closes the sidebar in mobile mode. This should have no effect
// in desktop mode.
function closeSidebar () {
    let bar = document.getElementById("sidebar");
    let w = getComputedStyle(bar).width;
    bar.style.left = "-" + w;
    document.body.removeEventListener("click", closeSidebarExceptSearch); 
}

function toggleSidebar () {
    let bar = document.getElementById("sidebar");
    let l = getComputedStyle(bar).left;
    if (l == "0px") {
	closeSidebar ();
    } else {
	bar.style.left = "0px";
	setTimeout(function(){
	    // Any click anywhere but in search widget will close the sidebar
	    document.body.addEventListener("click", closeSidebarExceptSearch);
	}, 1000);
    }
}

function togglePartMenu () {
    let pm = document.getElementById("part-menu");
    let h = pm.offsetHeight;
    if ( h == 0 ) {
	pm.style.height = MENU_HEIGHT.toString() + "px";
    } else {
	pm.style.height = "0px";
    }
}
    
function partMenu () {
    let pm = document.getElementById("part-menu");
    if ( pm != null ) {
	MENU_HEIGHT = pm.scrollHeight; // This should give the true
	// height of the menu, even if
	// it was initialized to 0 in
	// the CSS (mobile view).
	// In desktop mode, the height is initially on "auto"; we
	// have to detect it in
	// order for the css animmations to work.
	// TODO update this when window is resized
	let currentHeight = pm.offsetHeight;
	pm.style.height = currentHeight.toString() + "px";
	let p = document.getElementById("part-title");
	if ( p != null ) {
	    p.onclick = togglePartMenu;
	}
    }
}

function sideBar () {
    closeSidebar();
    let btn = document.getElementById("sidebar-button");
    btn.onclick = toggleSidebar;
}
    
// We add it to the chain of window.onload
window.onload=(function(previousLoad){
    return function (){
	previousLoad && previousLoad ();
	partMenu ();
	sideBar ();
    }
})(window.onload);