/**
 * Biblioteka obsługi zakładek (tabs) przełączajcych obszary robocze.
 * Zakładki mogą przełączać obszary dynamicznie (DHTML) lub statycznie (przejście pod zadany adres URL).
 * Możliwe jest jednoczesne zdefiniowanie obu rodzajów zakładek.
 *
 * @version $Id: MafiTabsManager.js,v 1.1 2005/06/21 10:47:59 jarek Exp $
 * @access public
 * @author Jarek Wasilewski <jaroslaw.wasilewski@biatel.pl>
 * @todo Obliczanie i ew. dopasowywanie szerokości panelu do ilości zakładek
 */
function MafiTabsManager(objName) {
	this.Id = objName;
	this._tabs = Array();
	this._currentTab = 0;

	// methods
	this.AddTab = mtmAddTab;
	this.Show = mtmShowTabs;
	this.SetActive = mtmSetTab;
	this.Init = mtmInitTabs;

	// Initialization
//	if (menuVerifyWidth == 1) if (parseInt(menuWidth) * numberOfTabs + parseInt(menuSpacing) * numberOfTabs + parseInt(menuLeftOffset) > parseInt(contentWidth)) contentWidth = parseInt(menuWidth) * numberOfTabs + parseInt(menuSpacing) * numberOfTabs + parseInt(menuLeftOffset) + 'px';
}

function mtmAddTab(tabObj) {
	if (tabObj != undefined && typeof (tabObj) == 'object')
		this._tabs[this._tabs.length] = tabObj;
}

/**
 * Ustawia aktywną zakładkę
 * Zakładka jest dezaktywowana tylko jeśli nie ma ustawione funkcji obsługi zdarzenia OnBlur
 * lub funkcja obslug tego zdarzenia zakończyła się pomyślnie oraz jeśli kliknieta zakładka
 * nie ma ustawione funkcji obsługi zdarzenia OnClick lub jeśli funkcja ta zwraca true;
 * Sprawdzane jest też wynik funkcji DeActivate (domyślnie zawsze true). Dopiero wtedy następuje
 * aktywacja nowej zakładki.
 *
 * @access public
 */
function mtmSetTab(tabId) {
	if (!this._tabs[this._currentTab].OnBlur || this._tabs[this._currentTab].OnBlur()) {
		if (!this._tabs[tabId].OnClick || this._tabs[tabId].OnClick()) {
			if (this._tabs[tabId].Url != "#") {
				this._tabs[this._currentTab].DeActivate(false);
				this._tabs[tabId].Activate();
			}
			else if (this._tabs[this._currentTab].DeActivate()) {
				this._tabs[tabId].Activate();
			}
		}
	}
	this._currentTab = tabId;
}

function mtmShowTabs() {
	for (i = 0; i < this._tabs.length; i++) {
		this._tabs[i].Render(i, this.Id+".SetActive");
	}
}

 /**
 * Inicjuje zakładki
 * @param integer _startTabId numer zakałdki, która będzie początkowo ustawiona jako aktywna
 * @access public
 */
function mtmInitTabs() {
	_startTabId = arguments.length > 0 ? arguments[0] : this._currentTab;
	for (i = 0; i < this._tabs.length; i++) {
		if (i == _startTabId) {
			this._tabs[_startTabId].Activate(false);
		}
		else
			this._tabs[i].DeActivate();
	}
}


/**
 * Klasa pojedynczej zakładki TabManagera
 * Zakładka może przełączać dynamiczny obszar (div) lub być linkiem pod wskazany adres URL. Może też być statyczna.
 * Linki do stron powinny być podane jak w CSS, czyli w postaci "url(adres)"
 * @access public
 */
function MTM_Tab(tab_id, div_id, tab_label, tab_active_class, tab_inactive_class) {
	/**
	 * @param string Id Identyfikator zakładki - służy tez jako id w div
	 * @access public
	 */
	this.Id = this.Name = tab_id;
	/**
	 * @param string Label Etykieta zakładki
	 * @access public
	 */
	this.Label = this.Title = tab_label;

	/**
	* @param string Url Adres, pod jaki prowadzi zakładka; format CSS: url(adres)
	 * @access public
	 */
	this.Url = null;

	/**
	 * @param string PanelId Id znacznika div zawierającego treść zakładki
	 * @access public
	 */
	this.PanelId = null;

	/**
	 * @param string ActiveCssClass Klasa CSS zakładki aktywnej
	 * @access public
	 */
	this.ActiveCssClass = tab_active_class;

	/**
	 * @param string InactiveCssClass Klasa CSS zakałdki nieaktywnej
	 * @access public
	 */
	this.InactiveCssClass = tab_inactive_class;

	// methods
	this.Render = mtmTabRender;
	this.Activate = mtmTabActivate;
	this.DeActivate = mtmTabDeActive;
	// event called then user Click on the tab and before Activate() method is called
	this.OnClick = null;
	this.OnBlur = null;

	// initialization
	if (div_id.substr(0, 4) == 'url(') {
		this.Url = div_id.substr(4, div_id.length-5);
		this.PanelId = null;
	}
	else {
		this.PanelId = div_id;
		this.Url = "#";
	}

}

/**
 * Kod HTML dynamicznej i statycznej zakładki:
 * <div id="tabId" class="tabClass" name="tabId" onclick="mtmSetTab(tabId)" title="tabTitle">Label</div>
 * Kod HTML nieaktywnej zakładki: <div id="tabId" class="tabClass" name="tabId">Label</div>
 */
function mtmTabRender(tabId, onClickMethod) {
	_code = '<div id="'+this.Id+'" class="'+this.ActiveCssClass+'" name="'+this.Name+'" title="'+this.Title+'" onclick="'+onClickMethod+"("+tabId+')"><span>'+this.Label+'</span></div>';
	document.write(_code);
}

/**
 * Aktywowanie zakładki polega na zmianie jej klasy na ActiveCssClass oraz na pokazaniu odpowiadającego jej obszaru
 * @param bool canGoUrl czy aktywacja ma powodować przejście pod wskazany adres url
 */
function mtmTabActivate() {

	_tab = document.getElementById(this.Id);
	_tab.className = this.ActiveCssClass;
	_canGoUrl = arguments.length > 0 ? arguments [0] : true;

	if (this.PanelId) {
		_panel = document.getElementById(this.PanelId);
		_panel.style["display"] = "block";
	}
	else if (this.Url && _canGoUrl)
		window.location.href = this.Url;
	return true;
}

/**
 * Deaktywowanie zakładki polega na zmianie jej klasy na InactiveCssClass oraz na schowaniu odpowiadającego jej obszaru
 */
function mtmTabDeActive() {

	_tab = document.getElementById(this.Id);
	_tab.className = this.InactiveCssClass;
	// zezwolenie na ukrycie powiązanego panelu
	_canHidePanel = arguments.length > 0 ? arguments [0] : true;

	if (this.PanelId && _canHidePanel) {
		_panel = document.getElementById(this.PanelId);
		_panel.style["display"] = "none";
	}
	return true;
}

