UNPKG

echoesworks

Version:

Next-Generation Tech Blog/Presentation Framework

113 lines (93 loc) 2.9 kB
/*! * Bespoke.js v1.0.0 * * Copyright 2014, Mark Dalgleish * This content is released under the MIT license * http://mit-license.org/markdalgleish */ /*jshint -W030 */ var from = function () { var element = this.options.element, parent = element.nodeType === 1 ? element : document.querySelector(element), slides = [].filter.call(parent.children, function (el) { return el.nodeName !== 'SCRIPT'; }), activeSlide = slides[0], listeners = {}, readURL = function () { var hash = window.location.hash, current = hash.replace(/#|\//gi, ''); if (current > 0) { activate(current); } else { activate(0); } }, activate = function (index, customData) { if (!slides[index]) { return; } activeSlide.className = activeSlide.className.replace(new RegExp('active' + '(\\s|$)', 'g'), ' ').trim(); activeSlide.classList.add('past'); fire('deactivate', createEventData(activeSlide, customData)); activeSlide = slides[index]; activeSlide.className = 'active'; var isLastSlide = parseInt(index, 10) === (slides.length - 1); var isFirstSlide = parseInt(index, 10) === 0; if(isFirstSlide || isLastSlide) { activeSlide.classList.add('specify'); } window.bar.go(100 * ( index + 1) / slides.length); writeURL(index); localStorage.setItem('echoesworks', index); fire('activate', createEventData(activeSlide, customData)); }, slide = function (index, customData) { if (arguments.length) { fire('slide', createEventData(slides[index], customData)) && activate(index, customData); } else { return slides.indexOf(activeSlide); } }, writeURL = function (index) { window.location.hash = '#/' + index; }, step = function (offset, customData) { var slideIndex = slides.indexOf(activeSlide) + offset; fire(offset > 0 ? 'next' : 'prev', createEventData(activeSlide, customData)) && activate(slideIndex, customData); }, on = function (eventName, callback) { (listeners[eventName] || (listeners[eventName] = [])).push(callback); return function () { listeners[eventName] = listeners[eventName].filter(function (listener) { return listener !== callback; }); }; }, fire = function (eventName, eventData) { return (listeners[eventName] || []) .reduce(function (notCancelled, callback) { return notCancelled && callback(eventData) !== false; }, true); }, createEventData = function (el, eventData) { eventData = eventData || {}; eventData.index = slides.indexOf(el); eventData.slide = el; return eventData; }, deck = { on: on, fire: fire, slide: slide, next: step.bind(null, 1), prev: step.bind(null, -1), parent: parent, slides: slides, auto: false }; readURL(); window.slide = deck; return deck; }; EchoesWorks.prototype = EchoesWorks.extend(EchoesWorks.prototype, {slide: from});