annotate presen/slides.js @ 10:86f6bb9be40a

add
author mir3636
date Wed, 15 Feb 2017 18:20:07 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10
mir3636
parents:
diff changeset
1 /*
mir3636
parents:
diff changeset
2 Google HTML5 slides template
mir3636
parents:
diff changeset
3
mir3636
parents:
diff changeset
4 Authors: Luke Mahé (code)
mir3636
parents:
diff changeset
5 Marcin Wichary (code and design)
mir3636
parents:
diff changeset
6
mir3636
parents:
diff changeset
7 Dominic Mazzoni (browser compatibility)
mir3636
parents:
diff changeset
8 Charles Chen (ChromeVox support)
mir3636
parents:
diff changeset
9
mir3636
parents:
diff changeset
10 URL: http://code.google.com/p/html5slides/
mir3636
parents:
diff changeset
11 */
mir3636
parents:
diff changeset
12
mir3636
parents:
diff changeset
13 var PERMANENT_URL_PREFIX = './'
mir3636
parents:
diff changeset
14
mir3636
parents:
diff changeset
15 var SLIDE_CLASSES = ['far-past', 'past', 'current', 'next', 'far-next'];
mir3636
parents:
diff changeset
16
mir3636
parents:
diff changeset
17 var PM_TOUCH_SENSITIVITY = 15;
mir3636
parents:
diff changeset
18
mir3636
parents:
diff changeset
19 var curSlide;
mir3636
parents:
diff changeset
20
mir3636
parents:
diff changeset
21 /* ---------------------------------------------------------------------- */
mir3636
parents:
diff changeset
22 /* classList polyfill by Eli Grey
mir3636
parents:
diff changeset
23 * (http://purl.eligrey.com/github/classList.js/blob/master/classList.js) */
mir3636
parents:
diff changeset
24
mir3636
parents:
diff changeset
25 if (typeof document !== "undefined" && !("classList" in document.createElement("a"))) {
mir3636
parents:
diff changeset
26
mir3636
parents:
diff changeset
27 (function (view) {
mir3636
parents:
diff changeset
28
mir3636
parents:
diff changeset
29 var
mir3636
parents:
diff changeset
30 classListProp = "classList"
mir3636
parents:
diff changeset
31 , protoProp = "prototype"
mir3636
parents:
diff changeset
32 , elemCtrProto = (view.HTMLElement || view.Element)[protoProp]
mir3636
parents:
diff changeset
33 , objCtr = Object
mir3636
parents:
diff changeset
34 strTrim = String[protoProp].trim || function () {
mir3636
parents:
diff changeset
35 return this.replace(/^\s+|\s+$/g, "");
mir3636
parents:
diff changeset
36 }
mir3636
parents:
diff changeset
37 , arrIndexOf = Array[protoProp].indexOf || function (item) {
mir3636
parents:
diff changeset
38 for (var i = 0, len = this.length; i < len; i++) {
mir3636
parents:
diff changeset
39 if (i in this && this[i] === item) {
mir3636
parents:
diff changeset
40 return i;
mir3636
parents:
diff changeset
41 }
mir3636
parents:
diff changeset
42 }
mir3636
parents:
diff changeset
43 return -1;
mir3636
parents:
diff changeset
44 }
mir3636
parents:
diff changeset
45 // Vendors: please allow content code to instantiate DOMExceptions
mir3636
parents:
diff changeset
46 , DOMEx = function (type, message) {
mir3636
parents:
diff changeset
47 this.name = type;
mir3636
parents:
diff changeset
48 this.code = DOMException[type];
mir3636
parents:
diff changeset
49 this.message = message;
mir3636
parents:
diff changeset
50 }
mir3636
parents:
diff changeset
51 , checkTokenAndGetIndex = function (classList, token) {
mir3636
parents:
diff changeset
52 if (token === "") {
mir3636
parents:
diff changeset
53 throw new DOMEx(
mir3636
parents:
diff changeset
54 "SYNTAX_ERR"
mir3636
parents:
diff changeset
55 , "An invalid or illegal string was specified"
mir3636
parents:
diff changeset
56 );
mir3636
parents:
diff changeset
57 }
mir3636
parents:
diff changeset
58 if (/\s/.test(token)) {
mir3636
parents:
diff changeset
59 throw new DOMEx(
mir3636
parents:
diff changeset
60 "INVALID_CHARACTER_ERR"
mir3636
parents:
diff changeset
61 , "String contains an invalid character"
mir3636
parents:
diff changeset
62 );
mir3636
parents:
diff changeset
63 }
mir3636
parents:
diff changeset
64 return arrIndexOf.call(classList, token);
mir3636
parents:
diff changeset
65 }
mir3636
parents:
diff changeset
66 , ClassList = function (elem) {
mir3636
parents:
diff changeset
67 var
mir3636
parents:
diff changeset
68 trimmedClasses = strTrim.call(elem.className)
mir3636
parents:
diff changeset
69 , classes = trimmedClasses ? trimmedClasses.split(/\s+/) : []
mir3636
parents:
diff changeset
70 ;
mir3636
parents:
diff changeset
71 for (var i = 0, len = classes.length; i < len; i++) {
mir3636
parents:
diff changeset
72 this.push(classes[i]);
mir3636
parents:
diff changeset
73 }
mir3636
parents:
diff changeset
74 this._updateClassName = function () {
mir3636
parents:
diff changeset
75 elem.className = this.toString();
mir3636
parents:
diff changeset
76 };
mir3636
parents:
diff changeset
77 }
mir3636
parents:
diff changeset
78 , classListProto = ClassList[protoProp] = []
mir3636
parents:
diff changeset
79 , classListGetter = function () {
mir3636
parents:
diff changeset
80 return new ClassList(this);
mir3636
parents:
diff changeset
81 }
mir3636
parents:
diff changeset
82 ;
mir3636
parents:
diff changeset
83 // Most DOMException implementations don't allow calling DOMException's toString()
mir3636
parents:
diff changeset
84 // on non-DOMExceptions. Error's toString() is sufficient here.
mir3636
parents:
diff changeset
85 DOMEx[protoProp] = Error[protoProp];
mir3636
parents:
diff changeset
86 classListProto.item = function (i) {
mir3636
parents:
diff changeset
87 return this[i] || null;
mir3636
parents:
diff changeset
88 };
mir3636
parents:
diff changeset
89 classListProto.contains = function (token) {
mir3636
parents:
diff changeset
90 token += "";
mir3636
parents:
diff changeset
91 return checkTokenAndGetIndex(this, token) !== -1;
mir3636
parents:
diff changeset
92 };
mir3636
parents:
diff changeset
93 classListProto.add = function (token) {
mir3636
parents:
diff changeset
94 token += "";
mir3636
parents:
diff changeset
95 if (checkTokenAndGetIndex(this, token) === -1) {
mir3636
parents:
diff changeset
96 this.push(token);
mir3636
parents:
diff changeset
97 this._updateClassName();
mir3636
parents:
diff changeset
98 }
mir3636
parents:
diff changeset
99 };
mir3636
parents:
diff changeset
100 classListProto.remove = function (token) {
mir3636
parents:
diff changeset
101 token += "";
mir3636
parents:
diff changeset
102 var index = checkTokenAndGetIndex(this, token);
mir3636
parents:
diff changeset
103 if (index !== -1) {
mir3636
parents:
diff changeset
104 this.splice(index, 1);
mir3636
parents:
diff changeset
105 this._updateClassName();
mir3636
parents:
diff changeset
106 }
mir3636
parents:
diff changeset
107 };
mir3636
parents:
diff changeset
108 classListProto.toggle = function (token) {
mir3636
parents:
diff changeset
109 token += "";
mir3636
parents:
diff changeset
110 if (checkTokenAndGetIndex(this, token) === -1) {
mir3636
parents:
diff changeset
111 this.add(token);
mir3636
parents:
diff changeset
112 } else {
mir3636
parents:
diff changeset
113 this.remove(token);
mir3636
parents:
diff changeset
114 }
mir3636
parents:
diff changeset
115 };
mir3636
parents:
diff changeset
116 classListProto.toString = function () {
mir3636
parents:
diff changeset
117 return this.join(" ");
mir3636
parents:
diff changeset
118 };
mir3636
parents:
diff changeset
119
mir3636
parents:
diff changeset
120 if (objCtr.defineProperty) {
mir3636
parents:
diff changeset
121 var classListPropDesc = {
mir3636
parents:
diff changeset
122 get: classListGetter
mir3636
parents:
diff changeset
123 , enumerable: true
mir3636
parents:
diff changeset
124 , configurable: true
mir3636
parents:
diff changeset
125 };
mir3636
parents:
diff changeset
126 try {
mir3636
parents:
diff changeset
127 objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
mir3636
parents:
diff changeset
128 } catch (ex) { // IE 8 doesn't support enumerable:true
mir3636
parents:
diff changeset
129 if (ex.number === -0x7FF5EC54) {
mir3636
parents:
diff changeset
130 classListPropDesc.enumerable = false;
mir3636
parents:
diff changeset
131 objCtr.defineProperty(elemCtrProto, classListProp, classListPropDesc);
mir3636
parents:
diff changeset
132 }
mir3636
parents:
diff changeset
133 }
mir3636
parents:
diff changeset
134 } else if (objCtr[protoProp].__defineGetter__) {
mir3636
parents:
diff changeset
135 elemCtrProto.__defineGetter__(classListProp, classListGetter);
mir3636
parents:
diff changeset
136 }
mir3636
parents:
diff changeset
137
mir3636
parents:
diff changeset
138 }(self));
mir3636
parents:
diff changeset
139
mir3636
parents:
diff changeset
140 }
mir3636
parents:
diff changeset
141 /* ---------------------------------------------------------------------- */
mir3636
parents:
diff changeset
142
mir3636
parents:
diff changeset
143 /* Slide movement */
mir3636
parents:
diff changeset
144
mir3636
parents:
diff changeset
145 function getSlideEl(no) {
mir3636
parents:
diff changeset
146 if ((no < 0) || (no >= slideEls.length)) {
mir3636
parents:
diff changeset
147 return null;
mir3636
parents:
diff changeset
148 } else {
mir3636
parents:
diff changeset
149 return slideEls[no];
mir3636
parents:
diff changeset
150 }
mir3636
parents:
diff changeset
151 };
mir3636
parents:
diff changeset
152
mir3636
parents:
diff changeset
153 function updateSlideClass(slideNo, className) {
mir3636
parents:
diff changeset
154 var el = getSlideEl(slideNo);
mir3636
parents:
diff changeset
155
mir3636
parents:
diff changeset
156 if (!el) {
mir3636
parents:
diff changeset
157 return;
mir3636
parents:
diff changeset
158 }
mir3636
parents:
diff changeset
159
mir3636
parents:
diff changeset
160 if (className) {
mir3636
parents:
diff changeset
161 el.classList.add(className);
mir3636
parents:
diff changeset
162 }
mir3636
parents:
diff changeset
163
mir3636
parents:
diff changeset
164 for (var i in SLIDE_CLASSES) {
mir3636
parents:
diff changeset
165 if (className != SLIDE_CLASSES[i]) {
mir3636
parents:
diff changeset
166 el.classList.remove(SLIDE_CLASSES[i]);
mir3636
parents:
diff changeset
167 }
mir3636
parents:
diff changeset
168 }
mir3636
parents:
diff changeset
169 };
mir3636
parents:
diff changeset
170
mir3636
parents:
diff changeset
171 function updateSlides() {
mir3636
parents:
diff changeset
172 for (var i = 0; i < slideEls.length; i++) {
mir3636
parents:
diff changeset
173 switch (i) {
mir3636
parents:
diff changeset
174 case curSlide - 2:
mir3636
parents:
diff changeset
175 updateSlideClass(i, 'far-past');
mir3636
parents:
diff changeset
176 break;
mir3636
parents:
diff changeset
177 case curSlide - 1:
mir3636
parents:
diff changeset
178 updateSlideClass(i, 'past');
mir3636
parents:
diff changeset
179 break;
mir3636
parents:
diff changeset
180 case curSlide:
mir3636
parents:
diff changeset
181 updateSlideClass(i, 'current');
mir3636
parents:
diff changeset
182 break;
mir3636
parents:
diff changeset
183 case curSlide + 1:
mir3636
parents:
diff changeset
184 updateSlideClass(i, 'next');
mir3636
parents:
diff changeset
185 break;
mir3636
parents:
diff changeset
186 case curSlide + 2:
mir3636
parents:
diff changeset
187 updateSlideClass(i, 'far-next');
mir3636
parents:
diff changeset
188 break;
mir3636
parents:
diff changeset
189 default:
mir3636
parents:
diff changeset
190 updateSlideClass(i);
mir3636
parents:
diff changeset
191 break;
mir3636
parents:
diff changeset
192 }
mir3636
parents:
diff changeset
193 }
mir3636
parents:
diff changeset
194
mir3636
parents:
diff changeset
195 triggerLeaveEvent(curSlide - 1);
mir3636
parents:
diff changeset
196 triggerEnterEvent(curSlide);
mir3636
parents:
diff changeset
197
mir3636
parents:
diff changeset
198 window.setTimeout(function() {
mir3636
parents:
diff changeset
199 // Hide after the slide
mir3636
parents:
diff changeset
200 disableSlideFrames(curSlide - 2);
mir3636
parents:
diff changeset
201 }, 301);
mir3636
parents:
diff changeset
202
mir3636
parents:
diff changeset
203 enableSlideFrames(curSlide - 1);
mir3636
parents:
diff changeset
204 enableSlideFrames(curSlide + 2);
mir3636
parents:
diff changeset
205
mir3636
parents:
diff changeset
206 if (isChromeVoxActive()) {
mir3636
parents:
diff changeset
207 speakAndSyncToNode(slideEls[curSlide]);
mir3636
parents:
diff changeset
208 }
mir3636
parents:
diff changeset
209
mir3636
parents:
diff changeset
210 updateHash();
mir3636
parents:
diff changeset
211 };
mir3636
parents:
diff changeset
212
mir3636
parents:
diff changeset
213 function buildNextItem() {
mir3636
parents:
diff changeset
214 var toBuild = slideEls[curSlide].querySelectorAll('.to-build');
mir3636
parents:
diff changeset
215
mir3636
parents:
diff changeset
216 if (!toBuild.length) {
mir3636
parents:
diff changeset
217 return false;
mir3636
parents:
diff changeset
218 }
mir3636
parents:
diff changeset
219
mir3636
parents:
diff changeset
220 toBuild[0].classList.remove('to-build');
mir3636
parents:
diff changeset
221
mir3636
parents:
diff changeset
222 if (isChromeVoxActive()) {
mir3636
parents:
diff changeset
223 speakAndSyncToNode(toBuild[0]);
mir3636
parents:
diff changeset
224 }
mir3636
parents:
diff changeset
225
mir3636
parents:
diff changeset
226 return true;
mir3636
parents:
diff changeset
227 };
mir3636
parents:
diff changeset
228
mir3636
parents:
diff changeset
229 function prevSlide() {
mir3636
parents:
diff changeset
230 if (curSlide > 0) {
mir3636
parents:
diff changeset
231 curSlide--;
mir3636
parents:
diff changeset
232
mir3636
parents:
diff changeset
233 updateSlides();
mir3636
parents:
diff changeset
234 }
mir3636
parents:
diff changeset
235 };
mir3636
parents:
diff changeset
236
mir3636
parents:
diff changeset
237 function nextSlide() {
mir3636
parents:
diff changeset
238 if (buildNextItem()) {
mir3636
parents:
diff changeset
239 return;
mir3636
parents:
diff changeset
240 }
mir3636
parents:
diff changeset
241
mir3636
parents:
diff changeset
242 if (curSlide < slideEls.length - 1) {
mir3636
parents:
diff changeset
243 curSlide++;
mir3636
parents:
diff changeset
244
mir3636
parents:
diff changeset
245 updateSlides();
mir3636
parents:
diff changeset
246 }
mir3636
parents:
diff changeset
247 };
mir3636
parents:
diff changeset
248
mir3636
parents:
diff changeset
249 /* Slide events */
mir3636
parents:
diff changeset
250
mir3636
parents:
diff changeset
251 function triggerEnterEvent(no) {
mir3636
parents:
diff changeset
252 var el = getSlideEl(no);
mir3636
parents:
diff changeset
253 if (!el) {
mir3636
parents:
diff changeset
254 return;
mir3636
parents:
diff changeset
255 }
mir3636
parents:
diff changeset
256
mir3636
parents:
diff changeset
257 var onEnter = el.getAttribute('onslideenter');
mir3636
parents:
diff changeset
258 if (onEnter) {
mir3636
parents:
diff changeset
259 new Function(onEnter).call(el);
mir3636
parents:
diff changeset
260 }
mir3636
parents:
diff changeset
261
mir3636
parents:
diff changeset
262 var evt = document.createEvent('Event');
mir3636
parents:
diff changeset
263 evt.initEvent('slideenter', true, true);
mir3636
parents:
diff changeset
264 evt.slideNumber = no + 1; // Make it readable
mir3636
parents:
diff changeset
265
mir3636
parents:
diff changeset
266 el.dispatchEvent(evt);
mir3636
parents:
diff changeset
267 };
mir3636
parents:
diff changeset
268
mir3636
parents:
diff changeset
269 function triggerLeaveEvent(no) {
mir3636
parents:
diff changeset
270 var el = getSlideEl(no);
mir3636
parents:
diff changeset
271 if (!el) {
mir3636
parents:
diff changeset
272 return;
mir3636
parents:
diff changeset
273 }
mir3636
parents:
diff changeset
274
mir3636
parents:
diff changeset
275 var onLeave = el.getAttribute('onslideleave');
mir3636
parents:
diff changeset
276 if (onLeave) {
mir3636
parents:
diff changeset
277 new Function(onLeave).call(el);
mir3636
parents:
diff changeset
278 }
mir3636
parents:
diff changeset
279
mir3636
parents:
diff changeset
280 var evt = document.createEvent('Event');
mir3636
parents:
diff changeset
281 evt.initEvent('slideleave', true, true);
mir3636
parents:
diff changeset
282 evt.slideNumber = no + 1; // Make it readable
mir3636
parents:
diff changeset
283
mir3636
parents:
diff changeset
284 el.dispatchEvent(evt);
mir3636
parents:
diff changeset
285 };
mir3636
parents:
diff changeset
286
mir3636
parents:
diff changeset
287 /* Touch events */
mir3636
parents:
diff changeset
288
mir3636
parents:
diff changeset
289 function handleTouchStart(event) {
mir3636
parents:
diff changeset
290 if (event.touches.length == 1) {
mir3636
parents:
diff changeset
291 touchDX = 0;
mir3636
parents:
diff changeset
292 touchDY = 0;
mir3636
parents:
diff changeset
293
mir3636
parents:
diff changeset
294 touchStartX = event.touches[0].pageX;
mir3636
parents:
diff changeset
295 touchStartY = event.touches[0].pageY;
mir3636
parents:
diff changeset
296
mir3636
parents:
diff changeset
297 document.body.addEventListener('touchmove', handleTouchMove, true);
mir3636
parents:
diff changeset
298 document.body.addEventListener('touchend', handleTouchEnd, true);
mir3636
parents:
diff changeset
299 }
mir3636
parents:
diff changeset
300 };
mir3636
parents:
diff changeset
301
mir3636
parents:
diff changeset
302 function handleTouchMove(event) {
mir3636
parents:
diff changeset
303 if (event.touches.length > 1) {
mir3636
parents:
diff changeset
304 cancelTouch();
mir3636
parents:
diff changeset
305 } else {
mir3636
parents:
diff changeset
306 touchDX = event.touches[0].pageX - touchStartX;
mir3636
parents:
diff changeset
307 touchDY = event.touches[0].pageY - touchStartY;
mir3636
parents:
diff changeset
308 }
mir3636
parents:
diff changeset
309 };
mir3636
parents:
diff changeset
310
mir3636
parents:
diff changeset
311 function handleTouchEnd(event) {
mir3636
parents:
diff changeset
312 var dx = Math.abs(touchDX);
mir3636
parents:
diff changeset
313 var dy = Math.abs(touchDY);
mir3636
parents:
diff changeset
314
mir3636
parents:
diff changeset
315 if ((dx > PM_TOUCH_SENSITIVITY) && (dy < (dx * 2 / 3))) {
mir3636
parents:
diff changeset
316 if (touchDX > 0) {
mir3636
parents:
diff changeset
317 prevSlide();
mir3636
parents:
diff changeset
318 } else {
mir3636
parents:
diff changeset
319 nextSlide();
mir3636
parents:
diff changeset
320 }
mir3636
parents:
diff changeset
321 }
mir3636
parents:
diff changeset
322
mir3636
parents:
diff changeset
323 cancelTouch();
mir3636
parents:
diff changeset
324 };
mir3636
parents:
diff changeset
325
mir3636
parents:
diff changeset
326 function cancelTouch() {
mir3636
parents:
diff changeset
327 document.body.removeEventListener('touchmove', handleTouchMove, true);
mir3636
parents:
diff changeset
328 document.body.removeEventListener('touchend', handleTouchEnd, true);
mir3636
parents:
diff changeset
329 };
mir3636
parents:
diff changeset
330
mir3636
parents:
diff changeset
331 /* Preloading frames */
mir3636
parents:
diff changeset
332
mir3636
parents:
diff changeset
333 function disableSlideFrames(no) {
mir3636
parents:
diff changeset
334 var el = getSlideEl(no);
mir3636
parents:
diff changeset
335 if (!el) {
mir3636
parents:
diff changeset
336 return;
mir3636
parents:
diff changeset
337 }
mir3636
parents:
diff changeset
338
mir3636
parents:
diff changeset
339 var frames = el.getElementsByTagName('iframe');
mir3636
parents:
diff changeset
340 for (var i = 0, frame; frame = frames[i]; i++) {
mir3636
parents:
diff changeset
341 disableFrame(frame);
mir3636
parents:
diff changeset
342 }
mir3636
parents:
diff changeset
343 };
mir3636
parents:
diff changeset
344
mir3636
parents:
diff changeset
345 function enableSlideFrames(no) {
mir3636
parents:
diff changeset
346 var el = getSlideEl(no);
mir3636
parents:
diff changeset
347 if (!el) {
mir3636
parents:
diff changeset
348 return;
mir3636
parents:
diff changeset
349 }
mir3636
parents:
diff changeset
350
mir3636
parents:
diff changeset
351 var frames = el.getElementsByTagName('iframe');
mir3636
parents:
diff changeset
352 for (var i = 0, frame; frame = frames[i]; i++) {
mir3636
parents:
diff changeset
353 enableFrame(frame);
mir3636
parents:
diff changeset
354 }
mir3636
parents:
diff changeset
355 };
mir3636
parents:
diff changeset
356
mir3636
parents:
diff changeset
357 function disableFrame(frame) {
mir3636
parents:
diff changeset
358 frame.src = 'about:blank';
mir3636
parents:
diff changeset
359 };
mir3636
parents:
diff changeset
360
mir3636
parents:
diff changeset
361 function enableFrame(frame) {
mir3636
parents:
diff changeset
362 var src = frame._src;
mir3636
parents:
diff changeset
363
mir3636
parents:
diff changeset
364 if (frame.src != src && src != 'about:blank') {
mir3636
parents:
diff changeset
365 frame.src = src;
mir3636
parents:
diff changeset
366 }
mir3636
parents:
diff changeset
367 };
mir3636
parents:
diff changeset
368
mir3636
parents:
diff changeset
369 function setupFrames() {
mir3636
parents:
diff changeset
370 var frames = document.querySelectorAll('iframe');
mir3636
parents:
diff changeset
371 for (var i = 0, frame; frame = frames[i]; i++) {
mir3636
parents:
diff changeset
372 frame._src = frame.src;
mir3636
parents:
diff changeset
373 disableFrame(frame);
mir3636
parents:
diff changeset
374 }
mir3636
parents:
diff changeset
375
mir3636
parents:
diff changeset
376 enableSlideFrames(curSlide);
mir3636
parents:
diff changeset
377 enableSlideFrames(curSlide + 1);
mir3636
parents:
diff changeset
378 enableSlideFrames(curSlide + 2);
mir3636
parents:
diff changeset
379 };
mir3636
parents:
diff changeset
380
mir3636
parents:
diff changeset
381 function setupInteraction() {
mir3636
parents:
diff changeset
382 /* Clicking and tapping */
mir3636
parents:
diff changeset
383
mir3636
parents:
diff changeset
384 var el = document.createElement('div');
mir3636
parents:
diff changeset
385 el.className = 'slide-area';
mir3636
parents:
diff changeset
386 el.id = 'prev-slide-area';
mir3636
parents:
diff changeset
387 el.addEventListener('click', prevSlide, false);
mir3636
parents:
diff changeset
388 document.querySelector('section.slides').appendChild(el);
mir3636
parents:
diff changeset
389
mir3636
parents:
diff changeset
390 var el = document.createElement('div');
mir3636
parents:
diff changeset
391 el.className = 'slide-area';
mir3636
parents:
diff changeset
392 el.id = 'next-slide-area';
mir3636
parents:
diff changeset
393 el.addEventListener('click', nextSlide, false);
mir3636
parents:
diff changeset
394 document.querySelector('section.slides').appendChild(el);
mir3636
parents:
diff changeset
395
mir3636
parents:
diff changeset
396 /* Swiping */
mir3636
parents:
diff changeset
397
mir3636
parents:
diff changeset
398 document.body.addEventListener('touchstart', handleTouchStart, false);
mir3636
parents:
diff changeset
399 }
mir3636
parents:
diff changeset
400
mir3636
parents:
diff changeset
401 /* ChromeVox support */
mir3636
parents:
diff changeset
402
mir3636
parents:
diff changeset
403 function isChromeVoxActive() {
mir3636
parents:
diff changeset
404 if (typeof(cvox) == 'undefined') {
mir3636
parents:
diff changeset
405 return false;
mir3636
parents:
diff changeset
406 } else {
mir3636
parents:
diff changeset
407 return true;
mir3636
parents:
diff changeset
408 }
mir3636
parents:
diff changeset
409 };
mir3636
parents:
diff changeset
410
mir3636
parents:
diff changeset
411 function speakAndSyncToNode(node) {
mir3636
parents:
diff changeset
412 if (!isChromeVoxActive()) {
mir3636
parents:
diff changeset
413 return;
mir3636
parents:
diff changeset
414 }
mir3636
parents:
diff changeset
415
mir3636
parents:
diff changeset
416 cvox.ChromeVox.navigationManager.switchToStrategy(
mir3636
parents:
diff changeset
417 cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
mir3636
parents:
diff changeset
418 cvox.ChromeVox.navigationManager.syncToNode(node);
mir3636
parents:
diff changeset
419 cvox.ChromeVoxUserCommands.finishNavCommand('');
mir3636
parents:
diff changeset
420 var target = node;
mir3636
parents:
diff changeset
421 while (target.firstChild) {
mir3636
parents:
diff changeset
422 target = target.firstChild;
mir3636
parents:
diff changeset
423 }
mir3636
parents:
diff changeset
424 cvox.ChromeVox.navigationManager.syncToNode(target);
mir3636
parents:
diff changeset
425 };
mir3636
parents:
diff changeset
426
mir3636
parents:
diff changeset
427 function speakNextItem() {
mir3636
parents:
diff changeset
428 if (!isChromeVoxActive()) {
mir3636
parents:
diff changeset
429 return;
mir3636
parents:
diff changeset
430 }
mir3636
parents:
diff changeset
431
mir3636
parents:
diff changeset
432 cvox.ChromeVox.navigationManager.switchToStrategy(
mir3636
parents:
diff changeset
433 cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
mir3636
parents:
diff changeset
434 cvox.ChromeVox.navigationManager.next(true);
mir3636
parents:
diff changeset
435 if (!cvox.DomUtil.isDescendantOfNode(
mir3636
parents:
diff changeset
436 cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])){
mir3636
parents:
diff changeset
437 var target = slideEls[curSlide];
mir3636
parents:
diff changeset
438 while (target.firstChild) {
mir3636
parents:
diff changeset
439 target = target.firstChild;
mir3636
parents:
diff changeset
440 }
mir3636
parents:
diff changeset
441 cvox.ChromeVox.navigationManager.syncToNode(target);
mir3636
parents:
diff changeset
442 cvox.ChromeVox.navigationManager.next(true);
mir3636
parents:
diff changeset
443 }
mir3636
parents:
diff changeset
444 cvox.ChromeVoxUserCommands.finishNavCommand('');
mir3636
parents:
diff changeset
445 };
mir3636
parents:
diff changeset
446
mir3636
parents:
diff changeset
447 function speakPrevItem() {
mir3636
parents:
diff changeset
448 if (!isChromeVoxActive()) {
mir3636
parents:
diff changeset
449 return;
mir3636
parents:
diff changeset
450 }
mir3636
parents:
diff changeset
451
mir3636
parents:
diff changeset
452 cvox.ChromeVox.navigationManager.switchToStrategy(
mir3636
parents:
diff changeset
453 cvox.ChromeVoxNavigationManager.STRATEGIES.LINEARDOM, 0, true);
mir3636
parents:
diff changeset
454 cvox.ChromeVox.navigationManager.previous(true);
mir3636
parents:
diff changeset
455 if (!cvox.DomUtil.isDescendantOfNode(
mir3636
parents:
diff changeset
456 cvox.ChromeVox.navigationManager.getCurrentNode(), slideEls[curSlide])){
mir3636
parents:
diff changeset
457 var target = slideEls[curSlide];
mir3636
parents:
diff changeset
458 while (target.lastChild){
mir3636
parents:
diff changeset
459 target = target.lastChild;
mir3636
parents:
diff changeset
460 }
mir3636
parents:
diff changeset
461 cvox.ChromeVox.navigationManager.syncToNode(target);
mir3636
parents:
diff changeset
462 cvox.ChromeVox.navigationManager.previous(true);
mir3636
parents:
diff changeset
463 }
mir3636
parents:
diff changeset
464 cvox.ChromeVoxUserCommands.finishNavCommand('');
mir3636
parents:
diff changeset
465 };
mir3636
parents:
diff changeset
466
mir3636
parents:
diff changeset
467 /* Hash functions */
mir3636
parents:
diff changeset
468
mir3636
parents:
diff changeset
469 function getCurSlideFromHash() {
mir3636
parents:
diff changeset
470 var slideNo = parseInt(location.hash.substr(1));
mir3636
parents:
diff changeset
471
mir3636
parents:
diff changeset
472 if (slideNo) {
mir3636
parents:
diff changeset
473 curSlide = slideNo - 1;
mir3636
parents:
diff changeset
474 } else {
mir3636
parents:
diff changeset
475 curSlide = 0;
mir3636
parents:
diff changeset
476 }
mir3636
parents:
diff changeset
477 };
mir3636
parents:
diff changeset
478
mir3636
parents:
diff changeset
479 function updateHash() {
mir3636
parents:
diff changeset
480 location.replace('#' + (curSlide + 1));
mir3636
parents:
diff changeset
481 };
mir3636
parents:
diff changeset
482
mir3636
parents:
diff changeset
483 /* Event listeners */
mir3636
parents:
diff changeset
484
mir3636
parents:
diff changeset
485 function handleBodyKeyDown(event) {
mir3636
parents:
diff changeset
486 switch (event.keyCode) {
mir3636
parents:
diff changeset
487 case 39: // right arrow
mir3636
parents:
diff changeset
488 case 13: // Enter
mir3636
parents:
diff changeset
489 case 32: // space
mir3636
parents:
diff changeset
490 case 34: // PgDn
mir3636
parents:
diff changeset
491 nextSlide();
mir3636
parents:
diff changeset
492 event.preventDefault();
mir3636
parents:
diff changeset
493 break;
mir3636
parents:
diff changeset
494
mir3636
parents:
diff changeset
495 case 37: // left arrow
mir3636
parents:
diff changeset
496 case 8: // Backspace
mir3636
parents:
diff changeset
497 case 33: // PgUp
mir3636
parents:
diff changeset
498 prevSlide();
mir3636
parents:
diff changeset
499 event.preventDefault();
mir3636
parents:
diff changeset
500 break;
mir3636
parents:
diff changeset
501
mir3636
parents:
diff changeset
502 case 40: // down arrow
mir3636
parents:
diff changeset
503 if (isChromeVoxActive()) {
mir3636
parents:
diff changeset
504 speakNextItem();
mir3636
parents:
diff changeset
505 } else {
mir3636
parents:
diff changeset
506 nextSlide();
mir3636
parents:
diff changeset
507 }
mir3636
parents:
diff changeset
508 event.preventDefault();
mir3636
parents:
diff changeset
509 break;
mir3636
parents:
diff changeset
510
mir3636
parents:
diff changeset
511 case 38: // up arrow
mir3636
parents:
diff changeset
512 if (isChromeVoxActive()) {
mir3636
parents:
diff changeset
513 speakPrevItem();
mir3636
parents:
diff changeset
514 } else {
mir3636
parents:
diff changeset
515 prevSlide();
mir3636
parents:
diff changeset
516 }
mir3636
parents:
diff changeset
517 event.preventDefault();
mir3636
parents:
diff changeset
518 break;
mir3636
parents:
diff changeset
519 }
mir3636
parents:
diff changeset
520 };
mir3636
parents:
diff changeset
521
mir3636
parents:
diff changeset
522 function addEventListeners() {
mir3636
parents:
diff changeset
523 document.addEventListener('keydown', handleBodyKeyDown, false);
mir3636
parents:
diff changeset
524 };
mir3636
parents:
diff changeset
525
mir3636
parents:
diff changeset
526 /* Initialization */
mir3636
parents:
diff changeset
527
mir3636
parents:
diff changeset
528 function addPrettify() {
mir3636
parents:
diff changeset
529 var els = document.querySelectorAll('pre');
mir3636
parents:
diff changeset
530 for (var i = 0, el; el = els[i]; i++) {
mir3636
parents:
diff changeset
531 if (!el.classList.contains('noprettyprint')) {
mir3636
parents:
diff changeset
532 el.classList.add('prettyprint');
mir3636
parents:
diff changeset
533 }
mir3636
parents:
diff changeset
534 }
mir3636
parents:
diff changeset
535
mir3636
parents:
diff changeset
536 var el = document.createElement('script');
mir3636
parents:
diff changeset
537 el.type = 'text/javascript';
mir3636
parents:
diff changeset
538 el.src = PERMANENT_URL_PREFIX + 'prettify.js';
mir3636
parents:
diff changeset
539 el.onload = function() {
mir3636
parents:
diff changeset
540 prettyPrint();
mir3636
parents:
diff changeset
541 }
mir3636
parents:
diff changeset
542 document.body.appendChild(el);
mir3636
parents:
diff changeset
543 };
mir3636
parents:
diff changeset
544
mir3636
parents:
diff changeset
545 function addFontStyle() {
mir3636
parents:
diff changeset
546 var el = document.createElement('link');
mir3636
parents:
diff changeset
547 el.rel = 'stylesheet';
mir3636
parents:
diff changeset
548 el.type = 'text/css';
mir3636
parents:
diff changeset
549 el.href = 'http://fonts.googleapis.com/css?family=' +
mir3636
parents:
diff changeset
550 'Open+Sans:regular,semibold,italic,italicsemibold|Droid+Sans+Mono';
mir3636
parents:
diff changeset
551
mir3636
parents:
diff changeset
552 document.body.appendChild(el);
mir3636
parents:
diff changeset
553 };
mir3636
parents:
diff changeset
554
mir3636
parents:
diff changeset
555 function addGeneralStyle() {
mir3636
parents:
diff changeset
556 var el = document.createElement('link');
mir3636
parents:
diff changeset
557 el.rel = 'stylesheet';
mir3636
parents:
diff changeset
558 el.type = 'text/css';
mir3636
parents:
diff changeset
559 el.href = PERMANENT_URL_PREFIX + 'styles.css';
mir3636
parents:
diff changeset
560 document.body.appendChild(el);
mir3636
parents:
diff changeset
561
mir3636
parents:
diff changeset
562 var el = document.createElement('meta');
mir3636
parents:
diff changeset
563 el.name = 'viewport';
mir3636
parents:
diff changeset
564 el.content = 'width=1100,height=750';
mir3636
parents:
diff changeset
565 document.querySelector('head').appendChild(el);
mir3636
parents:
diff changeset
566
mir3636
parents:
diff changeset
567 var el = document.createElement('meta');
mir3636
parents:
diff changeset
568 el.name = 'apple-mobile-web-app-capable';
mir3636
parents:
diff changeset
569 el.content = 'yes';
mir3636
parents:
diff changeset
570 document.querySelector('head').appendChild(el);
mir3636
parents:
diff changeset
571 };
mir3636
parents:
diff changeset
572
mir3636
parents:
diff changeset
573 function makeBuildLists() {
mir3636
parents:
diff changeset
574 for (var i = curSlide, slide; slide = slideEls[i]; i++) {
mir3636
parents:
diff changeset
575 var items = slide.querySelectorAll('.build > *');
mir3636
parents:
diff changeset
576 for (var j = 0, item; item = items[j]; j++) {
mir3636
parents:
diff changeset
577 if (item.classList) {
mir3636
parents:
diff changeset
578 item.classList.add('to-build');
mir3636
parents:
diff changeset
579 }
mir3636
parents:
diff changeset
580 }
mir3636
parents:
diff changeset
581 }
mir3636
parents:
diff changeset
582 };
mir3636
parents:
diff changeset
583
mir3636
parents:
diff changeset
584 function handleDomLoaded() {
mir3636
parents:
diff changeset
585 slideEls = document.querySelectorAll('section.slides > article');
mir3636
parents:
diff changeset
586
mir3636
parents:
diff changeset
587 setupFrames();
mir3636
parents:
diff changeset
588
mir3636
parents:
diff changeset
589 addFontStyle();
mir3636
parents:
diff changeset
590 addGeneralStyle();
mir3636
parents:
diff changeset
591 addPrettify();
mir3636
parents:
diff changeset
592 addEventListeners();
mir3636
parents:
diff changeset
593
mir3636
parents:
diff changeset
594 updateSlides();
mir3636
parents:
diff changeset
595
mir3636
parents:
diff changeset
596 setupInteraction();
mir3636
parents:
diff changeset
597 makeBuildLists();
mir3636
parents:
diff changeset
598
mir3636
parents:
diff changeset
599 document.body.classList.add('loaded');
mir3636
parents:
diff changeset
600 };
mir3636
parents:
diff changeset
601
mir3636
parents:
diff changeset
602 function initialize() {
mir3636
parents:
diff changeset
603 getCurSlideFromHash();
mir3636
parents:
diff changeset
604
mir3636
parents:
diff changeset
605 if (window['_DEBUG']) {
mir3636
parents:
diff changeset
606 PERMANENT_URL_PREFIX = '../';
mir3636
parents:
diff changeset
607 }
mir3636
parents:
diff changeset
608
mir3636
parents:
diff changeset
609 if (window['_DCL']) {
mir3636
parents:
diff changeset
610 handleDomLoaded();
mir3636
parents:
diff changeset
611 } else {
mir3636
parents:
diff changeset
612 document.addEventListener('DOMContentLoaded', handleDomLoaded, false);
mir3636
parents:
diff changeset
613 }
mir3636
parents:
diff changeset
614 }
mir3636
parents:
diff changeset
615
mir3636
parents:
diff changeset
616 // If ?debug exists then load the script relative instead of absolute
mir3636
parents:
diff changeset
617 if (!window['_DEBUG'] && document.location.href.indexOf('?debug') !== -1) {
mir3636
parents:
diff changeset
618 document.addEventListener('DOMContentLoaded', function() {
mir3636
parents:
diff changeset
619 // Avoid missing the DomContentLoaded event
mir3636
parents:
diff changeset
620 window['_DCL'] = true
mir3636
parents:
diff changeset
621 }, false);
mir3636
parents:
diff changeset
622
mir3636
parents:
diff changeset
623 window['_DEBUG'] = true;
mir3636
parents:
diff changeset
624 var script = document.createElement('script');
mir3636
parents:
diff changeset
625 script.type = 'text/javascript';
mir3636
parents:
diff changeset
626 script.src = '../slides.js';
mir3636
parents:
diff changeset
627 var s = document.getElementsByTagName('script')[0];
mir3636
parents:
diff changeset
628 s.parentNode.insertBefore(script, s);
mir3636
parents:
diff changeset
629
mir3636
parents:
diff changeset
630 // Remove this script
mir3636
parents:
diff changeset
631 s.parentNode.removeChild(s);
mir3636
parents:
diff changeset
632 } else {
mir3636
parents:
diff changeset
633 initialize();
mir3636
parents:
diff changeset
634 }