/* ------------------------------------------------------------------
 * s3Slider
 * Developed By: Boban Karišik -> http://www.serie3.info/
 * CSS Help: Mészáros Róbert -> http://www.perspectived.com/
 * Rewritten By: Russ Wilson -> http://www.lightafuse.ca/
 *
 * Version: 1.4
 * Copyright:	Feel free to redistribute the script/modify it, as
 *				long as you leave my infos at the top.
 *
 * CHANGELOG
 * **************
 * 1.4.1 - made hard coded defaults editable
 *
 * 1.4 - Major rewrite of code
 *
 * 1.3 - Added doAnimate option
 *
 * 1.2 - Added slideTime, spanOpacity and fadeSpan options
 *
 * 1.1 - No idea... lol
 *
 * 1.0 initial release
 *
 *
 * KNOWN BUGS
 * **************
 * - pause on hover doesn't work
--------------------------------------------------------------------*/

(function(jQuery){  

    jQuery.fn.fuseSlider = function(options) {       
        
        var element     = this;
        var currentItem = null;
        var timeOutFn   = null;
        var faderStart  = true;
		var hovering    = false;
        var items       = jQuery("#" + element[0].id + "Content ." + element[0].id + "Image");
        var itemsSpan   = jQuery("#" + element[0].id + "Content ." + element[0].id + "Image span");
		
		//console.log(jQuery(items[0]).find('img').attr('src'));
		
		
		var defaults = {
			timeOut     : 4000,
			slideTime	: 4000/6,
			spanOpacity	: 0.7,
			fadeSpan	: true,
			doAnimate	: true,
			nav			: null,
			delay		: 4000					// time between transitions <- rename to slideDelay?
		};
							
		defaults.spanDelay = 0; 				// delay from time slide is shown to when it's containing span is shown
		defaults.speed = 400;					// transition speed
		defaults.spanSpeed = 400;				// transition speed
		defaults.pauseOnHover = false;			// pauses animation on hover
		defaults.animateSubContent = false;		// animates showing sub content
		
		var transIn = true;
		var currentIndex = 0;
		var $$ = jQuery;
	
		$$.extend(defaults,options);
		
		
		if(defaults.nav != null) {
			var navItems= $$(defaults.nav).find('li');
			
			navItems.each(function(){
				$$(this).css({cursor:'pointer'});
				$$(this).click(function(){
					clearTimeout(timeOutFn);
					var $this = this;
					$$(items[currentIndex]).fadeOut(defaults.speed, function() {
						currentIndex = $$.inArray($this,navItems);
						transIn = true;
						changeSlide();
					});
				});
			});
			
			
			
			/*for(var i = 0; i < navItems.length; i++) {
				$$(navItems[i]).css({cursor:'pointer'});
				$$(navItems[i]).click(function(){
					console.log(navItems.indexOf());
				});
			}*/
		}
		
            
        /*items.each(function(i) {

            // Pauses slider til mouse is no longer hovering over image
			jQuery(items[i]).mouseover(function() {
               hovering = true;
            });
			// Restarts Slider
            jQuery(items[i]).mouseout(function() {
                hovering   = false;
                fadeElement(true);
            });
			if(defaults.fadeSpan)
				jQuery(itemsSpan[i]).css('opacity', 0);
            
        });*/
		
		if(defaults.pauseOnHover) {
			$$(element).hover(
				function(){
					//hovering=true;
					clearTimeout(timeOutFn);
				},
				function(){
					//hovering = false;
					//fadeElement(true);
					changeSlide();
				});
		}
		
		
		
		//var doFadeElementIn = function(currentSpan) {
//			return (defaults.fadeSpan) ? defaults.spanOpacity : jQuery(currentSpan).css('opacity');
//			/*if(defaults.fadeSpan)
//				return defaults.spanOpacity;
//			else
//				return jQuery(currentSpan).css('opacity');*/
//		}
//		var doFadeElementOut = function(currentSpan) {
//			return (defaults.fadeSpan) ? 0 : jQuery(currentSpan).css('opacity');
//			/*if(defaults.fadeSpan)
//				return 0;
//			else
//				return jQuery(currentSpan).css('opacity');*/
//		}
//		
//        var fadeElement = function(isMouseOut) {
//            var thisTimeOut = defaults.timeOut;
//            thisTimeOut = (faderStart) ? 10 : thisTimeOut;
//            if(items.length > 0) {
//                //timeOutFn = setTimeout(makeSlider, thisTimeOut);
//				timeOutFn = setTimeout(doSlide, thisTimeOut);
//            } else {
//                console.log("Poof..");
//            }
//        }		
        
		var updateThumb = function() {
			if(defaults.nav != null) {
				var currentThumb = $$(defaults.nav).find('li');
				currentThumb.removeClass('current');
				$$(currentThumb[currentIndex]).addClass('current');;
			}
		}
		
		
		
		var changeSlide = function(){
			//if(hovering) return;
			if(transIn) {
				$$(items[currentIndex]).fadeIn(defaults.speed, function() {
					transIn = !transIn;
					
					updateThumb();
					//timeOutFn = setTimeout(changeSlide, defaults.delay);
					
					var $span = $$(items[currentIndex]).find('span');
					
					if(defaults.animateSubContent) {
						if($span.hasClass('top')) {
							var objHeight = Number($span.outerHeight(true));
							var tmp = (defaults.animateSubContent) ? $span.css('left', '0px').css('top', -objHeight + 'px') : $span.css('left', '0px').css('top', '0px');
							$span.stop().animate({top:'0px', opacity:doFadeElementIn($span)},defaults.slideTime, 'swing', function() {
									timeOutFn = setTimeout(changeSlide, defaults.delay);
								});
						}
						else if($span.hasClass('right')) {
							var objWidth = Number($span.outerWidth(true));
							var tmp = (defaults.animateSubContent) ? $span.css('right', -(objWidth) + 'px').css('top', '0px') : $span.css('right', '0px').css('top', '0px');
							$span.stop().animate({right:'0px', opacity:doFadeElementIn($span)},defaults.slideTime, 'swing', function() {
								timeOutFn = setTimeout(changeSlide, defaults.delay);
							});
						}
						else if($span.hasClass('bottom')) {
							var objHeight = Number($span.outerHeight(true));
							var tmp = (defaults.animateSubContent) ? $span.css('left', '0px').css('bottom', -objHeight + 'px') : $span.css('left', '0px').css('bottom', '0px');
							$span.stop().animate({bottom:'0px', opacity:doFadeElementIn($span)},defaults.slideTime, 'swing', function() {
								timeOutFn = setTimeout(changeSlide, defaults.delay);
							});
						}
						else if($span.hasClass('left')) {
							var objWidth = Number($span.outerWidth(true));
							var tmp = (defaults.animateSubContent) ? $span.css('left', -(objWidth) + 'px').css('top', '0px') : $span.css('left', '0px').css('top', '0px');
							$span.stop().animate({left:'0px', opacity:doFadeElementIn($span)},defaults.slideTime, 'swing', function() {
								timeOutFn = setTimeout(changeSlide, defaults.delay);
							});
						}
					}
					else {
						timeOutFn = setTimeout(changeSlide, defaults.delay);
					}
					
				});
			}
			else {
				$$(items[currentIndex]).fadeOut(defaults.speed, function() {
					transIn = !transIn;
					currentIndex = (currentIndex < items.length - 1) ? currentIndex+1 : 0;
					timeOutFn = setTimeout(changeSlide, 10);
				});
			}
		}
		changeSlide();
		
		
		var animateHideSubContent = function() {
			if(!defaults.animateSubContent) return;	
			
			var $span = $$(items[currentIndex]).find('span');
			var spanWidth = Number($span.outerWidth(true));
			var spanHeight = Number($span.outerHeight(true));
			
			var animateOptions;
				if($span.hasClass('top'))
					animateOptions = {top:-(spanHeight) + 'px', opacity:doFadeElementOut($span)};
				else if($span.hasClass('right'))
					animateOptions = {right:-(spanWidth) + 'px', opacity:doFadeElementOut($span)};
				else if($span.hasClass('bottom'))
					animateOptions = {bottom:-(spanHeight) + 'px', opacity:doFadeElementOut($span)};
				else if($span.hasClass('left'))
					animateOptions.left = -(spanWidth) + 'px';
				
				$span.stop().animate(animateOptions, defaults.spanSpeed, 'swing', function() {
					$$(items[currentIndex]).fadeOut(defaults.speed, function() {
						changeSlide();
					});
				});		
					
				animateOptions.opacity = doFadeElementOut($span);	
		} // end animateHideSubContent()
		
		
		
		
		
		
		
		var doSlide = function(){
			jQuery(items[currentIndex]).fadeIn(defaults.slideTime, function() {
				if(faderStart == true) {
					if(!hovering) {
						faderStart = false;
						fadeElement(false);
					}
				}
				else {
					jQuery(items[currentIndex]).fadeOut(defaults.slideTime, function() {
						faderStart = true;
						currentIndex = (currentIndex < items.length - 1) ? currentIndex+1 : 0;
						if(!hovering) {
							fadeElement(false);
						}
					});
				}
			});
			
		};
		//doSlide();
		
		
		
		
		
        var makeSlider = function() {			
			currentItem = (currentItem != null) ? currentItem : items[(items.length-1)];
            var currNo = jQuery.inArray(currentItem, items) + 1;
            currNo = (currNo == items.length) ? 0 : (currNo - 1);
			
			if(faderStart == true) {
				if(!hovering) {
					jQuery(items[currNo]).fadeIn(defaults.slideTime, function() {
						if(jQuery(itemsSpan[currNo]).hasClass('top')) {
							var objHeight = Number(jQuery(itemsSpan[currNo]).outerHeight(true));
							var tmp = (defaults.doAnimate) ? jQuery(itemsSpan[currNo]).css('left', '0px').css('top', -objHeight + 'px') : jQuery(itemsSpan[currNo]).css('left', '0px').css('top', '0px');
							jQuery(itemsSpan[currNo]).stop().animate({top:'0px', opacity:doFadeElementIn(itemsSpan[currNo])},defaults.slideTime, 'swing', function() {
									faderStart = false;
									currentItem = items[currNo];
									if(!hovering) {
										fadeElement(false);
									}
								});
						}
						else if(jQuery(itemsSpan[currNo]).hasClass('right')) {
							var objWidth = Number(jQuery(itemsSpan[currNo]).outerWidth(true));
							var tmp = (defaults.doAnimate) ? jQuery(itemsSpan[currNo]).css('right', -(objWidth) + 'px').css('top', '0px') : jQuery(itemsSpan[currNo]).css('right', '0px').css('top', '0px');
							jQuery(itemsSpan[currNo]).stop().animate({right:'0px', opacity:doFadeElementIn(itemsSpan[currNo])},defaults.slideTime, 'swing', function() {
								faderStart = false;
								currentItem = items[currNo];
								if(!hovering) {
									fadeElement(false);
								}
							});
						}
						else if(jQuery(itemsSpan[currNo]).hasClass('bottom')) {
							var objHeight = Number(jQuery(itemsSpan[currNo]).outerHeight(true));
							var tmp = (defaults.doAnimate) ? jQuery(itemsSpan[currNo]).css('left', '0px').css('bottom', -objHeight + 'px') : jQuery(itemsSpan[currNo]).css('left', '0px').css('bottom', '0px');
							jQuery(itemsSpan[currNo]).stop().animate({bottom:'0px', opacity:doFadeElementIn(itemsSpan[currNo])},defaults.slideTime, 'swing', function() {
                                faderStart = false;
                                currentItem = items[currNo];
                                if(!hovering) {
                                    fadeElement(false);
                                }
                            });
						}
						else if(jQuery(itemsSpan[currNo]).hasClass('left')) {
							var objWidth = Number(jQuery(itemsSpan[currNo]).outerWidth(true));
							var tmp = (defaults.doAnimate) ? jQuery(itemsSpan[currNo]).css('left', -(objWidth) + 'px').css('top', '0px') : jQuery(itemsSpan[currNo]).css('left', '0px').css('top', '0px');
							jQuery(itemsSpan[currNo]).stop().animate({left:'0px', opacity:doFadeElementIn(itemsSpan[currNo])},defaults.slideTime, 'swing', function() {
								faderStart = false;
								currentItem = items[currNo];
								if(!hovering) {
									fadeElement(false);
								}
							});
						}
					});// fadeIn
				}//if(!hovering)
			}
			else {
				var objWidth = Number(jQuery(itemsSpan[currNo]).outerWidth(true));
				var objHeight = Number(jQuery(itemsSpan[currNo]).outerHeight(true));

				var animateOptions;
				if(jQuery(itemsSpan[currNo]).hasClass('top')) {
					animateOptions = {top:-(objHeight) + 'px', opacity:doFadeElementOut(itemsSpan[currNo])};
				}
				else if(jQuery(itemsSpan[currNo]).hasClass('right')) {
					animateOptions = {right:-(objWidth) + 'px', opacity:doFadeElementOut(itemsSpan[currNo])};
				}
				else if(jQuery(itemsSpan[currNo]).hasClass('bottom')) {
					animateOptions = {bottom:-(objHeight) + 'px', opacity:doFadeElementOut(itemsSpan[currNo])};
				}
				else if(jQuery(itemsSpan[currNo]).hasClass('left')) {
					animateOptions = {left:-(objWidth) + 'px', opacity:doFadeElementOut(itemsSpan[currNo])};
				}
				
				if(!hovering) {
					if(defaults.doAnimate) {
							jQuery(itemsSpan[currNo]).stop().animate(animateOptions, defaults.slideTime, 'swing', function() {
								jQuery(items[currNo]).fadeOut(defaults.slideTime, function() {
									faderStart = true;
									currentItem = items[currNo+1];
									if(!hovering) {
										fadeElement(false);
									}
								});
							});
						}
						else {
							jQuery(itemsSpan[currNo]).stop().animate({top:'0px', opacity:doFadeElementOut(itemsSpan[currNo])},defaults.slideTime, 'swing', function() {
								jQuery(items[currNo]).fadeOut(defaults.slideTime, function() {
									faderStart = true;
									currentItem = items[currNo+1];
									if(!hovering) {
										fadeElement(false);
									}
								});
							});
						}
				} //if(!hovering)
			}
			
			
        }
        //makeSlider();
    };  

})(jQuery);   
