/*
**  Plugin para crear efecto slider
*/

(function($) {
	$.fn.slider = function(options){
		var nomObj = $(this).attr('id'), //nombre objeto slider
		contenedorSliders = $(this).children()[0], //contenedor galeria sliders
		listadoSliders = $(contenedorSliders).children('div'), //galeria sliders
		listadoPaginadores = $(this).children('ul'), //galeria paginadores
		flechaAnt = $(contenedorSliders).children()[0],
		flechaSig = $(contenedorSliders).children()[1];
		
		var defaults = {
			anchoSlider: 920,
			usarFlechas: true,
			usarPaginador: true,
			autoSlide: false,
			pausarAutoSlide: true,
			tiempoAutoSlide: 7000,
			tiempoAutoSlideLargo: 30000
		};
		var options = $.extend(defaults, options);
	
		var elemSliders = $(listadoSliders).children(), //elementos galeria sliders
		numSliders = elemSliders.length, //num elementos galeria sliders
		contenedorPaginador = $(this).children()[1],
		enMovimiento = false,
		cssActual = parseInt($(listadoSliders).css("left")), //posicion css actual div contenedor de objetos deslizantes
		posActual = Math.abs(cssActual/options.anchoSlider)+1, //hallamos el entero de la división entre posicion inicial y el ancho de cada objeto, y sumamos uno para saber posicion en listado (inicial = 1)
		contadorAuto, //para el autoslide
		intervalID; //para el autoslide
		
		if(options.usarFlechas) {
			$(flechaAnt).click(function(event){
				if (!enMovimiento) {
					actualizaPosicion();
					if(posActual > 1) {
						mueveSlider(posActual-1);
					}
					if(options.pausarAutoSlide){
						clearInterval(intervalID);
						intervalID = window.setTimeout(desplazarAuto, options.tiempoAutoSlideLargo);
						return false;
					}
				}
				return false;
			});
			
			$(flechaSig).click(function(event){
				if (!enMovimiento) {
					actualizaPosicion();
					if(posActual < numSliders) {
						mueveSlider(posActual+1);
					}
					if(options.pausarAutoSlide){
						clearInterval(intervalID);
						intervalID = window.setTimeout(desplazarAuto, options.tiempoAutoSlideLargo);
						return false;
					}
				}
				return false;
			});
		}
		
		if(options.usarPaginador) {
			$(listadoPaginadores).children('li').children('a').click(function(event){
				if (!enMovimiento) {
					actualizaPosicion();
					var contador = parseInt($(this).attr("rel"));
					mueveSlider(contador);
					if(options.pausarAutoSlide){
						clearInterval(intervalID);
						intervalID = window.setTimeout(desplazarAuto, options.tiempoAutoSlideLargo);
						return false;
					}
				}
				return false;
			});
		}
		
		if(options.autoSlide) {
			contadorAuto = 2;
			intervalID = window.setTimeout(desplazarAuto, options.tiempoAutoSlide);
		}
		
		function actualizaPosicion(){
			//posicion css actual div contenedor de objetos deslizantes
			cssActual = parseInt($(listadoSliders).css("left")),
			//hallamos el entero de la división entre posicion inicial y el ancho de cada objeto, y sumamos uno para saber posicion en listado (inicial = 1)
			posActual = Math.abs(cssActual/options.anchoSlider)+1;
		}
		
		function mueveSlider(posNueva){
			//si la posicion actual es menor que la posicion nueva...
			if(posActual < parseInt(posNueva)){
				//numero de posiciones a retroceder
				posDif = parseInt(posNueva) - posActual;
				//multiplicamos la diferencia de posiciones, por el tamaño de cada objeto, para saber el desplazamiento total a modificar en el css
				desplazamiento = (posDif*options.anchoSlider);
				//desplazamos el contenedor hacia la izquierda tanto como sea necesario
				//modo "lento"
				//cuando finalice el efecto asignamos a la variable 'enMovimiento' un 'false'. Esto será utilizado para controlar que solo se ejecute el script cuando no todas las animaciones hayan terminado
				$(listadoSliders).animate({
					"left": "-="+desplazamiento
					}, "slow",
					function(){enMovimiento = false;});
				//mientras la animación se ejecuta, la variable se mantiene como true (esto durará lo que dure la animación)
				enMovimiento = true;
			}
			else{
				//si la posicion actual es mayor que la posicion nueva...
				if(posActual > parseInt(posNueva)){
					//numero de posiciones a avanzar
					posDif = posActual - parseInt(posNueva);
					//multiplicamos la diferencia de posiciones, por el tamaño de cada objeto, para saber el desplazamiento total a modificar en el css
					desplazamiento = (posDif*options.anchoSlider);
					//desplazamos el contenedor hacia la izquierda tanto como sea necesario
					//modo "lento"
					//cuando finalice el efecto asignamos a la variable 'enMovimiento' un 'false'. Esto será utilizado para controlar que solo se ejecute el script cuando no todas las animaciones hayan terminado
					$(listadoSliders).animate({
						"left": "+="+desplazamiento
						}, "slow",
						function(){enMovimiento = false;});
					//mientras la animación se ejecuta, la variable se mantiene como true (esto durará lo que dure la animación)
					enMovimiento = true;
				}
			}
			//modificamos las clases de los botones de posición del slider
			//a la posición actual añadimos la clase común de los botones
			$(".numero-actual").addClass("numero");
			//a la posición actual quitamos la clase especial de "posición actual"
			$(".numero-actual").removeClass("numero-actual");
			//a la nueva posición actual quitamos la clase común de los botones
			$("#num-"+posNueva).removeClass("numero");
			//a la nueva posición actual añadimos la clase especial de "posición actual"
			$("#num-"+posNueva).addClass("numero-actual");
		}
		
		function desplazarAuto() {
			actualizaPosicion();
			contadorAuto = posActual+1;
			if(contadorAuto > numSliders){
				contadorAuto=1;
			}
			mueveSlider(contadorAuto);
			clearInterval(intervalID);
			intervalID = window.setTimeout(desplazarAuto, options.tiempoAutoSlide);
		}
		
	};
})(jQuery);