Some fixes in the CSS for printout mode and correct selection of current theme in...
[hacks/simpleWebSlides.git] / simpleWebSlides.js
index d2859f3..76cbeba 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,7 @@ 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'});
+            o.css('visibility','visible');
             return true;
         };
         return false;
@@ -186,13 +192,19 @@ SWS.Effects = new function () {
         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); });
-            t.animate({ 'left': '0%' }, 250);
+            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.animate({ 'left': '100%' }, 250, function () { SWS.Templates.slideDeactivate(f);
+                                                             f.css('opacity', '0');
+                                                           });
+            t.css('opacity', '1');
             t.animate({ 'left': '0%' }, 250);
         };
     };
@@ -264,9 +276,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; };
 
@@ -320,6 +333,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);
@@ -377,6 +391,19 @@ 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");
+            console.log(infos);
+            _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; };
@@ -429,8 +456,42 @@ 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;
+                    $("#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());
@@ -441,19 +502,20 @@ SWS.Presentation = new function () {
             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;
@@ -532,18 +594,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")
@@ -552,18 +617,45 @@ SWS.Presentation = new function () {
         self.redraw();
     };
 
+    self.getCurrentTheme = function () { 
+        var l = $("link.sws-theme[rel='stylesheet']")[0];
+        console.log(l);
+        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;
+//        if (self.getCurrentTheme() == theme_name) {
+  //          return;
+    //    };
+        _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;";
 
@@ -595,7 +687,7 @@ SWS.Presentation = new function () {
     self.init = function () {
 
 
-
+        $("html").addClass("sws-display");
         $(window).resize(self.redraw);
 
 
@@ -621,14 +713,6 @@ SWS.Presentation = new function () {
 
             var inner = $('<div class="sws-inner-canvas"/>');
             var content = $('<div class="sws-content"/>');
-            var title = $('<div class="sws-title"/>');
-            var h1 = $(this).children("h1");
-            if (h1) {
-              h1.detach();
-              title.append(h1);
-            }
-            canvas.append(title);
-            canvas.append($("<br/>"));
             $(this).find('script[type="text/javascript"]').remove();
             content.append($(this));
             inner.append(content);
@@ -686,9 +770,19 @@ SWS.Presentation = new function () {
         _update_ui();
 
         _slide_callbacks = null; /* avoid a leak */
-        self.refresh();
-        _initialized = true;
 
+        var passed_theme = SWS.Utils.getParameterByName("theme");
+        if (passed_theme == "")
+            self.changeTheme();
+        else
+            self.changeTheme(passed_theme);
+
+        if (SWS.Utils.getParameterByName("mode") == "print") {
+           self.printMode();
+        }
+        else
+            self.refresh();
+        _initialized = true;
 
     };