(function($) {
    $.fn.imageRotator = function() {
        var showImage = function($panel, $image) {
            var $mainCaption = $panel.find('.ma-image-caption');
            var $mainImage = $panel.find('img');

            var $imageCaption = $image.find('.caption').html();
            var $imageElement = $image.find('img').clone().css('opacity', 0);

            if ($imageElement.attr('link')) {
                $imageElement.css('cursor', 'pointer');

                $imageElement.click(function() {
                    window.location.href = $(this).attr('link');
                });
            }

            var mainCaptionHeight = $mainCaption.find('.wrapper').height();

            $mainCaption.find('.wrapper').animate({
                opacity: 0,
                marginBottom: -mainCaptionHeight
            }, 250, function() {
                $(this).html($imageCaption).animate({
                    opacity: 0.85,
                    marginBottom: 0
                }, 250);
            });

            $panel.append($imageElement);
            $mainImage.fadeTo(2000, 0, function() {
                $(this).remove();
            });
            $imageElement.fadeTo(2000, 0.85);
        }

        return this.each(function() {
            var $this = $(this);
            var $images = $this.find('.image');

            var counter = 0;

            $this.wrap('<div class="ma-image-rotator"></div>');
            $this.prepend('<div class="ma-main-image"><div class="ma-image-caption"><div class="wrapper"></div></div></div>');

            $this.find('.ma-image-caption').show();
            $this.find('.ma-image-caption .wrapper').css('opacity', 0.85);

            function cycle(timeout) {
                if (counter >= $images.length) {
                    counter = 0;
                }

                showImage($this.find('.ma-main-image'), $images.eq(counter));

                if ($images.length > 1) {
                    setTimeout(function() {
                        cycle(timeout);
                    }, timeout);
                }

                counter++;
            }

            cycle(5000);
        });
    }

    $.cycle = function(interval, callback) {
        var $this = $(this);

        var cycleExec = function(callback) {
            callback();

            setTimeout(function() {
                cycleExec();
            }, interval);
        }

        cycleExec();
    }
})(jQuery)
