X-Git-Url: https://adrianiainlam.tk/git/?a=blobdiff_plain;f=dygraph-utils.js;h=0ca65855cc2790c23131b602158fad110eb56c21;hb=9a3969c87ae1309cd6a05de3a68f45d1f0ce02ea;hp=04a5d3a54c53cdd78ab86b2afc03632ede625990;hpb=b7a1dc2288585edbeff4591e81e6a0efd2893932;p=dygraphs.git diff --git a/dygraph-utils.js b/dygraph-utils.js index 04a5d3a..0ca6585 100644 --- a/dygraph-utils.js +++ b/dygraph-utils.js @@ -158,9 +158,9 @@ Dygraph.getContext = function(canvas) { /** * Add an event handler. This smooths a difference between IE and the rest of * the world. - * @param { !Element } elem The element to add the event to. - * @param { string } type The type of the event, e.g. 'click' or 'mousemove'. - * @param { function(Event):(boolean|undefined) } fn The function to call + * @param {!Node} elem The element to add the event to. + * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. + * @param {function(Event):(boolean|undefined)} fn The function to call * on the event. The function takes one parameter: the event object. * @private */ @@ -177,9 +177,9 @@ Dygraph.addEvent = function addEvent(elem, type, fn) { * Add an event handler. This event handler is kept until the graph is * destroyed with a call to graph.destroy(). * - * @param { !Element } elem The element to add the event to. - * @param { string } type The type of the event, e.g. 'click' or 'mousemove'. - * @param { function(Event):(boolean|undefined) } fn The function to call + * @param {!Node} elem The element to add the event to. + * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. + * @param {function(Event):(boolean|undefined)} fn The function to call * on the event. The function takes one parameter: the event object. * @private */ @@ -191,7 +191,7 @@ Dygraph.prototype.addAndTrackEvent = function(elem, type, fn) { /** * Remove an event handler. This smooths a difference between IE and the rest * of the world. - * @param {!Element} elem The element to add the event to. + * @param {!Node} elem The element to remove the event from. * @param {string} type The type of the event, e.g. 'click' or 'mousemove'. * @param {function(Event):(boolean|undefined)} fn The function to call * on the event. The function takes one parameter: the event object. @@ -227,7 +227,7 @@ Dygraph.prototype.removeTrackedEvents_ = function() { * browser actions, e.g. highlighting text on a double-click. * Based on the article at * http://www.switchonthecode.com/tutorials/javascript-tutorial-the-scroll-wheel - * @param { !Event } e The event whose normal behavior should be canceled. + * @param {!Event} e The event whose normal behavior should be canceled. * @private */ Dygraph.cancelEvent = function(e) { @@ -374,6 +374,28 @@ Dygraph.pageY = function(e) { }; /** + * Converts page the x-coordinate of the event to pixel x-coordinates on the + * canvas (i.e. DOM Coords). + * @param {!Event} e Drag event. + * @param {!DygraphInteractionContext} context Interaction context object. + * @return {number} The amount by which the drag has moved to the right. + */ +Dygraph.dragGetX_ = function(e, context) { + return Dygraph.pageX(e) - context.px; +}; + +/** + * Converts page the y-coordinate of the event to pixel y-coordinates on the + * canvas (i.e. DOM Coords). + * @param {!Event} e Drag event. + * @param {!DygraphInteractionContext} context Interaction context object. + * @return {number} The amount by which the drag has moved down. + */ +Dygraph.dragGetY_ = function(e, context) { + return Dygraph.pageY(e) - context.py; +}; + +/** * This returns true unless the parameter is 0, null, undefined or NaN. * TODO(danvk): rename this function to something like 'isNonZeroNan'. * @@ -386,18 +408,18 @@ Dygraph.isOK = function(x) { }; /** - * @param { {x:?number,y:?number,yval:?number} } p The point to consider, valid + * @param {{x:?number,y:?number,yval:?number}} p The point to consider, valid * points are {x, y} objects - * @param { boolean } allowNaNY Treat point with y=NaN as valid - * @return { boolean } Whether the point has numeric x and y. + * @param {boolean=} opt_allowNaNY Treat point with y=NaN as valid + * @return {boolean} Whether the point has numeric x and y. * @private */ -Dygraph.isValidPoint = function(p, allowNaNY) { +Dygraph.isValidPoint = function(p, opt_allowNaNY) { if (!p) return false; // null or undefined object if (p.yval === null) return false; // missing point if (p.x === null || p.x === undefined) return false; if (p.y === null || p.y === undefined) return false; - if (isNaN(p.x) || (!allowNaNY && isNaN(p.y))) return false; + if (isNaN(p.x) || (!opt_allowNaNY && isNaN(p.y))) return false; return true; }; @@ -684,7 +706,7 @@ Dygraph.updateDeep = function (self, o) { }; /** - * @param {Object} o + * @param {*} o * @return {boolean} * @private */ @@ -1189,3 +1211,56 @@ Dygraph.toRGB_ = function(colorStr) { b: parseInt(bits[3], 10) }; }; + +/** + * Checks whether the browser supports the <canvas> tag. + * @param {HTMLCanvasElement=} opt_canvasElement Pass a canvas element as an + * optimization if you have one. + * @return {boolean} Whether the browser supports canvas. + */ +Dygraph.isCanvasSupported = function(opt_canvasElement) { + var canvas; + try { + canvas = opt_canvasElement || document.createElement("canvas"); + canvas.getContext("2d"); + } + catch (e) { + var ie = navigator.appVersion.match(/MSIE (\d\.\d)/); + var opera = (navigator.userAgent.toLowerCase().indexOf("opera") != -1); + if ((!ie) || (ie[1] < 6) || (opera)) + return false; + return true; + } + return true; +}; + +/** + * Parses the value as a floating point number. This is like the parseFloat() + * built-in, but with a few differences: + * - the empty string is parsed as null, rather than NaN. + * - if the string cannot be parsed at all, an error is logged. + * If the string can't be parsed, this method returns null. + * @param {string} x The string to be parsed + * @param {number=} opt_line_no The line number from which the string comes. + * @param {string=} opt_line The text of the line from which the string comes. + */ +Dygraph.parseFloat_ = function(x, opt_line_no, opt_line) { + var val = parseFloat(x); + if (!isNaN(val)) return val; + + // Try to figure out what happeend. + // If the value is the empty string, parse it as null. + if (/^ *$/.test(x)) return null; + + // If it was actually "NaN", return it as NaN. + if (/^ *nan *$/i.test(x)) return NaN; + + // Looks like a parsing error. + var msg = "Unable to parse '" + x + "' as a number"; + if (opt_line !== undefined && opt_line_no !== undefined) { + msg += " on line " + (1+(opt_line_no||0)) + " ('" + opt_line + "') of CSV."; + } + Dygraph.error(msg); + + return null; +};