/**
 * image fader / cycler
 * 
 * @auther ianbarker
 */

(function($) {

	$.fn.extend({

		switcher : function(options) {

			var defaults = {
				timeInView : 3000,
				fadeTime : 100,
				easing : 'linear',
				showControls : false,
				maxSlides: false
			};

			var options = $.extend(defaults, options);

			return this.each(function() {

				var nextSlide = 0;
				var currentSlide = 0;
				var $container = $(this);
				var $slides = $container.children('div');
				var $slide = $slides.eq(currentSlide);
				var slideCount = ( $slides.length <= options.maxSlides ) ? $slides.length : options.maxSlides;
				var slideTimer = null;
				var canClick = false;

				$slides.hide();
				$slide.show();

				$(window).load(function() {
					if (slideCount > 1) {

						if (options.showControls) {

							// add the controls
							var $controls = $('<div />', {
								'class' : 'slide-controls'
							});

							for ( var i = 0; i < slideCount; i++) {
								$controls.append($('<a />', {
									id : 'control-' + i,
									href : 'javascript:',
									html: i
								}).bind('click', function(e) {
									e.preventDefault();
									if (canClick)
										$container.jumpTo($(this));
								}));
							}

							$container.after($controls);

							// set the first as selected
							$('a#control-0').addClass('current');

							canClick = true;

						}

						// start the animation
						slideTimer = setInterval($container.nextSlide, options.timeInView);
					}
				});

				// helper functions
				$container.nextSlide = function() {
					var ttf = parseInt(options.fadeTime / 2);
					canClick = false;
					$slide.fadeOut(ttf, options.easing);
					nextSlide = currentSlide + 1;
					if (nextSlide > (slideCount - 1))
						nextSlide = 0;
					if (options.showControls) {
						$('div.slide-controls a').removeClass('current');
						$('a#control-' +nextSlide).addClass('current');
					}
					$slides.eq(nextSlide).fadeIn(ttf, options.easing, function() {
						currentSlide = nextSlide;
						$slide = $slides.eq(currentSlide);
						canClick = true;
					});
				};

				$container.jumpTo = function($obj) {
					canClick = false;
					// stop the automatic switching
					clearInterval(slideTimer);
					nextSlide = ($obj.attr('id').match(/([0-9]+)/)[0]);
					if (nextSlide != currentSlide) {
						var ttf = parseInt(options.fadeTime / 2);
						$slide.fadeOut(ttf, options.easing);
						$('div.slide-controls a').removeClass('current');
						$('a#control-' + nextSlide).addClass('current');
						$slides.eq(nextSlide).fadeIn(ttf, options.easing, function() {
							currentSlide = nextSlide;
							$slide = $slides.eq(currentSlide);
							canClick = true;
						});
					}
				};

			});

		}

	});

})(jQuery);
