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++)
53 SWS.Templates = new function () {
55 self.slideActivate = function (o) {
56 if (!(o.hasClass("sws-active-slide"))){
57 o.removeClass("sws-inactive-slide").addClass("sws-active-slide");
61 self.slideDeactivate = function (o) {
62 if (!(o.hasClass("sws-inactive-slide"))){
63 o.removeClass("sws-active-slide").addClass("sws-inactive-slide");
67 self.slideChange = function (from, to) {
68 var canvas = $(".sws-canvas");
69 self.slideDeactivate($(canvas[from]));
70 self.slideActivate($(canvas[to]));
73 self.objectActivate = function (o) {
74 if (!(o.hasClass("sws-active-object"))){
75 o.removeClass("sws-inactive-object").addClass("sws-active-object");
76 o.css({'visibility':'visible'});
82 self.objectDeactivate = function (o) {
83 if (!(o.hasClass("sws-inactive-object"))){
84 o.addClass("sws-inactive-object").removeClass("sws-active-object");
90 self.updateFooter = function (o) {
91 var footer = o.find(".sws-footer");
92 if (footer.length && (footer.children("*").length == 0)) {
93 var i = SWS.Presentation.getCurrentSlide();
94 var cur = $( "<span class='sws-current-slide-number'>"
97 var sep = $( "<span class='sws-slide-num-sep' />");
98 var tot = $( "<span class='sws-current-slide-number'>"
99 + (SWS.Presentation.getNumSlides())
101 footer.append(cur).append(sep).append(tot);
104 self.updateHeader = function (o) {};
106 SWS.ConfigBuilder = function () {
108 self['sws-object-activate'] = SWS.Templates.objectActivate;
109 self['sws-object-deactivate'] = SWS.Templates.objectDeactivate;
110 self['sws-slide-change'] = SWS.Templates.slideChange;
111 self['sws-update-footer'] = SWS.Templates.updateFooter;
112 self['sws-update-header'] = SWS.Templates.updateHeader;
115 SWS.Defaults = new SWS.ConfigBuilder ();
117 SWS.Config = new SWS.ConfigBuilder ();
120 SWS.Effects = new function () {
123 self.objectDeactivateFadeOut = function (o) {
124 o.animate({'opacity': '0'}, 150,
125 function () { SWS.Templates.objectDeactivate(o)});
128 self.objectActivateFadeIn = function (o) {
130 if (SWS.Templates.objectActivate(o)){
131 o.animate({'opacity': '1' }, 150);
136 self.slideChangeHorizontalFlip = function (from, to){
137 var f = SWS.Presentation.getSlide(from);
138 var t = SWS.Presentation.getSlide(to);
139 f.animate({ 'left': '50%', 'width': '0pt', 'opacity':'0' }, 150,
141 SWS.Templates.slideDeactivate(f);
142 f.css({'left':'0%', 'width': '100%'});
143 t.css({ 'left': '50%', 'width': '0pt','opacity':'0' });
144 SWS.Templates.slideActivate(t);
145 t.animate({'left':'0%', 'width': '100%','opacity':'1'});
148 self.slideChangeFadeOutIn = function (from, to) {
149 var f = SWS.Presentation.getSlide(from);
150 var t = SWS.Presentation.getSlide(to);
151 f.animate({ 'opacity': '0'}, 150,
152 function () { SWS.Templates.slideDeactivate(f);
153 SWS.Templates.slideActivate(t);
154 t.css('opacity', '0');
155 t.animate({ 'opacity': '1'}, 150);
158 self.slideChangeHorizontalSlide = function (from, to) {
159 var f = SWS.Presentation.getSlide(from);
160 var t = SWS.Presentation.getSlide(to);
162 t.css('left', '100%');
163 SWS.Templates.slideActivate(t);
164 f.animate({ 'left': '-100%' }, 250, function () { SWS.Templates.slideDeactivate(f); });
165 t.animate({ 'left': '0%' }, 250);
167 t.css('left', '-100%');
168 SWS.Templates.slideActivate(t);
169 f.animate({ 'left': '100%' }, 250, function () { SWS.Templates.slideDeactivate(f); });
170 t.animate({ 'left': '0%' }, 250);
175 self.slideChangeVerticalSlide = function (from, to) {
176 var f = SWS.Presentation.getSlide(from);
177 var t = SWS.Presentation.getSlide(to);
179 t.css('top', '100%');
180 SWS.Templates.slideActivate(t);
181 f.animate({ 'top': '-100%' }, 250, function () { SWS.Templates.slideDeactivate(f); });
182 t.animate({ 'top': '0%' }, 250);
184 t.css('top', '-100%');
185 SWS.Templates.slideActivate(t);
186 f.animate({ 'top': '100%' }, 250, function () { SWS.Templates.slideDeactivate(f); });
187 t.animate({ 'top': '0%' }, 250);
193 SWS.Presentation = new function () {
198 //TODO move outside of the Presentation object
202 var _initialized = false;
203 var _disable_input_events = false;
205 var _slide_callbacks = new Array ();
208 self.getNumSlides = function () { return _total_slides; };
210 self.getSlide = function(i) {
211 return $($(".sws-canvas")[i]);
214 self.registerCallback = function (i, f) {
215 if (_initialized) return;
216 //jQuery does not seem to work well
219 var slide_num = $(".sws-slide").length - 1;
221 SWS.Utils.push2(_slide_callbacks, slide_num,{ 'fn': f, 'frame': i });
225 if (typeof(Storage)!=="undefined"){
226 self.getCurrentSlide = function () {
227 //unary + casts to integer
228 var i = +(sessionStorage.current_slide);
229 if (!(i >= 0 && i < self.getNumSlides())){
236 self.setCurrentSlide = function (i) {
237 sessionStorage.current_slide = i;
241 var _current_slide = 0;
242 self.getCurrentSlide = function () { return _current_slide; };
243 self.setCurrentSlide = function (i) { _current_slide = i; };
246 self.firstSlide = function () { return 0; };
247 self.lastSlide = function () { return self.getNumSlides() - 1; };
249 self.refresh = function () {
250 /* block upcoming input event until all animations are finished */
251 _disable_input_events = true;
253 var canvas = $(".sws-canvas");
254 var from_slide_num = canvas.index($(".sws-active-slide"));
255 var to_slide_num = self.getCurrentSlide();
256 var watch_slide_anim = false;
257 var to_slide = $(canvas[to_slide_num]);
258 var slide_change = (from_slide_num != to_slide_num);
260 var info = to_slide.data("sws-frame-info");
262 //Launch a slide transition:
263 SWS.Config['sws-slide-change'](from_slide_num, to_slide_num);
264 watch_slide_anim = true;
265 SWS.Config['sws-update-header'](to_slide);
266 SWS.Config['sws-update-footer'](to_slide);
267 for (var i = 0; i < info.callbacks.at_slide.length;i++){
268 info.callbacks.at_slide[i](to_slide);
273 var cur = info.current;
274 var custom = info.custom;
275 var real_slide = to_slide.children(".sws-slide");
277 to_slide.children(".sws-slide").find("*").andSelf().each(function (i){
278 var frameset = $(this).data("sws-frame-set") || {};
280 SWS.Config['sws-object-activate']($(this));
282 SWS.Config['sws-object-deactivate']($(this));
286 if (callbacks = info.callbacks.at_frame[self.getCurrentFrame()]){
287 for (var k = 0; k < callbacks.length; k++)
288 callbacks[k]($(to_slide));
291 var to_watch = $(to_slide).find("*");
292 if (watch_slide_anim) {
293 to_watch = to_watch.add(to_slide).add($(canvas[from_slide_num]));
296 to_watch.find("*").promise().done(function() {
297 _disable_input_events = false;
301 self.nextSlide = function () {
302 self.setCurrentSlide(Math.min(self.getCurrentSlide()+1,
306 self.previousSlide = function () {
307 self.setCurrentSlide(Math.max(self.getCurrentSlide()-1,
311 self.getFrameInfo = function () {
313 var i = self.getCurrentSlide();
314 var canvas = $($(".sws-canvas")[i]);
315 var infos = canvas.data("sws-frame-info");
318 self.getCurrentFrame = function () { return self.getFrameInfo().current; };
319 self.setCurrentFrame = function (i) { self.getFrameInfo().current = i; };
320 self.firstFrame = function () { return 0; };
321 self.lastFrame = function () { return self.getFrameInfo().last; };
323 self.nextFrame = function () {
324 self.setCurrentFrame(Math.min(self.getCurrentFrame()+1,
328 self.previousFrame = function () {
329 self.setCurrentFrame(Math.max(self.getCurrentFrame()-1,
333 self.next = function () {
334 var i = self.getCurrentFrame();
335 if (i == self.lastFrame())
341 self.previous = function () {
342 var i = self.getCurrentFrame();
343 if (i == self.firstFrame()){
344 self.previousSlide();
345 self.setCurrentFrame(self.lastFrame());
348 self.previousFrame();
351 self.inputHandler = function (event) {
352 if (_disable_input_events) return;
353 switch (event.which) {
355 self.setCurrentSlide(self.firstSlide());
359 self.setCurrentSlide(self.lastSlide());
364 case 1: /* mouse button 1 */
367 case 34: /* PgDown */
371 case 8: /* backspace */
377 self.previousSlide();
387 function init_canvas(canvas, custom) {
389 var last_frame = canvas.find(".sws-pause").length;
390 //Add all regular elements to the frame list
391 var slide = $(canvas.children(".sws-slide")[0]);
393 var callbacks = { at_slide : new Array(),
394 at_frame : new Array() }
396 if (SWS.Utils.isUndefined(custom)) {
397 custom = new Array ();
400 for (var i = 0; i < custom.length; i++) {
401 if (isFinite(custom[i].frame)){
402 var num = +(custom[i].frame);
403 if (num > last_frame) last_frame = num;
404 SWS.Utils.push2(callbacks.at_frame, num, custom[i].fn);
405 } else if (custom[i].frame == "slide")
406 callbacks.at_slide.push(custom[i].fn);
408 var frame_set = SWS.Utils.parseFrameSpec(custom[i].frame);
409 for(var f in frame_set){
410 if (f > last_frame) last_frame = f;
411 SWS.Utils.push2(callbacks.at_frame, +(f), custom[i].fn);
416 var specials = slide.find('*[class*="sws-onslide-"]').find("*").andSelf();
417 specials.each(function(i) {
418 var cls = $(this).attr('class');
419 var idx = cls.indexOf("sws-onslide-");
421 var end = cls.indexOf(" ", idx);
422 end = (end == -1) ? cls.length : end;
423 var spec = cls.substring(idx+12, end);
424 var o = SWS.Utils.parseFrameSpec(spec);
426 if (f > last_frame) last_frame = f;
428 if (!SWS.Utils.isEmpty(o))
429 $(this).data("sws-frame-set", o);
433 slide.find("*").andSelf().not(specials).each(function(i) {
434 if ($(this).hasClass("sws-pause")) cur_frame++;
436 for (var j = cur_frame; j <= last_frame; j++)
438 if (!SWS.Utils.isEmpty(o))
439 $(this).data("sws-frame-set", o);
442 canvas.data("sws-frame-info", { current: 0,
451 _total_slides = $(".sws-slide").length;
453 $(document).keydown(self.inputHandler);
454 $(document).mousedown(self.inputHandler);
456 var cur = self.getCurrentSlide();
457 $(".sws-slide").each (function (i) {
458 var par = $(this).parent();
461 var canvas = $('<div class="sws-canvas"/>');
463 if (!($(this).hasClass("sws-option-noheader"))) {
464 canvas.append($('<div class="sws-header"/>'));
466 $(this).find('script[type="text/javascript"]').remove();
467 canvas.append($(this));
468 if (!($(this).hasClass("sws-option-nofooter"))) {
469 canvas.append($('<div class="sws-footer"/>'));
475 .addClass("sws-active-slide")
476 .removeClass("sws-inacitve-slide");
479 .addClass("sws-inactive-slide")
480 .removeClass("sws-active-slide");
482 init_canvas(canvas,_slide_callbacks[i]);
485 _slide_callbacks = null; /* avoid a leak */
491 self.init = function () {
492 $(document).ready(init);