/**
 * Recursos
 * OK:
 * atributos css manipulados pelo script: ul.slider.width(inicial) e ul.slider.left(animação de slide) apenas, restante é direto pelo css
 * slideshow
 * fixed or fluid slides
 * prev-next button
 * numeric buttons
 * looping
 * 
 * 
 * TODO:
 * selecionar slide inicial
 * altura flexível[ver coda-slider]
 * slideshow controls
 * lightbox[?]
 * melhorar configuração de looping
 * permitir slider sem navegação(apenas slideshow)
 * animated caption
 * thumbnails
 * acessibilidade
 * permalinks
 * keyboard navigation
 * 
 * 
 */


jQuery(document).ready(function($){
	
	/**
	 * BOROS SLIDER
	 * 
	 */
	if( $('.boros_slider').length > 0 ){
		// array de intervals. É declarado globalmente(fora de function) para ser acessado pelos controles de tempo
		var timers = new Array();
		
		// buscar todos os sliders, caso exista mais de um
		$('.boros_slider').each(function(){
			var $slider = $(this);
			
			//adicionar class de slider aplicado
			$slider.addClass('boros_slider_active');
			/**
			// Largura do holder, com slides internos de largura fixa
			var sld 		= $(this).find('.slide');
			var sldw 		= sld.first().width();		//largura do slide
			var sldl 		= sld.size();				//quantidade de slides
			var holderw 	= sldw * sldl
			/**/
			
			// largura do holder, com slides de largura flexivel
			var strip 	= $slider.find('.boros_slider_strip');
			var holderw = 0;
			var numeric_nav = '';
			$slider.find('.slide').each(function(index){
				index = (index + 1);
				holderw += $(this).width();
				
				// criar botões de navegação numérica
				if( $slider.find('.boros_slider_nav').is('.numeric') ){
					numeric_nav += ' <span class="btn_nav btn_number" rel="'+index+'">'+index+'</span> ';
				}
			});
			strip.width( holderw );
			
			// indicar primeiro slide ativo
			$slider.find('.slide:first').addClass('active');
			
			// classes da navegação
			if( $slider.find('.boros_slider_nav').is('.numeric') ){
				$slider.find('.btn_nav:first').after(numeric_nav);
				$slider.find('.btn_number:first').addClass('active');
			}
			
			// atribuir ação de click
			$slider.find('.boros_slider_nav .btn_nav').click(function(){
				// para apenas o timer específico
				stop_slideshow( $slider.index() );
				slide_go( $(this) );
			});
			
			if( $slider.not('.slideshow_off').length )
				start_slideshow( $slider );
		});
	}
	
	function slide_go( obj ){
		var slider = $(obj).closest('.boros_slider');
		
		// impedir encadeamento de animações
		if( slider.is('.sliding') ){
			//console.log('hold action!');
			return false;
		}
		// flag para marcar movimentação
		slider.addClass('sliding');
		
		var strip 			= slider.find('.boros_slider_strip');
		var slides 			= strip.find('.slide')
		var active_slide 	= slides.filter('.active');
		var active_index 	= active_slide.index();
		var new_active		= active_index;
		var pos 			= strip.position();
		
		// definir direção e valor
		var direction = $(obj).attr('rel');
		
		// posição default(estático)
		var position = strip.position();
		var valor = position.left;
		
		// remover classes de ativação
		slides.removeClass('active');
		
		// alvo da ativação
		var $activated;
		
		if( direction == 'next' ){
			// próximo
			if( active_index < (slides.length - 1) ){
				new_active = active_index + 1;
				var width = slides.filter('.slide:eq('+active_index+')').width();
				
				$activated = slides.filter('.slide:eq('+new_active+')');
				valor = '-='+width;
			}
			// retornar ao início
			else{
				new_active = 0;
				
				$activated = slides.filter('.slide:eq(0)');
				valor = 0;
				
				// OU parar slider
				//return false;
			}
		}
		else if( direction == 'prev' ){
			// anterior
			if( active_index > 0 ){
				new_active = active_index - 1;
				var width = slides.filter('.slide:eq('+new_active+')').width();
				
				$activated = slides.filter('.slide:eq('+new_active+')');
				valor = '+='+width;
			}
			// ir para o fim
			else{
				new_active = (slides.length - 1);
				var width = 0;
				slides.filter('.slide').not(':last').each(function(){
					width += $(this).width();
				});
				
				$activated = slides.filter('.slide:last');
				valor = '-'+width;
				
				// OU parar slider
				//return false;
			}
		}
		else{
			// medida total de todos os slides anteriores[esquerda]
			var width = 0;
			new_active = (direction - 1);
			
			$activated = slides.filter('.slide:eq('+new_active+')');
			slides.filter('.slide:lt('+new_active+')').each(function(){
				width += $(this).width();
			});
			
			valor = '-' + (width);
		}
		
		// mover slide
		//console.log('start action!');
		strip.animate({'left': valor }, 1000, 'custom', function(){
			//console.log('end action!');
			// classes da navegação
			$activated.addClass('active');
			obj.parent().find('.btn_nav').removeClass('active');
			obj.parent().find('[rel='+(new_active+1)+']').addClass('active');
			slider.removeClass('sliding');
		});
		
	}
	
	function start_slideshow( obj ){
		timers[obj.index()] = window.setInterval( function(){
			auto_slide(obj);
		}, 6000 );
	}
	
	function auto_slide( obj ){
		var btn = obj.find('[rel=next]');
		slide_go( btn );
	}
	
	function stop_slideshow( index ){
		clearInterval( timers[index] );
	}
	
	$.easing.custom = function(x, t, b, c, d) {
		var s = 1.70158; 
		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(.5))+1)*t - s)) + b;
		return c/2*((t-=2)*t*(((s*=(.5))+1)*t + s) + 2) + b;
	}
	
});
