taber = {};

// vlastne nastavenia pouzitych tried
taber.classTabs =			"tabs";		// DL s touto triedou bude prerobene na taber
taber.classActive =			"active";	// aktivna zalozka (DT, DD)
taber.classInactive =		"inactive";	// neaktivna zalozka (DT, DD)


// inicialiacia pri onLoad
taber.init = function() {

	// najdeme si vsetky DLka s danym classom
	var dl = document.getElementsByTagName("dl");
	for (var i = 0; i < dl.length; i++) {
		if (classMagic.has(dl[i], taber.classTabs)) {
			
			// ak najdeme vhodne DLko, najdeme si vsetky taby, ktore su priamo pod dnim
			var dt = dl[i].getElementsByTagName("DT");
			var dd = dl[i].getElementsByTagName("DD");
			
			var realDT = [];
			var realDD = [];
			
			var activeTab = null;
			
			for (var j = 0; j < dt.length; j++) {
				if (dt[j].parentNode == dl[i]) {
					
					// nasli sme skutocny tab patriaci danemu taberu
					var n = realDT.length;
					realDT[n] = dt[j];
					realDD[n] = dd[j];
					
					// priradime im navzajom referenciu
					dt[j].tabReference = dd[j];
					dd[j].tabReference = dt[j];
					
					// zavesime na tab event
					addEvent(dt[j], "click", taber.swap);
					
					// ak este nemame aktivny tab, overime si ci nie je aktivny
					if ((j == 0) || (classMagic.has(dt[j], taber.classActive))) {
						activeTab = n;
					}
					
				}
			}
			
			// mame k dispozicii vsetky udaje, ktore potrebujeme
			// prejdeme si teda zoznam najdenych tabov este raz a priradime im prislusne atributy
			// a zaroven poprehadzujeme ich poradie aby sme DTcka a DDcka dali dohromady
			
			for (var j = 0; j < realDT.length; j++) {

				// ak to nie je posledny tab, vlozime pred neho predchadzajuci
				if (realDT[j+1]) {
					dl[i].insertBefore(realDT[j], realDT[realDT.length-1]);
					dl[i].insertBefore(realDD[j], realDD[realDD.length-1]);
				}
				
			}

			// pre istotu zrusime vsetky aktivne taby (aj tak si ich pamatame, nastavime ich neskor)
			classMagic.remove(realDT, taber.classActive)
			classMagic.remove(realDD, taber.classActive)

			// schovame obsahy vsetkych tabov...
			classMagic.add(realDT, taber.classInactive)
			classMagic.add(realDD, taber.classInactive)
			
			// ...a zobrazime iba ten, ktory je nastaveny ako skutocne aktualny
			// (vyhneme sa tak problemom s viacnasobnymi aktivnymi tabmi definovanymi uzivatelom)
			classMagic.replace(realDT[activeTab], taber.classActive, taber.classInactive)
			classMagic.replace(realDD[activeTab], taber.classActive, taber.classInactive)
			
			// ulozime do daneho DLka informaciu o aktualnom tabe
			dl[i].actualTab = dt[activeTab];
		
			// vynutime prekreslenie elementu, aby sa objekty zobrazili na spravnej pozicii (Mozilla)
			dl[i].style.display = "none";
			dl[i].style.display = "block";

		}
	}
	
	return true;

}


// funkcia volana, ak uzivatel klikne na tab
taber.swap = function(e) {

	// fixneme event model v IE
	e = fixE(e);

	// najdeme spravny objekt (event mohol byt vyvolany nejakym vnorenym elementom
	obj = e.target;
	while (obj.tagName != "DT") {
		obj = obj.parentNode;
		
		// ak dorazime na vrchol dokumentu, je zbytocne pokracovat dalej, tab nebol najdeny
		if (obj.tagName == "BODY") {
			return false;
		}
	}
	
	taber.activate(obj);
	
	return true;
}


// funkcia na preklopenie aktualneho tabu
taber.activate = function(newTab) {
	if (newTab && (newTab.tagName == "DT")) {
		
		var tabSet = newTab.parentNode;
		
		// overime si, ci dane DL je naozaj taber
		if (classMagic.has(tabSet, taber.classTabs)) {
		
			// overime si, ci novy tab nie je zhodny z aktivnym, aby sme ho nepreklapali zbytocne
			if (newTab != tabSet.actualTab) {
			
				// zrusime stary aktualny tab
				classMagic.replace(tabSet.actualTab, taber.classInactive, taber.classActive);
				classMagic.replace(tabSet.actualTab.tabReference, taber.classInactive, taber.classActive);
				
				// a zaktivujeme novy tab
				classMagic.replace(newTab, taber.classActive, taber.classInactive);
				classMagic.replace(newTab.tabReference, taber.classActive, taber.classInactive);
				
				tabSet.actualTab = newTab;
				
			}
			
			// nakoniec si este overime, ci dany tab nie je vnoreny do ineho a ak ano, aktivujeme aj jeho rodica
			var obj = tabSet;
			while (obj.tagName != "BODY") {
				obj = obj.parentNode;
				if ((obj.tagName == "DD") && classMagic.has(obj.parentNode, taber.classTabs)) {
					taber.activate(obj.tabReference);
					return true;
				}
			}
			
			return true;
		}
		
	}
	return false;
}


addEvent(window, "load", taber.init);

