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