9 SWS.Utils = new function () {
12 self.isUndefined = function (o) { return typeof o == "undefined"; };
13 self.push2 = function (t, i, v) {
14 if ((typeof t[i]) == 'undefined') {
21 self.isEmpty = function (o) {
22 for(var _ in o) return false;
26 self.parseFrameSpec = function (s) {
27 var elems = s.split("_");
31 for(var i = 0; i < elems.length; i++){
32 var bounds = elems[i].split("-");
33 if (bounds.length > 2 || bounds.length == 0) return {};
34 if (bounds.length == 1) bounds[1] = bounds[0];
35 var a = parseInt(bounds[0]);
36 var b = parseInt(bounds[1])
37 if (!isFinite(a) || !isFinite(b)) return {};
38 a = Math.min(a, 1000); // don't allow more than 1000 frames/slide
39 b = Math.min(b, 1000);
40 if (b > max_value) max_value = b;
41 for (var j = a; j <= b; j++)
47 self.slideActivate = function (o) {
48 if (!(o.hasClass("sws-active-slide"))){
49 o.removeClass("sws-inactive-slide").addClass("sws-active-slide");
53 self.slideDeactivate = function (o) {
54 if (!(o.hasClass("sws-inactive-slide"))){
55 o.removeClass("sws-active-slide").addClass("sws-inactive-slide");
59 self.slideChange = function (from, to) {
60 var canvas = $(".sws-canvas");
61 self.slideDeactivate($(canvas[from]));
62 self.slideActivate($(canvas[to]));
65 self.objectActivate = function (o) {
66 if (!(o.hasClass("sws-active-object"))){
67 o.removeClass("sws-inactive-object").addClass("sws-active-object");
68 o.css({'visibility':'visible'});
74 self.objectDeactivate = function (o) {
75 if (!(o.hasClass("sws-inactive-object"))){
76 o.addClass("sws-inactive-object").removeClass("sws-active-object");
77 o.css({'visibility':'hidden'});
82 self.updateFooter = function (o) {
83 var footer = o.find(".sws-footer");
84 if (footer.length && (footer.children("*").length == 0)) {
85 var i = SWS.Presentation.getCurrentSlide();
86 var cur = $( "<span class='sws-current-slide-number'>"
89 var sep = $( "<span class='sws-slide-num-sep' />");
90 var tot = $( "<span class='sws-current-slide-number'>"
91 + (SWS.Presentation.getNumSlides())
93 footer.append(cur).append(sep).append(tot);
96 self.updateHeader = function (o) {};
100 SWS.Effects = new function () {
103 self.objectDeactivateFadeOut = function (o) {
104 o.animate({'opacity': '0'}, 150,
105 function () { SWS.Utils.objectDeactivate(o)});
108 self.objectActivateFadeIn = function (o) {
110 if (SWS.Utils.objectActivate(o)){
111 o.animate({'opacity': '1' }, 150);
116 self.slideChangeHorizontalFlip = function (from, to){
117 var f = SWS.Presentation.getSlide(from);
118 var t = SWS.Presentation.getSlide(to);
119 f.animate({ 'left': '50%', 'width': '0pt', 'opacity':'0' }, 150,
121 SWS.Utils.slideDeactivate(f);
122 f.css({'left':'0%', 'width': '100%'});
123 t.css({ 'left': '50%', 'width': '0pt','opacity':'0' });
124 SWS.Utils.slideActivate(t);
125 t.animate({'left':'0%', 'width': '100%','opacity':'1'});
128 self.slideChangeFadeOutIn = function (from, to) {
129 var f = SWS.Presentation.getSlide(from);
130 var t = SWS.Presentation.getSlide(to);
131 f.animate({ 'opacity': '0'}, 150,
132 function () { SWS.Utils.slideDeactivate(f);
133 SWS.Utils.slideActivate(t);
134 t.css('opacity', '0');
135 t.animate({ 'opacity': '1'}, 150);
138 self.slideChangeHorizontalSlide = function (from, to) {
139 var f = SWS.Presentation.getSlide(from);
140 var t = SWS.Presentation.getSlide(to);
142 t.css('left', '100%');
143 SWS.Utils.slideActivate(t);
144 f.animate({ 'left': '-100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
145 t.animate({ 'left': '0%' }, 250);
147 t.css('left', '-100%');
148 SWS.Utils.slideActivate(t);
149 f.animate({ 'left': '100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
150 t.animate({ 'left': '0%' }, 250);
155 self.slideChangeVerticalSlide = function (from, to) {
156 var f = SWS.Presentation.getSlide(from);
157 var t = SWS.Presentation.getSlide(to);
159 t.css('top', '100%');
160 SWS.Utils.slideActivate(t);
161 f.animate({ 'top': '-100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
162 t.animate({ 'top': '0%' }, 250);
164 t.css('top', '-100%');
165 SWS.Utils.slideActivate(t);
166 f.animate({ 'top': '100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
167 t.animate({ 'top': '0%' }, 250);
174 SWS.Presentation = new function () {
179 //TODO move outside of the Presentation object
184 var _initialized = false;
185 var _disable_input_events = false;
187 var _slide_callbacks = new Array ();
193 self.setTemplate = function (tn, fn) {
197 self.getNumSlides = function () { return _total_slides; };
199 self.getSlide = function(i) {
200 return $($(".sws-canvas")[i]);
203 self.registerCallback = function (i, f) {
204 if (_initialized) return;
205 //jQuery does not seem to work well
208 var slide_num = $(".sws-slide").length - 1;
210 SWS.Utils.push2(_slide_callbacks, slide_num,{ 'fn': f, 'frame': i });
214 if (typeof(Storage)!=="undefined"){
215 self.getCurrentSlide = function () {
216 //unary + casts to integer
217 var i = +(sessionStorage.current_slide);
218 if (!(i >= 0 && i < self.getNumSlides())){
225 self.setCurrentSlide = function (i) {
226 sessionStorage.current_slide = i;
230 var _current_slide = 0;
231 self.getCurrentSlide = function () { return _current_slide; };
232 self.setCurrentSlide = function (i) { _current_slide = i; };
235 self.firstSlide = function () { return 0; };
236 self.lastSlide = function () { return self.getNumSlides() - 1; };
238 self.refresh = function () {
239 /* block upcoming input event until all animations are finished */
240 _disable_input_events = true;
242 var canvas = $(".sws-canvas");
243 var from_slide_num = canvas.index($(".sws-active-slide"));
244 var to_slide_num = self.getCurrentSlide();
245 var watch_slide_anim = false;
246 var to_slide = $(canvas[to_slide_num]);
247 var slide_change = (from_slide_num != to_slide_num);
249 var info = to_slide.data("sws-frame-info");
251 //Launch a slide transition:
252 templates['sws-slide-change'](from_slide_num, to_slide_num);
253 watch_slide_anim = true;
254 templates['sws-update-header'](to_slide);
255 templates['sws-update-footer'](to_slide);
256 for (var i = 0; i < info.callbacks.at_slide.length;i++){
257 info.callbacks.at_slide[i](to_slide);
262 var cur = info.current;
263 var custom = info.custom;
264 var real_slide = to_slide.children(".sws-slide");
266 to_slide.children(".sws-slide").find("*").andSelf().each(function (i){
267 var frameset = $(this).data("sws-frame-set") || {};
269 templates['sws-object-activate']($(this));
271 templates['sws-object-deactivate']($(this));
275 if (callbacks = info.callbacks.at_frame[self.getCurrentFrame()]){
276 for (var k = 0; k < callbacks.length; k++)
277 callbacks[k]($(to_slide));
280 var to_watch = $(to_slide).find("*");
281 if (watch_slide_anim) {
282 to_watch = to_watch.add(to_slide).add($(canvas[from_slide_num]));
285 to_watch.find("*").promise().done(function() {
286 _disable_input_events = false;
290 self.nextSlide = function () {
291 self.setCurrentSlide(Math.min(self.getCurrentSlide()+1,
295 self.previousSlide = function () {
296 self.setCurrentSlide(Math.max(self.getCurrentSlide()-1,
300 self.getFrameInfo = function () {
302 var i = self.getCurrentSlide();
303 var canvas = $($(".sws-canvas")[i]);
304 var infos = canvas.data("sws-frame-info");
307 self.getCurrentFrame = function () { return self.getFrameInfo().current; };
308 self.setCurrentFrame = function (i) { self.getFrameInfo().current = i; };
309 self.firstFrame = function () { return 0; };
310 self.lastFrame = function () { return self.getFrameInfo().last; };
312 self.nextFrame = function () {
313 self.setCurrentFrame(Math.min(self.getCurrentFrame()+1,
317 self.previousFrame = function () {
318 self.setCurrentFrame(Math.max(self.getCurrentFrame()-1,
322 self.next = function () {
323 var i = self.getCurrentFrame();
324 if (i == self.lastFrame())
330 self.previous = function () {
331 var i = self.getCurrentFrame();
332 if (i == self.firstFrame())
333 self.previousSlide();
335 self.previousFrame();
338 self.inputHandler = function (event) {
339 if (_disable_input_events) return;
340 switch (event.which) {
342 self.setCurrentSlide(self.firstSlide());
346 self.setCurrentSlide(self.lastSlide());
351 case 1: /* mouse button 1 */
354 case 34: /* PgDown */
358 case 8: /* backspace */
364 self.previousSlide();
374 function init_canvas(canvas, custom) {
376 var last_frame = canvas.find(".sws-pause").length;
377 //Add all regular elements to the frame list
378 var slide = $(canvas.children(".sws-slide")[0]);
380 var callbacks = { at_slide : new Array(),
381 at_frame : new Array() }
383 if (SWS.Utils.isUndefined(custom)) {
384 custom = new Array ();
387 for (var i = 0; i < custom.length; i++) {
388 if (isFinite(custom[i].frame)){
389 var num = +(custom[i].frame);
390 if (num > last_frame) last_frame = num;
391 SWS.Utils.push2(callbacks.at_frame, num, custom[i].fn);
392 } else if (custom[i].frame == "slide")
393 callbacks.at_slide.push(custom[i].fn);
395 var frame_set = SWS.Utils.parseFrameSpec(custom[i].frame);
396 for(var f in frame_set){
397 if (f > last_frame) last_frame = f;
398 SWS.Utils.push2(callbacks.at_frame, +(f), custom[i].fn);
403 var specials = slide.find('*[class*="sws-onslide-"]').find("*").andSelf();
404 specials.each(function(i) {
405 var cls = $(this).attr('class');
406 var idx = cls.indexOf("sws-onslide-");
408 var end = cls.indexOf(" ", idx);
409 end = (end == -1) ? cls.length : end;
410 var spec = cls.substring(idx+12, end);
411 var o = SWS.Utils.parseFrameSpec(spec);
413 if (f > last_frame) last_frame = f;
415 if (!SWS.Utils.isEmpty(o))
416 $(this).data("sws-frame-set", o);
420 slide.find("*").andSelf().not(specials).each(function(i) {
421 if ($(this).hasClass("sws-pause")) cur_frame++;
423 for (var j = cur_frame; j <= last_frame; j++)
425 if (!SWS.Utils.isEmpty(o))
426 $(this).data("sws-frame-set", o);
429 canvas.data("sws-frame-info", { current: 0,
438 _total_slides = $(".sws-slide").length;
440 $(document).keydown(self.inputHandler);
441 $(document).mousedown(self.inputHandler);
443 var cur = self.getCurrentSlide();
444 $(".sws-slide").each (function (i) {
445 var par = $(this).parent();
448 var canvas = $('<div class="sws-canvas"/>');
450 if (!($(this).hasClass("sws-option-noheader"))) {
451 canvas.append($('<div class="sws-header"/>'));
453 $(this).find('script[type="text/javascript"]').remove();
454 canvas.append($(this));
455 if (!($(this).hasClass("sws-option-nofooter"))) {
456 canvas.append($('<div class="sws-footer"/>'));
462 .addClass("sws-active-slide")
463 .removeClass("sws-inacitve-slide");
466 .addClass("sws-inactive-slide")
467 .removeClass("sws-active-slide");
469 init_canvas(canvas,_slide_callbacks[i]);
472 _slide_callbacks = null; /* avoid a leak */
478 self.init = function () {
479 $(document).ready(init);
484 self.setTemplate('sws-object-activate', SWS.Utils.objectActivate);
485 self.setTemplate('sws-object-deactivate', SWS.Utils.objectDeactivate);
486 self.setTemplate('sws-slide-change', SWS.Utils.slideChange);
487 self.setTemplate('sws-update-footer', SWS.Utils.updateFooter);
488 self.setTemplate('sws-update-header', SWS.Utils.updateHeader);