/**
 * image fader / cycler
 * 
 * @author _ianbarker
 */

(function($) {

	var methods = {

	    init : function(options) {

		    var settings = {
		        timeInView : 3000,
		        transitionTime : 100,
		        easing : 'linear',
		        childElement : 'div',
		        showControls : false,
		        sliding : false,
		        related : null,
		        verticalCenter : false,
		        stopAtEnd: false
		    };

		    if (options) {
			    $.extend(settings, options);
		    }

		    return this.each(function() {

			    var $this = $(this);
			    var data = {
			        nextSlide : 0,
			        currentSlide : 0,
			        container : $this,
			        slides : $this.children(settings.childElement),
			        slide : $this.children(settings.childElement).eq(0),
			        slideCount : $this.children(settings.childElement).length,
			        canClick : false,
			        settings : settings
			    };

			    $(window).load(function() {

				    if (settings.verticalCenter == true) {
					    var parentHeight = data.container.outerHeight();
					    data.slides.each(function() {
						    var thisHeight = $(this).outerHeight(true);
						    $(this).css('top', parseInt((parentHeight - thisHeight) / 2) + 'px');
					    });
				    }

				    if (data.slideCount > 1) {

					    if (settings.sliding) {

						    data.container.children().wrapAll($('<div />', {
							    'class' : 'slide-wrapper'
						    }));

					    } else {

						    data.slides.hide();
						    data.slide.fadeIn();

					    }

					    if (data.settings.showControls) {
						    // add the controls
						    var $controls = $('<ul />', {
							    'class' : 'image-controls'
						    });

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

						    data.container.append($controls);

						    // set the first as selected
						    data.container.find('ul.image-controls li:first').addClass('selected');

						    // enable click
						    data.canClick = true;

					    }

					    // start the animation
					    data.slideTimer = setInterval(function() {
						    $this.switcher('next');
					    }, data.settings.timeInView);

				    } else {
					    data.slide.fadeIn('fast');
				    }
			    });

			    $(this).data('switcher', data);

		    });

	    },

	    next : function() {
	    	
		    //console.debug('next');
		    return this.each(function() {

			    var data = $(this).data('switcher');
			    data.canClick = false;
			    data.nextSlide = ((data.currentSlide + 1) >= data.slideCount) ? 0 : (data.currentSlide + 1);
			    
			    if ( data.nextSlide == 0 && data.settings.stopAtEnd ) {
			    	clearInterval(data.slideTimer);
			    	data.canClick = true;
			    	return;
			    }

			    if (data.settings.showControls) {
				    data.container.find('ul.image-controls li').removeClass('selected');
				    data.container.find('ul.image-controls li').eq(data.nextSlide).addClass('selected');
			    }

			    if (data.settings.sliding == true) {

				    var width = data.slide.outerWidth(true);
				    var wrapper = data.container.children('div.slide-wrapper');
				    var position = wrapper.position().left;
				    var targetPosition = (data.nextSlide == 0) ? 0 : position - width;
				    var tta = (targetPosition == 0) ? parseInt(data.settings.transitionTime * 2) : data.settings.transitionTime;

				    wrapper.animate({
					    left : targetPosition
				    }, {
				        easing : data.easing,
				        duration : tta,
				        complete : function() {
					        data.canClick = true;
					        data.currentSlide = data.nextSlide;
					        data.slide = data.slides.eq(data.currentSlide);
				        }
				    });

			    } else {
				    var ttf = parseInt(data.settings.transitionTime / 2);
				    //console.debug('fading for ' + ttf + ' seconds');
				    data.slides.eq(data.nextSlide).fadeIn(ttf, data.settings.easing, function() {
				    	//console.debug('fade complete');
					    data.currentSlide = data.nextSlide;
					    data.slide = data.slides.eq(data.currentSlide);
					    data.canClick = true;
				    });
				    data.slide.fadeOut(ttf, data.settings.easing);

			    }
		    });

	    },

	    jump : function(slideNumber) {
		    // console.debug('jump: ' + slideNumber);
		    return this.each(function() {

			    var data = $(this).data('switcher');

			    if (data.settings.related) {
				    data.settings.related.switcher('jump', slideNumber);
			    }

			    data.canClick = false;

			    // stop the automatic switching
			    clearInterval(data.slideTimer);

			    data.nextSlide = slideNumber;
			    data.container.find('ul.image-controls li').removeClass('selected');
			    data.container.find('li').eq(data.nextSlide).addClass('selected');

			    if (data.nextSlide != data.currentSlide) {

				    if (data.settings.sliding == true) {

					    if (data.settings.showControls) {
						    data.container.find('ul.image-controls li').removeClass('selected');
						    data.container.find('ul.image-controls li').eq(data.nextSlide).addClass('selected');
					    }
					    var wrapper = data.container.children('div.slide-wrapper');
					    var targetPosition = (data.slides.eq(data.nextSlide).position().left * -1);

					    wrapper.animate({
						    left : targetPosition
					    }, {
					        easing : data.easing,
					        duration : data.settings.transitionTime,
					        complete : function() {
						        data.canClick = true;
						        data.currentSlide = data.nextSlide;
						        data.slide = data.slides.eq(data.currentSlide);
					        }
					    });

				    } else {

					    var ttf = parseInt(data.settings.transitionTime / 2);
					    data.slides.eq(data.nextSlide).fadeIn(ttf, data.settings.easing, function() {
						    data.canClick = true;
						    data.currentSlide = data.nextSlide;
						    data.slide = data.slides.eq(data.currentSlide);
					    });
					    data.slide.fadeOut(ttf, data.settings.easing);

				    }
			    }

		    });

	    }

	};

	$.fn.switcher = function(method) {

		if (methods[method]) {
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' + method + ' does not exist on jQuery.switcher');
		}

	};

})(jQuery);
