194 lines
5.1 KiB
JavaScript
194 lines
5.1 KiB
JavaScript
|
(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));
|