/*
 * jQuery Carousel Plugin
 * version: 1.0.0 (2010/04/23)
 * Author: Emanuele Tortolone - Aldo Zorzi @ FillStudio
 
 */

 
 /*
	Usage Note:
	-----------
	
	$('#carousel_container').Carousel(
			{
				removeLinks:true,
				image_width:880,
				image_height:580,
				linkPosition:'top',
				autoPlay:true,
				transitionType:'slide',
				shuffle:false,
				showPrevNext:true,
				slideShowTime:5000,
				delayBetweenTransitions:100,
				easeIn:'easeInOutQuart',
				easeInTime:1500,
				easeOut:'easeInOutQuart',
				easeOutTime:1200
			}
		);
	*/ 
;(function($) {
	$.fn.CarouselAjax = function(attr)
	{
		var _instance = $(this);
		if(!attr) attr = new Object();
		
		var _imgArray = new Array(); 
		var _linkArray = new Array(); 
		var _width = $(this).css('width');
		var _height = $(this).css('height');
		var _image_width = attr.image_width ?attr.image_width : 0;
		var _image_height = attr.image_height ?  attr.image_height : 0;
		var _linkPosition = attr.linkPosition ? attr.linkPosition : 'bottom';
		var _removeLinks = attr.removeLinks ? attr.removeLinks : false;
		var _autoplay = attr.autoPlay ? attr.autoPlay : false;
		var _transitionType = attr.transitionType ? attr.transitionType : 'slide';
		var _shuffle = attr.shuffle ? attr.shuffle : false;
		var _showPrevNext = attr.showPrevNext ? attr.showPrevNext : false;
		var _slideShowTime = attr.slideShowTime ? attr.slideShowTime : 5000;
		var _delayBetweenTransitions = attr.delayBetweenTransitions ? attr.delayBetweenTransitions : 0;
		var _easeIn = attr.easeIn ? attr.easeIn : 'easeInOutQuart';
		var _easeInTime = attr.easeInTime ? attr.easeInTime : 1500;
		var _easeOut = attr.easeOut ? attr.easeOut : 'easeInOutQuart';
		var _easeOutTime = attr.easeOutTime ? attr.easeOutTime : 1200;
		
		var LEFT = 'left';
		var RIGHT = 'right';
		var _direction = RIGHT;
		var _counter = 0;
		var _oldCounter = 0;
		var _newImage;
		var _oldImage;
		var _timer;
		var _itemSelected;
		var _canLoadAnother;
		var _timer;
		var _loaded = new Array();
		
		//	INIT
		function init()
		{	
			createWrappers();
			checkTransitionsTime();
			createLoading();
			setDefaultStyle();
			initImgArray();
			initPrevNextBtn();
		};
		
		_instance.start = function()
		{
			loadImage();
		}
		
		//	WRAPPER CONTAINERS
		function createWrappers()
		{
			if(_linkPosition == 'bottom')
			{
				_instance.append("<div id='carousel_images_container'></div>");
				_instance.append("<div id='carousel_item_container'></div>");
			}
			else
			{
				_instance.append("<div id='carousel_item_container'></div>");
				_instance.append("<div id='carousel_images_container'></div>");
			}
			
		}
		
		//	CREATE LOADING
		function createLoading()
		{
			//var loading = $.create('div', {'id':'carousel_loading'});	
			_instance.append("<div id='carousel_loading'></div>");	
		}
		
		function setDefaultStyle()
		{
			//	CONTAINER
			_instance.css({
			'position': 'relative',
			'overflow':'hidden'
			});
			
			//	LOADING
			$('#carousel_loading').html('<span>Loading...</span>');
			$('#carousel_loading').css({
			'z-index':'5',
			'position':'absolute'
			});
			
			//	IMAGES CONTAINER
			$('#carousel_images_container').css(
			{
			'width': (_image_width > 0) ? String(_image_width+"px") :  String(_width),
			'height': (_image_height > 0) ? String(_image_height+"px") :  String(_height)
			}
			);
		}
		
		//	PUSHING THE IMAGES PATH AND, IF SPECIFIED, REMOVE LINKS FROM HTML
		function initImgArray()
		{
			var imgTagArray = $('a', _instance);
			for (i = 0; i < imgTagArray.length; i++)
			{
				_imgArray.push($(imgTagArray[i]).attr('href'));
				$(imgTagArray[i]).attr('rel', i);
				$(imgTagArray[i]).bind('click', changeImage);
				
				link = $(imgTagArray[i]).attr('title')
				link = link.replace(/^\s*/, "").replace(/\s*$/, "");
				if(link.length > 0)
				{
					_linkArray.push(link);
				}
			}

			if(_imgArray.length <= 1)
			{
				_autoplay = false;
			}
			if(_removeLinks == true)
			{
				$('a',_instance).remove();
			}
			else
			{	
				$('#carousel_item_container').append($('a',_instance));
				$('a', '#carousel_item_container').attr('href', 'javascript:void(0);');
			}
			
			//	IF SHUFFLE PARAM IS TRUE
			if(_shuffle == true) shuffleImgArray();
		}
		
		//	RANDOM SORTING OF IMAGE ARRAY
		function shuffleImgArray()
		{
		 	var dummy_array = new Array();
			var arrayLength = _imgArray.length;
			for (var j = 0; j < arrayLength; j++)
			{
				var randInd = Math.floor(Math.random() * arrayLength);
				if(_imgArray[randInd] != undefined)
				{
					var spliced = _imgArray.splice(randInd, 1);
					dummy_array.push(spliced[0]);
				}
				else
				{
					j--;
				}
			}
			_imgArray = dummy_array;
			return _imgArray; 
	    }
		
		
		function initPrevNextBtn()
		{
			if(_showPrevNext == true)
			{
				createPreviousBtn();
				createNextBtn();
			}
		}
		
		function createPreviousBtn()
		{
			_instance.append("<div id='carousel_previous'></div>");
			$('#carousel_previous').html('<span>Previous</span>');
			$('#carousel_previous').css({
			'margin':'0px',
			'padding':'0px',
			'position':'absolute',
			'cursor':'pointer',
			'z-index':'10'
			});
			if(_imgArray.length > 1)
			{
				$('#carousel_previous').click(function(){prevImage();})
			}
		}
		
		function createNextBtn()
		{
			_instance.append("<div id='carousel_next'></div>");
			$('#carousel_next').html('<span>Next</span>');
			$('#carousel_next').css({
			'margin':'0',
			'padding':'0',
			'position':'absolute',
			'cursor':'pointer',
			'z-index':'10'
			});
			
			if(_imgArray.length > 1)
			{
				$('#carousel_next').click(function(){nextImage();})
			}
		}
		
		//	SHOW / HIDE LOADING
		function showLoading()
		{
			$('#carousel_loading').fadeIn();
		}
		
		function hideLoading()
		{
			$('#carousel_loading').fadeOut();
		}
		
		
		//	IMAGE CREATION (AUTOMATIC MODE)
		function nextImage()
		{
			if(_canLoadAnother == true)
			{
				if(hasNext())
				{
					_counter++;
				}
				else
				{
					_counter = 0;
				}
				
				_direction = RIGHT;
				loadImage();
			}
		};
		
		
		function prevImage()
		{
			if(_canLoadAnother == true)
			{
				if(hasPrevious())
				{
					_counter--;
				}
				else
				{
					_counter = _imgArray.length-1;
				}
				_direction = LEFT;
				loadImage();
			}	
		};
		
		
		//	IMAGE CREATION ()
		function changeImage(event)
		{
			if(_canLoadAnother == true)
			{
				_itemSelected = event.currentTarget;
				_counter = $(event.currentTarget).attr('rel');
				
				checkDirection();
				loadImage();
			}
		}
		
		
		//	LOAD NEXT IMAGE
		function loadImage()
		{
			resetTimer();
		
			_canLoadAnother = false;
			
			
			var loadUrl = String(_imgArray[_counter]);
			
			if(!_loaded[loadUrl])
			{
				showLoading();
				$.ajax
				 ({ 
				  url: loadUrl,
				  success: function(responseText)
				  {
					  if(_newImage != null) _newImage = null;
					  _newImage = $(responseText);
					  onImageLoaded();
				  }
				 });
			}
			else
			{
				_newImage = _loaded[loadUrl];
				onImageLoaded();
			}
		};
		
		function onImageLoaded()
		{
			var loadUrl = String(_imgArray[_counter]);
			_loaded[loadUrl] = _newImage;
			
			initNewImage();
			hideLoading();
			
		};
		
		function initNewImage()
		{
			var currentContainer = String('#carousel_item_' + _counter);
			//	CREATE A NEW CONTAINER
			$('#carousel_images_container').append("<div id='carousel_item_" + _counter + "'></div>");
			
			$(currentContainer).css({
			'margin':'0px',
			'padding':'0px',
			'overflow':'hidden',
			'position':'absolute',
			'width': String(_newImage.css('width')),
			'height':String(_newImage.css('height'))
			});
			
			if(_linkArray[_counter])
			{
				_newImage.css({
				'cursor':'pointer'
				});
				_newImage.bind('click', function()
					{
						document.location = _linkArray[_counter];
					});
			}
			
			$(currentContainer).append(_newImage);

			showImage();
		}
		
		//	SHOW NEW IMAGE
		function showImage()
		{
			var delayTime = (_oldImage != null) ? _delayBetweenTransitions : 0;
			if(_transitionType == 'slide')
			{
				var startX;
				switch (_direction)
				{
					case RIGHT:
						startX = String(_width);
					break;
					
					case LEFT:
						startX = String("-" + _width);
					break;
				}
				_newImage.css({"margin-left":startX});
				_newImage.delay(delayTime).animate({"margin-left":"0px"}, _easeInTime, _easeIn, onNewImageTweenComplete);
			}
			else if(_transitionType == 'alpha')
			{
				_newImage.hide();
				_newImage.delay(delayTime).fadeIn(_easeInTime, onNewImageTweenComplete);
			}
			else
			{
				alert("SET A VALID TRANSITION TYPE ('slide' or 'alpha')");
			}
			
			
			//	HIDE OLD IMAGE
			if(_oldImage != null) hideImage();
		};
		
		
		function onNewImageTweenComplete()
		{
			_oldImage = _newImage;

			_canLoadAnother = true;
			disableItem();
			checkAutoPlay();
			
		};
		
		function checkAutoPlay()
		{
			if(_autoplay == true)
			{
				_timer = setTimeout(function(){nextImage();}, _slideShowTime);
			}
		}
		
		
		function resetTimer()
		{
			if(_autoplay == true)
			{
				if(_timer != null) clearTimeout(_timer);
			}
		}
		
		//	HIDE OLD IMAGE
		function hideImage()
		{
			if(_transitionType == 'slide')
			{
			
				var endX;
				switch (_direction)
				{
					case RIGHT:
						endX = String("-" + _width);
					break;
					
					case LEFT:
						endX = String(_width);
					break;
				}
				_oldImage.animate({"margin-left":endX}, _easeOutTime, _easeOut, onOldImageTweenComplete);
			}
			else if(_transitionType == 'alpha')
			{
				_oldImage.fadeOut(_easeOutTime, onOldImageTweenComplete);
			}
			else
			{
				alert("SET A VALID TRANSITION TYPE ('slide' or 'alpha')");
			}
			
		};
		
		function onOldImageTweenComplete()
		{
			_oldImage.parent().remove();
			_oldImage = null;
			
		};
		
		
		//	DISABLE CLICKED ITEM
		function disableItem()
		{
			var imgTagArray = $('a', _instance);
			$('a', _instance).unbind('click', changeImage);
			$('a', _instance).css({'cursor':'default'})
			$('a', _instance).addClass("carousel_link_selected");
			for (i = 0; i < imgTagArray.length; i++)
			{
				if( i != _counter)
				{
					 $(imgTagArray[i]).bind('click', changeImage);
					 $(imgTagArray[i]).css({'cursor':'pointer'});
					 $(imgTagArray[i]).removeClass("carousel_link_selected");
				}
			}
		}
		
		//	IN TRANSITION MUST BE > OF TRANSITION OUT
		function checkTransitionsTime()
		{
			if(_easeOutTime >= _easeInTime)
			{
				_easeOutTime -= 10;
			}
		}
		
		//	DIRECTION VALUE
		function checkDirection()
		{
			_direction = (_counter >= _oldCounter) ? RIGHT : LEFT;
			_oldCounter = _counter;
		}
		
		
		function hasNext()
		{
			return Boolean( _counter < _imgArray.length-1);
		};
		
		
		function hasPrevious()
		{
			return Boolean( _counter > 0);
		};
		
		//	SET NEW IMAGES ARRAY
		_instance.setNewImgArray = function(newImgArray)
		{
			_width = _instance.css('width');
			_height = _instance.css('height');
			
			if(_oldImage != undefined) _oldImage.parent().remove();
			if(_newImage != undefined) _newImage.parent().remove();
			
			_imgArray = newImgArray;
			
			if(_shuffle) shuffleImgArray();
			loadImage();
			
			
		}
		
		_instance.message = function(message)
		{
			alert(message);
		}
		
		///////////////////////////////////////////////////////////
		//	END PLUGIN
		init();
		
		return _instance;
	};

})(jQuery);
