/**
 * Boros Slider
 * @author Alex Koti alexkoti@gmail.com
 * 
 */

(function($) {
	
	$.fn.borosSlider = function( config ){
		var defaults = {
			loop: true,
			numeric_nav: true,
			slideshow: true,
			easing: 'swing',
			offset: 1
		}
		config = $.extend( defaults, config );
		
		// array de intervals.
		var timers = new Array();
		
		// buscar todos os sliders, caso exista mais de um
		return this.each(function(){
			var $slider = $(this);
			//sinalizar como slider aplicado
			$slider.addClass('slider_activated');
			// 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).outerWidth(true);
				
				// criar botões de navegação numérica
				if( config.numeric_nav ){
					numeric_nav += ' <span class="btn_nav btn_number" rel="'+index+'">'+index+'</span> ';
				}
			});
			strip.width( holderw );
			config.strip_width = holderw;
			config.holder_width = $slider.find('.boros_slider_holder').width();
			
			// 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(){
				// parar apenas o timer específico
				stop_slideshow( $slider.index() );
				slide_go( $(this) );
				return false;
			});
			
			if( config.slideshow ){
				start_slideshow( $slider );
			}
		});
		
		
		
		function slide_go( obj ){
			var slider = $(obj).closest('.boros_slider');
			
			// impedir encadeamento de animações
			if( slider.is('.sliding') ){
				return false;
			}
			
			var strip 			= slider.find('.boros_slider_strip');	// faixa com os slides
			var slides 			= strip.find('.slide')					// grupo total de slides
			var active_slide 	= slides.filter('.active');				// slide ativo
			var active_index 	= active_slide.index();					// indice do slide ativo
			var new_active		= active_index;							// novo index, por enquanto = ao indice ativo
			
			// definir direção e valor (prev|next)
			var direction = $(obj).attr('rel');
			
			// decalara variável do alvo da ativação
			var $activated;
			var width = 0;
			
			// avançar
			if( direction == 'next' ){
				// próximo
				if( active_index < (slides.length - 1) ){
					// próximo slide
					new_active = active_index + config.offset;
				}
				// retornar ao início
				else{
					// reativar o primeiro slide
					new_active = 0;
					
					if( (active_index == slides.length - 1) && config.loop == false ){
						return false;
					}
				}
			}
			// retroceder
			else if( direction == 'prev' ){
				// anterior
				if( active_index > config.offset ){
					// slide anterior
					new_active = active_index - config.offset;
				}
				else{
					// estiver no primeiro slide, mandar para o ultimo
					if( active_index == 0 ){
						new_active = slides.size();
					}
					// se ainda não estiver no ultimo, voltar um
					else{
						new_active = 0;
					}
					
					if( active_index == 0 && config.loop == false ){
						return false;
					}
				}
			}
			// link direto -> botão numérico
			else{
				new_active = (direction - 1);
			}
			
			// medida do próximo slide
			slides.slice(0, new_active).each(function(){
				width += $(this).outerWidth(true);
			});
			// novo slide ativo
			$activated = slides.filter('.slide:eq('+new_active+')');
			
			// corrigir posição caso pegue os ultimos slides
			var max_left = (strip.width() - config.holder_width);
			var move = width;
			if( move > max_left ){
				width = (max_left - 11); //compensar a margem do último elemento
				new_active = (slides.length - 1);
				$activated = slides.filter('.slide:last');
			}
			
			// remover classes de ativação apenas se a troca de slide for ativada
			slides.removeClass('active');
			// flag para marcar movimentação
			slider.addClass('sliding');
			strip.animate({'left': '-'+width }, 1000, config.easing, function(){
				// 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);
			}, 4000 );
		}
		
		function auto_slide( obj ){
			var btn = obj.find('[rel=next]');
			slide_go( btn );
		}
		
		function stop_slideshow( index ){
			clearInterval( timers[index] );
		}
	}
	
	
	$.easing.boros = 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;
	}
})(jQuery);
