/* * jquery.flot.tooltip * * description: easy-to-use tooltips for Flot charts * version: 0.9.0 * authors: Krzysztof Urbas @krzysu [myviews.pl],Evan Steinkerchner @Roundaround * website: https://github.com/krzysu/flot.tooltip * * build on 2016-07-26 * released under MIT License, 2012 */ !(function (a) { var b = { tooltip: { show: !1, cssClass: "flotTip", content: "%s | X: %x | Y: %y", xDateFormat: null, yDateFormat: null, monthNames: null, dayNames: null, shifts: { x: 10, y: 20 }, defaultTheme: !0, snap: !0, lines: !1, clickTips: !1, onHover: function (a, b) {}, $compat: !1, }, }; b.tooltipOpts = b.tooltip; var c = function (a) { (this.tipPosition = { x: 0, y: 0 }), this.init(a); }; (c.prototype.init = function (b) { function c(a) { var c = {}; (c.x = a.pageX), (c.y = a.pageY), b.setTooltipPosition(c); } function d(c, d, g) { f.clickmode ? (a(b.getPlaceholder()).bind("plothover", e), b.hideTooltip(), (f.clickmode = !1)) : (e(c, d, g), f.getDomElement().is(":visible") && (a(b.getPlaceholder()).unbind("plothover", e), (f.clickmode = !0))); } function e(c, d, e) { var g = function (a, b, c, d) { return Math.sqrt((c - a) * (c - a) + (d - b) * (d - b)); }, h = function (a, b, c, d, e, f, h) { if ( !h || ((h = (function (a, b, c, d, e, f) { if ("undefined" != typeof c) return { x: c, y: b }; if ("undefined" != typeof d) return { x: a, y: d }; var g, h = -1 / ((f - d) / (e - c)); return { x: (g = (e * (a * h - b + d) + c * (a * -h + b - f)) / (h * (e - c) + d - f)), y: h * g - h * a + b, }; })(a, b, c, d, e, f)), h.x >= Math.min(c, e) && h.x <= Math.max(c, e) && h.y >= Math.min(d, f) && h.y <= Math.max(d, f)) ) { var i = d - f, j = e - c, k = c * f - d * e; return Math.abs(i * a + j * b + k) / Math.sqrt(i * i + j * j); } var l = g(a, b, c, d), m = g(a, b, e, f); return l > m ? m : l; }; if (e) b.showTooltip(e, f.tooltipOptions.snap ? e : d); else if ( f.plotOptions.series.lines.show && f.tooltipOptions.lines === !0 ) { var i = f.plotOptions.grid.mouseActiveRadius, j = { distance: i + 1 }, k = d; a.each(b.getData(), function (a, c) { for (var e = 0, i = -1, l = 1; l < c.data.length; l++) c.data[l - 1][0] <= d.x && c.data[l][0] >= d.x && ((e = l - 1), (i = l)); if (-1 === i) return void b.hideTooltip(); var m = { x: c.data[e][0], y: c.data[e][1] }, n = { x: c.data[i][0], y: c.data[i][1] }, o = h( c.xaxis.p2c(d.x), c.yaxis.p2c(d.y), c.xaxis.p2c(m.x), c.yaxis.p2c(m.y), c.xaxis.p2c(n.x), c.yaxis.p2c(n.y), !1 ); if (o < j.distance) { var p = g(m.x, m.y, d.x, d.y) < g(d.x, d.y, n.x, n.y) ? e : i, q = (c.datapoints.pointsize, [d.x, m.y + (n.y - m.y) * ((d.x - m.x) / (n.x - m.x))]), r = { datapoint: q, dataIndex: p, series: c, seriesIndex: a }; (j = { distance: o, item: r }), f.tooltipOptions.snap && (k = { pageX: c.xaxis.p2c(q[0]), pageY: c.yaxis.p2c(q[1]) }); } }), j.distance < i + 1 ? b.showTooltip(j.item, k) : b.hideTooltip(); } else b.hideTooltip(); } var f = this, g = a.plot.plugins.length; if (((this.plotPlugins = []), g)) for (var h = 0; g > h; h++) this.plotPlugins.push(a.plot.plugins[h].name); b.hooks.bindEvents.push(function (b, g) { if ( ((f.plotOptions = b.getOptions()), "boolean" == typeof f.plotOptions.tooltip && ((f.plotOptions.tooltipOpts.show = f.plotOptions.tooltip), (f.plotOptions.tooltip = f.plotOptions.tooltipOpts), delete f.plotOptions.tooltipOpts), f.plotOptions.tooltip.show !== !1 && "undefined" != typeof f.plotOptions.tooltip.show) ) { (f.tooltipOptions = f.plotOptions.tooltip), f.tooltipOptions.$compat ? ((f.wfunc = "width"), (f.hfunc = "height")) : ((f.wfunc = "innerWidth"), (f.hfunc = "innerHeight")); f.getDomElement(); a(b.getPlaceholder()).bind("plothover", e), f.tooltipOptions.clickTips && a(b.getPlaceholder()).bind("plotclick", d), (f.clickmode = !1), a(g).bind("mousemove", c); } }), b.hooks.shutdown.push(function (b, f) { a(b.getPlaceholder()).unbind("plothover", e), a(b.getPlaceholder()).unbind("plotclick", d), b.removeTooltip(), a(f).unbind("mousemove", c); }), (b.setTooltipPosition = function (b) { var c = f.getDomElement(), d = c.outerWidth() + f.tooltipOptions.shifts.x, e = c.outerHeight() + f.tooltipOptions.shifts.y; b.x - a(window).scrollLeft() > a(window)[f.wfunc]() - d && ((b.x -= d), (b.x = Math.max(b.x, 0))), b.y - a(window).scrollTop() > a(window)[f.hfunc]() - e && (b.y -= e), isNaN(b.x) ? (f.tipPosition.x = f.tipPosition.xPrev) : ((f.tipPosition.x = b.x), (f.tipPosition.xPrev = b.x)), isNaN(b.y) ? (f.tipPosition.y = f.tipPosition.yPrev) : ((f.tipPosition.y = b.y), (f.tipPosition.yPrev = b.y)); }), (b.showTooltip = function (a, c, d) { var e = f.getDomElement(), g = f.stringFormat(f.tooltipOptions.content, a); "" !== g && (e.html(g), b.setTooltipPosition({ x: f.tipPosition.x, y: f.tipPosition.y }), e .css({ left: f.tipPosition.x + f.tooltipOptions.shifts.x, top: f.tipPosition.y + f.tooltipOptions.shifts.y, }) .show(), "function" == typeof f.tooltipOptions.onHover && f.tooltipOptions.onHover(a, e)); }), (b.hideTooltip = function () { f.getDomElement().hide().html(""); }), (b.removeTooltip = function () { f.getDomElement().remove(); }); }), (c.prototype.getDomElement = function () { var b = a("
"); return ( this.tooltipOptions && this.tooltipOptions.cssClass && ((b = a("." + this.tooltipOptions.cssClass)), 0 === b.length && ((b = a("
").addClass(this.tooltipOptions.cssClass)), b.appendTo("body").hide().css({ position: "absolute" }), this.tooltipOptions.defaultTheme && b.css({ background: "#fff", "z-index": "1040", padding: "0.4em 0.6em", "border-radius": "0.5em", "font-size": "0.8em", border: "1px solid #111", display: "none", "white-space": "nowrap", }))), b ); }), (c.prototype.stringFormat = function (a, b) { var c, d, e, f, g, h = /%p\.{0,1}(\d{0,})/, i = /%s/, j = /%c/, k = /%lx/, l = /%ly/, m = /%x\.{0,1}(\d{0,})/, n = /%y\.{0,1}(\d{0,})/, o = "%x", p = "%y", q = "%ct", r = "%n"; if ( ("undefined" != typeof b.series.threshold ? ((c = b.datapoint[0]), (d = b.datapoint[1]), (e = b.datapoint[2])) : "undefined" != typeof b.series.curvedLines ? ((c = b.datapoint[0]), (d = b.datapoint[1])) : "undefined" != typeof b.series.lines && b.series.lines.steps ? ((c = b.series.datapoints.points[2 * b.dataIndex]), (d = b.series.datapoints.points[2 * b.dataIndex + 1]), (e = "")) : ((c = b.series.data[b.dataIndex][0]), (d = b.series.data[b.dataIndex][1]), (e = b.series.data[b.dataIndex][2])), null === b.series.label && b.series.originSeries && (b.series.label = b.series.originSeries.label), "function" == typeof a && (a = a(b.series.label, c, d, b)), "boolean" == typeof a && !a) ) return ""; if ( (e && (a = a.replace(q, e)), "undefined" != typeof b.series.percent ? (f = b.series.percent) : "undefined" != typeof b.series.percents && (f = b.series.percents[b.dataIndex]), "number" == typeof f && (a = this.adjustValPrecision(h, a, f)), b.series.hasOwnProperty("pie") && "undefined" != typeof b.series.data[0][1] && (g = b.series.data[0][1]), "number" == typeof g && (a = a.replace(r, g)), (a = "undefined" != typeof b.series.label ? a.replace(i, b.series.label) : a.replace(i, "")), (a = "undefined" != typeof b.series.color ? a.replace(j, b.series.color) : a.replace(j, "")), (a = this.hasAxisLabel("xaxis", b) ? a.replace(k, b.series.xaxis.options.axisLabel) : a.replace(k, "")), (a = this.hasAxisLabel("yaxis", b) ? a.replace(l, b.series.yaxis.options.axisLabel) : a.replace(l, "")), this.isTimeMode("xaxis", b) && this.isXDateFormat(b) && (a = a.replace( m, this.timestampToDate( c, this.tooltipOptions.xDateFormat, b.series.xaxis.options ) )), this.isTimeMode("yaxis", b) && this.isYDateFormat(b) && (a = a.replace( n, this.timestampToDate( d, this.tooltipOptions.yDateFormat, b.series.yaxis.options ) )), "number" == typeof c && (a = this.adjustValPrecision(m, a, c)), "number" == typeof d && (a = this.adjustValPrecision(n, a, d)), "undefined" != typeof b.series.xaxis.ticks) ) { var s; s = this.hasRotatedXAxisTicks(b) ? "rotatedTicks" : "ticks"; var t = b.dataIndex + b.seriesIndex; for (var u in b.series.xaxis[s]) if ( b.series.xaxis[s].hasOwnProperty(t) && !this.isTimeMode("xaxis", b) ) { var v = this.isCategoriesMode("xaxis", b) ? b.series.xaxis[s][t].label : b.series.xaxis[s][t].v; v === c && (a = a.replace( m, b.series.xaxis[s][t].label.replace(/\$/g, "$$$$") )); } } if ("undefined" != typeof b.series.yaxis.ticks) for (var w in b.series.yaxis.ticks) if (b.series.yaxis.ticks.hasOwnProperty(w)) { var x = this.isCategoriesMode("yaxis", b) ? b.series.yaxis.ticks[w].label : b.series.yaxis.ticks[w].v; x === d && (a = a.replace( n, b.series.yaxis.ticks[w].label.replace(/\$/g, "$$$$") )); } return ( "undefined" != typeof b.series.xaxis.tickFormatter && (a = a.replace( o, b.series.xaxis.tickFormatter(c, b.series.xaxis).replace(/\$/g, "$$") )), "undefined" != typeof b.series.yaxis.tickFormatter && (a = a.replace( p, b.series.yaxis.tickFormatter(d, b.series.yaxis).replace(/\$/g, "$$") )), a ); }), (c.prototype.isTimeMode = function (a, b) { return ( "undefined" != typeof b.series[a].options.mode && "time" === b.series[a].options.mode ); }), (c.prototype.isXDateFormat = function (a) { return ( "undefined" != typeof this.tooltipOptions.xDateFormat && null !== this.tooltipOptions.xDateFormat ); }), (c.prototype.isYDateFormat = function (a) { return ( "undefined" != typeof this.tooltipOptions.yDateFormat && null !== this.tooltipOptions.yDateFormat ); }), (c.prototype.isCategoriesMode = function (a, b) { return ( "undefined" != typeof b.series[a].options.mode && "categories" === b.series[a].options.mode ); }), (c.prototype.timestampToDate = function (b, c, d) { var e = a.plot.dateGenerator(b, d); return a.plot.formatDate( e, c, this.tooltipOptions.monthNames, this.tooltipOptions.dayNames ); }), (c.prototype.adjustValPrecision = function (a, b, c) { var d, e = b.match(a); return ( null !== e && "" !== RegExp.$1 && ((d = RegExp.$1), (c = c.toFixed(d)), (b = b.replace(a, c))), b ); }), (c.prototype.hasAxisLabel = function (b, c) { return ( -1 !== a.inArray("axisLabels", this.plotPlugins) && "undefined" != typeof c.series[b].options.axisLabel && c.series[b].options.axisLabel.length > 0 ); }), (c.prototype.hasRotatedXAxisTicks = function (b) { return ( -1 !== a.inArray("tickRotor", this.plotPlugins) && "undefined" != typeof b.series.xaxis.rotatedTicks ); }); var d = function (a) { new c(a); }; a.plot.plugins.push({ init: d, options: b, name: "tooltip", version: "0.8.5", }); })(jQuery);