1513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/**
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Copyright (c) 2010 The Chromium Authors. All rights reserved.  Use of this
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * source code is governed by a BSD-style license that can be found in the
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * LICENSE file.
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvar TEXT_NODE = 3; // Text nodes have nodeType of 3.
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/**
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Toggles the display of nodes given the status of their associated controls.
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * For each node passed to this function, check to see if a toggle has been
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * inserted into the node's parent.  If yes, change the state of the toggle and
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * hide/reveal the node as needed.
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param {NodeList|Node|Array.<Node>} Nodes to operate on.
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdochfunction toggleList(list) {
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (typeof list.length != 'number') {
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    list = Array(list);
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (var i = 0; i < list.length; i++) {
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    var toggle = list[i].parentNode &&
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                 list[i].parentNode.firstChild;
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (toggle && toggle.className.substring(0, 6) == 'toggle') {
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      var visible = toggle.className == 'toggle';
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      list[i].style.display = visible ? 'block' : 'none';
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      toggle.className = visible ? 'toggle selected' : 'toggle';
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/**
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Reveals the hidden ancestor of the passed node, adjusts toggles as needed.
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * @param {Node} node The node whose ancestor is a hidden toggleable element.
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdochfunction revealAncestor(node) {
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  while (node.parentNode) {
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (node.style.display == 'none') {
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      toggleList(node);
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      break;
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    node = node.parentNode;
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch/**
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Adds toggle controls to the sidebar list.
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * Controls are inserted as the first children of list items in the sidebar
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * which contain only text (not a link).  Handlers are set up so that when a
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * toggle control is clicked, any <ul> elements who are siblings of the control
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * are hidden/revealed as appropriate given the control's state.
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * If a list item possesses the class "leftNavSelected" its ancestor <ul> is
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch * revealed by default (it represents the current page).
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch */
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdochfunction initToggles() {
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  var toc = document.getElementById('gc-toc');
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  var items = toc.getElementsByTagName('li');
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  var selectedNode = null;
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  for (var i = 0; i < items.length; i++) {
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    var item = items[i];
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    if (item.className == 'leftNavSelected') {
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      selectedNode = item;
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    } else if (item.firstChild &&
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch               item.firstChild.nodeType == TEXT_NODE) {
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      // Only assign toggles to text nodes in the sidebar.
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      var a = document.createElement('a');
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      a.className = 'toggle selected';
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      a.appendChild(document.createTextNode(' '));
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      a.onclick = function() {
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        toggleList(this.parentNode.getElementsByTagName('ul'));
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      };
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      item.insertBefore(a, item.firstChild);
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      toggleList(item.getElementsByTagName('ul'));
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  if (selectedNode) {
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    revealAncestor(selectedNode);
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  }
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
85