/**
 *	Created by Daniel Robenek 2009
 *	MTabs Version 1.05
 *	Date: 16.6.2009
 *	Všechna práva vyhrazena. Bez souhlasu autora je užívání tohoto kódu zakázáno.
 *	Vyžadována knihovna JQuery 
 **/ 
 
/**
 *	input = vstupní blok ve kterém jsou záložky (bloky <li> s id)
 *	page = stránka na kterou se bude odkazovat
 *	output = div blok do kterého se bude zapisovat příjmutý text  
 *	startpage = číslo stránky / id <li> tagu stránky která se má načíst po startu (default = -1 - nenačítat žádnou)
 *	docache = ukládat jednou načtené stránky do paměti ? (default = true)
 *	hideid = tlačítko pro skrývání výsledku (-1 = žádné)
 *	hidden = má se po startu skrýt?  
 *	onover = Ke zobrazení tabu stačí najet myší 
 **/

/**
 *	Příklad formuláře:
 *	<div class="mtabs"> 
 *		<ul id="mujtab">
 *			<li id="jedna">Tab 1</li>
 *			<li id="dve"  >Tab 2</li>
 *			<li id="tri"  >Tab 3</li>  
 *		</ul>
 *		<div id="result" class="tab_result"></div>
 *	<div>
 *	
 *	Příklad přetvoření na ajax formulář:
 *	tabs = new MTabs("mujtab", "text.php", "result", "dve");
 *	Tento příkaz musí být proveden až po vytvoření "formuláře"	
 * 
 *	Při kliku na záložku se bude vyslán dotaz ve stylu "text.php?tab=jedna", (hodnota dosazená do tabu je id <li> tagu)
 *	
 *	Instanci objektu MTabs lze přiřadit parametry (pouze pokud se stránka načítá - není z cache)
 *		tabs.loadingtext = "text";	// Pokud je přiřazen, vypíš se text během stahování
 *		tabs.onLoad	= funkce;		// Pokud je přiřazena funkce, zavolá se při začátku stahování
 *		tabs.onLoaded = funkce;		// Pokud je přiřazena funkce, zavolá se po skončení stahování
 **/ 

  
