Working inline script.
[hacks/simpleWebSlides.git] / simpleWebSlides.js
index 71f8e64..134369c 100644 (file)
@@ -1,8 +1,65 @@
 var SimpleWebSlides = new function () {
     var _self = this;
     var _total_slides;
+    var _defered_custom = new Array();
+    var _initialized = false;
+
+    function push_following(t, i, v) {
+        if ((typeof t[i]) == 'undefined') {
+            t[i] = new Array();
+        };
+        var l = t[i].length;
+        if (l == 0 || !($.contains(t[i][l-1].get()[0], v.get()[0]))) {
+            t[i][l] = v;
+        };
+    };
+
+    function push(t, i, v) {
+        if ((typeof t[i]) == 'undefined') {
+            t[i] = new Array();
+        };
+        var l = t[i].length;
+            t[i][l] = v;
+    };
+
+
+    function init_canvas(canvas) {
+        var frames = new Array ();
+        var cur_frame = 0;
+        canvas.find("*").each(function(i) {
+
+            if ($(this).hasClass("pause"))  cur_frame++;
+            push_following(frames, cur_frame, $(this));
+
+        });
+        canvas.data("frames", { frames: frames,
+                                current: 0,
+                                custom: new Array() });
+
+    };
+
     _self.getNumSlides = function () { return _total_slides; };
 
+
+    _self.registerCustom = function (i, f) {
+        if (_initialized) return;
+        //jQuery does not seem to work well
+        //on partial doms
+        var scripts = document.getElementsByTagName("script");
+        var current = scripts[scripts.length-1];
+        console.log(current);
+        var slide = $(current).parents(".slide");
+        if (slide.length == 0) {
+            console.log("no parent ?");
+            return;
+        }
+        _defered_custom[_defered_custom.length] = { src: slide[0],
+                                                    fn: f,
+                                                    frame: i };
+        $(current).remove();
+
+    };
+
     if (typeof(Storage)!=="undefined"){
         _self.getCurrentSlide = function () {
             //unary + casts to integer
@@ -28,9 +85,34 @@ var SimpleWebSlides = new function () {
     _self.lastSlide = function () { return _self.getNumSlides() - 1; };
     _self.refresh = function () {
         var cur = _self.getCurrentSlide();
-        $(".slide").each (function (i) {
+        $(".canvas").each (function (i) {
             if (i == cur){
                 $(this).removeClass("other_slides").addClass("current_slide");
+                var info = $(this).data("frames");
+                var frames = info.frames;
+                var upto = info.current;
+                var custom = info.custom;
+                for(var j = 0; j < Math.max(frames.length, custom.length); j++) {
+                    for (var k = 0; k < frames[j].length; k++) {
+                        if (j < upto || frames[j][k].hasClass("footer")){
+
+                            frames[j][k].removeClass("inactive_frame").addClass("active_frame");
+
+                        } else if (j == upto) {
+
+                            frames[j][k].removeClass("inactive_frame").addClass("current_frame");
+
+                        } else {
+                            frames[j][k].removeClass("active_frame").removeClass("current_frame").addClass("inactive_frame");
+                        };
+                    };
+                    var callbacks;
+                    if (j == upto && (callbacks = custom[j])) {
+                        for (var k = 0; k < callbacks.length; k++)
+                            callbacks[k]($(this));
+                    };
+                };
+
             } else if ($(this).hasClass("current_slide")) {
                 $(this).removeClass("current_slide").addClass("other_slides");
             };
@@ -47,7 +129,46 @@ var SimpleWebSlides = new function () {
         _self.setCurrentSlide(Math.max(_self.getCurrentSlide()-1,
                                       _self.firstSlide()));
     };
+
+    _self.getFrameInfo = function () {
+
+        var i = _self.getCurrentSlide();
+        var canvas = $($(".canvas")[i]);
+        var infos = canvas.data("frames");
+        return infos;
+    };
+    _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().frames.length-1; };
+
+    _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();
+        else
+            _self.nextFrame();
+    };
+
+    _self.previous = function () {
+        var i = _self.getCurrentFrame();
+        if (i == _self.firstFrame())
+            _self.previousSlide();
+        else
+            _self.previousFrame();
+    };
+
+
     _self.keyboardHandler = function (event) {
 
         switch (event.which) {
@@ -60,14 +181,19 @@ var SimpleWebSlides = new function () {
             break;
 
         case 32: /* space */
-        case 34: /* PgDown */
         case 39: /* -> */
+        case 1: /* mouse button 1 */
+            _self.next();
+            break;
+        case 34: /* PgDown */
         case 78: /* n */
             _self.nextSlide();
             break;
         case 8: /* backspace */
-        case 33: /* PgUp */
         case 37: /* <-   */
+            _self.previous();
+            break;
+        case 33: /* PgUp */
         case 80: /* p */
             _self.previousSlide();
             break;
@@ -77,28 +203,53 @@ var SimpleWebSlides = new function () {
         _self.refresh();
     };
 
-    _self.init = function () {
+    var _init = function () {
         _total_slides = $(".slide").length;
 
         $(document).keydown(_self.keyboardHandler);
+        $(document).mousedown(_self.keyboardHandler);
 
         var cur = _self.getCurrentSlide();
         $(".slide").each (function (i) {
-            if (i == cur) {
-                $(this).addClass("current_slide").removeClass("other_slides");
-            } else {
-                $(this).addClass("other_slides").removeClass("current_slide");
-            };
             var elem = '<div class="footer"><span class="current_slide_num">' + (i+1);
             elem += '</span><span class="slide_num_sep"/><span class="total_slide_num">';
             elem += _self.getNumSlides() + '</span></div>';
             if (!($(this).hasClass("nofooter"))) {
                 $(this).append($(elem));
             };
+            var par = $(this).parent();
+            $(this).remove();
+            var canvas = $('<div class="canvas"/>');
+            canvas.append($(this));
+            par.append(canvas);
+            if (i == cur) {
+                canvas.addClass("current_slide").removeClass("other_slides");
+            } else {
+                canvas.addClass("other_slides").removeClass("current_slide");
+            };
+            init_canvas(canvas);
+
         });
+        for (var i = 0; i < _defered_custom.length; i++){
+
+            var custom = _defered_custom[i];
+            var canvas = $(custom.src).parents(".canvas");
+            if (canvas.length == 0) continue;
+            canvas = $(canvas[0]);
+
+            var info = canvas.data("frames");
+
+            push(info.custom, custom.frame, custom.fn);
+        };
+        _self.refresh();
+        _initialized = true;
+
     };
 
-};
+    _self.init = function () {
+        $(document).ready(_init);
+    };
 
+};
 
-$(document).ready(SimpleWebSlides.init);
+SimpleWebSlides.init();
\ No newline at end of file