Use CSS for styling
[dygraphs.git] / src / extras / synchronizer.js
old mode 100644 (file)
new mode 100755 (executable)
index 78efbcb..6f369f3
 /* global Dygraph:false */
 'use strict';
 
-Dygraph.synchronize = function(/* dygraphs..., opts */) {
+var Dygraph;
+if (window.Dygraph) {
+  Dygraph = window.Dygraph;
+} else if (typeof(module) !== 'undefined') {
+  Dygraph = require('../dygraph');
+}
+
+var synchronize = function(/* dygraphs..., opts */) {
   if (arguments.length === 0) {
     throw 'Invalid invocation of Dygraph.synchronize(). Need >= 1 argument.';
   }
@@ -146,6 +153,16 @@ Dygraph.synchronize = function(/* dygraphs..., opts */) {
   };
 };
 
+function arraysAreEqual(a, b) {
+  if (!Array.isArray(a) || !Array.isArray(b)) return false;
+  var i = a.length;
+  if (i !== b.length) return false;
+  while (i--) {
+    if (a[i] !== b[i]) return false;
+  }
+  return true;
+}
+
 function attachZoomHandlers(gs, syncOpts, prevCallbacks) {
   var block = false;
   for (var i = 0; i < gs.length; i++) {
@@ -166,11 +183,18 @@ function attachZoomHandlers(gs, syncOpts, prevCallbacks) {
             }
             continue;
           }
+
+          // Only redraw if there are new options
+          if (arraysAreEqual(opts.dateWindow, gs[j].getOption('dateWindow')) && 
+              arraysAreEqual(opts.valueRange, gs[j].getOption('valueRange'))) {
+            continue;
+          }
+
           gs[j].updateOptions(opts);
         }
         block = false;
       }
-    }, false /* no need to redraw */);
+    }, true /* no need to redraw */);
   }
 }
 
@@ -213,8 +237,10 @@ function attachSelectionHandlers(gs, prevCallbacks) {
         }
         block = false;
       }
-    });
+    }, true /* no need to redraw */);
   }
 }
 
+Dygraph.synchronize = synchronize;
+
 })();