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') {
22 self.slideActivate = function (o) {
23 if (!(o.hasClass("sws-active-slide"))){
24 o.removeClass("sws-inactive-slide").addClass("sws-active-slide");
28 self.slideDeactivate = function (o) {
29 if (!(o.hasClass("sws-inactive-slide"))){
30 o.removeClass("sws-active-slide").addClass("sws-inactive-slide");
34 self.slideChange = function (from, to) {
35 var canvas = $(".sws-canvas");
36 self.slideDeactivate($(canvas[from]));
37 self.slideActivate($(canvas[to]));
40 self.objectActivate = function (o) {
41 if (!(o.hasClass("sws-active-object"))){
42 o.removeClass("sws-inactive-object").addClass("sws-active-object");
43 o.css({'visibility':'visible'});
47 self.objectDeactivate = function (o) {
48 o.css({'visibility':'hidden', 'display':''});
49 if (!(o.hasClass("sws-inactive-object"))){
50 o.addClass("sws-inactive-object").removeClass("sws-active-object");
53 self.updateFooter = function (o) {
54 var footer = o.find(".sws-footer");
55 if (footer.length && (footer.children("*").length == 0)) {
56 var i = SWS.Presentation.getCurrentSlide();
57 var cur = $( "<span class='sws-current-slide-number'>"
60 var sep = $( "<span class='sws-slide-num-sep' />");
61 var tot = $( "<span class='sws-current-slide-number'>"
62 + (SWS.Presentation.getNumSlides())
64 footer.append(cur).append(sep).append(tot);
67 self.updateHeader = function (o) {};
71 SWS.Effects = new function () {
73 self.objectDeactivateFadeOut = function (o) {
74 o.fadeOut(150, function () { SWS.Utils.objectDeactivate(o)});
77 self.objectActivateFadeIn = function (o) {
78 SWS.Utils.objectActivate(o);
82 self.slideChangeHorizontalSlide = function (from, to) {
83 var f = SWS.Presentation.getSlide(from);
84 var t = SWS.Presentation.getSlide(to);
86 t.css('left', '100%');
87 SWS.Utils.slideActivate(t);
88 f.animate({ 'left': '-100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
89 t.animate({ 'left': '0%' }, 250);
91 t.css('left', '-100%');
92 SWS.Utils.slideActivate(t);
93 f.animate({ 'left': '100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
94 t.animate({ 'left': '0%' }, 250);
99 self.slideChangeVerticalSlide = function (from, to) {
100 var f = SWS.Presentation.getSlide(from);
101 var t = SWS.Presentation.getSlide(to);
103 t.css('top', '100%');
104 SWS.Utils.slideActivate(t);
105 f.animate({ 'top': '-100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
106 t.animate({ 'top': '0%' }, 250);
108 t.css('top', '-100%');
109 SWS.Utils.slideActivate(t);
110 f.animate({ 'top': '100%' }, 250, function () { SWS.Utils.slideDeactivate(f); });
111 t.animate({ 'top': '0%' }, 250);
118 Representation of intervals of positive integers.
120 SWS.Interval = new function (init) {
123 self.data = new Array();
124 self.parseString(s) {
125 var elems = s.split("_");
126 for(var i = 0; i < elems.length; i++){
127 var bounds = elems[i].split("-");
128 if (bounds.length > 2) continue;
129 if (SWS.isUndefined(bounds[1])) bounds[1] = bounds[0];
130 if (!(isFinite(bounds[0]) && isFinite(bounds[1]))) continue;
132 self.add(+(bounds[0]), +(bounds[1]));
137 if (SWS.isUndefined(y) && isFinite(x)) self.add(x,x);
150 SWS.Presentation = new function () {
160 var _initialized = false;
161 var _animations_running = false;
163 var _slide_callbacks = new Array ();
169 self.setTemplate = function (tn, fn) {
173 self.getNumSlides = function () { return _total_slides; };
175 self.getSlide = function(i) {
176 return $($(".sws-canvas")[i]);
179 self.registerCallback = function (i, f) {
180 if (_initialized) return;
181 //jQuery does not seem to work well
184 var slide_num = $(".sws-slide").length - 1;
186 SWS.Utils.push2(_slide_callbacks, slide_num,{ 'fn': f, 'frame': i });
190 if (typeof(Storage)!=="undefined"){
191 self.getCurrentSlide = function () {
192 //unary + casts to integer
193 var i = +(sessionStorage.current_slide);
194 if (!(i >= 0 && i < self.getNumSlides())){
201 self.setCurrentSlide = function (i) {
202 sessionStorage.current_slide = i;
206 var _current_slide = 0;
207 self.getCurrentSlide = function () { return _current_slide; };
208 self.setCurrentSlide = function (i) { _current_slide = i; };
211 self.firstSlide = function () { return 0; };
212 self.lastSlide = function () { return self.getNumSlides() - 1; };
214 self.refresh = function () {
215 /* block upcoming input event until all animation are finished */
216 _animations_running = true;
218 var canvas = $(".sws-canvas");
219 var from_slide_num = canvas.index($(".sws-active-slide"));
220 var to_slide_num = self.getCurrentSlide();
221 var watch_slide_anim = false;
222 var to_slide = $(canvas[to_slide_num]);
223 var slide_change = !_initialized || (from_slide_num != to_slide_num);
225 var info = to_slide.data("sws-frame-info");
227 //Launch a slide transition:
228 templates['sws-slide-change'](from_slide_num, to_slide_num);
229 watch_slide_anim = true;
230 templates['sws-update-header'](to_slide);
231 templates['sws-update-footer'](to_slide);
232 for (var i = 0; i < info.callbacks.at_slide.length;i++){
233 info.callbacks.at_slide[i](to_slide);
238 var cur = info.current;
239 var custom = info.custom;
240 var real_slide = to_slide.children(".sws-slide");
241 real_slide.find("*").add(real_slide).each (function (i) {
242 var fcur = "f" + cur;
243 var frameset = $(this).data("sws-frame-set") || {};
245 templates['sws-object-activate']($(this));
247 templates['sws-object-deactivate']($(this));
251 if (callbacks = info.callbacks.at_frame[self.getCurrentFrame()]){
252 for (var k = 0; k < callbacks.length; k++)
253 callbacks[k]($(to_slide));
256 var to_watch = $(to_slide).find("*");
257 if (watch_slide_anim) {
258 to_watch = to_watch.add(to_slide).add($(canvas[from_slide_num]));
261 to_watch.find("*").promise().done(function() {
262 _animations_running = false;
266 self.nextSlide = function () {
267 self.setCurrentSlide(Math.min(self.getCurrentSlide()+1,
271 self.previousSlide = function () {
272 self.setCurrentSlide(Math.max(self.getCurrentSlide()-1,
276 self.getFrameInfo = function () {
278 var i = self.getCurrentSlide();
279 var canvas = $($(".sws-canvas")[i]);
280 var infos = canvas.data("sws-frame-info");
283 self.getCurrentFrame = function () { return self.getFrameInfo().current; };
284 self.setCurrentFrame = function (i) { self.getFrameInfo().current = i; };
285 self.firstFrame = function () { return 0; };
286 self.lastFrame = function () { return self.getFrameInfo().last; };
288 self.nextFrame = function () {
289 self.setCurrentFrame(Math.min(self.getCurrentFrame()+1,
293 self.previousFrame = function () {
294 self.setCurrentFrame(Math.max(self.getCurrentFrame()-1,
298 self.next = function () {
299 var i = self.getCurrentFrame();
300 if (i == self.lastFrame())
306 self.previous = function () {
307 var i = self.getCurrentFrame();
308 if (i == self.firstFrame())
309 self.previousSlide();
311 self.previousFrame();
314 self.inputHandler = function (event) {
315 if (_animations_running) return;
316 switch (event.which) {
327 case 1: /* mouse button 1 */
330 case 34: /* PgDown */
334 case 8: /* backspace */
340 self.previousSlide();
350 function init_canvas(canvas, custom) {
352 var last_frame = canvas.find(".sws-pause").length;
353 //Add all regular elements to the frame list
354 var slide = $(canvas.children(".sws-slide")[0]);
356 var callbacks = { at_slide : new Array(),
357 at_frame : new Array() }
359 if (SWS.Utils.isUndefined(custom)) {
360 custom = new Array ();
362 for (var i = 0; i < custom.length; i++) {
363 if (isFinite(custom[i].frame))
364 SWS.Utils.push2(callbacks.at_frame, +(custom[i].frame), custom[i].fn);
365 else if (custom[i].frame == "slide")
366 callbacks.at_slide.push(custom[i].fn);
369 slide.find("*").add(slide).each(function(i) {
370 if ($(this).filter('*[class*="sws-onslide-"]').length) {
372 if ($(this).hasClass("sws-pause")) cur_frame++;
374 for (var j = cur_frame; j <= last_frame; j++)
376 $(this).data("sws-frame-set", o);
380 canvas.data("sws-frame-info", { current: 0,
389 _total_slides = $(".sws-slide").length;
391 $(document).keydown(self.inputHandler);
392 $(document).mousedown(self.inputHandler);
394 var cur = self.getCurrentSlide();
395 $(".sws-slide").each (function (i) {
396 var par = $(this).parent();
399 var canvas = $('<div class="sws-canvas"/>');
401 if (!($(this).hasClass("sws-option-noheader"))) {
402 canvas.append($('<div class="sws-header"/>'));
404 $(this).find('script[type="text/javascript"]').remove();
405 canvas.append($(this));
406 if (!($(this).hasClass("sws-option-nofooter"))) {
407 canvas.append($('<div class="sws-footer"/>'));
413 .addClass("sws-active-slide")
414 .removeClass("sws-inacitve-slide");
417 .addClass("sws-inactive-slide")
418 .removeClass("sws-active-slide");
420 init_canvas(canvas,_slide_callbacks[i]);
423 _slide_callbacks = null; /* avoid a leak */
429 self.init = function () {
430 $(document).ready(init);
435 self.setTemplate('sws-object-activate', SWS.Utils.objectActivate);
436 self.setTemplate('sws-object-deactivate', SWS.Utils.objectDeactivate);
437 self.setTemplate('sws-slide-change', SWS.Utils.slideChange);
438 self.setTemplate('sws-update-footer', SWS.Utils.updateFooter);
439 self.setTemplate('sws-update-header', SWS.Utils.updateHeader);