annotate presen/js/slide-deck.js @ 10:5c57e35e19b6

add presen
author sugi
date Tue, 23 Apr 2013 23:31:26 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
5c57e35e19b6 add presen
sugi
parents:
diff changeset
1 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
2 * @authors Luke Mahe
5c57e35e19b6 add presen
sugi
parents:
diff changeset
3 * @authors Eric Bidelman
5c57e35e19b6 add presen
sugi
parents:
diff changeset
4 * @fileoverview TODO
5c57e35e19b6 add presen
sugi
parents:
diff changeset
5 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
6 document.cancelFullScreen = document.webkitCancelFullScreen ||
5c57e35e19b6 add presen
sugi
parents:
diff changeset
7 document.mozCancelFullScreen;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
8
5c57e35e19b6 add presen
sugi
parents:
diff changeset
9 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
10 * @constructor
5c57e35e19b6 add presen
sugi
parents:
diff changeset
11 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
12 function SlideDeck(el) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
13 this.curSlide_ = 0;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
14 this.prevSlide_ = 0;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
15 this.config_ = null;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
16 this.container = el || document.querySelector('slides');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
17 this.slides = [];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
18 this.controller = null;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
19
5c57e35e19b6 add presen
sugi
parents:
diff changeset
20 this.getCurrentSlideFromHash_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
21
5c57e35e19b6 add presen
sugi
parents:
diff changeset
22 // Call this explicitly. Modernizr.load won't be done until after DOM load.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
23 this.onDomLoaded_.bind(this)();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
24 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
25
5c57e35e19b6 add presen
sugi
parents:
diff changeset
26 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
27 * @const
5c57e35e19b6 add presen
sugi
parents:
diff changeset
28 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
29 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
30 SlideDeck.prototype.SLIDE_CLASSES_ = [
5c57e35e19b6 add presen
sugi
parents:
diff changeset
31 'far-past', 'past', 'current', 'next', 'far-next'];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
32
5c57e35e19b6 add presen
sugi
parents:
diff changeset
33 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
34 * @const
5c57e35e19b6 add presen
sugi
parents:
diff changeset
35 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
36 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
37 SlideDeck.prototype.CSS_DIR_ = 'theme/css/';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
38
5c57e35e19b6 add presen
sugi
parents:
diff changeset
39 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
40 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
41 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
42 SlideDeck.prototype.getCurrentSlideFromHash_ = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
43 var slideNo = parseInt(document.location.hash.substr(1));
5c57e35e19b6 add presen
sugi
parents:
diff changeset
44
5c57e35e19b6 add presen
sugi
parents:
diff changeset
45 if (slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
46 this.curSlide_ = slideNo - 1;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
47 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
48 this.curSlide_ = 0;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
49 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
50 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
51
5c57e35e19b6 add presen
sugi
parents:
diff changeset
52 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
53 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
54 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
55 SlideDeck.prototype.loadSlide = function(slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
56 if (slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
57 this.curSlide_ = slideNo - 1;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
58 this.updateSlides_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
59 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
60 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
61
5c57e35e19b6 add presen
sugi
parents:
diff changeset
62 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
63 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
64 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
65 SlideDeck.prototype.onDomLoaded_ = function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
66 document.body.classList.add('loaded'); // Add loaded class for templates to use.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
67
5c57e35e19b6 add presen
sugi
parents:
diff changeset
68 this.slides = this.container.querySelectorAll('slide:not([hidden]):not(.backdrop)');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
69
5c57e35e19b6 add presen
sugi
parents:
diff changeset
70 // If we're on a smartphone, apply special sauce.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
71 if (Modernizr.mq('only screen and (max-device-width: 480px)')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
72 // var style = document.createElement('link');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
73 // style.rel = 'stylesheet';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
74 // style.type = 'text/css';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
75 // style.href = this.CSS_DIR_ + 'phone.css';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
76 // document.querySelector('head').appendChild(style);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
77
5c57e35e19b6 add presen
sugi
parents:
diff changeset
78 // No need for widescreen layout on a phone.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
79 this.container.classList.remove('layout-widescreen');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
80 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
81
5c57e35e19b6 add presen
sugi
parents:
diff changeset
82 this.loadConfig_(SLIDE_CONFIG);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
83 this.addEventListeners_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
84 this.updateSlides_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
85
5c57e35e19b6 add presen
sugi
parents:
diff changeset
86 // Add slide numbers and total slide count metadata to each slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
87 var that = this;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
88 for (var i = 0, slide; slide = this.slides[i]; ++i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
89 slide.dataset.slideNum = i + 1;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
90 slide.dataset.totalSlides = this.slides.length;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
91
5c57e35e19b6 add presen
sugi
parents:
diff changeset
92 slide.addEventListener('click', function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
93 if (document.body.classList.contains('overview')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
94 that.loadSlide(this.dataset.slideNum);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
95 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
96 window.setTimeout(function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
97 that.toggleOverview();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
98 }, 500);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
99 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
100 }, false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
101 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
102
5c57e35e19b6 add presen
sugi
parents:
diff changeset
103 // Note: this needs to come after addEventListeners_(), which adds a
5c57e35e19b6 add presen
sugi
parents:
diff changeset
104 // 'keydown' listener that this controller relies on.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
105 // Also, no need to set this up if we're on mobile.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
106 if (!Modernizr.touch) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
107 this.controller = new SlideController(this);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
108 if (this.controller.isPopup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
109 document.body.classList.add('popup');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
110 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
111 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
112 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
113
5c57e35e19b6 add presen
sugi
parents:
diff changeset
114 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
115 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
116 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
117 SlideDeck.prototype.addEventListeners_ = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
118 document.addEventListener('keydown', this.onBodyKeyDown_.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
119 window.addEventListener('popstate', this.onPopState_.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
120
5c57e35e19b6 add presen
sugi
parents:
diff changeset
121 // var transEndEventNames = {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
122 // 'WebkitTransition': 'webkitTransitionEnd',
5c57e35e19b6 add presen
sugi
parents:
diff changeset
123 // 'MozTransition': 'transitionend',
5c57e35e19b6 add presen
sugi
parents:
diff changeset
124 // 'OTransition': 'oTransitionEnd',
5c57e35e19b6 add presen
sugi
parents:
diff changeset
125 // 'msTransition': 'MSTransitionEnd',
5c57e35e19b6 add presen
sugi
parents:
diff changeset
126 // 'transition': 'transitionend'
5c57e35e19b6 add presen
sugi
parents:
diff changeset
127 // };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
128 //
5c57e35e19b6 add presen
sugi
parents:
diff changeset
129 // // Find the correct transitionEnd vendor prefix.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
130 // window.transEndEventName = transEndEventNames[
5c57e35e19b6 add presen
sugi
parents:
diff changeset
131 // Modernizr.prefixed('transition')];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
132 //
5c57e35e19b6 add presen
sugi
parents:
diff changeset
133 // // When slides are done transitioning, kickoff loading iframes.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
134 // // Note: we're only looking at a single transition (on the slide). This
5c57e35e19b6 add presen
sugi
parents:
diff changeset
135 // // doesn't include autobuilds the slides may have. Also, if the slide
5c57e35e19b6 add presen
sugi
parents:
diff changeset
136 // // transitions on multiple properties (e.g. not just 'all'), this doesn't
5c57e35e19b6 add presen
sugi
parents:
diff changeset
137 // // handle that case.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
138 // this.container.addEventListener(transEndEventName, function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
139 // this.enableSlideFrames_(this.curSlide_);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
140 // }.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
141
5c57e35e19b6 add presen
sugi
parents:
diff changeset
142 // document.addEventListener('slideenter', function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
143 // var slide = e.target;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
144 // window.setTimeout(function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
145 // this.enableSlideFrames_(e.slideNumber);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
146 // this.enableSlideFrames_(e.slideNumber + 1);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
147 // }.bind(this), 300);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
148 // }.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
149 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
150
5c57e35e19b6 add presen
sugi
parents:
diff changeset
151 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
152 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
153 * @param {Event} e The pop event.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
154 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
155 SlideDeck.prototype.onPopState_ = function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
156 if (e.state != null) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
157 this.curSlide_ = e.state;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
158 this.updateSlides_(true);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
159 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
160 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
161
5c57e35e19b6 add presen
sugi
parents:
diff changeset
162 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
163 * @param {Event} e
5c57e35e19b6 add presen
sugi
parents:
diff changeset
164 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
165 SlideDeck.prototype.onBodyKeyDown_ = function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
166 if (/^(input|textarea)$/i.test(e.target.nodeName) ||
5c57e35e19b6 add presen
sugi
parents:
diff changeset
167 e.target.isContentEditable) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
168 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
169 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
170
5c57e35e19b6 add presen
sugi
parents:
diff changeset
171 // Forward keydowns to the main slides if we're the popup.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
172 if (this.controller && this.controller.isPopup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
173 this.controller.sendMsg({keyCode: e.keyCode});
5c57e35e19b6 add presen
sugi
parents:
diff changeset
174 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
175
5c57e35e19b6 add presen
sugi
parents:
diff changeset
176 switch (e.keyCode) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
177 case 13: // Enter
5c57e35e19b6 add presen
sugi
parents:
diff changeset
178 if (document.body.classList.contains('overview')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
179 this.toggleOverview();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
180 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
181 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
182
5c57e35e19b6 add presen
sugi
parents:
diff changeset
183 case 39: // right arrow
5c57e35e19b6 add presen
sugi
parents:
diff changeset
184 case 32: // space
5c57e35e19b6 add presen
sugi
parents:
diff changeset
185 case 34: // PgDn
5c57e35e19b6 add presen
sugi
parents:
diff changeset
186 this.nextSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
187 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
188 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
189
5c57e35e19b6 add presen
sugi
parents:
diff changeset
190 case 37: // left arrow
5c57e35e19b6 add presen
sugi
parents:
diff changeset
191 case 8: // Backspace
5c57e35e19b6 add presen
sugi
parents:
diff changeset
192 case 33: // PgUp
5c57e35e19b6 add presen
sugi
parents:
diff changeset
193 this.prevSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
194 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
195 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
196
5c57e35e19b6 add presen
sugi
parents:
diff changeset
197 case 40: // down arrow
5c57e35e19b6 add presen
sugi
parents:
diff changeset
198 this.nextSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
199 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
200 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
201
5c57e35e19b6 add presen
sugi
parents:
diff changeset
202 case 38: // up arrow
5c57e35e19b6 add presen
sugi
parents:
diff changeset
203 this.prevSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
204 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
205 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
206
5c57e35e19b6 add presen
sugi
parents:
diff changeset
207 case 72: // H: Toggle code highlighting
5c57e35e19b6 add presen
sugi
parents:
diff changeset
208 document.body.classList.toggle('highlight-code');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
209 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
210
5c57e35e19b6 add presen
sugi
parents:
diff changeset
211 case 79: // O: Toggle overview
5c57e35e19b6 add presen
sugi
parents:
diff changeset
212 this.toggleOverview();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
213 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
214
5c57e35e19b6 add presen
sugi
parents:
diff changeset
215 case 80: // P
5c57e35e19b6 add presen
sugi
parents:
diff changeset
216 if (this.controller && this.controller.isPopup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
217 document.body.classList.toggle('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
218 } else if (this.controller && !this.controller.popup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
219 document.body.classList.toggle('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
220 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
221 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
222
5c57e35e19b6 add presen
sugi
parents:
diff changeset
223 case 82: // R
5c57e35e19b6 add presen
sugi
parents:
diff changeset
224 // TODO: implement refresh on main slides when popup is refreshed.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
225 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
226
5c57e35e19b6 add presen
sugi
parents:
diff changeset
227 case 27: // ESC: Hide notes and highlighting
5c57e35e19b6 add presen
sugi
parents:
diff changeset
228 document.body.classList.remove('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
229 document.body.classList.remove('highlight-code');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
230
5c57e35e19b6 add presen
sugi
parents:
diff changeset
231 if (document.body.classList.contains('overview')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
232 this.toggleOverview();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
233 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
234 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
235
5c57e35e19b6 add presen
sugi
parents:
diff changeset
236 case 70: // F: Toggle fullscreen
5c57e35e19b6 add presen
sugi
parents:
diff changeset
237 // Only respect 'f' on body. Don't want to capture keys from an <input>.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
238 // Also, ignore browser's fullscreen shortcut (cmd+shift+f) so we don't
5c57e35e19b6 add presen
sugi
parents:
diff changeset
239 // get trapped in fullscreen!
5c57e35e19b6 add presen
sugi
parents:
diff changeset
240 if (e.target == document.body && !(e.shiftKey && e.metaKey)) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
241 if (document.mozFullScreen !== undefined && !document.mozFullScreen) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
242 document.body.mozRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
243 } else if (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
244 document.body.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
245 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
246 document.cancelFullScreen();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
247 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
248 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
249 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
250
5c57e35e19b6 add presen
sugi
parents:
diff changeset
251 case 87: // W: Toggle widescreen
5c57e35e19b6 add presen
sugi
parents:
diff changeset
252 // Only respect 'w' on body. Don't want to capture keys from an <input>.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
253 if (e.target == document.body && !(e.shiftKey && e.metaKey)) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
254 this.container.classList.toggle('layout-widescreen');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
255 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
256 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
257 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
258 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
259
5c57e35e19b6 add presen
sugi
parents:
diff changeset
260 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
261 *
5c57e35e19b6 add presen
sugi
parents:
diff changeset
262 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
263 SlideDeck.prototype.focusOverview_ = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
264 var overview = document.body.classList.contains('overview');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
265
5c57e35e19b6 add presen
sugi
parents:
diff changeset
266 for (var i = 0, slide; slide = this.slides[i]; i++) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
267 slide.style[Modernizr.prefixed('transform')] = overview ?
5c57e35e19b6 add presen
sugi
parents:
diff changeset
268 'translateZ(-2500px) translate(' + (( i - this.curSlide_ ) * 105) +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
269 '%, 0%)' : '';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
270 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
271 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
272
5c57e35e19b6 add presen
sugi
parents:
diff changeset
273 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
274 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
275 SlideDeck.prototype.toggleOverview = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
276 document.body.classList.toggle('overview');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
277
5c57e35e19b6 add presen
sugi
parents:
diff changeset
278 this.focusOverview_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
279 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
280
5c57e35e19b6 add presen
sugi
parents:
diff changeset
281 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
282 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
283 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
284 SlideDeck.prototype.loadConfig_ = function(config) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
285 if (!config) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
286 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
287 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
288
5c57e35e19b6 add presen
sugi
parents:
diff changeset
289 this.config_ = config;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
290
5c57e35e19b6 add presen
sugi
parents:
diff changeset
291 var settings = this.config_.settings;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
292
5c57e35e19b6 add presen
sugi
parents:
diff changeset
293 this.loadTheme_(settings.theme || []);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
294
5c57e35e19b6 add presen
sugi
parents:
diff changeset
295 if (settings.favIcon) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
296 this.addFavIcon_(settings.favIcon);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
297 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
298
5c57e35e19b6 add presen
sugi
parents:
diff changeset
299 // Prettyprint. Default to on.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
300 if (!!!('usePrettify' in settings) || settings.usePrettify) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
301 prettyPrint();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
302 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
303
5c57e35e19b6 add presen
sugi
parents:
diff changeset
304 if (settings.analytics) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
305 this.loadAnalytics_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
306 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
307
5c57e35e19b6 add presen
sugi
parents:
diff changeset
308 if (settings.fonts) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
309 this.addFonts_(settings.fonts);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
310 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
311
5c57e35e19b6 add presen
sugi
parents:
diff changeset
312 // Builds. Default to on.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
313 if (!!!('useBuilds' in settings) || settings.useBuilds) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
314 this.makeBuildLists_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
315 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
316
5c57e35e19b6 add presen
sugi
parents:
diff changeset
317 if (settings.title) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
318 document.title = settings.title.replace(/<br\/?>/, ' ');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
319 if (settings.eventTitle) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
320 document.title += ' - ' + settings.eventTitle;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
321 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
322 document.querySelector('[data-config-title]').innerHTML = settings.title;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
323 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
324
5c57e35e19b6 add presen
sugi
parents:
diff changeset
325 if (settings.subtitle) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
326 document.querySelector('[data-config-subtitle]').innerHTML = settings.subtitle;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
327 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
328
5c57e35e19b6 add presen
sugi
parents:
diff changeset
329 if (this.config_.presenters) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
330 var presenters = this.config_.presenters;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
331 var dataConfigContact = document.querySelector('[data-config-contact]');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
332
5c57e35e19b6 add presen
sugi
parents:
diff changeset
333 var html = [];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
334 if (presenters.length == 1) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
335 var p = presenters[0];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
336
5c57e35e19b6 add presen
sugi
parents:
diff changeset
337 html = [p.name, p.company].join('<br>');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
338
5c57e35e19b6 add presen
sugi
parents:
diff changeset
339 var gplus = p.gplus ? '<span>g+</span><a href="' + p.gplus +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
340 '">' + p.gplus.replace(/https?:\/\//, '') + '</a>' : '';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
341
5c57e35e19b6 add presen
sugi
parents:
diff changeset
342 var twitter = p.twitter ? '<span>twitter</span>' +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
343 '<a href="http://twitter.com/' + p.twitter + '">' +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
344 p.twitter + '</a>' : '';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
345
5c57e35e19b6 add presen
sugi
parents:
diff changeset
346 var www = p.www ? '<span>www</span><a href="' + p.www +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
347 '">' + p.www.replace(/https?:\/\//, '') + '</a>' : '';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
348
5c57e35e19b6 add presen
sugi
parents:
diff changeset
349 var github = p.github ? '<span>github</span><a href="' + p.github +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
350 '">' + p.github.replace(/https?:\/\//, '') + '</a>' : '';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
351
5c57e35e19b6 add presen
sugi
parents:
diff changeset
352 var html2 = [gplus, twitter, www, github].join('<br>');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
353
5c57e35e19b6 add presen
sugi
parents:
diff changeset
354 if (dataConfigContact) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
355 dataConfigContact.innerHTML = html2;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
356 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
357 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
358 for (var i = 0, p; p = presenters[i]; ++i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
359 html.push(p.name + ' - ' + p.company);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
360 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
361 html = html.join('<br>');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
362 if (dataConfigContact) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
363 dataConfigContact.innerHTML = html;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
364 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
365 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
366
5c57e35e19b6 add presen
sugi
parents:
diff changeset
367 var dataConfigPresenter = document.querySelector('[data-config-presenter]');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
368 if (dataConfigPresenter) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
369 dataConfigPresenter.innerHTML = html;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
370 if (settings.eventTitle) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
371 dataConfigPresenter.innerHTML = dataConfigPresenter.innerHTML + '<br>' +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
372 settings.eventTitle;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
373 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
374 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
375 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
376
5c57e35e19b6 add presen
sugi
parents:
diff changeset
377 /* Left/Right tap areas. Default to including. */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
378 if (!!!('enableSlideAreas' in settings) || settings.enableSlideAreas) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
379 var el = document.createElement('div');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
380 el.classList.add('slide-area');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
381 el.id = 'prev-slide-area';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
382 el.addEventListener('click', this.prevSlide.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
383 this.container.appendChild(el);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
384
5c57e35e19b6 add presen
sugi
parents:
diff changeset
385 var el = document.createElement('div');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
386 el.classList.add('slide-area');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
387 el.id = 'next-slide-area';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
388 el.addEventListener('click', this.nextSlide.bind(this), false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
389 this.container.appendChild(el);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
390 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
391
5c57e35e19b6 add presen
sugi
parents:
diff changeset
392 if (Modernizr.touch && (!!!('enableTouch' in settings) ||
5c57e35e19b6 add presen
sugi
parents:
diff changeset
393 settings.enableTouch)) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
394 var self = this;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
395
5c57e35e19b6 add presen
sugi
parents:
diff changeset
396 // Note: this prevents mobile zoom in/out but prevents iOS from doing
5c57e35e19b6 add presen
sugi
parents:
diff changeset
397 // it's crazy scroll over effect and disaligning the slides.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
398 window.addEventListener('touchstart', function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
399 e.preventDefault();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
400 }, false);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
401
5c57e35e19b6 add presen
sugi
parents:
diff changeset
402 var hammer = new Hammer(this.container);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
403 hammer.ondragend = function(e) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
404 if (e.direction == 'right' || e.direction == 'down') {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
405 self.prevSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
406 } else if (e.direction == 'left' || e.direction == 'up') {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
407 self.nextSlide();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
408 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
409 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
410 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
411 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
412
5c57e35e19b6 add presen
sugi
parents:
diff changeset
413 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
414 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
415 * @param {Array.<string>} fonts
5c57e35e19b6 add presen
sugi
parents:
diff changeset
416 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
417 SlideDeck.prototype.addFonts_ = function(fonts) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
418 var el = document.createElement('link');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
419 el.rel = 'stylesheet';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
420 el.href = ('https:' == document.location.protocol ? 'https' : 'http') +
5c57e35e19b6 add presen
sugi
parents:
diff changeset
421 '://fonts.googleapis.com/css?family=' + fonts.join('|') + '&v2';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
422 document.querySelector('head').appendChild(el);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
423 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
424
5c57e35e19b6 add presen
sugi
parents:
diff changeset
425 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
426 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
427 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
428 SlideDeck.prototype.buildNextItem_ = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
429 var slide = this.slides[this.curSlide_];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
430 var toBuild = slide.querySelector('.to-build');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
431 var built = slide.querySelector('.build-current');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
432
5c57e35e19b6 add presen
sugi
parents:
diff changeset
433 if (built) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
434 built.classList.remove('build-current');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
435 if (built.classList.contains('fade')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
436 built.classList.add('build-fade');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
437 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
438 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
439
5c57e35e19b6 add presen
sugi
parents:
diff changeset
440 if (!toBuild) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
441 var items = slide.querySelectorAll('.build-fade');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
442 for (var j = 0, item; item = items[j]; j++) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
443 item.classList.remove('build-fade');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
444 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
445 return false;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
446 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
447
5c57e35e19b6 add presen
sugi
parents:
diff changeset
448 toBuild.classList.remove('to-build');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
449 toBuild.classList.add('build-current');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
450
5c57e35e19b6 add presen
sugi
parents:
diff changeset
451 return true;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
452 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
453
5c57e35e19b6 add presen
sugi
parents:
diff changeset
454 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
455 * @param {boolean=} opt_dontPush
5c57e35e19b6 add presen
sugi
parents:
diff changeset
456 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
457 SlideDeck.prototype.prevSlide = function(opt_dontPush) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
458 if (this.curSlide_ > 0) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
459 var bodyClassList = document.body.classList;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
460 bodyClassList.remove('highlight-code');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
461
5c57e35e19b6 add presen
sugi
parents:
diff changeset
462 // Toggle off speaker notes if they're showing when we move backwards on the
5c57e35e19b6 add presen
sugi
parents:
diff changeset
463 // main slides. If we're the speaker notes popup, leave them up.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
464 if (this.controller && !this.controller.isPopup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
465 bodyClassList.remove('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
466 } else if (!this.controller) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
467 bodyClassList.remove('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
468 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
469
5c57e35e19b6 add presen
sugi
parents:
diff changeset
470 this.prevSlide_ = this.curSlide_--;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
471
5c57e35e19b6 add presen
sugi
parents:
diff changeset
472 this.updateSlides_(opt_dontPush);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
473 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
474 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
475
5c57e35e19b6 add presen
sugi
parents:
diff changeset
476 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
477 * @param {boolean=} opt_dontPush
5c57e35e19b6 add presen
sugi
parents:
diff changeset
478 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
479 SlideDeck.prototype.nextSlide = function(opt_dontPush) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
480 if (!document.body.classList.contains('overview') && this.buildNextItem_()) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
481 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
482 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
483
5c57e35e19b6 add presen
sugi
parents:
diff changeset
484 if (this.curSlide_ < this.slides.length - 1) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
485 var bodyClassList = document.body.classList;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
486 bodyClassList.remove('highlight-code');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
487
5c57e35e19b6 add presen
sugi
parents:
diff changeset
488 // Toggle off speaker notes if they're showing when we advanced on the main
5c57e35e19b6 add presen
sugi
parents:
diff changeset
489 // slides. If we're the speaker notes popup, leave them up.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
490 if (this.controller && !this.controller.isPopup) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
491 bodyClassList.remove('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
492 } else if (!this.controller) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
493 bodyClassList.remove('with-notes');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
494 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
495
5c57e35e19b6 add presen
sugi
parents:
diff changeset
496 this.prevSlide_ = this.curSlide_++;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
497
5c57e35e19b6 add presen
sugi
parents:
diff changeset
498 this.updateSlides_(opt_dontPush);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
499 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
500 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
501
5c57e35e19b6 add presen
sugi
parents:
diff changeset
502 /* Slide events */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
503
5c57e35e19b6 add presen
sugi
parents:
diff changeset
504 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
505 * Triggered when a slide enter/leave event should be dispatched.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
506 *
5c57e35e19b6 add presen
sugi
parents:
diff changeset
507 * @param {string} type The type of event to trigger
5c57e35e19b6 add presen
sugi
parents:
diff changeset
508 * (e.g. 'slideenter', 'slideleave').
5c57e35e19b6 add presen
sugi
parents:
diff changeset
509 * @param {number} slideNo The index of the slide that is being left.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
510 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
511 SlideDeck.prototype.triggerSlideEvent = function(type, slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
512 var el = this.getSlideEl_(slideNo);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
513 if (!el) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
514 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
515 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
516
5c57e35e19b6 add presen
sugi
parents:
diff changeset
517 // Call onslideenter/onslideleave if the attribute is defined on this slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
518 var func = el.getAttribute(type);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
519 if (func) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
520 new Function(func).call(el); // TODO: Don't use new Function() :(
5c57e35e19b6 add presen
sugi
parents:
diff changeset
521 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
522
5c57e35e19b6 add presen
sugi
parents:
diff changeset
523 // Dispatch event to listeners setup using addEventListener.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
524 var evt = document.createEvent('Event');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
525 evt.initEvent(type, true, true);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
526 evt.slideNumber = slideNo + 1; // Make it readable
5c57e35e19b6 add presen
sugi
parents:
diff changeset
527 evt.slide = el;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
528
5c57e35e19b6 add presen
sugi
parents:
diff changeset
529 el.dispatchEvent(evt);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
530 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
531
5c57e35e19b6 add presen
sugi
parents:
diff changeset
532 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
533 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
534 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
535 SlideDeck.prototype.updateSlides_ = function(opt_dontPush) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
536 var dontPush = opt_dontPush || false;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
537
5c57e35e19b6 add presen
sugi
parents:
diff changeset
538 var curSlide = this.curSlide_;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
539 for (var i = 0; i < this.slides.length; ++i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
540 switch (i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
541 case curSlide - 2:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
542 this.updateSlideClass_(i, 'far-past');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
543 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
544 case curSlide - 1:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
545 this.updateSlideClass_(i, 'past');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
546 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
547 case curSlide:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
548 this.updateSlideClass_(i, 'current');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
549 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
550 case curSlide + 1:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
551 this.updateSlideClass_(i, 'next');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
552 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
553 case curSlide + 2:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
554 this.updateSlideClass_(i, 'far-next');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
555 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
556 default:
5c57e35e19b6 add presen
sugi
parents:
diff changeset
557 this.updateSlideClass_(i);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
558 break;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
559 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
560 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
561
5c57e35e19b6 add presen
sugi
parents:
diff changeset
562 this.triggerSlideEvent('slideleave', this.prevSlide_);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
563 this.triggerSlideEvent('slideenter', curSlide);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
564
5c57e35e19b6 add presen
sugi
parents:
diff changeset
565 // window.setTimeout(this.disableSlideFrames_.bind(this, curSlide - 2), 301);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
566 //
5c57e35e19b6 add presen
sugi
parents:
diff changeset
567 // this.enableSlideFrames_(curSlide - 1); // Previous slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
568 // this.enableSlideFrames_(curSlide + 1); // Current slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
569 // this.enableSlideFrames_(curSlide + 2); // Next slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
570
5c57e35e19b6 add presen
sugi
parents:
diff changeset
571 // Enable current slide's iframes (needed for page loat at current slide).
5c57e35e19b6 add presen
sugi
parents:
diff changeset
572 this.enableSlideFrames_(curSlide + 1);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
573
5c57e35e19b6 add presen
sugi
parents:
diff changeset
574 // No way to tell when all slide transitions + auto builds are done.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
575 // Give ourselves a good buffer to preload the next slide's iframes.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
576 window.setTimeout(this.enableSlideFrames_.bind(this, curSlide + 2), 1000);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
577
5c57e35e19b6 add presen
sugi
parents:
diff changeset
578 this.updateHash_(dontPush);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
579
5c57e35e19b6 add presen
sugi
parents:
diff changeset
580 if (document.body.classList.contains('overview')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
581 this.focusOverview_();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
582 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
583 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
584
5c57e35e19b6 add presen
sugi
parents:
diff changeset
585 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
586
5c57e35e19b6 add presen
sugi
parents:
diff changeset
587 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
588 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
589 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
590 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
591 SlideDeck.prototype.enableSlideFrames_ = function(slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
592 var el = this.slides[slideNo - 1];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
593 if (!el) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
594 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
595 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
596
5c57e35e19b6 add presen
sugi
parents:
diff changeset
597 var frames = el.querySelectorAll('iframe');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
598 for (var i = 0, frame; frame = frames[i]; i++) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
599 this.enableFrame_(frame);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
600 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
601 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
602
5c57e35e19b6 add presen
sugi
parents:
diff changeset
603 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
604 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
605 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
606 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
607 SlideDeck.prototype.enableFrame_ = function(frame) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
608 var src = frame.dataset.src;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
609 if (src && frame.src != src) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
610 frame.src = src;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
611 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
612 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
613
5c57e35e19b6 add presen
sugi
parents:
diff changeset
614 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
615 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
616 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
617 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
618 SlideDeck.prototype.disableSlideFrames_ = function(slideNo) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
619 var el = this.slides[slideNo - 1];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
620 if (!el) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
621 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
622 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
623
5c57e35e19b6 add presen
sugi
parents:
diff changeset
624 var frames = el.querySelectorAll('iframe');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
625 for (var i = 0, frame; frame = frames[i]; i++) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
626 this.disableFrame_(frame);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
627 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
628 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
629
5c57e35e19b6 add presen
sugi
parents:
diff changeset
630 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
631 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
632 * @param {Node} frame
5c57e35e19b6 add presen
sugi
parents:
diff changeset
633 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
634 SlideDeck.prototype.disableFrame_ = function(frame) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
635 frame.src = 'about:blank';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
636 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
637
5c57e35e19b6 add presen
sugi
parents:
diff changeset
638 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
639 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
640 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
641 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
642 SlideDeck.prototype.getSlideEl_ = function(no) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
643 if ((no < 0) || (no >= this.slides.length)) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
644 return null;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
645 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
646 return this.slides[no];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
647 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
648 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
649
5c57e35e19b6 add presen
sugi
parents:
diff changeset
650 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
651 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
652 * @param {number} slideNo
5c57e35e19b6 add presen
sugi
parents:
diff changeset
653 * @param {string} className
5c57e35e19b6 add presen
sugi
parents:
diff changeset
654 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
655 SlideDeck.prototype.updateSlideClass_ = function(slideNo, className) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
656 var el = this.getSlideEl_(slideNo);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
657
5c57e35e19b6 add presen
sugi
parents:
diff changeset
658 if (!el) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
659 return;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
660 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
661
5c57e35e19b6 add presen
sugi
parents:
diff changeset
662 if (className) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
663 el.classList.add(className);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
664 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
665
5c57e35e19b6 add presen
sugi
parents:
diff changeset
666 for (var i = 0, slideClass; slideClass = this.SLIDE_CLASSES_[i]; ++i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
667 if (className != slideClass) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
668 el.classList.remove(slideClass);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
669 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
670 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
671 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
672
5c57e35e19b6 add presen
sugi
parents:
diff changeset
673 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
674 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
675 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
676 SlideDeck.prototype.makeBuildLists_ = function () {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
677 for (var i = this.curSlide_, slide; slide = this.slides[i]; ++i) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
678 var items = slide.querySelectorAll('.build > *');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
679 for (var j = 0, item; item = items[j]; ++j) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
680 if (item.classList) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
681 item.classList.add('to-build');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
682 if (item.parentNode.classList.contains('fade')) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
683 item.classList.add('fade');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
684 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
685 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
686 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
687 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
688 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
689
5c57e35e19b6 add presen
sugi
parents:
diff changeset
690 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
691 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
692 * @param {boolean} dontPush
5c57e35e19b6 add presen
sugi
parents:
diff changeset
693 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
694 SlideDeck.prototype.updateHash_ = function(dontPush) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
695 if (!dontPush) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
696 var slideNo = this.curSlide_ + 1;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
697 var hash = '#' + slideNo;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
698 if (window.history.pushState) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
699 window.history.pushState(this.curSlide_, 'Slide ' + slideNo, hash);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
700 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
701 window.location.replace(hash);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
702 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
703
5c57e35e19b6 add presen
sugi
parents:
diff changeset
704 // Record GA hit on this slide.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
705 window['_gaq'] && window['_gaq'].push(['_trackPageview',
5c57e35e19b6 add presen
sugi
parents:
diff changeset
706 document.location.href]);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
707 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
708 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
709
5c57e35e19b6 add presen
sugi
parents:
diff changeset
710
5c57e35e19b6 add presen
sugi
parents:
diff changeset
711 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
712 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
713 * @param {string} favIcon
5c57e35e19b6 add presen
sugi
parents:
diff changeset
714 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
715 SlideDeck.prototype.addFavIcon_ = function(favIcon) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
716 var el = document.createElement('link');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
717 el.rel = 'icon';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
718 el.type = 'image/png';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
719 el.href = favIcon;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
720 document.querySelector('head').appendChild(el);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
721 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
722
5c57e35e19b6 add presen
sugi
parents:
diff changeset
723 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
724 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
725 * @param {string} theme
5c57e35e19b6 add presen
sugi
parents:
diff changeset
726 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
727 SlideDeck.prototype.loadTheme_ = function(theme) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
728 var styles = [];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
729 if (theme.constructor.name === 'String') {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
730 styles.push(theme);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
731 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
732 styles = theme;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
733 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
734
5c57e35e19b6 add presen
sugi
parents:
diff changeset
735 for (var i = 0, style; themeUrl = styles[i]; i++) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
736 var style = document.createElement('link');
5c57e35e19b6 add presen
sugi
parents:
diff changeset
737 style.rel = 'stylesheet';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
738 style.type = 'text/css';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
739 if (themeUrl.indexOf('http') == -1) {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
740 style.href = this.CSS_DIR_ + themeUrl + '.css';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
741 } else {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
742 style.href = themeUrl;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
743 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
744 document.querySelector('head').appendChild(style);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
745 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
746 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
747
5c57e35e19b6 add presen
sugi
parents:
diff changeset
748 /**
5c57e35e19b6 add presen
sugi
parents:
diff changeset
749 * @private
5c57e35e19b6 add presen
sugi
parents:
diff changeset
750 */
5c57e35e19b6 add presen
sugi
parents:
diff changeset
751 SlideDeck.prototype.loadAnalytics_ = function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
752 var _gaq = window['_gaq'] || [];
5c57e35e19b6 add presen
sugi
parents:
diff changeset
753 _gaq.push(['_setAccount', this.config_.settings.analytics]);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
754 _gaq.push(['_trackPageview']);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
755
5c57e35e19b6 add presen
sugi
parents:
diff changeset
756 (function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
757 var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
5c57e35e19b6 add presen
sugi
parents:
diff changeset
758 ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
5c57e35e19b6 add presen
sugi
parents:
diff changeset
759 var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
5c57e35e19b6 add presen
sugi
parents:
diff changeset
760 })();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
761 };
5c57e35e19b6 add presen
sugi
parents:
diff changeset
762
5c57e35e19b6 add presen
sugi
parents:
diff changeset
763
5c57e35e19b6 add presen
sugi
parents:
diff changeset
764 // Polyfill missing APIs (if we need to), then create the slide deck.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
765 // iOS < 5 needs classList, dataset, and window.matchMedia. Modernizr contains
5c57e35e19b6 add presen
sugi
parents:
diff changeset
766 // the last one.
5c57e35e19b6 add presen
sugi
parents:
diff changeset
767 (function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
768 Modernizr.load({
5c57e35e19b6 add presen
sugi
parents:
diff changeset
769 test: !!document.body.classList && !!document.body.dataset,
5c57e35e19b6 add presen
sugi
parents:
diff changeset
770 nope: ['js/polyfills/classList.min.js', 'js/polyfills/dataset.min.js'],
5c57e35e19b6 add presen
sugi
parents:
diff changeset
771 complete: function() {
5c57e35e19b6 add presen
sugi
parents:
diff changeset
772 window.slidedeck = new SlideDeck();
5c57e35e19b6 add presen
sugi
parents:
diff changeset
773 }
5c57e35e19b6 add presen
sugi
parents:
diff changeset
774 });
5c57e35e19b6 add presen
sugi
parents:
diff changeset
775 })();