fw4spl
sidebar.js
1 /*
2  * sidebar.js
3  * ~~~~~~~~~~
4  *
5  * This script makes the Sphinx sidebar collapsible.
6  *
7  * .sphinxsidebar contains .sphinxsidebarwrapper. This script adds
8  * in .sphixsidebar, after .sphinxsidebarwrapper, the #sidebarbutton
9  * used to collapse and expand the sidebar.
10  *
11  * When the sidebar is collapsed the .sphinxsidebarwrapper is hidden
12  * and the width of the sidebar and the margin-left of the document
13  * are decreased. When the sidebar is expanded the opposite happens.
14  * This script saves a per-browser/per-session cookie used to
15  * remember the position of the sidebar among the pages.
16  * Once the browser is closed the cookie is deleted and the position
17  * reset to the default (expanded).
18  *
19  * :copyright: Copyright 2007-2015 by the Sphinx team, see AUTHORS.
20  * :license: BSD, see LICENSE for details.
21  *
22  */
23 
24 $(function() {
25 
26 
27 
28 
29 
30 
31 
32 
33  // global elements used by the functions.
34  // the 'sidebarbutton' element is defined as global after its
35  // creation, in the add_sidebar_button function
36  var bodywrapper = $('.bodywrapper');
37  var sidebar = $('.sphinxsidebar');
38  var sidebarwrapper = $('.sphinxsidebarwrapper');
39 
40  // for some reason, the document has no sidebar; do not run into errors
41  if (!sidebar.length) return;
42 
43  // original margin-left of the bodywrapper and width of the sidebar
44  // with the sidebar expanded
45  var bw_margin_expanded = bodywrapper.css('margin-left');
46  var ssb_width_expanded = sidebar.width();
47 
48  // margin-left of the bodywrapper and width of the sidebar
49  // with the sidebar collapsed
50  var bw_margin_collapsed = '.8em';
51  var ssb_width_collapsed = '.8em';
52 
53  // colors used by the current theme
54  var dark_color = $('.related').css('background-color');
55  var light_color = $('.document').css('background-color');
56 
57  function sidebar_is_collapsed() {
58  return sidebarwrapper.is(':not(:visible)');
59  }
60 
61  function toggle_sidebar() {
62  if (sidebar_is_collapsed())
63  expand_sidebar();
64  else
65  collapse_sidebar();
66  }
67 
68  function collapse_sidebar() {
69  sidebarwrapper.hide();
70  sidebar.css('width', ssb_width_collapsed);
71  bodywrapper.css('margin-left', bw_margin_collapsed);
72  sidebarbutton.css({
73  'margin-left': '0',
74  'height': bodywrapper.height()
75  });
76  sidebarbutton.find('span').text('»');
77  sidebarbutton.attr('title', _('Expand sidebar'));
78  document.cookie = 'sidebar=collapsed';
79  }
80 
81  function expand_sidebar() {
82  bodywrapper.css('margin-left', bw_margin_expanded);
83  sidebar.css('width', ssb_width_expanded);
84  sidebarwrapper.show();
85  sidebarbutton.css({
86  'margin-left': ssb_width_expanded-12,
87  'height': bodywrapper.height()
88  });
89  sidebarbutton.find('span').text('«');
90  sidebarbutton.attr('title', _('Collapse sidebar'));
91  document.cookie = 'sidebar=expanded';
92  }
93 
94  function add_sidebar_button() {
95  sidebarwrapper.css({
96  'float': 'left',
97  'margin-right': '0',
98  'width': ssb_width_expanded - 28
99  });
100  // create the button
101  sidebar.append(
102  '<div id="sidebarbutton"><span>&laquo;</span></div>'
103  );
104  var sidebarbutton = $('#sidebarbutton');
105  light_color = sidebarbutton.css('background-color');
106  // find the height of the viewport to center the '<<' in the page
107  var viewport_height;
108  if (window.innerHeight)
109  viewport_height = window.innerHeight;
110  else
111  viewport_height = $(window).height();
112  sidebarbutton.find('span').css({
113  'display': 'block',
114  'margin-top': (viewport_height - sidebar.position().top - 20) / 2
115  });
116 
117  sidebarbutton.click(toggle_sidebar);
118  sidebarbutton.attr('title', _('Collapse sidebar'));
119  sidebarbutton.css({
120  'color': '#FFFFFF',
121  'border-left': '1px solid ' + dark_color,
122  'font-size': '1.2em',
123  'cursor': 'pointer',
124  'height': bodywrapper.height(),
125  'padding-top': '1px',
126  'margin-left': ssb_width_expanded - 12
127  });
128 
129  sidebarbutton.hover(
130  function () {
131  $(this).css('background-color', dark_color);
132  },
133  function () {
134  $(this).css('background-color', light_color);
135  }
136  );
137  }
138 
139  function set_position_from_cookie() {
140  if (!document.cookie)
141  return;
142  var items = document.cookie.split(';');
143  for(var k=0; k<items.length; k++) {
144  var key_val = items[k].split('=');
145  var key = key_val[0].replace(/ /, ""); // strip leading spaces
146  if (key == 'sidebar') {
147  var value = key_val[1];
148  if ((value == 'collapsed') && (!sidebar_is_collapsed()))
149  collapse_sidebar();
150  else if ((value == 'expanded') && (sidebar_is_collapsed()))
151  expand_sidebar();
152  }
153  }
154  }
155 
156  add_sidebar_button();
157  var sidebarbutton = $('#sidebarbutton');
158  set_position_from_cookie();
159 });