|
|
|
@ -29,10 +29,10 @@ Licensed under the MIT license.
|
|
|
|
|
* V. 1.1: Fix error handling so e.g. parsing an empty string does
|
|
|
|
|
* produce a color rather than just crashing.
|
|
|
|
|
*/
|
|
|
|
|
(function($){$.color={};$.color.make=function(r,g,b,a){var o={};o.r=r||0;o.g=g||0;o.b=b||0;o.a=a!=null?a:1;o.add=function(c,d){for(var i=0;i<c.length;++i)o[c.charAt(i)]+=d;return o.normalize()};o.scale=function(c,f){for(var i=0;i<c.length;++i)o[c.charAt(i)]*=f;return o.normalize()};o.toString=function(){if(o.a>=1){return"rgb("+[o.r,o.g,o.b].join(",")+")"}else{return"rgba("+[o.r,o.g,o.b,o.a].join(",")+")"}};o.normalize=function(){function clamp(min,value,max){return value<min?min:value>max?max:value}o.r=clamp(0,parseInt(o.r),255);o.g=clamp(0,parseInt(o.g),255);o.b=clamp(0,parseInt(o.b),255);o.a=clamp(0,o.a,1);return o};o.clone=function(){return $.color.make(o.r,o.b,o.g,o.a)};return o.normalize()};$.color.extract=function(elem,css){var c;do{c=elem.css(css).toLowerCase();if(c!=""&&c!="transparent")break;elem=elem.parent()}while(elem.length&&!$.nodeName(elem.get(0),"body"));if(c=="rgba(0, 0, 0, 0)")c="transparent";return $.color.parse(c)};$.color.parse=function(str){var res,m=$.color.make;if(res=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10));if(res=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseInt(res[1],10),parseInt(res[2],10),parseInt(res[3],10),parseFloat(res[4]));if(res=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55);if(res=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str))return m(parseFloat(res[1])*2.55,parseFloat(res[2])*2.55,parseFloat(res[3])*2.55,parseFloat(res[4]));if(res=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str))return m(parseInt(res[1],16),parseInt(res[2],16),parseInt(res[3],16));if(res=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str))return m(parseInt(res[1]+res[1],16),parseInt(res[2]+res[2],16),parseInt(res[3]+res[3],16));var name=$.trim(str).toLowerCase();if(name=="transparent")return m(255,255,255,0);else{res=lookupColors[name]||[0,0,0];return m(res[0],res[1],res[2])}};var lookupColors={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);
|
|
|
|
|
(function ($) { $.color = {}; $.color.make = function (r, g, b, a) { var o = {}; o.r = r || 0; o.g = g || 0; o.b = b || 0; o.a = a != null ? a : 1; o.add = function (c, d) { for (var i = 0; i < c.length; ++i)o[c.charAt(i)] += d; return o.normalize() }; o.scale = function (c, f) { for (var i = 0; i < c.length; ++i)o[c.charAt(i)] *= f; return o.normalize() }; o.toString = function () { if (o.a >= 1) { return "rgb(" + [o.r, o.g, o.b].join(",") + ")" } else { return "rgba(" + [o.r, o.g, o.b, o.a].join(",") + ")" } }; o.normalize = function () { function clamp(min, value, max) { return value < min ? min : value > max ? max : value } o.r = clamp(0, parseInt(o.r), 255); o.g = clamp(0, parseInt(o.g), 255); o.b = clamp(0, parseInt(o.b), 255); o.a = clamp(0, o.a, 1); return o }; o.clone = function () { return $.color.make(o.r, o.b, o.g, o.a) }; return o.normalize() }; $.color.extract = function (elem, css) { var c; do { c = elem.css(css).toLowerCase(); if (c != "" && c != "transparent") break; elem = elem.parent() } while (elem.length && !$.nodeName(elem.get(0), "body")); if (c == "rgba(0, 0, 0, 0)") c = "transparent"; return $.color.parse(c) }; $.color.parse = function (str) { var res, m = $.color.make; if (res = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(str)) return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10)); if (res = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) return m(parseInt(res[1], 10), parseInt(res[2], 10), parseInt(res[3], 10), parseFloat(res[4])); if (res = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(str)) return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55); if (res = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(str)) return m(parseFloat(res[1]) * 2.55, parseFloat(res[2]) * 2.55, parseFloat(res[3]) * 2.55, parseFloat(res[4])); if (res = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(str)) return m(parseInt(res[1], 16), parseInt(res[2], 16), parseInt(res[3], 16)); if (res = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(str)) return m(parseInt(res[1] + res[1], 16), parseInt(res[2] + res[2], 16), parseInt(res[3] + res[3], 16)); var name = $.trim(str).toLowerCase(); if (name == "transparent") return m(255, 255, 255, 0); else { res = lookupColors[name] || [0, 0, 0]; return m(res[0], res[1], res[2]) } }; var lookupColors = { aqua: [0, 255, 255], azure: [240, 255, 255], beige: [245, 245, 220], black: [0, 0, 0], blue: [0, 0, 255], brown: [165, 42, 42], cyan: [0, 255, 255], darkblue: [0, 0, 139], darkcyan: [0, 139, 139], darkgrey: [169, 169, 169], darkgreen: [0, 100, 0], darkkhaki: [189, 183, 107], darkmagenta: [139, 0, 139], darkolivegreen: [85, 107, 47], darkorange: [255, 140, 0], darkorchid: [153, 50, 204], darkred: [139, 0, 0], darksalmon: [233, 150, 122], darkviolet: [148, 0, 211], fuchsia: [255, 0, 255], gold: [255, 215, 0], green: [0, 128, 0], indigo: [75, 0, 130], khaki: [240, 230, 140], lightblue: [173, 216, 230], lightcyan: [224, 255, 255], lightgreen: [144, 238, 144], lightgrey: [211, 211, 211], lightpink: [255, 182, 193], lightyellow: [255, 255, 224], lime: [0, 255, 0], magenta: [255, 0, 255], maroon: [128, 0, 0], navy: [0, 0, 128], olive: [128, 128, 0], orange: [255, 165, 0], pink: [255, 192, 203], purple: [128, 0, 128], violet: [128, 0, 128], red: [255, 0, 0], silver: [192, 192, 192], white: [255, 255, 255], yellow: [255, 255, 0] } })(jQuery);
|
|
|
|
|
|
|
|
|
|
// the actual Flot code
|
|
|
|
|
(function($) {
|
|
|
|
|
(function ($) {
|
|
|
|
|
|
|
|
|
|
// Cache the prototype hasOwnProperty for faster access
|
|
|
|
|
|
|
|
|
@ -45,10 +45,10 @@ Licensed under the MIT license.
|
|
|
|
|
// Do not merge this into Flot 0.9, since it requires jQuery 1.4.4+.
|
|
|
|
|
|
|
|
|
|
if (!$.fn.detach) {
|
|
|
|
|
$.fn.detach = function() {
|
|
|
|
|
return this.each(function() {
|
|
|
|
|
$.fn.detach = function () {
|
|
|
|
|
return this.each(function () {
|
|
|
|
|
if (this.parentNode) {
|
|
|
|
|
this.parentNode.removeChild( this );
|
|
|
|
|
this.parentNode.removeChild(this);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
@ -129,7 +129,7 @@ Licensed under the MIT license.
|
|
|
|
|
// @param {number} width New width of the canvas, in pixels.
|
|
|
|
|
// @param {number} width New height of the canvas, in pixels.
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.resize = function(width, height) {
|
|
|
|
|
Canvas.prototype.resize = function (width, height) {
|
|
|
|
|
|
|
|
|
|
if (width <= 0 || height <= 0) {
|
|
|
|
|
throw new Error("Invalid dimensions for plot, width = " + width + ", height = " + height);
|
|
|
|
@ -174,13 +174,13 @@ Licensed under the MIT license.
|
|
|
|
|
|
|
|
|
|
// Clears the entire canvas area, not including any overlaid HTML text
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.clear = function() {
|
|
|
|
|
Canvas.prototype.clear = function () {
|
|
|
|
|
this.context.clearRect(0, 0, this.width, this.height);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Finishes rendering the canvas, including managing the text overlay.
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.render = function() {
|
|
|
|
|
Canvas.prototype.render = function () {
|
|
|
|
|
|
|
|
|
|
var cache = this._textCache;
|
|
|
|
|
|
|
|
|
@ -236,7 +236,7 @@ Licensed under the MIT license.
|
|
|
|
|
// uniquely identify the text layer.
|
|
|
|
|
// @return {object} The jQuery-wrapped text-layer div.
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.getTextLayer = function(classes) {
|
|
|
|
|
Canvas.prototype.getTextLayer = function (classes) {
|
|
|
|
|
|
|
|
|
|
var layer = this.text[classes];
|
|
|
|
|
|
|
|
|
@ -315,7 +315,7 @@ Licensed under the MIT license.
|
|
|
|
|
// @param {number=} width Maximum width of the text before it wraps.
|
|
|
|
|
// @return {object} a text info object.
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.getTextInfo = function(layer, text, font, angle, width) {
|
|
|
|
|
Canvas.prototype.getTextInfo = function (layer, text, font, angle, width) {
|
|
|
|
|
|
|
|
|
|
var textStyle, layerCache, styleCache, info;
|
|
|
|
|
|
|
|
|
@ -401,7 +401,7 @@ Licensed under the MIT license.
|
|
|
|
|
// @param {string=} valign Vertical alignment of the text; either "top",
|
|
|
|
|
// "middle" or "bottom".
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.addText = function(layer, x, y, text, font, angle, width, halign, valign) {
|
|
|
|
|
Canvas.prototype.addText = function (layer, x, y, text, font, angle, width, halign, valign) {
|
|
|
|
|
|
|
|
|
|
var info = this.getTextInfo(layer, text, font, angle, width),
|
|
|
|
|
positions = info.positions;
|
|
|
|
@ -474,7 +474,7 @@ Licensed under the MIT license.
|
|
|
|
|
// @param {number=} angle Angle at which the text is rotated, in degrees.
|
|
|
|
|
// Angle is currently unused, it will be implemented in the future.
|
|
|
|
|
|
|
|
|
|
Canvas.prototype.removeText = function(layer, x, y, text, font, angle) {
|
|
|
|
|
Canvas.prototype.removeText = function (layer, x, y, text, font, angle) {
|
|
|
|
|
if (text == null) {
|
|
|
|
|
var layerCache = this._textCache[layer];
|
|
|
|
|
if (layerCache != null) {
|
|
|
|
@ -610,7 +610,7 @@ Licensed under the MIT license.
|
|
|
|
|
mouseActiveRadius: 10 // how far the mouse can be away to activate an item
|
|
|
|
|
},
|
|
|
|
|
interaction: {
|
|
|
|
|
redrawOverlayInterval: 1000/60 // time between updates, -1 means in same flow
|
|
|
|
|
redrawOverlayInterval: 1000 / 60 // time between updates, -1 means in same flow
|
|
|
|
|
},
|
|
|
|
|
hooks: {}
|
|
|
|
|
},
|
|
|
|
@ -619,7 +619,7 @@ Licensed under the MIT license.
|
|
|
|
|
eventHolder = null, // jQuery object that events should be bound to
|
|
|
|
|
ctx = null, octx = null,
|
|
|
|
|
xaxes = [], yaxes = [],
|
|
|
|
|
plotOffset = { left: 0, right: 0, top: 0, bottom: 0},
|
|
|
|
|
plotOffset = { left: 0, right: 0, top: 0, bottom: 0 },
|
|
|
|
|
plotWidth = 0, plotHeight = 0,
|
|
|
|
|
hooks = {
|
|
|
|
|
processOptions: [],
|
|
|
|
@ -639,9 +639,9 @@ Licensed under the MIT license.
|
|
|
|
|
plot.setData = setData;
|
|
|
|
|
plot.setupGrid = setupGrid;
|
|
|
|
|
plot.draw = draw;
|
|
|
|
|
plot.getPlaceholder = function() { return placeholder; };
|
|
|
|
|
plot.getCanvas = function() { return surface.element; };
|
|
|
|
|
plot.getPlotOffset = function() { return plotOffset; };
|
|
|
|
|
plot.getPlaceholder = function () { return placeholder; };
|
|
|
|
|
plot.getCanvas = function () { return surface.element; };
|
|
|
|
|
plot.getPlotOffset = function () { return plotOffset; };
|
|
|
|
|
plot.width = function () { return plotWidth; };
|
|
|
|
|
plot.height = function () { return plotHeight; };
|
|
|
|
|
plot.offset = function () {
|
|
|
|
@ -667,7 +667,7 @@ Licensed under the MIT license.
|
|
|
|
|
plot.highlight = highlight;
|
|
|
|
|
plot.unhighlight = unhighlight;
|
|
|
|
|
plot.triggerRedrawOverlay = triggerRedrawOverlay;
|
|
|
|
|
plot.pointOffset = function(point) {
|
|
|
|
|
plot.pointOffset = function (point) {
|
|
|
|
|
return {
|
|
|
|
|
left: parseInt(xaxes[axisNumber(point, "x") - 1].p2c(+point.x) + plotOffset.left, 10),
|
|
|
|
|
top: parseInt(yaxes[axisNumber(point, "y") - 1].p2c(+point.y) + plotOffset.top, 10)
|
|
|
|
@ -1106,7 +1106,7 @@ Licensed under the MIT license.
|
|
|
|
|
s = series[i];
|
|
|
|
|
s.datapoints = { points: [] };
|
|
|
|
|
|
|
|
|
|
executeHooks(hooks.processRawData, [ s, s.data, s.datapoints ]);
|
|
|
|
|
executeHooks(hooks.processRawData, [s, s.data, s.datapoints]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// first pass: clean and copy data
|
|
|
|
@ -1222,7 +1222,7 @@ Licensed under the MIT license.
|
|
|
|
|
for (i = 0; i < series.length; ++i) {
|
|
|
|
|
s = series[i];
|
|
|
|
|
|
|
|
|
|
executeHooks(hooks.processDatapoints, [ s, s.datapoints]);
|
|
|
|
|
executeHooks(hooks.processDatapoints, [s, s.datapoints]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// second pass: find datamax/datamin for auto-scaling
|
|
|
|
@ -1303,7 +1303,7 @@ Licensed under the MIT license.
|
|
|
|
|
// from a previous plot in this container that we'll try to re-use.
|
|
|
|
|
|
|
|
|
|
placeholder.css("padding", 0) // padding messes up the positioning
|
|
|
|
|
.children().filter(function(){
|
|
|
|
|
.children().filter(function () {
|
|
|
|
|
return !$(this).hasClass("flot-overlay") && !$(this).hasClass('flot-base');
|
|
|
|
|
}).remove();
|
|
|
|
|
|
|
|
|
@ -1445,7 +1445,7 @@ Licensed under the MIT license.
|
|
|
|
|
|
|
|
|
|
// Determine the axis's position in its direction and on its side
|
|
|
|
|
|
|
|
|
|
$.each(isXAxis ? xaxes : yaxes, function(i, a) {
|
|
|
|
|
$.each(isXAxis ? xaxes : yaxes, function (i, a) {
|
|
|
|
|
if (a && (a.show || a.reserveSpace)) {
|
|
|
|
|
if (a === axis) {
|
|
|
|
|
found = true;
|
|
|
|
@ -1535,7 +1535,7 @@ Licensed under the MIT license.
|
|
|
|
|
if (minMargin == null) {
|
|
|
|
|
minMargin = 0;
|
|
|
|
|
for (i = 0; i < series.length; ++i)
|
|
|
|
|
minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth/2));
|
|
|
|
|
minMargin = Math.max(minMargin, 2 * (series[i].points.radius + series[i].points.lineWidth / 2));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var margins = {
|
|
|
|
@ -1581,7 +1581,7 @@ Licensed under the MIT license.
|
|
|
|
|
// If the grid is visible, add its border width to the offset
|
|
|
|
|
|
|
|
|
|
for (var a in plotOffset) {
|
|
|
|
|
if(typeof(options.grid.borderWidth) == "object") {
|
|
|
|
|
if (typeof (options.grid.borderWidth) == "object") {
|
|
|
|
|
plotOffset[a] += showGrid ? options.grid.borderWidth[a] : 0;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
@ -2125,20 +2125,20 @@ Licensed under the MIT license.
|
|
|
|
|
// If either borderWidth or borderColor is an object, then draw the border
|
|
|
|
|
// line by line instead of as one rectangle
|
|
|
|
|
bc = options.grid.borderColor;
|
|
|
|
|
if(typeof bw == "object" || typeof bc == "object") {
|
|
|
|
|
if (typeof bw == "object" || typeof bc == "object") {
|
|
|
|
|
if (typeof bw !== "object") {
|
|
|
|
|
bw = {top: bw, right: bw, bottom: bw, left: bw};
|
|
|
|
|
bw = { top: bw, right: bw, bottom: bw, left: bw };
|
|
|
|
|
}
|
|
|
|
|
if (typeof bc !== "object") {
|
|
|
|
|
bc = {top: bc, right: bc, bottom: bc, left: bc};
|
|
|
|
|
bc = { top: bc, right: bc, bottom: bc, left: bc };
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bw.top > 0) {
|
|
|
|
|
ctx.strokeStyle = bc.top;
|
|
|
|
|
ctx.lineWidth = bw.top;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(0 - bw.left, 0 - bw.top/2);
|
|
|
|
|
ctx.lineTo(plotWidth, 0 - bw.top/2);
|
|
|
|
|
ctx.moveTo(0 - bw.left, 0 - bw.top / 2);
|
|
|
|
|
ctx.lineTo(plotWidth, 0 - bw.top / 2);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2164,15 +2164,15 @@ Licensed under the MIT license.
|
|
|
|
|
ctx.strokeStyle = bc.left;
|
|
|
|
|
ctx.lineWidth = bw.left;
|
|
|
|
|
ctx.beginPath();
|
|
|
|
|
ctx.moveTo(0 - bw.left/2, plotHeight + bw.bottom);
|
|
|
|
|
ctx.lineTo(0- bw.left/2, 0);
|
|
|
|
|
ctx.moveTo(0 - bw.left / 2, plotHeight + bw.bottom);
|
|
|
|
|
ctx.lineTo(0 - bw.left / 2, 0);
|
|
|
|
|
ctx.stroke();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ctx.lineWidth = bw;
|
|
|
|
|
ctx.strokeStyle = options.grid.borderColor;
|
|
|
|
|
ctx.strokeRect(-bw/2, -bw/2, plotWidth + bw, plotHeight + bw);
|
|
|
|
|
ctx.strokeRect(-bw / 2, -bw / 2, plotWidth + bw, plotHeight + bw);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2472,10 +2472,10 @@ Licensed under the MIT license.
|
|
|
|
|
ctx.lineWidth = sw;
|
|
|
|
|
ctx.strokeStyle = "rgba(0,0,0,0.1)";
|
|
|
|
|
// position shadow at angle from the mid of line
|
|
|
|
|
var angle = Math.PI/18;
|
|
|
|
|
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/2), Math.cos(angle) * (lw/2 + sw/2), series.xaxis, series.yaxis);
|
|
|
|
|
ctx.lineWidth = sw/2;
|
|
|
|
|
plotLine(series.datapoints, Math.sin(angle) * (lw/2 + sw/4), Math.cos(angle) * (lw/2 + sw/4), series.xaxis, series.yaxis);
|
|
|
|
|
var angle = Math.PI / 18;
|
|
|
|
|
plotLine(series.datapoints, Math.sin(angle) * (lw / 2 + sw / 2), Math.cos(angle) * (lw / 2 + sw / 2), series.xaxis, series.yaxis);
|
|
|
|
|
ctx.lineWidth = sw / 2;
|
|
|
|
|
plotLine(series.datapoints, Math.sin(angle) * (lw / 2 + sw / 4), Math.cos(angle) * (lw / 2 + sw / 4), series.xaxis, series.yaxis);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ctx.lineWidth = lw;
|
|
|
|
@ -2530,7 +2530,7 @@ Licensed under the MIT license.
|
|
|
|
|
// Doing the conditional here allows the shadow setting to still be
|
|
|
|
|
// optional even with a lineWidth of 0.
|
|
|
|
|
|
|
|
|
|
if( lw == 0 )
|
|
|
|
|
if (lw == 0)
|
|
|
|
|
lw = 0.0001;
|
|
|
|
|
|
|
|
|
|
if (lw > 0 && sw > 0) {
|
|
|
|
@ -2538,11 +2538,11 @@ Licensed under the MIT license.
|
|
|
|
|
var w = sw / 2;
|
|
|
|
|
ctx.lineWidth = w;
|
|
|
|
|
ctx.strokeStyle = "rgba(0,0,0,0.1)";
|
|
|
|
|
plotPoints(series.datapoints, radius, null, w + w/2, true,
|
|
|
|
|
plotPoints(series.datapoints, radius, null, w + w / 2, true,
|
|
|
|
|
series.xaxis, series.yaxis, symbol);
|
|
|
|
|
|
|
|
|
|
ctx.strokeStyle = "rgba(0,0,0,0.2)";
|
|
|
|
|
plotPoints(series.datapoints, radius, null, w/2, true,
|
|
|
|
|
plotPoints(series.datapoints, radius, null, w / 2, true,
|
|
|
|
|
series.xaxis, series.yaxis, symbol);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -2748,7 +2748,7 @@ Licensed under the MIT license.
|
|
|
|
|
entries.reverse();
|
|
|
|
|
} else {
|
|
|
|
|
var ascending = options.legend.sorted != "descending";
|
|
|
|
|
entries.sort(function(a, b) {
|
|
|
|
|
entries.sort(function (a, b) {
|
|
|
|
|
return a.label == b.label ? 0 : (
|
|
|
|
|
(a.label < b.label) != ascending ? 1 : -1 // Logical XOR
|
|
|
|
|
);
|
|
|
|
@ -2798,7 +2798,7 @@ Licensed under the MIT license.
|
|
|
|
|
pos += 'right:' + (m[0] + plotOffset.right) + 'px;';
|
|
|
|
|
else if (p.charAt(1) == "w")
|
|
|
|
|
pos += 'left:' + (m[0] + plotOffset.left) + 'px;';
|
|
|
|
|
var legend = $('<div class="legend">' + table.replace('style="', 'style="position:absolute;' + pos +';') + '</div>').appendTo(placeholder);
|
|
|
|
|
var legend = $('<div class="bg_222_important">' + table.replace('style="', 'style="position:absolute;' + pos + ';') + '</div>').appendTo(placeholder);
|
|
|
|
|
if (options.legend.backgroundOpacity != 0.0) {
|
|
|
|
|
// put in the transparent background
|
|
|
|
|
// separately to avoid blended labels and
|
|
|
|
@ -2814,7 +2814,7 @@ Licensed under the MIT license.
|
|
|
|
|
c = c.toString();
|
|
|
|
|
}
|
|
|
|
|
var div = legend.children();
|
|
|
|
|
$('<div style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos +'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
|
|
|
|
|
$('<div class="" style="position:absolute;width:' + div.width() + 'px;height:' + div.height() + 'px;' + pos + 'background-color:' + c + ';"> </div>').prependTo(legend).css('opacity', options.legend.backgroundOpacity);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -2917,10 +2917,12 @@ Licensed under the MIT license.
|
|
|
|
|
j = item[1];
|
|
|
|
|
ps = series[i].datapoints.pointsize;
|
|
|
|
|
|
|
|
|
|
return { datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
|
|
|
|
|
return {
|
|
|
|
|
datapoint: series[i].datapoints.points.slice(j * ps, (j + 1) * ps),
|
|
|
|
|
dataIndex: j,
|
|
|
|
|
series: series[i],
|
|
|
|
|
seriesIndex: i };
|
|
|
|
|
seriesIndex: i
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
@ -2977,7 +2979,7 @@ Licensed under the MIT license.
|
|
|
|
|
highlight(item.series, item.datapoint, eventname);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
placeholder.trigger(eventname, [ pos, item ]);
|
|
|
|
|
placeholder.trigger(eventname, [pos, item]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function triggerRedrawOverlay() {
|
|
|
|
@ -3141,7 +3143,7 @@ Licensed under the MIT license.
|
|
|
|
|
|
|
|
|
|
// Add the plot function to the top level of the jQuery object
|
|
|
|
|
|
|
|
|
|
$.plot = function(placeholder, data, options) {
|
|
|
|
|
$.plot = function (placeholder, data, options) {
|
|
|
|
|
//var t0 = new Date();
|
|
|
|
|
var plot = new Plot($(placeholder), data, options, $.plot.plugins);
|
|
|
|
|
//(window.console ? console.log : alert)("time used (msecs): " + ((new Date()).getTime() - t0.getTime()));
|
|
|
|
@ -3154,8 +3156,8 @@ Licensed under the MIT license.
|
|
|
|
|
|
|
|
|
|
// Also add the plot function as a chainable property
|
|
|
|
|
|
|
|
|
|
$.fn.plot = function(data, options) {
|
|
|
|
|
return this.each(function() {
|
|
|
|
|
$.fn.plot = function (data, options) {
|
|
|
|
|
return this.each(function () {
|
|
|
|
|
$.plot(this, data, options);
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|