aboutsummaryrefslogtreecommitdiffhomepage
path: root/js
diff options
context:
space:
mode:
Diffstat (limited to 'js')
-rw-r--r--js/reveal.js406
-rw-r--r--js/reveal.min.js6
2 files changed, 302 insertions, 110 deletions
diff --git a/js/reveal.js b/js/reveal.js
index 542edc2..f048b07 100644
--- a/js/reveal.js
+++ b/js/reveal.js
@@ -3,7 +3,7 @@
* http://lab.hakim.se/reveal-js
* MIT licensed
*
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
+ * Copyright (C) 2013 Hakim El Hattab, http://hakim.se
*/
var Reveal = (function(){
@@ -16,6 +16,19 @@ var Reveal = (function(){
// Configurations defaults, can be overridden at initialization time
config = {
+
+ // The "normal" size of the presentation, aspect ratio will be preserved
+ // when the presentation is scaled to fit different resolutions
+ width: 960,
+ height: 700,
+
+ // Factor of the display size that should remain empty around the content
+ margin: 0.1,
+
+ // Bounds for smallest/largest possible scale to apply to content
+ minScale: 0.2,
+ maxScale: 1.0,
+
// Display controls in the bottom right corner
controls: true,
@@ -81,6 +94,9 @@ var Reveal = (function(){
// all current slides.
state = [],
+ // The current scale of the presentation (see width/height config)
+ scale = 1,
+
// Cached references to DOM elements
dom = {},
@@ -113,6 +129,9 @@ var Reveal = (function(){
// A delay used to deactivate the overview mode
deactivateOverviewTimeout = 0,
+ // Flags if the interaction event listeners are bound
+ eventsAreBound = false,
+
// Holds information about the currently ongoing touch input
touch = {
startX: 0,
@@ -128,7 +147,7 @@ var Reveal = (function(){
*/
function initialize( options ) {
- if( ( !supports2DTransforms && !supports3DTransforms ) ) {
+ if( !supports2DTransforms && !supports3DTransforms ) {
document.body.setAttribute( 'class', 'no-transforms' );
// If the browser doesn't support core features we won't be
@@ -218,11 +237,7 @@ var Reveal = (function(){
*/
function hideAddressBar() {
- if( navigator.userAgent.match( /(iphone|ipod)/i ) ) {
- // Give the page some scrollable overflow
- document.documentElement.style.overflow = 'scroll';
- document.body.style.height = '120%';
-
+ if( /iphone|ipod|android/gi.test( navigator.userAgent ) && !/crios/gi.test( navigator.userAgent ) ) {
// Events that should trigger the address bar to hide
window.addEventListener( 'load', removeAddressBar, false );
window.addEventListener( 'orientationchange', removeAddressBar, false );
@@ -323,40 +338,40 @@ var Reveal = (function(){
/**
* Applies the configuration settings from the config object.
*/
- function configure() {
+ function configure( options ) {
- if( supports3DTransforms === false ) {
- config.transition = 'linear';
- }
+ dom.wrapper.classList.remove( config.transition );
- if( config.controls && dom.controls ) {
- dom.controls.style.display = 'block';
- }
+ // New config options may be passed when this method
+ // is invoked through the API after initialization
+ if( typeof options === 'object' ) extend( config, options );
- if( config.progress && dom.progress ) {
- dom.progress.style.display = 'block';
- }
+ // Force linear transition based on browser capabilities
+ if( supports3DTransforms === false ) config.transition = 'linear';
- if( config.transition !== 'default' ) {
- dom.wrapper.classList.add( config.transition );
- }
+ dom.wrapper.classList.add( config.transition );
- if( config.rtl ) {
- dom.wrapper.classList.add( 'rtl' );
- }
+ dom.controls.style.display = ( config.controls && dom.controls ) ? 'block' : 'none';
+ dom.progress.style.display = ( config.progress && dom.progress ) ? 'block' : 'none';
- if( config.center ) {
- dom.wrapper.classList.add( 'center' );
- }
+ dom.wrapper.classList.toggle( 'rtl', config.rtl );
+ dom.wrapper.classList.toggle( 'center', config.center );
if( config.mouseWheel ) {
document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
}
+ else {
+ document.removeEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
+ document.removeEventListener( 'mousewheel', onDocumentMouseScroll, false );
+ }
// 3D links
if( config.rollingLinks ) {
- linkify();
+ enable3DLinks();
+ }
+ else {
+ disable3DLinks();
}
// Load the theme in the config, if it's not already loaded
@@ -378,6 +393,8 @@ var Reveal = (function(){
*/
function addEventListeners() {
+ eventsAreBound = true;
+
window.addEventListener( 'hashchange', onWindowHashChange, false );
window.addEventListener( 'resize', onWindowResize, false );
@@ -392,17 +409,17 @@ var Reveal = (function(){
}
if ( config.progress && dom.progress ) {
- dom.progress.addEventListener( 'click', preventAndForward( onProgressClick ), false );
+ dom.progress.addEventListener( 'click', onProgressClicked, false );
}
if ( config.controls && dom.controls ) {
- var actionEvent = 'ontouchstart' in window ? 'touchstart' : 'click';
- dom.controlsLeft.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateLeft ), false ); } );
- dom.controlsRight.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateRight ), false ); } );
- dom.controlsUp.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateUp ), false ); } );
- dom.controlsDown.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateDown ), false ); } );
- dom.controlsPrev.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigatePrev ), false ); } );
- dom.controlsNext.forEach( function( el ) { el.addEventListener( actionEvent, preventAndForward( navigateNext ), false ); } );
+ var actionEvent = 'ontouchstart' in window && window.ontouchstart != null ? 'touchstart' : 'click';
+ dom.controlsLeft.forEach( function( el ) { el.addEventListener( actionEvent, onNavigateLeftClicked, false ); } );
+ dom.controlsRight.forEach( function( el ) { el.addEventListener( actionEvent, onNavigateRightClicked, false ); } );
+ dom.controlsUp.forEach( function( el ) { el.addEventListener( actionEvent, onNavigateUpClicked, false ); } );
+ dom.controlsDown.forEach( function( el ) { el.addEventListener( actionEvent, onNavigateDownClicked, false ); } );
+ dom.controlsPrev.forEach( function( el ) { el.addEventListener( actionEvent, onNavigatePrevClicked, false ); } );
+ dom.controlsNext.forEach( function( el ) { el.addEventListener( actionEvent, onNavigateNextClicked, false ); } );
}
}
@@ -412,6 +429,8 @@ var Reveal = (function(){
*/
function removeEventListeners() {
+ eventsAreBound = false;
+
document.removeEventListener( 'keydown', onDocumentKeyDown, false );
window.removeEventListener( 'hashchange', onWindowHashChange, false );
window.removeEventListener( 'resize', onWindowResize, false );
@@ -423,17 +442,17 @@ var Reveal = (function(){
}
if ( config.progress && dom.progress ) {
- dom.progress.removeEventListener( 'click', preventAndForward( onProgressClick ), false );
+ dom.progress.removeEventListener( 'click', onProgressClicked, false );
}
if ( config.controls && dom.controls ) {
- var actionEvent = 'ontouchstart' in window ? 'touchstart' : 'click';
- dom.controlsLeft.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateLeft ), false ); } );
- dom.controlsRight.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateRight ), false ); } );
- dom.controlsUp.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateUp ), false ); } );
- dom.controlsDown.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateDown ), false ); } );
- dom.controlsPrev.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigatePrev ), false ); } );
- dom.controlsNext.forEach( function( el ) { el.removeEventListener( actionEvent, preventAndForward( navigateNext ), false ); } );
+ var actionEvent = 'ontouchstart' in window && window.ontouchstart != null ? 'touchstart' : 'click';
+ dom.controlsLeft.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigateLeftClicked, false ); } );
+ dom.controlsRight.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigateRightClicked, false ); } );
+ dom.controlsUp.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigateUpClicked, false ); } );
+ dom.controlsDown.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigateDownClicked, false ); } );
+ dom.controlsPrev.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigatePrevClicked, false ); } );
+ dom.controlsNext.forEach( function( el ) { el.removeEventListener( actionEvent, onNavigateNextClicked, false ); } );
}
}
@@ -476,30 +495,23 @@ var Reveal = (function(){
}
/**
- * Prevents an events defaults behavior calls the
- * specified delegate.
- *
- * @param {Function} delegate The method to call
- * after the wrapper has been executed
- */
- function preventAndForward( delegate ) {
-
- return function( event ) {
- event.preventDefault();
- delegate.call( null, event );
- };
-
- }
-
- /**
* Causes the address bar to hide on mobile devices,
* more vertical space ftw.
*/
function removeAddressBar() {
+ if( window.orientation === 0 ) {
+ document.documentElement.style.overflow = 'scroll';
+ document.body.style.height = '120%';
+ }
+ else {
+ document.documentElement.style.overflow = '';
+ document.body.style.height = '100%';
+ }
+
setTimeout( function() {
window.scrollTo( 0, 1 );
- }, 0 );
+ }, 10 );
}
@@ -519,22 +531,22 @@ var Reveal = (function(){
/**
* Wrap all links in 3D goodness.
*/
- function linkify() {
+ function enable3DLinks() {
if( supports3DTransforms && !( 'msPerspective' in document.body.style ) ) {
- var nodes = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
+ var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a:not(.image)' );
- for( var i = 0, len = nodes.length; i < len; i++ ) {
- var node = nodes[i];
+ for( var i = 0, len = anchors.length; i < len; i++ ) {
+ var anchor = anchors[i];
- if( node.textContent && !node.querySelector( '*' ) && ( !node.className || !node.classList.contains( node, 'roll' ) ) ) {
+ if( anchor.textContent && !anchor.querySelector( '*' ) && ( !anchor.className || !anchor.classList.contains( anchor, 'roll' ) ) ) {
var span = document.createElement('span');
- span.setAttribute('data-title', node.text);
- span.innerHTML = node.innerHTML;
+ span.setAttribute('data-title', anchor.text);
+ span.innerHTML = anchor.innerHTML;
- node.classList.add( 'roll' );
- node.innerHTML = '';
- node.appendChild(span);
+ anchor.classList.add( 'roll' );
+ anchor.innerHTML = '';
+ anchor.appendChild(span);
}
}
}
@@ -542,19 +554,115 @@ var Reveal = (function(){
}
/**
+ * Unwrap all 3D links.
+ */
+ function disable3DLinks() {
+
+ var anchors = document.querySelectorAll( SLIDES_SELECTOR + ' a.roll' );
+
+ for( var i = 0, len = anchors.length; i < len; i++ ) {
+ var anchor = anchors[i];
+ var span = anchor.querySelector( 'span' );
+
+ if( span ) {
+ anchor.classList.remove( 'roll' );
+ anchor.innerHTML = span.innerHTML;
+ }
+ }
+
+ }
+
+ /**
+ * Return a sorted fragments list, ordered by an increasing
+ * "data-fragment-index" attribute.
+ *
+ * Fragments will be revealed in the order that they are returned by
+ * this function, so you can use the index attributes to control the
+ * order of fragment appearance.
+ *
+ * To maintain a sensible default fragment order, fragments are presumed
+ * to be passed in document order. This function adds a "fragment-index"
+ * attribute to each node if such an attribute is not already present,
+ * and sets that attribute to an integer value which is the position of
+ * the fragment within the fragments list.
+ */
+ function sortFragments( fragments ) {
+
+ var a = toArray( fragments );
+
+ a.forEach( function( el, idx ) {
+ if( !el.hasAttribute( 'data-fragment-index' ) ) {
+ el.setAttribute( 'data-fragment-index', idx );
+ }
+ } );
+
+ a.sort( function( l, r ) {
+ return l.getAttribute( 'data-fragment-index' ) - r.getAttribute( 'data-fragment-index');
+ } );
+
+ return a
+
+ }
+
+ /**
* Applies JavaScript-controlled layout rules to the
* presentation.
*/
function layout() {
- if( config.center ) {
+ if( dom.wrapper ) {
+
+ // Available space to scale within
+ var availableWidth = dom.wrapper.offsetWidth,
+ availableHeight = dom.wrapper.offsetHeight;
+
+ // Reduce availabe space by margin
+ availableWidth -= ( availableHeight * config.margin );
+ availableHeight -= ( availableHeight * config.margin );
+
+ // Dimensions of the content
+ var slideWidth = config.width,
+ slideHeight = config.height;
+
+ // Slide width may be a percentage of available width
+ if( typeof slideWidth === 'string' && /%$/.test( slideWidth ) ) {
+ slideWidth = parseInt( slideWidth, 10 ) / 100 * availableWidth;
+ }
+
+ // Slide height may be a percentage of available height
+ if( typeof slideHeight === 'string' && /%$/.test( slideHeight ) ) {
+ slideHeight = parseInt( slideHeight, 10 ) / 100 * availableHeight;
+ }
+
+ dom.slides.style.width = slideWidth + 'px';
+ dom.slides.style.height = slideHeight + 'px';
+
+ // Determine scale of content to fit within available space
+ scale = Math.min( availableWidth / slideWidth, availableHeight / slideHeight );
+
+ // Respect max/min scale settings
+ scale = Math.max( scale, config.minScale );
+ scale = Math.min( scale, config.maxScale );
+
+ // Prefer applying scale via zoom since Chrome blurs scaled content
+ // with nested transforms
+ if( typeof dom.slides.style.zoom !== 'undefined' && !navigator.userAgent.match( /(iphone|ipod|ipad|android)/gi ) ) {
+ dom.slides.style.zoom = scale;
+ }
+ // Apply scale transform as a fallback
+ else {
+ var transform = 'translate(-50%, -50%) scale('+ scale +') translate(50%, 50%)';
+
+ dom.slides.style.WebkitTransform = transform;
+ dom.slides.style.MozTransform = transform;
+ dom.slides.style.msTransform = transform;
+ dom.slides.style.OTransform = transform;
+ dom.slides.style.transform = transform;
+ }
// Select all slides, vertical and horizontal
var slides = toArray( document.querySelectorAll( SLIDES_SELECTOR ) );
- // Determine the minimum top offset for slides
- var minTop = -dom.wrapper.offsetHeight / 2;
-
for( var i = 0, len = slides.length; i < len; i++ ) {
var slide = slides[ i ];
@@ -563,14 +671,20 @@ var Reveal = (function(){
continue;
}
- // Vertical stacks are not centered since their section
- // children will be
- if( slide.classList.contains( 'stack' ) ) {
- slide.style.top = 0;
+ if( config.center ) {
+ // Vertical stacks are not centered since their section
+ // children will be
+ if( slide.classList.contains( 'stack' ) ) {
+ slide.style.top = 0;
+ }
+ else {
+ slide.style.top = Math.max( - ( slide.offsetHeight / 2 ) - 20, -slideHeight / 2 ) + 'px';
+ }
}
else {
- slide.style.top = Math.max( - ( slide.offsetHeight / 2 ) - 20, minTop ) + 'px';
+ slide.style.top = '';
}
+
}
}
@@ -594,7 +708,7 @@ var Reveal = (function(){
}
/**
- * Retrieves the vertical index which was stored using
+ * Retrieves the vertical index which was stored using
* #setPreviousVerticalIndex() or 0 if no previous index
* exists.
*
@@ -622,6 +736,9 @@ var Reveal = (function(){
// Only proceed if enabled in config
if( config.overview ) {
+ // Don't auto-slide while in overview mode
+ cancelAutoSlide();
+
var wasActive = dom.wrapper.classList.contains( 'overview' );
dom.wrapper.classList.add( 'overview' );
@@ -741,6 +858,8 @@ var Reveal = (function(){
slide( indexh, indexv );
+ cueAutoSlide();
+
// Notify observers of the overview hiding
dispatchEvent( 'overviewhidden', {
'indexh': indexh,
@@ -764,7 +883,7 @@ var Reveal = (function(){
override ? activateOverview() : deactivateOverview();
}
else {
- isOverviewActive() ? deactivateOverview() : activateOverview();
+ isOverview() ? deactivateOverview() : activateOverview();
}
}
@@ -775,7 +894,7 @@ var Reveal = (function(){
* @return {Boolean} true if the overview is active,
* false otherwise
*/
- function isOverviewActive() {
+ function isOverview() {
return dom.wrapper.classList.contains( 'overview' );
@@ -809,6 +928,7 @@ var Reveal = (function(){
*/
function pause() {
+ cancelAutoSlide();
dom.wrapper.classList.add( 'paused' );
}
@@ -818,6 +938,7 @@ var Reveal = (function(){
*/
function resume() {
+ cueAutoSlide();
dom.wrapper.classList.remove( 'paused' );
}
@@ -913,7 +1034,7 @@ var Reveal = (function(){
}
// If the overview is active, re-activate it to update positions
- if( isOverviewActive() ) {
+ if( isOverview() ) {
activateOverview();
}
@@ -932,7 +1053,7 @@ var Reveal = (function(){
// Show fragment, if specified
if( typeof f !== 'undefined' ) {
- var fragments = currentSlide.querySelectorAll( '.fragment' );
+ var fragments = sortFragments( currentSlide.querySelectorAll( '.fragment' ) );
toArray( fragments ).forEach( function( fragment, indexf ) {
if( indexf < f ) {
@@ -1024,7 +1145,7 @@ var Reveal = (function(){
// Optimization; hide all slides that are three or more steps
// away from the present slide
- if( isOverviewActive() === false ) {
+ if( isOverview() === false ) {
// The distance loops so that it measures 1 between the first
// and last slides
var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
@@ -1066,7 +1187,7 @@ var Reveal = (function(){
var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' );
if( slideAutoSlide ) {
autoSlide = parseInt( slideAutoSlide, 10 );
- }
+ }
else {
autoSlide = config.autoSlide;
}
@@ -1303,7 +1424,8 @@ var Reveal = (function(){
// Vertical slides:
if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
- var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
+ var verticalFragments = sortFragments( document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ) );
+
if( verticalFragments.length ) {
verticalFragments[0].classList.add( 'visible' );
@@ -1314,7 +1436,8 @@ var Reveal = (function(){
}
// Horizontal slides:
else {
- var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' );
+ var horizontalFragments = sortFragments( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment:not(.visible)' ) );
+
if( horizontalFragments.length ) {
horizontalFragments[0].classList.add( 'visible' );
@@ -1338,7 +1461,8 @@ var Reveal = (function(){
// Vertical slides:
if( document.querySelector( VERTICAL_SLIDES_SELECTOR + '.present' ) ) {
- var verticalFragments = document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' );
+ var verticalFragments = sortFragments( document.querySelectorAll( VERTICAL_SLIDES_SELECTOR + '.present .fragment.visible' ) );
+
if( verticalFragments.length ) {
verticalFragments[ verticalFragments.length - 1 ].classList.remove( 'visible' );
@@ -1349,7 +1473,8 @@ var Reveal = (function(){
}
// Horizontal slides:
else {
- var horizontalFragments = document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' );
+ var horizontalFragments = sortFragments( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR + '.present .fragment.visible' ) );
+
if( horizontalFragments.length ) {
horizontalFragments[ horizontalFragments.length - 1 ].classList.remove( 'visible' );
@@ -1371,16 +1496,25 @@ var Reveal = (function(){
clearTimeout( autoSlideTimeout );
// Cue the next auto-slide if enabled
- if( autoSlide ) {
+ if( autoSlide && !isPaused() && !isOverview() ) {
autoSlideTimeout = setTimeout( navigateNext, autoSlide );
}
}
+ /**
+ * Cancels any ongoing request to auto-slide.
+ */
+ function cancelAutoSlide() {
+
+ clearTimeout( autoSlideTimeout );
+
+ }
+
function navigateLeft() {
// Prioritize hiding fragments
- if( availableRoutes().left && isOverviewActive() || previousFragment() === false ) {
+ if( availableRoutes().left && isOverview() || previousFragment() === false ) {
slide( indexh - 1 );
}
@@ -1389,7 +1523,7 @@ var Reveal = (function(){
function navigateRight() {
// Prioritize revealing fragments
- if( availableRoutes().right && isOverviewActive() || nextFragment() === false ) {
+ if( availableRoutes().right && isOverview() || nextFragment() === false ) {
slide( indexh + 1 );
}
@@ -1398,7 +1532,7 @@ var Reveal = (function(){
function navigateUp() {
// Prioritize hiding fragments
- if( availableRoutes().up && isOverviewActive() || previousFragment() === false ) {
+ if( availableRoutes().up && isOverview() || previousFragment() === false ) {
slide( indexh, indexv - 1 );
}
@@ -1407,7 +1541,7 @@ var Reveal = (function(){
function navigateDown() {
// Prioritize revealing fragments
- if( availableRoutes().down && isOverviewActive() || nextFragment() === false ) {
+ if( availableRoutes().down && isOverview() || nextFragment() === false ) {
slide( indexh, indexv + 1 );
}
@@ -1476,10 +1610,15 @@ var Reveal = (function(){
// Disregard the event if there's a focused element or a
// keyboard modifier key is present
- if ( hasFocus || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
+ if( hasFocus || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
var triggered = true;
+ // while paused only allow "unpausing" keyboard events (b and .)
+ if( isPaused() && [66,190,191].indexOf( event.keyCode ) === -1 ) {
+ return false;
+ }
+
switch( event.keyCode ) {
// p, page up
case 80: case 33: navigatePrev(); break;
@@ -1498,9 +1637,9 @@ var Reveal = (function(){
// end
case 35: slide( Number.MAX_VALUE ); break;
// space
- case 32: isOverviewActive() ? deactivateOverview() : navigateNext(); break;
+ case 32: isOverview() ? deactivateOverview() : navigateNext(); break;
// return
- case 13: isOverviewActive() ? deactivateOverview() : triggered = false; break;
+ case 13: isOverview() ? deactivateOverview() : triggered = false; break;
// b, period, Logitech presenter tools "black screen" button
case 66: case 190: case 191: togglePause(); break;
// f
@@ -1659,7 +1798,9 @@ var Reveal = (function(){
*
* ( clickX / presentationWidth ) * numberOfSlides
*/
- function onProgressClick( event ) {
+ function onProgressClicked( event ) {
+
+ event.preventDefault();
var slidesTotal = toArray( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) ).length;
var slideIndex = Math.floor( ( event.clientX / dom.wrapper.offsetWidth ) * slidesTotal );
@@ -1669,6 +1810,16 @@ var Reveal = (function(){
}
/**
+ * Event handler for navigation control buttons.
+ */
+ function onNavigateLeftClicked( event ) { event.preventDefault(); navigateLeft(); }
+ function onNavigateRightClicked( event ) { event.preventDefault(); navigateRight(); }
+ function onNavigateUpClicked( event ) { event.preventDefault(); navigateUp(); }
+ function onNavigateDownClicked( event ) { event.preventDefault(); navigateDown(); }
+ function onNavigatePrevClicked( event ) { event.preventDefault(); navigatePrev(); }
+ function onNavigateNextClicked( event ) { event.preventDefault(); navigateNext(); }
+
+ /**
* Handler for the window level 'hashchange' event.
*/
function onWindowHashChange( event ) {
@@ -1693,22 +1844,26 @@ var Reveal = (function(){
// TODO There's a bug here where the event listeners are not
// removed after deactivating the overview.
- if( isOverviewActive() ) {
+ if( eventsAreBound && isOverview() ) {
event.preventDefault();
- deactivateOverview();
-
var element = event.target;
while( element && !element.nodeName.match( /section/gi ) ) {
element = element.parentNode;
}
- if( element.nodeName.match( /section/gi ) ) {
- var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),
- v = parseInt( element.getAttribute( 'data-index-v' ), 10 );
+ if( element && !element.classList.contains( 'disabled' ) ) {
+
+ deactivateOverview();
+
+ if( element.nodeName.match( /section/gi ) ) {
+ var h = parseInt( element.getAttribute( 'data-index-h' ), 10 ),
+ v = parseInt( element.getAttribute( 'data-index-v' ), 10 );
+
+ slide( h, v );
+ }
- slide( h, v );
}
}
@@ -1722,6 +1877,7 @@ var Reveal = (function(){
return {
initialize: initialize,
+ configure: configure,
// Navigation methods
slide: slide,
@@ -1752,6 +1908,10 @@ var Reveal = (function(){
// Toggles the "black screen" mode on/off
togglePause: togglePause,
+ // State checks
+ isOverview: isOverview,
+ isPaused: isPaused,
+
// Adds or removes all internal event listeners (such as keyboard)
addEventListeners: addEventListeners,
removeEventListeners: removeEventListeners,
@@ -1759,6 +1919,18 @@ var Reveal = (function(){
// Returns the indices of the current, or specified, slide
getIndices: getIndices,
+ // 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;
+ }
+
+ return horizontalSlide;
+ },
+
// Returns the previous slide element, may be null
getPreviousSlide: function() {
return previousSlide;
@@ -1769,6 +1941,11 @@ var Reveal = (function(){
return currentSlide;
},
+ // Returns the current scale of the presentation content
+ getScale: function() {
+ return scale;
+ },
+
// Helper method, retrieves query string as a key/value hash
getQueryHash: function() {
var query = {};
@@ -1780,6 +1957,21 @@ var Reveal = (function(){
return query;
},
+ // Returns true if we're currently on the first slide
+ isFirstSlide: function() {
+ return document.querySelector( SLIDES_SELECTOR + '.past' ) == null ? true : false;
+ },
+
+ // Returns true if we're currently on the last slide
+ isLastSlide: function() {
+ if( currentSlide && currentSlide.classList.contains( '.stack' ) ) {
+ return currentSlide.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false;
+ }
+ else {
+ return document.querySelector( SLIDES_SELECTOR + '.future' ) == null ? true : false;
+ }
+ },
+
// Forward event binding to the reveal DOM element
addEventListener: function( type, listener, useCapture ) {
if( 'addEventListener' in window ) {
@@ -1793,4 +1985,4 @@ var Reveal = (function(){
}
};
-})(); \ No newline at end of file
+})();
diff --git a/js/reveal.min.js b/js/reveal.min.js
index 46a765e..9b8a7ce 100644
--- a/js/reveal.min.js
+++ b/js/reveal.min.js
@@ -1,8 +1,8 @@
/*!
- * reveal.js 2.2 (2013-01-21, 14:54)
+ * reveal.js 2.3.0 (2013-02-27, 13:36)
* http://lab.hakim.se/reveal-js
* MIT licensed
*
- * Copyright (C) 2011-2012 Hakim El Hattab, http://hakim.se
+ * Copyright (C) 2013 Hakim El Hattab, http://hakim.se
*/
-var Reveal=function(){"use strict";function u(a){return n||m?(window.addEventListener("load",J,!1),C(e,a),w(),x(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function v(){if(l.theme=document.querySelector("#theme"),l.wrapper=document.querySelector(".reveal"),l.slides=document.querySelector(".reveal .slides"),!l.wrapper.querySelector(".progress")&&e.progress){var a=document.createElement("div");a.classList.add("progress"),a.innerHTML="<span></span>",l.wrapper.appendChild(a)}if(!l.wrapper.querySelector(".controls")&&e.controls){var b=document.createElement("aside");b.classList.add("controls"),b.innerHTML='<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>',l.wrapper.appendChild(b)}if(!l.wrapper.querySelector(".state-background")){var c=document.createElement("div");c.classList.add("state-background"),l.wrapper.appendChild(c)}if(!l.wrapper.querySelector(".pause-overlay")){var d=document.createElement("div");d.classList.add("pause-overlay"),l.wrapper.appendChild(d)}l.progress=document.querySelector(".reveal .progress"),l.progressbar=document.querySelector(".reveal .progress span"),e.controls&&(l.controls=document.querySelector(".reveal .controls"),l.controlsLeft=D(document.querySelectorAll(".navigate-left")),l.controlsRight=D(document.querySelectorAll(".navigate-right")),l.controlsUp=D(document.querySelectorAll(".navigate-up")),l.controlsDown=D(document.querySelectorAll(".navigate-down")),l.controlsPrev=D(document.querySelectorAll(".navigate-prev")),l.controlsNext=D(document.querySelectorAll(".navigate-next")))}function w(){navigator.userAgent.match(/(iphone|ipod)/i)&&(document.documentElement.style.overflow="scroll",document.body.style.height="120%",window.addEventListener("load",G,!1),window.addEventListener("orientationchange",G,!1))}function x(){function g(){b.length&&head.js.apply(null,b),y()}for(var a=[],b=[],c=0,d=e.dependencies.length;d>c;c++){var f=e.dependencies[c];(!f.condition||f.condition())&&(f.async?b.push(f.src):a.push(f.src),"function"==typeof f.callback&&head.ready(f.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],f.callback))}a.length?(head.ready(g),head.js.apply(null,a)):g()}function y(){v(),A(),z(),J(),$(),db(),setTimeout(function(){H("ready",{indexh:g,indexv:h,currentSlide:j})},1)}function z(){if(m===!1&&(e.transition="linear"),e.controls&&l.controls&&(l.controls.style.display="block"),e.progress&&l.progress&&(l.progress.style.display="block"),"default"!==e.transition&&l.wrapper.classList.add(e.transition),e.rtl&&l.wrapper.classList.add("rtl"),e.center&&l.wrapper.classList.add("center"),e.mouseWheel&&(document.addEventListener("DOMMouseScroll",ob,!1),document.addEventListener("mousewheel",ob,!1)),e.rollingLinks&&I(),e.theme&&l.theme){var a=l.theme.getAttribute("href"),b=/[^\/]*?(?=\.css)/,c=a.match(b)[0];e.theme!==c&&(a=a.replace(b,e.theme),l.theme.setAttribute("href",a))}}function A(){if(window.addEventListener("hashchange",qb,!1),window.addEventListener("resize",rb,!1),e.touch&&(document.addEventListener("touchstart",lb,!1),document.addEventListener("touchmove",mb,!1),document.addEventListener("touchend",nb,!1)),e.keyboard&&document.addEventListener("keydown",kb,!1),e.progress&&l.progress&&l.progress.addEventListener("click",F(pb),!1),e.controls&&l.controls){var a="ontouchstart"in window?"touchstart":"click";l.controlsLeft.forEach(function(b){b.addEventListener(a,F(eb),!1)}),l.controlsRight.forEach(function(b){b.addEventListener(a,F(fb),!1)}),l.controlsUp.forEach(function(b){b.addEventListener(a,F(gb),!1)}),l.controlsDown.forEach(function(b){b.addEventListener(a,F(hb),!1)}),l.controlsPrev.forEach(function(b){b.addEventListener(a,F(ib),!1)}),l.controlsNext.forEach(function(b){b.addEventListener(a,F(jb),!1)})}}function B(){if(document.removeEventListener("keydown",kb,!1),window.removeEventListener("hashchange",qb,!1),window.removeEventListener("resize",rb,!1),e.touch&&(document.removeEventListener("touchstart",lb,!1),document.removeEventListener("touchmove",mb,!1),document.removeEventListener("touchend",nb,!1)),e.progress&&l.progress&&l.progress.removeEventListener("click",F(pb),!1),e.controls&&l.controls){var a="ontouchstart"in window?"touchstart":"click";l.controlsLeft.forEach(function(b){b.removeEventListener(a,F(eb),!1)}),l.controlsRight.forEach(function(b){b.removeEventListener(a,F(fb),!1)}),l.controlsUp.forEach(function(b){b.removeEventListener(a,F(gb),!1)}),l.controlsDown.forEach(function(b){b.removeEventListener(a,F(hb),!1)}),l.controlsPrev.forEach(function(b){b.removeEventListener(a,F(ib),!1)}),l.controlsNext.forEach(function(b){b.removeEventListener(a,F(jb),!1)})}}function C(a,b){for(var c in b)a[c]=b[c]}function D(a){return Array.prototype.slice.call(a)}function E(a,b){var c=a.x-b.x,d=a.y-b.y;return Math.sqrt(c*c+d*d)}function F(a){return function(b){b.preventDefault(),a.call(null,b)}}function G(){setTimeout(function(){window.scrollTo(0,1)},0)}function H(a,b){var c=document.createEvent("HTMLEvents",1,2);c.initEvent(a,!0,!0),C(c,b),l.wrapper.dispatchEvent(c)}function I(){if(m&&!("msPerspective"in document.body.style))for(var b=document.querySelectorAll(a+" a:not(.image)"),c=0,d=b.length;d>c;c++){var e=b[c];if(!(!e.textContent||e.querySelector("*")||e.className&&e.classList.contains(e,"roll"))){var f=document.createElement("span");f.setAttribute("data-title",e.text),f.innerHTML=e.innerHTML,e.classList.add("roll"),e.innerHTML="",e.appendChild(f)}}}function J(){if(e.center)for(var b=D(document.querySelectorAll(a)),c=-l.wrapper.offsetHeight/2,d=0,f=b.length;f>d;d++){var g=b[d];"none"!==g.style.display&&(g.style.top=g.classList.contains("stack")?0:Math.max(-(g.offsetHeight/2)-20,c)+"px")}}function K(a,b){a&&a.setAttribute("data-previous-indexv",b||0)}function L(a){return a&&a.classList.contains("stack")?parseInt(a.getAttribute("data-previous-indexv")||0,10):0}function M(){if(e.overview){var a=l.wrapper.classList.contains("overview");l.wrapper.classList.add("overview"),l.wrapper.classList.remove("exit-overview"),clearTimeout(r),clearTimeout(s),r=setTimeout(function(){for(var c=document.querySelectorAll(b),d=0,e=c.length;e>d;d++){var f=c[d],i="translateZ(-2500px) translate("+105*(d-g)+"%, 0%)";if(f.setAttribute("data-index-h",d),f.style.display="block",f.style.WebkitTransform=i,f.style.MozTransform=i,f.style.msTransform=i,f.style.OTransform=i,f.style.transform=i,f.classList.contains("stack"))for(var k=f.querySelectorAll("section"),l=0,m=k.length;m>l;l++){var n=d===g?h:L(f),o=k[l],p="translate(0%, "+105*(l-n)+"%)";o.setAttribute("data-index-h",d),o.setAttribute("data-index-v",l),o.style.display="block",o.style.WebkitTransform=p,o.style.MozTransform=p,o.style.msTransform=p,o.style.OTransform=p,o.style.transform=p,o.addEventListener("click",sb,!0)}else f.addEventListener("click",sb,!0)}J(),a||H("overviewshown",{indexh:g,indexv:h,currentSlide:j})},10)}}function N(){if(e.overview){clearTimeout(r),clearTimeout(s),l.wrapper.classList.remove("overview"),l.wrapper.classList.add("exit-overview"),s=setTimeout(function(){l.wrapper.classList.remove("exit-overview")},10);for(var b=D(document.querySelectorAll(a)),c=0,d=b.length;d>c;c++){var f=b[c];f.style.display="",f.style.WebkitTransform="",f.style.MozTransform="",f.style.msTransform="",f.style.OTransform="",f.style.transform="",f.removeEventListener("click",sb,!0)}V(g,h),H("overviewhidden",{indexh:g,indexv:h,currentSlide:j})}}function O(a){"boolean"==typeof a?a?M():N():P()?N():M()}function P(){return l.wrapper.classList.contains("overview")}function Q(){var a=document.body,b=a.requestFullScreen||a.webkitRequestFullScreen||a.mozRequestFullScreen||a.msRequestFullScreen;b&&b.apply(a)}function R(){l.wrapper.classList.add("paused")}function S(){l.wrapper.classList.remove("paused")}function T(){U()?S():R()}function U(){return l.wrapper.classList.contains("paused")}function V(a,e,f){i=j;var l=document.querySelectorAll(b);void 0===e&&(e=L(l[a])),i&&i.parentNode&&i.parentNode.classList.contains("stack")&&K(i.parentNode,h);var m=k.concat();k.length=0;var n=g,o=h;g=W(b,void 0===a?g:a),h=W(c,void 0===e?h:e),J();a:for(var p=0,q=k.length;q>p;p++){for(var r=0;m.length>r;r++)if(m[r]===k[p]){m.splice(r,1);continue a}document.documentElement.classList.add(k[p]),H(k[p])}for(;m.length;)document.documentElement.classList.remove(m.pop());P()&&M(),_(1500);var s=l[g],t=s.querySelectorAll("section");if(j=t[h]||s,f!==void 0){var u=j.querySelectorAll(".fragment");D(u).forEach(function(a,b){f>b?a.classList.add("visible"):a.classList.remove("visible")})}g!==n||h!==o?H("slidechanged",{indexh:g,indexv:h,previousSlide:i,currentSlide:j}):i=null,i&&(i.classList.remove("present"),document.querySelector(d).classList.contains("present")&&setTimeout(function(){var c,a=D(document.querySelectorAll(b+".stack"));for(c in a)a[c]&&K(a[c],0)},0)),Y(),X()}function W(a,b){var c=D(document.querySelectorAll(a)),d=c.length;if(d){e.loop&&(b%=d,0>b&&(b=d+b)),b=Math.max(Math.min(b,d-1),0);for(var g=0;d>g;g++){var h=c[g];if(P()===!1){var i=Math.abs((b-g)%(d-3))||0;h.style.display=i>3?"none":"block"}c[g].classList.remove("past"),c[g].classList.remove("present"),c[g].classList.remove("future"),b>g?c[g].classList.add("past"):g>b&&c[g].classList.add("future"),h.querySelector("section")&&c[g].classList.add("stack")}c[b].classList.add("present");var j=c[b].getAttribute("data-state");j&&(k=k.concat(j.split(" ")));var l=c[b].getAttribute("data-autoslide");f=l?parseInt(l,10):e.autoSlide}else b=0;return b}function X(){if(e.progress&&l.progress){var c=D(document.querySelectorAll(b)),d=document.querySelectorAll(a+":not(.stack)").length,f=0;a:for(var g=0;c.length>g;g++){for(var h=c[g],i=D(h.querySelectorAll("section")),j=0;i.length>j;j++){if(i[j].classList.contains("present"))break a;f++}if(h.classList.contains("present"))break;h.classList.contains("stack")===!1&&f++}l.progressbar.style.width=f/(d-1)*window.innerWidth+"px"}}function Y(){if(e.controls&&l.controls){var a=Z();l.controlsLeft.concat(l.controlsRight).concat(l.controlsUp).concat(l.controlsDown).concat(l.controlsPrev).concat(l.controlsNext).forEach(function(a){a.classList.remove("enabled")}),a.left&&l.controlsLeft.forEach(function(a){a.classList.add("enabled")}),a.right&&l.controlsRight.forEach(function(a){a.classList.add("enabled")}),a.up&&l.controlsUp.forEach(function(a){a.classList.add("enabled")}),a.down&&l.controlsDown.forEach(function(a){a.classList.add("enabled")}),(a.left||a.up)&&l.controlsPrev.forEach(function(a){a.classList.add("enabled")}),(a.right||a.down)&&l.controlsNext.forEach(function(a){a.classList.add("enabled")})}}function Z(){var a=document.querySelectorAll(b),d=document.querySelectorAll(c);return{left:g>0,right:a.length-1>g,up:h>0,down:d.length-1>h}}function $(){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);V(e.h,e.v)}else V(g,h)}else{var f=parseInt(b[0],10)||0,i=parseInt(b[1],10)||0;V(f,i)}}function _(a){if(e.history)if(clearTimeout(q),"number"==typeof a)q=setTimeout(_,a);else{var b="/";j&&"string"==typeof j.getAttribute("id")?b="/"+j.getAttribute("id"):((g>0||h>0)&&(b+=g),h>0&&(b+="/"+h)),window.location.hash=b}}function ab(a){var c=g,d=h;if(a){var e=!!a.parentNode.nodeName.match(/section/gi),f=e?a.parentNode:a,i=D(document.querySelectorAll(b));c=Math.max(i.indexOf(f),0),e&&(d=Math.max(D(a.parentNode.querySelectorAll("section")).indexOf(a),0))}return{h:c,v:d}}function bb(){if(document.querySelector(c+".present")){var a=document.querySelectorAll(c+".present .fragment:not(.visible)");if(a.length)return a[0].classList.add("visible"),H("fragmentshown",{fragment:a[0]}),!0}else{var d=document.querySelectorAll(b+".present .fragment:not(.visible)");if(d.length)return d[0].classList.add("visible"),H("fragmentshown",{fragment:d[0]}),!0}return!1}function cb(){if(document.querySelector(c+".present")){var a=document.querySelectorAll(c+".present .fragment.visible");if(a.length)return a[a.length-1].classList.remove("visible"),H("fragmenthidden",{fragment:a[a.length-1]}),!0}else{var d=document.querySelectorAll(b+".present .fragment.visible");if(d.length)return d[d.length-1].classList.remove("visible"),H("fragmenthidden",{fragment:d[d.length-1]}),!0}return!1}function db(){clearTimeout(p),f&&(p=setTimeout(jb,f))}function eb(){(Z().left&&P()||cb()===!1)&&V(g-1)}function fb(){(Z().right&&P()||bb()===!1)&&V(g+1)}function gb(){(Z().up&&P()||cb()===!1)&&V(g,h-1)}function hb(){(Z().down&&P()||bb()===!1)&&V(g,h+1)}function ib(){if(cb()===!1)if(Z().up)gb();else{var a=document.querySelector(b+".past:nth-child("+g+")");a&&(h=a.querySelectorAll("section").length+1||void 0,g--,V())}}function jb(){bb()===!1&&(Z().down?hb():fb()),db()}function kb(a){document.activeElement;var c=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(c||a.shiftKey||a.altKey||a.ctrlKey||a.metaKey)){var d=!0;switch(a.keyCode){case 80:case 33:ib();break;case 78:case 34:jb();break;case 72:case 37:eb();break;case 76:case 39:fb();break;case 75:case 38:gb();break;case 74:case 40:hb();break;case 36:V(0);break;case 35:V(Number.MAX_VALUE);break;case 32:P()?N():jb();break;case 13:P()?N():d=!1;break;case 66:case 190:case 191:T();break;case 70:Q();break;default:d=!1}d?a.preventDefault():27===a.keyCode&&m&&(O(),a.preventDefault()),db()}}function lb(a){t.startX=a.touches[0].clientX,t.startY=a.touches[0].clientY,t.startCount=a.touches.length,2===a.touches.length&&e.overview&&(t.startSpan=E({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:t.startX,y:t.startY}))}function mb(a){if(t.handled)navigator.userAgent.match(/android/gi)&&a.preventDefault();else{var b=a.touches[0].clientX,c=a.touches[0].clientY;if(2===a.touches.length&&2===t.startCount&&e.overview){var d=E({x:a.touches[1].clientX,y:a.touches[1].clientY},{x:t.startX,y:t.startY});Math.abs(t.startSpan-d)>t.threshold&&(t.handled=!0,t.startSpan>d?M():N()),a.preventDefault()}else if(1===a.touches.length&&2!==t.startCount){var f=b-t.startX,g=c-t.startY;f>t.threshold&&Math.abs(f)>Math.abs(g)?(t.handled=!0,eb()):-t.threshold>f&&Math.abs(f)>Math.abs(g)?(t.handled=!0,fb()):g>t.threshold?(t.handled=!0,gb()):-t.threshold>g&&(t.handled=!0,hb()),a.preventDefault()}}}function nb(){t.handled=!1}function ob(a){clearTimeout(o),o=setTimeout(function(){var b=a.detail||-a.wheelDelta;b>0?jb():ib()},100)}function pb(a){var c=D(document.querySelectorAll(b)).length,d=Math.floor(a.clientX/l.wrapper.offsetWidth*c);V(d)}function qb(){$()}function rb(){J()}function sb(a){if(P()){a.preventDefault(),N();for(var b=a.target;b&&!b.nodeName.match(/section/gi);)b=b.parentNode;if(b.nodeName.match(/section/gi)){var c=parseInt(b.getAttribute("data-index-h"),10),d=parseInt(b.getAttribute("data-index-v"),10);V(c,d)}}}var i,j,a=".reveal .slides section",b=".reveal .slides>section",c=".reveal .slides>section.present>section",d=".reveal .slides>section:first-child",e={controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!0,theme:null,transition:"default",dependencies:[]},f=e.autoSlide,g=0,h=0,k=[],l={},m="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,n="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,o=0,p=0,q=0,r=0,s=0,t={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:u,slide:V,left:eb,right:fb,up:gb,down:hb,prev:ib,next:jb,prevFragment:cb,nextFragment:bb,navigateTo:V,navigateLeft:eb,navigateRight:fb,navigateUp:gb,navigateDown:hb,navigatePrev:ib,navigateNext:jb,layout:J,toggleOverview:O,togglePause:T,addEventListeners:A,removeEventListeners:B,getIndices:ab,getPreviousSlide:function(){return i},getCurrentSlide:function(){return j},getQueryHash:function(){var a={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(b){a[b.split("=").shift()]=b.split("=").pop()}),a},addEventListener:function(a,b,c){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).addEventListener(a,b,c)},removeEventListener:function(a,b,c){"addEventListener"in window&&(l.wrapper||document.querySelector(".reveal")).removeEventListener(a,b,c)}}}(); \ No newline at end of file
+var Reveal=function(){"use strict";function e(e){return bt||wt?(window.addEventListener("load",h,!1),c(ft,e),n(),r(),void 0):(document.body.setAttribute("class","no-transforms"),void 0)}function t(){if(Lt.theme=document.querySelector("#theme"),Lt.wrapper=document.querySelector(".reveal"),Lt.slides=document.querySelector(".reveal .slides"),!Lt.wrapper.querySelector(".progress")&&ft.progress){var e=document.createElement("div");e.classList.add("progress"),e.innerHTML="<span></span>",Lt.wrapper.appendChild(e)}if(!Lt.wrapper.querySelector(".controls")&&ft.controls){var t=document.createElement("aside");t.classList.add("controls"),t.innerHTML='<div class="navigate-left"></div><div class="navigate-right"></div><div class="navigate-up"></div><div class="navigate-down"></div>',Lt.wrapper.appendChild(t)}if(!Lt.wrapper.querySelector(".state-background")){var n=document.createElement("div");n.classList.add("state-background"),Lt.wrapper.appendChild(n)}if(!Lt.wrapper.querySelector(".pause-overlay")){var r=document.createElement("div");r.classList.add("pause-overlay"),Lt.wrapper.appendChild(r)}Lt.progress=document.querySelector(".reveal .progress"),Lt.progressbar=document.querySelector(".reveal .progress span"),ft.controls&&(Lt.controls=document.querySelector(".reveal .controls"),Lt.controlsLeft=l(document.querySelectorAll(".navigate-left")),Lt.controlsRight=l(document.querySelectorAll(".navigate-right")),Lt.controlsUp=l(document.querySelectorAll(".navigate-up")),Lt.controlsDown=l(document.querySelectorAll(".navigate-down")),Lt.controlsPrev=l(document.querySelectorAll(".navigate-prev")),Lt.controlsNext=l(document.querySelectorAll(".navigate-next")))}function n(){/iphone|ipod|android/gi.test(navigator.userAgent)&&!/crios/gi.test(navigator.userAgent)&&(window.addEventListener("load",u,!1),window.addEventListener("orientationchange",u,!1))}function r(){function e(){n.length&&head.js.apply(null,n),o()}for(var t=[],n=[],r=0,s=ft.dependencies.length;s>r;r++){var a=ft.dependencies[r];(!a.condition||a.condition())&&(a.async?n.push(a.src):t.push(a.src),"function"==typeof a.callback&&head.ready(a.src.match(/([\w\d_\-]*)\.?js$|[^\\\/]*$/i)[0],a.callback))}t.length?(head.ready(e),head.js.apply(null,t)):e()}function o(){t(),a(),s(),h(),P(),R(),setTimeout(function(){v("ready",{indexh:pt,indexv:ht,currentSlide:ct})},1)}function s(e){if(Lt.wrapper.classList.remove(ft.transition),"object"==typeof e&&c(ft,e),wt===!1&&(ft.transition="linear"),Lt.wrapper.classList.add(ft.transition),Lt.controls.style.display=ft.controls&&Lt.controls?"block":"none",Lt.progress.style.display=ft.progress&&Lt.progress?"block":"none",Lt.wrapper.classList.toggle("rtl",ft.rtl),Lt.wrapper.classList.toggle("center",ft.center),ft.mouseWheel?(document.addEventListener("DOMMouseScroll",V,!1),document.addEventListener("mousewheel",V,!1)):(document.removeEventListener("DOMMouseScroll",V,!1),document.removeEventListener("mousewheel",V,!1)),ft.rollingLinks?f():m(),ft.theme&&Lt.theme){var t=Lt.theme.getAttribute("href"),n=/[^\/]*?(?=\.css)/,r=t.match(n)[0];ft.theme!==r&&(t=t.replace(n,ft.theme),Lt.theme.setAttribute("href",t))}}function a(){if(xt=!0,window.addEventListener("hashchange",ot,!1),window.addEventListener("resize",st,!1),ft.touch&&(document.addEventListener("touchstart",Z,!1),document.addEventListener("touchmove",_,!1),document.addEventListener("touchend",Q,!1)),ft.keyboard&&document.addEventListener("keydown",$,!1),ft.progress&&Lt.progress&&Lt.progress.addEventListener("click",B,!1),ft.controls&&Lt.controls){var e="ontouchstart"in window&&null!=window.ontouchstart?"touchstart":"click";Lt.controlsLeft.forEach(function(t){t.addEventListener(e,G,!1)}),Lt.controlsRight.forEach(function(t){t.addEventListener(e,J,!1)}),Lt.controlsUp.forEach(function(t){t.addEventListener(e,et,!1)}),Lt.controlsDown.forEach(function(t){t.addEventListener(e,tt,!1)}),Lt.controlsPrev.forEach(function(t){t.addEventListener(e,nt,!1)}),Lt.controlsNext.forEach(function(t){t.addEventListener(e,rt,!1)})}}function i(){if(xt=!1,document.removeEventListener("keydown",$,!1),window.removeEventListener("hashchange",ot,!1),window.removeEventListener("resize",st,!1),ft.touch&&(document.removeEventListener("touchstart",Z,!1),document.removeEventListener("touchmove",_,!1),document.removeEventListener("touchend",Q,!1)),ft.progress&&Lt.progress&&Lt.progress.removeEventListener("click",B,!1),ft.controls&&Lt.controls){var e="ontouchstart"in window&&null!=window.ontouchstart?"touchstart":"click";Lt.controlsLeft.forEach(function(t){t.removeEventListener(e,G,!1)}),Lt.controlsRight.forEach(function(t){t.removeEventListener(e,J,!1)}),Lt.controlsUp.forEach(function(t){t.removeEventListener(e,et,!1)}),Lt.controlsDown.forEach(function(t){t.removeEventListener(e,tt,!1)}),Lt.controlsPrev.forEach(function(t){t.removeEventListener(e,nt,!1)}),Lt.controlsNext.forEach(function(t){t.removeEventListener(e,rt,!1)})}}function c(e,t){for(var n in t)e[n]=t[n]}function l(e){return Array.prototype.slice.call(e)}function d(e,t){var n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function u(){0===window.orientation?(document.documentElement.style.overflow="scroll",document.body.style.height="120%"):(document.documentElement.style.overflow="",document.body.style.height="100%"),setTimeout(function(){window.scrollTo(0,1)},10)}function v(e,t){var n=document.createEvent("HTMLEvents",1,2);n.initEvent(e,!0,!0),c(n,t),Lt.wrapper.dispatchEvent(n)}function f(){if(wt&&!("msPerspective"in document.body.style))for(var e=document.querySelectorAll(lt+" a:not(.image)"),t=0,n=e.length;n>t;t++){var r=e[t];if(!(!r.textContent||r.querySelector("*")||r.className&&r.classList.contains(r,"roll"))){var o=document.createElement("span");o.setAttribute("data-title",r.text),o.innerHTML=r.innerHTML,r.classList.add("roll"),r.innerHTML="",r.appendChild(o)}}}function m(){for(var e=document.querySelectorAll(lt+" a.roll"),t=0,n=e.length;n>t;t++){var r=e[t],o=r.querySelector("span");o&&(r.classList.remove("roll"),r.innerHTML=o.innerHTML)}}function p(e){var t=l(e);return t.forEach(function(e,t){e.hasAttribute("data-fragment-index")||e.setAttribute("data-fragment-index",t)}),t.sort(function(e,t){return e.getAttribute("data-fragment-index")-t.getAttribute("data-fragment-index")}),t}function h(){if(Lt.wrapper){var e=Lt.wrapper.offsetWidth,t=Lt.wrapper.offsetHeight;e-=t*ft.margin,t-=t*ft.margin;var n=ft.width,r=ft.height;if("string"==typeof n&&/%$/.test(n)&&(n=parseInt(n,10)/100*e),"string"==typeof r&&/%$/.test(r)&&(r=parseInt(r,10)/100*t),Lt.slides.style.width=n+"px",Lt.slides.style.height=r+"px",yt=Math.min(e/n,t/r),yt=Math.max(yt,ft.minScale),yt=Math.min(yt,ft.maxScale),void 0===Lt.slides.style.zoom||navigator.userAgent.match(/(iphone|ipod|ipad|android)/gi)){var o="translate(-50%, -50%) scale("+yt+") translate(50%, 50%)";Lt.slides.style.WebkitTransform=o,Lt.slides.style.MozTransform=o,Lt.slides.style.msTransform=o,Lt.slides.style.OTransform=o,Lt.slides.style.transform=o}else Lt.slides.style.zoom=yt;for(var s=l(document.querySelectorAll(lt)),a=0,i=s.length;i>a;a++){var c=s[a];"none"!==c.style.display&&(c.style.top=ft.center?c.classList.contains("stack")?0:Math.max(-(c.offsetHeight/2)-20,-r/2)+"px":"")}}}function g(e,t){e&&e.setAttribute("data-previous-indexv",t||0)}function y(e){return e&&e.classList.contains("stack")?parseInt(e.getAttribute("data-previous-indexv")||0,10):0}function L(){if(ft.overview){W();var e=Lt.wrapper.classList.contains("overview");Lt.wrapper.classList.add("overview"),Lt.wrapper.classList.remove("exit-overview"),clearTimeout(At),clearTimeout(kt),At=setTimeout(function(){for(var t=document.querySelectorAll(dt),n=0,r=t.length;r>n;n++){var o=t[n],s="translateZ(-2500px) translate("+105*(n-pt)+"%, 0%)";if(o.setAttribute("data-index-h",n),o.style.display="block",o.style.WebkitTransform=s,o.style.MozTransform=s,o.style.msTransform=s,o.style.OTransform=s,o.style.transform=s,o.classList.contains("stack"))for(var a=o.querySelectorAll("section"),i=0,c=a.length;c>i;i++){var l=n===pt?ht:y(o),d=a[i],u="translate(0%, "+105*(i-l)+"%)";d.setAttribute("data-index-h",n),d.setAttribute("data-index-v",i),d.style.display="block",d.style.WebkitTransform=u,d.style.MozTransform=u,d.style.msTransform=u,d.style.OTransform=u,d.style.transform=u,d.addEventListener("click",at,!0)}else o.addEventListener("click",at,!0)}h(),e||v("overviewshown",{indexh:pt,indexv:ht,currentSlide:ct})},10)}}function w(){if(ft.overview){clearTimeout(At),clearTimeout(kt),Lt.wrapper.classList.remove("overview"),Lt.wrapper.classList.add("exit-overview"),kt=setTimeout(function(){Lt.wrapper.classList.remove("exit-overview")},10);for(var e=l(document.querySelectorAll(lt)),t=0,n=e.length;n>t;t++){var r=e[t];r.style.display="",r.style.WebkitTransform="",r.style.MozTransform="",r.style.msTransform="",r.style.OTransform="",r.style.transform="",r.removeEventListener("click",at,!0)}T(pt,ht),R(),v("overviewhidden",{indexh:pt,indexv:ht,currentSlide:ct})}}function b(e){"boolean"==typeof e?e?L():w():E()?w():L()}function E(){return Lt.wrapper.classList.contains("overview")}function S(){var e=document.body,t=e.requestFullScreen||e.webkitRequestFullScreen||e.mozRequestFullScreen||e.msRequestFullScreen;t&&t.apply(e)}function q(){W(),Lt.wrapper.classList.add("paused")}function A(){R(),Lt.wrapper.classList.remove("paused")}function k(){x()?A():q()}function x(){return Lt.wrapper.classList.contains("paused")}function T(e,t,n){it=ct;var r=document.querySelectorAll(dt);void 0===t&&(t=y(r[e])),it&&it.parentNode&&it.parentNode.classList.contains("stack")&&g(it.parentNode,ht);var o=gt.concat();gt.length=0;var s=pt,a=ht;pt=M(dt,void 0===e?pt:e),ht=M(ut,void 0===t?ht:t),h();e:for(var i=0,c=gt.length;c>i;i++){for(var d=0;o.length>d;d++)if(o[d]===gt[i]){o.splice(d,1);continue e}document.documentElement.classList.add(gt[i]),v(gt[i])}for(;o.length;)document.documentElement.classList.remove(o.pop());E()&&L(),O(1500);var u=r[pt],f=u.querySelectorAll("section");if(ct=f[ht]||u,n!==void 0){var m=p(ct.querySelectorAll(".fragment"));l(m).forEach(function(e,t){n>t?e.classList.add("visible"):e.classList.remove("visible")})}pt!==s||ht!==a?v("slidechanged",{indexh:pt,indexv:ht,previousSlide:it,currentSlide:ct}):it=null,it&&(it.classList.remove("present"),document.querySelector(vt).classList.contains("present")&&setTimeout(function(){var e,t=l(document.querySelectorAll(dt+".stack"));for(e in t)t[e]&&g(t[e],0)},0)),N(),D()}function M(e,t){var n=l(document.querySelectorAll(e)),r=n.length;if(r){ft.loop&&(t%=r,0>t&&(t=r+t)),t=Math.max(Math.min(t,r-1),0);for(var o=0;r>o;o++){var s=n[o];if(E()===!1){var a=Math.abs((t-o)%(r-3))||0;s.style.display=a>3?"none":"block"}n[o].classList.remove("past"),n[o].classList.remove("present"),n[o].classList.remove("future"),t>o?n[o].classList.add("past"):o>t&&n[o].classList.add("future"),s.querySelector("section")&&n[o].classList.add("stack")}n[t].classList.add("present");var i=n[t].getAttribute("data-state");i&&(gt=gt.concat(i.split(" ")));var c=n[t].getAttribute("data-autoslide");mt=c?parseInt(c,10):ft.autoSlide}else t=0;return t}function D(){if(ft.progress&&Lt.progress){var e=l(document.querySelectorAll(dt)),t=document.querySelectorAll(lt+":not(.stack)").length,n=0;e:for(var r=0;e.length>r;r++){for(var o=e[r],s=l(o.querySelectorAll("section")),a=0;s.length>a;a++){if(s[a].classList.contains("present"))break e;n++}if(o.classList.contains("present"))break;o.classList.contains("stack")===!1&&n++}Lt.progressbar.style.width=n/(t-1)*window.innerWidth+"px"}}function N(){if(ft.controls&&Lt.controls){var e=C();Lt.controlsLeft.concat(Lt.controlsRight).concat(Lt.controlsUp).concat(Lt.controlsDown).concat(Lt.controlsPrev).concat(Lt.controlsNext).forEach(function(e){e.classList.remove("enabled")}),e.left&&Lt.controlsLeft.forEach(function(e){e.classList.add("enabled")}),e.right&&Lt.controlsRight.forEach(function(e){e.classList.add("enabled")}),e.up&&Lt.controlsUp.forEach(function(e){e.classList.add("enabled")}),e.down&&Lt.controlsDown.forEach(function(e){e.classList.add("enabled")}),(e.left||e.up)&&Lt.controlsPrev.forEach(function(e){e.classList.add("enabled")}),(e.right||e.down)&&Lt.controlsNext.forEach(function(e){e.classList.add("enabled")})}}function C(){var e=document.querySelectorAll(dt),t=document.querySelectorAll(ut);return{left:pt>0,right:e.length-1>pt,up:ht>0,down:t.length-1>ht}}function P(){var e=window.location.hash,t=e.slice(2).split("/"),n=e.replace(/#|\//gi,"");if(isNaN(parseInt(t[0],10))&&n.length){var r=document.querySelector("#"+n);if(r){var o=Reveal.getIndices(r);T(o.h,o.v)}else T(pt,ht)}else{var s=parseInt(t[0],10)||0,a=parseInt(t[1],10)||0;T(s,a)}}function O(e){if(ft.history)if(clearTimeout(qt),"number"==typeof e)qt=setTimeout(O,e);else{var t="/";ct&&"string"==typeof ct.getAttribute("id")?t="/"+ct.getAttribute("id"):((pt>0||ht>0)&&(t+=pt),ht>0&&(t+="/"+ht)),window.location.hash=t}}function z(e){var t=pt,n=ht;if(e){var r=!!e.parentNode.nodeName.match(/section/gi),o=r?e.parentNode:e,s=l(document.querySelectorAll(dt));t=Math.max(s.indexOf(o),0),r&&(n=Math.max(l(e.parentNode.querySelectorAll("section")).indexOf(e),0))}return{h:t,v:n}}function H(){if(document.querySelector(ut+".present")){var e=p(document.querySelectorAll(ut+".present .fragment:not(.visible)"));if(e.length)return e[0].classList.add("visible"),v("fragmentshown",{fragment:e[0]}),!0}else{var t=p(document.querySelectorAll(dt+".present .fragment:not(.visible)"));if(t.length)return t[0].classList.add("visible"),v("fragmentshown",{fragment:t[0]}),!0}return!1}function I(){if(document.querySelector(ut+".present")){var e=p(document.querySelectorAll(ut+".present .fragment.visible"));if(e.length)return e[e.length-1].classList.remove("visible"),v("fragmenthidden",{fragment:e[e.length-1]}),!0}else{var t=p(document.querySelectorAll(dt+".present .fragment.visible"));if(t.length)return t[t.length-1].classList.remove("visible"),v("fragmenthidden",{fragment:t[t.length-1]}),!0}return!1}function R(){clearTimeout(St),!mt||x()||E()||(St=setTimeout(K,mt))}function W(){clearTimeout(St)}function X(){(C().left&&E()||I()===!1)&&T(pt-1)}function Y(){(C().right&&E()||H()===!1)&&T(pt+1)}function F(){(C().up&&E()||I()===!1)&&T(pt,ht-1)}function U(){(C().down&&E()||H()===!1)&&T(pt,ht+1)}function j(){if(I()===!1)if(C().up)F();else{var e=document.querySelector(dt+".past:nth-child("+pt+")");e&&(ht=e.querySelectorAll("section").length+1||void 0,pt--,T())}}function K(){H()===!1&&(C().down?U():Y()),R()}function $(e){document.activeElement;var t=!(!document.activeElement||!document.activeElement.type&&!document.activeElement.href&&"inherit"===document.activeElement.contentEditable);if(!(t||e.shiftKey||e.altKey||e.ctrlKey||e.metaKey)){var n=!0;if(x()&&-1===[66,190,191].indexOf(e.keyCode))return!1;switch(e.keyCode){case 80:case 33:j();break;case 78:case 34:K();break;case 72:case 37:X();break;case 76:case 39:Y();break;case 75:case 38:F();break;case 74:case 40:U();break;case 36:T(0);break;case 35:T(Number.MAX_VALUE);break;case 32:E()?w():K();break;case 13:E()?w():n=!1;break;case 66:case 190:case 191:k();break;case 70:S();break;default:n=!1}n?e.preventDefault():27===e.keyCode&&wt&&(b(),e.preventDefault()),R()}}function Z(e){Tt.startX=e.touches[0].clientX,Tt.startY=e.touches[0].clientY,Tt.startCount=e.touches.length,2===e.touches.length&&ft.overview&&(Tt.startSpan=d({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Tt.startX,y:Tt.startY}))}function _(e){if(Tt.handled)navigator.userAgent.match(/android/gi)&&e.preventDefault();else{var t=e.touches[0].clientX,n=e.touches[0].clientY;if(2===e.touches.length&&2===Tt.startCount&&ft.overview){var r=d({x:e.touches[1].clientX,y:e.touches[1].clientY},{x:Tt.startX,y:Tt.startY});Math.abs(Tt.startSpan-r)>Tt.threshold&&(Tt.handled=!0,Tt.startSpan>r?L():w()),e.preventDefault()}else if(1===e.touches.length&&2!==Tt.startCount){var o=t-Tt.startX,s=n-Tt.startY;o>Tt.threshold&&Math.abs(o)>Math.abs(s)?(Tt.handled=!0,X()):-Tt.threshold>o&&Math.abs(o)>Math.abs(s)?(Tt.handled=!0,Y()):s>Tt.threshold?(Tt.handled=!0,F()):-Tt.threshold>s&&(Tt.handled=!0,U()),e.preventDefault()}}}function Q(){Tt.handled=!1}function V(e){clearTimeout(Et),Et=setTimeout(function(){var t=e.detail||-e.wheelDelta;t>0?K():j()},100)}function B(e){e.preventDefault();var t=l(document.querySelectorAll(dt)).length,n=Math.floor(e.clientX/Lt.wrapper.offsetWidth*t);T(n)}function G(e){e.preventDefault(),X()}function J(e){e.preventDefault(),Y()}function et(e){e.preventDefault(),F()}function tt(e){e.preventDefault(),U()}function nt(e){e.preventDefault(),j()}function rt(e){e.preventDefault(),K()}function ot(){P()}function st(){h()}function at(e){if(xt&&E()){e.preventDefault();for(var t=e.target;t&&!t.nodeName.match(/section/gi);)t=t.parentNode;if(t&&!t.classList.contains("disabled")&&(w(),t.nodeName.match(/section/gi))){var n=parseInt(t.getAttribute("data-index-h"),10),r=parseInt(t.getAttribute("data-index-v"),10);T(n,r)}}}var it,ct,lt=".reveal .slides section",dt=".reveal .slides>section",ut=".reveal .slides>section.present>section",vt=".reveal .slides>section:first-child",ft={width:960,height:700,margin:.1,minScale:.2,maxScale:1,controls:!0,progress:!0,history:!1,keyboard:!0,overview:!0,center:!0,touch:!0,loop:!1,rtl:!1,autoSlide:0,mouseWheel:!1,rollingLinks:!0,theme:null,transition:"default",dependencies:[]},mt=ft.autoSlide,pt=0,ht=0,gt=[],yt=1,Lt={},wt="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,bt="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,Et=0,St=0,qt=0,At=0,kt=0,xt=!1,Tt={startX:0,startY:0,startSpan:0,startCount:0,handled:!1,threshold:80};return{initialize:e,configure:s,slide:T,left:X,right:Y,up:F,down:U,prev:j,next:K,prevFragment:I,nextFragment:H,navigateTo:T,navigateLeft:X,navigateRight:Y,navigateUp:F,navigateDown:U,navigatePrev:j,navigateNext:K,layout:h,toggleOverview:b,togglePause:k,isOverview:E,isPaused:x,addEventListeners:a,removeEventListeners:i,getIndices:z,getSlide:function(e,t){var n=document.querySelectorAll(dt)[e],r=n&&n.querySelectorAll("section");return t!==void 0?r?r[t]:void 0:n},getPreviousSlide:function(){return it},getCurrentSlide:function(){return ct},getScale:function(){return yt},getQueryHash:function(){var e={};return location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(t){e[t.split("=").shift()]=t.split("=").pop()}),e},isFirstSlide:function(){return null==document.querySelector(lt+".past")?!0:!1},isLastSlide:function(){return ct&&ct.classList.contains(".stack")?null==ct.querySelector(lt+".future")?!0:!1:null==document.querySelector(lt+".future")?!0:!1},addEventListener:function(e,t,n){"addEventListener"in window&&(Lt.wrapper||document.querySelector(".reveal")).addEventListener(e,t,n)},removeEventListener:function(e,t,n){"addEventListener"in window&&(Lt.wrapper||document.querySelector(".reveal")).removeEventListener(e,t,n)}}}(); \ No newline at end of file