Working inline script.
[hacks/simpleWebSlides.git] / simpleWebSlides.js
1 var SimpleWebSlides = new function () {
2     var _self = this;
3     var _total_slides;
4     var _defered_custom = new Array();
5     var _initialized = false;
6
7     function push_following(t, i, v) {
8         if ((typeof t[i]) == 'undefined') {
9             t[i] = new Array();
10         };
11         var l = t[i].length;
12         if (l == 0 || !($.contains(t[i][l-1].get()[0], v.get()[0]))) {
13             t[i][l] = v;
14         };
15     };
16
17     function push(t, i, v) {
18         if ((typeof t[i]) == 'undefined') {
19             t[i] = new Array();
20         };
21         var l = t[i].length;
22             t[i][l] = v;
23     };
24
25
26     function init_canvas(canvas) {
27         var frames = new Array ();
28         var cur_frame = 0;
29         canvas.find("*").each(function(i) {
30
31             if ($(this).hasClass("pause"))  cur_frame++;
32             push_following(frames, cur_frame, $(this));
33
34         });
35         canvas.data("frames", { frames: frames,
36                                 current: 0,
37                                 custom: new Array() });
38
39     };
40
41     _self.getNumSlides = function () { return _total_slides; };
42
43
44     _self.registerCustom = function (i, f) {
45         if (_initialized) return;
46         //jQuery does not seem to work well
47         //on partial doms
48         var scripts = document.getElementsByTagName("script");
49         var current = scripts[scripts.length-1];
50         console.log(current);
51         var slide = $(current).parents(".slide");
52         if (slide.length == 0) {
53             console.log("no parent ?");
54             return;
55         }
56         _defered_custom[_defered_custom.length] = { src: slide[0],
57                                                     fn: f,
58                                                     frame: i };
59         $(current).remove();
60
61     };
62
63     if (typeof(Storage)!=="undefined"){
64         _self.getCurrentSlide = function () {
65             //unary + casts to integer
66             var i = +(sessionStorage.current_slide);
67             if (!(i >= 0 && i < _self.getNumSlides())){
68                 return 0;
69             } else {
70                 return i;
71             };
72         };
73
74         _self.setCurrentSlide = function (i) {
75             sessionStorage.current_slide = i;
76         };
77
78     } else {
79         var _current_slide = 0;
80         _self.getCurrentSlide = function () { return current_slide; };
81         _self.setCurrentSlide = function (i) { _current_slide = i; };
82
83     };
84     _self.firstSlide = function () { return 0; };
85     _self.lastSlide = function () { return _self.getNumSlides() - 1; };
86     _self.refresh = function () {
87         var cur = _self.getCurrentSlide();
88         $(".canvas").each (function (i) {
89             if (i == cur){
90                 $(this).removeClass("other_slides").addClass("current_slide");
91                 var info = $(this).data("frames");
92                 var frames = info.frames;
93                 var upto = info.current;
94                 var custom = info.custom;
95                 for(var j = 0; j < Math.max(frames.length, custom.length); j++) {
96                     for (var k = 0; k < frames[j].length; k++) {
97                         if (j < upto || frames[j][k].hasClass("footer")){
98
99                             frames[j][k].removeClass("inactive_frame").addClass("active_frame");
100
101                         } else if (j == upto) {
102
103                             frames[j][k].removeClass("inactive_frame").addClass("current_frame");
104
105                         } else {
106                             frames[j][k].removeClass("active_frame").removeClass("current_frame").addClass("inactive_frame");
107                         };
108                     };
109                     var callbacks;
110                     if (j == upto && (callbacks = custom[j])) {
111                         for (var k = 0; k < callbacks.length; k++)
112                             callbacks[k]($(this));
113                     };
114                 };
115
116             } else if ($(this).hasClass("current_slide")) {
117                 $(this).removeClass("current_slide").addClass("other_slides");
118             };
119         });
120
121     };
122
123     _self.nextSlide = function () {
124         _self.setCurrentSlide(Math.min(_self.getCurrentSlide()+1,
125                                        _self.lastSlide()));
126     };
127
128     _self.previousSlide = function () {
129         _self.setCurrentSlide(Math.max(_self.getCurrentSlide()-1,
130                                       _self.firstSlide()));
131     };
132
133     _self.getFrameInfo = function () {
134
135         var i = _self.getCurrentSlide();
136         var canvas = $($(".canvas")[i]);
137         var infos = canvas.data("frames");
138         return infos;
139     };
140     _self.getCurrentFrame = function () { return _self.getFrameInfo().current; };
141     _self.setCurrentFrame = function (i) { _self.getFrameInfo().current = i; };
142     _self.firstFrame = function () { return 0; };
143     _self.lastFrame = function () { return _self.getFrameInfo().frames.length-1; };
144
145     _self.nextFrame = function () {
146         _self.setCurrentFrame(Math.min(_self.getCurrentFrame()+1,
147                                        _self.lastFrame()));
148
149     };
150     _self.previousFrame = function () {
151         _self.setCurrentFrame(Math.max(_self.getCurrentFrame()-1,
152                                        _self.firstFrame()));
153     };
154
155     _self.next = function () {
156         var i = _self.getCurrentFrame();
157         if (i == _self.lastFrame())
158             _self.nextSlide();
159         else
160             _self.nextFrame();
161     };
162
163     _self.previous = function () {
164         var i = _self.getCurrentFrame();
165         if (i == _self.firstFrame())
166             _self.previousSlide();
167         else
168             _self.previousFrame();
169     };
170
171
172     _self.keyboardHandler = function (event) {
173
174         switch (event.which) {
175         case 36:/* Home */
176             _self.firstSlide();
177             break;
178
179         case 35:/* End */
180             _self.lastSlide();
181             break;
182
183         case 32: /* space */
184         case 39: /* -> */
185         case 1: /* mouse button 1 */
186             _self.next();
187             break;
188         case 34: /* PgDown */
189         case 78: /* n */
190             _self.nextSlide();
191             break;
192         case 8: /* backspace */
193         case 37: /* <-   */
194             _self.previous();
195             break;
196         case 33: /* PgUp */
197         case 80: /* p */
198             _self.previousSlide();
199             break;
200         default:
201             return;
202         };
203         _self.refresh();
204     };
205
206     var _init = function () {
207         _total_slides = $(".slide").length;
208
209         $(document).keydown(_self.keyboardHandler);
210         $(document).mousedown(_self.keyboardHandler);
211
212         var cur = _self.getCurrentSlide();
213         $(".slide").each (function (i) {
214             var elem = '<div class="footer"><span class="current_slide_num">' + (i+1);
215             elem += '</span><span class="slide_num_sep"/><span class="total_slide_num">';
216             elem += _self.getNumSlides() + '</span></div>';
217             if (!($(this).hasClass("nofooter"))) {
218                 $(this).append($(elem));
219             };
220             var par = $(this).parent();
221             $(this).remove();
222             var canvas = $('<div class="canvas"/>');
223             canvas.append($(this));
224             par.append(canvas);
225             if (i == cur) {
226                 canvas.addClass("current_slide").removeClass("other_slides");
227             } else {
228                 canvas.addClass("other_slides").removeClass("current_slide");
229             };
230             init_canvas(canvas);
231
232         });
233         for (var i = 0; i < _defered_custom.length; i++){
234
235             var custom = _defered_custom[i];
236             var canvas = $(custom.src).parents(".canvas");
237             if (canvas.length == 0) continue;
238             canvas = $(canvas[0]);
239
240             var info = canvas.data("frames");
241
242             push(info.custom, custom.frame, custom.fn);
243         };
244         _self.refresh();
245         _initialized = true;
246
247     };
248
249     _self.init = function () {
250         $(document).ready(_init);
251     };
252
253 };
254
255 SimpleWebSlides.init();