$(document).ready(function() 
{
	$('.slideshow').each(function()
	{
		var $container = $('>.container', this),
			$controls = $('>.controls', this);
		var intervalId,
			self = this,
			suspend = false,
			state,
			laststate,
			paused = false,
			suspended = false,
			effect = 'slide';
			
		var conf = 
		{
			interval : 2000,
			duration : 400
		};
		
		$(this).hover
		(
			function(){ suspended = true; updateState(); },
			function(){ suspended = false; updateState(); }
		);
		
		if($(this).hasClass('fade'))
			effect = 'fade';
			
		$.each($(this).attr('class').split(' '), function(i,v)
		{
			var res = /([a-z]+)(\d+)/.exec(v);
			if(res) conf[res[1]] = res[2];
		});
		
		if($controls.hasClass('generate'))
		{
			var all = $controls.hasClass('all');
			if($controls.hasClass('prev') || all)
				$('<a href="javascript:void()" class="prev" data-action="prev">Prev</a>').appendTo($controls);
			if($controls.hasClass('next') || all)
				$('<a href="javascript:void()" class="next" data-action="next">Next</a>').appendTo($controls);
			if($controls.hasClass('numbers') || all)
				$container.find('>.slide').each(function(i){ $('<a href="javascript:void()" data-index="'+i+'">'+(i+1)+'</a>').appendTo($controls); });
			if($controls.hasClass('pause') || all)
				$('<a href="javascript:void()" class="pause" data-action="pause">Pause</a>').appendTo($controls);
		}
		
		$controls.find('a').click(function()
		{
			clearInterval(intervalId);
			var idx = $(this).attr('data-index');
			var act = $(this).attr('data-action');
			if(idx)
				animateSlider(idx);
			else if(act)
			{
				idx = $container.find('>.slide.active').index();
				switch(act)
				{
					case 'prev': animateSlider(idx < 1 ? $container.children().length-1 : idx-1); break;
					case 'next': animateSlider(idx >= $container.children().length-1 ? 0 : idx+1); break;
					case 'pause': paused = !paused; updateState(); break;
				}
			}
			initSliderTimer();
			return false;
		});
		
		$container.find('>.slide:first')
			.addClass('active');
		$controls.find('a[data-index]:first')
			.addClass('active');
		initSliderTimer();
		updateState();
		
		function animateSlider(idx)
		{
			//console.log('animateSlider', idx);
			var $slides = $container.find('>.slide');

			//if(!p || !p.left)
			//	return;
			switch(effect)
			{
				case 'fade':
					$slides.filter(function(){ return $(this).index() != idx }).fadeOut();
					$slides.eq(idx).fadeIn();
				break;
				default:
				case 'slide':
					var p = $slides.eq(idx).position();
					$container.animate({left: -p.left, top: -p.top}, {queue: false, duration: conf.duration});
				break;
			}

			$controls.find('a[data-index]')
				.removeClass('active')
				.eq(idx).addClass('active');
			$slides
				.removeClass('active')
				.eq(idx).addClass('active');
		}

		function initSliderTimer()
		{
			clearInterval(intervalId);
			intervalId = setInterval(function()
			{
				if(state == 'active')
				{
					var nextIndex = $container.find('>.slide.active').index() + 1;
					if(nextIndex >= $container.find('>.slide').length)
						nextIndex = 0;
					animateSlider(nextIndex);
				}
			}, conf.interval);
		}
		
		function updateState()
		{
			if(paused)
				state = 'paused';
			else if(suspended)
				state = 'suspended';
			else
				state = 'active';
			
			//$(self).toggleClass('suspended', suspended).toggleClass('paused', paused);
			$controls.find('a.pause')
				.toggleClass('active', paused || suspended)
				.toggleClass('paused', paused);
			if(laststate)
				$(self).removeClass(laststate)
			$(self).addClass(state);
			laststate = state;
		}
	});

});

