Show:
                            /**
                             * The slideshow functionality for image viewers.
                             *
                             * @module aui-image-viewer-slideshow
                             */
                            
                            var CSS_ICON_PAUSE = A.getClassName('glyphicon', 'pause'),
                                CSS_ICON_PLAY = A.getClassName('glyphicon', 'play'),
                            
                                CSS_IMAGE_VIEWER_PLAYER = A.getClassName('image', 'viewer', 'player');
                            
                            function ImageViewerSlideshow() {}
                            
                            ImageViewerSlideshow.prototype = {
                                TPL_IMAGE_VIEWER_PLAYER: '<div class="text-center ' + CSS_IMAGE_VIEWER_PLAYER +
                                    '"><div class="text-center glyphicon ' +
                                    CSS_ICON_PLAY + '" style="cursor: pointer;"></span></div>',
                            
                                /**
                                 * Construction logic executed during instantiation.
                                 * Lifecycle.
                                 *
                                 * @method initializer
                                 * @protected
                                 */
                                initializer: function() {
                                    this._slideshowEventHandles = [
                                        this.after({
                                            currentIndexChange: this._afterSlideshowCurrentIndexChange,
                                            intervalTimeChange: this._afterSlideshowIntervalTimeChange,
                                            playingChange: this._afterSlideshowPlayingChange,
                                            showPlayerChange: this._afterSlideshowShowPlayerChange
                                        }),
                                        A.after(this._afterSlideshowBindUI, this, 'bindUI'),
                                        A.after(this._afterSlideshowRenderUI, this, 'renderUI'),
                                        A.after(this._afterSlideshowUISetVisible, this, '_uiSetVisible')
                                    ];
                                },
                            
                                /**
                                 * Destructor implementation.
                                 * Lifecycle.
                                 *
                                 * @method destructor
                                 * @protected
                                 */
                                destructor: function() {
                                    if (this._playerEventHandle) {
                                        this._playerEventHandle.detach();
                                    }
                            
                                    (new A.EventHandle(this._slideshowEventHandles)).detach();
                                },
                            
                                /**
                                 * Pauses the slideshow.
                                 *
                                 * @method pause
                                 */
                                pause: function() {
                                    this.set('playing', false);
                                },
                            
                                /**
                                 * Resumes the slideshow.
                                 *
                                 * @method play
                                 */
                                play: function() {
                                    this.set('playing', true);
                                },
                            
                                /**
                                 * Fired after the `bindUI` method runs.
                                 *
                                 * @method _afterSlideshowBindUI
                                 * @protected
                                 */
                                _afterSlideshowBindUI: function() {
                                    this._bindPlayer();
                                },
                            
                                /**
                                 * Fired after the `renderUI` method runs.
                                 *
                                 * @method _afterSlideshowRenderUI
                                 * @protected
                                 */
                                _afterSlideshowRenderUI: function() {
                                    this._renderPlayer();
                                },
                            
                                /**
                                 * Fired after the `currentIndex` attribute changes.
                                 *
                                 * @method _afterSlideshowCurrentIndexChange
                                 * @protected
                                 */
                                _afterSlideshowCurrentIndexChange: function() {
                                    this._syncTimers();
                                },
                            
                                /**
                                 * Fired after the `intervalTime` attribute changes.
                                 *
                                 * @method _afterSlideshowIntervalTimeChange
                                 * @protected
                                 */
                                _afterSlideshowIntervalTimeChange: function() {
                                    this._syncTimers();
                                },
                            
                                /**
                                 * Fired after the `playing` attribute changes.
                                 *
                                 * @method _afterSlideshowPlayingChange
                                 * @protected
                                 */
                                _afterSlideshowPlayingChange: function() {
                                    this._syncPlaying();
                                    this._syncTimers();
                                },
                            
                                /**
                                 * Fired after the `showPlayer` attribute changes.
                                 *
                                 * @method _afterSlideshowShowPlayerChange
                                 * @protected
                                 */
                                _afterSlideshowShowPlayerChange: function() {
                                    this._renderPlayer();
                                    this._syncShowPlayer();
                                    this._bindPlayer();
                                },
                            
                                /**
                                 * Fired after the `_uiSetVisible` method runs.
                                 *
                                 * @method _afterSlideshowUISetVisible
                                 * @protected
                                 */
                                _afterSlideshowUISetVisible: function() {
                                    if (this.get('visible')) {
                                        this._syncPlaying();
                                        this._syncShowPlayer();
                                        this._syncTimers();
                                    }
                                    else {
                                        this._syncShowPlayer();
                                        this._clearTimer();
                                    }
                                },
                            
                                /**
                                 * Binds the necessary events for the behavior of the play button.
                                 *
                                 * @method _bindPlayer
                                 * @protected
                                 */
                                _bindPlayer: function() {
                                    if (this._player && !this._playerEventHandle) {
                                        this._playerEventHandle = this._player.on('click', A.bind(this._onPlayerClick, this));
                                    }
                                },
                            
                                /**
                                 * Clear the rotation task interval.
                                 *
                                 * @method _clearIntervalRotationTask
                                 * @protected
                                 */
                                _clearTimer: function() {
                                    if (this._timer) {
                                        clearInterval(this._timer);
                                        this._timer = null;
                                    }
                                },
                            
                                /**
                                 * Fired when the play button is clicked.
                                 *
                                 * @method _onPlayerClick
                                 * @protected
                                 */
                                _onPlayerClick: function() {
                                    this.set('playing', !this.get('playing'));
                                },
                            
                                /**
                                 * Renders the player button.
                                 *
                                 * @method _renderPlayer
                                 * @protected
                                 */
                                _renderPlayer: function() {
                                    if (this.get('showPlayer') && !this._player) {
                                        this._player = A.Node.create(this.TPL_IMAGE_VIEWER_PLAYER);
                                        this.get('contentBox').append(this._player);
                                    }
                                },
                            
                                /**
                                 * Create an timer for the rotation task.
                                 *
                                 * @method _createIntervalRotationTask
                                 * @protected
                                 */
                                _startTimer: function() {
                                    this._clearTimer();
                            
                                    this._timer = setInterval(
                                        A.bind(this.next, this),
                                        this.get('intervalTime') * 1000
                                    );
                                },
                            
                                /**
                                 * Updates the player according to the value of the `playing` attribute.
                                 *
                                 * @method _syncPlaying
                                 * @protected
                                 */
                                _syncPlaying: function() {
                                    if (!this._player) {
                                        return;
                                    }
                            
                                    if (this.get('playing')) {
                                        this._player.one('.glyphicon').replaceClass(CSS_ICON_PLAY, CSS_ICON_PAUSE);
                                    }
                                    else {
                                        this._player.one('.glyphicon').replaceClass(CSS_ICON_PAUSE, CSS_ICON_PLAY);
                                    }
                                },
                            
                                /**
                                 * Updates the player according to the value of the `showPlayer` attribute.
                                 *
                                 * @method _syncShowPlayer
                                 * @protected
                                 */
                                _syncShowPlayer: function() {
                                    if (!this._player) {
                                        return;
                                    }
                            
                                    if (this.get('showPlayer') && this.get('visible')) {
                                        this._player.show();
                                    }
                                    else {
                                        this._player.hide();
                                    }
                                },
                            
                                /**
                                 * Updates the timers according to the value of the `playing` attribute.
                                 *
                                 * @method _syncTimers
                                 * @protected
                                 */
                                _syncTimers: function() {
                                    if (this.get('playing')) {
                                        this._startTimer();
                                    }
                                    else {
                                        this._clearTimer();
                                    }
                                }
                            };
                            
                            ImageViewerSlideshow.ATTRS = {
                                /**
                                 * Interval time in seconds between an item transition.
                                 *
                                 * @attribute intervalTime
                                 * @default 2
                                 * @type Number
                                 */
                                intervalTime: {
                                    value: 2,
                                    validator: A.Lang.isNumber
                                },
                            
                                /**
                                 * True if the slideshow is playing, or false otherwise.
                                 *
                                 * @attribute playing
                                 * @default true
                                 * @type Boolean
                                 */
                                playing: {
                                    value: true,
                                    validator: A.Lang.isBoolean
                                },
                            
                                /**
                                 * Shows the play button.
                                 *
                                 * @attribute showPlayer
                                 * @default true
                                 * @type {Boolean}
                                 */
                                showPlayer: {
                                    value: true,
                                    validator: A.Lang.isBoolean
                                }
                            };
                            
                            A.ImageViewerSlideshow = ImageViewerSlideshow;