(function(jQuery) { // Cria um closure para que as funcoes se mantenham privadas

/* 
*  Patrick Medina  - 2008
*
*  TODO:
*  - criar scrool vertical
*  - acrescentar opcao de scroll do rato com plugin jquery ja existente
*  - acrescentar opcao de animar com bounce e outros efeitos com plugin jquery ja existente
*  - correr a extensao apenas depois de carregar as imagens todas do conteudo
*/

	jQuery.fn.jCarouselNav = function(o) { 

		var div = jQuery(this);
		var o;


		/*
		* Definicoes default
		*/
		var o = jQuery.extend({
			visible: 1, // quantos e que mostra de cada vez
			start: 0, // o slide que abre por default
			circular: true, // se e circular
			btnGo: true, // se tem botoes de navegacao por numero
			btnPausePlay: true, // se tem botao play/pause
			speed: 300, // o tempo de dura a transicao entre slide
			autoPlay: false, // se comeca a tocar por default
			autoTime: 5000 // o tempo que mostra cada slide
			//goNumberCallBack: funcao evocada quando muda o slide
			//initCallBack: funcao evocada quando e executada esta extensao
			
		}, jQuery.fn.jCarouselNav.defaults, o);


		if (typeof(o.initCallBack) == "function") o.initCallBack(o);

		jQuery("img:last", div).ready(function () { // executa o codigo apenas depois de carregar a ultima imagem
			/*
			* Variaveis adicionadas ao objecto 'o' que sao passadas entre todas as funcoes
			*/
			o.div = div;
			o.ul = jQuery("ul", div);
			o.lis = jQuery("li", div).css({float: "left"}); // necessario para que fiquem com largura automaticamente
			o.liWidth = jQuery("li:first", div).width(); // apanha a largura do primeiro <li> dentro do div que evoca a funcao
		
			o.current = o.start; // posicao actual do slide = ao que for escolhido para o inicio
			o.pausePlay = (o.autoPlay===false ? "play" : "pause"); // se tiver opcao autoPlay ligada coloca em play
	
	
	
	
	
	
			/*
			* Funcoes privadas
			*/
			function goNumber (o){ // vai para o slide current
				if (typeof(o.goNumberCallBack) == "function") o.goNumberCallBack(o);
				var curr = (o.current - Math.floor(o.visible / 2)); // coloca o slide current na posicao central mesmo que sejam mostrados 3 de cada vez
				if(curr < 0) curr = 0; // nao deixa passar mais para a esquerda do primeiro slide
				if((curr + o.visible) > o.lis.length) curr = o.lis.length - o.visible; // nao deixa passar mais para a direita do ultimo slide
				
				var marginLeft = "-" + (curr * o.liWidth); // poisicionamento horizontal do slide = - slide actual * largura do slide
				//var marginTop = "-" + (curr * o.liHeight);
				o.ul.animate({ // posiciona o slide com recurso a margem a esquerda
					marginLeft : marginLeft
					}, o.speed
				);
				o.ul.queue(function () { // adiciona a queue a troca da classe da navegacao actual, so executa no final da animacao da troca de slide
					goNumberClass(o); // troca da classe da navegacao actual
					jQuery(this).dequeue(); // tira a troca da classe da queue depois de a executar
				});
			}
	
	
			function goPrev (o){ // vai para o slide anterior
				var curr = o.current+1; // sabe qual e o slide actual
				if(curr == 1) { // se o slide actual for o primeiro
					if(o.circular === false){ // se o carousel nao for circular
						return;
					} else { // se o carousel for circular
						curr = o.lis.length+1; // mostra o ultimo slide
					}
				}
				o.current = parseFloat(curr)-2;
				goNumber(o);				
			}
	
	
			function goNext (o){ // vai para o slide seguinte
				var curr = o.current+1; // sabe qual e o slide actual
				if((curr) == o.lis.length) { // se o slide actual for o ultimo
					if(o.circular === false){ // se o carousel nao for circular
						return;
					} else { // se o carousel for circular
						curr = 0; // mostra o primeiro slide
					}
				}
				o.current = curr; // 
				goNumber(o);
			}
	
	
			function goPause (o){ // pause/play do carousel
				if (o.btnPausePlay === false) return;
				button = jQuery(".btnPausePlay", o.div);
				if (o.pausePlay == "pause"){ // fica em pause
					o.pausePlay = "play";
					button.html("play")
								.removeClass("btnPause")
								.addClass("btnPlay");
					clearInterval(o.play);
				} else { // fica em play
					o.pausePlay = "pause";
					button.html("pause")
								.removeClass("btnPlay")
								.addClass("btnPause");
					o.play = setInterval(function() { 
                                        goNext(o);
					}, o.autoTime);
				}
			}
	
	
			function goNumberClass (o){ // troca as classes das navegacoes
				if(o.circular === false){ // se o carousel nao for circular
					jQuery(".btnPrev, .btnNext", o.div).removeClass("off"); // remove a classe .off dos botoes anterior e seguinte 
					if(o.current === 0) { // se o slide actual for o primeiro
						jQuery(".btnPrev", o.div).addClass("off"); // adiciona a classe .off ao botao anterior 
					} 
					if ((o.current+1) == o.lis.length) {
						jQuery(".btnNext", o.div).addClass("off"); // adiciona a classe .off ao botao seguinte
					}
				}
	
				jQuery(".btnNumber", o.div).removeClass("btnNumberSelected"); // remove a classe .btnNumberSelected de todos os .btnNumber, retira a marcacao do slide anterior
				jQuery("."+o.current, o.div).addClass("btnNumberSelected"); // adiciona a classe .btnNumberSelected ao slide actual, adiciona a marcacao ao slide actual
			}
	
	
	
	
	
	
	
	
			/*
			* HTML	
			*/
			
			// HTML do Div que envolve os slides
			jQuery(o.ul).wrap('<div class="slides">');
			// HTML Botao Anterior
			var btnPrevHTML = jQuery("<span class='btnPrev btnAction hand'>anterior</span>").click(function() {
						goPrev(o);
						o.pausePlay = "pause"; // opcao para forcar pause
						goPause(o);
					});
			// HTML Botao PausePlay
                        var btnPausePlayHTML;
			if(o.btnPausePlay === true) {
				btnPausePlayHTML = jQuery("<span class='btnPausePlay btnPause btnAction hand'>pause</span>").click(function() {
							goPause(o);
						});
			}
			// HTML Botao Seguinte
			var btnNextHTML = jQuery("<span class='btnNext btnAction hand'>seguinte</span>").click(function() {
						goNext(o);
						o.pausePlay = "pause"; // opcao para forcar pause
						goPause(o);
					});
			// HTML Botoes Numeros
			var btnGoHTML = jQuery("<span class='btnGo'/>");
			
			// Adiciona o HTML dos Botoes ao div que evoca a funcao
			o.div.append(
				jQuery("<div class='btns'>").append(
					btnPrevHTML, // botao anterior
					btnPausePlayHTML, // botao PausePlay
					btnNextHTML, // botao seguinte
					btnGoHTML // botoes numeros
				)
			);
			
			// Se tiver a opcao de Botoes de navegacao por Numero ligado
			if (o.btnGo === true){
				o.lis.each(function(i) { // por cada <li>
					jQuery(".btnGo", div).append( // adiciona o seguinte HTML ao <span class="btnGo">
						jQuery("<span class='btnNumber hand "+i+"'/>").click(function() {
							var oTemp = o; // esta var serve para que o objecto 'o' possa ter a propriedade current diferente por cada botao criado no ciclo
							oTemp.current = i;
							o.pausePlay = "pause"; // opcao para forcar pause
							goPause(o);
							goNumber(oTemp);
						}).text(i+1)
					);
				});
			}
	
	
	
	
			// Muda o ponteiro do rato sobre os botoes
			/*jQuery(".hand").css({
				"cursor" : "pointer"
			});*/
			
	
	
	
	
	
			/*
			* CSS
			*/
			o.lis.css({ // formatacao css dos slides (<li>)
				width:o.liWidth, // aplica a todos a largura do primeiro
				overflow: "hidden" // esconde o excedente
			});
	
			o.ul.css({ // formatacao css dos slides (<ul>)
				margin: 0,
				padding: 0,
				"list-style-type" : "none",
				width: (o.liWidth * o.lis.size()) // aplica a largura do primeiro
			});
	
			jQuery(".slides", o.div).css({ // formatacao do <div> principal
				width: jQuery("li:first", o.ul).width() * o.visible, // aplica a largura do primeiro slide * o numero total de slides
				//height: ul.find("li:first").height(), //vai ser necessario para carousel vertical
				overflow: "hidden" // esconde o excedente
			});


		
		
		
			// Vai para o slide seleccionado na variavel start
			goNumber(o);
			
			// Se tiver a opcao de tocar automaticamente ligada
			if(o.autoPlay) {
		    o.play = setInterval(function() {
		      goNext(o);
		    }, o.autoTime);
		  }
		});
	
	}; // Fecha a extension


})(jQuery); // Fecha o closure
