/* Rent-a-car slider */

(function($)
{
	$.fn.autoSlide = function( options )
	{
		var settings =
		{
			time : 7000,
			slideTime: 500,
			sides : 1,
			itemSelector : ".item",
			imgSelector : "img",
			textSelector : "span",
			smallClass : "small",
			navigation : "full",
			navigationSelector : "#{containerId}-slidenavi",
			wrapperSelector : "#{containerId}-wrapper"
		};

		return this.each(function()
		{        
			if ( options ){
				$.extend( settings, options );
			}

			var slideTimer = null,
				sliding = null,
				started = false,
				container = $(this),
				id = container.attr("id"),
				
				currentNumber = 1,
				currentSlide = settings.sides,
				previousSlide = currentSlide,
				slides = container.children(settings.itemSelector),
				slidesActual = slides.length,
				slideHeight = 0,
				slideWidth = $(slides).width(),
				
				extraWidth = parseInt($(slides).css("marginRight")) + parseInt($(slides).css("marginLeft")) + parseInt($(slides).css("paddingRight")) + parseInt($(slides).css("paddingLeft")) + parseInt($(slides).css("borderRightWidth")) + parseInt($(slides).css("borderLeftWidth")),				
			
				imgw = $(slides).find(settings.imgSelector + ":first").width(),
				imgh = $(slides).find(settings.imgSelector + ":first").height(),
				bigMarginTop = $(slides).find(settings.imgSelector + ":first").css("marginTop"),
				bigFontSize = $(slides).find(settings.imgSelector + ":first").css("fontSize"),
				smallMarginTop,
				smallFontSize,
				
				i = 1,
				j = 0,
				nh,
				pender,
				penderid;

			settings.navigationSelector = settings.navigationSelector.replace(/{containerId}/, id);
			settings.wrapperSelector = settings.wrapperSelector.replace(/{containerId}/, id);

			// calculate max slide height
			$(slides).each(function()
			{
				nh = $(this).outerHeight();
				
				if( nh > slideHeight ){
					slideHeight = nh;
				}
			});

			// add "small" class to all slides
			$(slides).addClass(settings.smallClass).find(settings.imgSelector).fadeTo(0, 0.5);

			// calculate various things from the "small" css
			thumbWidth = $(slides).find(settings.imgSelector).width();
			thumbHeight = $(slides).find(settings.imgSelector).height();
			smallMarginTop = $(slides).find(settings.imgSelector).css("marginTop");
			smallFontSize = $(slides).find(settings.imgSelector).css("fontSize");
			smallSlideWidth = $(slides).width();
			
			if( ! bigMarginTop || "auto" == bigMarginTop ){
				bigMarginTop = 0;
			}
			
			if( ! bigFontSize || "auto" == bigFontSize ){
				bigFontSize = "";
			}
			
			if( ! smallMarginTop || "auto" == smallMarginTop ){
				smallMarginTop = 0;
			}
			
			if( ! smallFontSize || "auto" == smallFontSize ){
				smallFontSize = "";
			}
			
			// set slide width
			$(slides).width(smallSlideWidth);

			// set container height and wrap it
			container
				.height(slideHeight)
				.wrap('<div id="' + settings.wrapperSelector.replace(/[#\.]/, '')  + '"></div>');
			
			$(settings.wrapperSelector)
				.width(slideWidth + (smallSlideWidth * settings.sides * 2) + ((settings.sides + 1) * extraWidth)+7 )
				.height(slideHeight)
				.css({"overflow" : "hidden", "margin-left": "-5px"});

			// prepend additional slides
			for( j; j < settings.sides; j++ )
			{
				pender = $(slides[slidesActual - j - 1]).clone();
				penderid = $(pender).attr("id") + "-2";
				$(pender).attr("id", penderid);
				
				container.prepend( pender );
			}

			// append additional slides
			for( j = 0; j <= settings.sides; j++ )
			{
				pender = $(slides[j]).clone();
				penderid = $(pender).attr("id") + "-2";
				$(pender).attr("id", penderid);
				
				container.append( pender );
			}
		
			// reset slides array
			slides = container.children(settings.itemSelector);
			
			container.width(slideWidth * (slidesActual + (settings.sides + (settings.sides * 2))));

			$(slides[currentSlide])
				.removeClass(settings.smallClass)
				.addClass("current")
				.width(slideWidth)
				.find(settings.imgSelector)
					.fadeTo(0, 1);

			currentSlide++;
			currentNumber++;

			/* navigation */
			
			if( false !== settings.navigation )
			{
				$(settings.wrapperSelector).after('<div id="' + settings.navigationSelector.replace(/[#\.]/, '') + '"><div class="links"></div></div>');
		
				if( "full" === settings.navigation || "numbers" == settings.navigation )
				{
					for( i; i <= slidesActual; i++ )
					{
						$(settings.navigationSelector + " .links").append('<a href="#slide-' + i + '">' + i + '</a> ');
					}
				}
		
				if( "full" === settings.navigation || "prevnext" == settings.navigation )
				{
					$(settings.navigationSelector + " .links")
						.prepend('<a href="#slide-prev" class="slider-prev">&laquo;</a>')
						.append('<a href="#slide-next" class="slider-next">&raquo;</a>');
					
					if( "full" === settings.navigation )
					{
						$(settings.navigationSelector + " .links")
							.find("a:eq(1)")
								.addClass("selected");
					}
				}
			}
			
			/* / navigation */

			/* events */
			
			$(window).blur( function(){	stopSlide(); } );
			$(window).focus( function(){ if( true === started ) { startSlide(); } });
			$(window).load( function(){	if( null === sliding && false === started ) { startSlide();} });
			
			container
				.mouseenter( function(){ stopSlide(); } )
				.mouseleave( function(){ if( true === started ) { startSlide(); } });
			
			function startSlide()
			{
				stopSlide();
				slideTimer = window.setInterval(function(){ slide(); }, settings.time);
				started = true;
			}
			
			function stopSlide()
			{
				window.clearInterval(slideTimer);
			}
			
			/* / events */

			/* slide quicklinks */

			$(settings.navigationSelector + " .links a, #" + id + " .item a").live("click", function(e)
			{				
				var parent = $(this).parent(),
					which = parent.hasClass("links") ? 
								$(this).attr("href").match(/#slide-([prevnext\d]+)/) : 
								parent.attr("id").match(/slide-([prevnext\d]+)/);
				
				which[1] = which[1].replace(/([\d]+)-2/, '$1');

				if( parent.hasClass("current") && null === which[0].match(/#/) ){
					return true;
				}
				
				if(	currentNumber-1 === Number(which[1]) || true === sliding )
				{
					e.preventDefault();
					return false;
				}
				
				switch( which[1] )
				{
					case 'next' :
						which = currentNumber > slidesActual ? 1 : currentNumber;
						break;
					case 'prev' :
						which = (currentNumber - 2 === 0) ? slidesActual : currentNumber - 2;
						break;
					default :
						which = which[1];
				}
				
				slide(which);
				startSlide();
				
				if( ! parent.hasClass("links") ){
					stopSlide();
				}
				
				e.preventDefault();
				return false;
			});
			
			/* / slide quicklinks */

			/* main sliding function */
			
			function slide( which, slideTime )
			{
				sliding = true;

				if( "undefined" === typeof(slideTime) ){
					slideTime = settings.slideTime;
				}
								
				if( "undefined" !== typeof(which) )
				{
					currentNumber = which;
					currentSlide = currentNumber - 1 + settings.sides;
				}
				
				var margin = (currentNumber - 1) * (smallSlideWidth + settings.sides * (extraWidth)),
					i = 0;
	
				if( 0 < margin ){
					margin = "-" + margin;
				}

				if( "full" === settings.navigation || "numbers" == settings.navigation )
				{
					$(settings.navigationSelector + " .links a").removeClass("selected");
					$(settings.navigationSelector + " .links a:eq(" + ( currentNumber > slidesActual ? 1 : currentNumber ) + ")").addClass("selected");
				}
				
				$.each(slides, function(i)
				{
					if( currentSlide !== i && previousSlide !== i ){
						$(slides[i]).addClass(settings.smallClass);
					}
				});

				$(slides[currentSlide])
					.addClass("current")
					.animate({"width" : slideWidth + "px", "fontSize" : bigFontSize}, slideTime)
					.find(settings.imgSelector)
						.animate({"width" : imgw + "px", "height" : imgh + "px", "marginTop" : bigMarginTop, "opacity" : 1}, slideTime);

				$(slides[previousSlide])
					.removeClass("current")
					.animate({"width" : smallSlideWidth + "px", "fontSize" : smallFontSize}, slideTime, function(){ $(this).addClass(settings.smallClass) })
					.find(settings.imgSelector)
						.animate({"width" : thumbWidth + "px", "height" : thumbHeight + "px", "marginTop" : smallMarginTop, "opacity" : 0.5}, slideTime);

				if( slidesActual + settings.sides + 1 === previousSlide )
				{
					$(slides[settings.sides])
						.removeClass("current")
						.animate({"width" : smallSlideWidth + "px", "fontSize" : smallFontSize}, slideTime)
						.find(settings.imgSelector)
							.animate({"width" : thumbWidth + "px", "height" : thumbHeight + "px", "marginTop" : smallMarginTop, "opacity" : 0.5}, slideTime)
							.end()
						.find(settings.textSelector).animate({"opacity" : 0}, slideTime);
				}

				container.animate
				(
					{ "marginLeft" : margin + "px" },
					slideTime,
					function()
					{
						$(slides[previousSlide]).removeClass(settings.smallClass);

						if( currentNumber > slidesActual + 1 )
						{
							$(slides[settings.sides])
								.addClass("current")
								.removeClass(settings.smallClass)
								.css({"width" : slideWidth + "px", "fontSize" : bigFontSize})
								.find(settings.imgSelector)
									.fadeTo(0, 1)
									.css({"width" : imgw + "px", "height" : imgh + "px", "marginTop" : bigMarginTop})
									.end()
								.find(settings.textSelector).css({"opacity" : 1});
							
							$(slides[previousSlide])
								.removeClass("current")
								.addClass(settings.smallClass)
								.css({"width" : smallSlideWidth + "px", "fontSize" : smallFontSize})
								.find(settings.imgSelector)
									.fadeTo(0, 0.5)
									.css({"width" : thumbWidth + "px", "height" : thumbHeight + "px", "marginTop" : smallMarginTop})
									.end()
								.find(settings.textSelector).css({"opacity" : 0});
							
							container.animate({"marginLeft" : 0}, 0);

							previousSlide = currentSlide;
							currentSlide = settings.sides + 1;
							currentNumber = 2;
						}
						
						sliding = false;
					}
				);
				
				previousSlide = currentSlide;
				currentNumber++;
				currentSlide++;
			}
		});
		
		/* / main sliding function */	
	};
})( jQuery );

/* / */
