(function(jQuery){
    jQuery.fn.extend({
        refcollection: function(options) {

            var defaults = {
                auto: 0,
                scroll: 1,
                vertical: false,
                wrap: 'circular'
            };

            var options = jQuery.extend(defaults, options);
            var collectionList = options.items;

            var collectionWrappers = jQuery(this);

            jQuery.each(collectionWrappers, function() {

                jQuery(this)
                    .addClass('clearfix')
                    .append(
                        '<div class="gallery-scroller">' +
                            '<div class="gallery-scroller-images">' +
                                '<ul class="collection-carousel jcarousel-skin-reflective"></ul>'+
                            '</div>'+
                        '</div>'+
                        '<div class="gallery-large">'+
                            '<div class="main-image"></div>'+
                        '</div>'
                    );


                jQuery('ul.collection-carousel:first', this).jcarousel({
                    auto: options.auto,
                    wrap: options.wrap,
                    size: (collectionList.length),
                    vertical: options.vertical,
                    scroll: options.scroll,
                    initCallback: collectionCarousel_initCallback,
                    itemFirstInCallback: {
                        onBeforeAnimation: collectionCarousel_itemFirstInCallback
                    },
                    itemVisibleInCallback: {
                        onBeforeAnimation: collectionCarousel_itemVisibleInCallback
                    },
                    itemVisibleOutCallback: {
                        onAfterAnimation: collectionCarousel_itemVisibleOutCallback
                    }
                });
            });

            function collectionCarousel_startAuto(carousel) {
				jQuery(carousel).everyTime(3000,function(i) {
                    carousel.next();
				});
            }

            function collectionCarousel_stopAuto(carousel) {
				jQuery(carousel).stopTime();
            }

            function collectionCarousel_initCallback(carousel) {

                collectionCarousel_startAuto(carousel);

                // Pause autoscrolling if the user moves with the cursor over the clip.
                carousel.clip.hover(function() {
                    collectionCarousel_stopAuto(carousel)
                }, function() {
                    collectionCarousel_startAuto(carousel)
                });

                var galleryImgWrap = carousel.clip.parents('.collection-wrap:first').find('.gallery-large:first');

                jQuery(galleryImgWrap).hover(function() {
                    collectionCarousel_stopAuto(carousel)
                    jQuery(this).find('p.caption:first').show('normal');
                }, function() {
                    jQuery(this).find('p.caption:first').hide('normal');
                    collectionCarousel_startAuto(carousel)
                });

            };

            function collectionCarousel_itemVisibleInCallback(carousel, item, i, state, evt) {

                // The index() method calculates the index from a given index who is out of the actual item range.
                var idx = carousel.index(i, collectionList.length);
                carousel.add(i, collectionCarousel_getItemHTML(carousel, collectionList[idx - 1]));

                jQuery(item).click(function() {
                    var i = jQuery(this).attr('jcarouselindex');
                    carousel.scroll(jQuery.jcarousel.intval(i));
                    return false;
                });

            };

            function collectionCarousel_itemVisibleOutCallback(carousel, item, i, state, evt) {
                carousel.remove(i);
            };

            function collectionCarousel_itemFirstInCallback(carousel, item, i, state, evt) {

                jQuery(item)
                    .addClass('jcarousel-item-first')
                    .siblings().removeClass('jcarousel-item-first');

                while(i > collectionList.length) {
                    i -= collectionList.length;
                }
                
                var idx = carousel.index(i, collectionList.length);

                var collectionItem = collectionList[i-1];
                var url = collectionItem.url;
                var caption = collectionItem.title;

                var mainImgWrap = jQuery(item)
                    .parents('.gallery-scroller:first')
                    .nextAll('.gallery-large:first')
                    .children(':first');

                jQuery('img:first', mainImgWrap).fadeOut();
                jQuery(mainImgWrap).empty();
                jQuery(mainImgWrap).append('<p class="caption" style="display: none">' + caption +  '</p>');
                jQuery(mainImgWrap).append('<img src="' + url + '" />');
                jQuery('img:first', mainImgWrap).fadeIn();
                
            };

            function collectionCarousel_getItemHTML(carousel, item) {
                return '<img src="' + item.thumb_url + '" alt="' + item.thumb_url + '" />';
            };
            

        }
    });
})(jQuery);