You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
406 lines
14 KiB
406 lines
14 KiB
/* |
|
* 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("<div>"); |
|
return ( |
|
this.tooltipOptions && |
|
this.tooltipOptions.cssClass && |
|
((b = a("." + this.tooltipOptions.cssClass)), |
|
0 === b.length && |
|
((b = a("<div />").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);
|
|
|