/**
/  Tabber v1.0
/  (c) 2008 Adam Schwartz - http://polymath.mit.edu
/  Licensed under the MIT Licencse
/  http://www.opensource.org/licenses/mit-license.php
/  This is distributed WITHOUT ANY WARRANTY; without even the implied
/  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/

/* Dependencies: classmanipluation.js */

document.write("<style type=\"text/css\"> .hidden { display:none; } .displayed { display:block; } a { outline:none; }</style>");

var TABBER_MENUS = {};

var Tabber = {
	OPEN_TABS: new Array(),
	TABBER_MENUS: new Array(),
	ERROR_LOG: new Array(),
	TABBER_TOP: "TABBER_TOP",
	TABBER: "tabber",
	NOT_TAB: "not_tab",
	NO_PERSIST: "no_persist",
	SUBTAB: "-subtab",
	HIDE_CSS_CLASS: "hidden",
	SHOW_CSS_CLASS: "displayed",
	CSS_TAB_REGULAR: "-Tab",
	CSS_TAB_SELECTED: "-TabSelected",
	init: function() {
		for (i in TABBER_MENUS) {
			Tabber.TABBER_TOP = i.toString();
			var TOP_MENU = TABBER_MENUS[i];
		}
		Tabber.traverse(TOP_MENU, Tabber.TABBER_TOP);
		Tabber.generateTabbers();
		Tabber.openTabFromURLHash();
	},
	traverse: function(object, parent) {
		for (i in object) {
			var j = object[i];
			if (isString(j)) {
				Tabber.TABBER_MENUS.push([parent,i]);
				if (j=='o') {
					Tabber.OPEN_TABS.push(i);
				}
			} else {
				Tabber.TABBER_MENUS.push([parent,i]);
				Tabber.traverse(j, i);
			}
		}
	},
	generateTabbers: function() {
		var allDivs = document.body.getElementsByTagName("DIV");
		for (t=0; t<allDivs.length; t++) {
			if (ClassManipulation.hasClass(allDivs[t], Tabber.TABBER)) {
				Tabber.generateTabber(allDivs[t].id.toString());
			}
		}
	},
	generateTabber: function(tabberID) {
		var menu = G(tabberID);
		if (ClassManipulation.hasClass(menu, Tabber.TABBER)) {
			var allTabs = menu.getElementsByTagName("A");
			for (y=0; y<allTabs.length; y++) {
				if (!ClassManipulation.hasClass(allTabs[y], Tabber.NOT_TAB)) {
					var title = allTabs[y].title.toString();
					ClassManipulation.addClass(allTabs[y], tabberID + Tabber.CSS_TAB_REGULAR);
					if (!ClassManipulation.hasClass(menu, Tabber.NO_PERSIST)) {
						allTabs[y].onclick = new Function("Tabber.openTab('"+title+"')");
						allTabs[y].href = "#tab="+title+"";
					} else {
						allTabs[y].href = "javascript:Tabber.openTabUtil('"+title+"','"+tabberID.substr(0,tabberID.length-7)+"')";
					}
				}
			}
		}
	},
	findInTree: function(string, tree, topOfTree, trackBack) {
		if (!trackBack) { var trackBack = new Array(); }
		for (q=0; q<tree.length; q++) {
			var node = tree[q];
			if (node[1] == string) {
				var parent = node[0];
				if (parent) {
					if (parent == topOfTree) {
						trackBack.push(parent);
						return trackBack;
					} else {
						trackBack.push(parent);
						return Tabber.findInTree(parent, tree, topOfTree, trackBack);
					}
				}
			}
		}
		return trackBack;
	},
	openTabFromURLHash: function() {
		var currentURL = document.location.href;
		var hash = currentURL.split("#tab=")[1];
		for (dt=0; dt<Tabber.OPEN_TABS.length; dt++) {
			Tabber.openTabWithParentUknown(Tabber.OPEN_TABS[dt]);
		}
		if (hash && hash!="") {
			Tabber.openTab(hash);
		}
	},
	openTabWithParentUknown: function(string) {
		for (q=0; q<Tabber.TABBER_MENUS.length; q++) {
			var node = Tabber.TABBER_MENUS[q];
			if (node[1] == string) {
				var parent = node[0];
			}
		}
		Tabber.openTabUtil(string, parent);
	},
	openTab: function(tabName) {
		var trackBackStarter = new Array();
		trackBackStarter.push(tabName);
		var treeWalkArray = Tabber.findInTree(tabName, Tabber.TABBER_MENUS, Tabber.TABBER_TOP, trackBackStarter);
		if (treeWalkArray) {
			if (treeWalkArray.length > 1) {
				for (u=treeWalkArray.length-1; u>0; u--) {
					Tabber.openTabUtil(treeWalkArray[u-1], treeWalkArray[u]);
				}
			}
		}
	},
	openTabUtil: function(tabName,parentName) {
		if (parentName!=Tabber.TABBER_TOP) {
			parentName = parentName + Tabber.SUBTAB;
		}
		Tabber.closeAllContentBoxes(parentName);
		Tabber.animateTabDown(tabName,parentName);
		Tabber.show(G(tabName));
	},
	animateTabDown: function(tabName,parentName) {
		var tabs = G(parentName).getElementsByTagName('A');
		for (j=0; j<tabs.length; j++) {
			if (tabs[j].title.toString() == tabName) {
				ClassManipulation.addClass(tabs[j], parentName.toString() + Tabber.CSS_TAB_SELECTED);
				ClassManipulation.removeClass(tabs[j], parentName.toString() + Tabber.CSS_TAB_REGULAR);
			} else {
				if (!ClassManipulation.hasClass(tabs[j], Tabber.NOT_TAB)) {
					ClassManipulation.addClass(tabs[j], parentName.toString() + Tabber.CSS_TAB_REGULAR);
					ClassManipulation.removeClass(tabs[j], parentName.toString() + Tabber.CSS_TAB_SELECTED);
				}
			}
		}
	},
	closeAllContentBoxes: function(parentName) {
		var tabs = G(parentName).getElementsByTagName('A');
		for (k=0; k<tabs.length; k++) {
			if (!ClassManipulation.hasClass(tabs[k], Tabber.NOT_TAB)) {
				Tabber.hide(G(tabs[k].title.toString()));
			}
		}
	},
	hide: function(obj) { if (obj) { ClassManipulation.removeClass(obj, Tabber.SHOW_CSS_CLASS); ClassManipulation.addClass(obj, Tabber.HIDE_CSS_CLASS); } },
	show: function(obj) { if (obj) { ClassManipulation.removeClass(obj, Tabber.HIDE_CSS_CLASS); ClassManipulation.addClass(obj, Tabber.SHOW_CSS_CLASS); } },
	isHidden: function(obj) { if (obj) { if (ClassManipulation.hasClass(obj, Tabber.HIDE_CSS_CLASS)) { return true; } else { return false; }; } }
}

addLoadEvent(Tabber.init);