/*
* 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);