// Author: Andy Asberry
// Date: October 2010
// Company: Ciphertek Systems, LLC
/****

EXAMPLE HTML STRUCTURE
	<div class="promo_container">  <!-- The Class Name or ID of this element does not matter. Class names of the container's children DO MATTER! -->
	  <div class="promo_slide">
	    <img class="promo_slide_image" src="yourimage.jpg" width="500" height="350" alt="Image Alt" border="0" />
		<div class="promo_slide_caption">
		  <p class="promo_slide_caption_header">Caption Title</p>
		  <p>...</p>
		</div>
	  </div>
	</div>

****/
(function($) {

	$.fn.extend({

		ctsPromo: function(options) {
		
			var defaults = {
				firstSlide: 0,
				delay: 10000,
				fadeInDuration: 1000,
				fadeOutDuration: 1000
			};
			
			var options = $.extend(defaults, options);
			
			var timer = null;
			
			
			
			//***** BEGIN FUNCTIONS *****//
				
			var reorderZIndex = function(self) {
				var o = options;
				var obj = $(self);
				var curr = obj.data('curr_slide');
				var num_slides = obj.data('num_slides');
				var promo_slides = obj.children('div.promo_slide');
				
				// reorder the z-index
				for (var i = 0; curr+i < num_slides; i++) {
					promo_slides.eq(curr+i).css({ zIndex: num_slides - i });	
				}
				for (var i = 1; curr-i >= 0; i++) {
					promo_slides.eq(curr-i).css({ zIndex: i });
				}
			};
			
			
			
			var addControls = function(self) {
				// container selector
				// add dots
				var dots = '';
				var num_of_slides = $('#cts_promo_container div.promo_slide').length;
				for (var i = 1; i <= num_of_slides; i++) {
					dots += '<a id="cts_promo_slide_dot_' + i + '" class="';
					if (i == 1) {
				  		dots += 'cts_promo_slide_dot_on ';	
					}
					dots += 'cts_promo_slide_dot" href="#">' + i + '</a>';
				}
							
				// Add Promo Controller
				var controller = '<div id="cts_promo_controller"></div>';
				var controls_prev = '<a id="cts_promo_controller_prev" class="cts_promo_controller_control" href="#"><<</a>';
				var controls_play = '<a id="cts_promo_controller_play" class="cts_promo_controller_pause cts_promo_controller_control" href="#">||</a>';
				var controls_next = '<a id="cts_promo_controller_next" class="cts_promo_controller_control" href="#">>></a>';
				$(controller)
				.insertBefore('#cts_promo_container')
				.html(dots+controls_play);
				$('#cts_promo_controller_play').data('state', 'play');
				
				/*
				$('#cts_promo_controller_prev')
				   .live('click', function(e) {
					  e.preventDefault();
					  e.stopPropagation();
					  $(this).blur();
					  prevSlide(self);
				   });
				*/
				$('#cts_promo_controller_play')
				.toggle(
				  function(e) {
					e.preventDefault();
					e.stopPropagation();
					//$(this).removeClass('cts_promo_slide_pause_btn');
					$(this).addClass('cts_promo_controller_play');
					$(this).blur();
					pause();
				  },
				  function(e) {
					e.preventDefault();
					e.stopPropagation();
					$(this).removeClass('cts_promo_controller_play');
					//$(this).addClass('cts_promo_slide_pause_btn'); 
					$(this).blur();
					play(self);
				  }
				);
				/*
				$('#cts_promo_controller_next')
				   .live('click', function(e) {
					 e.preventDefault();
					 e.stopPropagation();
					 $(this).blur();
					 nextSlide(self);
				   });
				   */
				$('a.cts_promo_slide_dot')
				   .live('click', function(e) {
					 e.preventDefault();
					 e.stopPropagation();
					 $(this).blur();
					 if (!$(this).hasClass('cts_promo_slide_dot_on')) {
                       var id = $(this).attr('id');
                       var pieces = id.split('_');
                       var index = pieces[pieces.length-1];
                       goToSlide(self, index);
                       $('a.cts_promo_slide_dot').removeClass('cts_promo_slide_dot_on');
                       $('#cts_promo_slide_dot_'+index).addClass('cts_promo_slide_dot_on');
					 }
				   });
			};
			
			
			
			var rotateSlides = function(self) {
				var o = options;
				var obj = $(self);
				var promo_slides = obj.children('div.promo_slide');
							
				// get the current and next slides
				var curr = obj.data('curr_slide');
				var next = curr < obj.data('num_slides') - 1 ? curr + 1 : 0;
				var total = obj.data('num_slides');
				
				
				// fade out the current slide, fade in the next slide and reorder the z-index
				setTimeout(function() {
						$('a.cts_promo_slide_dot').removeClass('cts_promo_slide_dot_on');
						$('#cts_promo_slide_dot_'+(curr >= total ? 1 : next+1)).addClass('cts_promo_slide_dot_on');				
			    	},
					o.fadeOutDuration/2
				);
				promo_slides.eq(curr).fadeOut(o.fadeOutDuration);
				promo_slides
				.eq(next)
				.fadeIn(o.fadeInDuration, function() {
					obj.data('curr_slide', next);
					reorderZIndex(self);
					//$('#cts_current_slide_num').text(obj.data('curr_slide')+1);
				});
			};
			
			
			
			var goToSlide = function(self, index) {
				var o = options;
				var obj = $(self);
				var promo_slides = obj.children('div.promo_slide');
				stopRotation();
				
				var curr = obj.data('curr_slide');
				var total = obj.data('num_slides');
				index = index-1 < 0 ? 0 : index-1;
				
				obj.data('curr_slide', index);
				setTimeout(function() {
						$('a.cts_promo_slide_dot').removeClass('cts_promo_slide_dot_on');
						$('#cts_promo_slide_dot_'+(index >= total ? 1 : index+1)).addClass('cts_promo_slide_dot_on');				
			    	},
					o.fadeOutDuration/2
				);
				promo_slides.eq(curr).fadeOut(o.fadeOutDuration);
				promo_slides
				.eq(index)
				.fadeIn(o.fadeInDuration, function() {
				  reorderZIndex(self);								   
				});
				if ($('#cts_promo_controller_play').data('state') == 'play') {
				  timer = setInterval(function() { rotateSlides(self); }, o.delay);	
				}
			};
			
			
			
			var startRotation = function(self) {
			  var o = options;
			  // start the rotation
			  timer = setInterval(function() { rotateSlides(self); }, o.delay);
			};
			
			
			
			var stopRotation = function() {
			  	clearInterval(timer);	
			};
			
			
			
			var play = function(self) {
				var obj = $(self);
				nextSlide(self);
			};
			
			
			
			var pause = function(self) {
				stopRotation(self);
			};
			
			
			
			var nextSlide = function(self) {
				var o = options;
				var obj = $(self);
				var promo_slides = obj.children('div.promo_slide');
				stopRotation();
				
				var curr = obj.data('curr_slide');
				var total = obj.data('num_slides');
				
				var next = curr < total - 1 ? curr + 1 : 0;
				obj.data('curr_slide', next);
				setTimeout(function() {
						$('a.cts_promo_slide_dot').removeClass('cts_promo_slide_dot_on');
						$('#cts_promo_slide_dot_'+(curr >= total ? 1 : next+1)).addClass('cts_promo_slide_dot_on');				
			    	},
					o.fadeOutDuration/2
				);
				promo_slides.eq(curr).fadeOut(o.fadeOutDuration);
				promo_slides
				.eq(next)
				.fadeIn(o.fadeInDuration, function() {
					obj.data('curr_slide', next);
					reorderZIndex(self);
					//$('#cts_current_slide_num').text(obj.data('curr_slide')+1);
				});
				if ($('#cts_promo_controller_play').data('state') == 'play') {
					timer = setInterval(function() { rotateSlides(self); }, o.delay);
				}
			};
			
			
			
			var prevSlide = function(self) {
				var o = options;
				var obj = $(self);
				var promo_slides = obj.children('div.promo_slide');
				stopRotation();
				
				var curr = obj.data('curr_slide');
				var total = obj.data('num_slides');
				
				var prev = curr > 0 ? curr - 1 : total-1;
				obj.data('curr_slide', prev);
				setTimeout(function() {
						$('a.cts_promo_slide_dot').removeClass('cts_promo_slide_dot_on');
						$('#cts_promo_slide_dot_'+(prev+1)).addClass('cts_promo_slide_dot_on');				
			    	},
					o.fadeOutDuration/2
				);
				promo_slides.eq(curr).fadeOut(o.fadeOutDuration);
				promo_slides
				.eq(prev)
				.fadeIn(o.fadeInDuration, function() {
					obj.data('curr_slide', prev);
					reorderZIndex(self);
					//$('#cts_current_slide_num').text(obj.data('curr_slide')+1);
				});
				if ($('#cts_promo_controller_play').data('state') == 'play') {
					timer = setInterval(function() { rotateSlides(self); }, o.delay);
				}
			};
	
			//****** END FUNCTIONS ******//
			
			
			
			return this.each(function() {			
				var o = options;
				var obj = $(this);
				var promo_slides = obj.children('div.promo_slide');
				
				// get the number of slides and store it in the 
				var num_slides = promo_slides.length;
				obj.data('num_slides', num_slides);
				
				// get and set the first slide
				obj.data('curr_slide', o.firstSlide);
				
				// set some css properties for the container
				obj.css({
					position: 'relative',
					overflow: 'hidden',
					zIndex: num_slides+1
				});
				
				// set some css properties for the promo slides
				promo_slides.css({
					position: 'absolute',
					top: '0',
					left: '0',
					display: 'block'
				});
				
				// set the opacity of the current slide to 1
				//promo_slides.eq(o.firstSlide).css({ opacity: 1 });
				
				// set the opacity of the other slides to 0
				promo_slides.not(':eq('+o.firstSlide+')').css({ display: 'none' });
				
				// reorder the z-index
				reorderZIndex(this);
				
				// remove the promo images and set them as the background-image to their parent div
				var pWidth = $(this).width();
				var pHeight = $(this).height();
				promo_slides.each(function() {
				  var src = $(this).children('img.promo_slide_image:first').attr('src');
				  $(this).css({ 
					background: 'url(' + src + ') left top no-repeat',
					width: pWidth + 'px',
					height: pHeight + 'px'
				  });
				  $(this).children('img.promo_slide_image:first').remove();
				});	
				
				// add the controls
				//addControls(this);
				
				// start the rotation
				startRotation(this);
			});
				
		}
				
	});
	
})(jQuery);
