/** @file tabs.js
 * Soubor obsahuje mnozinu fci, ktere pracuji s taby.
 * Znalejsimu programatorovy je tento prvek znamejsi mozna jako notebook.
 * Existuje mnozina zalozek(tabu) a ke kazde zalozce jeji obsah.
 * Uzivatel si vybira zalozky a zobrazuje se mu jejich obsah.
 * Obsah neaktivnich zalozek je skryty.
 * @warning Pro jednoduchost lze pouzit pouze jeden prvek tabs na stranku.
 */

document.observe('dom:loaded', initTabs);

/** Inicializuje taby.
 * Vsem odkazum v tabech nastavi na na kliknuti akci tabClicked.
 * Tato fce bude dostavat parametr udalosti, a this nastaveny na element odkazu.
 * Aktivuje prvni tab a zobrazi jeho obsah, ostatni schova.
 */
function initTabs(){
	$$('#tabbox .tabs a').each(
		function(anchor) {
			// nastavit taby
			anchor.observe('click', tabClicked);
			// schovat obsah tabu
			$(getTabContentId(anchor)).hide();
		}, this	);
	// aktivovat prvni tab
	$$('#tabbox .tabs li.first a').each(activateTab, this);
}

/** Obslouzi kliknuti na odkaz tabu.
 * Pokud je tab jiz aktivni a je prvni, prejde stranka na url specifikovane
 * v globalni promenne tabs_firstTabLink.
 * Jinak aktivuje tab a zobrazi jeho obsah.
 */
function tabClicked(event){
	event.stop();
	if(this.hasClassName('active') && tabIsFirst(this)){
		window.location.href = tabs_firstTabLink;
	} else {
		activateTab(this);
	}
}

/** Aktivuje tab.
 * Deaktivuje aktivni taby,
 * aktivuje pozadovany tab, ukaze jeho obsah.
 * Stara se take o schovani horniho obleho rohu tabboxu, pokud je to nutne.
 * @param tabAnchor element odkazu v tabu
 */
function activateTab(tabAnchor){
	$$('#tabbox .tabs a.active').each(deactivateTab, this);
	tabAnchor.addClassName('active');
	$(getTabContentId(tabAnchor)).show();
	// schovat roh tabboxu
	var tabboxCorner = '';
	if(tabIsFirst(tabAnchor)) {
		tabboxCorner = 'left';
	} else if(tabIsLast(tabAnchor)) {
		tabboxCorner = 'right';
	}
	if(!tabboxCorner.empty()) {
		$$('#tabbox .tabs_content .top .'+tabboxCorner)[0].hide();
	}
}

/** Deaktivuje tab.
 * Deaktivuje tab, schova jeho obsah.
 * Stara se take o zobrazeni horniho obleho rohu tabboxu, pokud je to nutne.
 * @param tabAnchor element odkazu v tabu
 */
function deactivateTab(tabAnchor){
	tabAnchor.removeClassName('active');
	$(getTabContentId(tabAnchor)).hide();
	// zobrazit roh tabboxu
	var tabboxCorner = '';
	if(tabIsFirst(tabAnchor)) {
		tabboxCorner = 'left';
	} else if(tabIsLast(tabAnchor)) {
		tabboxCorner = 'right';
	}
	if(!tabboxCorner.empty()) {
		$$('#tabbox .tabs_content .top .'+tabboxCorner)[0].show();
	}
}

/** Zjisti jestli je tab jako prvni.
 * Z nadrazeneho elementu zjisti podle tridy, je-li tab prvni.
 * @param tabAnchor element odkazu v tabu
 */
function tabIsFirst(tabAnchor){
	return getLiAncestor(tabAnchor).hasClassName('first');
}

/** Zjisti jestli je tab jako posledni.
 * Z nadrazeneho elementu zjisti podle tridy, je-li tab posledni.
 * @param tabAnchor element odkazu v tabu
 */
function tabIsLast(tabAnchor){
	return getLiAncestor(tabAnchor).hasClassName('last');
}

function getLiAncestor(tabAnchor){
	var ancestors = tabAnchor.ancestors();
	var i;
	for( i=0 ; i < ancestors.length ; ++i){
		if(ancestors[i].tagName=='LI'){
			return ancestors[i];
		}
	}
	return null;
}

/** Id obsahu tabu.
 * Ze zadaneho elementu odkazu zjisti id elementu ve kterem je obsah tabu.
 * Id musi byt v odkazu v atrubutu href za poslednim znakem #
 * @param tabAnchor element odkazu v tabu
 */
function getTabContentId(tabAnchor){
	return tabAnchor.href.substr(tabAnchor.href.lastIndexOf('#')+1);
}


