/*
 * jQuery Carousel v0.1
 *
 * Initiates a simple carousel with autoslide.
 *
 * Copyright (c) 2011 Youri van der Lans
 * 
 * @dependencies: easing (http://gsgd.co.uk/sandbox/jquery/easing/)
 */
(function($){
	$.fn.carousel = function(options) {
		var defaults = {
			top: 0,
			cur: 0,
			imageHeight: 280,
			slideSpeed: 500,
			autoslide: 6000
		};
		
		var options = $.extend(defaults, options);
		
		var obj = $(this);
		var img = $(this).find('#images');
		
		options.total = obj.find('.image').length;
		obj.pauseAutoSlide = false;
		obj.stopAutoSlide = false;
		
		return this.each(function(){
			obj.up = function(event){
				options.cur = options.cur - 1;
				obj.move(event);
			};
			
			obj.down = function(event){
				options.cur = options.cur + 1;
				obj.move(event);
			};
			
			obj.scrollTo = function(event){
				index = obj.find('#buttons .button').index(this);
				
				options.cur = index;
				obj.move(event);
			};
			
			obj.move = function(event){
				obj.trigger('beforeSlide');
				
				obj.getNewPos();
				if ( event.type == "click" ){
					obj.clearAutoSlide();
					obj.timeout = 0;
				}
				img.stop();
				img.animate({
						top: options.top
					},{
						duration: options.slideSpeed,
						easing: 'easeInCubic',
						complete: obj.moveCallback()
					}
				);
			};
			
			obj.moveCallback = function(){
				//Set index number when clicked
				obj.setIndex();
				
				if ( obj.timeout == 0 && obj.pauseAutoSlide == false )
				{
					// Autoslide
					obj.setAutoSlide();
				}
			};
			
			obj.getNewPos = function(){
				if ( options.cur == -1 ){
					options.top = ( options.cur * options.imageHeight ) - options.imageHeight;
					options.cur = options.total - 1;
				} else {
					options.top = 0 - ( options.cur * options.imageHeight );
				}
				
				if ( options.cur == options.total ){
					options.top = 0;
					options.cur = 0;
				} else {
					options.top = 0 - ( options.cur * options.imageHeight );
				}
			};
			
			obj.setIndex = function(){
				$('#buttons > div').removeClass('active');
				$('#buttons > div:eq('+options.cur+')').addClass('active');
			};
			
			obj.setAutoSlide = function(){
				obj.timeout = setInterval(function(){obj.down(true)}, options.autoslide);
			};
			
			obj.clearAutoSlide = function(){
				clearInterval(obj.timeout);
			};
			
			//Set image div width
			height = options.total * options.imageHeight;
			img.css('height', height);
			
			//Click events
			obj.find('#buttons .button').bind('click', obj.scrollTo);
			
			// Autoslide
			obj.setAutoSlide();
			
			obj.pauseAutoSlide = function(){
				obj.clearAutoSlide();
				
				obj.pauseAutoSlide = true;
			};
			
			obj.unpauseAutoSlide = function(){
				if(!obj.stopAutoSlide){
					obj.setAutoSlide();
					obj.pauseAutoSlide = false;
				}
			};
			
			// added stop functionality onclick
			obj.stopAutoSlide = function(){
				obj.stopAutoSlide = true;
			};
			
			// Stop autoslide when hovering over element
			// Resume autoslide after hovering
			obj.hover(obj.pauseAutoSlide, obj.unpauseAutoSlide);
			
			// click action
			obj.click(obj.stopAutoSlide);
			
			obj.bind('pauseAutoSlide', obj.pauseAutoSlide);
			obj.bind('unpauseAutoSlide', obj.unpauseAutoSlide);
		});
	};
})(jQuery);
