Untangle the callbacks; Add linkable diff tabs.
[redakcja.git] / src / redakcja / static / js / wiki / loader.js
index 1223992..7ea9b40 100644 (file)
@@ -7,98 +7,88 @@ if (!window.console) {
 
 var DEFAULT_PERSPECTIVE = "#VisualPerspective";
 
-$(function()
-{
-       var tabs = $('ol#tabs li');
-       var gallery = null;
-       CurrentDocument = new $.wikiapi.WikiDocument("document-meta");
+$(function() {
+    var tabs = $('ol#tabs li');
+    var gallery = null;
+    var MIN_SIDEBAR_WIDTH = 50,
+        DEFAULT_SIDEBAR_WIDTH = 480;
 
-       $.blockUI.defaults.baseZ = 10000;
+    CurrentDocument = new $.wikiapi.WikiDocument("document-meta");
 
-    function initialize()
-       {
+    $.blockUI.defaults.baseZ = 10000;
+
+    function initialize() {
         var splitter = $('#splitter'),
-            editors = $('#editor .editor'),
-            vsplitbar = $('.vsplitbar'),
+            vsplitbar = $('#vsplitbar'),
             sidebar = $('#sidebar'),
             dragLayer = $('#drag-layer'),
             vsplitbarWidth = vsplitbar.outerWidth(),
             isHolding = false;
 
-        // Moves panes so that left border of the vsplitbar lands x pixels from the left border of the splitter
-        function setSplitbarAt(x) {
-            var right = splitterWidth - x;
-            editors.each(function() {
-                this.style.right = right + 'px';
-            });
-            vsplitbar[0].style.right = sidebar[0].style.width = (right - vsplitbarWidth) + 'px';
+        function setSidebarWidth(x) {
+            if (x < MIN_SIDEBAR_WIDTH) {
+                x = 0;
+                vsplitbar.removeClass('active');
+            } else {
+                vsplitbar.addClass('active');
+            }
+            $.wiki.state.perspectives.ScanGalleryPerspective.width = x;
+            sidebar[0].style.width = x + 'px';
         };
 
-               $(document).keydown(function(event) {
-                       console.log("Received key:", event);
-               });
-
-               /* The save button */
+        /* The save button */
         $('#save-button').click(function(event){
             event.preventDefault();
-                       $.wiki.showDialog('#save_dialog');
+            $.wiki.showDialog('#save_dialog');
         });
 
-               $('.editor').hide();
+        $('.editor').hide();
 
-               /*
-                * TABS
-                */
-        $('.tabs li').live('click', function(event, callback) {
+        /*
+         * TABS
+         */
+        $(document).on('click', '.tabs li', function(event, callback) {
             event.preventDefault();
-                       $.wiki.switchToTab(this);
+            $.wiki.switchToTab(this);
         });
 
-               $('#tabs li > .tabclose').live('click', function(event, callback) {
-                       var $tab = $(this).parent();
+        $(document).on('click', '#tabs li .tabclose', function(event, callback) {
+            var $tab = $(this).parent().parent();
 
-                       if($tab.is('.active'))
-                               $.wiki.switchToTab(DEFAULT_PERSPECTIVE);
+            if($('a', $tab).is('.active'))
+                $.wiki.switchToTab(DEFAULT_PERSPECTIVE);
 
-                       var p = $.wiki.perspectiveForTab($tab);
-                       p.destroy();
+            var p = $.wiki.perspectiveForTab($tab);
+            p.destroy();
 
-                       return false;
+            return false;
         });
 
-
         $(window).resize(function(){
-            $('iframe').height($(window).height() - $('#tabs').outerHeight() - $('#source-editor .toolbar').outerHeight());
             splitterWidth = splitter.width();
         });
 
         $(window).resize();
-
-        vsplitbar.toggle(
-                       function() {
-                               $.wiki.state.perspectives.ScanGalleryPerspective.show = true;
-                               setSplitbarAt(splitterWidth - (480 + vsplitbarWidth));
-                               $('.vsplitbar').addClass('active');
-                               $(window).resize();
-                               $.wiki.perspectiveForTab('#tabs-right .active').onEnter();
-                       },
-                       function() {
-                           var active_right = $.wiki.perspectiveForTab('#tabs-right .active');
-                               $.wiki.state.perspectives.ScanGalleryPerspective.show = false;
-                               $(".vsplitbar-title").html("&uarr;&nbsp;" + active_right.vsplitbar + "&nbsp;&uarr;");
-                               setSplitbarAt(splitterWidth - vsplitbarWidth);
-                               $('.vsplitbar').removeClass('active');
-                               $(window).resize();
-                               active_right.onExit();
-                       }
-               );
-
+        $.wiki.perspectiveForTab($('#tabs-right .active').parent()).onEnter();
+
+        vsplitbar.on('click', function() {
+            var $this = $(this);
+            if ($this.hasClass('active')) {
+                $.wiki.state.perspectives.ScanGalleryPerspective.lastWidth = sidebar.width();
+                setSidebarWidth(0);
+            } else {
+                setSidebarWidth($.wiki.state.perspectives.ScanGalleryPerspective.lastWidth);
+            }
+        });
 
         /* Splitbar dragging support */
         vsplitbar
             .mousedown(function(e) {
                 e.preventDefault();
                 isHolding = true;
+                if (sidebar.width() > MIN_SIDEBAR_WIDTH) {
+                    $.wiki.state.perspectives.ScanGalleryPerspective.lastWidth = sidebar.width();
+                }
             })
             .mousemove(function(e) {
                 if(isHolding) {
@@ -106,84 +96,75 @@ $(function()
                 }
             });
         dragLayer.mousemove(function(e) {
-            setSplitbarAt(e.clientX - vsplitbarWidth/2);
+            setSidebarWidth(splitterWidth - e.clientX - vsplitbarWidth / 2);
         });
         $('body').mouseup(function(e) {
             dragLayer.hide();
             isHolding = false;
         });
 
+        setSidebarWidth($.wiki.state.perspectives.ScanGalleryPerspective.width);
 
-               if($.wiki.state.perspectives.ScanGalleryPerspective.show){
-            $('.vsplitbar').trigger('click');
-            $(".vsplitbar-title").html("&darr;&nbsp;GALERIA&nbsp;&darr;");
-        } else {
-            $(".vsplitbar-title").html("&uarr;&nbsp;GALERIA&nbsp;&uarr;");
-        }
         window.onbeforeunload = function(e) {
             if($.wiki.isDirty()) {
-                               e.returnValue = "Na stronie mogą być nie zapisane zmiany.";
-                               return "Na stronie mogą być nie zapisane zmiany.";
-                       };
+                e.returnValue = "Na stronie mogą być nie zapisane zmiany.";
+                return "Na stronie mogą być nie zapisane zmiany.";
+            };
         };
 
-               console.log("Fetching document's text");
+        $('body').mousemove(function(e) {
+            CurrentDocument.active = true;
+        });
+        $('body').keydown(function(e) {
+            CurrentDocument.active = true;
+        });
 
-               $(document).bind('wlapi_document_changed', function(event, doc) {
-                       try {
-                               $('#document-revision').text(doc.revision);
-                       } catch(e) {
-                               console.log("Failed handler", e);
-                       }
-               });
+        console.log("Fetching document's text");
+
+        $(document).bind('wlapi_document_changed', function(event, doc) {
+            try {
+                $('#document-revision').text(doc.revision);
+            } catch(e) {
+                console.log("Failed handler", e);
+            }
+        });
 
-               CurrentDocument.fetch({
-                       success: function(){
-                               console.log("Fetch success");
-                               $('#loading-overlay').fadeOut();
-                               var active_tab = document.location.hash || DEFAULT_PERSPECTIVE;
+        CurrentDocument.fetch({
+            success: function(){
+                console.log("Fetch success");
+                $('#loading-overlay').fadeOut();
+                var active_tab = document.location.hash || DEFAULT_PERSPECTIVE;
 
-                               if(active_tab == "#ScanGalleryPerspective")
-                                       active_tab = DEFAULT_PERSPECTIVE;
+                if(active_tab == "#ScanGalleryPerspective")
+                    active_tab = DEFAULT_PERSPECTIVE;
 
-                               console.log("Initial tab is:", active_tab)
-                               $.wiki.switchToTab(active_tab);
+                console.log("Initial tab is:", active_tab)
+                $.wiki.switchToTab(active_tab);
 
-                /* every 5 minutes check for a newer version */
+                /* every minute check for a newer version */
                 var revTimer = setInterval(function() {
-                        CurrentDocument.checkRevision({outdated: function(){
-                            $('#header').addClass('out-of-date');
-                            clearInterval(revTimer);
-                        }});
-                    }, 300000);
-                       },
-                       failure: function() {
-                               $('#loading-overlay').fadeOut();
-                               alert("FAILURE");
-                       }
-               });
+                    CurrentDocument.checkRevision({outdated: function(){
+                        $('#header').addClass('out-of-date');
+                        clearInterval(revTimer);
+                    }});
+                }, 60 * 1000);
+            },
+            failure: function() {
+                $('#loading-overlay').fadeOut();
+                alert("FAILURE");
+            }
+        });
     }; /* end of initialize() */
 
 
-       /* Load configuration */
-       $.wiki.loadConfig();
-
-       var initAll = function(a, f) {
-               if (a.length == 0) return f();
-
-               $.wiki.initTab({
-                       tab: a.pop(),
-                       doc: CurrentDocument,
-                       callback: function(){
-                               initAll(a, f);
-                       }
-               });
-       };
-
+    /* Load configuration */
+    $.wiki.loadConfig();
 
-       /*
-        * Initialize all perspectives
-        */
-       initAll( $.makeArray($('.tabs li')), initialize);
-       console.log(location.hash);
+    /*
+     * Initialize all perspectives
+     */
+    $('.tabs li').each((i, e) => {
+        $.wiki.initTab({tab: e, doc: CurrentDocument});
+    });
+    initialize();
 });