/*
 * Juna Rotator 0.2
 * By Juna (http://www.juna.nl)
 * Copyright (c) 2011 Juna
 * 
 * Features: version 0.2 ass a custom previous and next button, an option to start on a random slide and an extra position: bottomCenter
*/
(function ($) {
    var timer;

    var methods = {
        init: function (options) {
            var defaults = {
                timeout: 5000,
                fadeInSpeed: 'fast',
                fadeOutSpeed: 'slow',
                width: 170,
                height: 100,
                navigationImageActive: 'images/dotactive.png',
                navigationImageInactive: 'images/dotinactive.png',
                navigationPosition: 'topLeft', // Possible: topLeft, topRight, bottomLeft, bottomRight, bottomCenter
                navigationWidth: 50,
                previousButton: undefined,
                nextButton: undefined,
                startRandom: false
            };

            var options = $.extend(defaults, options);

            return this.each(function () {
                clearTimeout(timer);
                var el = $(this);

                el.css({
                    width: options.width + 'px',
                    height: options.height + 'px'
                });

                var slides = el.html();
                el.html('<div class="rotator"></div>');
                var rotator = el.find('.rotator');
                rotator.html(slides);

                var start;
                var start = options.startRandom ? Math.floor(Math.random() * rotator.find('.slide').length) : 0;

                rotator.find('.slide').addClass('inactive');
                rotator.find('.slide:eq(' + start + ')').removeClass('inactive').addClass('active').show();

                var positionNavigation = function () {
                    var navigation = el.find('.rotatorNavigation');
                    var oEl = el.offset();

                    if (options.navigationPosition == 'topLeft') {
                        var xNavigation = oEl.left;
                        var yNavigation = oEl.top;
                    }
                    if (options.navigationPosition == 'topRight') {
                        var xNavigation = (oEl.left + options.width) - options.navigationWidth;
                        var yNavigation = oEl.top;
                    }
                    if (options.navigationPosition == 'bottomLeft') {
                        var xNavigation = oEl.left;
                        var yNavigation = (oEl.top + options.height) - navigation.height();
                    }
                    if (options.navigationPosition == 'bottomRight') {
                        var xNavigation = (oEl.left + options.width) - options.navigationWidth;
                        var yNavigation = (oEl.top + options.height) - navigation.height();
                    }
                    if (options.navigationPosition == 'bottomCenter') {
                        var xNavigation = (oEl.left + options.width) - (options.width / 2) - (options.navigationWidth / 2);
                        var yNavigation = (oEl.top + options.height) - navigation.height();
                    }

                    navigation.css({
                        top: yNavigation + 'px',
                        left: xNavigation + 'px',
                        width: options.navigationWidth + 'px'
                    });
                }

                var buildNavigation = function (start) {
                    var slides = rotator.find('.slide');
                    var navigation = '';

                    navigation += '<div style="clear: both">&#160;</div><ul class="rotatorNavigation">';

                    var i;
                    for (i = 0; i < slides.length; i++) {
                        navigation +=
                            '<li' + (i == start ? ' class="current"' : '') + '>'
                            + '<a href="javascript:;" id="' + i + '">'
                            + '<img src="' + (i == start ? options.navigationImageActive : options.navigationImageInactive) + '" alt="" />'
                            + '</a>'
                            + '</li>';
                    }

                    navigation += '<div class="clear">&#160;</div></ul>';

                    el.append(navigation);

                    el.find('.rotatorNavigation a').click(function () {
                        var index = $(this).attr('id');
                        showSlide(index);
                    });

                    if (typeof (options.nextButton) !== 'undefined') {
                        options.nextButton.click(function () {
                            clearTimeout(timer);
                            var next = rotator.find('.slide.active').next().length ? rotator.find('.slide.active').next() : rotator.find('.slide:eq(0)');
                            var nextIndex = rotator.find('.slide').index(next);
                            showSlide(nextIndex);
                        });
                    }

                    if (typeof (options.previousButton) !== 'undefined') {
                        options.previousButton.click(function () {
                            clearTimeout(timer);
                            var previous = rotator.find('.slide.active').prev().length > 0 ? rotator.find('.slide.active').prev() : rotator.find('.slide:eq(' + (rotator.find('.slide').length - 1) + ')');
                            var previousIndex = rotator.find('.slide').index(previous);
                            showSlide(previousIndex);
                        });
                    }

                    positionNavigation();
                }

                var showSlide = function (next) {
                    clearTimeout(timer);
                    var navigation = el.find('.rotatorNavigation');

                    var activeSlide = rotator.find('.slide.active');
                    var nextSlide = rotator.find('.slide:eq(' + next + ')');

                    var navigationActive = navigation.find('li.current');
                    var navigationNext = navigation.find('li:eq(' + next + ')');

                    activeSlide.fadeOut(options.fadeOutSpeed, function () {
                        $(this).addClass('inactive').removeClass('active');
                        nextSlide.fadeIn(options.fadeInSpeed, function () {
                            $(this).removeClass('inactive').addClass('active');

                            navigationActive.removeClass('current').find('img').attr('src', options.navigationImageInactive);
                            navigationNext.addClass('current').find('img').attr('src', options.navigationImageActive);
                        });
                    });

                    playRotator(nextSlide);
                }

                var playRotator = function (current) {
                    var next = current.next().length ? current.next() : rotator.find('.slide:eq(0)');
                    var nextIndex = rotator.find('.slide').index(next);
                    timer = setTimeout(function () { showSlide(nextIndex); }, options.timeout);
                }

                buildNavigation(start);
                playRotator(rotator.find('.slide:eq(' + start + ')'));
            });
        },
        clearTimer: function (options) {
            clearTimeout(timer);

            var el = $(this);

            if (el.find('.rotator').length) {
                el.find('.slide').removeClass('inactive').removeClass('active').hide();
                var slides = el.find('.rotator').html();
                el.html(slides);
            }
        }
    };

    $.fn.junaRotator = function (method) {

        if (methods[method]) {
            return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.junaRotator');
        }
    };
})(jQuery);
