From ed4cdaf9e796fadbf2b4f2f5e9240ac56091fb73 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sat, 21 Dec 2013 17:33:30 +0100 Subject: test isAutoSliding, isAutoSliding returns false when no autoSlide value is set #766 --- test/test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index f620b5b..93a4ae2 100644 --- a/test/test.js +++ b/test/test.js @@ -57,6 +57,16 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.isPaused(), false, 'false after resuming' ); }); + test( 'Reveal.isAutoSliding', function() { + strictEqual( Reveal.isAutoSliding(), false, 'false by default' ); + + Reveal.configure({ autoSlide: 10000 }); + strictEqual( Reveal.isAutoSliding(), true, 'true after starting' ); + + Reveal.configure({ autoSlide: 0 }); + strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' ); + }); + test( 'Reveal.isFirstSlide', function() { Reveal.slide( 0, 0 ); strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); -- cgit v1.2.3 From a97d73167d4dc52738e01f5ca5f2de74902276b6 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sat, 21 Dec 2013 17:54:21 +0100 Subject: simplify how data-autoslide is picked up from fragments #766 --- js/reveal.js | 10 +++------- js/reveal.min.js | 4 ++-- test/test.js | 4 ++++ 3 files changed, 9 insertions(+), 9 deletions(-) (limited to 'test/test.js') diff --git a/js/reveal.js b/js/reveal.js index 0de1d4d..be7b8a8 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -1456,6 +1456,7 @@ var Reveal = (function(){ */ function toggleAutoSlide( override ) { + if( typeof override === 'boolean' ) { override ? resumeAutoSlide() : pauseAutoSlide(); } @@ -2500,14 +2501,9 @@ var Reveal = (function(){ if( currentSlide ) { - var fragmentAutoSlide = null; - // it is assumed that any given data-autoslide value (for each of the current fragments) can be chosen - toArray( Reveal.getCurrentSlide().querySelectorAll( '.current-fragment' ) ).forEach( function( el ) { - if( el.hasAttribute( 'data-autoslide' ) ) { - fragmentAutoSlide = el.getAttribute( 'data-autoslide' ); - } - } ); + var currentFragment = currentSlide.querySelector( '.current-fragment' ); + var fragmentAutoSlide = currentFragment ? currentFragment.getAttribute( 'data-autoslide' ) : null; var parentAutoSlide = currentSlide.parentNode ? currentSlide.parentNode.getAttribute( 'data-autoslide' ) : null; var slideAutoSlide = currentSlide.getAttribute( 'data-autoslide' ); diff --git a/js/reveal.min.js b/js/reveal.min.js index 186ff7f..ccebcb1 100644 --- a/js/reveal.min.js +++ b/js/reveal.min.js @@ -1,9 +1,9 @@ /*! - * reveal.js 2.6.1 (2013-12-21, 17:31) + * reveal.js 2.6.1 (2013-12-21, 17:53) * http://lab.hakim.se/reveal-js * MIT licensed * * Copyright (C) 2013 Hakim El Hattab, http://hakim.se */ -var Reveal=function(){"use strict";function a(a){if(b(),!gc.transforms2d&&!gc.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",A,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,k(bc,a),k(bc,d),r(),c()}function b(){gc.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,gc.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,gc.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,gc.requestAnimationFrame="function"==typeof gc.requestAnimationFrameMethod,gc.canvas=!!document.createElement("canvas").getContext,Xb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=bc.dependencies.length;h>g;g++){var i=bc.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),S(),h(),eb(),Z(!0),setTimeout(function(){fc.slides.classList.remove("no-transition"),cc=!0,t("ready",{indexh:Sb,indexv:Tb,currentSlide:Vb})},1)}function e(){fc.theme=document.querySelector("#theme"),fc.wrapper=document.querySelector(".reveal"),fc.slides=document.querySelector(".reveal .slides"),fc.slides.classList.add("no-transition"),fc.background=f(fc.wrapper,"div","backgrounds",null),fc.progress=f(fc.wrapper,"div","progress",""),fc.progressbar=fc.progress.querySelector("span"),f(fc.wrapper,"aside","controls",''),fc.slideNumber=f(fc.wrapper,"div","slide-number",""),f(fc.wrapper,"div","state-background",null),f(fc.wrapper,"div","pause-overlay",null),fc.controls=document.querySelector(".reveal .controls"),fc.controlsLeft=l(document.querySelectorAll(".navigate-left")),fc.controlsRight=l(document.querySelectorAll(".navigate-right")),fc.controlsUp=l(document.querySelectorAll(".navigate-up")),fc.controlsDown=l(document.querySelectorAll(".navigate-down")),fc.controlsPrev=l(document.querySelectorAll(".navigate-prev")),fc.controlsNext=l(document.querySelectorAll(".navigate-next"))}function f(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function g(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}q()&&document.body.classList.add("print-pdf"),fc.background.innerHTML="",fc.background.classList.add("no-transition"),l(document.querySelectorAll($b)).forEach(function(b){var c;c=q()?a(b,b):a(b,fc.background),l(b.querySelectorAll("section")).forEach(function(b){q()?a(b,b):a(b,c)})}),bc.parallaxBackgroundImage?(fc.background.style.backgroundImage='url("'+bc.parallaxBackgroundImage+'")',fc.background.style.backgroundSize=bc.parallaxBackgroundSize,setTimeout(function(){fc.wrapper.classList.add("has-parallax-background")},1)):(fc.background.style.backgroundImage="",fc.wrapper.classList.remove("has-parallax-background"))}function h(a){var b=document.querySelectorAll(Zb).length;if(fc.wrapper.classList.remove(bc.transition),"object"==typeof a&&k(bc,a),gc.transforms3d===!1&&(bc.transition="linear"),fc.wrapper.classList.add(bc.transition),fc.wrapper.setAttribute("data-transition-speed",bc.transitionSpeed),fc.wrapper.setAttribute("data-background-transition",bc.backgroundTransition),fc.controls.style.display=bc.controls?"block":"none",fc.progress.style.display=bc.progress?"block":"none",bc.rtl?fc.wrapper.classList.add("rtl"):fc.wrapper.classList.remove("rtl"),bc.center?fc.wrapper.classList.add("center"):fc.wrapper.classList.remove("center"),bc.mouseWheel?(document.addEventListener("DOMMouseScroll",Db,!1),document.addEventListener("mousewheel",Db,!1)):(document.removeEventListener("DOMMouseScroll",Db,!1),document.removeEventListener("mousewheel",Db,!1)),bc.rollingLinks?u():v(),bc.previewLinks?w():(x(),w("[data-preview-link]")),b>1&&bc.autoSlide&&bc.autoSlideStoppable&&gc.canvas&&gc.requestAnimationFrame?(Yb=new Rb(fc.wrapper,function(){return Math.min(Math.max((Date.now()-oc)/mc,0),1)}),Yb.on("click",Qb),pc=!1):Yb&&(Yb.destroy(),Yb=null),bc.theme&&fc.theme){var c=fc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];bc.theme!==e&&(c=c.replace(d,bc.theme),fc.theme.setAttribute("href",c))}R()}function i(){if(lc=!0,window.addEventListener("hashchange",Lb,!1),window.addEventListener("resize",Mb,!1),bc.touch&&(fc.wrapper.addEventListener("touchstart",xb,!1),fc.wrapper.addEventListener("touchmove",yb,!1),fc.wrapper.addEventListener("touchend",zb,!1),window.navigator.pointerEnabled?(fc.wrapper.addEventListener("pointerdown",Ab,!1),fc.wrapper.addEventListener("pointermove",Bb,!1),fc.wrapper.addEventListener("pointerup",Cb,!1)):window.navigator.msPointerEnabled&&(fc.wrapper.addEventListener("MSPointerDown",Ab,!1),fc.wrapper.addEventListener("MSPointerMove",Bb,!1),fc.wrapper.addEventListener("MSPointerUp",Cb,!1))),bc.keyboard&&document.addEventListener("keydown",wb,!1),bc.progress&&fc.progress&&fc.progress.addEventListener("click",Eb,!1),bc.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Nb,!1)}["touchstart","click"].forEach(function(a){fc.controlsLeft.forEach(function(b){b.addEventListener(a,Fb,!1)}),fc.controlsRight.forEach(function(b){b.addEventListener(a,Gb,!1)}),fc.controlsUp.forEach(function(b){b.addEventListener(a,Hb,!1)}),fc.controlsDown.forEach(function(b){b.addEventListener(a,Ib,!1)}),fc.controlsPrev.forEach(function(b){b.addEventListener(a,Jb,!1)}),fc.controlsNext.forEach(function(b){b.addEventListener(a,Kb,!1)})})}function j(){lc=!1,document.removeEventListener("keydown",wb,!1),window.removeEventListener("hashchange",Lb,!1),window.removeEventListener("resize",Mb,!1),fc.wrapper.removeEventListener("touchstart",xb,!1),fc.wrapper.removeEventListener("touchmove",yb,!1),fc.wrapper.removeEventListener("touchend",zb,!1),window.navigator.pointerEnabled?(fc.wrapper.removeEventListener("pointerdown",Ab,!1),fc.wrapper.removeEventListener("pointermove",Bb,!1),fc.wrapper.removeEventListener("pointerup",Cb,!1)):window.navigator.msPointerEnabled&&(fc.wrapper.removeEventListener("MSPointerDown",Ab,!1),fc.wrapper.removeEventListener("MSPointerMove",Bb,!1),fc.wrapper.removeEventListener("MSPointerUp",Cb,!1)),bc.progress&&fc.progress&&fc.progress.removeEventListener("click",Eb,!1),["touchstart","click"].forEach(function(a){fc.controlsLeft.forEach(function(b){b.removeEventListener(a,Fb,!1)}),fc.controlsRight.forEach(function(b){b.removeEventListener(a,Gb,!1)}),fc.controlsUp.forEach(function(b){b.removeEventListener(a,Hb,!1)}),fc.controlsDown.forEach(function(b){b.removeEventListener(a,Ib,!1)}),fc.controlsPrev.forEach(function(b){b.removeEventListener(a,Jb,!1)}),fc.controlsNext.forEach(function(b){b.removeEventListener(a,Kb,!1)})})}function k(a,b){for(var c in b)a[c]=b[c]}function l(a){return Array.prototype.slice.call(a)}function m(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function n(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function o(a){var b=0;if(a){var c=0;l(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function p(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;l(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function q(){return/print-pdf/gi.test(window.location.search)}function r(){bc.hideAddressBar&&Xb&&(window.addEventListener("load",s,!1),window.addEventListener("orientationchange",s,!1))}function s(){setTimeout(function(){window.scrollTo(0,1)},10)}function t(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),k(c,b),fc.wrapper.dispatchEvent(c)}function u(){if(gc.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Zb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function v(){for(var a=document.querySelectorAll(Zb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function w(a){var b=l(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Pb,!1)})}function x(){var a=l(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Pb,!1)})}function y(a){z(),fc.preview=document.createElement("div"),fc.preview.classList.add("preview-link-overlay"),fc.wrapper.appendChild(fc.preview),fc.preview.innerHTML=["
",'','',"
",'
','
','',"
"].join(""),fc.preview.querySelector("iframe").addEventListener("load",function(){fc.preview.classList.add("loaded")},!1),fc.preview.querySelector(".close").addEventListener("click",function(a){z(),a.preventDefault()},!1),fc.preview.querySelector(".external").addEventListener("click",function(){z()},!1),setTimeout(function(){fc.preview.classList.add("visible")},1)}function z(){fc.preview&&(fc.preview.setAttribute("src",""),fc.preview.parentNode.removeChild(fc.preview),fc.preview=null)}function A(){if(fc.wrapper&&!q()){var a=fc.wrapper.offsetWidth,b=fc.wrapper.offsetHeight;a-=b*bc.margin,b-=b*bc.margin;var c=bc.width,d=bc.height,e=20;B(bc.width,bc.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),fc.slides.style.width=c+"px",fc.slides.style.height=d+"px",ec=Math.min(a/c,b/d),ec=Math.max(ec,bc.minScale),ec=Math.min(ec,bc.maxScale),"undefined"==typeof fc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?n(fc.slides,"translate(-50%, -50%) scale("+ec+") translate(50%, 50%)"):fc.slides.style.zoom=ec;for(var f=l(document.querySelectorAll(Zb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=bc.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(o(i)/2)-e,-d/2)+"px":"")}W(),$()}}function B(a,b,c){l(fc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=p(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function C(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function D(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function E(){if(bc.overview){mb();var a=fc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;fc.wrapper.classList.add("overview"),fc.wrapper.classList.remove("overview-deactivating"),clearTimeout(jc),clearTimeout(kc),jc=setTimeout(function(){for(var c=document.querySelectorAll($b),d=0,e=c.length;e>d;d++){var f=c[d],g=bc.rtl?-105:105;if(f.setAttribute("data-index-h",d),n(f,"translateZ(-"+b+"px) translate("+(d-Sb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Sb?Tb:D(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),n(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Ob,!0)}else f.addEventListener("click",Ob,!0)}V(),A(),a||t("overviewshown",{indexh:Sb,indexv:Tb,currentSlide:Vb})},10)}}function F(){bc.overview&&(clearTimeout(jc),clearTimeout(kc),fc.wrapper.classList.remove("overview"),fc.wrapper.classList.add("overview-deactivating"),kc=setTimeout(function(){fc.wrapper.classList.remove("overview-deactivating")},1),l(document.querySelectorAll(Zb)).forEach(function(a){n(a,""),a.removeEventListener("click",Ob,!0)}),Q(Sb,Tb),lb(),t("overviewhidden",{indexh:Sb,indexv:Tb,currentSlide:Vb}))}function G(a){"boolean"==typeof a?a?E():F():H()?F():E()}function H(){return fc.wrapper.classList.contains("overview")}function I(a){return a=a?a:Vb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function J(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function K(){var a=fc.wrapper.classList.contains("paused");mb(),fc.wrapper.classList.add("paused"),a===!1&&t("paused")}function L(){var a=fc.wrapper.classList.contains("paused");fc.wrapper.classList.remove("paused"),lb(),a&&t("resumed")}function M(){N()?L():K()}function N(){return fc.wrapper.classList.contains("paused")}function O(a){"boolean"==typeof a?a?ob():nb():pc?ob():nb()}function P(){return!(!mc||pc)}function Q(a,b,c,d){Ub=Vb;var e=document.querySelectorAll($b);void 0===b&&(b=D(e[a])),Ub&&Ub.parentNode&&Ub.parentNode.classList.contains("stack")&&C(Ub.parentNode,Tb);var f=dc.concat();dc.length=0;var g=Sb||0,h=Tb||0;Sb=U($b,void 0===a?Sb:a),Tb=U(_b,void 0===b?Tb:b),V(),A();a:for(var i=0,j=dc.length;j>i;i++){for(var k=0;k0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function T(){var a=l(document.querySelectorAll($b));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a){hb(a.querySelectorAll(".fragment"))}),0===b.length&&hb(a.querySelectorAll(".fragment"))})}function U(a,b){var c=l(document.querySelectorAll(a)),d=c.length;if(d){bc.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=bc.rtl&&!I(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=l(f.querySelectorAll(".fragment"));h.length;){var i=h.pop();i.classList.add("visible"),i.classList.remove("current-fragment")}}else if(e>b){f.classList.add(g?"past":"future");for(var j=l(f.querySelectorAll(".fragment.visible"));j.length;){var k=j.pop();k.classList.remove("visible"),k.classList.remove("current-fragment")}}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var m=c[b].getAttribute("data-state");m&&(dc=dc.concat(m.split(" ")))}else b=0;return b}function V(){var a,b,c=l(document.querySelectorAll($b)),d=c.length;if(d){var e=H()?10:bc.viewDistance;Xb&&(e=H()?6:1);for(var f=0;d>f;f++){var g=c[f],h=l(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Sb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=D(g),k=0;i>k;k++){var m=h[k];b=f===Sb?Math.abs(Tb-k):Math.abs(k-j),m.style.display=a+b>e?"none":"block"}}}}function W(){if(bc.progress&&fc.progress){var a=l(document.querySelectorAll($b)),b=document.querySelectorAll(Zb+":not(.stack)").length,c=0;a:for(var d=0;d0&&(a+=" - "+Tb),fc.slideNumber.innerHTML=a}}function Y(){var a=_(),b=ab();fc.controlsLeft.concat(fc.controlsRight).concat(fc.controlsUp).concat(fc.controlsDown).concat(fc.controlsPrev).concat(fc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&fc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&fc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&fc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&fc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&fc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&fc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Vb&&(b.prev&&fc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),I(Vb)?(b.prev&&fc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&fc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function Z(a){var b=null,c=bc.rtl?"future":"past",d=bc.rtl?"past":"future";if(l(fc.background.childNodes).forEach(function(e,f){Sb>f?e.className="slide-background "+c:f>Sb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Sb)&&l(e.childNodes).forEach(function(a,c){Tb>c?a.className="slide-background past":c>Tb?a.className="slide-background future":(a.className="slide-background present",f===Sb&&(b=a))})}),b){var e=Wb?Wb.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Wb&&fc.background.classList.add("no-transition"),Wb=b}setTimeout(function(){fc.background.classList.remove("no-transition")},1)}function $(){if(bc.parallaxBackgroundImage){var a,b,c=document.querySelectorAll($b),d=document.querySelectorAll(_b),e=fc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=fc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Sb,i=fc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Tb:0;fc.background.style.backgroundPosition=h+"px "+k+"px"}}function _(){var a=document.querySelectorAll($b),b=document.querySelectorAll(_b),c={left:Sb>0||bc.loop,right:Sb0,down:Tb0,next:!!b.length}}return{prev:!1,next:!1}}function bb(a){a&&!db()&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function cb(a){a&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function db(){return!!window.location.search.match(/receiver/gi)}function eb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);Q(e.h,e.v)}else Q(Sb||0,Tb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Sb||g!==Tb)&&Q(f,g)}}function fb(a){if(bc.history)if(clearTimeout(ic),"number"==typeof a)ic=setTimeout(fb,a);else{var b="/";Vb&&"string"==typeof Vb.getAttribute("id")?b="/"+Vb.getAttribute("id"):((Sb>0||Tb>0)&&(b+=Sb),Tb>0&&(b+="/"+Tb)),window.location.hash=b}}function gb(a){var b,c=Sb,d=Tb;if(a){var e=I(a),f=e?a.parentNode:a,g=l(document.querySelectorAll($b));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(l(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Vb){var h=Vb.querySelectorAll(".fragment").length>0;if(h){var i=Vb.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function hb(a){a=l(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function ib(a,b){if(Vb&&bc.fragments){var c=hb(Vb.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=hb(Vb.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return l(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&t("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&t("fragmentshown",{fragment:e[0],fragments:e}),Y(),!(!e.length&&!f.length)}}return!1}function jb(){return ib(null,1)}function kb(){return ib(null,-1)}function lb(){if(mb(),Vb){var a=null;l(Reveal.getCurrentSlide().querySelectorAll(".current-fragment")).forEach(function(b){b.hasAttribute("data-autoslide")&&(a=b.getAttribute("data-autoslide"))});var b=Vb.parentNode?Vb.parentNode.getAttribute("data-autoslide"):null,c=Vb.getAttribute("data-autoslide");mc=a?parseInt(a,10):c?parseInt(c,10):b?parseInt(b,10):bc.autoSlide,l(Vb.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&mc&&1e3*a.duration>mc&&(mc=1e3*a.duration+1e3)}),!mc||pc||N()||H()||Reveal.isLastSlide()&&bc.loop!==!0||(nc=setTimeout(ub,mc),oc=Date.now()),Yb&&Yb.setPlaying(-1!==nc)}}function mb(){clearTimeout(nc),nc=-1}function nb(){pc=!0,t("autoslidepaused"),clearTimeout(nc),Yb&&Yb.setPlaying(!1)}function ob(){pc=!1,t("autoslideresumed"),lb()}function pb(){bc.rtl?(H()||jb()===!1)&&_().left&&Q(Sb+1):(H()||kb()===!1)&&_().left&&Q(Sb-1)}function qb(){bc.rtl?(H()||kb()===!1)&&_().right&&Q(Sb-1):(H()||jb()===!1)&&_().right&&Q(Sb+1)}function rb(){(H()||kb()===!1)&&_().up&&Q(Sb,Tb-1)}function sb(){(H()||jb()===!1)&&_().down&&Q(Sb,Tb+1)}function tb(){if(kb()===!1)if(_().up)rb();else{var a=document.querySelector($b+".past:nth-child("+Sb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Sb-1;Q(c,b)}}}function ub(){jb()===!1&&(_().down?sb():qb()),lb()}function vb(){bc.autoSlideStoppable&&nb()}function wb(a){var b=pc;vb(a),document.activeElement;var c=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(c||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(N()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var d=!1;if("object"==typeof bc.keyboard)for(var e in bc.keyboard)if(parseInt(e,10)===a.keyCode){var f=bc.keyboard[e];"function"==typeof f?f.apply(null,[a]):"string"==typeof f&&"function"==typeof Reveal[f]&&Reveal[f].call(),d=!0}if(d===!1)switch(d=!0,a.keyCode){case 80:case 33:tb();break;case 78:case 34:ub();break;case 72:case 37:pb();break;case 76:case 39:qb();break;case 75:case 38:rb();break;case 74:case 40:sb();break;case 36:Q(0);break;case 35:Q(Number.MAX_VALUE);break;case 32:H()?F():a.shiftKey?tb():ub();break;case 13:H()?F():d=!1;break;case 66:case 190:case 191:M();break;case 70:J();break;case 65:bc.autoSlideStoppable&&O(b);break;default:d=!1}d?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!gc.transforms3d||(fc.preview?z():G(),a.preventDefault()),lb()}}function xb(a){qc.startX=a.touches[0].clientX,qc.startY=a.touches[0].clientY,qc.startCount=a.touches.length,2===a.touches.length&&bc.overview&&(qc.startSpan=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:qc.startX,y:qc.startY}))}function yb(a){if(qc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{vb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===qc.startCount&&bc.overview){var d=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:qc.startX,y:qc.startY});Math.abs(qc.startSpan-d)>qc.threshold&&(qc.captured=!0,dqc.threshold&&Math.abs(e)>Math.abs(f)?(qc.captured=!0,pb()):e<-qc.threshold&&Math.abs(e)>Math.abs(f)?(qc.captured=!0,qb()):f>qc.threshold?(qc.captured=!0,rb()):f<-qc.threshold&&(qc.captured=!0,sb()),bc.embedded?(qc.captured||I(Vb))&&a.preventDefault():a.preventDefault()}}}function zb(){qc.captured=!1}function Ab(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],xb(a))}function Bb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],yb(a))}function Cb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],zb(a))}function Db(a){if(Date.now()-hc>600){hc=Date.now();var b=a.detail||-a.wheelDelta;b>0?ub():tb()}}function Eb(a){vb(a),a.preventDefault();var b=l(document.querySelectorAll($b)).length,c=Math.floor(a.clientX/fc.wrapper.offsetWidth*b);Q(c)}function Fb(a){a.preventDefault(),vb(),pb()}function Gb(a){a.preventDefault(),vb(),qb()}function Hb(a){a.preventDefault(),vb(),rb()}function Ib(a){a.preventDefault(),vb(),sb()}function Jb(a){a.preventDefault(),vb(),tb()}function Kb(a){a.preventDefault(),vb(),ub()}function Lb(){eb()}function Mb(){A()}function Nb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Ob(a){if(lc&&H()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(F(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);Q(c,d)}}}function Pb(a){var b=a.target.getAttribute("href");b&&(y(b),a.preventDefault())}function Qb(){Reveal.isLastSlide()&&bc.loop===!1?(Q(0,0),ob()):pc?ob():nb()}function Rb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Sb,Tb,Ub,Vb,Wb,Xb,Yb,Zb=".reveal .slides section",$b=".reveal .slides>section",_b=".reveal .slides>section.present>section",ac=".reveal .slides>section:first-of-type",bc={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},cc=!1,dc=[],ec=1,fc={},gc={},hc=0,ic=0,jc=0,kc=0,lc=!1,mc=0,nc=0,oc=-1,pc=!1,qc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Rb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Rb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&gc.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Rb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore() +var Reveal=function(){"use strict";function a(a){if(b(),!gc.transforms2d&&!gc.transforms3d)return document.body.setAttribute("class","no-transforms"),void 0;window.addEventListener("load",A,!1);var d=Reveal.getQueryHash();"undefined"!=typeof d.dependencies&&delete d.dependencies,k(bc,a),k(bc,d),r(),c()}function b(){gc.transforms3d="WebkitPerspective"in document.body.style||"MozPerspective"in document.body.style||"msPerspective"in document.body.style||"OPerspective"in document.body.style||"perspective"in document.body.style,gc.transforms2d="WebkitTransform"in document.body.style||"MozTransform"in document.body.style||"msTransform"in document.body.style||"OTransform"in document.body.style||"transform"in document.body.style,gc.requestAnimationFrameMethod=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame,gc.requestAnimationFrame="function"==typeof gc.requestAnimationFrameMethod,gc.canvas=!!document.createElement("canvas").getContext,Xb=navigator.userAgent.match(/(iphone|ipod|android)/gi)}function c(){function a(){e.length&&head.js.apply(null,e),d()}function b(b){head.ready(b.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],function(){"function"==typeof b.callback&&b.callback.apply(this),0===--f&&a()})}for(var c=[],e=[],f=0,g=0,h=bc.dependencies.length;h>g;g++){var i=bc.dependencies[g];(!i.condition||i.condition())&&(i.async?e.push(i.src):c.push(i.src),b(i))}c.length?(f=c.length,head.js.apply(null,c)):a()}function d(){e(),S(),h(),eb(),Z(!0),setTimeout(function(){fc.slides.classList.remove("no-transition"),cc=!0,t("ready",{indexh:Sb,indexv:Tb,currentSlide:Vb})},1)}function e(){fc.theme=document.querySelector("#theme"),fc.wrapper=document.querySelector(".reveal"),fc.slides=document.querySelector(".reveal .slides"),fc.slides.classList.add("no-transition"),fc.background=f(fc.wrapper,"div","backgrounds",null),fc.progress=f(fc.wrapper,"div","progress",""),fc.progressbar=fc.progress.querySelector("span"),f(fc.wrapper,"aside","controls",''),fc.slideNumber=f(fc.wrapper,"div","slide-number",""),f(fc.wrapper,"div","state-background",null),f(fc.wrapper,"div","pause-overlay",null),fc.controls=document.querySelector(".reveal .controls"),fc.controlsLeft=l(document.querySelectorAll(".navigate-left")),fc.controlsRight=l(document.querySelectorAll(".navigate-right")),fc.controlsUp=l(document.querySelectorAll(".navigate-up")),fc.controlsDown=l(document.querySelectorAll(".navigate-down")),fc.controlsPrev=l(document.querySelectorAll(".navigate-prev")),fc.controlsNext=l(document.querySelectorAll(".navigate-next"))}function f(a,b,c,d){var e=a.querySelector("."+c);return e||(e=document.createElement(b),e.classList.add(c),null!==d&&(e.innerHTML=d),a.appendChild(e)),e}function g(){function a(a,b){var c={background:a.getAttribute("data-background"),backgroundSize:a.getAttribute("data-background-size"),backgroundImage:a.getAttribute("data-background-image"),backgroundColor:a.getAttribute("data-background-color"),backgroundRepeat:a.getAttribute("data-background-repeat"),backgroundPosition:a.getAttribute("data-background-position"),backgroundTransition:a.getAttribute("data-background-transition")},d=document.createElement("div");return d.className="slide-background",c.background&&(/^(http|file|\/\/)/gi.test(c.background)||/\.(svg|png|jpg|jpeg|gif|bmp)$/gi.test(c.background)?d.style.backgroundImage="url("+c.background+")":d.style.background=c.background),(c.background||c.backgroundColor||c.backgroundImage)&&d.setAttribute("data-background-hash",c.background+c.backgroundSize+c.backgroundImage+c.backgroundColor+c.backgroundRepeat+c.backgroundPosition+c.backgroundTransition),c.backgroundSize&&(d.style.backgroundSize=c.backgroundSize),c.backgroundImage&&(d.style.backgroundImage='url("'+c.backgroundImage+'")'),c.backgroundColor&&(d.style.backgroundColor=c.backgroundColor),c.backgroundRepeat&&(d.style.backgroundRepeat=c.backgroundRepeat),c.backgroundPosition&&(d.style.backgroundPosition=c.backgroundPosition),c.backgroundTransition&&d.setAttribute("data-background-transition",c.backgroundTransition),b.appendChild(d),d}q()&&document.body.classList.add("print-pdf"),fc.background.innerHTML="",fc.background.classList.add("no-transition"),l(document.querySelectorAll($b)).forEach(function(b){var c;c=q()?a(b,b):a(b,fc.background),l(b.querySelectorAll("section")).forEach(function(b){q()?a(b,b):a(b,c)})}),bc.parallaxBackgroundImage?(fc.background.style.backgroundImage='url("'+bc.parallaxBackgroundImage+'")',fc.background.style.backgroundSize=bc.parallaxBackgroundSize,setTimeout(function(){fc.wrapper.classList.add("has-parallax-background")},1)):(fc.background.style.backgroundImage="",fc.wrapper.classList.remove("has-parallax-background"))}function h(a){var b=document.querySelectorAll(Zb).length;if(fc.wrapper.classList.remove(bc.transition),"object"==typeof a&&k(bc,a),gc.transforms3d===!1&&(bc.transition="linear"),fc.wrapper.classList.add(bc.transition),fc.wrapper.setAttribute("data-transition-speed",bc.transitionSpeed),fc.wrapper.setAttribute("data-background-transition",bc.backgroundTransition),fc.controls.style.display=bc.controls?"block":"none",fc.progress.style.display=bc.progress?"block":"none",bc.rtl?fc.wrapper.classList.add("rtl"):fc.wrapper.classList.remove("rtl"),bc.center?fc.wrapper.classList.add("center"):fc.wrapper.classList.remove("center"),bc.mouseWheel?(document.addEventListener("DOMMouseScroll",Db,!1),document.addEventListener("mousewheel",Db,!1)):(document.removeEventListener("DOMMouseScroll",Db,!1),document.removeEventListener("mousewheel",Db,!1)),bc.rollingLinks?u():v(),bc.previewLinks?w():(x(),w("[data-preview-link]")),b>1&&bc.autoSlide&&bc.autoSlideStoppable&&gc.canvas&&gc.requestAnimationFrame?(Yb=new Rb(fc.wrapper,function(){return Math.min(Math.max((Date.now()-oc)/mc,0),1)}),Yb.on("click",Qb),pc=!1):Yb&&(Yb.destroy(),Yb=null),bc.theme&&fc.theme){var c=fc.theme.getAttribute("href"),d=/[^\/]*?(?=\.css)/,e=c.match(d)[0];bc.theme!==e&&(c=c.replace(d,bc.theme),fc.theme.setAttribute("href",c))}R()}function i(){if(lc=!0,window.addEventListener("hashchange",Lb,!1),window.addEventListener("resize",Mb,!1),bc.touch&&(fc.wrapper.addEventListener("touchstart",xb,!1),fc.wrapper.addEventListener("touchmove",yb,!1),fc.wrapper.addEventListener("touchend",zb,!1),window.navigator.pointerEnabled?(fc.wrapper.addEventListener("pointerdown",Ab,!1),fc.wrapper.addEventListener("pointermove",Bb,!1),fc.wrapper.addEventListener("pointerup",Cb,!1)):window.navigator.msPointerEnabled&&(fc.wrapper.addEventListener("MSPointerDown",Ab,!1),fc.wrapper.addEventListener("MSPointerMove",Bb,!1),fc.wrapper.addEventListener("MSPointerUp",Cb,!1))),bc.keyboard&&document.addEventListener("keydown",wb,!1),bc.progress&&fc.progress&&fc.progress.addEventListener("click",Eb,!1),bc.focusBodyOnPageVisiblityChange){var a;"hidden"in document?a="visibilitychange":"msHidden"in document?a="msvisibilitychange":"webkitHidden"in document&&(a="webkitvisibilitychange"),a&&document.addEventListener(a,Nb,!1)}["touchstart","click"].forEach(function(a){fc.controlsLeft.forEach(function(b){b.addEventListener(a,Fb,!1)}),fc.controlsRight.forEach(function(b){b.addEventListener(a,Gb,!1)}),fc.controlsUp.forEach(function(b){b.addEventListener(a,Hb,!1)}),fc.controlsDown.forEach(function(b){b.addEventListener(a,Ib,!1)}),fc.controlsPrev.forEach(function(b){b.addEventListener(a,Jb,!1)}),fc.controlsNext.forEach(function(b){b.addEventListener(a,Kb,!1)})})}function j(){lc=!1,document.removeEventListener("keydown",wb,!1),window.removeEventListener("hashchange",Lb,!1),window.removeEventListener("resize",Mb,!1),fc.wrapper.removeEventListener("touchstart",xb,!1),fc.wrapper.removeEventListener("touchmove",yb,!1),fc.wrapper.removeEventListener("touchend",zb,!1),window.navigator.pointerEnabled?(fc.wrapper.removeEventListener("pointerdown",Ab,!1),fc.wrapper.removeEventListener("pointermove",Bb,!1),fc.wrapper.removeEventListener("pointerup",Cb,!1)):window.navigator.msPointerEnabled&&(fc.wrapper.removeEventListener("MSPointerDown",Ab,!1),fc.wrapper.removeEventListener("MSPointerMove",Bb,!1),fc.wrapper.removeEventListener("MSPointerUp",Cb,!1)),bc.progress&&fc.progress&&fc.progress.removeEventListener("click",Eb,!1),["touchstart","click"].forEach(function(a){fc.controlsLeft.forEach(function(b){b.removeEventListener(a,Fb,!1)}),fc.controlsRight.forEach(function(b){b.removeEventListener(a,Gb,!1)}),fc.controlsUp.forEach(function(b){b.removeEventListener(a,Hb,!1)}),fc.controlsDown.forEach(function(b){b.removeEventListener(a,Ib,!1)}),fc.controlsPrev.forEach(function(b){b.removeEventListener(a,Jb,!1)}),fc.controlsNext.forEach(function(b){b.removeEventListener(a,Kb,!1)})})}function k(a,b){for(var c in b)a[c]=b[c]}function l(a){return Array.prototype.slice.call(a)}function m(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function n(a,b){a.style.WebkitTransform=b,a.style.MozTransform=b,a.style.msTransform=b,a.style.OTransform=b,a.style.transform=b}function o(a){var b=0;if(a){var c=0;l(a.childNodes).forEach(function(a){"number"==typeof a.offsetTop&&a.style&&("absolute"===a.style.position&&(c+=1),b=Math.max(b,a.offsetTop+a.offsetHeight))}),0===c&&(b=a.offsetHeight)}return b}function p(a,b){if(b=b||0,a){var c=a.parentNode,d=c.childNodes;l(d).forEach(function(c){if("number"==typeof c.offsetHeight&&c!==a){var d=window.getComputedStyle(c),e=parseInt(d.marginTop,10),f=parseInt(d.marginBottom,10);b-=c.offsetHeight+e+f}});var e=window.getComputedStyle(a);b-=parseInt(e.marginTop,10)+parseInt(e.marginBottom,10)}return b}function q(){return/print-pdf/gi.test(window.location.search)}function r(){bc.hideAddressBar&&Xb&&(window.addEventListener("load",s,!1),window.addEventListener("orientationchange",s,!1))}function s(){setTimeout(function(){window.scrollTo(0,1)},10)}function t(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),k(c,b),fc.wrapper.dispatchEvent(c)}function u(){if(gc.transforms3d&&!("msPerspective"in document.body.style))for(var a=document.querySelectorAll(Zb+" a:not(.image)"),b=0,c=a.length;c>b;b++){var d=a[b];if(!(!d.textContent||d.querySelector("*")||d.className&&d.classList.contains(d,"roll"))){var e=document.createElement("span");e.setAttribute("data-title",d.text),e.innerHTML=d.innerHTML,d.classList.add("roll"),d.innerHTML="",d.appendChild(e)}}}function v(){for(var a=document.querySelectorAll(Zb+" a.roll"),b=0,c=a.length;c>b;b++){var d=a[b],e=d.querySelector("span");e&&(d.classList.remove("roll"),d.innerHTML=e.innerHTML)}}function w(a){var b=l(document.querySelectorAll(a?a:"a"));b.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.addEventListener("click",Pb,!1)})}function x(){var a=l(document.querySelectorAll("a"));a.forEach(function(a){/^(http|www)/gi.test(a.getAttribute("href"))&&a.removeEventListener("click",Pb,!1)})}function y(a){z(),fc.preview=document.createElement("div"),fc.preview.classList.add("preview-link-overlay"),fc.wrapper.appendChild(fc.preview),fc.preview.innerHTML=["
",'','',"
",'
','
','',"
"].join(""),fc.preview.querySelector("iframe").addEventListener("load",function(){fc.preview.classList.add("loaded")},!1),fc.preview.querySelector(".close").addEventListener("click",function(a){z(),a.preventDefault()},!1),fc.preview.querySelector(".external").addEventListener("click",function(){z()},!1),setTimeout(function(){fc.preview.classList.add("visible")},1)}function z(){fc.preview&&(fc.preview.setAttribute("src",""),fc.preview.parentNode.removeChild(fc.preview),fc.preview=null)}function A(){if(fc.wrapper&&!q()){var a=fc.wrapper.offsetWidth,b=fc.wrapper.offsetHeight;a-=b*bc.margin,b-=b*bc.margin;var c=bc.width,d=bc.height,e=20;B(bc.width,bc.height,e),"string"==typeof c&&/%$/.test(c)&&(c=parseInt(c,10)/100*a),"string"==typeof d&&/%$/.test(d)&&(d=parseInt(d,10)/100*b),fc.slides.style.width=c+"px",fc.slides.style.height=d+"px",ec=Math.min(a/c,b/d),ec=Math.max(ec,bc.minScale),ec=Math.min(ec,bc.maxScale),"undefined"==typeof fc.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)?n(fc.slides,"translate(-50%, -50%) scale("+ec+") translate(50%, 50%)"):fc.slides.style.zoom=ec;for(var f=l(document.querySelectorAll(Zb)),g=0,h=f.length;h>g;g++){var i=f[g];"none"!==i.style.display&&(i.style.top=bc.center||i.classList.contains("center")?i.classList.contains("stack")?0:Math.max(-(o(i)/2)-e,-d/2)+"px":"")}W(),$()}}function B(a,b,c){l(fc.slides.querySelectorAll("section > .stretch")).forEach(function(d){var e=p(d,b-2*c);if(/(img|video)/gi.test(d.nodeName)){var f=d.naturalWidth||d.videoWidth,g=d.naturalHeight||d.videoHeight,h=Math.min(a/f,e/g);d.style.width=f*h+"px",d.style.height=g*h+"px"}else d.style.width=a+"px",d.style.height=e+"px"})}function C(a,b){"object"==typeof a&&"function"==typeof a.setAttribute&&a.setAttribute("data-previous-indexv",b||0)}function D(a){if("object"==typeof a&&"function"==typeof a.setAttribute&&a.classList.contains("stack")){var b=a.hasAttribute("data-start-indexv")?"data-start-indexv":"data-previous-indexv";return parseInt(a.getAttribute(b)||0,10)}return 0}function E(){if(bc.overview){mb();var a=fc.wrapper.classList.contains("overview"),b=window.innerWidth<400?1e3:2500;fc.wrapper.classList.add("overview"),fc.wrapper.classList.remove("overview-deactivating"),clearTimeout(jc),clearTimeout(kc),jc=setTimeout(function(){for(var c=document.querySelectorAll($b),d=0,e=c.length;e>d;d++){var f=c[d],g=bc.rtl?-105:105;if(f.setAttribute("data-index-h",d),n(f,"translateZ(-"+b+"px) translate("+(d-Sb)*g+"%, 0%)"),f.classList.contains("stack"))for(var h=f.querySelectorAll("section"),i=0,j=h.length;j>i;i++){var k=d===Sb?Tb:D(f),l=h[i];l.setAttribute("data-index-h",d),l.setAttribute("data-index-v",i),n(l,"translate(0%, "+105*(i-k)+"%)"),l.addEventListener("click",Ob,!0)}else f.addEventListener("click",Ob,!0)}V(),A(),a||t("overviewshown",{indexh:Sb,indexv:Tb,currentSlide:Vb})},10)}}function F(){bc.overview&&(clearTimeout(jc),clearTimeout(kc),fc.wrapper.classList.remove("overview"),fc.wrapper.classList.add("overview-deactivating"),kc=setTimeout(function(){fc.wrapper.classList.remove("overview-deactivating")},1),l(document.querySelectorAll(Zb)).forEach(function(a){n(a,""),a.removeEventListener("click",Ob,!0)}),Q(Sb,Tb),lb(),t("overviewhidden",{indexh:Sb,indexv:Tb,currentSlide:Vb}))}function G(a){"boolean"==typeof a?a?E():F():H()?F():E()}function H(){return fc.wrapper.classList.contains("overview")}function I(a){return a=a?a:Vb,a&&a.parentNode&&!!a.parentNode.nodeName.match(/section/i)}function J(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullscreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function K(){var a=fc.wrapper.classList.contains("paused");mb(),fc.wrapper.classList.add("paused"),a===!1&&t("paused")}function L(){var a=fc.wrapper.classList.contains("paused");fc.wrapper.classList.remove("paused"),lb(),a&&t("resumed")}function M(){N()?L():K()}function N(){return fc.wrapper.classList.contains("paused")}function O(a){"boolean"==typeof a?a?ob():nb():pc?ob():nb()}function P(){return!(!mc||pc)}function Q(a,b,c,d){Ub=Vb;var e=document.querySelectorAll($b);void 0===b&&(b=D(e[a])),Ub&&Ub.parentNode&&Ub.parentNode.classList.contains("stack")&&C(Ub.parentNode,Tb);var f=dc.concat();dc.length=0;var g=Sb||0,h=Tb||0;Sb=U($b,void 0===a?Sb:a),Tb=U(_b,void 0===b?Tb:b),V(),A();a:for(var i=0,j=dc.length;j>i;i++){for(var k=0;k0&&(a.classList.remove("present"),a.classList.remove("past"),a.classList.add("future"))})})}function T(){var a=l(document.querySelectorAll($b));a.forEach(function(a){var b=l(a.querySelectorAll("section"));b.forEach(function(a){hb(a.querySelectorAll(".fragment"))}),0===b.length&&hb(a.querySelectorAll(".fragment"))})}function U(a,b){var c=l(document.querySelectorAll(a)),d=c.length;if(d){bc.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var e=0;d>e;e++){var f=c[e],g=bc.rtl&&!I(f);if(f.classList.remove("past"),f.classList.remove("present"),f.classList.remove("future"),f.setAttribute("hidden",""),b>e){f.classList.add(g?"future":"past");for(var h=l(f.querySelectorAll(".fragment"));h.length;){var i=h.pop();i.classList.add("visible"),i.classList.remove("current-fragment")}}else if(e>b){f.classList.add(g?"past":"future");for(var j=l(f.querySelectorAll(".fragment.visible"));j.length;){var k=j.pop();k.classList.remove("visible"),k.classList.remove("current-fragment")}}f.querySelector("section")&&f.classList.add("stack")}c[b].classList.add("present"),c[b].removeAttribute("hidden");var m=c[b].getAttribute("data-state");m&&(dc=dc.concat(m.split(" ")))}else b=0;return b}function V(){var a,b,c=l(document.querySelectorAll($b)),d=c.length;if(d){var e=H()?10:bc.viewDistance;Xb&&(e=H()?6:1);for(var f=0;d>f;f++){var g=c[f],h=l(g.querySelectorAll("section")),i=h.length;if(a=Math.abs((Sb-f)%(d-e))||0,g.style.display=a>e?"none":"block",i)for(var j=D(g),k=0;i>k;k++){var m=h[k];b=f===Sb?Math.abs(Tb-k):Math.abs(k-j),m.style.display=a+b>e?"none":"block"}}}}function W(){if(bc.progress&&fc.progress){var a=l(document.querySelectorAll($b)),b=document.querySelectorAll(Zb+":not(.stack)").length,c=0;a:for(var d=0;d0&&(a+=" - "+Tb),fc.slideNumber.innerHTML=a}}function Y(){var a=_(),b=ab();fc.controlsLeft.concat(fc.controlsRight).concat(fc.controlsUp).concat(fc.controlsDown).concat(fc.controlsPrev).concat(fc.controlsNext).forEach(function(a){a.classList.remove("enabled"),a.classList.remove("fragmented")}),a.left&&fc.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&fc.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&fc.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&fc.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&fc.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&fc.controlsNext.forEach(function(a){a.classList.add("enabled")}),Vb&&(b.prev&&fc.controlsPrev.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsNext.forEach(function(a){a.classList.add("fragmented","enabled")}),I(Vb)?(b.prev&&fc.controlsUp.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsDown.forEach(function(a){a.classList.add("fragmented","enabled")})):(b.prev&&fc.controlsLeft.forEach(function(a){a.classList.add("fragmented","enabled")}),b.next&&fc.controlsRight.forEach(function(a){a.classList.add("fragmented","enabled")})))}function Z(a){var b=null,c=bc.rtl?"future":"past",d=bc.rtl?"past":"future";if(l(fc.background.childNodes).forEach(function(e,f){Sb>f?e.className="slide-background "+c:f>Sb?e.className="slide-background "+d:(e.className="slide-background present",b=e),(a||f===Sb)&&l(e.childNodes).forEach(function(a,c){Tb>c?a.className="slide-background past":c>Tb?a.className="slide-background future":(a.className="slide-background present",f===Sb&&(b=a))})}),b){var e=Wb?Wb.getAttribute("data-background-hash"):null,f=b.getAttribute("data-background-hash");f&&f===e&&b!==Wb&&fc.background.classList.add("no-transition"),Wb=b}setTimeout(function(){fc.background.classList.remove("no-transition")},1)}function $(){if(bc.parallaxBackgroundImage){var a,b,c=document.querySelectorAll($b),d=document.querySelectorAll(_b),e=fc.background.style.backgroundSize.split(" ");1===e.length?a=b=parseInt(e[0],10):(a=parseInt(e[0],10),b=parseInt(e[1],10));var f=fc.background.offsetWidth,g=c.length,h=-(a-f)/(g-1)*Sb,i=fc.background.offsetHeight,j=d.length,k=j>0?-(b-i)/(j-1)*Tb:0;fc.background.style.backgroundPosition=h+"px "+k+"px"}}function _(){var a=document.querySelectorAll($b),b=document.querySelectorAll(_b),c={left:Sb>0||bc.loop,right:Sb0,down:Tb0,next:!!b.length}}return{prev:!1,next:!1}}function bb(a){a&&!db()&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&a.play()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:start","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-autoplay")&&a.contentWindow.postMessage('{"event":"command","func":"playVideo","args":""}',"*")}))}function cb(a){a&&(l(a.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-ignore")||a.pause()}),l(a.querySelectorAll("iframe")).forEach(function(a){a.contentWindow.postMessage("slide:stop","*")}),l(a.querySelectorAll('iframe[src*="youtube.com/embed/"]')).forEach(function(a){a.hasAttribute("data-ignore")||"function"!=typeof a.contentWindow.postMessage||a.contentWindow.postMessage('{"event":"command","func":"pauseVideo","args":""}',"*")}))}function db(){return!!window.location.search.match(/receiver/gi)}function eb(){var a=window.location.hash,b=a.slice(2).split("/"),c=a.replace(/#|\//gi,"");if(isNaN(parseInt(b[0],10))&&c.length){var d=document.querySelector("#"+c);if(d){var e=Reveal.getIndices(d);Q(e.h,e.v)}else Q(Sb||0,Tb||0)}else{var f=parseInt(b[0],10)||0,g=parseInt(b[1],10)||0;(f!==Sb||g!==Tb)&&Q(f,g)}}function fb(a){if(bc.history)if(clearTimeout(ic),"number"==typeof a)ic=setTimeout(fb,a);else{var b="/";Vb&&"string"==typeof Vb.getAttribute("id")?b="/"+Vb.getAttribute("id"):((Sb>0||Tb>0)&&(b+=Sb),Tb>0&&(b+="/"+Tb)),window.location.hash=b}}function gb(a){var b,c=Sb,d=Tb;if(a){var e=I(a),f=e?a.parentNode:a,g=l(document.querySelectorAll($b));c=Math.max(g.indexOf(f),0),e&&(d=Math.max(l(a.parentNode.querySelectorAll("section")).indexOf(a),0))}if(!a&&Vb){var h=Vb.querySelectorAll(".fragment").length>0;if(h){var i=Vb.querySelectorAll(".fragment.visible");b=i.length-1}}return{h:c,v:d,f:b}}function hb(a){a=l(a);var b=[],c=[],d=[];a.forEach(function(a){if(a.hasAttribute("data-fragment-index")){var d=parseInt(a.getAttribute("data-fragment-index"),10);b[d]||(b[d]=[]),b[d].push(a)}else c.push([a])}),b=b.concat(c);var e=0;return b.forEach(function(a){a.forEach(function(a){d.push(a),a.setAttribute("data-fragment-index",e)}),e++}),d}function ib(a,b){if(Vb&&bc.fragments){var c=hb(Vb.querySelectorAll(".fragment"));if(c.length){if("number"!=typeof a){var d=hb(Vb.querySelectorAll(".fragment.visible")).pop();a=d?parseInt(d.getAttribute("data-fragment-index")||0,10):-1}"number"==typeof b&&(a+=b);var e=[],f=[];return l(c).forEach(function(b,c){b.hasAttribute("data-fragment-index")&&(c=parseInt(b.getAttribute("data-fragment-index"),10)),a>=c?(b.classList.contains("visible")||e.push(b),b.classList.add("visible"),b.classList.remove("current-fragment"),c===a&&b.classList.add("current-fragment")):(b.classList.contains("visible")&&f.push(b),b.classList.remove("visible"),b.classList.remove("current-fragment"))}),f.length&&t("fragmenthidden",{fragment:f[0],fragments:f}),e.length&&t("fragmentshown",{fragment:e[0],fragments:e}),Y(),!(!e.length&&!f.length)}}return!1}function jb(){return ib(null,1)}function kb(){return ib(null,-1)}function lb(){if(mb(),Vb){var a=Vb.querySelector(".current-fragment"),b=a?a.getAttribute("data-autoslide"):null,c=Vb.parentNode?Vb.parentNode.getAttribute("data-autoslide"):null,d=Vb.getAttribute("data-autoslide");mc=b?parseInt(b,10):d?parseInt(d,10):c?parseInt(c,10):bc.autoSlide,l(Vb.querySelectorAll("video, audio")).forEach(function(a){a.hasAttribute("data-autoplay")&&mc&&1e3*a.duration>mc&&(mc=1e3*a.duration+1e3)}),!mc||pc||N()||H()||Reveal.isLastSlide()&&bc.loop!==!0||(nc=setTimeout(ub,mc),oc=Date.now()),Yb&&Yb.setPlaying(-1!==nc)}}function mb(){clearTimeout(nc),nc=-1}function nb(){pc=!0,t("autoslidepaused"),clearTimeout(nc),Yb&&Yb.setPlaying(!1)}function ob(){pc=!1,t("autoslideresumed"),lb()}function pb(){bc.rtl?(H()||jb()===!1)&&_().left&&Q(Sb+1):(H()||kb()===!1)&&_().left&&Q(Sb-1)}function qb(){bc.rtl?(H()||kb()===!1)&&_().right&&Q(Sb-1):(H()||jb()===!1)&&_().right&&Q(Sb+1)}function rb(){(H()||kb()===!1)&&_().up&&Q(Sb,Tb-1)}function sb(){(H()||jb()===!1)&&_().down&&Q(Sb,Tb+1)}function tb(){if(kb()===!1)if(_().up)rb();else{var a=document.querySelector($b+".past:nth-child("+Sb+")");if(a){var b=a.querySelectorAll("section").length-1||void 0,c=Sb-1;Q(c,b)}}}function ub(){jb()===!1&&(_().down?sb():qb()),lb()}function vb(){bc.autoSlideStoppable&&nb()}function wb(a){var b=pc;vb(a),document.activeElement;var c=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(c||a.shiftKey&&32!==a.keyCode||a.altKey||a.ctrlKey||a.metaKey)){if(N()&&-1===[66,190,191].indexOf(a.keyCode))return!1;var d=!1;if("object"==typeof bc.keyboard)for(var e in bc.keyboard)if(parseInt(e,10)===a.keyCode){var f=bc.keyboard[e];"function"==typeof f?f.apply(null,[a]):"string"==typeof f&&"function"==typeof Reveal[f]&&Reveal[f].call(),d=!0}if(d===!1)switch(d=!0,a.keyCode){case 80:case 33:tb();break;case 78:case 34:ub();break;case 72:case 37:pb();break;case 76:case 39:qb();break;case 75:case 38:rb();break;case 74:case 40:sb();break;case 36:Q(0);break;case 35:Q(Number.MAX_VALUE);break;case 32:H()?F():a.shiftKey?tb():ub();break;case 13:H()?F():d=!1;break;case 66:case 190:case 191:M();break;case 70:J();break;case 65:bc.autoSlideStoppable&&O(b);break;default:d=!1}d?a.preventDefault():27!==a.keyCode&&79!==a.keyCode||!gc.transforms3d||(fc.preview?z():G(),a.preventDefault()),lb()}}function xb(a){qc.startX=a.touches[0].clientX,qc.startY=a.touches[0].clientY,qc.startCount=a.touches.length,2===a.touches.length&&bc.overview&&(qc.startSpan=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:qc.startX,y:qc.startY}))}function yb(a){if(qc.captured)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{vb(a);var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===qc.startCount&&bc.overview){var d=m({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:qc.startX,y:qc.startY});Math.abs(qc.startSpan-d)>qc.threshold&&(qc.captured=!0,dqc.threshold&&Math.abs(e)>Math.abs(f)?(qc.captured=!0,pb()):e<-qc.threshold&&Math.abs(e)>Math.abs(f)?(qc.captured=!0,qb()):f>qc.threshold?(qc.captured=!0,rb()):f<-qc.threshold&&(qc.captured=!0,sb()),bc.embedded?(qc.captured||I(Vb))&&a.preventDefault():a.preventDefault()}}}function zb(){qc.captured=!1}function Ab(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],xb(a))}function Bb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],yb(a))}function Cb(a){(a.pointerType===a.MSPOINTER_TYPE_TOUCH||"touch"===a.pointerType)&&(a.touches=[{clientX:a.clientX,clientY:a.clientY}],zb(a))}function Db(a){if(Date.now()-hc>600){hc=Date.now();var b=a.detail||-a.wheelDelta;b>0?ub():tb()}}function Eb(a){vb(a),a.preventDefault();var b=l(document.querySelectorAll($b)).length,c=Math.floor(a.clientX/fc.wrapper.offsetWidth*b);Q(c)}function Fb(a){a.preventDefault(),vb(),pb()}function Gb(a){a.preventDefault(),vb(),qb()}function Hb(a){a.preventDefault(),vb(),rb()}function Ib(a){a.preventDefault(),vb(),sb()}function Jb(a){a.preventDefault(),vb(),tb()}function Kb(a){a.preventDefault(),vb(),ub()}function Lb(){eb()}function Mb(){A()}function Nb(){var a=document.webkitHidden||document.msHidden||document.hidden;a===!1&&document.activeElement!==document.body&&(document.activeElement.blur(),document.body.focus())}function Ob(a){if(lc&&H()){a.preventDefault();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b&&!b.classList.contains("disabled")&&(F(),b.nodeName.match(/section/gi))){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);Q(c,d)}}}function Pb(a){var b=a.target.getAttribute("href");b&&(y(b),a.preventDefault())}function Qb(){Reveal.isLastSlide()&&bc.loop===!1?(Q(0,0),ob()):pc?ob():nb()}function Rb(a,b){this.diameter=50,this.thickness=3,this.playing=!1,this.progress=0,this.progressOffset=1,this.container=a,this.progressCheck=b,this.canvas=document.createElement("canvas"),this.canvas.className="playback",this.canvas.width=this.diameter,this.canvas.height=this.diameter,this.context=this.canvas.getContext("2d"),this.container.appendChild(this.canvas),this.render()}var Sb,Tb,Ub,Vb,Wb,Xb,Yb,Zb=".reveal .slides section",$b=".reveal .slides>section",_b=".reveal .slides>section.present>section",ac=".reveal .slides>section:first-of-type",bc={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,slideNumber:!1,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,fragments:!0,embedded:!1,autoSlide:0,autoSlideStoppable:!0,mouseWheel:!1,rollingLinks:!1,hideAddressBar:!0,previewLinks:!1,focusBodyOnPageVisiblityChange:!0,theme:null,transition:"default",transitionSpeed:"default",backgroundTransition:"default",parallaxBackgroundImage:"",parallaxBackgroundSize:"",viewDistance:3,dependencies:[]},cc=!1,dc=[],ec=1,fc={},gc={},hc=0,ic=0,jc=0,kc=0,lc=!1,mc=0,nc=0,oc=-1,pc=!1,qc={startX:0,startY:0,startSpan:0,startCount:0,captured:!1,threshold:40};return Rb.prototype.setPlaying=function(a){var b=this.playing;this.playing=a,!b&&this.playing?this.animate():this.render()},Rb.prototype.animate=function(){var a=this.progress;this.progress=this.progressCheck(),a>.8&&this.progress<.2&&(this.progressOffset=this.progress),this.render(),this.playing&&gc.requestAnimationFrameMethod.call(window,this.animate.bind(this))},Rb.prototype.render=function(){var a=this.playing?this.progress:0,b=this.diameter/2-this.thickness,c=this.diameter/2,d=this.diameter/2,e=14;this.progressOffset+=.1*(1-this.progressOffset);var f=-Math.PI/2+a*2*Math.PI,g=-Math.PI/2+this.progressOffset*2*Math.PI;this.context.save(),this.context.clearRect(0,0,this.diameter,this.diameter),this.context.beginPath(),this.context.arc(c,d,b+2,0,2*Math.PI,!1),this.context.fillStyle="rgba( 0, 0, 0, 0.4 )",this.context.fill(),this.context.beginPath(),this.context.arc(c,d,b,0,2*Math.PI,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#666",this.context.stroke(),this.playing&&(this.context.beginPath(),this.context.arc(c,d,b,g,f,!1),this.context.lineWidth=this.thickness,this.context.strokeStyle="#fff",this.context.stroke()),this.context.translate(c-e/2,d-e/2),this.playing?(this.context.fillStyle="#fff",this.context.fillRect(0,0,e/2-2,e),this.context.fillRect(e/2+2,0,e/2-2,e)):(this.context.beginPath(),this.context.translate(2,0),this.context.moveTo(0,0),this.context.lineTo(e-2,e/2),this.context.lineTo(0,e),this.context.fillStyle="#fff",this.context.fill()),this.context.restore() },Rb.prototype.on=function(a,b){this.canvas.addEventListener(a,b,!1)},Rb.prototype.off=function(a,b){this.canvas.removeEventListener(a,b,!1)},Rb.prototype.destroy=function(){this.playing=!1,this.canvas.parentNode&&this.container.removeChild(this.canvas)},{initialize:a,configure:h,sync:R,slide:Q,left:pb,right:qb,up:rb,down:sb,prev:tb,next:ub,navigateFragment:ib,prevFragment:kb,nextFragment:jb,navigateTo:Q,navigateLeft:pb,navigateRight:qb,navigateUp:rb,navigateDown:sb,navigatePrev:tb,navigateNext:ub,layout:A,availableRoutes:_,availableFragments:ab,toggleOverview:G,togglePause:M,toggleAutoSlide:O,isOverview:H,isPaused:N,isAutoSliding:P,addEventListeners:i,removeEventListeners:j,getIndices:gb,getSlide:function(a,b){var c=document.querySelectorAll($b)[a],d=c&&c.querySelectorAll("section");return"undefined"!=typeof b?d?d[b]:void 0:c},getPreviousSlide:function(){return Ub},getCurrentSlide:function(){return Vb},getScale:function(){return ec},getConfig:function(){return bc},getQueryHash:function(){var a={};location.search.replace(/[A-Z0-9]+?=([\w\.%-]*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()});for(var b in a){var c=a[b];a[b]=unescape(c),"null"===c?a[b]=null:"true"===c?a[b]=!0:"false"===c?a[b]=!1:c.match(/^\d+$/)&&(a[b]=parseFloat(c))}return a},isFirstSlide:function(){return null==document.querySelector(Zb+".past")?!0:!1},isLastSlide:function(){return Vb?Vb.nextElementSibling?!1:I(Vb)&&Vb.parentNode.nextElementSibling?!1:!0:!1},isReady:function(){return cc},addEventListener:function(a,b,c){"addEventListener"in window&&(fc.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(fc.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}(); \ No newline at end of file diff --git a/test/test.js b/test/test.js index 93a4ae2..23c0aff 100644 --- a/test/test.js +++ b/test/test.js @@ -63,6 +63,10 @@ Reveal.addEventListener( 'ready', function() { Reveal.configure({ autoSlide: 10000 }); strictEqual( Reveal.isAutoSliding(), true, 'true after starting' ); + Reveal.toggleAutoSlide(); + strictEqual( Reveal.isAutoSliding(), false, 'false after toggling' ); + Reveal.toggleAutoSlide(); + Reveal.configure({ autoSlide: 0 }); strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' ); }); -- cgit v1.2.3 From 942154182562b6c80bb9b536d24b1d8bd947452c Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sat, 21 Dec 2013 18:08:40 +0100 Subject: add tests for auto-slide events #766 --- test/test.js | 78 +++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 64 insertions(+), 14 deletions(-) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 23c0aff..e833bd4 100644 --- a/test/test.js +++ b/test/test.js @@ -57,20 +57,6 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.isPaused(), false, 'false after resuming' ); }); - test( 'Reveal.isAutoSliding', function() { - strictEqual( Reveal.isAutoSliding(), false, 'false by default' ); - - Reveal.configure({ autoSlide: 10000 }); - strictEqual( Reveal.isAutoSliding(), true, 'true after starting' ); - - Reveal.toggleAutoSlide(); - strictEqual( Reveal.isAutoSliding(), false, 'false after toggling' ); - Reveal.toggleAutoSlide(); - - Reveal.configure({ autoSlide: 0 }); - strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' ); - }); - test( 'Reveal.isFirstSlide', function() { Reveal.slide( 0, 0 ); strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); @@ -345,6 +331,70 @@ Reveal.addEventListener( 'ready', function() { }); + // --------------------------------------------------------------- + // AUTO-SLIDE TESTS + + QUnit.module( 'Auto Sliding' ); + + test( 'Reveal.isAutoSliding', function() { + strictEqual( Reveal.isAutoSliding(), false, 'false by default' ); + + Reveal.configure({ autoSlide: 10000 }); + strictEqual( Reveal.isAutoSliding(), true, 'true after starting' ); + + Reveal.configure({ autoSlide: 0 }); + strictEqual( Reveal.isAutoSliding(), false, 'false after setting to 0' ); + }); + + test( 'Reveal.toggleAutoSlide', function() { + Reveal.configure({ autoSlide: 10000 }); + + Reveal.toggleAutoSlide(); + strictEqual( Reveal.isAutoSliding(), false, 'false after first toggle' ); + Reveal.toggleAutoSlide(); + strictEqual( Reveal.isAutoSliding(), true, 'true after second toggle' ); + + Reveal.configure({ autoSlide: 0 }); + }); + + asyncTest( 'autoslidepaused', function() { + expect( 1 ); + + var _onEvent = function( event ) { + ok( true, 'event fired' ); + } + + Reveal.addEventListener( 'autoslidepaused', _onEvent ); + Reveal.configure({ autoSlide: 10000 }); + Reveal.toggleAutoSlide(); + + start(); + + // cleanup + Reveal.configure({ autoSlide: 0 }); + Reveal.removeEventListener( 'autoslidepaused', _onEvent ); + }); + + asyncTest( 'autoslideresumed', function() { + expect( 1 ); + + var _onEvent = function( event ) { + ok( true, 'event fired' ); + } + + Reveal.addEventListener( 'autoslideresumed', _onEvent ); + Reveal.configure({ autoSlide: 10000 }); + Reveal.toggleAutoSlide(); + Reveal.toggleAutoSlide(); + + start(); + + // cleanup + Reveal.configure({ autoSlide: 0 }); + Reveal.removeEventListener( 'autoslideresumed', _onEvent ); + }); + + // --------------------------------------------------------------- // CONFIGURATION VALUES -- cgit v1.2.3 From a91f4d601d7a4133c7ac0a0c4ca7c551edd872a0 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Wed, 12 Mar 2014 22:29:01 +0100 Subject: test for getProgress --- test/test.js | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index e833bd4..8e5697f 100644 --- a/test/test.js +++ b/test/test.js @@ -116,6 +116,16 @@ Reveal.addEventListener( 'ready', function() { equal( Reveal.getCurrentSlide(), secondSlide, 'current is slide #1' ); }); + test( 'Reveal.getProgress', function() { + Reveal.slide( 0, 0 ); + strictEqual( Reveal.getProgress(), 0, 'progress is 0 on first slide' ); + + var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; + + Reveal.slide( lastSlideIndex, 0 ); + strictEqual( Reveal.getProgress(), 1, 'progress is 1 on last slide' ); + }); + test( 'Reveal.getScale', function() { ok( typeof Reveal.getScale() === 'number', 'has scale' ); }); -- cgit v1.2.3 From 79f45c811e8037b711daf247d383eedbcef1c41b Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Tue, 1 Apr 2014 09:14:29 +0200 Subject: test for #858 --- test/test.js | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 8e5697f..90a002a 100644 --- a/test/test.js +++ b/test/test.js @@ -81,6 +81,10 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); }); + test( 'Reveal.getTotalSlides', function() { + strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' ); + }); + test( 'Reveal.getIndices', function() { var indices = Reveal.getIndices(); -- cgit v1.2.3 From 3ad0d6adc026c620af1b2eaadabd2ce2c338e2f1 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Tue, 22 Apr 2014 15:58:21 +0200 Subject: tests for lazy loading --- test/test.html | 5 +++++ test/test.js | 12 ++++++++++++ 2 files changed, 17 insertions(+) (limited to 'test/test.js') diff --git a/test/test.html b/test/test.html index aa233c8..31c31dd 100644 --- a/test/test.html +++ b/test/test.html @@ -21,6 +21,11 @@

1

+ +
diff --git a/test/test.js b/test/test.js index 90a002a..367373e 100644 --- a/test/test.js +++ b/test/test.js @@ -449,6 +449,18 @@ Reveal.addEventListener( 'ready', function() { }); + // --------------------------------------------------------------- + // LAZY-LOADING TESTS + + QUnit.module( 'Lazy-Loading' ); + + test( 'img with data-src', function() { + strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); + + strictEqual( document.querySelectorAll( '.reveal section video source[src]' ).length, 2, 'Video sources have been set' ); + }); + + // --------------------------------------------------------------- // EVENT TESTS -- cgit v1.2.3 From 73f96f1d284bca6e01c36c888c2620b376c06598 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Tue, 22 Apr 2014 16:10:08 +0200 Subject: lazy-load support for audio #793 --- js/reveal.js | 14 +++++++------- test/test.html | 4 ---- test/test.js | 2 -- 3 files changed, 7 insertions(+), 13 deletions(-) (limited to 'test/test.js') diff --git a/js/reveal.js b/js/reveal.js index e910682..42edf90 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -2173,25 +2173,25 @@ var Reveal = (function(){ function loadSlide( slide ) { // Media elements with data-src attributes - toArray( slide.querySelectorAll( 'img[data-src], video[data-src]' ) ).forEach( function( element ) { + toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src]' ) ).forEach( function( element ) { element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); element.removeAttribute( 'data-src' ); } ); - // Video elements with multiple s - toArray( slide.querySelectorAll( 'video' ) ).forEach( function( video ) { + // Media elements with multiple s + toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( media ) { var sources = 0; - toArray( slide.querySelectorAll( 'source[data-src]' ) ).forEach( function( source ) { + toArray( media.querySelectorAll( 'source[data-src]' ) ).forEach( function( source ) { source.setAttribute( 'src', source.getAttribute( 'data-src' ) ); source.removeAttribute( 'data-src' ); sources += 1; } ); - // If we rewrote sources for this video, we need to manually - // tell it to load from its new origin + // If we rewrote sources for this video/audio element, we need + // to manually tell it to load from its new origin if( sources > 0 ) { - video.load(); + media.load(); } } ); diff --git a/test/test.html b/test/test.html index 31c31dd..edb1623 100644 --- a/test/test.html +++ b/test/test.html @@ -22,10 +22,6 @@

1

-
diff --git a/test/test.js b/test/test.js index 367373e..93a3d61 100644 --- a/test/test.js +++ b/test/test.js @@ -456,8 +456,6 @@ Reveal.addEventListener( 'ready', function() { test( 'img with data-src', function() { strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); - - strictEqual( document.querySelectorAll( '.reveal section video source[src]' ).length, 2, 'Video sources have been set' ); }); -- cgit v1.2.3 From eea437f4be92bafbe96d5276233d4fdff7b5f814 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sun, 27 Apr 2014 14:46:49 +0200 Subject: new api method: getBackgroundSlide --- js/reveal.js | 48 +++++++++++++++++++++++++++++++++++++----------- test/test.js | 8 ++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) (limited to 'test/test.js') diff --git a/js/reveal.js b/js/reveal.js index 5dc6856..55642e2 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -2286,7 +2286,7 @@ var Reveal = (function(){ element.removeAttribute( 'data-src' ); } ); - // Media elements with multiple s + // Media elements with children toArray( slide.querySelectorAll( 'video, audio' ) ).forEach( function( media ) { var sources = 0; @@ -2634,6 +2634,38 @@ var Reveal = (function(){ } + function getSlide( x, y ) { + + var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; + var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); + + if( typeof y === 'number' ) { + return verticalSlides ? verticalSlides[ y ] : undefined; + } + + return horizontalSlide; + + } + + /** + * Returns the background element for the given slide. + * All slides, even the ones with no background properties + * defined, have a background element so this never returns + * null. + */ + function getSlideBackground( x, y ) { + + var horizontalBackground = document.querySelectorAll( '.backgrounds>.slide-background' )[ x ]; + var verticalBackgrounds = horizontalBackground && horizontalBackground.querySelectorAll( '.slide-background' ); + + if( typeof y === 'number' ) { + return verticalBackgrounds ? verticalBackgrounds[ y ] : undefined; + } + + return horizontalBackground; + + } + /** * Retrieves the current state of the presentation as * an object. This state can then be restored at any @@ -3720,17 +3752,11 @@ var Reveal = (function(){ getTotalSlides: getTotalSlides, - // Returns the slide at the specified index, y is optional - getSlide: function( x, y ) { - var horizontalSlide = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR )[ x ]; - var verticalSlides = horizontalSlide && horizontalSlide.querySelectorAll( 'section' ); - - if( typeof y !== 'undefined' ) { - return verticalSlides ? verticalSlides[ y ] : undefined; - } + // Returns the slide element at the specified index + getSlide: getSlide, - return horizontalSlide; - }, + // Returns the slide background element at the specified index + getSlideBackground: getSlideBackground, // Returns the previous slide element, may be null getPreviousSlide: function() { diff --git a/test/test.js b/test/test.js index 93a3d61..30b5c75 100644 --- a/test/test.js +++ b/test/test.js @@ -109,6 +109,14 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' ); }); + test( 'Reveal.getSlideBackground', function() { + var firstBackground = document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ); + + equal( Reveal.getSlideBackground( 0 ), firstBackground, 'gets correct first background' ); + + strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'returns undefined when background can\'t be found' ); + }); + test( 'Reveal.getPreviousSlide/getCurrentSlide', function() { Reveal.slide( 0, 0 ); Reveal.slide( 1, 0 ); -- cgit v1.2.3 From 0140a15bae7cd1c295bf6d64157fed3eaf065c0a Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sun, 27 Apr 2014 15:33:41 +0200 Subject: fix getindices test --- test/test.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 30b5c75..c34a04a 100644 --- a/test/test.js +++ b/test/test.js @@ -88,15 +88,17 @@ Reveal.addEventListener( 'ready', function() { test( 'Reveal.getIndices', function() { var indices = Reveal.getIndices(); - ok( typeof indices.hasOwnProperty( 'h' ), 'h exists' ); - ok( typeof indices.hasOwnProperty( 'v' ), 'v exists' ); - ok( typeof indices.hasOwnProperty( 'f' ), 'f exists' ); + ok( indices.hasOwnProperty( 'h' ), 'h exists' ); + ok( indices.hasOwnProperty( 'v' ), 'v exists' ); + ok( indices.hasOwnProperty( 'f' ), 'f exists' ); Reveal.slide( 1, 0 ); - ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 0, 'h 1, v 0' ); + strictEqual( Reveal.getIndices().h, 1, 'h 1' ); + strictEqual( Reveal.getIndices().v, 0, 'v 0' ); Reveal.slide( 1, 2 ); - ok( Reveal.getIndices().h === 1 && Reveal.getIndices().v === 2, 'h 1, v 2' ); + strictEqual( Reveal.getIndices().h, 1, 'h 1' ); + strictEqual( Reveal.getIndices().v, 2, 'v 2' ); Reveal.slide( 0, 0 ); }); -- cgit v1.2.3 From 7158c12effbce8a52c1a6385c1f9ee479c81c9fe Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Sun, 27 Apr 2014 15:39:11 +0200 Subject: lazy load all slide backgrounds --- css/reveal.css | 6 ++++++ js/reveal.js | 17 +++++++++++++++++ test/test.js | 2 ++ 3 files changed, 25 insertions(+) (limited to 'test/test.js') diff --git a/css/reveal.css b/css/reveal.css index 6a8cd4a..d10ff49 100644 --- a/css/reveal.css +++ b/css/reveal.css @@ -1337,6 +1337,7 @@ body { perspective: 600px; } .reveal .slide-background { + display: none; position: absolute; width: 100%; height: 100%; @@ -1352,6 +1353,11 @@ body { -moz-transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); transition: all 800ms cubic-bezier(0.260, 0.860, 0.440, 0.985); } + + .reveal .slide-background.stack { + display: block; + } + .reveal .slide-background.present { opacity: 1; visibility: visible; diff --git a/js/reveal.js b/js/reveal.js index d0c8272..9b03d5a 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -528,6 +528,8 @@ var Reveal = (function(){ createBackground( slidev, backgroundStack ); } + backgroundStack.classList.add( 'stack' ); + } ); } ); @@ -2279,8 +2281,14 @@ var Reveal = (function(){ */ function showSlide( slide ) { + // Show the slide element slide.style.display = 'block'; + // Show the corresponding background element + var indices = getIndices( slide ); + var background = getSlideBackground( indices.h, indices.v ); + background.style.display = 'block'; + // Media elements with data-src attributes toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ) ).forEach( function( element ) { element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); @@ -2312,8 +2320,14 @@ var Reveal = (function(){ */ function hideSlide( slide ) { + // Hide the slide element slide.style.display = 'none'; + // Hide the corresponding background element + var indices = getIndices( slide ); + var background = getSlideBackground( indices.h, indices.v ); + background.style.display = 'none'; + } /** @@ -2618,6 +2632,9 @@ var Reveal = (function(){ // Now that we know which the horizontal slide is, get its index h = Math.max( horizontalSlides.indexOf( slideh ), 0 ); + // Assume we're not vertical + v = 0; + // If this is a vertical slide, grab the vertical index if( isVertical ) { v = Math.max( toArray( slide.parentNode.querySelectorAll( 'section' ) ).indexOf( slide ), 0 ); diff --git a/test/test.js b/test/test.js index c34a04a..3bc934f 100644 --- a/test/test.js +++ b/test/test.js @@ -101,6 +101,8 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.getIndices().v, 2, 'v 2' ); Reveal.slide( 0, 0 ); + strictEqual( Reveal.getIndices().h, 0, 'h 0' ); + strictEqual( Reveal.getIndices().v, 0, 'v 0' ); }); test( 'Reveal.getSlide', function() { -- cgit v1.2.3 From 635e51f8f54ba519c7b865b7b4f62cb65a927d2f Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Mon, 28 Apr 2014 11:51:35 +0200 Subject: addition background image and getSlideBackground tests --- test/test.html | 4 ++-- test/test.js | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) (limited to 'test/test.js') diff --git a/test/test.html b/test/test.html index edb1623..29d02a9 100644 --- a/test/test.html +++ b/test/test.html @@ -19,13 +19,13 @@
-
+

1

-
+

2.1

diff --git a/test/test.js b/test/test.js index 3bc934f..c0c25fb 100644 --- a/test/test.js +++ b/test/test.js @@ -114,11 +114,13 @@ Reveal.addEventListener( 'ready', function() { }); test( 'Reveal.getSlideBackground', function() { - var firstBackground = document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ); + equal( Reveal.getSlideBackground( 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:first-child' ), 'gets correct first background' ); + equal( Reveal.getSlideBackground( 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2)' ), 'no v index returns stack' ); + equal( Reveal.getSlideBackground( 1, 0 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(1)' ), 'v index 0 returns first vertical child' ); + equal( Reveal.getSlideBackground( 1, 1 ), document.querySelector( '.reveal .backgrounds>.slide-background:nth-child(2) .slide-background:nth-child(2)' ), 'v index 1 returns second vertical child' ); - equal( Reveal.getSlideBackground( 0 ), firstBackground, 'gets correct first background' ); - - strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'returns undefined when background can\'t be found' ); + strictEqual( Reveal.getSlideBackground( 100 ), undefined, 'undefined when out of horizontal bounds' ); + strictEqual( Reveal.getSlideBackground( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); }); test( 'Reveal.getPreviousSlide/getCurrentSlide', function() { @@ -470,6 +472,15 @@ Reveal.addEventListener( 'ready', function() { strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); }); + test( 'background images', function() { + var imageSource1 = Reveal.getSlide( 0 ).getAttribute( 'data-background-image' ); + var imageSource2 = Reveal.getSlide( 1, 0 ).getAttribute( 'data-background' ); + + // check that the images are applied to the background elements + ok( Reveal.getSlideBackground( 0 ).style.backgroundImage.indexOf( imageSource1 ) !== -1, 'data-background-image worked' ); + ok( Reveal.getSlideBackground( 1, 0 ).style.backgroundImage.indexOf( imageSource2 ) !== -1, 'data-background worked' ); + }); + // --------------------------------------------------------------- // EVENT TESTS -- cgit v1.2.3 From 1391253cb815e36e6956553791f3a25f74923c95 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Mon, 28 Apr 2014 11:54:11 +0200 Subject: test same conditions for both getSlide and getSlideBackground --- test/test.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index c0c25fb..00f9080 100644 --- a/test/test.js +++ b/test/test.js @@ -106,11 +106,13 @@ Reveal.addEventListener( 'ready', function() { }); test( 'Reveal.getSlide', function() { - var firstSlide = document.querySelector( '.reveal .slides>section:first-child' ); - - equal( Reveal.getSlide( 0 ), firstSlide, 'gets correct first slide' ); + equal( Reveal.getSlide( 0 ), document.querySelector( '.reveal .slides>section:first-child' ), 'gets correct first slide' ); + equal( Reveal.getSlide( 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)' ), 'no v index returns stack' ); + equal( Reveal.getSlide( 1, 0 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(1)' ), 'v index 0 returns first vertical child' ); + equal( Reveal.getSlide( 1, 1 ), document.querySelector( '.reveal .slides>section:nth-child(2)>section:nth-child(2)' ), 'v index 1 returns second vertical child' ); - strictEqual( Reveal.getSlide( 100 ), undefined, 'returns undefined when slide can\'t be found' ); + strictEqual( Reveal.getSlide( 100 ), undefined, 'undefined when out of horizontal bounds' ); + strictEqual( Reveal.getSlide( 1, 100 ), undefined, 'undefined when out of vertical bounds' ); }); test( 'Reveal.getSlideBackground', function() { -- cgit v1.2.3 From 92fd4f78c86ea296ceb90c748f088674a5a12c5f Mon Sep 17 00:00:00 2001 From: fabiano Date: Fri, 9 May 2014 11:51:55 -0300 Subject: Small typo --- test/test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 00f9080..7406aea 100644 --- a/test/test.js +++ b/test/test.js @@ -75,7 +75,7 @@ Reveal.addEventListener( 'ready', function() { var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; Reveal.slide( lastSlideIndex, 0 ); - strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( ', 0+ lastSlideIndex +' )' ); + strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( '+ lastSlideIndex +', 0 )' ); Reveal.slide( 0, 0 ); strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); -- cgit v1.2.3 From af1ade14187c50a0e8d7ca954dfd1ae7d3043456 Mon Sep 17 00:00:00 2001 From: fabiano Date: Fri, 9 May 2014 12:28:53 -0300 Subject: Broaden the coverage of isFirstSlide test If we: - visit a vertical slide and then: - go to the first slide the function will return **false**. Added a test to isLastSlide too just to be sure. --- test/test.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 7406aea..fd7b865 100644 --- a/test/test.js +++ b/test/test.js @@ -68,6 +68,12 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 0, 0 )' ); }); + test( 'Reveal.isFirstSlide after vertical slide', function() { + Reveal.slide( 1, 1 ); + Reveal.slide( 0, 0 ); + strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( 0, 0 )' ); + }); + test( 'Reveal.isLastSlide', function() { Reveal.slide( 0, 0 ); strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); @@ -81,6 +87,14 @@ Reveal.addEventListener( 'ready', function() { strictEqual( Reveal.isLastSlide(), false, 'false after Reveal.slide( 0, 0 )' ); }); + test( 'Reveal.isLastSlide after vertical slide', function() { + var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; + + Reveal.slide( 1, 1 ); + Reveal.slide( lastSlideIndex, 0 ); + strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); + }); + test( 'Reveal.getTotalSlides', function() { strictEqual( Reveal.getTotalSlides(), 8, 'eight slides in total' ); }); -- cgit v1.2.3 From d072be2f573fe532f95907dc02c85b224b64819d Mon Sep 17 00:00:00 2001 From: fabiano Date: Fri, 9 May 2014 14:23:25 -0300 Subject: kill-yank mistake --- test/test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index fd7b865..6c7270f 100644 --- a/test/test.js +++ b/test/test.js @@ -91,8 +91,8 @@ Reveal.addEventListener( 'ready', function() { var lastSlideIndex = document.querySelectorAll( '.reveal .slides>section' ).length - 1; Reveal.slide( 1, 1 ); - Reveal.slide( lastSlideIndex, 0 ); - strictEqual( Reveal.isFirstSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); + Reveal.slide( lastSlideIndex ); + strictEqual( Reveal.isLastSlide(), true, 'true after Reveal.slide( 1, 1 ) and then Reveal.slide( '+ lastSlideIndex +', 0 )' ); }); test( 'Reveal.getTotalSlides', function() { -- cgit v1.2.3 From 4823b267ccecd24a0102be834b3ffdfab5fe2730 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Tue, 9 Sep 2014 12:42:11 +0200 Subject: better test for fragment indices --- test/test.js | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'test/test.js') diff --git a/test/test.js b/test/test.js index 6c7270f..3f93d3c 100644 --- a/test/test.js +++ b/test/test.js @@ -313,6 +313,13 @@ Reveal.addEventListener( 'ready', function() { Reveal.slide( 3, 0, 0 ); equal( fragmentSlide.querySelectorAll( '.fragment.visible' ).length, 2, 'both fragments of same index are shown' ); + + // This slide has three fragments, first one is index 0, second and third have index 1 + Reveal.slide( 2, 2, 0 ); + equal( Reveal.getIndices().f, 0, 'returns correct index for first fragment' ); + + Reveal.slide( 2, 2, 1 ); + equal( Reveal.getIndices().f, 1, 'returns correct index for two fragments with same index' ); }); test( 'Index generation', function() { -- cgit v1.2.3 From 7dd33f188fe14fd3cfa358aad523410d646c98fb Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Mon, 4 May 2015 20:58:58 -0400 Subject: lazy-load iframes only for current slide, unload when hidden --- README.md | 2 +- js/reveal.js | 24 +++++++++++++++++------- test/test.html | 1 + test/test.js | 9 +++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) (limited to 'test/test.js') diff --git a/README.md b/README.md index 929dcc8..3068c03 100644 --- a/README.md +++ b/README.md @@ -317,7 +317,7 @@ Reveal.configure({ When working on presentation with a lot of media or iframe content it's important to load lazily. Lazy loading means that reveal.js will only load content for the few slides nearest to the current slide. The number of slides that are preloaded is determined by the `viewDistance` configuration option. -To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. +To enable lazy loading all you need to do is change your "src" attributes to "data-src" as shown below. This is supported for image, video, audio and iframe elements. Lazy loaded iframes will also unload when the containing slide is no longer visible. ```html
diff --git a/js/reveal.js b/js/reveal.js index 79c8bbb..ad99fdc 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -2723,7 +2723,7 @@ slide.style.display = 'block'; // Media elements with data-src attributes - toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src], iframe[data-src]' ) ).forEach( function( element ) { + toArray( slide.querySelectorAll( 'img[data-src]', 'video[data-src]', 'audio[data-src]' ) ).forEach( function( element ) { element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); element.removeAttribute( 'data-src' ); } ); @@ -2909,19 +2909,24 @@ } } ); - // iframe embeds + // Lazy loading iframes + toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( element ) { + element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); + } ); + + // Generic postMessage API for non-lazy loaded iframes toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { el.contentWindow.postMessage( 'slide:start', '*' ); }); - // YouTube embeds + // YouTube postMessage API toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { el.contentWindow.postMessage( '{"event":"command","func":"playVideo","args":""}', '*' ); } }); - // Vimeo embeds + // Vimeo postMessage API toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { if( el.hasAttribute( 'data-autoplay' ) ) { el.contentWindow.postMessage( '{"method":"play"}', '*' ); @@ -2945,19 +2950,24 @@ } } ); - // iframe embeds + // Lazy loading iframes + toArray( slide.querySelectorAll( 'iframe[data-src]' ) ).forEach( function( element ) { + element.removeAttribute( 'src' ); + } ); + + // Generic postMessage API for non-lazy loaded iframes toArray( slide.querySelectorAll( 'iframe' ) ).forEach( function( el ) { el.contentWindow.postMessage( 'slide:stop', '*' ); }); - // YouTube embeds + // YouTube postMessage API toArray( slide.querySelectorAll( 'iframe[src*="youtube.com/embed/"]' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { el.contentWindow.postMessage( '{"event":"command","func":"pauseVideo","args":""}', '*' ); } }); - // Vimeo embeds + // Vimeo postMessage API toArray( slide.querySelectorAll( 'iframe[src*="player.vimeo.com/"]' ) ).forEach( function( el ) { if( !el.hasAttribute( 'data-ignore' ) && typeof el.contentWindow.postMessage === 'function' ) { el.contentWindow.postMessage( '{"method":"pause"}', '*' ); diff --git a/test/test.html b/test/test.html index 29d02a9..18f7504 100644 --- a/test/test.html +++ b/test/test.html @@ -44,6 +44,7 @@
  • 4.2
  • 4.3
  • +
    diff --git a/test/test.js b/test/test.js index 3f93d3c..d59ddfa 100644 --- a/test/test.js +++ b/test/test.js @@ -495,6 +495,15 @@ Reveal.addEventListener( 'ready', function() { strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); }); + test( 'iframe with data-src', function() { + Reveal.slide( 0, 0 ); + strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); + Reveal.slide( 2, 0 ); + strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 1, 'Iframe source is set' ); + Reveal.slide( 2, 1 ); + strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); + }); + test( 'background images', function() { var imageSource1 = Reveal.getSlide( 0 ).getAttribute( 'data-background-image' ); var imageSource2 = Reveal.getSlide( 1, 0 ).getAttribute( 'data-background' ); -- cgit v1.2.3 From e67dc9251a38d19cf588eb226d32a67f4d71c7d7 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Wed, 6 May 2015 11:02:41 +0200 Subject: tweak to iframe lazy load test --- test/test.html | 2 +- test/test.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'test/test.js') diff --git a/test/test.html b/test/test.html index 18f7504..93de5b1 100644 --- a/test/test.html +++ b/test/test.html @@ -44,7 +44,6 @@
  • 4.2
  • 4.3
  • -
    @@ -53,6 +52,7 @@
  • 4.1
  • 4.2
  • +
    diff --git a/test/test.js b/test/test.js index d59ddfa..ff32ee8 100644 --- a/test/test.js +++ b/test/test.js @@ -498,9 +498,9 @@ Reveal.addEventListener( 'ready', function() { test( 'iframe with data-src', function() { Reveal.slide( 0, 0 ); strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); - Reveal.slide( 2, 0 ); - strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 1, 'Iframe source is set' ); Reveal.slide( 2, 1 ); + strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 1, 'Iframe source is set' ); + Reveal.slide( 2, 2 ); strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); }); -- cgit v1.2.3 From 207b0c71ede4a37ec06797802c22e7c5d61346f6 Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Wed, 6 May 2015 11:25:50 +0200 Subject: fix lazy load selector error --- js/reveal.js | 2 +- test/test.html | 2 ++ test/test.js | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) (limited to 'test/test.js') diff --git a/js/reveal.js b/js/reveal.js index 3bd292a..ecba3a9 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -2723,7 +2723,7 @@ slide.style.display = 'block'; // Media elements with data-src attributes - toArray( slide.querySelectorAll( 'img[data-src]', 'video[data-src]', 'audio[data-src]' ) ).forEach( function( element ) { + toArray( slide.querySelectorAll( 'img[data-src], video[data-src], audio[data-src]' ) ).forEach( function( element ) { element.setAttribute( 'src', element.getAttribute( 'data-src' ) ); element.removeAttribute( 'data-src' ); } ); diff --git a/test/test.html b/test/test.html index 93de5b1..34cf832 100644 --- a/test/test.html +++ b/test/test.html @@ -22,6 +22,8 @@

    1

    + +
    diff --git a/test/test.js b/test/test.js index ff32ee8..79ff81e 100644 --- a/test/test.js +++ b/test/test.js @@ -495,6 +495,14 @@ Reveal.addEventListener( 'ready', function() { strictEqual( document.querySelectorAll( '.reveal section img[src]' ).length, 1, 'Image source has been set' ); }); + test( 'video with data-src', function() { + strictEqual( document.querySelectorAll( '.reveal section video[src]' ).length, 1, 'Video source has been set' ); + }); + + test( 'audio with data-src', function() { + strictEqual( document.querySelectorAll( '.reveal section audio[src]' ).length, 1, 'Audio source has been set' ); + }); + test( 'iframe with data-src', function() { Reveal.slide( 0, 0 ); strictEqual( document.querySelectorAll( '.reveal section iframe[src]' ).length, 0, 'Iframe source is not set' ); -- cgit v1.2.3 From 0338f280d3942094782da57ea3b5b72bdb833e9d Mon Sep 17 00:00:00 2001 From: Hakim El Hattab Date: Thu, 10 Sep 2015 08:28:52 +0200 Subject: add getSlideNotes API method and tests --- README.md | 3 +++ js/reveal.js | 46 ++++++++++++++++++++++++++++++---------------- test/test.html | 3 ++- test/test.js | 10 +++++++++- 4 files changed, 44 insertions(+), 18 deletions(-) (limited to 'test/test.js') diff --git a/README.md b/README.md index 8d25fa7..9011605 100644 --- a/README.md +++ b/README.md @@ -372,6 +372,9 @@ Reveal.getIndices(); // { h: 0, v: 0 } } Reveal.getProgress(); // 0-1 Reveal.getTotalSlides(); +// Returns the speaker notes for the current slide +Reveal.getSlideNotes(); + // State checks Reveal.isFirstSlide(); Reveal.isLastSlide(); diff --git a/js/reveal.js b/js/reveal.js index 83c180b..2b8fec7 100644 --- a/js/reveal.js +++ b/js/reveal.js @@ -2475,22 +2475,7 @@ if( config.showNotes && dom.speakerNotes && currentSlide && !isPrintingPDF() ) { - var notes = ''; - - // Notes can be specified via the data-notes attribute... - if( currentSlide.hasAttribute( 'data-notes' ) ) { - notes = currentSlide.getAttribute( 'data-notes' ); - } - - // ... or using an