Add JSHint and make dygraphs pass its checks.
[dygraphs.git] / dygraph-utils.js
index 3d77148..8b9dfd9 100644 (file)
@@ -11,6 +11,8 @@
  * search) and generic DOM-manipulation functions.
  */
 
+/*jshint globalstrict: true */
+/*global Dygraph:false, G_vmlCanvasManager:false, Node:false, printStackTrace: false */
 "use strict";
 
 Dygraph.LOG_SCALE = 10;
@@ -19,7 +21,7 @@ Dygraph.LN_TEN = Math.log(Dygraph.LOG_SCALE);
 /** @private */
 Dygraph.log10 = function(x) {
   return Math.log(x) / Dygraph.LN_TEN;
-}
+};
 
 // Various logging levels.
 Dygraph.DEBUG = 1;
@@ -43,7 +45,7 @@ Dygraph.log = function(severity, message) {
   var st;
   if (typeof(printStackTrace) != 'undefined') {
     // Remove uninteresting bits: logging functions and paths.
-    var st = printStackTrace({guess:false});
+    st = printStackTrace({guess:false});
     while (st[0].indexOf("stacktrace") != -1) {
       st.splice(0, 1);
     }
@@ -317,6 +319,7 @@ Dygraph.pageY = function(e) {
  * @return { Boolean } Whether the number is zero or NaN.
  */
 // TODO(danvk): rename this function to something like 'isNonZeroNan'.
+// TODO(danvk): determine when else this returns false (e.g. for undefined or null)
 Dygraph.isOK = function(x) {
   return x && !isNaN(x);
 };
@@ -359,7 +362,7 @@ Dygraph.floatFormat = function(x, opt_precision) {
   //
   // Finally, the argument for toExponential() is the number of trailing digits,
   // so we take off 1 for the value before the '.'.
-  return (Math.abs(x) < 1.0e-3 && x != 0.0) ?
+  return (Math.abs(x) < 1.0e-3 && x !== 0.0) ?
       x.toExponential(p - 1) : x.toPrecision(p);
 };
 
@@ -414,28 +417,31 @@ Dygraph.round_ = function(num, places) {
  * @param { Integer } [high] The last index in arry to consider (optional)
  */
 Dygraph.binarySearch = function(val, arry, abs, low, high) {
-  if (low == null || high == null) {
+  if (low === null || low === undefined ||
+      high === null || high === undefined) {
     low = 0;
     high = arry.length - 1;
   }
   if (low > high) {
     return -1;
   }
-  if (abs == null) {
+  if (abs === null || abs === undefined) {
     abs = 0;
   }
   var validIndex = function(idx) {
     return idx >= 0 && idx < arry.length;
-  }
-  var mid = parseInt((low + high) / 2);
+  };
+  var mid = parseInt((low + high) / 2, 10);
   var element = arry[mid];
   if (element == val) {
     return mid;
   }
+
+  var idx;
   if (element > val) {
     if (abs > 0) {
       // Accept if element > val, but also if prior element < val.
-      var idx = mid - 1;
+      idx = mid - 1;
       if (validIndex(idx) && arry[idx] < val) {
         return mid;
       }
@@ -445,7 +451,7 @@ Dygraph.binarySearch = function(val, arry, abs, low, high) {
   if (element < val) {
     if (abs < 0) {
       // Accept if element < val, but also if prior element > val.
-      var idx = mid + 1;
+      idx = mid + 1;
       if (validIndex(idx) && arry[idx] > val) {
         return mid;
       }
@@ -478,8 +484,8 @@ Dygraph.dateParser = function(dateStr) {
     d = Dygraph.dateStrToMillis(dateStrSlashed);
   } else if (dateStr.length == 8) {  // e.g. '20090712'
     // TODO(danvk): remove support for this format. It's confusing.
-    dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2)
-                       + "/" + dateStr.substr(6,2);
+    dateStrSlashed = dateStr.substr(0,4) + "/" + dateStr.substr(4,2) + "/" +
+        dateStr.substr(6,2);
     d = Dygraph.dateStrToMillis(dateStrSlashed);
   } else {
     // Any format that Date.parse will accept, e.g. "2009/07/12" or
@@ -539,7 +545,7 @@ Dygraph.updateDeep = function (self, o) {
   if (typeof(o) != 'undefined' && o !== null) {
     for (var k in o) {
       if (o.hasOwnProperty(k)) {
-        if (o[k] == null) {
+        if (o[k] === null) {
           self[k] = null;
         } else if (Dygraph.isArrayLike(o[k])) {
           self[k] = o[k].slice();
@@ -627,7 +633,7 @@ Dygraph.createCanvas = function() {
  * Android does not fully support the <canvas> tag, e.g. w/r/t/ clipping.
  */
 Dygraph.isAndroid = function() {
-  return /Android/.test(navigator.userAgent);
+  return (/Android/).test(navigator.userAgent);
 };
 
 /**
@@ -656,7 +662,7 @@ Dygraph.repeatAndCleanup = function(repeat_fn, times, every_ms, cleanup_fn) {
     var target_time = start_time + (1 + count) * every_ms;
     setTimeout(function() {
       count++;
-      repeat_fn(count)
+      repeat_fn(count);
       if (count >= times - 1) {
         cleanup_fn();
       } else {