// Except as noted, this content is licensed under Creative Commons // Attribution 3.0 /* A little code to ease navigation of these documents. * * On window load we: * + Generate a table of contents (godocs_generateTOC) * + Add links up to the top of the doc from each section (godocs_addTopLinks) */ /* We want to do some stuff on page load (after the HTML is rendered). So listen for that: */ function bindEvent(el, e, fn) { if (el.addEventListener){ el.addEventListener(e, fn, false); } else if (el.attachEvent){ el.attachEvent('on'+e, fn); } } function godocs_bindSearchEvents() { var search = document.getElementById('search'); if (!search) { // no search box (index disabled) return; } function clearInactive() { if (search.className == "inactive") { search.value = ""; search.className = ""; } } function restoreInactive() { if (search.value !== "") { return; } if (search.type != "search") { search.value = search.getAttribute("placeholder"); } search.className = "inactive"; } restoreInactive(); bindEvent(search, 'focus', clearInactive); bindEvent(search, 'blur', restoreInactive); } /* Returns the "This sweet header" from

This sweet header

. * Takes a node, returns a string. */ function godocs_nodeToText(node) { var TEXT_NODE = 3; // Defined in Mozilla but not MSIE :( var text = ''; for (var j = 0; j != node.childNodes.length; j++) { var child = node.childNodes[j]; if (child.nodeType == TEXT_NODE) { if (child.nodeValue != '[Top]') { //ok, that's a hack, but it works. text = text + child.nodeValue; } } else { text = text + godocs_nodeToText(child); } } return text; } /* Generates a table of contents: looks for h2 and h3 elements and generates * links. "Decorates" the element with id=="nav" with this table of contents. */ function godocs_generateTOC() { if (document.getElementById('manual-nav')) { return; } var navbar = document.getElementById('nav'); if (!navbar) { return; } var toc_items = []; var i; var seenNav = false; for (i = 0; i < navbar.parentNode.childNodes.length; i++) { var node = navbar.parentNode.childNodes[i]; if (!seenNav) { if (node.id == 'nav') { seenNav = true; } continue; } if ((node.tagName != 'h2') && (node.tagName != 'H2') && (node.tagName != 'h3') && (node.tagName != 'H3')) { continue; } if (!node.id) { node.id = 'tmp_' + i; } var text = godocs_nodeToText(node); if (!text) { continue; } var textNode = document.createTextNode(text); var link = document.createElement('a'); link.href = '#' + node.id; link.appendChild(textNode); // Then create the item itself var item; if ((node.tagName == 'h2') || (node.tagName == 'H2')) { item = document.createElement('dt'); } else { // h3 item = document.createElement('dd'); } item.appendChild(link); toc_items.push(item); } if (toc_items.length <= 1) { return; } var dl1 = document.createElement('dl'); var dl2 = document.createElement('dl'); var split_index = (toc_items.length / 2) + 1; if (split_index < 8) { split_index = toc_items.length; } for (i = 0; i < split_index; i++) { dl1.appendChild(toc_items[i]); } for (/* keep using i */; i < toc_items.length; i++) { dl2.appendChild(toc_items[i]); } var tocTable = document.createElement('table'); navbar.appendChild(tocTable); tocTable.className = 'unruled'; var tocBody = document.createElement('tbody'); tocTable.appendChild(tocBody); var tocRow = document.createElement('tr'); tocBody.appendChild(tocRow); // 1st column var tocCell = document.createElement('td'); tocCell.className = 'first'; tocRow.appendChild(tocCell); tocCell.appendChild(dl1); // 2nd column tocCell = document.createElement('td'); tocRow.appendChild(tocCell); tocCell.appendChild(dl2); } function getElementsByClassName(base, clazz) { if (base.getElementsByClassName) { return base.getElementsByClassName(clazz); } var elements = base.getElementsByTagName('*'), foundElements = []; for (var n in elements) { if (clazz == elements[n].className) { foundElements.push(elements[n]); } } return foundElements; } function godocs_bindExampleToggle(eg) { var heading = getElementsByClassName(eg, "exampleHeading"); var callback = function() { if (eg.className == "example") { eg.className = "exampleVisible"; } else { eg.className = "example"; } }; for (var i = 0; i < heading.length; i++) { bindEvent(heading[i], "click", callback); } } function godocs_bindExampleLink(l) { var prefix = "example_"; bindEvent(l, "click", function() { var i = l.href.indexOf("#"+prefix); if (i < 0) { return; } var id = prefix + l.href.slice(i+1+prefix.length); var eg = document.getElementById(id); eg.className = "exampleVisible"; }); } function godocs_bindExamples() { var examples = getElementsByClassName(document, "example"); for (var i = 0; i < examples.length; i++) { godocs_bindExampleToggle(examples[i]); } var links = getElementsByClassName(document, "exampleLink"); for (i = 0; i < links.length; i++) { godocs_bindExampleLink(links[i]); } } function godocs_onload() { godocs_bindSearchEvents(); godocs_generateTOC(); godocs_bindExamples(); } bindEvent(window, 'load', godocs_onload);