window.cmu = window.cmu || {};

(function (ns) {

    ns.imageViewer = function (spec, my) {
        var that = {};

        spec = spec || {};
        spec.main = spec.main || '.main img';
        spec.thumbnails = spec.thumbnails || '.objectCarousel ul.images li';

        // ------------------------------------------------------------------
        // Shared properties
        // ------------------------------------------------------------------

        my = my || {};
        my.selectedIndex = 0;
        my.logger = gj.logging.getLogger('cmu.imageViewer');

        // ------------------------------------------------------------------
        // Private properties
        // ------------------------------------------------------------------

        my.$viewNode = spec.viewNode;
        my.$main = my.$viewNode.find(spec.main);
        my.$thumbnails = my.$viewNode.find(spec.thumbnails);
        my.indexMin = 0;
        my.indexMax = my.$thumbnails.length - 1;

        // ------------------------------------------------------------------
        // Private methods
        // ------------------------------------------------------------------

        var init = function () {
            my.logger.debug('init(), viewNode:', my.$viewNode, '$main:', my.$main, my.$thumbnails);
            my.$viewNode.addClass('enabled');
            draw();
            return that;
        };

        var draw = function () {
            my.logger.debug('draw()');

            // Select the correct thumbnail
            highlightActiveThumbnail();

            // Render the large image
            var activeThumbnail = my.$thumbnails.eq(my.selectedIndex);
            var imageUrl = activeThumbnail.find('a').attr('href');

            if (my.$main.is('img')) {
                my.$main.attr('src', imageUrl);
                my.$main.removeAttr('width');
                my.$main.removeAttr('height');

            } else {
                my.$main.css('backgroundImage', 'url("' + imageUrl + '")');
            }

            var mainImage = my.$main.find('img');
        };

        var highlightActiveThumbnail = function (highlight) {
            highlight = highlight !== undefined ? highlight : true;
            my.$thumbnails.each(function (i, elm) {
                $(elm)[highlight && i === my.selectedIndex ? 'addClass': 'removeClass']('active');
            });
        };

        var selectImage = function (index) {
            my.logger.debug('selectImage(' + index + ')');
            my.selectedIndex = index;
            draw();
        };

        // ------------------------------------------------------------------
        // Public methods
        // ------------------------------------------------------------------

        that.previousImage = function () {
            my.logger.debug('previousImage()');
            my.selectedIndex -= 1;
            if (my.selectedIndex < my.indexMin) {
                my.selectedIndex = my.indexMin;
            }
            draw();
        };

        that.nextImage = function () {
            my.logger.debug('nextImage()');
            my.selectedIndex += 1;
            if (my.selectedIndex > my.indexMax) {
                my.selectedIndex = my.indexMax;
            }
            draw();
        };

        // ------------------------------------------------------------------
        // Event handlers
        // ------------------------------------------------------------------

        my.$thumbnails.hover(
            function () {
                highlightActiveThumbnail(false);
                $(this).addClass('hover');
            },
            function () {
                highlightActiveThumbnail();
                $(this).removeClass('hover');
            }
        );

        my.$thumbnails.find('a').click(function () {
            var index = $(this).parent('li').index();
            selectImage(index);
            return false;
        });

        // ------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------

        return init();
    };

})(window.cmu);

