/**
 * Real Cool Futures 09/2009
 * Story Worldwide
 *
 ** Homepage Carousel
 */

(function(options){

	var opacityHigh = 1;
    var opacityLow = 0.3;
    var fadeSpeed = 500;
    var everyMap = {'1s':1000, '5s':5000, '1m':60000};
    var slideSpeed = 1000;
	var slidesCount = options.slides.length;
	var stopIt = true;
	var rotateCount = 0;
	var visibleSlides = 1;
	var rotateTimer = null;
	
	//create container
    var container = $('<div class="wrapper">').appendTo($('<div id="carousel" class="loading">').appendTo('#container'));
    //create list
    var list = $('<ul>').appendTo(container);
	//create bubble
	var bubble = $('<div class="bubble">').appendTo(container).hide();
	//create nav
    var nav = $('<ul id="carouselNav"><li class="previous"><img src="images/btn-previous-carousel.gif" alt="Previous"></li><li class="next"><img src="images/btn-next-carousel.gif" alt="Next"></li></ul>').appendTo('#container');
	
    //render slides
    for(var i=0;i<slidesCount;i++){
    	var slide = options.slides[i];
        var li = $('<li class="' + slide.divclass + '">').append('<img src="' + slide.img + '">').data('bubble', {
				title: slide.title,
				caption: slide.caption,
				link: slide.link
			}).fadeTo(0,opacityLow);
		list.append(li);
    }
	
	//get all slides
    var slides = $('li', list);
    //get slide width
    var slideWidth = parseFloat(slides.css('width'));
	//choose random start slide
    var startSlide = randomXToY(2,8);
	//start = current slide
	var currentSlide = startSlide;
	
	//prepend last 2 to list & append first 2 to list
	list.prepend(slides.slice(slidesCount-(visibleSlides*2)).clone()).append(slides.slice(0,(visibleSlides*2)).clone());
	//get new slides
	slides = $('li', list);
	//get new slide count
	slidesCount = slides.size();
	
	//position list with offset: add slideWidth to center current slide
	list.css('width', (slideWidth * slidesCount)+'px').css('left', -(startSlide*slideWidth)+slideWidth);
	
	//removing loading status
    container.parent(0).removeClass('loading');
	
	//fade in start slide & show bubble
    slides.eq(startSlide).fadeTo(fadeSpeed, opacityHigh, function() {
		var data = $(this).data('bubble');
		updateBubble(data.title, data.caption, data.link);
		bubble.fadeIn(fadeSpeed);
	});
	
	//ignore extra outer slides in count
	slidesCount = slidesCount-2;
    
	//init auto rotating
	startAuto();
	
	//stop/start auto on hover
    container.hover(function() {
		stopAuto();
	}, function() {
		startAuto();
	});
    
	//assign controls
    $('.previous',nav).click(function() {
		stopAuto();
		slidesReset();
        animateTo(currentSlide-1);
    });
    $('.next',nav).click(function() {
		stopAuto();
		slidesReset();
		animateTo(currentSlide+1);
    });
	
	//start auto animation
	function startAuto() {
		rotateTimer = setInterval(function() {
			animateTo(currentSlide+1);
		}, everyMap[options.rotate.every]||5000);
	}
	
	//stop auto animation
	function stopAuto() {
		clearInterval(rotateTimer);
	}
	
	//reset slides
	function slidesReset() {
		slides.stop(true).fadeTo(0,opacityLow).children('.bubble').hide();
	}
	
	//update bubble contents
	function updateBubble(title, caption, link) {
		bubble.html('<h3>' + title + '</h3><p>' + caption + '</p><p class="link"><a href="' + link + '"><img src="images/btn-findout.gif" alt="Find out" /></a></p>');
	}
	
	//animate to given slide
    function animateTo(to) {
		//set current slide
		currentSlide = to;
		
        //fade out all slides
        slides.fadeTo(fadeSpeed, opacityLow);
		
		//fade out bubble
		bubble.fadeOut(fadeSpeed);
		
		//animate: add slideWidth to center current slide
		list.animate({left: -(currentSlide*slideWidth)+slideWidth}, slideSpeed, 'linear');
		
		//if first, then goto last
        if(to==1) {
			//switch to last in list
            list.animate({left: -slideWidth*(slidesCount-2)}, 0, 'linear');
			currentSlide = 8;
        //if last, then goto first
        } else if(to==slidesCount) {
			//switch to first in list
            list.animate({left: -slideWidth}, 0, 'linear');
            currentSlide = 2;
        }
		
		//fade in current slide
        slides.eq(currentSlide).fadeTo(fadeSpeed, opacityHigh, function() {
			var data = $(this).data('bubble');
			updateBubble(data.title, data.caption, data.link);
			bubble.fadeIn(fadeSpeed);
        });
    }
	
	//return random number between min & max
	function randomXToY(minVal,maxVal,floatVal) {
		var randVal = minVal+(Math.random()*(maxVal-minVal));
		return typeof floatVal=='undefined'?Math.round(randVal):randVal.toFixed(floatVal);
	}
})(carousel);

