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