http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.js
new file mode 100644
index 0000000..9c19db9
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.js
@@ -0,0 +1,820 @@
+/* Flot plugin for rendering pie charts.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+The plugin assumes that each series has a single data value, and that each
+value is a positive integer or zero.  Negative numbers don't make sense for a
+pie chart, and have unpredictable results.  The values do NOT need to be
+passed in as percentages; the plugin will calculate the total and per-slice
+percentages internally.
+
+* Created by Brian Medendorp
+
+* Updated with contributions from btburnett3, Anthony Aragues and Xavi Ivars
+
+The plugin supports these options:
+
+       series: {
+               pie: {
+                       show: true/false
+                       radius: 0-1 for percentage of fullsize, or a specified 
pixel length, or 'auto'
+                       innerRadius: 0-1 for percentage of fullsize or a 
specified pixel length, for creating a donut effect
+                       startAngle: 0-2 factor of PI used for starting angle 
(in radians) i.e 3/2 starts at the top, 0 and 2 have the same result
+                       tilt: 0-1 for percentage to tilt the pie, where 1 is no 
tilt, and 0 is completely flat (nothing will show)
+                       offset: {
+                               top: integer value to move the pie up or down
+                               left: integer value to move the pie left or 
right, or 'auto'
+                       },
+                       stroke: {
+                               color: any hexidecimal color value (other 
formats may or may not work, so best to stick with something like '#FFF')
+                               width: integer pixel width of the stroke
+                       },
+                       label: {
+                               show: true/false, or 'auto'
+                               formatter:  a user-defined function that 
modifies the text/style of the label text
+                               radius: 0-1 for percentage of fullsize, or a 
specified pixel length
+                               background: {
+                                       color: any hexidecimal color value 
(other formats may or may not work, so best to stick with something like '#000')
+                                       opacity: 0-1
+                               },
+                               threshold: 0-1 for the percentage value at 
which to hide labels (if they're too small)
+                       },
+                       combine: {
+                               threshold: 0-1 for the percentage value at 
which to combine slices (if they're too small)
+                               color: any hexidecimal color value (other 
formats may or may not work, so best to stick with something like '#CCC'), if 
null, the plugin will automatically use the color of the first slice to be 
combined
+                               label: any text value of what the combined 
slice should be labeled
+                       }
+                       highlight: {
+                               opacity: 0-1
+                       }
+               }
+       }
+
+More detail and specific examples can be found in the included HTML file.
+
+*/
+
+(function($) {
+
+       // Maximum redraw attempts when fitting labels within the plot
+
+       var REDRAW_ATTEMPTS = 10;
+
+       // Factor by which to shrink the pie when fitting labels within the plot
+
+       var REDRAW_SHRINK = 0.95;
+
+       function init(plot) {
+
+               var canvas = null,
+                       target = null,
+                       options = null,
+                       maxRadius = null,
+                       centerLeft = null,
+                       centerTop = null,
+                       processed = false,
+                       ctx = null;
+
+               // interactive variables
+
+               var highlights = [];
+
+               // add hook to determine if pie plugin in enabled, and then 
perform necessary operations
+
+               plot.hooks.processOptions.push(function(plot, options) {
+                       if (options.series.pie.show) {
+
+                               options.grid.show = false;
+
+                               // set labels.show
+
+                               if (options.series.pie.label.show == "auto") {
+                                       if (options.legend.show) {
+                                               options.series.pie.label.show = 
false;
+                                       } else {
+                                               options.series.pie.label.show = 
true;
+                                       }
+                               }
+
+                               // set radius
+
+                               if (options.series.pie.radius == "auto") {
+                                       if (options.series.pie.label.show) {
+                                               options.series.pie.radius = 3/4;
+                                       } else {
+                                               options.series.pie.radius = 1;
+                                       }
+                               }
+
+                               // ensure sane tilt
+
+                               if (options.series.pie.tilt > 1) {
+                                       options.series.pie.tilt = 1;
+                               } else if (options.series.pie.tilt < 0) {
+                                       options.series.pie.tilt = 0;
+                               }
+                       }
+               });
+
+               plot.hooks.bindEvents.push(function(plot, eventHolder) {
+                       var options = plot.getOptions();
+                       if (options.series.pie.show) {
+                               if (options.grid.hoverable) {
+                                       
eventHolder.unbind("mousemove").mousemove(onMouseMove);
+                               }
+                               if (options.grid.clickable) {
+                                       
eventHolder.unbind("click").click(onClick);
+                               }
+                       }
+               });
+
+               plot.hooks.processDatapoints.push(function(plot, series, data, 
datapoints) {
+                       var options = plot.getOptions();
+                       if (options.series.pie.show) {
+                               processDatapoints(plot, series, data, 
datapoints);
+                       }
+               });
+
+               plot.hooks.drawOverlay.push(function(plot, octx) {
+                       var options = plot.getOptions();
+                       if (options.series.pie.show) {
+                               drawOverlay(plot, octx);
+                       }
+               });
+
+               plot.hooks.draw.push(function(plot, newCtx) {
+                       var options = plot.getOptions();
+                       if (options.series.pie.show) {
+                               draw(plot, newCtx);
+                       }
+               });
+
+               function processDatapoints(plot, series, datapoints) {
+                       if (!processed) {
+                               processed = true;
+                               canvas = plot.getCanvas();
+                               target = $(canvas).parent();
+                               options = plot.getOptions();
+                               plot.setData(combine(plot.getData()));
+                       }
+               }
+
+               function combine(data) {
+
+                       var total = 0,
+                               combined = 0,
+                               numCombined = 0,
+                               color = options.series.pie.combine.color,
+                               newdata = [];
+
+                       // Fix up the raw data from Flot, ensuring the data is 
numeric
+
+                       for (var i = 0; i < data.length; ++i) {
+
+                               var value = data[i].data;
+
+                               // If the data is an array, we'll assume that 
it's a standard
+                               // Flot x-y pair, and are concerned only with 
the second value.
+
+                               // Note how we use the original array, rather 
than creating a
+                               // new one; this is more efficient and 
preserves any extra data
+                               // that the user may have stored in higher 
indexes.
+
+                               if ($.isArray(value) && value.length == 1) {
+                               value = value[0];
+                               }
+
+                               if ($.isArray(value)) {
+                                       // Equivalent to $.isNumeric() but 
compatible with jQuery < 1.7
+                                       if (!isNaN(parseFloat(value[1])) && 
isFinite(value[1])) {
+                                               value[1] = +value[1];
+                                       } else {
+                                               value[1] = 0;
+                                       }
+                               } else if (!isNaN(parseFloat(value)) && 
isFinite(value)) {
+                                       value = [1, +value];
+                               } else {
+                                       value = [1, 0];
+                               }
+
+                               data[i].data = [value];
+                       }
+
+                       // Sum up all the slices, so we can calculate 
percentages for each
+
+                       for (var i = 0; i < data.length; ++i) {
+                               total += data[i].data[0][1];
+                       }
+
+                       // Count the number of slices with percentages below 
the combine
+                       // threshold; if it turns out to be just one, we won't 
combine.
+
+                       for (var i = 0; i < data.length; ++i) {
+                               var value = data[i].data[0][1];
+                               if (value / total <= 
options.series.pie.combine.threshold) {
+                                       combined += value;
+                                       numCombined++;
+                                       if (!color) {
+                                               color = data[i].color;
+                                       }
+                               }
+                       }
+
+                       for (var i = 0; i < data.length; ++i) {
+                               var value = data[i].data[0][1];
+                               if (numCombined < 2 || value / total > 
options.series.pie.combine.threshold) {
+                                       newdata.push(
+                                               $.extend(data[i], {     /* 
extend to allow keeping all other original data values
+                                                                          and 
using them e.g. in labelFormatter. */
+                                                       data: [[1, value]],
+                                                       color: data[i].color,
+                                                       label: data[i].label,
+                                                       angle: value * Math.PI 
* 2 / total,
+                                                       percent: value / (total 
/ 100)
+                                               })
+                                       );
+                               }
+                       }
+
+                       if (numCombined > 1) {
+                               newdata.push({
+                                       data: [[1, combined]],
+                                       color: color,
+                                       label: options.series.pie.combine.label,
+                                       angle: combined * Math.PI * 2 / total,
+                                       percent: combined / (total / 100)
+                               });
+                       }
+
+                       return newdata;
+               }
+
+               function draw(plot, newCtx) {
+
+                       if (!target) {
+                               return; // if no series were passed
+                       }
+
+                       var canvasWidth = plot.getPlaceholder().width(),
+                               canvasHeight = plot.getPlaceholder().height(),
+                               legendWidth = 
target.children().filter(".legend").children().width() || 0;
+
+                       ctx = newCtx;
+
+                       // WARNING: HACK! REWRITE THIS CODE AS SOON AS POSSIBLE!
+
+                       // When combining smaller slices into an 'other' slice, 
we need to
+                       // add a new series.  Since Flot gives plugins no way 
to modify the
+                       // list of series, the pie plugin uses a hack where the 
first call
+                       // to processDatapoints results in a call to setData 
with the new
+                       // list of series, then subsequent processDatapoints do 
nothing.
+
+                       // The plugin-global 'processed' flag is used to 
control this hack;
+                       // it starts out false, and is set to true after the 
first call to
+                       // processDatapoints.
+
+                       // Unfortunately this turns future setData calls into 
no-ops; they
+                       // call processDatapoints, the flag is true, and 
nothing happens.
+
+                       // To fix this we'll set the flag back to false here in 
draw, when
+                       // all series have been processed, so the next sequence 
of calls to
+                       // processDatapoints once again starts out with a 
slice-combine.
+                       // This is really a hack; in 0.9 we need to give 
plugins a proper
+                       // way to modify series before any processing begins.
+
+                       processed = false;
+
+                       // calculate maximum radius and center point
+
+                       maxRadius =  Math.min(canvasWidth, canvasHeight / 
options.series.pie.tilt) / 2;
+                       centerTop = canvasHeight / 2 + 
options.series.pie.offset.top;
+                       centerLeft = canvasWidth / 2;
+
+                       if (options.series.pie.offset.left == "auto") {
+                               if (options.legend.position.match("w")) {
+                                       centerLeft += legendWidth / 2;
+                               } else {
+                                       centerLeft -= legendWidth / 2;
+                               }
+                               if (centerLeft < maxRadius) {
+                                       centerLeft = maxRadius;
+                               } else if (centerLeft > canvasWidth - 
maxRadius) {
+                                       centerLeft = canvasWidth - maxRadius;
+                               }
+                       } else {
+                               centerLeft += options.series.pie.offset.left;
+                       }
+
+                       var slices = plot.getData(),
+                               attempts = 0;
+
+                       // Keep shrinking the pie's radius until drawPie 
returns true,
+                       // indicating that all the labels fit, or we try too 
many times.
+
+                       do {
+                               if (attempts > 0) {
+                                       maxRadius *= REDRAW_SHRINK;
+                               }
+                               attempts += 1;
+                               clear();
+                               if (options.series.pie.tilt <= 0.8) {
+                                       drawShadow();
+                               }
+                       } while (!drawPie() && attempts < REDRAW_ATTEMPTS)
+
+                       if (attempts >= REDRAW_ATTEMPTS) {
+                               clear();
+                               target.prepend("<div class='error'>Could not 
draw pie with labels contained inside canvas</div>");
+                       }
+
+                       if (plot.setSeries && plot.insertLegend) {
+                               plot.setSeries(slices);
+                               plot.insertLegend();
+                       }
+
+                       // we're actually done at this point, just defining 
internal functions at this point
+
+                       function clear() {
+                               ctx.clearRect(0, 0, canvasWidth, canvasHeight);
+                               target.children().filter(".pieLabel, 
.pieLabelBackground").remove();
+                       }
+
+                       function drawShadow() {
+
+                               var shadowLeft = options.series.pie.shadow.left;
+                               var shadowTop = options.series.pie.shadow.top;
+                               var edge = 10;
+                               var alpha = options.series.pie.shadow.alpha;
+                               var radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius;
+
+                               if (radius >= canvasWidth / 2 - shadowLeft || 
radius * options.series.pie.tilt >= canvasHeight / 2 - shadowTop || radius <= 
edge) {
+                                       return; // shadow would be outside 
canvas, so don't draw it
+                               }
+
+                               ctx.save();
+                               ctx.translate(shadowLeft,shadowTop);
+                               ctx.globalAlpha = alpha;
+                               ctx.fillStyle = "#000";
+
+                               // center and rotate to starting position
+
+                               ctx.translate(centerLeft,centerTop);
+                               ctx.scale(1, options.series.pie.tilt);
+
+                               //radius -= edge;
+
+                               for (var i = 1; i <= edge; i++) {
+                                       ctx.beginPath();
+                                       ctx.arc(0, 0, radius, 0, Math.PI * 2, 
false);
+                                       ctx.fill();
+                                       radius -= i;
+                               }
+
+                               ctx.restore();
+                       }
+
+                       function drawPie() {
+
+                               var startAngle = Math.PI * 
options.series.pie.startAngle;
+                               var radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius;
+
+                               // center and rotate to starting position
+
+                               ctx.save();
+                               ctx.translate(centerLeft,centerTop);
+                               ctx.scale(1, options.series.pie.tilt);
+                               //ctx.rotate(startAngle); // start at top; -- 
This doesn't work properly in Opera
+
+                               // draw slices
+
+                               ctx.save();
+                               var currentAngle = startAngle;
+                               for (var i = 0; i < slices.length; ++i) {
+                                       slices[i].startAngle = currentAngle;
+                                       drawSlice(slices[i].angle, 
slices[i].color, true);
+                               }
+                               ctx.restore();
+
+                               // draw slice outlines
+
+                               if (options.series.pie.stroke.width > 0) {
+                                       ctx.save();
+                                       ctx.lineWidth = 
options.series.pie.stroke.width;
+                                       currentAngle = startAngle;
+                                       for (var i = 0; i < slices.length; ++i) 
{
+                                               drawSlice(slices[i].angle, 
options.series.pie.stroke.color, false);
+                                       }
+                                       ctx.restore();
+                               }
+
+                               // draw donut hole
+
+                               drawDonutHole(ctx);
+
+                               ctx.restore();
+
+                               // Draw the labels, returning true if they fit 
within the plot
+
+                               if (options.series.pie.label.show) {
+                                       return drawLabels();
+                               } else return true;
+
+                               function drawSlice(angle, color, fill) {
+
+                                       if (angle <= 0 || isNaN(angle)) {
+                                               return;
+                                       }
+
+                                       if (fill) {
+                                               ctx.fillStyle = color;
+                                       } else {
+                                               ctx.strokeStyle = color;
+                                               ctx.lineJoin = "round";
+                                       }
+
+                                       ctx.beginPath();
+                                       if (Math.abs(angle - Math.PI * 2) > 
0.000000001) {
+                                               ctx.moveTo(0, 0); // Center of 
the pie
+                                       }
+
+                                       //ctx.arc(0, 0, radius, 0, angle, 
false); // This doesn't work properly in Opera
+                                       ctx.arc(0, 0, radius,currentAngle, 
currentAngle + angle / 2, false);
+                                       ctx.arc(0, 0, radius,currentAngle + 
angle / 2, currentAngle + angle, false);
+                                       ctx.closePath();
+                                       //ctx.rotate(angle); // This doesn't 
work properly in Opera
+                                       currentAngle += angle;
+
+                                       if (fill) {
+                                               ctx.fill();
+                                       } else {
+                                               ctx.stroke();
+                                       }
+                               }
+
+                               function drawLabels() {
+
+                                       var currentAngle = startAngle;
+                                       var radius = 
options.series.pie.label.radius > 1 ? options.series.pie.label.radius : 
maxRadius * options.series.pie.label.radius;
+
+                                       for (var i = 0; i < slices.length; ++i) 
{
+                                               if (slices[i].percent >= 
options.series.pie.label.threshold * 100) {
+                                                       if 
(!drawLabel(slices[i], currentAngle, i)) {
+                                                               return false;
+                                                       }
+                                               }
+                                               currentAngle += slices[i].angle;
+                                       }
+
+                                       return true;
+
+                                       function drawLabel(slice, startAngle, 
index) {
+
+                                               if (slice.data[0][1] == 0) {
+                                                       return true;
+                                               }
+
+                                               // format label text
+
+                                               var lf = 
options.legend.labelFormatter, text, plf = options.series.pie.label.formatter;
+
+                                               if (lf) {
+                                                       text = lf(slice.label, 
slice);
+                                               } else {
+                                                       text = slice.label;
+                                               }
+
+                                               if (plf) {
+                                                       text = plf(text, slice);
+                                               }
+
+                                               var halfAngle = ((startAngle + 
slice.angle) + startAngle) / 2;
+                                               var x = centerLeft + 
Math.round(Math.cos(halfAngle) * radius);
+                                               var y = centerTop + 
Math.round(Math.sin(halfAngle) * radius) * options.series.pie.tilt;
+
+                                               var html = "<span 
class='pieLabel' id='pieLabel" + index + "' style='position:absolute;top:" + y 
+ "px;left:" + x + "px;'>" + text + "</span>";
+                                               target.append(html);
+
+                                               var label = 
target.children("#pieLabel" + index);
+                                               var labelTop = (y - 
label.height() / 2);
+                                               var labelLeft = (x - 
label.width() / 2);
+
+                                               label.css("top", labelTop);
+                                               label.css("left", labelLeft);
+
+                                               // check to make sure that the 
label is not outside the canvas
+
+                                               if (0 - labelTop > 0 || 0 - 
labelLeft > 0 || canvasHeight - (labelTop + label.height()) < 0 || canvasWidth 
- (labelLeft + label.width()) < 0) {
+                                                       return false;
+                                               }
+
+                                               if 
(options.series.pie.label.background.opacity != 0) {
+
+                                                       // put in the 
transparent background separately to avoid blended labels and label boxes
+
+                                                       var c = 
options.series.pie.label.background.color;
+
+                                                       if (c == null) {
+                                                               c = slice.color;
+                                                       }
+
+                                                       var pos = "top:" + 
labelTop + "px;left:" + labelLeft + "px;";
+                                                       $("<div 
class='pieLabelBackground' style='position:absolute;width:" + label.width() + 
"px;height:" + label.height() + "px;" + pos + "background-color:" + c + 
";'></div>")
+                                                               .css("opacity", 
options.series.pie.label.background.opacity)
+                                                               
.insertBefore(label);
+                                               }
+
+                                               return true;
+                                       } // end individual label function
+                               } // end drawLabels function
+                       } // end drawPie function
+               } // end draw function
+
+               // Placed here because it needs to be accessed from multiple 
locations
+
+               function drawDonutHole(layer) {
+                       if (options.series.pie.innerRadius > 0) {
+
+                               // subtract the center
+
+                               layer.save();
+                               var innerRadius = 
options.series.pie.innerRadius > 1 ? options.series.pie.innerRadius : maxRadius 
* options.series.pie.innerRadius;
+                               layer.globalCompositeOperation = 
"destination-out"; // this does not work with excanvas, but it will fall back 
to using the stroke color
+                               layer.beginPath();
+                               layer.fillStyle = 
options.series.pie.stroke.color;
+                               layer.arc(0, 0, innerRadius, 0, Math.PI * 2, 
false);
+                               layer.fill();
+                               layer.closePath();
+                               layer.restore();
+
+                               // add inner stroke
+
+                               layer.save();
+                               layer.beginPath();
+                               layer.strokeStyle = 
options.series.pie.stroke.color;
+                               layer.arc(0, 0, innerRadius, 0, Math.PI * 2, 
false);
+                               layer.stroke();
+                               layer.closePath();
+                               layer.restore();
+
+                               // TODO: add extra shadow inside hole (with a 
mask) if the pie is tilted.
+                       }
+               }
+
+               //-- Additional Interactive related functions --
+
+               function isPointInPoly(poly, pt) {
+                       for(var c = false, i = -1, l = poly.length, j = l - 1; 
++i < l; j = i)
+                               ((poly[i][1] <= pt[1] && pt[1] < poly[j][1]) || 
(poly[j][1] <= pt[1] && pt[1]< poly[i][1]))
+                               && (pt[0] < (poly[j][0] - poly[i][0]) * (pt[1] 
- poly[i][1]) / (poly[j][1] - poly[i][1]) + poly[i][0])
+                               && (c = !c);
+                       return c;
+               }
+
+               function findNearbySlice(mouseX, mouseY) {
+
+                       var slices = plot.getData(),
+                               options = plot.getOptions(),
+                               radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius,
+                               x, y;
+
+                       for (var i = 0; i < slices.length; ++i) {
+
+                               var s = slices[i];
+
+                               if (s.pie.show) {
+
+                                       ctx.save();
+                                       ctx.beginPath();
+                                       ctx.moveTo(0, 0); // Center of the pie
+                                       //ctx.scale(1, 
options.series.pie.tilt);        // this actually seems to break everything 
when here.
+                                       ctx.arc(0, 0, radius, s.startAngle, 
s.startAngle + s.angle / 2, false);
+                                       ctx.arc(0, 0, radius, s.startAngle + 
s.angle / 2, s.startAngle + s.angle, false);
+                                       ctx.closePath();
+                                       x = mouseX - centerLeft;
+                                       y = mouseY - centerTop;
+
+                                       if (ctx.isPointInPath) {
+                                               if (ctx.isPointInPath(mouseX - 
centerLeft, mouseY - centerTop)) {
+                                                       ctx.restore();
+                                                       return {
+                                                               datapoint: 
[s.percent, s.data],
+                                                               dataIndex: 0,
+                                                               series: s,
+                                                               seriesIndex: i
+                                                       };
+                                               }
+                                       } else {
+
+                                               // excanvas for IE doesn;t 
support isPointInPath, this is a workaround.
+
+                                               var p1X = radius * 
Math.cos(s.startAngle),
+                                                       p1Y = radius * 
Math.sin(s.startAngle),
+                                                       p2X = radius * 
Math.cos(s.startAngle + s.angle / 4),
+                                                       p2Y = radius * 
Math.sin(s.startAngle + s.angle / 4),
+                                                       p3X = radius * 
Math.cos(s.startAngle + s.angle / 2),
+                                                       p3Y = radius * 
Math.sin(s.startAngle + s.angle / 2),
+                                                       p4X = radius * 
Math.cos(s.startAngle + s.angle / 1.5),
+                                                       p4Y = radius * 
Math.sin(s.startAngle + s.angle / 1.5),
+                                                       p5X = radius * 
Math.cos(s.startAngle + s.angle),
+                                                       p5Y = radius * 
Math.sin(s.startAngle + s.angle),
+                                                       arrPoly = [[0, 0], 
[p1X, p1Y], [p2X, p2Y], [p3X, p3Y], [p4X, p4Y], [p5X, p5Y]],
+                                                       arrPoint = [x, y];
+
+                                               // TODO: perhaps do some 
mathmatical trickery here with the Y-coordinate to compensate for pie tilt?
+
+                                               if (isPointInPoly(arrPoly, 
arrPoint)) {
+                                                       ctx.restore();
+                                                       return {
+                                                               datapoint: 
[s.percent, s.data],
+                                                               dataIndex: 0,
+                                                               series: s,
+                                                               seriesIndex: i
+                                                       };
+                                               }
+                                       }
+
+                                       ctx.restore();
+                               }
+                       }
+
+                       return null;
+               }
+
+               function onMouseMove(e) {
+                       triggerClickHoverEvent("plothover", e);
+               }
+
+               function onClick(e) {
+                       triggerClickHoverEvent("plotclick", e);
+               }
+
+               // trigger click or hover event (they send the same parameters 
so we share their code)
+
+               function triggerClickHoverEvent(eventname, e) {
+
+                       var offset = plot.offset();
+                       var canvasX = parseInt(e.pageX - offset.left);
+                       var canvasY =  parseInt(e.pageY - offset.top);
+                       var item = findNearbySlice(canvasX, canvasY);
+
+                       if (options.grid.autoHighlight) {
+
+                               // clear auto-highlights
+
+                               for (var i = 0; i < highlights.length; ++i) {
+                                       var h = highlights[i];
+                                       if (h.auto == eventname && !(item && 
h.series == item.series)) {
+                                               unhighlight(h.series);
+                                       }
+                               }
+                       }
+
+                       // highlight the slice
+
+                       if (item) {
+                               highlight(item.series, eventname);
+                       }
+
+                       // trigger any hover bind events
+
+                       var pos = { pageX: e.pageX, pageY: e.pageY };
+                       target.trigger(eventname, [pos, item]);
+               }
+
+               function highlight(s, auto) {
+                       //if (typeof s == "number") {
+                       //      s = series[s];
+                       //}
+
+                       var i = indexOfHighlight(s);
+
+                       if (i == -1) {
+                               highlights.push({ series: s, auto: auto });
+                               plot.triggerRedrawOverlay();
+                       } else if (!auto) {
+                               highlights[i].auto = false;
+                       }
+               }
+
+               function unhighlight(s) {
+                       if (s == null) {
+                               highlights = [];
+                               plot.triggerRedrawOverlay();
+                       }
+
+                       //if (typeof s == "number") {
+                       //      s = series[s];
+                       //}
+
+                       var i = indexOfHighlight(s);
+
+                       if (i != -1) {
+                               highlights.splice(i, 1);
+                               plot.triggerRedrawOverlay();
+                       }
+               }
+
+               function indexOfHighlight(s) {
+                       for (var i = 0; i < highlights.length; ++i) {
+                               var h = highlights[i];
+                               if (h.series == s)
+                                       return i;
+                       }
+                       return -1;
+               }
+
+               function drawOverlay(plot, octx) {
+
+                       var options = plot.getOptions();
+
+                       var radius = options.series.pie.radius > 1 ? 
options.series.pie.radius : maxRadius * options.series.pie.radius;
+
+                       octx.save();
+                       octx.translate(centerLeft, centerTop);
+                       octx.scale(1, options.series.pie.tilt);
+
+                       for (var i = 0; i < highlights.length; ++i) {
+                               drawHighlight(highlights[i].series);
+                       }
+
+                       drawDonutHole(octx);
+
+                       octx.restore();
+
+                       function drawHighlight(series) {
+
+                               if (series.angle <= 0 || isNaN(series.angle)) {
+                                       return;
+                               }
+
+                               //octx.fillStyle = 
parseColor(options.series.pie.highlight.color).scale(null, null, null, 
options.series.pie.highlight.opacity).toString();
+                               octx.fillStyle = "rgba(255, 255, 255, " + 
options.series.pie.highlight.opacity + ")"; // this is temporary until we have 
access to parseColor
+                               octx.beginPath();
+                               if (Math.abs(series.angle - Math.PI * 2) > 
0.000000001) {
+                                       octx.moveTo(0, 0); // Center of the pie
+                               }
+                               octx.arc(0, 0, radius, series.startAngle, 
series.startAngle + series.angle / 2, false);
+                               octx.arc(0, 0, radius, series.startAngle + 
series.angle / 2, series.startAngle + series.angle, false);
+                               octx.closePath();
+                               octx.fill();
+                       }
+               }
+       } // end init (plugin body)
+
+       // define pie specific options and their default values
+
+       var options = {
+               series: {
+                       pie: {
+                               show: false,
+                               radius: "auto", // actual radius of the visible 
pie (based on full calculated radius if <=1, or hard pixel value)
+                               innerRadius: 0, /* for donut */
+                               startAngle: 3/2,
+                               tilt: 1,
+                               shadow: {
+                                       left: 5,        // shadow left offset
+                                       top: 15,        // shadow top offset
+                                       alpha: 0.02     // shadow alpha
+                               },
+                               offset: {
+                                       top: 0,
+                                       left: "auto"
+                               },
+                               stroke: {
+                                       color: "#fff",
+                                       width: 1
+                               },
+                               label: {
+                                       show: "auto",
+                                       formatter: function(label, slice) {
+                                               return "<div 
style='font-size:x-small;text-align:center;padding:2px;color:" + slice.color + 
";'>" + label + "<br/>" + Math.round(slice.percent) + "%</div>";
+                                       },      // formatter function
+                                       radius: 1,      // radius at which to 
place the labels (based on full calculated radius if <=1, or hard pixel value)
+                                       background: {
+                                               color: null,
+                                               opacity: 0
+                                       },
+                                       threshold: 0    // percentage at which 
to hide the label (i.e. the slice is too narrow)
+                               },
+                               combine: {
+                                       threshold: -1,  // percentage at which 
to combine little slices into one larger slice
+                                       color: null,    // color to give the 
new slice (auto-generated if null)
+                                       label: "Other"  // label to give the 
new slice
+                               },
+                               highlight: {
+                                       //color: "#fff",                // will 
add this functionality once parseColor is available
+                                       opacity: 0.5
+                               }
+                       }
+               }
+       };
+
+       $.plot.plugins.push({
+               init: init,
+               options: options,
+               name: "pie",
+               version: "1.1"
+       });
+
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.min.js
new file mode 100644
index 0000000..9bc488b
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.pie.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($){var REDRAW_ATTEMPTS=10;var REDRAW_SHRINK=.95;function 
init(plot){var 
canvas=null,target=null,options=null,maxRadius=null,centerLeft=null,centerTop=null,processed=false,ctx=null;var
 
highlights=[];plot.hooks.processOptions.push(function(plot,options){if(options.series.pie.show){options.grid.show=false;if(options.series.pie.label.show=="auto"){if(options.legend.show){options.series.pie.label.show=false}else{options.series.pie.label.show=true}}if(options.series.pie.radius=="auto"){if(options.series.pie.label.show){options.series.pie.radius=3/4}else{options.series.pie.radius=1}}if(options.series.pie.tilt>1){options.series.pie.tilt=1}else
 
if(options.series.pie.tilt<0){options.series.pie.tilt=0}}});plot.hooks.bindEvents.push(function(plot,eventHolder){var
 
options=plot.getOptions();if(options.series.pie.show){if(options.grid.hoverable){eventHolder.unbind("mousemove").mousemove(onMouseMove)}if(options.grid.clickable){eventHolder.unbind("click").click(onClick)}}});plot.hooks.proc
 essDatapoints.push(function(plot,series,data,datapoints){var 
options=plot.getOptions();if(options.series.pie.show){processDatapoints(plot,series,data,datapoints)}});plot.hooks.drawOverlay.push(function(plot,octx){var
 
options=plot.getOptions();if(options.series.pie.show){drawOverlay(plot,octx)}});plot.hooks.draw.push(function(plot,newCtx){var
 
options=plot.getOptions();if(options.series.pie.show){draw(plot,newCtx)}});function
 
processDatapoints(plot,series,datapoints){if(!processed){processed=true;canvas=plot.getCanvas();target=$(canvas).parent();options=plot.getOptions();plot.setData(combine(plot.getData()))}}function
 combine(data){var 
total=0,combined=0,numCombined=0,color=options.series.pie.combine.color,newdata=[];for(var
 i=0;i<data.length;++i){var 
value=data[i].data;if($.isArray(value)&&value.length==1){value=value[0]}if($.isArray(value)){if(!isNaN(parseFloat(value[1]))&&isFinite(value[1])){value[1]=+value[1]}else{value[1]=0}}else
 if(!isNaN(parseFloat(value))&&isFinite(value)){val
 ue=[1,+value]}else{value=[1,0]}data[i].data=[value]}for(var 
i=0;i<data.length;++i){total+=data[i].data[0][1]}for(var 
i=0;i<data.length;++i){var 
value=data[i].data[0][1];if(value/total<=options.series.pie.combine.threshold){combined+=value;numCombined++;if(!color){color=data[i].color}}}for(var
 i=0;i<data.length;++i){var 
value=data[i].data[0][1];if(numCombined<2||value/total>options.series.pie.combine.threshold){newdata.push($.extend(data[i],{data:[[1,value]],color:data[i].color,label:data[i].label,angle:value*Math.PI*2/total,percent:value/(total/100)}))}}if(numCombined>1){newdata.push({data:[[1,combined]],color:color,label:options.series.pie.combine.label,angle:combined*Math.PI*2/total,percent:combined/(total/100)})}return
 newdata}function draw(plot,newCtx){if(!target){return}var 
canvasWidth=plot.getPlaceholder().width(),canvasHeight=plot.getPlaceholder().height(),legendWidth=target.children().filter(".legend").children().width()||0;ctx=newCtx;processed=false;maxRadius=Math.min(canva
 
sWidth,canvasHeight/options.series.pie.tilt)/2;centerTop=canvasHeight/2+options.series.pie.offset.top;centerLeft=canvasWidth/2;if(options.series.pie.offset.left=="auto"){if(options.legend.position.match("w")){centerLeft+=legendWidth/2}else{centerLeft-=legendWidth/2}if(centerLeft<maxRadius){centerLeft=maxRadius}else
 
if(centerLeft>canvasWidth-maxRadius){centerLeft=canvasWidth-maxRadius}}else{centerLeft+=options.series.pie.offset.left}var
 
slices=plot.getData(),attempts=0;do{if(attempts>0){maxRadius*=REDRAW_SHRINK}attempts+=1;clear();if(options.series.pie.tilt<=.8){drawShadow()}}while(!drawPie()&&attempts<REDRAW_ATTEMPTS);if(attempts>=REDRAW_ATTEMPTS){clear();target.prepend("<div
 class='error'>Could not draw pie with labels contained inside 
canvas</div>")}if(plot.setSeries&&plot.insertLegend){plot.setSeries(slices);plot.insertLegend()}function
 
clear(){ctx.clearRect(0,0,canvasWidth,canvasHeight);target.children().filter(".pieLabel,
 .pieLabelBackground").remove()}function drawShadow(){var
  shadowLeft=options.series.pie.shadow.left;var 
shadowTop=options.series.pie.shadow.top;var edge=10;var 
alpha=options.series.pie.shadow.alpha;var 
radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;if(radius>=canvasWidth/2-shadowLeft||radius*options.series.pie.tilt>=canvasHeight/2-shadowTop||radius<=edge){return}ctx.save();ctx.translate(shadowLeft,shadowTop);ctx.globalAlpha=alpha;ctx.fillStyle="#000";ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);for(var
 
i=1;i<=edge;i++){ctx.beginPath();ctx.arc(0,0,radius,0,Math.PI*2,false);ctx.fill();radius-=i}ctx.restore()}function
 drawPie(){var startAngle=Math.PI*options.series.pie.startAngle;var 
radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;ctx.save();ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);ctx.save();var
 currentAngle=startAngle;for(var 
i=0;i<slices.length;++i){slices[i].startAngle=currentAngle
 
;drawSlice(slices[i].angle,slices[i].color,true)}ctx.restore();if(options.series.pie.stroke.width>0){ctx.save();ctx.lineWidth=options.series.pie.stroke.width;currentAngle=startAngle;for(var
 
i=0;i<slices.length;++i){drawSlice(slices[i].angle,options.series.pie.stroke.color,false)}ctx.restore()}drawDonutHole(ctx);ctx.restore();if(options.series.pie.label.show){return
 drawLabels()}else return true;function 
drawSlice(angle,color,fill){if(angle<=0||isNaN(angle)){return}if(fill){ctx.fillStyle=color}else{ctx.strokeStyle=color;ctx.lineJoin="round"}ctx.beginPath();if(Math.abs(angle-Math.PI*2)>1e-9){ctx.moveTo(0,0)}ctx.arc(0,0,radius,currentAngle,currentAngle+angle/2,false);ctx.arc(0,0,radius,currentAngle+angle/2,currentAngle+angle,false);ctx.closePath();currentAngle+=angle;if(fill){ctx.fill()}else{ctx.stroke()}}function
 drawLabels(){var currentAngle=startAngle;var 
radius=options.series.pie.label.radius>1?options.series.pie.label.radius:maxRadius*options.series.pie.label.radius;for(var
 i=0;i<
 
slices.length;++i){if(slices[i].percent>=options.series.pie.label.threshold*100){if(!drawLabel(slices[i],currentAngle,i)){return
 false}}currentAngle+=slices[i].angle}return true;function 
drawLabel(slice,startAngle,index){if(slice.data[0][1]==0){return true}var 
lf=options.legend.labelFormatter,text,plf=options.series.pie.label.formatter;if(lf){text=lf(slice.label,slice)}else{text=slice.label}if(plf){text=plf(text,slice)}var
 halfAngle=(startAngle+slice.angle+startAngle)/2;var 
x=centerLeft+Math.round(Math.cos(halfAngle)*radius);var 
y=centerTop+Math.round(Math.sin(halfAngle)*radius)*options.series.pie.tilt;var 
html="<span class='pieLabel' id='pieLabel"+index+"' 
style='position:absolute;top:"+y+"px;left:"+x+"px;'>"+text+"</span>";target.append(html);var
 label=target.children("#pieLabel"+index);var labelTop=y-label.height()/2;var 
labelLeft=x-label.width()/2;label.css("top",labelTop);label.css("left",labelLeft);if(0-labelTop>0||0-labelLeft>0||canvasHeight-(labelTop+label.height())<0||canva
 sWidth-(labelLeft+label.width())<0){return 
false}if(options.series.pie.label.background.opacity!=0){var 
c=options.series.pie.label.background.color;if(c==null){c=slice.color}var 
pos="top:"+labelTop+"px;left:"+labelLeft+"px;";$("<div 
class='pieLabelBackground' 
style='position:absolute;width:"+label.width()+"px;height:"+label.height()+"px;"+pos+"background-color:"+c+";'></div>").css("opacity",options.series.pie.label.background.opacity).insertBefore(label)}return
 true}}}}function 
drawDonutHole(layer){if(options.series.pie.innerRadius>0){layer.save();var 
innerRadius=options.series.pie.innerRadius>1?options.series.pie.innerRadius:maxRadius*options.series.pie.innerRadius;layer.globalCompositeOperation="destination-out";layer.beginPath();layer.fillStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.fill();layer.closePath();layer.restore();layer.save();layer.beginPath();layer.strokeStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.P
 I*2,false);layer.stroke();layer.closePath();layer.restore()}}function 
isPointInPoly(poly,pt){for(var 
c=false,i=-1,l=poly.length,j=l-1;++i<l;j=i)(poly[i][1]<=pt[1]&&pt[1]<poly[j][1]||poly[j][1]<=pt[1]&&pt[1]<poly[i][1])&&pt[0]<(poly[j][0]-poly[i][0])*(pt[1]-poly[i][1])/(poly[j][1]-poly[i][1])+poly[i][0]&&(c=!c);return
 c}function findNearbySlice(mouseX,mouseY){var 
slices=plot.getData(),options=plot.getOptions(),radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius,x,y;for(var
 i=0;i<slices.length;++i){var 
s=slices[i];if(s.pie.show){ctx.save();ctx.beginPath();ctx.moveTo(0,0);ctx.arc(0,0,radius,s.startAngle,s.startAngle+s.angle/2,false);ctx.arc(0,0,radius,s.startAngle+s.angle/2,s.startAngle+s.angle,false);ctx.closePath();x=mouseX-centerLeft;y=mouseY-centerTop;if(ctx.isPointInPath){if(ctx.isPointInPath(mouseX-centerLeft,mouseY-centerTop)){ctx.restore();return{datapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}else{var
 p1X=radius*Ma
 
th.cos(s.startAngle),p1Y=radius*Math.sin(s.startAngle),p2X=radius*Math.cos(s.startAngle+s.angle/4),p2Y=radius*Math.sin(s.startAngle+s.angle/4),p3X=radius*Math.cos(s.startAngle+s.angle/2),p3Y=radius*Math.sin(s.startAngle+s.angle/2),p4X=radius*Math.cos(s.startAngle+s.angle/1.5),p4Y=radius*Math.sin(s.startAngle+s.angle/1.5),p5X=radius*Math.cos(s.startAngle+s.angle),p5Y=radius*Math.sin(s.startAngle+s.angle),arrPoly=[[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,p5Y]],arrPoint=[x,y];if(isPointInPoly(arrPoly,arrPoint)){ctx.restore();return{datapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}ctx.restore()}}return
 null}function onMouseMove(e){triggerClickHoverEvent("plothover",e)}function 
onClick(e){triggerClickHoverEvent("plotclick",e)}function 
triggerClickHoverEvent(eventname,e){var offset=plot.offset();var 
canvasX=parseInt(e.pageX-offset.left);var 
canvasY=parseInt(e.pageY-offset.top);var 
item=findNearbySlice(canvasX,canvasY);if(options.grid.autoHighlight){for(var 
i=0;i
 <highlights.length;++i){var 
h=highlights[i];if(h.auto==eventname&&!(item&&h.series==item.series)){unhighlight(h.series)}}}if(item){highlight(item.series,eventname)}var
 
pos={pageX:e.pageX,pageY:e.pageY};target.trigger(eventname,[pos,item])}function 
highlight(s,auto){var 
i=indexOfHighlight(s);if(i==-1){highlights.push({series:s,auto:auto});plot.triggerRedrawOverlay()}else
 if(!auto){highlights[i].auto=false}}function 
unhighlight(s){if(s==null){highlights=[];plot.triggerRedrawOverlay()}var 
i=indexOfHighlight(s);if(i!=-1){highlights.splice(i,1);plot.triggerRedrawOverlay()}}function
 indexOfHighlight(s){for(var i=0;i<highlights.length;++i){var 
h=highlights[i];if(h.series==s)return i}return-1}function 
drawOverlay(plot,octx){var options=plot.getOptions();var 
radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;octx.save();octx.translate(centerLeft,centerTop);octx.scale(1,options.series.pie.tilt);for(var
 i=0;i<highlights.length;++i){drawHighlight(hi
 ghlights[i].series)}drawDonutHole(octx);octx.restore();function 
drawHighlight(series){if(series.angle<=0||isNaN(series.angle)){return}octx.fillStyle="rgba(255,
 255, 255, 
"+options.series.pie.highlight.opacity+")";octx.beginPath();if(Math.abs(series.angle-Math.PI*2)>1e-9){octx.moveTo(0,0)}octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle/2,false);octx.arc(0,0,radius,series.startAngle+series.angle/2,series.startAngle+series.angle,false);octx.closePath();octx.fill()}}}var
 
options={series:{pie:{show:false,radius:"auto",innerRadius:0,startAngle:3/2,tilt:1,shadow:{left:5,top:15,alpha:.02},offset:{top:0,left:"auto"},stroke:{color:"#fff",width:1},label:{show:"auto",formatter:function(label,slice){return"<div
 
style='font-size:x-small;text-align:center;padding:2px;color:"+slice.color+";'>"+label+"<br/>"+Math.round(slice.percent)+"%</div>"},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:"Other"},highlight:{opacity:.5}}}};$.plot
 .plugins.push({init:init,options:options,name:"pie",version:"1.1"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.js
new file mode 100644
index 0000000..8a626dd
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.js
@@ -0,0 +1,59 @@
+/* Flot plugin for automatically redrawing plots as the placeholder resizes.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+It works by listening for changes on the placeholder div (through the jQuery
+resize event plugin) - if the size changes, it will redraw the plot.
+
+There are no options. If you need to disable the plugin for some plots, you
+can just fix the size of their placeholders.
+
+*/
+
+/* Inline dependency:
+ * jQuery resize event - v1.1 - 3/14/2010
+ * http://benalman.com/projects/jquery-resize-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,t){"$:nomunge";var 
i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return
 false}var 
e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return
 false}var e=$(this);for(var 
t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return
 false}var i;function a(e,n,a){var 
r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return
 a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var 
s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var 
f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d
 
.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return
 
e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return
 e.setTimeout(function(){t((new 
Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return
 
e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);
+
+(function ($) {
+    var options = { }; // no options
+
+    function init(plot) {
+        function onResize() {
+            var placeholder = plot.getPlaceholder();
+
+            // somebody might have hidden us and we can't plot
+            // when we don't have the dimensions
+            if (placeholder.width() == 0 || placeholder.height() == 0)
+                return;
+
+            plot.resize();
+            plot.setupGrid();
+            plot.draw();
+        }
+        
+        function bindEvents(plot, eventHolder) {
+            plot.getPlaceholder().resize(onResize);
+        }
+
+        function shutdown(plot, eventHolder) {
+            plot.getPlaceholder().unbind("resize", onResize);
+        }
+        
+        plot.hooks.bindEvents.push(bindEvents);
+        plot.hooks.shutdown.push(shutdown);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'resize',
+        version: '1.0'
+    });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.min.js
new file mode 100644
index 0000000..7e92aa6
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.resize.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($,e,t){"$:nomunge";var 
i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return
 false}var 
e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return
 false}var e=$(this);for(var 
t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return
 false}var i;function a(e,n,a){var 
r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return
 a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var 
s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var 
f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d
 
.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return
 
e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return
 e.setTimeout(function(){t((new 
Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return
 
e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);(function($){var
 options={};function init(plot){function onResize(){var 
placeholder=plot.getPlaceholder();if(placeholder.width()==0||placeholder.height()==0)return;plot.resize();plot.setupGrid();plot.draw()}function
 bindEvents(plot,eventHolder){plot.getPlaceholder().resize(onResize)}function 
shutdown(plot,eventHolder){
 
plot.getPlaceholder().unbind("resize",onResize)}plot.hooks.bindEvents.push(bindEvents);plot.hooks.shutdown.push(shutdown)}$.plot.plugins.push({init:init,options:options,name:"resize",version:"1.0"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.js
new file mode 100644
index 0000000..d3c20fa
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.js
@@ -0,0 +1,360 @@
+/* Flot plugin for selecting regions of a plot.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+The plugin supports these options:
+
+selection: {
+       mode: null or "x" or "y" or "xy",
+       color: color,
+       shape: "round" or "miter" or "bevel",
+       minSize: number of pixels
+}
+
+Selection support is enabled by setting the mode to one of "x", "y" or "xy".
+In "x" mode, the user will only be able to specify the x range, similarly for
+"y" mode. For "xy", the selection becomes a rectangle where both ranges can be
+specified. "color" is color of the selection (if you need to change the color
+later on, you can get to it with plot.getOptions().selection.color). "shape"
+is the shape of the corners of the selection.
+
+"minSize" is the minimum size a selection can be in pixels. This value can
+be customized to determine the smallest size a selection can be and still
+have the selection rectangle be displayed. When customizing this value, the
+fact that it refers to pixels, not axis units must be taken into account.
+Thus, for example, if there is a bar graph in time mode with BarWidth set to 1
+minute, setting "minSize" to 1 will not make the minimum selection size 1
+minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent
+"plotunselected" events from being fired when the user clicks the mouse without
+dragging.
+
+When selection support is enabled, a "plotselected" event will be emitted on
+the DOM element you passed into the plot function. The event handler gets a
+parameter with the ranges selected on the axes, like this:
+
+       placeholder.bind( "plotselected", function( event, ranges ) {
+               alert("You selected " + ranges.xaxis.from + " to " + 
ranges.xaxis.to)
+               // similar for yaxis - with multiple axes, the extra ones are in
+               // x2axis, x3axis, ...
+       });
+
+The "plotselected" event is only fired when the user has finished making the
+selection. A "plotselecting" event is fired during the process with the same
+parameters as the "plotselected" event, in case you want to know what's
+happening while it's happening,
+
+A "plotunselected" event with no arguments is emitted when the user clicks the
+mouse to remove the selection. As stated above, setting "minSize" to 0 will
+destroy this behavior.
+
+The plugin allso adds the following methods to the plot object:
+
+- setSelection( ranges, preventEvent )
+
+  Set the selection rectangle. The passed in ranges is on the same form as
+  returned in the "plotselected" event. If the selection mode is "x", you
+  should put in either an xaxis range, if the mode is "y" you need to put in
+  an yaxis range and both xaxis and yaxis if the selection mode is "xy", like
+  this:
+
+       setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } 
});
+
+  setSelection will trigger the "plotselected" event when called. If you don't
+  want that to happen, e.g. if you're inside a "plotselected" handler, pass
+  true as the second parameter. If you are using multiple axes, you can
+  specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of
+  xaxis, the plugin picks the first one it sees.
+
+- clearSelection( preventEvent )
+
+  Clear the selection rectangle. Pass in true to avoid getting a
+  "plotunselected" event.
+
+- getSelection()
+
+  Returns the current selection in the same format as the "plotselected"
+  event. If there's currently no selection, the function returns null.
+
+*/
+
+(function ($) {
+    function init(plot) {
+        var selection = {
+                first: { x: -1, y: -1}, second: { x: -1, y: -1},
+                show: false,
+                active: false
+            };
+
+        // FIXME: The drag handling implemented here should be
+        // abstracted out, there's some similar code from a library in
+        // the navigation plugin, this should be massaged a bit to fit
+        // the Flot cases here better and reused. Doing this would
+        // make this plugin much slimmer.
+        var savedhandlers = {};
+
+        var mouseUpHandler = null;
+        
+        function onMouseMove(e) {
+            if (selection.active) {
+                updateSelection(e);
+                
+                plot.getPlaceholder().trigger("plotselecting", [ 
getSelection() ]);
+            }
+        }
+
+        function onMouseDown(e) {
+            if (e.which != 1)  // only accept left-click
+                return;
+            
+            // cancel out any text selections
+            document.body.focus();
+
+            // prevent text selection and drag in old-school browsers
+            if (document.onselectstart !== undefined && 
savedhandlers.onselectstart == null) {
+                savedhandlers.onselectstart = document.onselectstart;
+                document.onselectstart = function () { return false; };
+            }
+            if (document.ondrag !== undefined && savedhandlers.ondrag == null) 
{
+                savedhandlers.ondrag = document.ondrag;
+                document.ondrag = function () { return false; };
+            }
+
+            setSelectionPos(selection.first, e);
+
+            selection.active = true;
+
+            // this is a bit silly, but we have to use a closure to be
+            // able to whack the same handler again
+            mouseUpHandler = function (e) { onMouseUp(e); };
+            
+            $(document).one("mouseup", mouseUpHandler);
+        }
+
+        function onMouseUp(e) {
+            mouseUpHandler = null;
+            
+            // revert drag stuff for old-school browsers
+            if (document.onselectstart !== undefined)
+                document.onselectstart = savedhandlers.onselectstart;
+            if (document.ondrag !== undefined)
+                document.ondrag = savedhandlers.ondrag;
+
+            // no more dragging
+            selection.active = false;
+            updateSelection(e);
+
+            if (selectionIsSane())
+                triggerSelectedEvent();
+            else {
+                // this counts as a clear
+                plot.getPlaceholder().trigger("plotunselected", [ ]);
+                plot.getPlaceholder().trigger("plotselecting", [ null ]);
+            }
+
+            return false;
+        }
+
+        function getSelection() {
+            if (!selectionIsSane())
+                return null;
+            
+            if (!selection.show) return null;
+
+            var r = {}, c1 = selection.first, c2 = selection.second;
+            $.each(plot.getAxes(), function (name, axis) {
+                if (axis.used) {
+                    var p1 = axis.c2p(c1[axis.direction]), p2 = 
axis.c2p(c2[axis.direction]); 
+                    r[name] = { from: Math.min(p1, p2), to: Math.max(p1, p2) };
+                }
+            });
+            return r;
+        }
+
+        function triggerSelectedEvent() {
+            var r = getSelection();
+
+            plot.getPlaceholder().trigger("plotselected", [ r ]);
+
+            // backwards-compat stuff, to be removed in future
+            if (r.xaxis && r.yaxis)
+                plot.getPlaceholder().trigger("selected", [ { x1: 
r.xaxis.from, y1: r.yaxis.from, x2: r.xaxis.to, y2: r.yaxis.to } ]);
+        }
+
+        function clamp(min, value, max) {
+            return value < min ? min: (value > max ? max: value);
+        }
+
+        function setSelectionPos(pos, e) {
+            var o = plot.getOptions();
+            var offset = plot.getPlaceholder().offset();
+            var plotOffset = plot.getPlotOffset();
+            pos.x = clamp(0, e.pageX - offset.left - plotOffset.left, 
plot.width());
+            pos.y = clamp(0, e.pageY - offset.top - plotOffset.top, 
plot.height());
+
+            if (o.selection.mode == "y")
+                pos.x = pos == selection.first ? 0 : plot.width();
+
+            if (o.selection.mode == "x")
+                pos.y = pos == selection.first ? 0 : plot.height();
+        }
+
+        function updateSelection(pos) {
+            if (pos.pageX == null)
+                return;
+
+            setSelectionPos(selection.second, pos);
+            if (selectionIsSane()) {
+                selection.show = true;
+                plot.triggerRedrawOverlay();
+            }
+            else
+                clearSelection(true);
+        }
+
+        function clearSelection(preventEvent) {
+            if (selection.show) {
+                selection.show = false;
+                plot.triggerRedrawOverlay();
+                if (!preventEvent)
+                    plot.getPlaceholder().trigger("plotunselected", [ ]);
+            }
+        }
+
+        // function taken from markings support in Flot
+        function extractRange(ranges, coord) {
+            var axis, from, to, key, axes = plot.getAxes();
+
+            for (var k in axes) {
+                axis = axes[k];
+                if (axis.direction == coord) {
+                    key = coord + axis.n + "axis";
+                    if (!ranges[key] && axis.n == 1)
+                        key = coord + "axis"; // support x1axis as xaxis
+                    if (ranges[key]) {
+                        from = ranges[key].from;
+                        to = ranges[key].to;
+                        break;
+                    }
+                }
+            }
+
+            // backwards-compat stuff - to be removed in future
+            if (!ranges[key]) {
+                axis = coord == "x" ? plot.getXAxes()[0] : plot.getYAxes()[0];
+                from = ranges[coord + "1"];
+                to = ranges[coord + "2"];
+            }
+
+            // auto-reverse as an added bonus
+            if (from != null && to != null && from > to) {
+                var tmp = from;
+                from = to;
+                to = tmp;
+            }
+            
+            return { from: from, to: to, axis: axis };
+        }
+        
+        function setSelection(ranges, preventEvent) {
+            var axis, range, o = plot.getOptions();
+
+            if (o.selection.mode == "y") {
+                selection.first.x = 0;
+                selection.second.x = plot.width();
+            }
+            else {
+                range = extractRange(ranges, "x");
+
+                selection.first.x = range.axis.p2c(range.from);
+                selection.second.x = range.axis.p2c(range.to);
+            }
+
+            if (o.selection.mode == "x") {
+                selection.first.y = 0;
+                selection.second.y = plot.height();
+            }
+            else {
+                range = extractRange(ranges, "y");
+
+                selection.first.y = range.axis.p2c(range.from);
+                selection.second.y = range.axis.p2c(range.to);
+            }
+
+            selection.show = true;
+            plot.triggerRedrawOverlay();
+            if (!preventEvent && selectionIsSane())
+                triggerSelectedEvent();
+        }
+
+        function selectionIsSane() {
+            var minSize = plot.getOptions().selection.minSize;
+            return Math.abs(selection.second.x - selection.first.x) >= minSize 
&&
+                Math.abs(selection.second.y - selection.first.y) >= minSize;
+        }
+
+        plot.clearSelection = clearSelection;
+        plot.setSelection = setSelection;
+        plot.getSelection = getSelection;
+
+        plot.hooks.bindEvents.push(function(plot, eventHolder) {
+            var o = plot.getOptions();
+            if (o.selection.mode != null) {
+                eventHolder.mousemove(onMouseMove);
+                eventHolder.mousedown(onMouseDown);
+            }
+        });
+
+
+        plot.hooks.drawOverlay.push(function (plot, ctx) {
+            // draw selection
+            if (selection.show && selectionIsSane()) {
+                var plotOffset = plot.getPlotOffset();
+                var o = plot.getOptions();
+
+                ctx.save();
+                ctx.translate(plotOffset.left, plotOffset.top);
+
+                var c = $.color.parse(o.selection.color);
+
+                ctx.strokeStyle = c.scale('a', 0.8).toString();
+                ctx.lineWidth = 1;
+                ctx.lineJoin = o.selection.shape;
+                ctx.fillStyle = c.scale('a', 0.4).toString();
+
+                var x = Math.min(selection.first.x, selection.second.x) + 0.5,
+                    y = Math.min(selection.first.y, selection.second.y) + 0.5,
+                    w = Math.abs(selection.second.x - selection.first.x) - 1,
+                    h = Math.abs(selection.second.y - selection.first.y) - 1;
+
+                ctx.fillRect(x, y, w, h);
+                ctx.strokeRect(x, y, w, h);
+
+                ctx.restore();
+            }
+        });
+        
+        plot.hooks.shutdown.push(function (plot, eventHolder) {
+            eventHolder.unbind("mousemove", onMouseMove);
+            eventHolder.unbind("mousedown", onMouseDown);
+            
+            if (mouseUpHandler)
+                $(document).unbind("mouseup", mouseUpHandler);
+        });
+
+    }
+
+    $.plot.plugins.push({
+        init: init,
+        options: {
+            selection: {
+                mode: null, // one of null, "x", "y" or "xy"
+                color: "#e8cfac",
+                shape: "round", // one of "round", "miter", or "bevel"
+                minSize: 5 // minimum number of pixels
+            }
+        },
+        name: 'selection',
+        version: '1.1'
+    });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.min.js
new file mode 100644
index 0000000..a0154fb
--- /dev/null
+++ 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.selection.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($){function init(plot){var 
selection={first:{x:-1,y:-1},second:{x:-1,y:-1},show:false,active:false};var 
savedhandlers={};var mouseUpHandler=null;function 
onMouseMove(e){if(selection.active){updateSelection(e);plot.getPlaceholder().trigger("plotselecting",[getSelection()])}}function
 
onMouseDown(e){if(e.which!=1)return;document.body.focus();if(document.onselectstart!==undefined&&savedhandlers.onselectstart==null){savedhandlers.onselectstart=document.onselectstart;document.onselectstart=function(){return
 
false}}if(document.ondrag!==undefined&&savedhandlers.ondrag==null){savedhandlers.ondrag=document.ondrag;document.ondrag=function(){return
 
false}}setSelectionPos(selection.first,e);selection.active=true;mouseUpHandler=function(e){onMouseUp(e)};$(document).one("mouseup",mouseUpHandler)}function
 
onMouseUp(e){mouseUpHandler=null;if(document.onselectstart!==undefined)document.onselectstart=savedhandlers.onselectstart;if(document.ondrag!==undefined)document.ondrag=savedhandlers.ond
 
rag;selection.active=false;updateSelection(e);if(selectionIsSane())triggerSelectedEvent();else{plot.getPlaceholder().trigger("plotunselected",[]);plot.getPlaceholder().trigger("plotselecting",[null])}return
 false}function getSelection(){if(!selectionIsSane())return 
null;if(!selection.show)return null;var 
r={},c1=selection.first,c2=selection.second;$.each(plot.getAxes(),function(name,axis){if(axis.used){var
 
p1=axis.c2p(c1[axis.direction]),p2=axis.c2p(c2[axis.direction]);r[name]={from:Math.min(p1,p2),to:Math.max(p1,p2)}}});return
 r}function triggerSelectedEvent(){var 
r=getSelection();plot.getPlaceholder().trigger("plotselected",[r]);if(r.xaxis&&r.yaxis)plot.getPlaceholder().trigger("selected",[{x1:r.xaxis.from,y1:r.yaxis.from,x2:r.xaxis.to,y2:r.yaxis.to}])}function
 clamp(min,value,max){return value<min?min:value>max?max:value}function 
setSelectionPos(pos,e){var o=plot.getOptions();var 
offset=plot.getPlaceholder().offset();var 
plotOffset=plot.getPlotOffset();pos.x=clamp(0,e.pageX-offse
 
t.left-plotOffset.left,plot.width());pos.y=clamp(0,e.pageY-offset.top-plotOffset.top,plot.height());if(o.selection.mode=="y")pos.x=pos==selection.first?0:plot.width();if(o.selection.mode=="x")pos.y=pos==selection.first?0:plot.height()}function
 
updateSelection(pos){if(pos.pageX==null)return;setSelectionPos(selection.second,pos);if(selectionIsSane()){selection.show=true;plot.triggerRedrawOverlay()}else
 clearSelection(true)}function 
clearSelection(preventEvent){if(selection.show){selection.show=false;plot.triggerRedrawOverlay();if(!preventEvent)plot.getPlaceholder().trigger("plotunselected",[])}}function
 extractRange(ranges,coord){var axis,from,to,key,axes=plot.getAxes();for(var k 
in 
axes){axis=axes[k];if(axis.direction==coord){key=coord+axis.n+"axis";if(!ranges[key]&&axis.n==1)key=coord+"axis";if(ranges[key]){from=ranges[key].from;to=ranges[key].to;break}}}if(!ranges[key]){axis=coord=="x"?plot.getXAxes()[0]:plot.getYAxes()[0];from=ranges[coord+"1"];to=ranges[coord+"2"]}if(from!=null&&
 to!=null&&from>to){var 
tmp=from;from=to;to=tmp}return{from:from,to:to,axis:axis}}function 
setSelection(ranges,preventEvent){var 
axis,range,o=plot.getOptions();if(o.selection.mode=="y"){selection.first.x=0;selection.second.x=plot.width()}else{range=extractRange(ranges,"x");selection.first.x=range.axis.p2c(range.from);selection.second.x=range.axis.p2c(range.to)}if(o.selection.mode=="x"){selection.first.y=0;selection.second.y=plot.height()}else{range=extractRange(ranges,"y");selection.first.y=range.axis.p2c(range.from);selection.second.y=range.axis.p2c(range.to)}selection.show=true;plot.triggerRedrawOverlay();if(!preventEvent&&selectionIsSane())triggerSelectedEvent()}function
 selectionIsSane(){var minSize=plot.getOptions().selection.minSize;return 
Math.abs(selection.second.x-selection.first.x)>=minSize&&Math.abs(selection.second.y-selection.first.y)>=minSize}plot.clearSelection=clearSelection;plot.setSelection=setSelection;plot.getSelection=getSelection;plot.hooks.bindEvents.push(funct
 ion(plot,eventHolder){var 
o=plot.getOptions();if(o.selection.mode!=null){eventHolder.mousemove(onMouseMove);eventHolder.mousedown(onMouseDown)}});plot.hooks.drawOverlay.push(function(plot,ctx){if(selection.show&&selectionIsSane()){var
 plotOffset=plot.getPlotOffset();var 
o=plot.getOptions();ctx.save();ctx.translate(plotOffset.left,plotOffset.top);var
 
c=$.color.parse(o.selection.color);ctx.strokeStyle=c.scale("a",.8).toString();ctx.lineWidth=1;ctx.lineJoin=o.selection.shape;ctx.fillStyle=c.scale("a",.4).toString();var
 
x=Math.min(selection.first.x,selection.second.x)+.5,y=Math.min(selection.first.y,selection.second.y)+.5,w=Math.abs(selection.second.x-selection.first.x)-1,h=Math.abs(selection.second.y-selection.first.y)-1;ctx.fillRect(x,y,w,h);ctx.strokeRect(x,y,w,h);ctx.restore()}});plot.hooks.shutdown.push(function(plot,eventHolder){eventHolder.unbind("mousemove",onMouseMove);eventHolder.unbind("mousedown",onMouseDown);if(mouseUpHandler)$(document).unbind("mouseup",mouseUpHandler)})}$
 
.plot.plugins.push({init:init,options:{selection:{mode:null,color:"#e8cfac",shape:"round",minSize:5}},name:"selection",version:"1.1"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.js
new file mode 100644
index 0000000..e75a7df
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.js
@@ -0,0 +1,188 @@
+/* Flot plugin for stacking data sets rather than overlyaing them.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+The plugin assumes the data is sorted on x (or y if stacking horizontally).
+For line charts, it is assumed that if a line has an undefined gap (from a
+null point), then the line above it should have the same gap - insert zeros
+instead of "null" if you want another behaviour. This also holds for the start
+and end of the chart. Note that stacking a mix of positive and negative values
+in most instances doesn't make sense (so it looks weird).
+
+Two or more series are stacked when their "stack" attribute is set to the same
+key (which can be any number or string or just "true"). To specify the default
+stack, you can set the stack option like this:
+
+       series: {
+               stack: null/false, true, or a key (number/string)
+       }
+
+You can also specify it for a single series, like this:
+
+       $.plot( $("#placeholder"), [{
+               data: [ ... ],
+               stack: true
+       }])
+
+The stacking order is determined by the order of the data series in the array
+(later series end up on top of the previous).
+
+Internally, the plugin modifies the datapoints in each series, adding an
+offset to the y value. For line series, extra data points are inserted through
+interpolation. If there's a second y value, it's also adjusted (e.g for bar
+charts or filled areas).
+
+*/
+
+(function ($) {
+    var options = {
+        series: { stack: null } // or number/string
+    };
+    
+    function init(plot) {
+        function findMatchingSeries(s, allseries) {
+            var res = null;
+            for (var i = 0; i < allseries.length; ++i) {
+                if (s == allseries[i])
+                    break;
+                
+                if (allseries[i].stack == s.stack)
+                    res = allseries[i];
+            }
+            
+            return res;
+        }
+        
+        function stackData(plot, s, datapoints) {
+            if (s.stack == null || s.stack === false)
+                return;
+
+            var other = findMatchingSeries(s, plot.getData());
+            if (!other)
+                return;
+
+            var ps = datapoints.pointsize,
+                points = datapoints.points,
+                otherps = other.datapoints.pointsize,
+                otherpoints = other.datapoints.points,
+                newpoints = [],
+                px, py, intery, qx, qy, bottom,
+                withlines = s.lines.show,
+                horizontal = s.bars.horizontal,
+                withbottom = ps > 2 && (horizontal ? datapoints.format[2].x : 
datapoints.format[2].y),
+                withsteps = withlines && s.lines.steps,
+                fromgap = true,
+                keyOffset = horizontal ? 1 : 0,
+                accumulateOffset = horizontal ? 0 : 1,
+                i = 0, j = 0, l, m;
+
+            while (true) {
+                if (i >= points.length)
+                    break;
+
+                l = newpoints.length;
+
+                if (points[i] == null) {
+                    // copy gaps
+                    for (m = 0; m < ps; ++m)
+                        newpoints.push(points[i + m]);
+                    i += ps;
+                }
+                else if (j >= otherpoints.length) {
+                    // for lines, we can't use the rest of the points
+                    if (!withlines) {
+                        for (m = 0; m < ps; ++m)
+                            newpoints.push(points[i + m]);
+                    }
+                    i += ps;
+                }
+                else if (otherpoints[j] == null) {
+                    // oops, got a gap
+                    for (m = 0; m < ps; ++m)
+                        newpoints.push(null);
+                    fromgap = true;
+                    j += otherps;
+                }
+                else {
+                    // cases where we actually got two points
+                    px = points[i + keyOffset];
+                    py = points[i + accumulateOffset];
+                    qx = otherpoints[j + keyOffset];
+                    qy = otherpoints[j + accumulateOffset];
+                    bottom = 0;
+
+                    if (px == qx) {
+                        for (m = 0; m < ps; ++m)
+                            newpoints.push(points[i + m]);
+
+                        newpoints[l + accumulateOffset] += qy;
+                        bottom = qy;
+                        
+                        i += ps;
+                        j += otherps;
+                    }
+                    else if (px > qx) {
+                        // we got past point below, might need to
+                        // insert interpolated extra point
+                        if (withlines && i > 0 && points[i - ps] != null) {
+                            intery = py + (points[i - ps + accumulateOffset] - 
py) * (qx - px) / (points[i - ps + keyOffset] - px);
+                            newpoints.push(qx);
+                            newpoints.push(intery + qy);
+                            for (m = 2; m < ps; ++m)
+                                newpoints.push(points[i + m]);
+                            bottom = qy; 
+                        }
+
+                        j += otherps;
+                    }
+                    else { // px < qx
+                        if (fromgap && withlines) {
+                            // if we come from a gap, we just skip this point
+                            i += ps;
+                            continue;
+                        }
+                            
+                        for (m = 0; m < ps; ++m)
+                            newpoints.push(points[i + m]);
+                        
+                        // we might be able to interpolate a point below,
+                        // this can give us a better y
+                        if (withlines && j > 0 && otherpoints[j - otherps] != 
null)
+                            bottom = qy + (otherpoints[j - otherps + 
accumulateOffset] - qy) * (px - qx) / (otherpoints[j - otherps + keyOffset] - 
qx);
+
+                        newpoints[l + accumulateOffset] += bottom;
+                        
+                        i += ps;
+                    }
+
+                    fromgap = false;
+                    
+                    if (l != newpoints.length && withbottom)
+                        newpoints[l + 2] += bottom;
+                }
+
+                // maintain the line steps invariant
+                if (withsteps && l != newpoints.length && l > 0
+                    && newpoints[l] != null
+                    && newpoints[l] != newpoints[l - ps]
+                    && newpoints[l + 1] != newpoints[l - ps + 1]) {
+                    for (m = 0; m < ps; ++m)
+                        newpoints[l + ps + m] = newpoints[l + m];
+                    newpoints[l + 1] = newpoints[l - ps + 1];
+                }
+            }
+
+            datapoints.points = newpoints;
+        }
+        
+        plot.hooks.processDatapoints.push(stackData);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'stack',
+        version: '1.2'
+    });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.min.js
new file mode 100644
index 0000000..920764f
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.stack.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($){var options={series:{stack:null}};function init(plot){function 
findMatchingSeries(s,allseries){var res=null;for(var 
i=0;i<allseries.length;++i){if(s==allseries[i])break;if(allseries[i].stack==s.stack)res=allseries[i]}return
 res}function 
stackData(plot,s,datapoints){if(s.stack==null||s.stack===false)return;var 
other=findMatchingSeries(s,plot.getData());if(!other)return;var 
ps=datapoints.pointsize,points=datapoints.points,otherps=other.datapoints.pointsize,otherpoints=other.datapoints.points,newpoints=[],px,py,intery,qx,qy,bottom,withlines=s.lines.show,horizontal=s.bars.horizontal,withbottom=ps>2&&(horizontal?datapoints.format[2].x:datapoints.format[2].y),withsteps=withlines&&s.lines.steps,fromgap=true,keyOffset=horizontal?1:0,accumulateOffset=horizontal?0:1,i=0,j=0,l,m;while(true){if(i>=points.length)break;l=newpoints.length;if(points[i]==null){for(m=0;m<ps;++m)newpoints.push(points[i+m]);i+=ps}else
 if(j>=otherpoints.length){if(!withlines){for(m=0;m<ps;++m)newpoints.push
 (points[i+m])}i+=ps}else 
if(otherpoints[j]==null){for(m=0;m<ps;++m)newpoints.push(null);fromgap=true;j+=otherps}else{px=points[i+keyOffset];py=points[i+accumulateOffset];qx=otherpoints[j+keyOffset];qy=otherpoints[j+accumulateOffset];bottom=0;if(px==qx){for(m=0;m<ps;++m)newpoints.push(points[i+m]);newpoints[l+accumulateOffset]+=qy;bottom=qy;i+=ps;j+=otherps}else
 
if(px>qx){if(withlines&&i>0&&points[i-ps]!=null){intery=py+(points[i-ps+accumulateOffset]-py)*(qx-px)/(points[i-ps+keyOffset]-px);newpoints.push(qx);newpoints.push(intery+qy);for(m=2;m<ps;++m)newpoints.push(points[i+m]);bottom=qy}j+=otherps}else{if(fromgap&&withlines){i+=ps;continue}for(m=0;m<ps;++m)newpoints.push(points[i+m]);if(withlines&&j>0&&otherpoints[j-otherps]!=null)bottom=qy+(otherpoints[j-otherps+accumulateOffset]-qy)*(px-qx)/(otherpoints[j-otherps+keyOffset]-qx);newpoints[l+accumulateOffset]+=bottom;i+=ps}fromgap=false;if(l!=newpoints.length&&withbottom)newpoints[l+2]+=bottom}if(withsteps&&l!=newpoints.length&&l>0&
 
&newpoints[l]!=null&&newpoints[l]!=newpoints[l-ps]&&newpoints[l+1]!=newpoints[l-ps+1]){for(m=0;m<ps;++m)newpoints[l+ps+m]=newpoints[l+m];newpoints[l+1]=newpoints[l-ps+1]}}datapoints.points=newpoints}plot.hooks.processDatapoints.push(stackData)}$.plot.plugins.push({init:init,options:options,name:"stack",version:"1.2"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.js
new file mode 100644
index 0000000..79f6349
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.js
@@ -0,0 +1,71 @@
+/* Flot plugin that adds some extra symbols for plotting points.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+The symbols are accessed as strings through the standard symbol options:
+
+       series: {
+               points: {
+                       symbol: "square" // or "diamond", "triangle", "cross"
+               }
+       }
+
+*/
+
+(function ($) {
+    function processRawData(plot, series, datapoints) {
+        // we normalize the area of each symbol so it is approximately the
+        // same as a circle of the given radius
+
+        var handlers = {
+            square: function (ctx, x, y, radius, shadow) {
+                // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2
+                var size = radius * Math.sqrt(Math.PI) / 2;
+                ctx.rect(x - size, y - size, size + size, size + size);
+            },
+            diamond: function (ctx, x, y, radius, shadow) {
+                // pi * r^2 = 2s^2  =>  s = r * sqrt(pi/2)
+                var size = radius * Math.sqrt(Math.PI / 2);
+                ctx.moveTo(x - size, y);
+                ctx.lineTo(x, y - size);
+                ctx.lineTo(x + size, y);
+                ctx.lineTo(x, y + size);
+                ctx.lineTo(x - size, y);
+            },
+            triangle: function (ctx, x, y, radius, shadow) {
+                // pi * r^2 = 1/2 * s^2 * sin (pi / 3)  =>  s = r * sqrt(2 * 
pi / sin(pi / 3))
+                var size = radius * Math.sqrt(2 * Math.PI / Math.sin(Math.PI / 
3));
+                var height = size * Math.sin(Math.PI / 3);
+                ctx.moveTo(x - size/2, y + height/2);
+                ctx.lineTo(x + size/2, y + height/2);
+                if (!shadow) {
+                    ctx.lineTo(x, y - height/2);
+                    ctx.lineTo(x - size/2, y + height/2);
+                }
+            },
+            cross: function (ctx, x, y, radius, shadow) {
+                // pi * r^2 = (2s)^2  =>  s = r * sqrt(pi)/2
+                var size = radius * Math.sqrt(Math.PI) / 2;
+                ctx.moveTo(x - size, y - size);
+                ctx.lineTo(x + size, y + size);
+                ctx.moveTo(x - size, y + size);
+                ctx.lineTo(x + size, y - size);
+            }
+        };
+
+        var s = series.points.symbol;
+        if (handlers[s])
+            series.points.symbol = handlers[s];
+    }
+    
+    function init(plot) {
+        plot.hooks.processDatapoints.push(processRawData);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        name: 'symbols',
+        version: '1.0'
+    });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.min.js
new file mode 100644
index 0000000..f4a3430
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.symbol.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($){function processRawData(plot,series,datapoints){var 
handlers={square:function(ctx,x,y,radius,shadow){var 
size=radius*Math.sqrt(Math.PI)/2;ctx.rect(x-size,y-size,size+size,size+size)},diamond:function(ctx,x,y,radius,shadow){var
 
size=radius*Math.sqrt(Math.PI/2);ctx.moveTo(x-size,y);ctx.lineTo(x,y-size);ctx.lineTo(x+size,y);ctx.lineTo(x,y+size);ctx.lineTo(x-size,y)},triangle:function(ctx,x,y,radius,shadow){var
 size=radius*Math.sqrt(2*Math.PI/Math.sin(Math.PI/3));var 
height=size*Math.sin(Math.PI/3);ctx.moveTo(x-size/2,y+height/2);ctx.lineTo(x+size/2,y+height/2);if(!shadow){ctx.lineTo(x,y-height/2);ctx.lineTo(x-size/2,y+height/2)}},cross:function(ctx,x,y,radius,shadow){var
 
size=radius*Math.sqrt(Math.PI)/2;ctx.moveTo(x-size,y-size);ctx.lineTo(x+size,y+size);ctx.moveTo(x-size,y+size);ctx.lineTo(x+size,y-size)}};var
 
s=series.points.symbol;if(handlers[s])series.points.symbol=handlers[s]}function 
init(plot){plot.hooks.processDatapoints.push(processRawData)}$.plot.plugins.push({in
 it:init,name:"symbols",version:"1.0"})})(jQuery);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.js
new file mode 100644
index 0000000..8c99c40
--- /dev/null
+++ b/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.js
@@ -0,0 +1,142 @@
+/* Flot plugin for thresholding data.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+The plugin supports these options:
+
+       series: {
+               threshold: {
+                       below: number
+                       color: colorspec
+               }
+       }
+
+It can also be applied to a single series, like this:
+
+       $.plot( $("#placeholder"), [{
+               data: [ ... ],
+               threshold: { ... }
+       }])
+
+An array can be passed for multiple thresholding, like this:
+
+       threshold: [{
+               below: number1
+               color: color1
+       },{
+               below: number2
+               color: color2
+       }]
+
+These multiple threshold objects can be passed in any order since they are
+sorted by the processing function.
+
+The data points below "below" are drawn with the specified color. This makes
+it easy to mark points below 0, e.g. for budget data.
+
+Internally, the plugin works by splitting the data into two series, above and
+below the threshold. The extra series below the threshold will have its label
+cleared and the special "originSeries" attribute set to the original series.
+You may need to check for this in hover events.
+
+*/
+
+(function ($) {
+    var options = {
+        series: { threshold: null } // or { below: number, color: color spec}
+    };
+    
+    function init(plot) {
+        function thresholdData(plot, s, datapoints, below, color) {
+            var ps = datapoints.pointsize, i, x, y, p, prevp,
+                thresholded = $.extend({}, s); // note: shallow copy
+
+            thresholded.datapoints = { points: [], pointsize: ps, format: 
datapoints.format };
+            thresholded.label = null;
+            thresholded.color = color;
+            thresholded.threshold = null;
+            thresholded.originSeries = s;
+            thresholded.data = [];
+ 
+            var origpoints = datapoints.points,
+                addCrossingPoints = s.lines.show;
+
+            var threspoints = [];
+            var newpoints = [];
+            var m;
+
+            for (i = 0; i < origpoints.length; i += ps) {
+                x = origpoints[i];
+                y = origpoints[i + 1];
+
+                prevp = p;
+                if (y < below)
+                    p = threspoints;
+                else
+                    p = newpoints;
+
+                if (addCrossingPoints && prevp != p && x != null
+                    && i > 0 && origpoints[i - ps] != null) {
+                    var interx = x + (below - y) * (x - origpoints[i - ps]) / 
(y - origpoints[i - ps + 1]);
+                    prevp.push(interx);
+                    prevp.push(below);
+                    for (m = 2; m < ps; ++m)
+                        prevp.push(origpoints[i + m]);
+                    
+                    p.push(null); // start new segment
+                    p.push(null);
+                    for (m = 2; m < ps; ++m)
+                        p.push(origpoints[i + m]);
+                    p.push(interx);
+                    p.push(below);
+                    for (m = 2; m < ps; ++m)
+                        p.push(origpoints[i + m]);
+                }
+
+                p.push(x);
+                p.push(y);
+                for (m = 2; m < ps; ++m)
+                    p.push(origpoints[i + m]);
+            }
+
+            datapoints.points = newpoints;
+            thresholded.datapoints.points = threspoints;
+            
+            if (thresholded.datapoints.points.length > 0) {
+                var origIndex = $.inArray(s, plot.getData());
+                // Insert newly-generated series right after original one (to 
prevent it from becoming top-most)
+                plot.getData().splice(origIndex + 1, 0, thresholded);
+            }
+                
+            // FIXME: there are probably some edge cases left in bars
+        }
+        
+        function processThresholds(plot, s, datapoints) {
+            if (!s.threshold)
+                return;
+            
+            if (s.threshold instanceof Array) {
+                s.threshold.sort(function(a, b) {
+                    return a.below - b.below;
+                });
+                
+                $(s.threshold).each(function(i, th) {
+                    thresholdData(plot, s, datapoints, th.below, th.color);
+                });
+            }
+            else {
+                thresholdData(plot, s, datapoints, s.threshold.below, 
s.threshold.color);
+            }
+        }
+        
+        plot.hooks.processDatapoints.push(processThresholds);
+    }
+    
+    $.plot.plugins.push({
+        init: init,
+        options: options,
+        name: 'threshold',
+        version: '1.2'
+    });
+})(jQuery);

http://git-wip-us.apache.org/repos/asf/accumulo/blob/0ca5cd33/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.min.js
----------------------------------------------------------------------
diff --git 
a/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.min.js 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.min.js
new file mode 100644
index 0000000..ce93e0f
--- /dev/null
+++ 
b/server/monitor/src/main/resources/resources/flot/jquery.flot.threshold.min.js
@@ -0,0 +1,7 @@
+/* Javascript plotting library for jQuery, version 0.8.3.
+
+Copyright (c) 2007-2014 IOLA and Ole Laursen.
+Licensed under the MIT license.
+
+*/
+(function($){var options={series:{threshold:null}};function 
init(plot){function thresholdData(plot,s,datapoints,below,color){var 
ps=datapoints.pointsize,i,x,y,p,prevp,thresholded=$.extend({},s);thresholded.datapoints={points:[],pointsize:ps,format:datapoints.format};thresholded.label=null;thresholded.color=color;thresholded.threshold=null;thresholded.originSeries=s;thresholded.data=[];var
 origpoints=datapoints.points,addCrossingPoints=s.lines.show;var 
threspoints=[];var newpoints=[];var 
m;for(i=0;i<origpoints.length;i+=ps){x=origpoints[i];y=origpoints[i+1];prevp=p;if(y<below)p=threspoints;else
 
p=newpoints;if(addCrossingPoints&&prevp!=p&&x!=null&&i>0&&origpoints[i-ps]!=null){var
 
interx=x+(below-y)*(x-origpoints[i-ps])/(y-origpoints[i-ps+1]);prevp.push(interx);prevp.push(below);for(m=2;m<ps;++m)prevp.push(origpoints[i+m]);p.push(null);p.push(null);for(m=2;m<ps;++m)p.push(origpoints[i+m]);p.push(interx);p.push(below);for(m=2;m<ps;++m)p.push(origpoints[i+m])}p.push(x);p.push(y);for(m=2;
 
m<ps;++m)p.push(origpoints[i+m])}datapoints.points=newpoints;thresholded.datapoints.points=threspoints;if(thresholded.datapoints.points.length>0){var
 
origIndex=$.inArray(s,plot.getData());plot.getData().splice(origIndex+1,0,thresholded)}}function
 processThresholds(plot,s,datapoints){if(!s.threshold)return;if(s.threshold 
instanceof Array){s.threshold.sort(function(a,b){return 
a.below-b.below});$(s.threshold).each(function(i,th){thresholdData(plot,s,datapoints,th.below,th.color)})}else{thresholdData(plot,s,datapoints,s.threshold.below,s.threshold.color)}}plot.hooks.processDatapoints.push(processThresholds)}$.plot.plugins.push({init:init,options:options,name:"threshold",version:"1.2"})})(jQuery);
\ No newline at end of file

Reply via email to