X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-utils.js;h=0ae3f08f24bd1ff4c800ab1e4c8efffeea60447e;hb=78e58af463c6b5a09d85d6014bbdba0b3d8a605a;hp=3d77148654e82d9e391008e17245b1845bd528d3;hpb=769e8bc7b8799385e2677b26a5c0a72e839f44ca;p=dygraphs.git diff --git a/dygraph-utils.js b/dygraph-utils.js index 3d77148..0ae3f08 100644 --- a/dygraph-utils.js +++ b/dygraph-utils.js @@ -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 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 { @@ -687,7 +693,9 @@ Dygraph.isPixelChangingOptionList = function(labels, attrs) { 'clickCallback': true, 'digitsAfterDecimal': true, 'drawCallback': true, + 'drawHighlightCallback': true, 'drawPoints': true, + 'drawPointCallback': true, 'drawXGrid': true, 'drawYGrid': true, 'fillAlpha': true, @@ -769,3 +777,70 @@ Dygraph.isPixelChangingOptionList = function(labels, attrs) { return requiresNewPoints; }; + + +Dygraph.RegularConvex = function(sides, rotation) { + this.sides = sides; + this.rotation = rotation ? rotation : 0; + this.delta = Math.PI * 2 / sides; +} + +Dygraph.RegularConvex.prototype.draw = function(ctx, cx, cy, radius, angleAdjustment) { + ctx.beginPath(); + var first = true; + if (!angleAdjustment) angleAdjustment = 0; + var angle = this.rotation + angleAdjustment; + + var x = cx + (Math.sin(angle) * radius); + var y = cy + (-Math.cos(angle) * radius); + ctx.moveTo(x, y); + + for (var idx = 0; idx < this.sides; idx++) { + angle = (idx == this.sides - 1) ? this.rotation : (angle + this.delta); + var x = cx + (Math.sin(angle) * radius); + var y = cy + (-Math.cos(angle) * radius); + ctx.lineTo(x, y); + } + ctx.stroke(); + ctx.closePath(); +} + +Dygraph.DrawPolygon_ = function(sides, rotation, ctx, cx, cy, color, radius, angleAdjustment) { + ctx.lineWidth = 1; + ctx.strokeStyle = color; + new Dygraph.RegularConvex(sides, rotation).draw(ctx, cx, cy, radius, angleAdjustment); +} + +Dygraph.Circles = { + DEFAULT : function(g, name, ctx, canvasx, canvasy, color, radius) { + ctx.beginPath(); + ctx.fillStyle = color; + ctx.arc(canvasx, canvasy, radius, 0, 2 * Math.PI, false); + ctx.fill(); + }, + TRIANGLE : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(3, Math.PI / 3, ctx, cx, cy, color, radius); + }, + SQUARE : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(4, Math.PI / 4, ctx, cx, cy, color, radius); + }, + DIAMOND : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(4, Math.PI / 4, ctx, cx, cy, color, radius, Math.PI / 8); + }, + PENTAGON : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(5, Math.PI / 5, ctx, cx, cy, color, radius); + }, + HEXAGON : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(6, Math.PI / 6, ctx, cx, cy, color, radius); + }, + CIRCLE : function(g, name, ctx, cx, cy, color, radius) { + ctx.beginPath(); + ctx.lineStyle = color; + ctx.arc(cx, cy, radius, 0, 2 * Math.PI, false); + ctx.fill(); + }, + STAR : function(g, name, ctx, cx, cy, color, radius) { + Dygraph.DrawPolygon_(5, 2 * Math.PI / 5, ctx, cx, cy, color, radius); + } + // TODO: plus, x. +};