Working "pause" command.
[hacks/simpleWebSlides.git] / simpleWebSlides.js
1 var SimpleWebSlides = new function () {
2     var _self = this;
3     var _total_slides;
4
5
6     function push(t, i, v) {
7         if ((typeof t[i]) == 'undefined') {
8             t[i] = new Array();
9         };
10         var l = t[i].length;
11         if (l == 0 || !($.contains(t[i][l-1].get()[0], v.get()[0]))) {
12             t[i][l] = v;
13         };
14     };
15
16     function init_canvas(canvas) {
17         var frames = new Array ();
18         var cur_frame = 0;
19         canvas.find("*").each(function(i) {
20             if ($(this).hasClass("pause"))  cur_frame++;
21             push(frames, cur_frame, $(this));
22
23         });
24         canvas.data("frames", { frames: frames, current: 0 });
25
26     };
27
28
29     _self.getNumSlides = function () { return _total_slides; };
30
31     if (typeof(Storage)!=="undefined"){
32         _self.getCurrentSlide = function () {
33             //unary + casts to integer
34             var i = +(sessionStorage.current_slide);
35             if (!(i >= 0 && i < _self.getNumSlides())){
36                 return 0;
37             } else {
38                 return i;
39             };
40         };
41
42         _self.setCurrentSlide = function (i) {
43             sessionStorage.current_slide = i;
44         };
45
46     } else {
47         var _current_slide = 0;
48         _self.getCurrentSlide = function () { return current_slide; };
49         _self.setCurrentSlide = function (i) { _current_slide = i; };
50
51     };
52     _self.firstSlide = function () { return 0; };
53     _self.lastSlide = function () { return _self.getNumSlides() - 1; };
54     _self.refresh = function () {
55         var cur = _self.getCurrentSlide();
56         $(".canvas").each (function (i) {
57             if (i == cur){
58                 $(this).removeClass("other_slides").addClass("current_slide");
59                 var info = $(this).data("frames");
60                 console.log(info);
61                 var frames = info.frames;
62                 var upto = info.current;
63                 for(var j = 0; j < frames.length; j++) {
64                     for (var k = 0; k < frames[j].length; k++) {
65                         if (j <= upto)
66                             frames[j][k].css('visibility','visible');
67                         else
68                             frames[j][k].css('visibility','hidden');
69                     };
70                 };
71
72             } else if ($(this).hasClass("current_slide")) {
73                 $(this).removeClass("current_slide").addClass("other_slides");
74             };
75         });
76
77     };
78
79     _self.nextSlide = function () {
80         _self.setCurrentSlide(Math.min(_self.getCurrentSlide()+1,
81                                        _self.lastSlide()));
82     };
83
84     _self.previousSlide = function () {
85         _self.setCurrentSlide(Math.max(_self.getCurrentSlide()-1,
86                                       _self.firstSlide()));
87     };
88
89     _self.getFrameInfo = function () {
90
91         var i = _self.getCurrentSlide();
92         var canvas = $($(".canvas")[i]);
93         var infos = canvas.data("frames");
94         return infos;
95     };
96     _self.getCurrentFrame = function () { return _self.getFrameInfo().current; };
97     _self.setCurrentFrame = function (i) { _self.getFrameInfo().current = i; };
98     _self.firstFrame = function () { return 0; };
99     _self.lastFrame = function () { return _self.getFrameInfo().frames.length-1; };
100
101     _self.nextFrame = function () {
102         _self.setCurrentFrame(Math.min(_self.getCurrentFrame()+1,
103                                        _self.lastFrame()));
104
105     };
106     _self.previousFrame = function () {
107         _self.setCurrentFrame(Math.max(_self.getCurrentFrame()-1,
108                                        _self.firstFrame()));
109     };
110
111     _self.next = function () {
112         var i = _self.getCurrentFrame();
113         if (i == _self.lastFrame())
114             _self.nextSlide();
115         else
116             _self.nextFrame();
117     };
118
119     _self.previous = function () {
120         var i = _self.getCurrentFrame();
121         if (i == _self.firstFrame())
122             _self.previousSlide();
123         else
124             _self.previousFrame();
125     };
126
127
128     _self.keyboardHandler = function (event) {
129
130         switch (event.which) {
131         case 36:/* Home */
132             _self.firstSlide();
133             break;
134
135         case 35:/* End */
136             _self.lastSlide();
137             break;
138
139         case 32: /* space */
140         case 39: /* -> */
141             _self.next();
142             break;
143         case 34: /* PgDown */
144         case 78: /* n */
145             _self.nextSlide();
146             break;
147         case 8: /* backspace */
148         case 37: /* <-   */
149             _self.previous();
150             break;
151         case 33: /* PgUp */
152         case 80: /* p */
153             _self.previousSlide();
154             break;
155         default:
156             return;
157         };
158         _self.refresh();
159     };
160
161     _self.init = function () {
162         _total_slides = $(".slide").length;
163
164         $(document).keydown(_self.keyboardHandler);
165
166         var cur = _self.getCurrentSlide();
167         $(".slide").each (function (i) {
168             var elem = '<div class="footer"><span class="current_slide_num">' + (i+1);
169             elem += '</span><span class="slide_num_sep"/><span class="total_slide_num">';
170             elem += _self.getNumSlides() + '</span></div>';
171             if (!($(this).hasClass("nofooter"))) {
172                 $(this).append($(elem));
173             };
174             var par = $(this).parent();
175             $(this).remove();
176             var canvas = $('<div class="canvas"/>');
177             canvas.append($(this));
178             par.append(canvas);
179             if (i == cur) {
180                 canvas.addClass("current_slide").removeClass("other_slides");
181             } else {
182                 canvas.addClass("other_slides").removeClass("current_slide");
183             };
184             init_canvas(canvas);
185
186         });
187         _self.refresh()
188     };
189
190 };
191
192
193 $(document).ready(SimpleWebSlides.init);