/**
 * @author luke.cuthbertson <luke.cuthbertson@heathwallace.com>
 * @projectDescription
 * @version 0.1
 * @date
 */
(function($){
	$.fn.carousel = function(opts){
		
		return this.each(function(){ 
			
			var $container = $(this);

			var $contentBlocks = $container.find('div.jvsContent')
			var maxHeight = 0;
			$contentBlocks.each(function(){
				var $block = $(this);
				var height = $block.height() - $block.find('h2').outerHeight(true);
				maxHeight = (height > maxHeight) ? height : maxHeight;
			});
			$contentBlocks.height(maxHeight).hide().eq(0).show();
			var $contentContainer = $container.find('div.jvsContentContainer').css({
				position: 'relative',
				overflow: 'hidden'
			});
			$contentContainer.height(maxHeight);
			var $contentBodies = $container.find('div.jvsContentBody').appendTo($contentContainer).hide().css({
				position: 'absolute',
				top: 0,
				left: 0,
				height: $contentContainer.height()
			});
			var $contentHeadings = $container.find('h2.jvsContentHeading').hide().eq(0).show().end();
			var $heading = $contentHeadings.eq(0);
			var $current = $contentBodies.eq(0).show();
			var currentIndex = 0;
			var contentHeadings = [];
			for(var i = 0; i < $contentHeadings.length; i++){
				contentHeadings.push($contentHeadings[i].innerHTML);
			}
			var $nav = $('<ul class="nav jvsNav" />').prependTo($container);
			$nav.append('<li class="first"><a href="#" class="prev"></a></li>');
			$contentBodies.each(function(i){
				$nav.append('<li><a href="#'+i+'">'+ (i+1) +'</a></li>');
			});
			$nav.append('<li class="last"><a href="#" class="nxt"></a></li>');
			var $links = $nav.find('a');
			$links.eq(1).addClass('selected');
			$links.eq(0).css({visibility: 'hidden'})
			//var $arrows = $('<a href="#" class="previous"></a><a href="#" class="next"></a>').appendTo($contentContainer);
			
			var locked = false;

			$links.click(function(e){
				e.preventDefault();
				//if the next button is clicked
				if ($(this).hasClass('nxt')){
					if (currentIndex == $contentBodies.size()-1) { //if the carousel is already at the last element
						return false; 
					}
					//calculate direction
					var dir = (currentIndex - (currentIndex+1)) / Math.abs((currentIndex - (currentIndex+1)));
					slide(dir, (++currentIndex));			
				}else if ($(this).hasClass('prev')){ //if the previous button is pressed
					if (currentIndex == 0) { //if the carousel is already at the first element
						return false; 
					}
					//calculate direction
					var dir = (currentIndex - (currentIndex-1)) / Math.abs((currentIndex - (currentIndex-1)));
					slide(dir, (--currentIndex));
				}else{ //else one of the numbered links was clicked, slide to that page.
					var index = $(this).attr('hash').replace('#', '');
					if (index != currentIndex) {
						//calculate direction
						var dir = (currentIndex - index) / Math.abs((currentIndex - index));
						slide(dir, index);
						currentIndex = index;
					}
				}

				switch(parseInt(currentIndex)){
					case 0:
						$links.eq(0).css({visibility: 'hidden'});
						$links.eq($links.size()-1).css({visibility: 'visible'});
						break;		
					case ($contentBodies.size() - 1):
						$links.eq(0).css({visibility: 'visible'});
						$links.eq($links.size()-1).css({visibility: 'hidden'});
						break;
					default:
						$links.eq(0).css({visibility: 'visible'});
						$links.eq($links.size()-1).css({visibility: 'visible'});
				}
						
			});
			/*
			function arrowAction(arrowElem){
				var dir = (($arrows.index(arrowElem) * 2) - 1) * -1;
				var index = currentIndex - dir;
				if(index < 0){
					index = $contentBodies.size() - 1;
				}
				if(index > $contentBodies.size() - 1){
					index = 0;
				}
				slide(dir, index);
				currentIndex = index;
			}
			var interval;
			function arrowHandler(e){
				var arrow = this;
				e.preventDefault();
				arrowAction(arrow);
				clearInterval(interval);
				interval = setInterval(function(){
					arrowAction(arrow);
				}, 1000);		
			}
			*/
			/*$arrows.click(arrowHandler)
			$arrows.mouseenter(arrowHandler)
			.mouseleave(function(){
				clearInterval(interval);
			})*/
			
			slide = function(dir, index){
				$heading.stop().fadeTo(200, 0, function(){
					$heading.fadeTo(200, 1).html(contentHeadings[index]);
				});
				
				var clone = $current.clone().appendTo($contentContainer);
				
				clone.css('zIndex', 3).animate({left: (460 * dir)}, 400, function(){ 
					locked = false; 
					clone.remove();
				})
				
				$current = $contentBodies.css('zIndex', 1).eq(index).css({
					left: (460 * dir * -1),
					zIndex: 2
				}).show().animate({left: 0}, 400);
				$links.removeClass('selected').eq(parseInt(index, 10)+1).addClass('selected');
			}
		});
		
		
	}
})(jQuery);

