| (function (window, document) { |
| "use strict"; |
| |
| var tabs = {}; |
| |
| function changeElementClass(element, classValue) { |
| if (element.getAttribute("className")) { |
| element.setAttribute("className", classValue); |
| } else { |
| element.setAttribute("class", classValue); |
| } |
| } |
| |
| function getClassAttribute(element) { |
| if (element.getAttribute("className")) { |
| return element.getAttribute("className"); |
| } else { |
| return element.getAttribute("class"); |
| } |
| } |
| |
| function addClass(element, classValue) { |
| changeElementClass(element, getClassAttribute(element) + " " + classValue); |
| } |
| |
| function removeClass(element, classValue) { |
| changeElementClass(element, getClassAttribute(element).replace(classValue, "")); |
| } |
| |
| function initTabs() { |
| var container = document.getElementById("tabs"); |
| |
| tabs.tabs = findTabs(container); |
| tabs.titles = findTitles(tabs.tabs); |
| tabs.headers = findHeaders(container); |
| tabs.select = select; |
| tabs.deselectAll = deselectAll; |
| tabs.select(0); |
| |
| return true; |
| } |
| |
| function getCheckBox() { |
| return document.getElementById("line-wrapping-toggle"); |
| } |
| |
| function getLabelForCheckBox() { |
| return document.getElementById("label-for-line-wrapping-toggle"); |
| } |
| |
| function findCodeBlocks() { |
| var spans = document.getElementById("tabs").getElementsByTagName("span"); |
| var codeBlocks = []; |
| for (var i = 0; i < spans.length; ++i) { |
| if (spans[i].className.indexOf("code") >= 0) { |
| codeBlocks.push(spans[i]); |
| } |
| } |
| return codeBlocks; |
| } |
| |
| function forAllCodeBlocks(operation) { |
| var codeBlocks = findCodeBlocks(); |
| |
| for (var i = 0; i < codeBlocks.length; ++i) { |
| operation(codeBlocks[i], "wrapped"); |
| } |
| } |
| |
| function toggleLineWrapping() { |
| var checkBox = getCheckBox(); |
| |
| if (checkBox.checked) { |
| forAllCodeBlocks(addClass); |
| } else { |
| forAllCodeBlocks(removeClass); |
| } |
| } |
| |
| function initControls() { |
| if (findCodeBlocks().length > 0) { |
| var checkBox = getCheckBox(); |
| var label = getLabelForCheckBox(); |
| |
| checkBox.onclick = toggleLineWrapping; |
| checkBox.checked = false; |
| |
| removeClass(label, "hidden"); |
| } |
| } |
| |
| function switchTab() { |
| var id = this.id.substr(1); |
| |
| for (var i = 0; i < tabs.tabs.length; i++) { |
| if (tabs.tabs[i].id === id) { |
| tabs.select(i); |
| break; |
| } |
| } |
| |
| return false; |
| } |
| |
| function select(i) { |
| this.deselectAll(); |
| |
| changeElementClass(this.tabs[i], "tab selected"); |
| changeElementClass(this.headers[i], "selected"); |
| |
| while (this.headers[i].firstChild) { |
| this.headers[i].removeChild(this.headers[i].firstChild); |
| } |
| |
| var h2 = document.createElement("H2"); |
| |
| h2.appendChild(document.createTextNode(this.titles[i])); |
| this.headers[i].appendChild(h2); |
| } |
| |
| function deselectAll() { |
| for (var i = 0; i < this.tabs.length; i++) { |
| changeElementClass(this.tabs[i], "tab deselected"); |
| changeElementClass(this.headers[i], "deselected"); |
| |
| while (this.headers[i].firstChild) { |
| this.headers[i].removeChild(this.headers[i].firstChild); |
| } |
| |
| var a = document.createElement("A"); |
| |
| a.setAttribute("id", "ltab" + i); |
| a.setAttribute("href", "#tab" + i); |
| a.onclick = switchTab; |
| a.appendChild(document.createTextNode(this.titles[i])); |
| |
| this.headers[i].appendChild(a); |
| } |
| } |
| |
| function findTabs(container) { |
| return findChildElements(container, "DIV", "tab"); |
| } |
| |
| function findHeaders(container) { |
| var owner = findChildElements(container, "UL", "tabLinks"); |
| return findChildElements(owner[0], "LI", null); |
| } |
| |
| function findTitles(tabs) { |
| var titles = []; |
| |
| for (var i = 0; i < tabs.length; i++) { |
| var tab = tabs[i]; |
| var header = findChildElements(tab, "H2", null)[0]; |
| |
| header.parentNode.removeChild(header); |
| |
| if (header.innerText) { |
| titles.push(header.innerText); |
| } else { |
| titles.push(header.textContent); |
| } |
| } |
| |
| return titles; |
| } |
| |
| function findChildElements(container, name, targetClass) { |
| var elements = []; |
| var children = container.childNodes; |
| |
| for (var i = 0; i < children.length; i++) { |
| var child = children.item(i); |
| |
| if (child.nodeType === 1 && child.nodeName === name) { |
| if (targetClass && child.className.indexOf(targetClass) < 0) { |
| continue; |
| } |
| |
| elements.push(child); |
| } |
| } |
| |
| return elements; |
| } |
| |
| // Entry point. |
| |
| window.onload = function() { |
| initTabs(); |
| initControls(); |
| }; |
| } (window, window.document)); |