X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=simpleWebSlides.js;h=f42811d77540180d441fbeff9a4083ece988502c;hb=1a01baf63e59f5359c4af5cf2159b1e30f47ee74;hp=71f8e642b2b78481ec6b770302456ac631520ac0;hpb=b1f6566ac20a78b0de684e0dc2ff296fed24a195;p=hacks%2FsimpleWebSlides.git diff --git a/simpleWebSlides.js b/simpleWebSlides.js index 71f8e64..f42811d 100644 --- a/simpleWebSlides.js +++ b/simpleWebSlides.js @@ -1,104 +1,887 @@ -var SimpleWebSlides = new function () { - var _self = this; +/* + Namespace object. +*/ + +var SWS = SWS || {}; + + + +SWS.Utils = new function () { + var self = this; + + self.isUndefined = function (o) { return typeof o == "undefined"; }; + self.push2 = function (t, i, v) { + if ((typeof t[i]) == 'undefined') { + t[i] = new Array(); + }; + var l = t[i].length; + t[i][l] = v; + }; + + self.isEmpty = function (o) { + for(var _ in o) return false; + return true; + }; + + self.parseFrameSpec = function (s) { + var elems = s.split("_"); + var result = {}; + var min_last = 10000; + var max_value = -1; + for(var i = 0; i < elems.length; i++){ + var bounds = elems[i].split("-"); + if (bounds.length > 2 || bounds.length == 0) return {}; + if (bounds.length == 1) bounds[1] = bounds[0]; + var a = parseInt(bounds[0]); + var b = parseInt(bounds[1]) + if (!isFinite(a) || !isFinite(b)) return {}; + a = Math.min(a, 1000); // don't allow more than 1000 frames/slide + b = Math.min(b, 1000); + if (b > max_value) max_value = b; + for (var j = a; j <= b; j++) + result[j] = true; + }; + return result; + }; + + self.getParameterByName = function (name) { + name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); + var regex = new RegExp("[\\?&]" + name + "=([^]*)"), + results = regex.exec(location.search); + return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " ")); + } +}; + + + + +SWS.Templates = new function () { + var self = this; + self.controlPanel = "
"; + self.slideActivate = function (o) { + if (!(o.hasClass("sws-active-slide"))){ + o.removeClass("sws-inactive-slide").addClass("sws-active-slide"); + }; + }; + + self.slideDeactivate = function (o) { + if (!(o.hasClass("sws-inactive-slide"))){ + o.removeClass("sws-active-slide").addClass("sws-inactive-slide"); + }; + }; + + self.slideChange = function (from, to) { + var canvas = $(".sws-canvas"); + self.slideDeactivate($(canvas[from])); + self.slideActivate($(canvas[to])); + }; + + self.objectActivate = function (o) { + if (!(o.hasClass("sws-active-object"))){ + o.removeClass("sws-inactive-object").addClass("sws-active-object"); + return true; + }; + return false; + }; + + self.objectDeactivate = function (o) { + if (!(o.hasClass("sws-inactive-object"))){ + o.addClass("sws-inactive-object").removeClass("sws-active-object"); + return true; + }; + return false; + }; + + self.updateFooter = function (o) { + var footer = o.find(".sws-footer"); + if (footer.length && (footer.children("*").length == 0)) { + var i = SWS.Presentation.getCurrentSlide(); + var cur = $( " "); + var sep = $( ""); + var tot = $( " "); + footer.append(cur).append(sep).append(tot); + }; + }; + self.updateHeader = function (o) {}; +}; +SWS.ConfigBuilder = function () { + var self = this; + self['sws-object-activate'] = SWS.Templates.objectActivate; + self['sws-object-deactivate'] = SWS.Templates.objectDeactivate; + self['sws-slide-change'] = SWS.Templates.slideChange; + self['sws-update-footer'] = SWS.Templates.updateFooter; + self['sws-update-header'] = SWS.Templates.updateHeader; +}; + +SWS.Defaults = new SWS.ConfigBuilder (); + +SWS.Config = new SWS.ConfigBuilder (); + + +SWS.Effects = new function () { + var self = this; + + self.objectDeactivateFadeOut = function (o) { + o.animate({'opacity': '0'}, 200, + function () { + + SWS.Templates.objectDeactivate(o); + }); + }; + + self.objectActivateFadeIn = function (o) { + + if (SWS.Templates.objectActivate(o)){ + o.animate({'opacity': '1' }, 200); + }; + + }; + + self.slideChangeHorizontalFlip = function (from, to){ + var f = SWS.Presentation.getSlide(from); + var t = SWS.Presentation.getSlide(to); + f.animate({ 'left': '50%', 'width': '0pt', 'opacity':'0' }, 150, + function () { + SWS.Templates.slideDeactivate(f); + f.css({'left':'0%', 'width': '100%'}); + t.css({ 'left': '50%', 'width': '0pt','opacity':'0' }); + SWS.Templates.slideActivate(t); + t.animate({'left':'0%', 'width': '100%','opacity':'1'}); + }); + }; + self.slideChangeFadeOutIn = function (from, to) { + var f = SWS.Presentation.getSlide(from); + var t = SWS.Presentation.getSlide(to); + f.animate({ 'opacity': '0'}, 150, + function () { SWS.Templates.slideDeactivate(f); + SWS.Templates.slideActivate(t); + t.css('opacity', '0'); + t.animate({ 'opacity': '1'}, 150); + }); + }; + self.slideChangeHorizontalSlide = function (from, to) { + var f = SWS.Presentation.getSlide(from); + var t = SWS.Presentation.getSlide(to); + if (from < to) { + t.css('left', '100%'); + t.css('opacity', '1'); + SWS.Templates.slideActivate(t); + f.animate({ 'left': '-100%' }, 250, function () { SWS.Templates.slideDeactivate(f); + f.css('opacity', '0'); + t.animate({ 'left': '0%' }, 250); + }); + } else { + t.css('left', '-100%'); + SWS.Templates.slideActivate(t); + f.animate({ 'left': '100%' }, 250, function () { SWS.Templates.slideDeactivate(f); + f.css('opacity', '0'); + }); + t.css('opacity', '1'); + t.animate({ 'left': '0%' }, 250); + }; + }; + + + self.slideChangeVerticalSlide = function (from, to) { + var f = SWS.Presentation.getSlide(from); + var t = SWS.Presentation.getSlide(to); + if (from < to) { + t.css('top', '100%'); + SWS.Templates.slideActivate(t); + f.animate({ 'top': '-100%' }, 250, function () { SWS.Templates.slideDeactivate(f); }); + t.animate({ 'top': '0%' }, 250); + } else { + t.css('top', '-100%'); + SWS.Templates.slideActivate(t); + f.animate({ 'top': '100%' }, 250, function () { SWS.Templates.slideDeactivate(f); }); + t.animate({ 'top': '0%' }, 250); + }; + }; + +}; + +SWS.Fullscreen = new function () { + var self = this; + + if (SWS.Utils.isUndefined(document.fullScreen)) { + if (SWS.Utils.isUndefined(document.mozfullScreen)) { + self.status = function () { return document.webkitIsFullScreen; }; + self.enter = function(e) { + e.webkitRequestFullScreen(); + }; + self.exit = function () { + document.webkitCancelFullScreen(); + }; + + } else { + self.status = function () { return document.mozfullScreen; }; + self.enter = function(e) { + e.mozRequestFullScreen(); + }; + self.exit = function () { + document.mozCancelFullScreen(); + }; + + }; + } else { + self.status = function () { return document.fullScreen; }; + self.enter = function(e) { + e.requestFullScreen(); + }; + self.exit = function () { + document.cancelFullScreen(); + }; + + }; + + +}; + +SWS.Presentation = new function () { + + + var self = this; + + //TODO move outside of the Presentation object + + var _total_slides; - _self.getNumSlides = function () { return _total_slides; }; + var _initialized = false; + var _disable_input_events = false; + var _print_mode = false; + var _slide_callbacks = new Array (); + var _total_steps = -1; + var _current_theme = ""; + + self.getNumSlides = function () { return _total_slides; }; + + self.getSlide = function(i) { + return $($(".sws-canvas")[i]); + }; + + self.registerCallback = function (i, f) { + if (_initialized) return; + //jQuery does not seem to work well + //on a partial DOM + var slides = $(".sws-slide"); + var h1s = $("body").children("h1"); + var slide_num = slides.add(h1s).length - 1; + + SWS.Utils.push2(_slide_callbacks, slide_num,{ 'fn': f, 'frame': i }); + + }; if (typeof(Storage)!=="undefined"){ - _self.getCurrentSlide = function () { + self.getCurrentSlide = function () { //unary + casts to integer - var i = +(sessionStorage.current_slide); - if (!(i >= 0 && i < _self.getNumSlides())){ + var i = +(sessionStorage.getItem("current_slide")); + if (!(i >= 0 && i < self.getNumSlides())){ return 0; } else { return i; }; }; - _self.setCurrentSlide = function (i) { - sessionStorage.current_slide = i; + self.setCurrentSlide = function (i) { + sessionStorage.setItem("current_slide", i); }; } else { var _current_slide = 0; - _self.getCurrentSlide = function () { return current_slide; }; - _self.setCurrentSlide = function (i) { _current_slide = i; }; + self.getCurrentSlide = function () { return _current_slide; }; + self.setCurrentSlide = function (i) { _current_slide = i; }; }; - _self.firstSlide = function () { return 0; }; - _self.lastSlide = function () { return _self.getNumSlides() - 1; }; - _self.refresh = function () { - var cur = _self.getCurrentSlide(); - $(".slide").each (function (i) { - if (i == cur){ - $(this).removeClass("other_slides").addClass("current_slide"); - } else if ($(this).hasClass("current_slide")) { - $(this).removeClass("current_slide").addClass("other_slides"); + self.firstSlide = function () { return 0; }; + self.lastSlide = function () { return self.getNumSlides() - 1; }; + self.refresh = function () { + /* block upcoming input event until all animations are finished */ + _disable_input_events = true; + + var canvas = $(".sws-canvas"); + var from_slide_num = canvas.index($(".sws-active-slide")); + var to_slide_num = self.getCurrentSlide(); + var watch_slide_anim = false; + var to_slide = $(canvas[to_slide_num]); + var from_slide = $(canvas[from_slide_num]); + var slide_change = (from_slide_num != to_slide_num); + + + var info = to_slide.data("sws-frame-info"); + SWS.Config['sws-update-header'](to_slide); + SWS.Config['sws-update-footer'](to_slide); + + if (slide_change) { + //Launch a slide transition: + SWS.Config['sws-slide-change'](from_slide_num, to_slide_num); + watch_slide_anim = true; + for (var i = 0; i < info.callbacks.at_slide.length;i++){ + info.callbacks.at_slide[i](to_slide); }; + }; + + + var cur = info.current; + var custom = info.custom; + var real_slide = to_slide.find(".sws-slide"); + + real_slide.find("*").andSelf().each(function (i){ + var frameset = $(this).data("sws-frame-set") || {}; + if (frameset[cur]) + SWS.Config['sws-object-activate']($(this)); + else + SWS.Config['sws-object-deactivate']($(this)); + }); + var callbacks; + if (callbacks = info.callbacks.at_frame[self.getCurrentFrame()]){ + for (var k = 0; k < callbacks.length; k++) + callbacks[k]($(to_slide)); + }; + + var all = $(from_slide).add(to_slide); + all.find("*").addBack().promise().done(function() { + _disable_input_events = false; + }); + }; + + self.nextSlide = function () { + self.setCurrentSlide(Math.min(self.getCurrentSlide()+1, + self.lastSlide())); + self.setCurrentFrame(self.firstFrame()); + }; + + self.previousSlide = function () { + self.setCurrentSlide(Math.max(self.getCurrentSlide()-1, + self.firstSlide())); + self.setCurrentFrame(self.firstFrame()); + }; + + self.getFrameInfo = function () { + + var i = self.getCurrentSlide(); + var canvas = $($(".sws-canvas")[i]); + var infos = canvas.data("sws-frame-info"); + return infos; + }; + + self.getTotalSteps = function () { + if (_total_steps >= 0) return _total_steps; + _total_steps = 0; + $(".sws-canvas").each(function(i) { + var canvas = $($(".sws-canvas")[i]); + var infos = canvas.data("sws-frame-info"); + _total_steps += infos.last + 1; }); + return _total_steps; + }; + + self.getCurrentFrame = function () { return self.getFrameInfo().current; }; + self.setCurrentFrame = function (i) { self.getFrameInfo().current = i; }; + self.firstFrame = function () { return 0; }; + self.lastFrame = function () { return self.getFrameInfo().last; }; + + self.nextFrame = function () { + self.setCurrentFrame(Math.min(self.getCurrentFrame()+1, + self.lastFrame())); + + }; + self.previousFrame = function () { + self.setCurrentFrame(Math.max(self.getCurrentFrame()-1, + self.firstFrame())); + }; + + self.next = function () { + var i = self.getCurrentFrame(); + if (i == self.lastFrame()) { + self.nextSlide(); + self.setCurrentFrame(self.firstFrame()); + } else + self.nextFrame(); + }; + self.previous = function () { + var i = self.getCurrentFrame(); + if (i == self.firstFrame()){ + self.previousSlide(); + self.setCurrentFrame(self.lastFrame()); + } + else + self.previousFrame(); }; - _self.nextSlide = function () { - _self.setCurrentSlide(Math.min(_self.getCurrentSlide()+1, - _self.lastSlide())); + self.goToSlide = function (s, f) { + if (SWS.Utils.isUndefined(f)) + f = 0; + if (!(s >= self.firstSlide() && s <= self.lastSlide())) return; + self.setCurrentSlide(s); + if (!(f >= self.firstFrame() && f <= self.lastFrame())) f = 0; + self.setCurrentFrame(f); + self.refresh(); }; - _self.previousSlide = function () { - _self.setCurrentSlide(Math.max(_self.getCurrentSlide()-1, - _self.firstSlide())); + self.cycleStyle = function() { + var styles = $("head").children('link[rel$="stylesheet"][title]'); + var j = styles.index(styles.filter(':not(:disabled)')); + styles[j].disabled = true; + if (++j == styles.length) j = 0; + styles[j].disabled = false; + }; + + + self.printMode = function () { + _print_mode = true; + var progress = $("