Use the new flex-box et border-sizing.
[hacks/simpleWebSlides.git] / simpleWebSlides.js
index d0165f0..e73a1a2 100644 (file)
@@ -44,7 +44,12 @@ SWS.Utils = new function () {
         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, " "));
+    }
 };
 
 
@@ -64,6 +69,7 @@ SWS.Templates = new function () {
 <option value='sws-aspect-16-10'>16:10</option>\
 </select>\
 <span title='Change the theme' class='sws-symbol'>&#x1f3a8;</span><select id='sws-theme-select' onchange='SWS.Presentation.changeTheme();'></select>\
+<a onclick='SWS.Presentation.openPrint()' ><span title='Open Print-Out' class='sws-symbol'>&#59158;</span></a>\
 </div>\
 <div id='sws-control-panel-navigation'>\
 <a title='First slide' class='sws-symbol' onclick='SWS.Presentation.goToSlide(SWS.Presentation.firstSlide());' >&#x23ee;</a>\
@@ -99,7 +105,6 @@ SWS.Templates = new function () {
     self.objectActivate = function (o) {
         if (!(o.hasClass("sws-active-object"))){
             o.removeClass("sws-inactive-object").addClass("sws-active-object");
-            o.css({'visibility':'visible'});
             return true;
         };
         return false;
@@ -148,7 +153,10 @@ SWS.Effects = new function () {
 
     self.objectDeactivateFadeOut = function (o) {
         o.animate({'opacity': '0'}, 200,
-                  function () { SWS.Templates.objectDeactivate(o)});
+                  function () {
+
+                      SWS.Templates.objectDeactivate(o);
+                  });
     };
 
     self.objectActivateFadeIn = function (o) {
@@ -270,9 +278,10 @@ SWS.Presentation = new function () {
     var _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; };
 
@@ -326,6 +335,7 @@ SWS.Presentation = new function () {
         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);
@@ -383,6 +393,18 @@ SWS.Presentation = new function () {
         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; };
@@ -435,8 +457,44 @@ SWS.Presentation = new function () {
         styles[j].disabled = false;
     };
 
+
+    self.printMode = function () {
+        _print_mode = true;
+        var progress = $("<div style='position:fixed;top:0pt;left:0pt;background:white;color:black;width:100%;height:100vh;z-index:200;' id='sws-print-progress'>Rendering presentation: <span id='sws-percent-progress'></span>%</div>");
+        $("body").append(progress);
+
+        $("html").removeClass("sws-display").addClass("sws-print");
+        self.goToSlide(0,0);
+        var steps = self.getTotalSteps();
+        var total_steps = steps;
+        var loop;
+        loop = function () {
+            if (steps >= 0) {
+                //Crazy workaround for chromium
+                ($("link.sws-theme[rel='stylesheet']")[0]).disabled = false;
+                $(".sws-canvas").find("*").addBack().promise().done(function() {
+                    var percent = ((total_steps - steps) / total_steps) * 100;
+                    console.log(percent);
+                    $("#sws-percent-progress").text(Math.round(percent));
+                    SWS.Config['sws-slide-change'] = SWS.Templates.slideChange;
+                    self.refresh();
+                    $($(".sws-canvas")[self.getCurrentSlide()]).css('opacity', 1 );
+                    self.next();
+                    steps--;
+                    loop();
+                    })
+            } else {
+                $("#sws-percent-progress").text(100);
+                progress.remove();
+            }
+        };
+        loop();
+
+    }
+
     self.inputHandler = function (event) {
-        if (_disable_input_events) return;
+        if (_disable_input_events || _print_mode ) return;
+
         switch (event.which) {
         case 36:/* Home */
             self.setCurrentSlide(self.firstSlide());
@@ -445,22 +503,21 @@ SWS.Presentation = new function () {
         case 35:/* End */
             self.setCurrentSlide(self.lastSlide());
             break;
-
         case 32: /* space */
+        case 34: /* PgDown */
         case 39: /* -> */
             if (self.getCurrentSlide() == self.lastSlide()
                 && self.getCurrentFrame() == self.lastFrame()) return;
             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;
@@ -469,6 +526,7 @@ SWS.Presentation = new function () {
             return;
         case 67: /* c */
             $("#sws-control-panel-canvas").toggle();
+            
         default:
             return;
         };
@@ -539,18 +597,21 @@ SWS.Presentation = new function () {
         });
 
         canvas.data("sws-frame-info", { current: 0,
-                                        last: last_frame,
+                                        last: (last_frame - 0), // force cast to integer
                                         callbacks: callbacks
                                       });
 
     };
 
     /* Forces redrawing the page without reloading */
-    self.redraw = function () {
-        $("body").hide();
-        $("body").show();
+    self.redraw = function (f) {
+        if (SWS.Utils.isUndefined(f))
+            $("body").hide().show(400, function () {
+                $("body").css("display","block");
+                if (!SWS.Utils.isUndefined(f))
+                    f();
+            });
     };
-
     self.changeAspect = function() {
         $("html").removeClass("sws-aspect-4-3")
             .removeClass("sws-aspect-16-9")
@@ -559,18 +620,43 @@ SWS.Presentation = new function () {
         self.redraw();
     };
 
+    self.getCurrentTheme = function () {
+        var l = $("link.sws-theme[rel='stylesheet']")[0];
+
+        if (l) {
+            return  l.title;
+        } else
+            return ""
+    };
 
-    self.changeTheme = function () {
-        var theme_name = $("#sws-theme-select").val();
+    self.changeTheme = function (name) {
+        var theme_name;
+        if (typeof name === 'undefined')
+            theme_name = $("#sws-theme-select").val()
+        else
+            theme_name = name;
+
+        _current_theme = theme_name;
         $("link.sws-theme").each (function (i) {
-            var e = $(this);
-            var title =  e.attr("title");
-            e[0].disabled = (title != theme_name);
+            var e = this;
+            var title =  e.title;
+            if (title == theme_name) {
+                e.rel = "stylesheet";
+                e.disabled = false;
+                e.media="all";
+            } else {
+                e.rel = "alternate stylesheet";
+                e.disabled = true;
+                e.media="all";
+            };
         });
         self.redraw();
-    };
 
+    };
 
+    self.openPrint = function () {
+        window.open ("?mode=print&theme=" + self.getCurrentTheme());
+    }
     var _fullscreen_icon_on = "&#xe746;";
     var _fullscreen_icon_off = "&#xe744;";
 
@@ -602,36 +688,37 @@ SWS.Presentation = new function () {
     self.init = function () {
 
 
+        $("html").addClass("sws-display");
+        //$(window).resize(self.redraw);
 
-        $(window).resize(self.redraw);
 
 
-        $(window).bind('storage', function (e) {
-            console.log(e);
-        });
-
         _total_slides = $(".sws-slide").length;
 
-        $(document).keydown(self.inputHandler);
+        var cur = self.getCurrentSlide();
 
+        $(".sws-slide").each(function (i) {
 
-        var cur = self.getCurrentSlide();
-        $(".sws-slide").each (function (i) {
             var par = $(this).parent();
 
+
             $(this).remove();
             var canvas = $('<div class="sws-canvas"/>');
 
             if (!($(this).hasClass("sws-option-noheader"))) {
-                canvas.append($('<div class="sws-header"/><br/>'));
+                canvas.append($('<div class="sws-header"/>'));
             };
-
+            if (!$(this).hasClass("sws-cover")) {
+                var title = $($(this).find("h1")[0]);
+                var title_div = $('<div class="sws-title" />');
+                title_div.append(title);
+                canvas.append(title_div);
+            }
             var inner = $('<div class="sws-inner-canvas"/>');
             var content = $('<div class="sws-content"/>');
             $(this).find('script[type="text/javascript"]').remove();
             content.append($(this));
             inner.append(content);
-            inner.append($('<span class="sws-vertical-align"> </span><br/>'));
             canvas.append(inner);
 
             if (!($(this).hasClass("sws-option-nofooter"))) {
@@ -653,8 +740,6 @@ SWS.Presentation = new function () {
 
         });
 
-
-
         // Initialize the control panel
         $("body").append($(SWS.Templates.controlPanel));
         // Fill the theme switcher
@@ -685,10 +770,24 @@ SWS.Presentation = new function () {
         _update_ui();
 
         _slide_callbacks = null; /* avoid a leak */
-        self.refresh();
-        _initialized = true;
-
-
+        var passed_theme = SWS.Utils.getParameterByName("theme");
+        //workaround weird chrome CSS loading bug
+        var f =
+            function () {
+                if (passed_theme == "")
+                    self.changeTheme();
+                else
+                    self.changeTheme(passed_theme);
+                if (SWS.Utils.getParameterByName("mode") == "print") {
+                    self.printMode();
+                }
+                else
+                    self.refresh();
+                $(document).keydown(self.inputHandler);
+
+                _initialized = true;
+            };
+        setTimeout(f, 100);
     };
 
 };