/*
Author: Joshua Henn
Website: www.syndsys.com
Date: 08/22/09
Version: 1.0.2
*/

(function($){
	
	$.fn.carousel = function(options)
	{
		var options   = options || {};
		
		var startX = options && options.startX ? options.startX : 0;
		var startY = options && options.startY ? options.startY : 0;
		var spacingX = options && options.spacingX ? options.spacingX : 70;
		var spacingY = options && options.spacingY ? options.spacingY : -70;
		var fadeSpeed = options && options.fadeSpeed ? options.fadeSpeed : 800;
		var focusFadeSpeed = options && options.focusFadeSpeed ? options.focusFadeSpeed : 0;
		var fadeOpacity = options && options.fadeOpacity ? options.fadeOpacity : 0.2;
		var numImages = options && options.numImages ? options.numImages : 3;
		
		var offset = 2000;
		
		
		var images = options.images;	
		
		var	isMoving = true;
		var isHover = false;
		var lastDir = 'down';
		
		var obj = $(this);
			
		for (var i=0;i<=numImages+1;i++)		
			obj.append('<li><a href=""><img src=""/></a></li>');
		
		$("li:first", obj).hide();
		$("li:last", obj).hide();	
				
		for (var i=0;i<=numImages+1;i++)
		{
			$("li:eq(" + i + ")", obj).animate({
					top     : startY + (spacingY*i) + 'px',
					left    : startX + (spacingX*i) + 'px'					
				}, 600, null, function() { isMoving = false; });		
			
		};
		
		startup();
		fadeSetup();
				
		function startup()
		{
			for (var i=0;i<numImages+1;i++)
			{
				var image = getImageByIndex(i);
				$("li:eq(" + i + ") img", obj).attr('src', image[0]);
				$("li:eq(" + i + ") img", obj).attr('alt', image[1]);
				$("li:eq(" + i + ") a", obj).attr('href', image[2]);
			}
					
		}

		function fadeSetup()
		{
			for (var i=0;i<=numImages+1;i++)
			{
				if (i == 0)
				{
					$("li:eq(" + i + ")",obj).mouseover(function(){});
					$("li:eq(" + i + ")",obj).mouseout(function(){});
				}
				else if (i == numImages+1)
				{
					$("li:eq(" + i + ")",obj).mouseover(function(){});
					$("li:eq(" + i + ")",obj).mouseout(function(){});
				}
				else
				{				
					$("li:eq(" + i + ")",obj).mouseover(function(){
						if (isMoving) return;
						
						for (var j=1;j<=numImages;j++)
						{
							isHover = true;
							var index = $("li",obj).index(this);
							var opacity = (j==index) ? 1 : fadeOpacity;
							
							if (focusFadeSpeed > 0)
							{
								$("li:eq(" + j + ")", obj).stop();
								$("li:eq(" + j + ")", obj).animate({				
										opacity : opacity		
									}, focusFadeSpeed);	
							} else {
								$("li:eq(" + j + ")", obj).css('opacity', opacity);
							}
						}
					}).mouseout(function() {					
						if (isMoving) return;
						
						isHover = false;
						for (var j=1;j<=numImages;j++)
						{
							if (focusFadeSpeed > 0) {
								$("li:eq(" + j + ")", obj).stop();
								$("li:eq(" + j + ")", obj).animate({				
											opacity : 1	
										}, focusFadeSpeed);
							} else {
								$("li:eq(" + j + ")", obj).css('opacity', '1');
							}
						}
					});	
				}
			}
		}
		
		function getImageByIndex(i)
		{
			var index = i + offset;
					
			index = (i + offset) % images.length;
						
			//console.log("offset=" + offset + " i=" + i + " o+i=" + (offset+i) + " image=" + index);
			
			return images[index];
		}
		
		$.fn.addImage = function( src, alt, link )
		{
			var details = new Array(src, alt, link);
			images.push(details);			
		}
		
		$.fn.isHover = function()
		{
			return isHover;
		}
		
		$.fn.last = function()
		{
			if (lastDir == 'up')
			{
				$(this).up();
			}
			else
			{
				$(this).down();
			}
		}
		
		$.fn.up = function()
		{	
			if (isMoving) return;  // Not allowed to move until last move is complete
		
			lastDir = 'up';
			offset++;
			
			$("li:first", obj).remove();	
			
			$("li:last", obj).css('opacity','0');
			$("li:last", obj).show();			
			
			for (var i=0;i<=numImages+1;i++)
			{
				isMoving = true;
				var opacity = (i==0) ? 'hide' : 1;
				$("li:eq(" + i + ")", obj).animate({
						opacity : opacity,
						top     : startY + (spacingY*(i)) + 'px',
						left    : startX + (spacingX*(i)) + 'px'						
					}, fadeSpeed, "swing", function() { isMoving = false; });	
					
				var image = getImageByIndex(i);
				$("li:eq(" + i + ") img", obj).attr('src', image[0]);
				$("li:eq(" + i + ") img", obj).attr('alt', image[1]);
				$("li:eq(" + i + ") a", obj).attr('href', image[2]);
			}
			
			$(obj).append( '<li style="display:none"><a href=""><img src=""/></a></li>' );
			
			i=4;
			var cssObj = {
				'top'    : startY + (spacingY*i) + 'px',
				'left'    : startX + (spacingX*i) + 'px'	
			}
			$("li:last", obj).css(cssObj);			
			
			fadeSetup();
		}
		
		$.fn.down = function()
		{
			if (isMoving) return;  // Not allowed to move until last move is complete
		
			lastDir = 'down';
			offset--;
			
			$("li:last", obj).remove();	 // Don't need the one the end anymore
		
			$("li:first", obj).css('opacity','0'); // Setup for fade in
			$("li:first", obj).show();						
						
			for (var i=0;i<=numImages+1;i++)
			{
				isMoving = true;
				var opacity = (i==numImages) ? 'hide' : 1;				
				$("li:eq(" + i + ")", obj).animate({						
						opacity : opacity,
						top     : startY + (spacingY*(i+1)) + 'px',
						left    : startX + (spacingX*(i+1)) + 'px'
					}, fadeSpeed, "swing", function() { isMoving = false; });
				
				var image = getImageByIndex(i+1);
				$("li:eq(" + i + ") img", obj).attr('src', image[0]);
				$("li:eq(" + i + ") img", obj).attr('alt', image[1]);
				$("li:eq(" + i + ") a", obj).attr('href', image[2]);
			}
			
			$(obj).prepend( '<li style="display:none"><a href=""><img src=""/></a></li>' );  // Setup last one if it needs to be faded in, in the future
			
			i=0;
			var cssObj = {
				'top'    : startY + (spacingY*i) + 'px',
				'left'    : startX + (spacingX*i) + 'px'
			}
			$("li:first", obj).css(cssObj);				
						
			
			fadeSetup();
		}
		
	}
})(jQuery)