function MTabs(input, page, output, startpage, docache, hideid, hidden, onover)
{
	this.Proxy = function(self, pfunc) { return function() { pfunc.apply(self); } }
	this.ProxyData = function(self, pfunc) { return function(data) { pfunc.call(self, data); } }
	this.page = page;	// Stránka do které se budou odesílat dotazy
	this.output = $("#" + output);	// Blok do kterého se bude zapisovat
	this.inputs = $("#" + input + " li");
	for(i = 0; i < this.inputs.length; i++)
		this.inputs[i] = $(this.inputs[i]);
	this.docache = ( docache == null ) ? true : docache;
	if( this.docache )
		this.cache = new Array();
	this.hide = ( hideid == null || hideid == -1 ) ? null : $("#" + hideid);
	if(this.hide && hidden)
	{
		this.output.css("display", "none");
		this.hide.css("display", "none");
		startpage = -1;
	}
	
	this.onover = ( onover != null && onover == true );
	//this.loadingtext = "<center>Loading...</center>";	// Pokud je přiřazen, vypíš se text během stahování
	/*
		this.onLoad			// Pokud je přiřazena funkce, zavolá se při začátku stahování
		this.onLoaded		// Pokud je přiřazena funkce, zavolá se po skončení stahování
	*/
	
	// Obslužná funkce pro klik na tab
	this.ManageClickEvent = function(object)
	{
		if( this.output.css("display") == "none" )
		{
			this.output.css("display", "block");
			this.hide.css("display", "block");
		}
		if( this.httpRequest )
		{
			this.httpRequest.abort();	// Proti přepsání později přjmutou stránkou
		}
		if( this.docache && this.cache[object.attr("id")] != null )
			this.output.html(this.cache[object.attr("id")]);
		else
		{		
			if( this.onLoad )
				this.onLoad();
			if( this.loadingtext )
				this.output.html(this.loadingtext);
			this.SendEvent(this.page + "?tab=" + object.attr("id"));
		}
	}
	
	// Pošle HttpRequest servru s požadovaným odkazem
	this.SendEvent = function(odkaz)
	{
		this.httpRequest = $.ajax({
			url: odkaz,
			success: this.ProxyData(this, function(data){
				this.Receive(data);
			}),
			error: this.Proxy(this, function(){
				this.AjaxError();
			})
		});
	}

	// Přijme HTTP Request a zobrazí výsledek do this.output
	this.Receive = function(data)
	{
		//oddelovac = '<div class="oddeleni"></div>';
		//this.output.html(oddelovac + data + oddelovac);
		this.output.html(data);
		if( this.docache )
			this.cache[this.actual.attr("id")] = data;
			//this.cache[this.actual.attr("id")] = oddelovac + data + oddelovac;
		if( this.onLoaded )
			this.onLoaded();

		this.httpRequest = null;
	}
	
	// Vypíše že data nemohla být příjmuta
	this.AjaxError = function()
	{
		//oddelovac = '<div class="oddeleni"></div>';
		//this.output.html(oddelovac + "Error 404 - Chyba při získávání stránky !" + oddelovac);
		this.output.html("Error 404 - Chyba při získávání stránky !");
		this.httpRequest = null;
	}
	
	// Funkce která přidá prvknu eventy
	this.AddEvents = function(prvek)
	{
		if( this.onover )
		{
			prvek.mouseover( this.Proxy(this, function(){
				if( prvek != this.actual )	// zabrání onovunačtení stejného tabu
				{
					if(this.actual)
					{
						this.actual.removeClass("active");
					}
					prvek.addClass("active");
					this.actual = prvek;
					this.ManageClickEvent(prvek);
				}				
			}));
		}
		else
		{
			prvek.click( this.Proxy(this, function(){
				if( prvek != this.actual )	// zabrání onovunačtení stejného tabu
				{
					if(this.actual)
					{
						this.actual.removeClass("active");
					}
					prvek.addClass("active");
					this.actual = prvek;
					this.ManageClickEvent(prvek);
				}				
			}));
			
			prvek.mouseover( this.Proxy(this, function(){
				if( prvek != this.actual )
				{
					prvek.addClass("hover");
				}
			}));
			
			prvek.mouseout( this.Proxy(this, function(){
				prvek.removeClass("hover");
			}));
		}
	}
	
	// Načte stránku objektem, id nebo pořadím
	this.LoadPage = function(variable)
	{
		obj = this.inputs[0];
		if     ( typeof variable == 'string' )
			obj = $("#" + variable);
		else if( typeof variable == 'number' )
			obj = (variable > 0 && variable <= this.inputs.length) ? this.inputs[variable-1] : this.inputs[0];
		else if( typeof variable == 'object' )
			obj = variable;
		if(this.actual)
			this.actual.removeClass("active");
		this.actual = obj;
		this.ManageClickEvent(this.actual);
		this.actual.addClass("active");

	}

	// Navrátí index aktuálně zvolené záložky podle předajého objektu
	this.IndexOf = function(obj)
	{
		for(i = 0; i < this.inputs.length; i++)
		{
			if(obj.attr("id") == this.inputs[i].attr("id"))
			{
				return i;
			}
		}
		return -1;
	}

	// Ukryje pole s výstupem a tlačítko na skrývání
	this.Hide = function()
	{
		this.output.html("");
		this.output.css("display", "none");
		this.hide.css("display", "none");
		if(this.actual)
		{
			this.actual.removeClass("active");
			this.actual = null;
		}
	}
	
	// Přejde na následující záložku
	this.NextPage = function()
	{
		page = this.IndexOf(this.actual) + 1;
		this.LoadPage( (page >= this.inputs.length) ? 0 : page );
	}
	// Přejde o záložku zpět
	this.PrevPage = function()
	{
		page = this.IndexOf(this.actual) - 1;
		this.LoadPage( (page < 0) ? this.inputs.length - 1 : page );
	}
	
	// Přidá eventy pro zavírací tlačítko
	this.AddCloseEvents = function(item)
	{
		this.hide.click( this.Proxy(this, function(){
			this.Hide();
		}));
	}

	// --- INIT ---
	for(i = 0; i < this.inputs.length; i++)
	{
		this.AddEvents(this.inputs[i]);
	}

	if( this.hide != null )
		this.AddCloseEvents(this.hide);
	if( startpage && startpage != -1 && startpage != 0 )
		this.LoadPage(startpage);
	// --- END_INIT ---
}


