/**
 * kTabManager
 * Kramer 070711 (Born of kTabManager from CSP 070313)
 *
 * @see DOM.js
 * @see prototype.js
 * @see EventSelectors.js
 *
 * Standalone tab manager
 **/
var kTabManager = stdClass.extend({
// Static properties

settings: function(settings) {
if (typeof(this.s) == 'undefined') {
this.base();
this.n.tabs = [];
this.n.contents = null;
this.activeTab = null;

Object.extendProperties(this.s, {
eventType: 'click',                                                                                   // On what type of event should a tab activate? (click, mouseover)
container: null,
tabsULContainerSelector: 'ul.tabs',
contentNodeSelector: 'div.tab_content',
activeTabClass: 'selected',
hoverTabClass: 'hover',
loadingTabClass: 'loading',
showErrors: true,
showDebugs: ['kramer']
});
Object.extendProperties(this.s, settings);
}
},

constructor: function(settings) {
this.settings(settings);

var eventSetting = DOM.getClassData('tabEvent', this.s.container);
if (eventSetting) this.s.eventType = eventSetting;
this.acquireNodes();

this.preSelectTabFromURLParam();
},

preSelectTabFromURLParam: function() {
// initialize a tab if there is an appropriate GET parameter used to preset this tabSet's initially selected tab
initialTabSetsSelection = this.readURLParams();
if(initialTabSetsSelection && typeof(initialTabSetsSelection) == "string" && initialTabSetsSelection.length > 0)
{
initialTabSetSelection = initialTabSetsSelection.split(","); // multiple tabSet presets are delimted by commas
if(initialTabSetSelection && initialTabSetSelection.length > 0)
{
if(this.s.container.id && typeof(this.s.container.id) == "string" && this.s.container.id.length > 0) // if the container has an ID string set
{
// temporary variable for "container's ID - to - URL param key" comparison
var testKey = this.s.container.id + ":";
for(var i=0; i<initialTabSetSelection.length; i++)
{
if(initialTabSetSelection[i].indexOf(testKey) >= 0 && this.s.container.id.length > initialTabSetSelection[i].indexOf(testKey))
{
var kValue = initialTabSetSelection[i].substring((initialTabSetSelection[i].indexOf(testKey))+(testKey.length), initialTabSetSelection[0].length);
if(kValue && kValue.length > 0)
{
var selectedTabNum = parseInt(kValue);
var numOfTabs = this.n.tabs.length;
if(!isNaN(selectedTabNum) && selectedTabNum <= numOfTabs)
{
this.activateTab(this.n.tabs[selectedTabNum-1]);
}
}
}
}
}
}
}
},

acquireNodes: function() {
this.n.contents = document.getElementsBySelector(this.s.contentNodeSelector, this.s.container); // Grab the content containers
var tabsULContainer = document.getElementsBySelector(this.s.tabsULContainerSelector, this.s.container)[0];           // Look inside for .tabs
var tabs = tabsULContainer.getElementsByTagName('li');        // Grab LIs
for (var x=0; x<tabs.length; x++) {
var tab = {
node: tabs[x],
contentContainer: (this.n.contents.length > x) ? this.n.contents[x] : undefined,
event: null
};
if (Element.hasClassName(tabs[x], this.s.activeTabClass)) {
this.activeTab = tab;
}
this.n.tabs.push(tab);
}

this.activateEvents();
},

activateEvents: function() {
for (var x=0; x<this.n.tabs.length; x++) {
this.n.tabs[x].event = this.eObserve(this.n.tabs[x].node, this.s.eventType, this.onTabActuate.bind(this, this.n.tabs[x]));
/*
this.n.tabs[x].event = this.eObserve(this.n.tabs[x].node, 'mouseover', this.onTabMouseOver.bind(this, this.n.tabs[x]));
this.n.tabs[x].event = this.eObserve(this.n.tabs[x].node, 'mouseout', this.onTabMouseOut.bind(this, this.n.tabs[x]));
*/
}
},
onTabMouseOver: function(whichTab, e) {
Element.addClassName(this.activeTab.node, this.s.hoverTabClass);
},

onTabMouseOut: function(whichTab, e) {
Element.removeClassName(this.activeTab.node, this.s.hoverTabClass);
},

onTabActuate: function(whichTab, e) {
Event.stop(e);
if (typeof(Effect) != 'undefined') Effect.Throb(this.n.content);
this.activateTab(whichTab);
},

activateTab: function(whichTab) {
if (this.activeTab) {
Element.removeClassName(this.activeTab.node, this.s.activeTabClass);
Element.hide(this.activeTab.contentContainer);
}
this.activeTab = whichTab;
Element.show(this.activeTab.contentContainer);
Element.addClassName(this.activeTab.node, this.s.activeTabClass);
},

error: function(text) {
this.shout('kTabManager Error: '+text, this.s.showErrors);
},

debug: function(text) {
this.shout('kTabManager Debug: '+text, this.s.showDebugs);
},

shout: function(text, toWhom) {
if (toWhom === true) { // true == everybody
window.alert(text);
} else if (toWhom instanceof Array) {
for (var x=0; x<toWhom.length; x++) {
shout(text, toWhom[x]);
}
}
},

readURLParams: function() {
var KVPs = window.location.href.toQueryParams();
if(KVPs)
{
return KVPs["tabs"];
}
}

});
EventSelectors.register({
'div.tabbed': function(node) {
new kTabManager({
container: node
});
}
}, true);