/*
 * Changebox - jQuery plugin
 *
 * vytvori box s prepinanim polozek
 *
 * autor: Petr Dusatko
 *
 * verze: 1.0 (23/08/2010)
 * vyzaduje: jQuery v1.4+
 */

(function($) {

	$.fn.changebox = function(options) {

		/* defaultni nastaveni rozsirime o uzivatelske */
		var opts = $.extend({}, $.fn.changebox.defaults, options);

		
			this.each(function() 
			{
				var $this = $(this);
				
				if ($(".item", this).length > 1) 
				{
					/* init kazde prolinacky z vyselektovane mnoziny */
					init($this, opts);
				}
			});

		return this;

	};

	/*
	 * vytvori strukturu prolinacky
	 *
	 * @param node objekt prolinacky
	 * @param options nastaveni
	 */
	function init(node, options) {
		
		/* zobrazit ovladaci prvky? */
		if (options['arrows'] || options['numbers'] || options['play_pause'])
		{
			control_cont = $("<ul>", {'class' : 'controls'});

			/* zobrazit sipku prev */
			if (options['arrows'])
			{
				li = $("<li>", {'class' : 'previous'});
				li.append($("<a>", {
					'href' : '#prev',
					'text' : options['previous_text'],
					click : function(){
						change(node, 'prev');
						return false;
					}
				}));

				control_cont.append(li);
			}

			/* zobrazit cisilka */
			if (options['numbers'])
			{
				/* pro kazdy .item vytvorime cisilko */
				$(".item", node).each(function(j, item){
					
					li = $("<li>", {'class' : 'number' + (!j ? ' act' : '')});
					
					li.append($("<a>", {
						'href' : '#' + (j + 1),
						'text' : (j + 1),
						click : function(){
							/* pokud je jiz cislo aktivni, nemusime na nej prepinat */
							if (!$(this).parent("li").hasClass('act'))
							{
								change(node, j);
								stop(node, options);
							}
							return false;
						}
					}));

					control_cont.append(li);
				});
			}

			/* zobrazit sipku next */
			if (options['arrows'])
			{
				li = $("<li>", {'class' : 'next'});
				li.append($("<a>", {
					'href' : '#next',
					'text' : options['next_text'],
					click : function(){
						change(node, 'next');
						return false;
					}
				}));

				control_cont.append(li);
			}

			/* zobrazit tlacitko play/pause */
			if (options['play_pause'])
			{
				li = $("<li>", {'class' : 'play_pause play'});
				li.append($("<a>", {
					'href' : (options['play'] ? "#pause" : "#play"),
					'text' : (options['play'] ? options['pause_text'] : options['play_text']),
					click : function(){
						if (node.data('isPlaying'))
						{
							stop(node, options);
						}
						else
						{
							play(node, options);
						}

						return false;
					}
				}));

				control_cont.append(li);
			}

			node.prepend(control_cont);
		}

		/* skryt vsecky .itemy krome prvniho */
		$(".item", node).hide();
		$(".item:first", node).show();

		/* prvni item je pri initu aktivni */
		$(".item:first", node).addClass("act");

		/* pokud se ma automaticky zacit prepinat */
		if (options['play'])
		{
			if (options['delay'])
			{
				/* prepinani spustit se spozdenim delay (pokud je nastaveno) */
				setTimeout(function(){
					play(node, options);
				}, options['delay']);
			}
			else
			{
				/* prepinani spustit ihned */
				play(node, options);
			}
		}

		/* pri najeti mysi pozastavit prepinani */
		if (options['pause_on_hover'])
		{
			$(".item", node).hover(
				function () {
					stop(node, options);
				},
				function () {
					play(node, options);
				}
			);
		}

		return true;

	}

	/*
	 * prejne na dany prvek prolinacky
	 *
	 * @param node objekt prolinacky
	 * @param to na ktery element prejit ("next"/"prev"/cislo)
	 */
	function change(node, to)
	{
		/* ziskame aktualni item a aktualni cisilko */
		act_item = $(".item.act", node);
		act_ctl = $(".number.act", node);

		/* skryt vsechny viditelne itemy */
		visible = $(".item:visible", node);
		visible.fadeOut('slow');
		visible.removeClass('act');

		/* odaktivnit aktivni cisilko */
		$(".number", node).removeClass('act');

		/* prepnout na dalsi item */
		if (to == 'next')
		{
			to_element = act_item.next(".item");
			ctl = act_ctl.next(".number");

			if (! to_element.length)
			{
				to_element = $(".item:first", node);
				ctl = $(".number:first", node);
			}
			ctl.addClass('act');
		}
		/* prepnout na predchozi item */
		else if (to == 'prev')
		{
			to_element = act_item.prev(".item");
			ctl = act_ctl.prev(".number");

			if (! to_element.length)
			{
				to_element = $(".item:last", node);
				ctl = $(".number:last", node);
			}
			ctl.addClass('act');
		}
		/* prepnout na n-ty item (pocitano od nuly) */
		else
		{
			to_element = $(".item:eq(" + to + ")", node);

			$(".controls .number:eq(" + to + ")", node).addClass('act');
		}

		/* zobrazit pozadovany item a zaktivnit ho */
		to_element.fadeIn('slow');
		to_element.addClass('act');

		return true;
	}

	/*
	 * spusti periodicke prepinani prolinacky
	 *
	 * @param node objekt prolinacky
	 * @param time interval prepinani
	 * @param options nastaveni
	 */
	function play(node, options) {

		/* priznak isPlaying a objekt timeru ulozime do daneho nodu */
		if (! node.data('isPlaying'))
		{
			node.data('timer', window.setInterval(function(){
					change(node, 'next');
				}, options['time'])
			);

			node.data('isPlaying', true);

			$("li.play_pause", node).removeClass('play').addClass('stop');
			$("li.play_pause a", node).text(options['pause_text'])
		}

		return true;
	}

	/*
	 * zastavi prepinani prolinacky
	 *
	 * @param node objekt prolinacky
	 * @param options nastaveni
	 */
	function stop(node, options)
	{
		if (node.data('timer'))
		{
			/* smazeme timer */
			window.clearInterval(node.data('timer'));

			$("li.play_pause", node).removeClass('stop').addClass('play');
			$("li.play_pause a", node).text(options['play_text'])
		}
		
		/* a prepneme priznak */
		node.data('isPlaying', false);

		return true;
	}

	/* verejne pristupne defaultni hodnoty nastaveni */
	$.fn.changebox.defaults = {
		'arrows'		: true,		// zobrazit prepinaci sipky
		'numbers'		: true,		// zobrazit prepinaci cisilka
		'play_pause'	: false,	// zobrazit tlacitko play/pause
		'play'			: true,		// zacit automaticky prepinat
		'time'			: 6000,		// cas mezi prepinanim v milisekundach
		'delay'			: 0,		// spozdeni zacatku prepinani v milisekundach
		'pause_on_hover': true,		// pri prejeti mysi nad prolinackou pozastavit prepinani
		'previous_text'	: '<',		// text tlacitka prechozi
		'next_text'		: '>',		// text tlacitka dalsi
		'play_text'		: 'play',	// text tlacitka play/pause - spustit
		'pause_text'	: 'pause'	// text tlacitka play/pause - zastavit
	};
	
})(jQuery);

