File: /home/mmickelson/martyknows.com/wp-content/themes/albeo/javascript/tabs.js
/*
* TABS
* ---------------------------------------------------------------------------
* Copyright (c) 2008 Dan Peverill
* http://www.danpeverill.com
*
* LICENSE
* ---------------------------------------------------------------------------
* The MIT License
* http://www.opensource.org/licenses/mit-license.php
*
* INSALLATION
* ---------------------------------------------------------------------------
* Tabs are controlled with links. Each link has a target that it is attached to and specified
* as an #anchor in the href attribute. Example: <a href="#tab">tab</a>. The #anchor
* is the id of the actual target.
*
* Tabs can be grouped or single. Grouping tabs you specify the parent
* class of the tabs with the "tabs" class. For a single tab just add the class "tabs" to it.
*
* Active tabs given the class "active" by default. Inactive tabs have no class. You may
* specify the default active/inactive tabs by adding the class "active" to any of them in
* your HTML.
*
* Tab targets are automatically shown and hidden as you click the appropriate tabs. You can control
* this behavior with callback functions (see below). It is up to you to style the tabs and tab targets
* with CSS. This script only toggles the active class on tabs and shows/hides the tab targets.
*
* You may add custom tabs yourself with Tabs.create(tabs, callbacks).
*
* Callbacks is an optional argument. Callbacks is an object with two optional properties: click, show.
* These options are a function that handles the appropriate callback. Each callback can accept
* two arguments, the click event and the currently active tab target. this refers to the tab.
* click: This callback is triggered just as a tab is clicked. Returning false cancels the entire event.
* show: This callback is triggered after the active class and tab has been set, but just before
* the tab targets are shown. Returning false means you handled the showing/hiding of
* of the tab targets.
*/
var Tabs = {
className: "tabs",
activeClass: "active",
addLoadEvent: function(event) {
var oldLoad = window.onload;
window.onload = function() {
event();
if (oldLoad) oldLoad();
}
},
create: function(tabs, callbacks) {
if (!tabs.length)
this.createSingle(tabs, callbacks);
else
this.createGroup(tabs, callbacks);
},
createSingle: function(tab, callbacks) {
if (this.Element.hasClass(tab, this.activeClass))
this.Element.show(this.getTarget(tab));
this.Element.addClickEvent(tab, function(e) {
if (!Tabs._callback(this, callbacks, "click", e))
return false; // Cancel event.
Tabs.Element.toggleClass(this, Tabs.activeClass);
if (!Tabs._callback(this, callbacks, "show", e))
return false; // Callback handled visibility change.
Tabs.Element.toggleVisibility(Tabs.getTarget(this));
});
},
createGroup: function(tabs, callbacks) {
var active;
for (var i = 0; i < tabs.length; i++) {
var tab = tabs[i];
if (this.Element.hasClass(tab, this.activeClass)) {
active = tab;
this.Element.addClass(tab);
this.Element.show(this.getTarget(tab));
}
else {
this.Element.hide(this.getTarget(tab));
}
Tabs.Element.addClickEvent(tab, function(e) {
if (!Tabs._callback(this, callbacks, "click", e, active))
return false; // Cancel event.
Tabs.Element.removeClass(active, Tabs.activeClass);
Tabs.Element.addClass(this, Tabs.activeClass);
var from = active;
active = this;
if (!Tabs._callback(this, callbacks, "show", e, from))
return false; // Callback handled visibility change.
Tabs.Element.hide(Tabs.getTarget(from));
Tabs.Element.show(Tabs.getTarget(this));
});
}
if (!active) {
var tab = tabs[0];
active = tab;
this.Element.addClass(tab, this.activeClass);
this.Element.show(this.getTarget(tab));
}
},
_callback: function(element, callbacks, type, e, active) {
if (callbacks && callbacks[type] && callbacks[type].call(element, e, active) === false)
return false;
return true;
},
getTarget: function(tab) {
var match = /#(.*)$/.exec(tab.href);
var target;
if (match && (target = document.getElementById(match[1])))
return target;
},
getElementsByClassName: function(className, tag) {
var elements = document.getElementsByTagName(tag || "*");
var list = new Array();
for (var i = 0; i < elements.length; i++) {
if (this.Element.hasClass(elements[i], this.className))
list.push(elements[i]);
}
return list;
}
};
Tabs.Element = {
addClickEvent: function(element, callback) {
var oldClick = element.onclick;
element.onclick = function(e) {
callback.call(this, e);
if (oldClick) oldClick.call(this, e); // Play nice with others.
return false;
}
},
addClass: function(element, className) {
element.className += (element.className ? " " : "") + className;
},
removeClass: function(element, className) {
element.className = element.className.replace(new RegExp("(^|\\s)" + className + "(\\s|$)"), "$1");
if (element.className == " ")
element.className = "";
},
hasClass: function(element, className) {
return element.className && (new RegExp("(^|\\s)" + className + "(\\s|$)")).test(element.className);
},
toggleClass: function(element, className) {
if (this.hasClass(element, className))
this.removeClass(element, className);
else
this.addClass(element, className);
},
getStyle: function(element, property) {
if (element.style[property]) return element.style[property];
if (element.currentStyle) // IE.
return element.currentStyle[property];
property = property.replace(/([A-Z])/g, "-$1").toLowerCase(); // Turns propertyName into property-name.
var style = document.defaultView.getComputedStyle(element, "");
if (style)
return style.getPropertyValue(property);
},
show: function(element) {
element.style.display = "";
if (this.getStyle(element, "display") == "none")
element.style.display = "block";
},
hide: function(element) {
element.style.display = "none";
},
isVisible: function(element) {
return this.getStyle(element, "display") != "none";
},
toggleVisibility: function(element) {
if (this.isVisible(element))
this.hide(element);
else
this.show(element);
}
};
Tabs.addLoadEvent(function() {
var elements = Tabs.getElementsByClassName(Tabs.className);
for (var i = 0; i < elements.length; i++) {
var element = elements[i];
if (element.tagName == "A") {
Tabs.create(element);
}
else { // Group
var tabs = element.getElementsByTagName("a");
var group = new Array();
for (var t = 0; t < tabs.length; t++) {
if (Tabs.getTarget(tabs[t]))
group.push(tabs[t]); // Only group actual tab links.
}
if (group.length) Tabs.create(group);
}
}
});