new shorter api method names (closes #178), restructured and cleaned up core js
This commit is contained in:
		
							
								
								
									
										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> | ||||||
|   | |||||||
							
								
								
									
										750
									
								
								js/reveal.js
									
									
									
									
									
								
							
							
						
						
									
										750
									
								
								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 ); | ||||||
| @@ -404,210 +410,6 @@ var Reveal = (function(){ | |||||||
| 		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. | ||||||
| 	 */ | 	 */ | ||||||
| @@ -796,101 +598,6 @@ var Reveal = (function(){ | |||||||
| 		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  | ||||||
| 	 * slide which matches the specified horizontal and vertical  | 	 * slide which matches the specified horizontal and vertical  | ||||||
| @@ -986,13 +693,106 @@ 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(); | 			var routes = availableRoutes(); | ||||||
|  |  | ||||||
| @@ -1006,6 +806,8 @@ var Reveal = (function(){ | |||||||
| 			if( routes.right ) dom.controlsRight.classList.add( 'enabled' ); | 			if( routes.right ) dom.controlsRight.classList.add( 'enabled' ); | ||||||
| 			if( routes.up ) dom.controlsUp.classList.add( 'enabled' ); | 			if( routes.up ) dom.controlsUp.classList.add( 'enabled' ); | ||||||
| 			if( routes.down ) dom.controlsDown.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() { | ||||||
|   | |||||||
							
								
								
									
										83
									
								
								js/reveal.min.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										83
									
								
								js/reveal.min.js
									
									
									
									
										vendored
									
									
								
							| @@ -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> | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user