new shorter api method names (closes #178), restructured and cleaned up core js
This commit is contained in:
parent
e15beb47f0
commit
470cabaea8
14
README.md
14
README.md
|
@ -124,13 +124,13 @@ The Reveal class provides a minimal JavaScript API for controlling navigation an
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
// Navigation
|
// Navigation
|
||||||
Reveal.navigateTo( indexh, indexv );
|
Reveal.slide( indexh, indexv );
|
||||||
Reveal.navigateLeft();
|
Reveal.left();
|
||||||
Reveal.navigateRight();
|
Reveal.right();
|
||||||
Reveal.navigateUp();
|
Reveal.up();
|
||||||
Reveal.navigateDown();
|
Reveal.down();
|
||||||
Reveal.navigatePrev();
|
Reveal.prev();
|
||||||
Reveal.navigateNext();
|
Reveal.next();
|
||||||
Reveal.toggleOverview();
|
Reveal.toggleOverview();
|
||||||
|
|
||||||
// Retrieves the previous and current slide elements
|
// Retrieves the previous and current slide elements
|
||||||
|
|
39
index.html
39
index.html
|
@ -353,5 +353,44 @@ function linkify( selector ) {
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<!-- Everything below this point is unrelated to the slideshow -->
|
||||||
|
|
||||||
|
<div class="share-reveal" style="position: absolute; bottom: 10px; left: 50%; margin-left: -205px">
|
||||||
|
<a href="http://twitter.com/share" class="twitter-share-button" data-text="reveal.js - an HTML presentation framework from @hakimel." data-url="http://lab.hakim.se/reveal-js" data-count="small" data-related="hakimel"></a>
|
||||||
|
|
||||||
|
<iframe id="facebook-button" src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fapp.hakim.se%2Freveal-js%2F&layout=button_count&show_faces=false&width=93&action=like&font=arial&colorscheme=light&height=21" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:85px; height:24px; position: relative; top: 4px;" allowTransparency="true"></iframe>
|
||||||
|
|
||||||
|
<a class="FlattrButton" style="display:none;" rev="flattr;button:compact;" href="http://lab.hakim.se/reveal-js"></a>
|
||||||
|
|
||||||
|
<a href="https://twitter.com/rvlio" class="twitter-follow-button" data-show-count="false" data-dnt="true">Follow @rvlio</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<a class="fork-reveal" href="https://github.com/hakimel/reveal.js"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://a248.e.akamai.net/camo.github.com/e6bef7a091f5f3138b8cd40bc3e114258dd68ddf/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub"></a>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
/* <![CDATA[ */
|
||||||
|
(function() {
|
||||||
|
var s = document.createElement('script'), t = document.getElementsByTagName('script')[0];
|
||||||
|
s.type = 'text/javascript';
|
||||||
|
s.async = true;
|
||||||
|
s.src = 'http://api.flattr.com/js/0.6/load.js?mode=auto';
|
||||||
|
t.parentNode.insertBefore(s, t);
|
||||||
|
})();
|
||||||
|
/* ]]> */
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var _gaq = [['_setAccount', 'UA-15240703-1'], ['_trackPageview']];
|
||||||
|
(function(d, t) {
|
||||||
|
var g = d.createElement(t),
|
||||||
|
s = d.getElementsByTagName(t)[0];
|
||||||
|
g.async = true;
|
||||||
|
g.src = ('https:' == location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||||
|
s.parentNode.insertBefore(g, s);
|
||||||
|
})(document, 'script');
|
||||||
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
774
js/reveal.js
774
js/reveal.js
|
@ -1,5 +1,5 @@
|
||||||
/*!
|
/*!
|
||||||
* reveal.js 2.1 r32
|
* reveal.js 2.1 r33
|
||||||
* http://lab.hakim.se/reveal-js
|
* http://lab.hakim.se/reveal-js
|
||||||
* MIT licensed
|
* MIT licensed
|
||||||
*
|
*
|
||||||
|
@ -285,6 +285,20 @@ var Reveal = (function(){
|
||||||
dom.progress.style.display = 'block';
|
dom.progress.style.display = 'block';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( config.transition !== 'default' ) {
|
||||||
|
dom.wrapper.classList.add( config.transition );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( config.mouseWheel ) {
|
||||||
|
document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
|
||||||
|
document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3D links
|
||||||
|
if( config.rollingLinks ) {
|
||||||
|
linkify();
|
||||||
|
}
|
||||||
|
|
||||||
// Load the theme in the config, if it's not already loaded
|
// Load the theme in the config, if it's not already loaded
|
||||||
if( config.theme && dom.theme ) {
|
if( config.theme && dom.theme ) {
|
||||||
var themeURL = dom.theme.getAttribute( 'href' );
|
var themeURL = dom.theme.getAttribute( 'href' );
|
||||||
|
@ -296,22 +310,11 @@ var Reveal = (function(){
|
||||||
dom.theme.setAttribute( 'href', themeURL );
|
dom.theme.setAttribute( 'href', themeURL );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( config.transition !== 'default' ) {
|
|
||||||
dom.wrapper.classList.add( config.transition );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( config.mouseWheel ) {
|
|
||||||
document.addEventListener( 'DOMMouseScroll', onDocumentMouseScroll, false ); // FF
|
|
||||||
document.addEventListener( 'mousewheel', onDocumentMouseScroll, false );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( config.rollingLinks ) {
|
|
||||||
// Add some 3D magic to our anchors
|
|
||||||
linkify();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds all event listeners.
|
||||||
|
*/
|
||||||
function addEventListeners() {
|
function addEventListeners() {
|
||||||
document.addEventListener( 'touchstart', onDocumentTouchStart, false );
|
document.addEventListener( 'touchstart', onDocumentTouchStart, false );
|
||||||
document.addEventListener( 'touchmove', onDocumentTouchMove, false );
|
document.addEventListener( 'touchmove', onDocumentTouchMove, false );
|
||||||
|
@ -330,6 +333,9 @@ var Reveal = (function(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unbinds all event listeners.
|
||||||
|
*/
|
||||||
function removeEventListeners() {
|
function removeEventListeners() {
|
||||||
document.removeEventListener( 'keydown', onDocumentKeyDown, false );
|
document.removeEventListener( 'keydown', onDocumentKeyDown, false );
|
||||||
document.removeEventListener( 'touchstart', onDocumentTouchStart, false );
|
document.removeEventListener( 'touchstart', onDocumentTouchStart, false );
|
||||||
|
@ -403,210 +409,6 @@ var Reveal = (function(){
|
||||||
extend( event, properties );
|
extend( event, properties );
|
||||||
dom.wrapper.dispatchEvent( event );
|
dom.wrapper.dispatchEvent( event );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for the document level 'keydown' event.
|
|
||||||
*
|
|
||||||
* @param {Object} event
|
|
||||||
*/
|
|
||||||
function onDocumentKeyDown( event ) {
|
|
||||||
// Disregard the event if the target is editable or a
|
|
||||||
// modifier is present
|
|
||||||
if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
|
|
||||||
|
|
||||||
var triggered = true;
|
|
||||||
|
|
||||||
switch( event.keyCode ) {
|
|
||||||
// p, page up
|
|
||||||
case 80: case 33: navigatePrev(); break;
|
|
||||||
// n, page down
|
|
||||||
case 78: case 34: navigateNext(); break;
|
|
||||||
// h, left
|
|
||||||
case 72: case 37: navigateLeft(); break;
|
|
||||||
// l, right
|
|
||||||
case 76: case 39: navigateRight(); break;
|
|
||||||
// k, up
|
|
||||||
case 75: case 38: navigateUp(); break;
|
|
||||||
// j, down
|
|
||||||
case 74: case 40: navigateDown(); break;
|
|
||||||
// home
|
|
||||||
case 36: navigateTo( 0 ); break;
|
|
||||||
// end
|
|
||||||
case 35: navigateTo( Number.MAX_VALUE ); break;
|
|
||||||
// space
|
|
||||||
case 32: isOverviewActive() ? deactivateOverview() : navigateNext(); break;
|
|
||||||
// return
|
|
||||||
case 13: isOverviewActive() ? deactivateOverview() : triggered = false; break;
|
|
||||||
// b, period
|
|
||||||
case 66: case 190: togglePause(); break;
|
|
||||||
// f
|
|
||||||
case 70: enterFullscreen(); break;
|
|
||||||
default:
|
|
||||||
triggered = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the input resulted in a triggered action we should prevent
|
|
||||||
// the browsers default behavior
|
|
||||||
if( triggered ) {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
else if ( event.keyCode === 27 && supports3DTransforms ) {
|
|
||||||
toggleOverview();
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If auto-sliding is enabled we need to cue up
|
|
||||||
// another timeout
|
|
||||||
cueAutoSlide();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for the document level 'touchstart' event,
|
|
||||||
* enables support for swipe and pinch gestures.
|
|
||||||
*/
|
|
||||||
function onDocumentTouchStart( event ) {
|
|
||||||
touch.startX = event.touches[0].clientX;
|
|
||||||
touch.startY = event.touches[0].clientY;
|
|
||||||
touch.startCount = event.touches.length;
|
|
||||||
|
|
||||||
// If there's two touches we need to memorize the distance
|
|
||||||
// between those two points to detect pinching
|
|
||||||
if( event.touches.length === 2 && config.overview ) {
|
|
||||||
touch.startSpan = distanceBetween( {
|
|
||||||
x: event.touches[1].clientX,
|
|
||||||
y: event.touches[1].clientY
|
|
||||||
}, {
|
|
||||||
x: touch.startX,
|
|
||||||
y: touch.startY
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for the document level 'touchmove' event.
|
|
||||||
*/
|
|
||||||
function onDocumentTouchMove( event ) {
|
|
||||||
// Each touch should only trigger one action
|
|
||||||
if( !touch.handled ) {
|
|
||||||
var currentX = event.touches[0].clientX;
|
|
||||||
var currentY = event.touches[0].clientY;
|
|
||||||
|
|
||||||
// If the touch started off with two points and still has
|
|
||||||
// two active touches; test for the pinch gesture
|
|
||||||
if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) {
|
|
||||||
|
|
||||||
// The current distance in pixels between the two touch points
|
|
||||||
var currentSpan = distanceBetween( {
|
|
||||||
x: event.touches[1].clientX,
|
|
||||||
y: event.touches[1].clientY
|
|
||||||
}, {
|
|
||||||
x: touch.startX,
|
|
||||||
y: touch.startY
|
|
||||||
} );
|
|
||||||
|
|
||||||
// If the span is larger than the desire amount we've got
|
|
||||||
// ourselves a pinch
|
|
||||||
if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
|
|
||||||
touch.handled = true;
|
|
||||||
|
|
||||||
if( currentSpan < touch.startSpan ) {
|
|
||||||
activateOverview();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
deactivateOverview();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
}
|
|
||||||
// There was only one touch point, look for a swipe
|
|
||||||
else if( event.touches.length === 1 && touch.startCount !== 2 ) {
|
|
||||||
|
|
||||||
var deltaX = currentX - touch.startX,
|
|
||||||
deltaY = currentY - touch.startY;
|
|
||||||
|
|
||||||
if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
|
|
||||||
touch.handled = true;
|
|
||||||
navigateLeft();
|
|
||||||
}
|
|
||||||
else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
|
|
||||||
touch.handled = true;
|
|
||||||
navigateRight();
|
|
||||||
}
|
|
||||||
else if( deltaY > touch.threshold ) {
|
|
||||||
touch.handled = true;
|
|
||||||
navigateUp();
|
|
||||||
}
|
|
||||||
else if( deltaY < -touch.threshold ) {
|
|
||||||
touch.handled = true;
|
|
||||||
navigateDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// There's a bug with swiping on some Android devices unless
|
|
||||||
// the default action is always prevented
|
|
||||||
else if( navigator.userAgent.match( /android/gi ) ) {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for the document level 'touchend' event.
|
|
||||||
*/
|
|
||||||
function onDocumentTouchEnd( event ) {
|
|
||||||
touch.handled = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles mouse wheel scrolling, throttled to avoid
|
|
||||||
* skipping multiple slides.
|
|
||||||
*/
|
|
||||||
function onDocumentMouseScroll( event ){
|
|
||||||
clearTimeout( mouseWheelTimeout );
|
|
||||||
|
|
||||||
mouseWheelTimeout = setTimeout( function() {
|
|
||||||
var delta = event.detail || -event.wheelDelta;
|
|
||||||
if( delta > 0 ) {
|
|
||||||
navigateNext();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
navigatePrev();
|
|
||||||
}
|
|
||||||
}, 100 );
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handler for the window level 'hashchange' event.
|
|
||||||
*
|
|
||||||
* @param {Object} event
|
|
||||||
*/
|
|
||||||
function onWindowHashChange( event ) {
|
|
||||||
readURL();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Invoked when a slide is and we're in the overview.
|
|
||||||
*/
|
|
||||||
function onOverviewSlideClicked( event ) {
|
|
||||||
// TODO There's a bug here where the event listeners are not
|
|
||||||
// removed after deactivating the overview.
|
|
||||||
if( isOverviewActive() ) {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
deactivateOverview();
|
|
||||||
|
|
||||||
indexh = this.getAttribute( 'data-index-h' );
|
|
||||||
indexv = this.getAttribute( 'data-index-v' );
|
|
||||||
|
|
||||||
slide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrap all links in 3D goodness.
|
* Wrap all links in 3D goodness.
|
||||||
|
@ -795,101 +597,6 @@ var Reveal = (function(){
|
||||||
function isPaused() {
|
function isPaused() {
|
||||||
return dom.wrapper.classList.contains( 'paused' );
|
return dom.wrapper.classList.contains( 'paused' );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Updates one dimension of slides by showing the slide
|
|
||||||
* with the specified index.
|
|
||||||
*
|
|
||||||
* @param {String} selector A CSS selector that will fetch
|
|
||||||
* the group of slides we are working with
|
|
||||||
* @param {Number} index The index of the slide that should be
|
|
||||||
* shown
|
|
||||||
*
|
|
||||||
* @return {Number} The index of the slide that is now shown,
|
|
||||||
* might differ from the passed in index if it was out of
|
|
||||||
* bounds.
|
|
||||||
*/
|
|
||||||
function updateSlides( selector, index ) {
|
|
||||||
// Select all slides and convert the NodeList result to
|
|
||||||
// an array
|
|
||||||
var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ),
|
|
||||||
slidesLength = slides.length;
|
|
||||||
|
|
||||||
if( slidesLength ) {
|
|
||||||
|
|
||||||
// Should the index loop?
|
|
||||||
if( config.loop ) {
|
|
||||||
index %= slidesLength;
|
|
||||||
|
|
||||||
if( index < 0 ) {
|
|
||||||
index = slidesLength + index;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Enforce max and minimum index bounds
|
|
||||||
index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
|
|
||||||
|
|
||||||
for( var i = 0; i < slidesLength; i++ ) {
|
|
||||||
var slide = slides[i];
|
|
||||||
|
|
||||||
// Optimization; hide all slides that are three or more steps
|
|
||||||
// away from the present slide
|
|
||||||
if( isOverviewActive() === false ) {
|
|
||||||
// The distance loops so that it measures 1 between the first
|
|
||||||
// and last slides
|
|
||||||
var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
|
|
||||||
|
|
||||||
slide.style.display = distance > 3 ? 'none' : 'block';
|
|
||||||
}
|
|
||||||
|
|
||||||
slides[i].classList.remove( 'past' );
|
|
||||||
slides[i].classList.remove( 'present' );
|
|
||||||
slides[i].classList.remove( 'future' );
|
|
||||||
|
|
||||||
if( i < index ) {
|
|
||||||
// Any element previous to index is given the 'past' class
|
|
||||||
slides[i].classList.add( 'past' );
|
|
||||||
}
|
|
||||||
else if( i > index ) {
|
|
||||||
// Any element subsequent to index is given the 'future' class
|
|
||||||
slides[i].classList.add( 'future' );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this element contains vertical slides
|
|
||||||
if( slide.querySelector( 'section' ) ) {
|
|
||||||
slides[i].classList.add( 'stack' );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark the current slide as present
|
|
||||||
slides[index].classList.add( 'present' );
|
|
||||||
|
|
||||||
// If this slide has a state associated with it, add it
|
|
||||||
// onto the current state of the deck
|
|
||||||
var slideState = slides[index].getAttribute( 'data-state' );
|
|
||||||
if( slideState ) {
|
|
||||||
state = state.concat( slideState.split( ' ' ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
// If this slide has a data-autoslide attribtue associated use this as
|
|
||||||
// autoSlide value otherwise use the global configured time
|
|
||||||
var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' );
|
|
||||||
if( slideAutoSlide ) {
|
|
||||||
autoSlide = parseInt( slideAutoSlide );
|
|
||||||
} else {
|
|
||||||
autoSlide = config.autoSlide
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// Since there are no slides we can't be anywhere beyond the
|
|
||||||
// zeroth index
|
|
||||||
index = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return index;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Steps from the current point in the presentation to the
|
* Steps from the current point in the presentation to the
|
||||||
|
@ -986,26 +693,121 @@ var Reveal = (function(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates one dimension of slides by showing the slide
|
||||||
|
* with the specified index.
|
||||||
|
*
|
||||||
|
* @param {String} selector A CSS selector that will fetch
|
||||||
|
* the group of slides we are working with
|
||||||
|
* @param {Number} index The index of the slide that should be
|
||||||
|
* shown
|
||||||
|
*
|
||||||
|
* @return {Number} The index of the slide that is now shown,
|
||||||
|
* might differ from the passed in index if it was out of
|
||||||
|
* bounds.
|
||||||
|
*/
|
||||||
|
function updateSlides( selector, index ) {
|
||||||
|
// Select all slides and convert the NodeList result to
|
||||||
|
// an array
|
||||||
|
var slides = Array.prototype.slice.call( document.querySelectorAll( selector ) ),
|
||||||
|
slidesLength = slides.length;
|
||||||
|
|
||||||
|
if( slidesLength ) {
|
||||||
|
|
||||||
|
// Should the index loop?
|
||||||
|
if( config.loop ) {
|
||||||
|
index %= slidesLength;
|
||||||
|
|
||||||
|
if( index < 0 ) {
|
||||||
|
index = slidesLength + index;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enforce max and minimum index bounds
|
||||||
|
index = Math.max( Math.min( index, slidesLength - 1 ), 0 );
|
||||||
|
|
||||||
|
for( var i = 0; i < slidesLength; i++ ) {
|
||||||
|
var element = slides[i];
|
||||||
|
|
||||||
|
// Optimization; hide all slides that are three or more steps
|
||||||
|
// away from the present slide
|
||||||
|
if( isOverviewActive() === false ) {
|
||||||
|
// The distance loops so that it measures 1 between the first
|
||||||
|
// and last slides
|
||||||
|
var distance = Math.abs( ( index - i ) % ( slidesLength - 3 ) ) || 0;
|
||||||
|
|
||||||
|
element.style.display = distance > 3 ? 'none' : 'block';
|
||||||
|
}
|
||||||
|
|
||||||
|
slides[i].classList.remove( 'past' );
|
||||||
|
slides[i].classList.remove( 'present' );
|
||||||
|
slides[i].classList.remove( 'future' );
|
||||||
|
|
||||||
|
if( i < index ) {
|
||||||
|
// Any element previous to index is given the 'past' class
|
||||||
|
slides[i].classList.add( 'past' );
|
||||||
|
}
|
||||||
|
else if( i > index ) {
|
||||||
|
// Any element subsequent to index is given the 'future' class
|
||||||
|
slides[i].classList.add( 'future' );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this element contains vertical slides
|
||||||
|
if( element.querySelector( 'section' ) ) {
|
||||||
|
slides[i].classList.add( 'stack' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark the current slide as present
|
||||||
|
slides[index].classList.add( 'present' );
|
||||||
|
|
||||||
|
// If this slide has a state associated with it, add it
|
||||||
|
// onto the current state of the deck
|
||||||
|
var slideState = slides[index].getAttribute( 'data-state' );
|
||||||
|
if( slideState ) {
|
||||||
|
state = state.concat( slideState.split( ' ' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// If this slide has a data-autoslide attribtue associated use this as
|
||||||
|
// autoSlide value otherwise use the global configured time
|
||||||
|
var slideAutoSlide = slides[index].getAttribute( 'data-autoslide' );
|
||||||
|
if( slideAutoSlide ) {
|
||||||
|
autoSlide = parseInt( slideAutoSlide );
|
||||||
|
} else {
|
||||||
|
autoSlide = config.autoSlide
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Since there are no slides we can't be anywhere beyond the
|
||||||
|
// zeroth index
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return index;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the state and link pointers of the controls.
|
* Updates the state and link pointers of the controls.
|
||||||
*/
|
*/
|
||||||
function updateControls() {
|
function updateControls() {
|
||||||
if ( !config.controls || !dom.controls ) {
|
if ( config.controls && dom.controls ) {
|
||||||
return;
|
|
||||||
|
var routes = availableRoutes();
|
||||||
|
|
||||||
|
// Remove the 'enabled' class from all directions
|
||||||
|
[ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) {
|
||||||
|
node.classList.remove( 'enabled' );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// Add the 'enabled' class to the available routes
|
||||||
|
if( routes.left ) dom.controlsLeft.classList.add( 'enabled' );
|
||||||
|
if( routes.right ) dom.controlsRight.classList.add( 'enabled' );
|
||||||
|
if( routes.up ) dom.controlsUp.classList.add( 'enabled' );
|
||||||
|
if( routes.down ) dom.controlsDown.classList.add( 'enabled' );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var routes = availableRoutes();
|
|
||||||
|
|
||||||
// Remove the 'enabled' class from all directions
|
|
||||||
[ dom.controlsLeft, dom.controlsRight, dom.controlsUp, dom.controlsDown ].forEach( function( node ) {
|
|
||||||
node.classList.remove( 'enabled' );
|
|
||||||
} );
|
|
||||||
|
|
||||||
// Add the 'enabled' class to the available routes
|
|
||||||
if( routes.left ) dom.controlsLeft.classList.add( 'enabled' );
|
|
||||||
if( routes.right ) dom.controlsRight.classList.add( 'enabled' );
|
|
||||||
if( routes.up ) dom.controlsUp.classList.add( 'enabled' );
|
|
||||||
if( routes.down ) dom.controlsDown.classList.add( 'enabled' );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1039,16 +841,16 @@ var Reveal = (function(){
|
||||||
// assume that this is a named link
|
// assume that this is a named link
|
||||||
if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) {
|
if( isNaN( parseInt( bits[0], 10 ) ) && name.length ) {
|
||||||
// Find the slide with the specified name
|
// Find the slide with the specified name
|
||||||
var slide = document.querySelector( '#' + name );
|
var element = document.querySelector( '#' + name );
|
||||||
|
|
||||||
if( slide ) {
|
if( element ) {
|
||||||
// Find the position of the named slide and navigate to it
|
// Find the position of the named slide and navigate to it
|
||||||
var indices = Reveal.getIndices( slide );
|
var indices = Reveal.getIndices( element );
|
||||||
navigateTo( indices.h, indices.v );
|
slide( indices.h, indices.v );
|
||||||
}
|
}
|
||||||
// If the slide doesn't exist, navigate to the current slide
|
// If the slide doesn't exist, navigate to the current slide
|
||||||
else {
|
else {
|
||||||
navigateTo( indexh, indexv );
|
slide( indexh, indexv );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1056,7 +858,7 @@ var Reveal = (function(){
|
||||||
var h = parseInt( bits[0], 10 ) || 0,
|
var h = parseInt( bits[0], 10 ) || 0,
|
||||||
v = parseInt( bits[1], 10 ) || 0;
|
v = parseInt( bits[1], 10 ) || 0;
|
||||||
|
|
||||||
navigateTo( h, v );
|
slide( h, v );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1077,6 +879,41 @@ var Reveal = (function(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the h/v location of the current, or specified,
|
||||||
|
* slide.
|
||||||
|
*
|
||||||
|
* @param {HTMLElement} slide If specified, the returned
|
||||||
|
* index will be for this slide rather than the currently
|
||||||
|
* active one
|
||||||
|
*
|
||||||
|
* @return {Object} { h: <int>, v: <int> }
|
||||||
|
*/
|
||||||
|
function getIndices( slide ) {
|
||||||
|
// By default, return the current indices
|
||||||
|
var h = indexh,
|
||||||
|
v = indexv;
|
||||||
|
|
||||||
|
// If a slide is specified, return the indices of that slide
|
||||||
|
if( slide ) {
|
||||||
|
var isVertical = !!slide.parentNode.nodeName.match( /section/gi );
|
||||||
|
var slideh = isVertical ? slide.parentNode : slide;
|
||||||
|
|
||||||
|
// Select all horizontal slides
|
||||||
|
var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
|
||||||
|
|
||||||
|
// Now that we know which the horizontal slide is, get its index
|
||||||
|
h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
|
||||||
|
|
||||||
|
// If this is a vertical slide, grab the vertical index
|
||||||
|
if( isVertical ) {
|
||||||
|
v = Math.max( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { h: h, v: v };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Navigate to the next slide fragment.
|
* Navigate to the next slide fragment.
|
||||||
*
|
*
|
||||||
|
@ -1155,16 +992,6 @@ var Reveal = (function(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Triggers a navigation to the specified indices.
|
|
||||||
*
|
|
||||||
* @param {Number} h The horizontal index of the slide to show
|
|
||||||
* @param {Number} v The vertical index of the slide to show
|
|
||||||
*/
|
|
||||||
function navigateTo( h, v ) {
|
|
||||||
slide( h, v );
|
|
||||||
}
|
|
||||||
|
|
||||||
function navigateLeft() {
|
function navigateLeft() {
|
||||||
// Prioritize hiding fragments
|
// Prioritize hiding fragments
|
||||||
if( isOverviewActive() || previousFragment() === false ) {
|
if( isOverviewActive() || previousFragment() === false ) {
|
||||||
|
@ -1232,16 +1059,244 @@ var Reveal = (function(){
|
||||||
cueAutoSlide();
|
cueAutoSlide();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Expose some methods publicly
|
|
||||||
|
// --------------------------------------------------------------------//
|
||||||
|
// ----------------------------- EVENTS -------------------------------//
|
||||||
|
// --------------------------------------------------------------------//
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the document level 'keydown' event.
|
||||||
|
*
|
||||||
|
* @param {Object} event
|
||||||
|
*/
|
||||||
|
function onDocumentKeyDown( event ) {
|
||||||
|
// Disregard the event if the target is editable or a
|
||||||
|
// modifier is present
|
||||||
|
if ( document.querySelector( ':focus' ) !== null || event.shiftKey || event.altKey || event.ctrlKey || event.metaKey ) return;
|
||||||
|
|
||||||
|
var triggered = true;
|
||||||
|
|
||||||
|
switch( event.keyCode ) {
|
||||||
|
// p, page up
|
||||||
|
case 80: case 33: navigatePrev(); break;
|
||||||
|
// n, page down
|
||||||
|
case 78: case 34: navigateNext(); break;
|
||||||
|
// h, left
|
||||||
|
case 72: case 37: navigateLeft(); break;
|
||||||
|
// l, right
|
||||||
|
case 76: case 39: navigateRight(); break;
|
||||||
|
// k, up
|
||||||
|
case 75: case 38: navigateUp(); break;
|
||||||
|
// j, down
|
||||||
|
case 74: case 40: navigateDown(); break;
|
||||||
|
// home
|
||||||
|
case 36: slide( 0 ); break;
|
||||||
|
// end
|
||||||
|
case 35: slide( Number.MAX_VALUE ); break;
|
||||||
|
// space
|
||||||
|
case 32: isOverviewActive() ? deactivateOverview() : navigateNext(); break;
|
||||||
|
// return
|
||||||
|
case 13: isOverviewActive() ? deactivateOverview() : triggered = false; break;
|
||||||
|
// b, period
|
||||||
|
case 66: case 190: togglePause(); break;
|
||||||
|
// f
|
||||||
|
case 70: enterFullscreen(); break;
|
||||||
|
default:
|
||||||
|
triggered = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the input resulted in a triggered action we should prevent
|
||||||
|
// the browsers default behavior
|
||||||
|
if( triggered ) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
else if ( event.keyCode === 27 && supports3DTransforms ) {
|
||||||
|
toggleOverview();
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
// If auto-sliding is enabled we need to cue up
|
||||||
|
// another timeout
|
||||||
|
cueAutoSlide();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the document level 'touchstart' event,
|
||||||
|
* enables support for swipe and pinch gestures.
|
||||||
|
*/
|
||||||
|
function onDocumentTouchStart( event ) {
|
||||||
|
touch.startX = event.touches[0].clientX;
|
||||||
|
touch.startY = event.touches[0].clientY;
|
||||||
|
touch.startCount = event.touches.length;
|
||||||
|
|
||||||
|
// If there's two touches we need to memorize the distance
|
||||||
|
// between those two points to detect pinching
|
||||||
|
if( event.touches.length === 2 && config.overview ) {
|
||||||
|
touch.startSpan = distanceBetween( {
|
||||||
|
x: event.touches[1].clientX,
|
||||||
|
y: event.touches[1].clientY
|
||||||
|
}, {
|
||||||
|
x: touch.startX,
|
||||||
|
y: touch.startY
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the document level 'touchmove' event.
|
||||||
|
*/
|
||||||
|
function onDocumentTouchMove( event ) {
|
||||||
|
// Each touch should only trigger one action
|
||||||
|
if( !touch.handled ) {
|
||||||
|
var currentX = event.touches[0].clientX;
|
||||||
|
var currentY = event.touches[0].clientY;
|
||||||
|
|
||||||
|
// If the touch started off with two points and still has
|
||||||
|
// two active touches; test for the pinch gesture
|
||||||
|
if( event.touches.length === 2 && touch.startCount === 2 && config.overview ) {
|
||||||
|
|
||||||
|
// The current distance in pixels between the two touch points
|
||||||
|
var currentSpan = distanceBetween( {
|
||||||
|
x: event.touches[1].clientX,
|
||||||
|
y: event.touches[1].clientY
|
||||||
|
}, {
|
||||||
|
x: touch.startX,
|
||||||
|
y: touch.startY
|
||||||
|
} );
|
||||||
|
|
||||||
|
// If the span is larger than the desire amount we've got
|
||||||
|
// ourselves a pinch
|
||||||
|
if( Math.abs( touch.startSpan - currentSpan ) > touch.threshold ) {
|
||||||
|
touch.handled = true;
|
||||||
|
|
||||||
|
if( currentSpan < touch.startSpan ) {
|
||||||
|
activateOverview();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
deactivateOverview();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
}
|
||||||
|
// There was only one touch point, look for a swipe
|
||||||
|
else if( event.touches.length === 1 && touch.startCount !== 2 ) {
|
||||||
|
|
||||||
|
var deltaX = currentX - touch.startX,
|
||||||
|
deltaY = currentY - touch.startY;
|
||||||
|
|
||||||
|
if( deltaX > touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
|
||||||
|
touch.handled = true;
|
||||||
|
navigateLeft();
|
||||||
|
}
|
||||||
|
else if( deltaX < -touch.threshold && Math.abs( deltaX ) > Math.abs( deltaY ) ) {
|
||||||
|
touch.handled = true;
|
||||||
|
navigateRight();
|
||||||
|
}
|
||||||
|
else if( deltaY > touch.threshold ) {
|
||||||
|
touch.handled = true;
|
||||||
|
navigateUp();
|
||||||
|
}
|
||||||
|
else if( deltaY < -touch.threshold ) {
|
||||||
|
touch.handled = true;
|
||||||
|
navigateDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// There's a bug with swiping on some Android devices unless
|
||||||
|
// the default action is always prevented
|
||||||
|
else if( navigator.userAgent.match( /android/gi ) ) {
|
||||||
|
event.preventDefault();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the document level 'touchend' event.
|
||||||
|
*/
|
||||||
|
function onDocumentTouchEnd( event ) {
|
||||||
|
touch.handled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles mouse wheel scrolling, throttled to avoid
|
||||||
|
* skipping multiple slides.
|
||||||
|
*/
|
||||||
|
function onDocumentMouseScroll( event ){
|
||||||
|
clearTimeout( mouseWheelTimeout );
|
||||||
|
|
||||||
|
mouseWheelTimeout = setTimeout( function() {
|
||||||
|
var delta = event.detail || -event.wheelDelta;
|
||||||
|
if( delta > 0 ) {
|
||||||
|
navigateNext();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
navigatePrev();
|
||||||
|
}
|
||||||
|
}, 100 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the window level 'hashchange' event.
|
||||||
|
*
|
||||||
|
* @param {Object} event
|
||||||
|
*/
|
||||||
|
function onWindowHashChange( event ) {
|
||||||
|
readURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Invoked when a slide is and we're in the overview.
|
||||||
|
*/
|
||||||
|
function onOverviewSlideClicked( event ) {
|
||||||
|
// TODO There's a bug here where the event listeners are not
|
||||||
|
// removed after deactivating the overview.
|
||||||
|
if( isOverviewActive() ) {
|
||||||
|
event.preventDefault();
|
||||||
|
|
||||||
|
deactivateOverview();
|
||||||
|
|
||||||
|
indexh = this.getAttribute( 'data-index-h' );
|
||||||
|
indexv = this.getAttribute( 'data-index-v' );
|
||||||
|
|
||||||
|
slide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------//
|
||||||
|
// ------------------------------- API --------------------------------//
|
||||||
|
// --------------------------------------------------------------------//
|
||||||
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
initialize: initialize,
|
initialize: initialize,
|
||||||
navigateTo: navigateTo,
|
|
||||||
|
// Navigation methods
|
||||||
|
slide: slide,
|
||||||
|
left: navigateLeft,
|
||||||
|
right: navigateRight,
|
||||||
|
up: navigateUp,
|
||||||
|
down: navigateDown,
|
||||||
|
prev: navigatePrev,
|
||||||
|
next: navigateNext,
|
||||||
|
|
||||||
|
// Deprecated aliases
|
||||||
|
navigateTo: slide,
|
||||||
navigateLeft: navigateLeft,
|
navigateLeft: navigateLeft,
|
||||||
navigateRight: navigateRight,
|
navigateRight: navigateRight,
|
||||||
navigateUp: navigateUp,
|
navigateUp: navigateUp,
|
||||||
navigateDown: navigateDown,
|
navigateDown: navigateDown,
|
||||||
navigatePrev: navigatePrev,
|
navigatePrev: navigatePrev,
|
||||||
navigateNext: navigateNext,
|
navigateNext: navigateNext,
|
||||||
|
|
||||||
|
// Toggles the overview mode on/off
|
||||||
toggleOverview: toggleOverview,
|
toggleOverview: toggleOverview,
|
||||||
|
|
||||||
// Adds or removes all internal event listeners (such as keyboard)
|
// Adds or removes all internal event listeners (such as keyboard)
|
||||||
|
@ -1249,30 +1304,7 @@ var Reveal = (function(){
|
||||||
removeEventListeners: removeEventListeners,
|
removeEventListeners: removeEventListeners,
|
||||||
|
|
||||||
// Returns the indices of the current, or specified, slide
|
// Returns the indices of the current, or specified, slide
|
||||||
getIndices: function( slide ) {
|
getIndices: getIndices,
|
||||||
// By default, return the current indices
|
|
||||||
var h = indexh,
|
|
||||||
v = indexv;
|
|
||||||
|
|
||||||
// If a slide is specified, return the indices of that slide
|
|
||||||
if( slide ) {
|
|
||||||
var isVertical = !!slide.parentNode.nodeName.match( /section/gi );
|
|
||||||
var slideh = isVertical ? slide.parentNode : slide;
|
|
||||||
|
|
||||||
// Select all horizontal slides
|
|
||||||
var horizontalSlides = Array.prototype.slice.call( document.querySelectorAll( HORIZONTAL_SLIDES_SELECTOR ) );
|
|
||||||
|
|
||||||
// Now that we know which the horizontal slide is, get its index
|
|
||||||
h = Math.max( horizontalSlides.indexOf( slideh ), 0 );
|
|
||||||
|
|
||||||
// If this is a vertical slide, grab the vertical index
|
|
||||||
if( isVertical ) {
|
|
||||||
v = Math.max( Array.prototype.slice.call( slide.parentNode.children ).indexOf( slide ), 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return { h: h, v: v };
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns the previous slide element, may be null
|
// Returns the previous slide element, may be null
|
||||||
getPreviousSlide: function() {
|
getPreviousSlide: function() {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*!
|
/*!
|
||||||
* reveal.js 2.1 r32
|
* reveal.js 2.1 r33
|
||||||
* http://lab.hakim.se/reveal-js
|
* http://lab.hakim.se/reveal-js
|
||||||
* MIT licensed
|
* MIT licensed
|
||||||
*
|
*
|
||||||
|
@ -18,28 +18,18 @@ f.controlsDown=document.querySelector(".reveal .controls .down");}}function d(){
|
||||||
document.body.style.height="120%";window.addEventListener("load",ad,false);window.addEventListener("orientationchange",ad,false);}}function V(){var al=[],ap=[];
|
document.body.style.height="120%";window.addEventListener("load",ad,false);window.addEventListener("orientationchange",ad,false);}}function V(){var al=[],ap=[];
|
||||||
for(var am=0,ak=R.dependencies.length;am<ak;am++){var an=R.dependencies[am];if(!an.condition||an.condition()){if(an.async){ap.push(an.src);}else{al.push(an.src);
|
for(var am=0,ak=R.dependencies.length;am<ak;am++){var an=R.dependencies[am];if(!an.condition||an.condition()){if(an.async){ap.push(an.src);}else{al.push(an.src);
|
||||||
}if(typeof an.callback==="function"){head.ready(an.src.match(/([\w\d_\-]*)\.?[^\\\/]*$/i)[0],an.callback);}}}function ao(){head.js.apply(null,ap);H();}if(al.length){head.ready(ao);
|
}if(typeof an.callback==="function"){head.ready(an.src.match(/([\w\d_\-]*)\.?[^\\\/]*$/i)[0],an.callback);}}}function ao(){head.js.apply(null,ap);H();}if(al.length){head.ready(ao);
|
||||||
head.js.apply(null,al);}else{ao();}}function H(){E();K();J();N();}function K(){if(T===false){R.transition="linear";}if(R.controls&&f.controls){f.controls.style.display="block";
|
head.js.apply(null,al);}else{ao();}}function H(){E();K();J();O();}function K(){if(T===false){R.transition="linear";}if(R.controls&&f.controls){f.controls.style.display="block";
|
||||||
}if(R.progress&&f.progress){f.progress.style.display="block";}if(R.theme&&f.theme){var am=f.theme.getAttribute("href");var ak=/[^\/]*?(?=\.css)/;var al=am.match(ak)[0];
|
}if(R.progress&&f.progress){f.progress.style.display="block";}if(R.transition!=="default"){f.wrapper.classList.add(R.transition);}if(R.mouseWheel){document.addEventListener("DOMMouseScroll",o,false);
|
||||||
if(R.theme!==al){am=am.replace(ak,R.theme);f.theme.setAttribute("href",am);}}if(R.transition!=="default"){f.wrapper.classList.add(R.transition);}if(R.mouseWheel){document.addEventListener("DOMMouseScroll",p,false);
|
document.addEventListener("mousewheel",o,false);}if(R.rollingLinks){N();}if(R.theme&&f.theme){var am=f.theme.getAttribute("href");var ak=/[^\/]*?(?=\.css)/;
|
||||||
document.addEventListener("mousewheel",p,false);}if(R.rollingLinks){M();}}function E(){document.addEventListener("touchstart",A,false);document.addEventListener("touchmove",af,false);
|
var al=am.match(ak)[0];if(R.theme!==al){am=am.replace(ak,R.theme);f.theme.setAttribute("href",am);}}}function E(){document.addEventListener("touchstart",A,false);
|
||||||
document.addEventListener("touchend",W,false);window.addEventListener("hashchange",w,false);if(R.keyboard){document.addEventListener("keydown",ah,false);
|
document.addEventListener("touchmove",af,false);document.addEventListener("touchend",W,false);window.addEventListener("hashchange",w,false);if(R.keyboard){document.addEventListener("keydown",ah,false);
|
||||||
}if(R.controls&&f.controls){f.controlsLeft.addEventListener("click",q(B),false);f.controlsRight.addEventListener("click",q(j),false);f.controlsUp.addEventListener("click",q(u),false);
|
}if(R.controls&&f.controls){f.controlsLeft.addEventListener("click",q(B),false);f.controlsRight.addEventListener("click",q(j),false);f.controlsUp.addEventListener("click",q(u),false);
|
||||||
f.controlsDown.addEventListener("click",q(F),false);}}function U(){document.removeEventListener("keydown",ah,false);document.removeEventListener("touchstart",A,false);
|
f.controlsDown.addEventListener("click",q(F),false);}}function U(){document.removeEventListener("keydown",ah,false);document.removeEventListener("touchstart",A,false);
|
||||||
document.removeEventListener("touchmove",af,false);document.removeEventListener("touchend",W,false);window.removeEventListener("hashchange",w,false);if(R.controls&&f.controls){f.controlsLeft.removeEventListener("click",q(B),false);
|
document.removeEventListener("touchmove",af,false);document.removeEventListener("touchend",W,false);window.removeEventListener("hashchange",w,false);if(R.controls&&f.controls){f.controlsLeft.removeEventListener("click",q(B),false);
|
||||||
f.controlsRight.removeEventListener("click",q(j),false);f.controlsUp.removeEventListener("click",q(u),false);f.controlsDown.removeEventListener("click",q(F),false);
|
f.controlsRight.removeEventListener("click",q(j),false);f.controlsUp.removeEventListener("click",q(u),false);f.controlsDown.removeEventListener("click",q(F),false);
|
||||||
}}function t(al,ak){for(var am in ak){al[am]=ak[am];}}function S(am,ak){var an=am.x-ak.x,al=am.y-ak.y;return Math.sqrt(an*an+al*al);}function q(ak){return function(al){al.preventDefault();
|
}}function t(al,ak){for(var am in ak){al[am]=ak[am];}}function S(am,ak){var an=am.x-ak.x,al=am.y-ak.y;return Math.sqrt(an*an+al*al);}function q(ak){return function(al){al.preventDefault();
|
||||||
ak.call();};}function ad(){setTimeout(function(){window.scrollTo(0,1);},0);}function r(al,ak){var am=document.createEvent("HTMLEvents",1,2);am.initEvent(al,true,true);
|
ak.call();};}function ad(){setTimeout(function(){window.scrollTo(0,1);},0);}function r(al,ak){var am=document.createEvent("HTMLEvents",1,2);am.initEvent(al,true,true);
|
||||||
t(am,ak);f.wrapper.dispatchEvent(am);}function ah(al){if(document.querySelector(":focus")!==null||al.shiftKey||al.altKey||al.ctrlKey||al.metaKey){return;
|
t(am,ak);f.wrapper.dispatchEvent(am);}function N(){if(T&&!("msPerspective" in document.body.style)){var al=document.querySelectorAll(".reveal .slides section a:not(.image)");
|
||||||
}var ak=true;switch(al.keyCode){case 80:case 33:Z();break;case 78:case 34:x();break;case 72:case 37:B();break;case 76:case 39:j();break;case 75:case 38:u();
|
|
||||||
break;case 74:case 40:F();break;case 36:O(0);break;case 35:O(Number.MAX_VALUE);break;case 32:L()?ae():x();break;case 13:L()?ae():ak=false;break;case 66:case 190:aa();
|
|
||||||
break;case 70:ab();break;default:ak=false;}if(ak){al.preventDefault();}else{if(al.keyCode===27&&T){X();al.preventDefault();}}N();}function A(ak){ac.startX=ak.touches[0].clientX;
|
|
||||||
ac.startY=ak.touches[0].clientY;ac.startCount=ak.touches.length;if(ak.touches.length===2&&R.overview){ac.startSpan=S({x:ak.touches[1].clientX,y:ak.touches[1].clientY},{x:ac.startX,y:ac.startY});
|
|
||||||
}}function af(ap){if(!ac.handled){var an=ap.touches[0].clientX;var am=ap.touches[0].clientY;if(ap.touches.length===2&&ac.startCount===2&&R.overview){var ao=S({x:ap.touches[1].clientX,y:ap.touches[1].clientY},{x:ac.startX,y:ac.startY});
|
|
||||||
if(Math.abs(ac.startSpan-ao)>ac.threshold){ac.handled=true;if(ao<ac.startSpan){I();}else{ae();}}ap.preventDefault();}else{if(ap.touches.length===1&&ac.startCount!==2){var al=an-ac.startX,ak=am-ac.startY;
|
|
||||||
if(al>ac.threshold&&Math.abs(al)>Math.abs(ak)){ac.handled=true;B();}else{if(al<-ac.threshold&&Math.abs(al)>Math.abs(ak)){ac.handled=true;j();}else{if(ak>ac.threshold){ac.handled=true;
|
|
||||||
u();}else{if(ak<-ac.threshold){ac.handled=true;F();}}}}ap.preventDefault();}}}else{if(navigator.userAgent.match(/android/gi)){ap.preventDefault();}}}function W(ak){ac.handled=false;
|
|
||||||
}function p(ak){clearTimeout(z);z=setTimeout(function(){var al=ak.detail||-ak.wheelDelta;if(al>0){x();}else{Z();}},100);}function w(ak){J();}function C(ak){if(L()){ak.preventDefault();
|
|
||||||
ae();m=this.getAttribute("data-index-h");e=this.getAttribute("data-index-v");a();}}function M(){if(T&&!("msPerspective" in document.body.style)){var al=document.querySelectorAll(".reveal .slides section a:not(.image)");
|
|
||||||
for(var am=0,ak=al.length;am<ak;am++){var an=al[am];if(an.textContent&&!an.querySelector("img")&&(!an.className||!an.classList.contains(an,"roll"))){an.classList.add("roll");
|
for(var am=0,ak=al.length;am<ak;am++){var an=al[am];if(an.textContent&&!an.querySelector("img")&&(!an.className||!an.classList.contains(an,"roll"))){an.classList.add("roll");
|
||||||
an.innerHTML='<span data-title="'+an.text+'">'+an.innerHTML+"</span>";}}}}function I(){if(R.overview){f.wrapper.classList.add("overview");var ak=document.querySelectorAll(l);
|
an.innerHTML='<span data-title="'+an.text+'">'+an.innerHTML+"</span>";}}}}function I(){if(R.overview){f.wrapper.classList.add("overview");var ak=document.querySelectorAll(l);
|
||||||
for(var ap=0,an=ak.length;ap<an;ap++){var am=ak[ap],au="translateZ(-2500px) translate("+((ap-m)*105)+"%, 0%)";am.setAttribute("data-index-h",ap);am.style.display="block";
|
for(var ap=0,an=ak.length;ap<an;ap++){var am=ak[ap],au="translateZ(-2500px) translate("+((ap-m)*105)+"%, 0%)";am.setAttribute("data-index-h",ap);am.style.display="block";
|
||||||
|
@ -50,31 +40,42 @@ ar.style.transform=aq;ar.addEventListener("click",C,true);}}}}function ae(){if(R
|
||||||
for(var am=0,ak=an.length;am<ak;am++){var al=an[am];al.style.WebkitTransform="";al.style.MozTransform="";al.style.msTransform="";al.style.OTransform="";
|
for(var am=0,ak=an.length;am<ak;am++){var al=an[am];al.style.WebkitTransform="";al.style.MozTransform="";al.style.msTransform="";al.style.OTransform="";
|
||||||
al.style.transform="";al.removeEventListener("click",C);}a();}}function X(ak){if(typeof ak==="boolean"){ak?I():ae();}else{L()?ae():I();}}function L(){return f.wrapper.classList.contains("overview");
|
al.style.transform="";al.removeEventListener("click",C);}a();}}function X(ak){if(typeof ak==="boolean"){ak?I():ae();}else{L()?ae():I();}}function L(){return f.wrapper.classList.contains("overview");
|
||||||
}function ab(){var ak=document.body;var al=ak.requestFullScreen||ak.webkitRequestFullScreen||ak.mozRequestFullScreen||ak.msRequestFullScreen;if(al){al.apply(ak);
|
}function ab(){var ak=document.body;var al=ak.requestFullScreen||ak.webkitRequestFullScreen||ak.mozRequestFullScreen||ak.msRequestFullScreen;if(al){al.apply(ak);
|
||||||
}}function c(){f.wrapper.classList.add("paused");}function o(){f.wrapper.classList.remove("paused");}function aa(){if(ag()){o();}else{c();}}function ag(){return f.wrapper.classList.contains("paused");
|
}}function c(){f.wrapper.classList.add("paused");}function p(){f.wrapper.classList.remove("paused");}function aa(){if(ag()){p();}else{c();}}function ag(){return f.wrapper.classList.contains("paused");
|
||||||
}function ai(an,at){var al=Array.prototype.slice.call(document.querySelectorAll(an)),ar=al.length;if(ar){if(R.loop){at%=ar;if(at<0){at=ar+at;}}at=Math.max(Math.min(at,ar-1),0);
|
}function a(aq,av){y=G;var an=aj.concat();aj.length=0;var au=m,al=e;m=ai(l,aq===undefined?m:aq);e=ai(b,av===undefined?e:av);stateLoop:for(var ao=0,ar=aj.length;
|
||||||
for(var ap=0;ap<ar;ap++){var aq=al[ap];if(L()===false){var ak=Math.abs((at-ap)%(ar-3))||0;aq.style.display=ak>3?"none":"block";}al[ap].classList.remove("past");
|
ao<ar;ao++){for(var am=0;am<an.length;am++){if(an[am]===aj[ao]){an.splice(am,1);continue stateLoop;}}document.documentElement.classList.add(aj[ao]);r(aj[ao]);
|
||||||
al[ap].classList.remove("present");al[ap].classList.remove("future");if(ap<at){al[ap].classList.add("past");}else{if(ap>at){al[ap].classList.add("future");
|
}while(an.length){document.documentElement.classList.remove(an.pop());}if(R.progress&&f.progress){f.progressbar.style.width=(m/(document.querySelectorAll(l).length-1))*window.innerWidth+"px";
|
||||||
|
}if(L()){I();}s();clearTimeout(D);D=setTimeout(h,1500);var ak=document.querySelectorAll(l);var at=ak[m],ap=at.querySelectorAll("section");G=ap[e]||at;if(m!==au||e!==al){r("slidechanged",{indexh:m,indexv:e,previousSlide:y,currentSlide:G});
|
||||||
|
}else{y=null;}if(y){y.classList.remove("present");}}function ai(an,at){var al=Array.prototype.slice.call(document.querySelectorAll(an)),ar=al.length;if(ar){if(R.loop){at%=ar;
|
||||||
|
if(at<0){at=ar+at;}}at=Math.max(Math.min(at,ar-1),0);for(var ap=0;ap<ar;ap++){var aq=al[ap];if(L()===false){var ak=Math.abs((at-ap)%(ar-3))||0;aq.style.display=ak>3?"none":"block";
|
||||||
|
}al[ap].classList.remove("past");al[ap].classList.remove("present");al[ap].classList.remove("future");if(ap<at){al[ap].classList.add("past");}else{if(ap>at){al[ap].classList.add("future");
|
||||||
}}if(aq.querySelector("section")){al[ap].classList.add("stack");}}al[at].classList.add("present");var am=al[at].getAttribute("data-state");if(am){aj=aj.concat(am.split(" "));
|
}}if(aq.querySelector("section")){al[ap].classList.add("stack");}}al[at].classList.add("present");var am=al[at].getAttribute("data-state");if(am){aj=aj.concat(am.split(" "));
|
||||||
}var ao=al[at].getAttribute("data-autoslide");if(ao){Y=parseInt(ao);}else{Y=R.autoSlide;}}else{at=0;}return at;}function a(aq,av){y=G;var an=aj.concat();
|
}var ao=al[at].getAttribute("data-autoslide");if(ao){Y=parseInt(ao);}else{Y=R.autoSlide;}}else{at=0;}return at;}function s(){if(R.controls&&f.controls){var ak=g();
|
||||||
aj.length=0;var au=m,al=e;m=ai(l,aq===undefined?m:aq);e=ai(b,av===undefined?e:av);stateLoop:for(var ao=0,ar=aj.length;ao<ar;ao++){for(var am=0;am<an.length;
|
[f.controlsLeft,f.controlsRight,f.controlsUp,f.controlsDown].forEach(function(al){al.classList.remove("enabled");});if(ak.left){f.controlsLeft.classList.add("enabled");
|
||||||
am++){if(an[am]===aj[ao]){an.splice(am,1);continue stateLoop;}}document.documentElement.classList.add(aj[ao]);r(aj[ao]);}while(an.length){document.documentElement.classList.remove(an.pop());
|
}if(ak.right){f.controlsRight.classList.add("enabled");}if(ak.up){f.controlsUp.classList.add("enabled");}if(ak.down){f.controlsDown.classList.add("enabled");
|
||||||
}if(R.progress&&f.progress){f.progressbar.style.width=(m/(document.querySelectorAll(l).length-1))*window.innerWidth+"px";}if(L()){I();}s();clearTimeout(D);
|
}}}function g(){var ak=document.querySelectorAll(l),al=document.querySelectorAll(b);return{left:m>0,right:m<ak.length-1,up:e>0,down:e<al.length-1};}function J(){var ap=window.location.hash;
|
||||||
D=setTimeout(h,1500);var ak=document.querySelectorAll(l);var at=ak[m],ap=at.querySelectorAll("section");G=ap[e]||at;if(m!==au||e!==al){r("slidechanged",{indexh:m,indexv:e,previousSlide:y,currentSlide:G});
|
var ao=ap.slice(2).split("/"),al=ap.replace(/#|\//gi,"");if(isNaN(parseInt(ao[0],10))&&al.length){var am=document.querySelector("#"+al);if(am){var aq=Reveal.getIndices(am);
|
||||||
}else{y=null;}if(y){y.classList.remove("present");}}function s(){if(!R.controls||!f.controls){return;}var ak=g();[f.controlsLeft,f.controlsRight,f.controlsUp,f.controlsDown].forEach(function(al){al.classList.remove("enabled");
|
a(aq.h,aq.v);}else{a(m,e);}}else{var an=parseInt(ao[0],10)||0,ak=parseInt(ao[1],10)||0;a(an,ak);}}function h(){if(R.history){var ak="/";if(m>0||e>0){ak+=m;
|
||||||
});if(ak.left){f.controlsLeft.classList.add("enabled");}if(ak.right){f.controlsRight.classList.add("enabled");}if(ak.up){f.controlsUp.classList.add("enabled");
|
}if(e>0){ak+="/"+e;}window.location.hash=ak;}}function M(ak){var ao=m,am=e;if(ak){var ap=!!ak.parentNode.nodeName.match(/section/gi);var an=ap?ak.parentNode:ak;
|
||||||
}if(ak.down){f.controlsDown.classList.add("enabled");}}function g(){var ak=document.querySelectorAll(l),al=document.querySelectorAll(b);return{left:m>0,right:m<ak.length-1,up:e>0,down:e<al.length-1};
|
var al=Array.prototype.slice.call(document.querySelectorAll(l));ao=Math.max(al.indexOf(an),0);if(ap){am=Math.max(Array.prototype.slice.call(ak.parentNode.children).indexOf(ak),0);
|
||||||
}function J(){var ap=window.location.hash;var ao=ap.slice(2).split("/"),am=ap.replace(/#|\//gi,"");if(isNaN(parseInt(ao[0],10))&&am.length){var ak=document.querySelector("#"+am);
|
}}return{h:ao,v:am};}function v(){if(document.querySelector(b+".present")){var al=document.querySelectorAll(b+".present .fragment:not(.visible)");if(al.length){al[0].classList.add("visible");
|
||||||
if(ak){var aq=Reveal.getIndices(ak);O(aq.h,aq.v);}else{O(m,e);}}else{var an=parseInt(ao[0],10)||0,al=parseInt(ao[1],10)||0;O(an,al);}}function h(){if(R.history){var ak="/";
|
r("fragmentshown",{fragment:al[0]});return true;}}else{var ak=document.querySelectorAll(l+".present .fragment:not(.visible)");if(ak.length){ak[0].classList.add("visible");
|
||||||
if(m>0||e>0){ak+=m;}if(e>0){ak+="/"+e;}window.location.hash=ak;}}function v(){if(document.querySelector(b+".present")){var al=document.querySelectorAll(b+".present .fragment:not(.visible)");
|
r("fragmentshown",{fragment:ak[0]});return true;}}return false;}function Q(){if(document.querySelector(b+".present")){var al=document.querySelectorAll(b+".present .fragment.visible");
|
||||||
if(al.length){al[0].classList.add("visible");r("fragmentshown",{fragment:al[0]});return true;}}else{var ak=document.querySelectorAll(l+".present .fragment:not(.visible)");
|
|
||||||
if(ak.length){ak[0].classList.add("visible");r("fragmentshown",{fragment:ak[0]});return true;}}return false;}function Q(){if(document.querySelector(b+".present")){var al=document.querySelectorAll(b+".present .fragment.visible");
|
|
||||||
if(al.length){al[al.length-1].classList.remove("visible");r("fragmenthidden",{fragment:al[al.length-1]});return true;}}else{var ak=document.querySelectorAll(l+".present .fragment.visible");
|
if(al.length){al[al.length-1].classList.remove("visible");r("fragmenthidden",{fragment:al[al.length-1]});return true;}}else{var ak=document.querySelectorAll(l+".present .fragment.visible");
|
||||||
if(ak.length){ak[ak.length-1].classList.remove("visible");r("fragmenthidden",{fragment:ak[ak.length-1]});return true;}}return false;}function N(){clearTimeout(k);
|
if(ak.length){ak[ak.length-1].classList.remove("visible");r("fragmenthidden",{fragment:ak[ak.length-1]});return true;}}return false;}function O(){clearTimeout(k);
|
||||||
if(Y){k=setTimeout(x,Y);}}function O(al,ak){a(al,ak);}function B(){if(L()||Q()===false){a(m-1,0);}}function j(){if(L()||v()===false){a(m+1,0);}}function u(){if(L()||Q()===false){a(m,e-1);
|
if(Y){k=setTimeout(x,Y);}}function B(){if(L()||Q()===false){a(m-1,0);}}function j(){if(L()||v()===false){a(m+1,0);}}function u(){if(L()||Q()===false){a(m,e-1);
|
||||||
}}function F(){if(L()||v()===false){a(m,e+1);}}function Z(){if(Q()===false){if(g().up){u();}else{var ak=document.querySelector(".reveal .slides>section.past:nth-child("+m+")");
|
}}function F(){if(L()||v()===false){a(m,e+1);}}function Z(){if(Q()===false){if(g().up){u();}else{var ak=document.querySelector(".reveal .slides>section.past:nth-child("+m+")");
|
||||||
if(ak){e=(ak.querySelectorAll("section").length+1)||0;m--;a();}}}}function x(){if(v()===false){g().down?F():j();}N();}return{initialize:i,navigateTo:O,navigateLeft:B,navigateRight:j,navigateUp:u,navigateDown:F,navigatePrev:Z,navigateNext:x,toggleOverview:X,addEventListeners:E,removeEventListeners:U,getIndices:function(ak){var ao=m,am=e;
|
if(ak){e=(ak.querySelectorAll("section").length+1)||0;m--;a();}}}}function x(){if(v()===false){g().down?F():j();}O();}function ah(al){if(document.querySelector(":focus")!==null||al.shiftKey||al.altKey||al.ctrlKey||al.metaKey){return;
|
||||||
if(ak){var ap=!!ak.parentNode.nodeName.match(/section/gi);var an=ap?ak.parentNode:ak;var al=Array.prototype.slice.call(document.querySelectorAll(l));ao=Math.max(al.indexOf(an),0);
|
}var ak=true;switch(al.keyCode){case 80:case 33:Z();break;case 78:case 34:x();break;case 72:case 37:B();break;case 76:case 39:j();break;case 75:case 38:u();
|
||||||
if(ap){am=Math.max(Array.prototype.slice.call(ak.parentNode.children).indexOf(ak),0);}}return{h:ao,v:am};},getPreviousSlide:function(){return y;},getCurrentSlide:function(){return G;
|
break;case 74:case 40:F();break;case 36:a(0);break;case 35:a(Number.MAX_VALUE);break;case 32:L()?ae():x();break;case 13:L()?ae():ak=false;break;case 66:case 190:aa();
|
||||||
},getQueryHash:function(){var ak={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(al){ak[al.split("=").shift()]=al.split("=").pop();});return ak;
|
break;case 70:ab();break;default:ak=false;}if(ak){al.preventDefault();}else{if(al.keyCode===27&&T){X();al.preventDefault();}}O();}function A(ak){ac.startX=ak.touches[0].clientX;
|
||||||
},addEventListener:function(al,am,ak){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).addEventListener(al,am,ak);}},removeEventListener:function(al,am,ak){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).removeEventListener(al,am,ak);
|
ac.startY=ak.touches[0].clientY;ac.startCount=ak.touches.length;if(ak.touches.length===2&&R.overview){ac.startSpan=S({x:ak.touches[1].clientX,y:ak.touches[1].clientY},{x:ac.startX,y:ac.startY});
|
||||||
|
}}function af(ap){if(!ac.handled){var an=ap.touches[0].clientX;var am=ap.touches[0].clientY;if(ap.touches.length===2&&ac.startCount===2&&R.overview){var ao=S({x:ap.touches[1].clientX,y:ap.touches[1].clientY},{x:ac.startX,y:ac.startY});
|
||||||
|
if(Math.abs(ac.startSpan-ao)>ac.threshold){ac.handled=true;if(ao<ac.startSpan){I();}else{ae();}}ap.preventDefault();}else{if(ap.touches.length===1&&ac.startCount!==2){var al=an-ac.startX,ak=am-ac.startY;
|
||||||
|
if(al>ac.threshold&&Math.abs(al)>Math.abs(ak)){ac.handled=true;B();}else{if(al<-ac.threshold&&Math.abs(al)>Math.abs(ak)){ac.handled=true;j();}else{if(ak>ac.threshold){ac.handled=true;
|
||||||
|
u();}else{if(ak<-ac.threshold){ac.handled=true;F();}}}}ap.preventDefault();}}}else{if(navigator.userAgent.match(/android/gi)){ap.preventDefault();}}}function W(ak){ac.handled=false;
|
||||||
|
}function o(ak){clearTimeout(z);z=setTimeout(function(){var al=ak.detail||-ak.wheelDelta;if(al>0){x();}else{Z();}},100);}function w(ak){J();}function C(ak){if(L()){ak.preventDefault();
|
||||||
|
ae();m=this.getAttribute("data-index-h");e=this.getAttribute("data-index-v");a();}}return{initialize:i,slide:a,left:B,right:j,up:u,down:F,prev:Z,next:x,navigateTo:a,navigateLeft:B,navigateRight:j,navigateUp:u,navigateDown:F,navigatePrev:Z,navigateNext:x,toggleOverview:X,addEventListeners:E,removeEventListeners:U,getIndices:M,getPreviousSlide:function(){return y;
|
||||||
|
},getCurrentSlide:function(){return G;},getQueryHash:function(){var ak={};location.search.replace(/[A-Z0-9]+?=(\w*)/gi,function(al){ak[al.split("=").shift()]=al.split("=").pop();
|
||||||
|
});return ak;},addEventListener:function(al,am,ak){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).addEventListener(al,am,ak);
|
||||||
|
}},removeEventListener:function(al,am,ak){if("addEventListener" in window){(f.wrapper||document.querySelector(".reveal")).removeEventListener(al,am,ak);
|
||||||
}}};})();
|
}}};})();
|
|
@ -119,8 +119,8 @@
|
||||||
notes.innerHTML = data.notes;
|
notes.innerHTML = data.notes;
|
||||||
}
|
}
|
||||||
|
|
||||||
currentSlide.contentWindow.Reveal.navigateTo(data.indexh, data.indexv);
|
currentSlide.contentWindow.Reveal.slide(data.indexh, data.indexv);
|
||||||
nextSlide.contentWindow.Reveal.navigateTo(data.nextindexh, data.nextindexv);
|
nextSlide.contentWindow.Reveal.slide(data.nextindexh, data.nextindexv);
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue