diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/slide-controller.js | 213 | ||||
-rw-r--r-- | js/slide-deck.js | 1229 | ||||
-rw-r--r-- | js/slides.js | 6 |
3 files changed, 746 insertions, 702 deletions
diff --git a/js/slide-controller.js b/js/slide-controller.js index 571317b..9dcb4df 100644 --- a/js/slide-controller.js +++ b/js/slide-controller.js | |||
@@ -1,109 +1,112 @@ | |||
1 | (function(window) { | 1 | (function(window) { |
2 | 2 | ||
3 | var ORIGIN_ = location.protocol + '//' + location.host; | 3 | var ORIGIN_ = location.protocol + '//' + location.host; |
4 | 4 | ||
5 | function SlideController() { | 5 | function SlideController() { |
6 | this.popup = null; | 6 | this.popup = null; |
7 | this.isPopup = window.opener; | 7 | this.isPopup = window.opener; |
8 | 8 | ||
9 | if (this.setupDone()) { | 9 | if (this.setupDone()) { |
10 | window.addEventListener('message', this.onMessage_.bind(this), false); | 10 | window.addEventListener('message', this.onMessage_.bind(this), |
11 | 11 | false); | |
12 | // Close popups if we reload the main window. | 12 | |
13 | window.addEventListener('beforeunload', function(e) { | 13 | // Close popups if we reload the main window. |
14 | if (this.popup) { | 14 | window.addEventListener('beforeunload', function(e) { |
15 | this.popup.close(); | 15 | if (this.popup) { |
16 | } | 16 | this.popup.close(); |
17 | }.bind(this), false); | 17 | } |
18 | } | 18 | }.bind(this), false); |
19 | } | 19 | } |
20 | 20 | } | |
21 | SlideController.PRESENTER_MODE_PARAM = 'presentme'; | 21 | |
22 | 22 | SlideController.PRESENTER_MODE_PARAM = 'presentme'; | |
23 | SlideController.prototype.setupDone = function() { | 23 | |
24 | var params = location.search.substring(1).split('&').map(function(el) { | 24 | SlideController.prototype.setupDone = function() { |
25 | return el.split('='); | 25 | var params = location.search.substring(1).split('&').map(function(el) { |
26 | }); | 26 | return el.split('='); |
27 | 27 | }); | |
28 | var presentMe = null; | 28 | |
29 | for (var i = 0, param; param = params[i]; ++i) { | 29 | var presentMe = null; |
30 | if (param[0].toLowerCase() == SlideController.PRESENTER_MODE_PARAM) { | 30 | for (var i = 0, param; param = params[i]; ++i) { |
31 | presentMe = param[1] == 'true'; | 31 | if (param[0].toLowerCase() == SlideController.PRESENTER_MODE_PARAM) { |
32 | break; | 32 | presentMe = param[1] == 'true'; |
33 | } | 33 | break; |
34 | } | 34 | } |
35 | 35 | } | |
36 | if (presentMe !== null) { | 36 | |
37 | localStorage.ENABLE_PRESENTOR_MODE = presentMe; | 37 | if (presentMe !== null) { |
38 | // TODO: use window.history.pushState to update URL instead of the redirect. | 38 | localStorage.ENABLE_PRESENTOR_MODE = presentMe; |
39 | if (window.history.replaceState) { | 39 | // TODO: use window.history.pushState to update URL instead of the |
40 | window.history.replaceState({}, '', location.pathname); | 40 | // redirect. |
41 | } else { | 41 | if (window.history.replaceState) { |
42 | location.replace(location.pathname); | 42 | window.history.replaceState({}, '', location.pathname); |
43 | return false; | 43 | } else { |
44 | } | 44 | location.replace(location.pathname); |
45 | } | 45 | return false; |
46 | 46 | } | |
47 | var enablePresenterMode = localStorage.getItem('ENABLE_PRESENTOR_MODE'); | 47 | } |
48 | if (enablePresenterMode && JSON.parse(enablePresenterMode)) { | 48 | |
49 | // Only open popup from main deck. Don't want recursive popup opening! | 49 | var enablePresenterMode = localStorage.getItem('ENABLE_PRESENTOR_MODE'); |
50 | if (!this.isPopup) { | 50 | if (enablePresenterMode && JSON.parse(enablePresenterMode)) { |
51 | var opts = 'menubar=no,location=yes,resizable=yes,scrollbars=no,status=no'; | 51 | // Only open popup from main deck. Don't want recursive popup |
52 | this.popup = window.open(location.href, 'mywindow', opts); | 52 | // opening! |
53 | 53 | if (!this.isPopup) { | |
54 | // Loading in the popup? Trigger the hotkey for turning presenter mode on. | 54 | var opts = 'menubar=no,location=yes,resizable=yes,scrollbars=no,status=no'; |
55 | this.popup.addEventListener('load', function(e) { | 55 | this.popup = window.open(location.href, 'mywindow', opts); |
56 | var evt = this.popup.document.createEvent('Event'); | 56 | |
57 | evt.initEvent('keydown', true, true); | 57 | // Loading in the popup? Trigger the hotkey for turning |
58 | evt.keyCode = 'P'.charCodeAt(0); | 58 | // presenter mode on. |
59 | this.popup.document.dispatchEvent(evt); | 59 | this.popup.addEventListener('load', function(e) { |
60 | // this.popup.document.body.classList.add('with-notes'); | 60 | var evt = this.popup.document.createEvent('Event'); |
61 | // document.body.classList.add('popup'); | 61 | evt.initEvent('keydown', true, true); |
62 | }.bind(this), false); | 62 | evt.keyCode = 'P'.charCodeAt(0); |
63 | } | 63 | this.popup.document.dispatchEvent(evt); |
64 | } | 64 | // this.popup.document.body.classList.add('with-notes'); |
65 | 65 | // document.body.classList.add('popup'); | |
66 | return true; | 66 | }.bind(this), false); |
67 | } | 67 | } |
68 | 68 | } | |
69 | SlideController.prototype.onMessage_ = function(e) { | 69 | |
70 | var data = e.data; | 70 | return true; |
71 | 71 | } | |
72 | // Restrict messages to being from this origin. Allow local developmet | 72 | |
73 | // from file:// though. | 73 | SlideController.prototype.onMessage_ = function(e) { |
74 | // TODO: It would be dope if FF implemented location.origin! | 74 | var data = e.data; |
75 | if (e.origin != ORIGIN_ && ORIGIN_.indexOf('file://') != 0) { | 75 | |
76 | alert('Someone tried to postMessage from an unknown origin'); | 76 | // Restrict messages to being from this origin. Allow local developmet |
77 | return; | 77 | // from file:// though. |
78 | } | 78 | // TODO: It would be dope if FF implemented location.origin! |
79 | 79 | if (e.origin != ORIGIN_ && ORIGIN_.indexOf('file://') != 0) { | |
80 | // if (e.source.location.hostname != 'localhost') { | 80 | alert('Someone tried to postMessage from an unknown origin'); |
81 | // alert('Someone tried to postMessage from an unknown origin'); | 81 | return; |
82 | // return; | 82 | } |
83 | // } | 83 | |
84 | 84 | // if (e.source.location.hostname != 'localhost') { | |
85 | if ('keyCode' in data) { | 85 | // alert('Someone tried to postMessage from an unknown origin'); |
86 | var evt = document.createEvent('Event'); | 86 | // return; |
87 | evt.initEvent('keydown', true, true); | 87 | // } |
88 | evt.keyCode = data.keyCode; | 88 | |
89 | document.dispatchEvent(evt); | 89 | if ('keyCode' in data) { |
90 | } | 90 | var evt = document.createEvent('Event'); |
91 | }; | 91 | evt.initEvent('keydown', true, true); |
92 | 92 | evt.keyCode = data.keyCode; | |
93 | SlideController.prototype.sendMsg = function(msg) { | 93 | document.dispatchEvent(evt); |
94 | // // Send message to popup window. | 94 | } |
95 | // if (this.popup) { | 95 | }; |
96 | // this.popup.postMessage(msg, ORIGIN_); | 96 | |
97 | // } | 97 | SlideController.prototype.sendMsg = function(msg) { |
98 | 98 | // // Send message to popup window. | |
99 | // Send message to main window. | 99 | // if (this.popup) { |
100 | if (this.isPopup) { | 100 | // this.popup.postMessage(msg, ORIGIN_); |
101 | // TODO: It would be dope if FF implemented location.origin. | 101 | // } |
102 | window.opener.postMessage(msg, '*'); | 102 | |
103 | } | 103 | // Send message to main window. |
104 | }; | 104 | if (this.isPopup) { |
105 | 105 | // TODO: It would be dope if FF implemented location.origin. | |
106 | window.SlideController = SlideController; | 106 | window.opener.postMessage(msg, '*'); |
107 | } | ||
108 | }; | ||
109 | |||
110 | window.SlideController = SlideController; | ||
107 | 111 | ||
108 | })(window); | 112 | })(window); |
109 | |||
diff --git a/js/slide-deck.js b/js/slide-deck.js index d792ddd..67aa4f2 100644 --- a/js/slide-deck.js +++ b/js/slide-deck.js | |||
@@ -3,32 +3,32 @@ | |||
3 | * @authors Eric Bidelman | 3 | * @authors Eric Bidelman |
4 | * @fileoverview TODO | 4 | * @fileoverview TODO |
5 | */ | 5 | */ |
6 | document.cancelFullScreen = document.webkitCancelFullScreen || | 6 | document.cancelFullScreen = document.webkitCancelFullScreen |
7 | document.mozCancelFullScreen; | 7 | || document.mozCancelFullScreen; |
8 | 8 | ||
9 | /** | 9 | /** |
10 | * @constructor | 10 | * @constructor |
11 | */ | 11 | */ |
12 | function SlideDeck(el) { | 12 | function SlideDeck(el) { |
13 | this.curSlide_ = 0; | 13 | this.curSlide_ = 0; |
14 | this.prevSlide_ = 0; | 14 | this.prevSlide_ = 0; |
15 | this.config_ = null; | 15 | this.config_ = null; |
16 | this.container = el || document.querySelector('slides'); | 16 | this.container = el || document.querySelector('slides'); |
17 | this.slides = []; | 17 | this.slides = []; |
18 | this.controller = null; | 18 | this.controller = null; |
19 | 19 | ||
20 | this.getCurrentSlideFromHash_(); | 20 | this.getCurrentSlideFromHash_(); |
21 | 21 | ||
22 | // Call this explicitly. Modernizr.load won't be done until after DOM load. | 22 | // Call this explicitly. Modernizr.load won't be done until after DOM load. |
23 | this.onDomLoaded_.bind(this)(); | 23 | this.onDomLoaded_.bind(this)(); |
24 | } | 24 | } |
25 | 25 | ||
26 | /** | 26 | /** |
27 | * @const | 27 | * @const |
28 | * @private | 28 | * @private |
29 | */ | 29 | */ |
30 | SlideDeck.prototype.SLIDE_CLASSES_ = [ | 30 | SlideDeck.prototype.SLIDE_CLASSES_ = [ 'far-past', 'past', 'current', 'next', |
31 | 'far-past', 'past', 'current', 'next', 'far-next']; | 31 | 'far-next' ]; |
32 | 32 | ||
33 | /** | 33 | /** |
34 | * @const | 34 | * @const |
@@ -40,744 +40,785 @@ SlideDeck.prototype.CSS_DIR_ = 'theme/css/'; | |||
40 | * @private | 40 | * @private |
41 | */ | 41 | */ |
42 | SlideDeck.prototype.getCurrentSlideFromHash_ = function() { | 42 | SlideDeck.prototype.getCurrentSlideFromHash_ = function() { |
43 | var slideNo = parseInt(document.location.hash.substr(1)); | 43 | var slideNo = parseInt(document.location.hash.substr(1)); |
44 |