myTerminal/faded-presenter

View on GitHub
src/scripts/faded-presenter.js

Summary

Maintainability
C
1 day
Test Coverage
/* global module, require */

module.exports = function (body, element, htmlText, options) {
    var $ = require('jquery'),
        intercom = window.Intercom.getInstance(),
        slideNumber = 0,
        title,
        autoTransitionTimer,

        init = function () {
            switchToPresentationMode();
            element.html(getSlideArray());

            title = $("h1").html();
            $("title").html(title);

            bindEvents();
            addLastSlide(title);
            addFooter();
            setDefaults();
        },

        switchToPresentationMode = function () {
            body.addClass("presentation-mode");
        },

        switchToSetupMode = function () {
            body.removeClass("presentation-mode");
        },

        nextSlide = function () {
            if (slideNumber + 1 === $("div.slide").length) {
                return;
            }

            slideNumber++;
            showSlide();
        },

        previousSlide = function () {
            if (!slideNumber) {
                return;
            }

            slideNumber--;
            showSlide();
        },

        autoTransitToNextSlide = function () {
            nextSlide();
        },

        getSlideArray = function () {
            return "<div class='slide visible'>" +
                htmlText.replace(/\<h2/g,
                                 "</div><div class='slide'><h2") +
                "</div>";
        },

        showSlide = function () {
            var progressPercentage =
                Math.ceil(100 * (slideNumber + 1) / $("div.slide").length);

            $("div.slide").
                removeClass("visible").
                eq(slideNumber).
                addClass("visible");

            body.find("#presentation-progress-text").
                text(progressPercentage + "%");

            body.find("#presentation-progress-bar").
                width(progressPercentage + "%");

            intercom.emit('slide-changed', {
                slideIndex: slideNumber
            });
        },

        bindEvents = function () {
            body.on("keydown", function (e) {
                if (e.keyCode === 39) {
                    nextSlide();
                } else if (e.keyCode === 37) {
                    previousSlide();
                }
            });

            body.find("#auto-progress").click(function () {
                if (autoTransitionTimer) {
                    window.clearInterval(autoTransitionTimer);
                    autoTransitionTimer = null;
                    $(this).removeClass("active");
                } else {
                    autoTransitionTimer = window.setInterval(autoTransitToNextSlide, 5000);
                    $(this).addClass("active");
                }
            });

            body.find(".animation-control").click(function () {
                var transition = this.getAttribute('data-animation');

                element[0].className = '';
                element.addClass(transition);

                body.find(".animation-control").removeClass("active");
                $(this).addClass("active");
            });
        },

        addLastSlide = function (title) {
            element.append("" +
                           "<div class='slide last-slide'>" +
                           "  <h1>" + title + "</h1>" +
                           "  Thanks for attending the session. Questions please..." +
                           "</div>");
        },

        addFooter = function () {
            element.append("" +
                           "<div class='footer'>" +
                           "  Printed from <a href='https://github.com/myTerminal/faded-presenter'>faded-presenter</a>" +
                           "</div>");
        },

        setDefaults = function () {
            body.find(".animation-control").eq(0).click();
        };

    options = options || {};
    init();

    return {
        init: init,
        switchToPresentationMode: switchToPresentationMode,
        switchToSetupMode: switchToSetupMode,
        nextSlide: nextSlide,
        previousSlide: previousSlide
    };
};