summaryrefslogtreecommitdiff
path: root/addons/web_graph/static/lib/flotr2/js/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web_graph/static/lib/flotr2/js/plugins')
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/crosshair.js84
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/download.js51
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/grid.js208
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/handles.js199
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/hit.js337
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/labels.js227
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/legend.js179
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/selection.js278
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/spreadsheet.js296
-rw-r--r--addons/web_graph/static/lib/flotr2/js/plugins/titles.js177
10 files changed, 0 insertions, 2036 deletions
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/crosshair.js b/addons/web_graph/static/lib/flotr2/js/plugins/crosshair.js
deleted file mode 100644
index 611ebf85800..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/crosshair.js
+++ /dev/null
@@ -1,84 +0,0 @@
-(function () {
-
-var D = Flotr.DOM;
-
-Flotr.addPlugin('crosshair', {
- options: {
- mode: null, // => one of null, 'x', 'y' or 'xy'
- color: '#FF0000', // => crosshair color
- hideCursor: true // => hide the cursor when the crosshair is shown
- },
- callbacks: {
- 'flotr:mousemove': function(e, pos) {
- if (this.options.crosshair.mode) {
- this.crosshair.clearCrosshair();
- this.crosshair.drawCrosshair(pos);
- }
- }
- },
- /**
- * Draws the selection box.
- */
- drawCrosshair: function(pos) {
- var octx = this.octx,
- options = this.options.crosshair,
- plotOffset = this.plotOffset,
- x = plotOffset.left + pos.relX + 0.5,
- y = plotOffset.top + pos.relY + 0.5;
-
- if (pos.relX < 0 || pos.relY < 0 || pos.relX > this.plotWidth || pos.relY > this.plotHeight) {
- this.el.style.cursor = null;
- D.removeClass(this.el, 'flotr-crosshair');
- return;
- }
-
- if (options.hideCursor) {
- this.el.style.cursor = 'none';
- D.addClass(this.el, 'flotr-crosshair');
- }
-
- octx.save();
- octx.strokeStyle = options.color;
- octx.lineWidth = 1;
- octx.beginPath();
-
- if (options.mode.indexOf('x') != -1) {
- octx.moveTo(x, plotOffset.top);
- octx.lineTo(x, plotOffset.top + this.plotHeight);
- }
-
- if (options.mode.indexOf('y') != -1) {
- octx.moveTo(plotOffset.left, y);
- octx.lineTo(plotOffset.left + this.plotWidth, y);
- }
-
- octx.stroke();
- octx.restore();
- },
- /**
- * Removes the selection box from the overlay canvas.
- */
- clearCrosshair: function() {
-
- var
- plotOffset = this.plotOffset,
- position = this.lastMousePos,
- context = this.octx;
-
- if (position) {
- context.clearRect(
- position.relX + plotOffset.left,
- plotOffset.top,
- 1,
- this.plotHeight + 1
- );
- context.clearRect(
- plotOffset.left,
- position.relY + plotOffset.top,
- this.plotWidth + 1,
- 1
- );
- }
- }
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/download.js b/addons/web_graph/static/lib/flotr2/js/plugins/download.js
deleted file mode 100644
index 5d585325be9..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/download.js
+++ /dev/null
@@ -1,51 +0,0 @@
-(function() {
-
-var
- D = Flotr.DOM,
- _ = Flotr._;
-
-function getImage (type, canvas, width, height) {
-
- // TODO add scaling for w / h
- var
- mime = 'image/'+type,
- data = canvas.toDataURL(mime),
- image = new Image();
- image.src = data;
- return image;
-}
-
-Flotr.addPlugin('download', {
-
- saveImage: function (type, width, height, replaceCanvas) {
- var image = null;
- if (Flotr.isIE && Flotr.isIE < 9) {
- image = '<html><body>'+this.canvas.firstChild.innerHTML+'</body></html>';
- return window.open().document.write(image);
- }
-
- if (type !== 'jpeg' && type !== 'png') return;
-
- image = getImage(type, this.canvas, width, height);
-
- if (_.isElement(image) && replaceCanvas) {
- this.download.restoreCanvas();
- D.hide(this.canvas);
- D.hide(this.overlay);
- D.setStyles({position: 'absolute'});
- D.insert(this.el, image);
- this.saveImageElement = image;
- } else {
- return window.open(image.src);
- }
- },
-
- restoreCanvas: function() {
- D.show(this.canvas);
- D.show(this.overlay);
- if (this.saveImageElement) this.el.removeChild(this.saveImageElement);
- this.saveImageElement = null;
- }
-});
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/grid.js b/addons/web_graph/static/lib/flotr2/js/plugins/grid.js
deleted file mode 100644
index ab90d8d591a..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/grid.js
+++ /dev/null
@@ -1,208 +0,0 @@
-(function () {
-
-var E = Flotr.EventAdapter,
- _ = Flotr._;
-
-Flotr.addPlugin('graphGrid', {
-
- callbacks: {
- 'flotr:beforedraw' : function () {
- this.graphGrid.drawGrid();
- },
- 'flotr:afterdraw' : function () {
- this.graphGrid.drawOutline();
- }
- },
-
- drawGrid: function(){
-
- var
- ctx = this.ctx,
- options = this.options,
- grid = options.grid,
- verticalLines = grid.verticalLines,
- horizontalLines = grid.horizontalLines,
- minorVerticalLines = grid.minorVerticalLines,
- minorHorizontalLines = grid.minorHorizontalLines,
- plotHeight = this.plotHeight,
- plotWidth = this.plotWidth,
- a, v, i, j;
-
- if(verticalLines || minorVerticalLines ||
- horizontalLines || minorHorizontalLines){
- E.fire(this.el, 'flotr:beforegrid', [this.axes.x, this.axes.y, options, this]);
- }
- ctx.save();
- ctx.lineWidth = 1;
- ctx.strokeStyle = grid.tickColor;
-
- function circularHorizontalTicks (ticks) {
- for(i = 0; i < ticks.length; ++i){
- var ratio = ticks[i].v / a.max;
- for(j = 0; j <= sides; ++j){
- ctx[j === 0 ? 'moveTo' : 'lineTo'](
- Math.cos(j*coeff+angle)*radius*ratio,
- Math.sin(j*coeff+angle)*radius*ratio
- );
- }
- }
- }
- function drawGridLines (ticks, callback) {
- _.each(_.pluck(ticks, 'v'), function(v){
- // Don't show lines on upper and lower bounds.
- if ((v <= a.min || v >= a.max) ||
- (v == a.min || v == a.max) && grid.outlineWidth)
- return;
- callback(Math.floor(a.d2p(v)) + ctx.lineWidth/2);
- });
- }
- function drawVerticalLines (x) {
- ctx.moveTo(x, 0);
- ctx.lineTo(x, plotHeight);
- }
- function drawHorizontalLines (y) {
- ctx.moveTo(0, y);
- ctx.lineTo(plotWidth, y);
- }
-
- if (grid.circular) {
- ctx.translate(this.plotOffset.left+plotWidth/2, this.plotOffset.top+plotHeight/2);
- var radius = Math.min(plotHeight, plotWidth)*options.radar.radiusRatio/2,
- sides = this.axes.x.ticks.length,
- coeff = 2*(Math.PI/sides),
- angle = -Math.PI/2;
-
- // Draw grid lines in vertical direction.
- ctx.beginPath();
-
- a = this.axes.y;
-
- if(horizontalLines){
- circularHorizontalTicks(a.ticks);
- }
- if(minorHorizontalLines){
- circularHorizontalTicks(a.minorTicks);
- }
-
- if(verticalLines){
- _.times(sides, function(i){
- ctx.moveTo(0, 0);
- ctx.lineTo(Math.cos(i*coeff+angle)*radius, Math.sin(i*coeff+angle)*radius);
- });
- }
- ctx.stroke();
- }
- else {
- ctx.translate(this.plotOffset.left, this.plotOffset.top);
-
- // Draw grid background, if present in options.
- if(grid.backgroundColor){
- ctx.fillStyle = this.processColor(grid.backgroundColor, {x1: 0, y1: 0, x2: plotWidth, y2: plotHeight});
- ctx.fillRect(0, 0, plotWidth, plotHeight);
- }
-
- ctx.beginPath();
-
- a = this.axes.x;
- if (verticalLines) drawGridLines(a.ticks, drawVerticalLines);
- if (minorVerticalLines) drawGridLines(a.minorTicks, drawVerticalLines);
-
- a = this.axes.y;
- if (horizontalLines) drawGridLines(a.ticks, drawHorizontalLines);
- if (minorHorizontalLines) drawGridLines(a.minorTicks, drawHorizontalLines);
-
- ctx.stroke();
- }
-
- ctx.restore();
- if(verticalLines || minorVerticalLines ||
- horizontalLines || minorHorizontalLines){
- E.fire(this.el, 'flotr:aftergrid', [this.axes.x, this.axes.y, options, this]);
- }
- },
-
- drawOutline: function(){
- var
- that = this,
- options = that.options,
- grid = options.grid,
- outline = grid.outline,
- ctx = that.ctx,
- backgroundImage = grid.backgroundImage,
- plotOffset = that.plotOffset,
- leftOffset = plotOffset.left,
- topOffset = plotOffset.top,
- plotWidth = that.plotWidth,
- plotHeight = that.plotHeight,
- v, img, src, left, top, globalAlpha;
-
- if (!grid.outlineWidth) return;
-
- ctx.save();
-
- if (grid.circular) {
- ctx.translate(leftOffset + plotWidth / 2, topOffset + plotHeight / 2);
- var radius = Math.min(plotHeight, plotWidth) * options.radar.radiusRatio / 2,
- sides = this.axes.x.ticks.length,
- coeff = 2*(Math.PI/sides),
- angle = -Math.PI/2;
-
- // Draw axis/grid border.
- ctx.beginPath();
- ctx.lineWidth = grid.outlineWidth;
- ctx.strokeStyle = grid.color;
- ctx.lineJoin = 'round';
-
- for(i = 0; i <= sides; ++i){
- ctx[i === 0 ? 'moveTo' : 'lineTo'](Math.cos(i*coeff+angle)*radius, Math.sin(i*coeff+angle)*radius);
- }
- //ctx.arc(0, 0, radius, 0, Math.PI*2, true);
-
- ctx.stroke();
- }
- else {
- ctx.translate(leftOffset, topOffset);
-
- // Draw axis/grid border.
- var lw = grid.outlineWidth,
- orig = 0.5-lw+((lw+1)%2/2),
- lineTo = 'lineTo',
- moveTo = 'moveTo';
- ctx.lineWidth = lw;
- ctx.strokeStyle = grid.color;
- ctx.lineJoin = 'miter';
- ctx.beginPath();
- ctx.moveTo(orig, orig);
- plotWidth = plotWidth - (lw / 2) % 1;
- plotHeight = plotHeight + lw / 2;
- ctx[outline.indexOf('n') !== -1 ? lineTo : moveTo](plotWidth, orig);
- ctx[outline.indexOf('e') !== -1 ? lineTo : moveTo](plotWidth, plotHeight);
- ctx[outline.indexOf('s') !== -1 ? lineTo : moveTo](orig, plotHeight);
- ctx[outline.indexOf('w') !== -1 ? lineTo : moveTo](orig, orig);
- ctx.stroke();
- ctx.closePath();
- }
-
- ctx.restore();
-
- if (backgroundImage) {
-
- src = backgroundImage.src || backgroundImage;
- left = (parseInt(backgroundImage.left, 10) || 0) + plotOffset.left;
- top = (parseInt(backgroundImage.top, 10) || 0) + plotOffset.top;
- img = new Image();
-
- img.onload = function() {
- ctx.save();
- if (backgroundImage.alpha) ctx.globalAlpha = backgroundImage.alpha;
- ctx.globalCompositeOperation = 'destination-over';
- ctx.drawImage(img, 0, 0, img.width, img.height, left, top, plotWidth, plotHeight);
- ctx.restore();
- };
-
- img.src = src;
- }
- }
-});
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/handles.js b/addons/web_graph/static/lib/flotr2/js/plugins/handles.js
deleted file mode 100644
index 92fd3247fdf..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/handles.js
+++ /dev/null
@@ -1,199 +0,0 @@
-/**
- * Selection Handles Plugin
- *
- * Depends upon options.selection.mode
- *
- * Options
- * show - True enables the handles plugin.
- * drag - Left and Right drag handles
- * scroll - Scrolling handle
- */
-(function () {
-
-var D = Flotr.DOM;
-
-Flotr.addPlugin('handles', {
-
- options: {
- show: false,
- drag: true,
- scroll: true
- },
-
- callbacks: {
- 'flotr:afterinit': init,
- 'flotr:select': handleSelect,
- 'flotr:mousedown': reset,
- 'flotr:mousemove': mouseMoveHandler
- }
-
-});
-
-
-function init() {
-
- var
- options = this.options,
- handles = this.handles,
- el = this.el,
- scroll, left, right, container;
-
- if (!options.selection.mode || !options.handles.show || 'ontouchstart' in el) return;
-
- handles.initialized = true;
-
- container = D.node('<div class="flotr-handles"></div>');
- options = options.handles;
-
- // Drag handles
- if (options.drag) {
- right = D.node('<div class="flotr-handles-handle flotr-handles-drag flotr-handles-right"></div>');
- left = D.node('<div class="flotr-handles-handle flotr-handles-drag flotr-handles-left"></div>');
- D.insert(container, right);
- D.insert(container, left);
- D.hide(left);
- D.hide(right);
- handles.left = left;
- handles.right = right;
-
- this.observe(left, 'mousedown', function () {
- handles.moveHandler = leftMoveHandler;
- });
- this.observe(right, 'mousedown', function () {
- handles.moveHandler = rightMoveHandler;
- });
- }
-
- // Scroll handle
- if (options.scroll) {
- scroll = D.node('<div class="flotr-handles-handle flotr-handles-scroll"></div>');
- D.insert(container, scroll);
- D.hide(scroll);
- handles.scroll = scroll;
- this.observe(scroll, 'mousedown', function () {
- handles.moveHandler = scrollMoveHandler;
- });
- }
-
- this.observe(document, 'mouseup', function() {
- handles.moveHandler = null;
- });
-
- D.insert(el, container);
-}
-
-
-function handleSelect(selection) {
-
- if (!this.handles.initialized) return;
-
- var
- handles = this.handles,
- options = this.options.handles,
- left = handles.left,
- right = handles.right,
- scroll = handles.scroll;
-
- if (options) {
- if (options.drag) {
- positionDrag(this, left, selection.x1);
- positionDrag(this, right, selection.x2);
- }
-
- if (options.scroll) {
- positionScroll(
- this,
- scroll,
- selection.x1,
- selection.x2
- );
- }
- }
-}
-
-function positionDrag(graph, handle, x) {
-
- D.show(handle);
-
- var size = D.size(handle),
- l = Math.round(graph.axes.x.d2p(x) - size.width / 2),
- t = (graph.plotHeight - size.height) / 2;
-
- D.setStyles(handle, {
- 'left' : l+'px',
- 'top' : t+'px'
- });
-}
-
-function positionScroll(graph, handle, x1, x2) {
-
- D.show(handle);
-
- var size = D.size(handle),
- l = Math.round(graph.axes.x.d2p(x1)),
- t = (graph.plotHeight) - size.height / 2,
- w = (graph.axes.x.d2p(x2) - graph.axes.x.d2p(x1));
-
- D.setStyles(handle, {
- 'left' : l+'px',
- 'top' : t+'px',
- 'width': w+'px'
- });
-}
-
-function reset() {
-
- if (!this.handles.initialized) return;
-
- var
- handles = this.handles;
- if (handles) {
- D.hide(handles.left);
- D.hide(handles.right);
- D.hide(handles.scroll);
- }
-}
-
-function mouseMoveHandler(e, position) {
-
- if (!this.handles.initialized) return;
- if (!this.handles.moveHandler) return;
-
- var
- delta = position.dX,
- selection = this.selection.selection,
- area = this.selection.getArea(),
- handles = this.handles;
-
- handles.moveHandler(area, delta);
- checkSwap(area, handles);
-
- this.selection.setSelection(area);
-}
-
-function checkSwap (area, handles) {
- var moveHandler = handles.moveHandler;
- if (area.x1 > area.x2) {
- if (moveHandler == leftMoveHandler) {
- moveHandler = rightMoveHandler;
- } else if (moveHandler == rightMoveHandler) {
- moveHandler = leftMoveHandler;
- }
- handles.moveHandler = moveHandler;
- }
-}
-
-function leftMoveHandler(area, delta) {
- area.x1 += delta;
-}
-
-function rightMoveHandler(area, delta) {
- area.x2 += delta;
-}
-
-function scrollMoveHandler(area, delta) {
- area.x1 += delta;
- area.x2 += delta;
-}
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/hit.js b/addons/web_graph/static/lib/flotr2/js/plugins/hit.js
deleted file mode 100644
index eeff570df35..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/hit.js
+++ /dev/null
@@ -1,337 +0,0 @@
-(function () {
-
-var
- D = Flotr.DOM,
- _ = Flotr._,
- flotr = Flotr,
- S_MOUSETRACK = 'opacity:0.7;background-color:#000;color:#fff;display:none;position:absolute;padding:2px 8px;-moz-border-radius:4px;border-radius:4px;white-space:nowrap;';
-
-Flotr.addPlugin('hit', {
- callbacks: {
- 'flotr:mousemove': function(e, pos) {
- this.hit.track(pos);
- },
- 'flotr:click': function(pos) {
- this.hit.track(pos);
- },
- 'flotr:mouseout': function() {
- this.hit.clearHit();
- }
- },
- track : function (pos) {
- if (this.options.mouse.track || _.any(this.series, function(s){return s.mouse && s.mouse.track;})) {
- this.hit.hit(pos);
- }
- },
- /**
- * Try a method on a graph type. If the method exists, execute it.
- * @param {Object} series
- * @param {String} method Method name.
- * @param {Array} args Arguments applied to method.
- * @return executed successfully or failed.
- */
- executeOnType: function(s, method, args){
- var
- success = false,
- options;
-
- if (!_.isArray(s)) s = [s];
-
- function e(s, index) {
- _.each(_.keys(flotr.graphTypes), function (type) {
- if (s[type] && s[type].show && this[type][method]) {
- options = this.getOptions(s, type);
-
- options.fill = !!s.mouse.fillColor;
- options.fillStyle = this.processColor(s.mouse.fillColor || '#ffffff', {opacity: s.mouse.fillOpacity});
- options.color = s.mouse.lineColor;
- options.context = this.octx;
- options.index = index;
-
- if (args) options.args = args;
- this[type][method].call(this[type], options);
- success = true;
- }
- }, this);
- }
- _.each(s, e, this);
-
- return success;
- },
- /**
- * Updates the mouse tracking point on the overlay.
- */
- drawHit: function(n){
- var octx = this.octx,
- s = n.series;
-
- if (s.mouse.lineColor) {
- octx.save();
- octx.lineWidth = (s.points ? s.points.lineWidth : 1);
- octx.strokeStyle = s.mouse.lineColor;
- octx.fillStyle = this.processColor(s.mouse.fillColor || '#ffffff', {opacity: s.mouse.fillOpacity});
- octx.translate(this.plotOffset.left, this.plotOffset.top);
-
- if (!this.hit.executeOnType(s, 'drawHit', n)) {
- var xa = n.xaxis,
- ya = n.yaxis;
-
- octx.beginPath();
- // TODO fix this (points) should move to general testable graph mixin
- octx.arc(xa.d2p(n.x), ya.d2p(n.y), s.points.radius || s.mouse.radius, 0, 2 * Math.PI, true);
- octx.fill();
- octx.stroke();
- octx.closePath();
- }
- octx.restore();
- }
- this.prevHit = n;
- },
- /**
- * Removes the mouse tracking point from the overlay.
- */
- clearHit: function(){
- var prev = this.prevHit,
- octx = this.octx,
- plotOffset = this.plotOffset;
- octx.save();
- octx.translate(plotOffset.left, plotOffset.top);
- if (prev) {
- if (!this.hit.executeOnType(prev.series, 'clearHit', this.prevHit)) {
- // TODO fix this (points) should move to general testable graph mixin
- var
- s = prev.series,
- lw = (s.points ? s.points.lineWidth : 1);
- offset = (s.points.radius || s.mouse.radius) + lw;
- octx.clearRect(
- prev.xaxis.d2p(prev.x) - offset,
- prev.yaxis.d2p(prev.y) - offset,
- offset*2,
- offset*2
- );
- }
- D.hide(this.mouseTrack);
- this.prevHit = null;
- }
- octx.restore();
- },
- /**
- * Retrieves the nearest data point from the mouse cursor. If it's within
- * a certain range, draw a point on the overlay canvas and display the x and y
- * value of the data.
- * @param {Object} mouse - Object that holds the relative x and y coordinates of the cursor.
- */
- hit: function(mouse){
-
- var
- options = this.options,
- prevHit = this.prevHit,
- closest, sensibility, dataIndex, seriesIndex, series, value, xaxis, yaxis;
-
- if (this.series.length === 0) return;
-
- // Nearest data element.
- // dist, x, y, relX, relY, absX, absY, sAngle, eAngle, fraction, mouse,
- // xaxis, yaxis, series, index, seriesIndex
- n = {
- relX : mouse.relX,
- relY : mouse.relY,
- absX : mouse.absX,
- absY : mouse.absY
- };
-
- if (options.mouse.trackY &&
- !options.mouse.trackAll &&
- this.hit.executeOnType(this.series, 'hit', [mouse, n]))
- {
-
- if (!_.isUndefined(n.seriesIndex)) {
- series = this.series[n.seriesIndex];
- n.series = series;
- n.mouse = series.mouse;
- n.xaxis = series.xaxis;
- n.yaxis = series.yaxis;
- }
- } else {
-
- closest = this.hit.closest(mouse);
-
- if (closest) {
-
- closest = options.mouse.trackY ? closest.point : closest.x;
- seriesIndex = closest.seriesIndex;
- series = this.series[seriesIndex];
- xaxis = series.xaxis;
- yaxis = series.yaxis;
- sensibility = 2 * series.mouse.sensibility;
-
- if
- (options.mouse.trackAll ||
- (closest.distanceX < sensibility / xaxis.scale &&
- (!options.mouse.trackY || closest.distanceY < sensibility / yaxis.scale)))
- {
- n.series = series;
- n.xaxis = series.xaxis;
- n.yaxis = series.yaxis;
- n.mouse = series.mouse;
- n.x = closest.x;
- n.y = closest.y;
- n.dist = closest.distance;
- n.index = closest.dataIndex;
- n.seriesIndex = seriesIndex;
- }
- }
- }
-
- if (!prevHit || (prevHit.index !== n.index || prevHit.seriesIndex !== n.seriesIndex)) {
- this.hit.clearHit();
- if (n.series && n.mouse && n.mouse.track) {
- this.hit.drawMouseTrack(n);
- this.hit.drawHit(n);
- Flotr.EventAdapter.fire(this.el, 'flotr:hit', [n, this]);
- }
- }
- },
-
- closest : function (mouse) {
-
- var
- series = this.series,
- options = this.options,
- mouseX = mouse.x,
- mouseY = mouse.y,
- compare = Number.MAX_VALUE,
- compareX = Number.MAX_VALUE,
- closest = {},
- closestX = {},
- check = false,
- serie, data,
- distance, distanceX, distanceY,
- x, y, i, j;
-
- function setClosest (o) {
- o.distance = distance;
- o.distanceX = distanceX;
- o.distanceY = distanceY;
- o.seriesIndex = i;
- o.dataIndex = j;
- o.x = x;
- o.y = y;
- }
-
- for (i = 0; i < series.length; i++) {
-
- serie = series[i];
- data = serie.data;
-
- if (data.length) check = true;
-
- for (j = data.length; j--;) {
-
- x = data[j][0];
- y = data[j][1];
-
- if (x === null || y === null) continue;
-
- // don't check if the point isn't visible in the current range
- if (x < serie.xaxis.min || x > serie.xaxis.max) continue;
-
- distanceX = Math.abs(x - mouseX);
- distanceY = Math.abs(y - mouseY);
-
- // Skip square root for speed
- distance = distanceX * distanceX + distanceY * distanceY;
-
- if (distance < compare) {
- compare = distance;
- setClosest(closest);
- }
-
- if (distanceX < compareX) {
- compareX = distanceX;
- setClosest(closestX);
- }
- }
- }
-
- return check ? {
- point : closest,
- x : closestX
- } : false;
- },
-
- drawMouseTrack : function (n) {
-
- var
- pos = '',
- s = n.series,
- p = n.mouse.position,
- m = n.mouse.margin,
- elStyle = S_MOUSETRACK,
- mouseTrack = this.mouseTrack,
- plotOffset = this.plotOffset,
- left = plotOffset.left,
- right = plotOffset.right,
- bottom = plotOffset.bottom,
- top = plotOffset.top,
- decimals = n.mouse.trackDecimals,
- options = this.options;
-
- // Create
- if (!mouseTrack) {
- mouseTrack = D.node('<div class="flotr-mouse-value"></div>');
- this.mouseTrack = mouseTrack;
- D.insert(this.el, mouseTrack);
- }
-
- if (!n.mouse.relative) { // absolute to the canvas
-
- if (p.charAt(0) == 'n') pos += 'top:' + (m + top) + 'px;bottom:auto;';
- else if (p.charAt(0) == 's') pos += 'bottom:' + (m + bottom) + 'px;top:auto;';
- if (p.charAt(1) == 'e') pos += 'right:' + (m + right) + 'px;left:auto;';
- else if (p.charAt(1) == 'w') pos += 'left:' + (m + left) + 'px;right:auto;';
-
- // Bars
- } else if (s.bars.show) {
- pos += 'bottom:' + (m - top - n.yaxis.d2p(n.y/2) + this.canvasHeight) + 'px;top:auto;';
- pos += 'left:' + (m + left + n.xaxis.d2p(n.x - options.bars.barWidth/2)) + 'px;right:auto;';
-
- // Pie
- } else if (s.pie.show) {
- var center = {
- x: (this.plotWidth)/2,
- y: (this.plotHeight)/2
- },
- radius = (Math.min(this.canvasWidth, this.canvasHeight) * s.pie.sizeRatio) / 2,
- bisection = n.sAngle<n.eAngle ? (n.sAngle + n.eAngle) / 2: (n.sAngle + n.eAngle + 2* Math.PI) / 2;
-
- pos += 'bottom:' + (m - top - center.y - Math.sin(bisection) * radius/2 + this.canvasHeight) + 'px;top:auto;';
- pos += 'left:' + (m + left + center.x + Math.cos(bisection) * radius/2) + 'px;right:auto;';
-
- // Default
- } else {
- if (p.charAt(0) == 'n') pos += 'bottom:' + (m - top - n.yaxis.d2p(n.y) + this.canvasHeight) + 'px;top:auto;';
- else if (p.charAt(0) == 's') pos += 'top:' + (m + top + n.yaxis.d2p(n.y)) + 'px;bottom:auto;';
- if (p.charAt(1) == 'e') pos += 'left:' + (m + left + n.xaxis.d2p(n.x)) + 'px;right:auto;';
- else if (p.charAt(1) == 'w') pos += 'right:' + (m - left - n.xaxis.d2p(n.x) + this.canvasWidth) + 'px;left:auto;';
- }
-
- elStyle += pos;
- mouseTrack.style.cssText = elStyle;
-
- if (!decimals || decimals < 0) decimals = 0;
-
- mouseTrack.innerHTML = n.mouse.trackFormatter({
- x: n.x.toFixed(decimals),
- y: n.y.toFixed(decimals),
- series: n.series,
- index: n.index,
- nearest: n,
- fraction: n.fraction
- });
-
- D.show(mouseTrack);
- }
-
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/labels.js b/addons/web_graph/static/lib/flotr2/js/plugins/labels.js
deleted file mode 100644
index 8e016c8fa03..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/labels.js
+++ /dev/null
@@ -1,227 +0,0 @@
-(function () {
-
-var D = Flotr.DOM;
-
-Flotr.addPlugin('labels', {
-
- callbacks : {
- 'flotr:afterdraw' : function () {
- this.labels.draw();
- }
- },
-
- draw: function(){
- // Construct fixed width label boxes, which can be styled easily.
- var
- axis, tick, left, top, xBoxWidth,
- radius, sides, coeff, angle,
- div, i, html = '',
- noLabels = 0,
- options = this.options,
- ctx = this.ctx,
- a = this.axes,
- style = { size: options.fontSize };
-
- for (i = 0; i < a.x.ticks.length; ++i){
- if (a.x.ticks[i].label) { ++noLabels; }
- }
- xBoxWidth = this.plotWidth / noLabels;
-
- if (options.grid.circular) {
- ctx.save();
- ctx.translate(this.plotOffset.left + this.plotWidth / 2,
- this.plotOffset.top + this.plotHeight / 2);
-
- radius = this.plotHeight * options.radar.radiusRatio / 2 + options.fontSize;
- sides = this.axes.x.ticks.length;
- coeff = 2 * (Math.PI / sides);
- angle = -Math.PI / 2;
-
- drawLabelCircular(this, a.x, false);
- drawLabelCircular(this, a.x, true);
- drawLabelCircular(this, a.y, false);
- drawLabelCircular(this, a.y, true);
- ctx.restore();
- }
-
- if (!options.HtmlText && this.textEnabled) {
- drawLabelNoHtmlText(this, a.x, 'center', 'top');
- drawLabelNoHtmlText(this, a.x2, 'center', 'bottom');
- drawLabelNoHtmlText(this, a.y, 'right', 'middle');
- drawLabelNoHtmlText(this, a.y2, 'left', 'middle');
-
- } else if ((
- a.x.options.showLabels ||
- a.x2.options.showLabels ||
- a.y.options.showLabels ||
- a.y2.options.showLabels) &&
- !options.grid.circular
- ) {
-
- html = '';
-
- drawLabelHtml(this, a.x);
- drawLabelHtml(this, a.x2);
- drawLabelHtml(this, a.y);
- drawLabelHtml(this, a.y2);
-
- ctx.stroke();
- ctx.restore();
- div = D.create('div');
- D.setStyles(div, {
- fontSize: 'smaller',
- color: options.grid.color
- });
- div.className = 'flotr-labels';
- D.insert(this.el, div);
- D.insert(div, html);
- }
-
- function drawLabelCircular (graph, axis, minorTicks) {
- var
- ticks = minorTicks ? axis.minorTicks : axis.ticks,
- isX = axis.orientation === 1,
- isFirst = axis.n === 1,
- style, offset;
-
- style = {
- color : axis.options.color || options.grid.color,
- angle : Flotr.toRad(axis.options.labelsAngle),
- textBaseline : 'middle'
- };
-
- for (i = 0; i < ticks.length &&
- (minorTicks ? axis.options.showMinorLabels : axis.options.showLabels); ++i){
- tick = ticks[i];
- tick.label += '';
- if (!tick.label || !tick.label.length) { continue; }
-
- x = Math.cos(i * coeff + angle) * radius;
- y = Math.sin(i * coeff + angle) * radius;
-
- style.textAlign = isX ? (Math.abs(x) < 0.1 ? 'center' : (x < 0 ? 'right' : 'left')) : 'left';
-
- Flotr.drawText(
- ctx, tick.label,
- isX ? x : 3,
- isX ? y : -(axis.ticks[i].v / axis.max) * (radius - options.fontSize),
- style
- );
- }
- }
-
- function drawLabelNoHtmlText (graph, axis, textAlign, textBaseline) {
- var
- isX = axis.orientation === 1,
- isFirst = axis.n === 1,
- style, offset;
-
- style = {
- color : axis.options.color || options.grid.color,
- textAlign : textAlign,
- textBaseline : textBaseline,
- angle : Flotr.toRad(axis.options.labelsAngle)
- };
- style = Flotr.getBestTextAlign(style.angle, style);
-
- for (i = 0; i < axis.ticks.length && continueShowingLabels(axis); ++i) {
-
- tick = axis.ticks[i];
- if (!tick.label || !tick.label.length) { continue; }
-
- offset = axis.d2p(tick.v);
- if (offset < 0 ||
- offset > (isX ? graph.plotWidth : graph.plotHeight)) { continue; }
-
- Flotr.drawText(
- ctx, tick.label,
- leftOffset(graph, isX, isFirst, offset),
- topOffset(graph, isX, isFirst, offset),
- style
- );
-
- // Only draw on axis y2
- if (!isX && !isFirst) {
- ctx.save();
- ctx.strokeStyle = style.color;
- ctx.beginPath();
- ctx.moveTo(graph.plotOffset.left + graph.plotWidth - 8, graph.plotOffset.top + axis.d2p(tick.v));
- ctx.lineTo(graph.plotOffset.left + graph.plotWidth, graph.plotOffset.top + axis.d2p(tick.v));
- ctx.stroke();
- ctx.restore();
- }
- }
-
- function continueShowingLabels (axis) {
- return axis.options.showLabels && axis.used;
- }
- function leftOffset (graph, isX, isFirst, offset) {
- return graph.plotOffset.left +
- (isX ? offset :
- (isFirst ?
- -options.grid.labelMargin :
- options.grid.labelMargin + graph.plotWidth));
- }
- function topOffset (graph, isX, isFirst, offset) {
- return graph.plotOffset.top +
- (isX ? options.grid.labelMargin : offset) +
- ((isX && isFirst) ? graph.plotHeight : 0);
- }
- }
-
- function drawLabelHtml (graph, axis) {
- var
- isX = axis.orientation === 1,
- isFirst = axis.n === 1,
- name = '',
- left, style, top,
- offset = graph.plotOffset;
-
- if (!isX && !isFirst) {
- ctx.save();
- ctx.strokeStyle = axis.options.color || options.grid.color;
- ctx.beginPath();
- }
-
- if (axis.options.showLabels && (isFirst ? true : axis.used)) {
- for (i = 0; i < axis.ticks.length; ++i) {
- tick = axis.ticks[i];
- if (!tick.label || !tick.label.length ||
- ((isX ? offset.left : offset.top) + axis.d2p(tick.v) < 0) ||
- ((isX ? offset.left : offset.top) + axis.d2p(tick.v) > (isX ? graph.canvasWidth : graph.canvasHeight))) {
- continue;
- }
- top = offset.top +
- (isX ?
- ((isFirst ? 1 : -1 ) * (graph.plotHeight + options.grid.labelMargin)) :
- axis.d2p(tick.v) - axis.maxLabel.height / 2);
- left = isX ? (offset.left + axis.d2p(tick.v) - xBoxWidth / 2) : 0;
-
- name = '';
- if (i === 0) {
- name = ' first';
- } else if (i === axis.ticks.length - 1) {
- name = ' last';
- }
- name += isX ? ' flotr-grid-label-x' : ' flotr-grid-label-y';
-
- html += [
- '<div style="position:absolute; text-align:' + (isX ? 'center' : 'right') + '; ',
- 'top:' + top + 'px; ',
- ((!isX && !isFirst) ? 'right:' : 'left:') + left + 'px; ',
- 'width:' + (isX ? xBoxWidth : ((isFirst ? offset.left : offset.right) - options.grid.labelMargin)) + 'px; ',
- axis.options.color ? ('color:' + axis.options.color + '; ') : ' ',
- '" class="flotr-grid-label' + name + '">' + tick.label + '</div>'
- ].join(' ');
-
- if (!isX && !isFirst) {
- ctx.moveTo(offset.left + graph.plotWidth - 8, offset.top + axis.d2p(tick.v));
- ctx.lineTo(offset.left + graph.plotWidth, offset.top + axis.d2p(tick.v));
- }
- }
- }
- }
- }
-
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/legend.js b/addons/web_graph/static/lib/flotr2/js/plugins/legend.js
deleted file mode 100644
index d130cb5e90b..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/legend.js
+++ /dev/null
@@ -1,179 +0,0 @@
-(function () {
-
-var
- D = Flotr.DOM,
- _ = Flotr._;
-
-Flotr.addPlugin('legend', {
- options: {
- show: true, // => setting to true will show the legend, hide otherwise
- noColumns: 1, // => number of colums in legend table // @todo: doesn't work for HtmlText = false
- labelFormatter: function(v){return v;}, // => fn: string -> string
- labelBoxBorderColor: '#CCCCCC', // => border color for the little label boxes
- labelBoxWidth: 14,
- labelBoxHeight: 10,
- labelBoxMargin: 5,
- labelBoxOpacity: 0.4,
- container: null, // => container (as jQuery object) to put legend in, null means default on top of graph
- position: 'nw', // => position of default legend container within plot
- margin: 5, // => distance from grid edge to default legend container within plot
- backgroundColor: null, // => null means auto-detect
- backgroundOpacity: 0.85// => set to 0 to avoid background, set to 1 for a solid background
- },
- callbacks: {
- 'flotr:afterinit': function() {
- this.legend.insertLegend();
- }
- },
- /**
- * Adds a legend div to the canvas container or draws it on the canvas.
- */
- insertLegend: function(){
-
- if(!this.options.legend.show)
- return;
-
- var series = this.series,
- plotOffset = this.plotOffset,
- options = this.options,
- legend = options.legend,
- fragments = [],
- rowStarted = false,
- ctx = this.ctx,
- itemCount = _.filter(series, function(s) {return (s.label && !s.hide);}).length,
- p = legend.position,
- m = legend.margin,
- i, label, color;
-
- if (itemCount) {
- if (!options.HtmlText && this.textEnabled && !legend.container) {
- var style = {
- size: options.fontSize*1.1,
- color: options.grid.color
- };
-
- var lbw = legend.labelBoxWidth,
- lbh = legend.labelBoxHeight,
- lbm = legend.labelBoxMargin,
- offsetX = plotOffset.left + m,
- offsetY = plotOffset.top + m;
-
- // We calculate the labels' max width
- var labelMaxWidth = 0;
- for(i = series.length - 1; i > -1; --i){
- if(!series[i].label || series[i].hide) continue;
- label = legend.labelFormatter(series[i].label);
- labelMaxWidth = Math.max(labelMaxWidth, this._text.measureText(label, style).width);
- }
-
- var legendWidth = Math.round(lbw + lbm*3 + labelMaxWidth),
- legendHeight = Math.round(itemCount*(lbm+lbh) + lbm);
-
- if(p.charAt(0) == 's') offsetY = plotOffset.top + this.plotHeight - (m + legendHeight);
- if(p.charAt(1) == 'e') offsetX = plotOffset.left + this.plotWidth - (m + legendWidth);
-
- // Legend box
- color = this.processColor(legend.backgroundColor || 'rgb(240,240,240)', {opacity: legend.backgroundOpacity || 0.1});
-
- ctx.fillStyle = color;
- ctx.fillRect(offsetX, offsetY, legendWidth, legendHeight);
- ctx.strokeStyle = legend.labelBoxBorderColor;
- ctx.strokeRect(Flotr.toPixel(offsetX), Flotr.toPixel(offsetY), legendWidth, legendHeight);
-
- // Legend labels
- var x = offsetX + lbm;
- var y = offsetY + lbm;
- for(i = 0; i < series.length; i++){
- if(!series[i].label || series[i].hide) continue;
- label = legend.labelFormatter(series[i].label);
-
- ctx.fillStyle = series[i].color;
- ctx.fillRect(x, y, lbw-1, lbh-1);
-
- ctx.strokeStyle = legend.labelBoxBorderColor;
- ctx.lineWidth = 1;
- ctx.strokeRect(Math.ceil(x)-1.5, Math.ceil(y)-1.5, lbw+2, lbh+2);
-
- // Legend text
- Flotr.drawText(ctx, label, x + lbw + lbm, y + lbh, style);
-
- y += lbh + lbm;
- }
- }
- else {
- for(i = 0; i < series.length; ++i){
- if(!series[i].label || series[i].hide) continue;
-
- if(i % legend.noColumns === 0){
- fragments.push(rowStarted ? '</tr><tr>' : '<tr>');
- rowStarted = true;
- }
-
- // @TODO remove requirement on bars
- var s = series[i],
- boxWidth = legend.labelBoxWidth,
- boxHeight = legend.labelBoxHeight,
- opacityValue = (s.bars ? s.bars.fillOpacity : legend.labelBoxOpacity),
- opacity = 'opacity:' + opacityValue + ';filter:alpha(opacity=' + opacityValue*100 + ');';
-
- label = legend.labelFormatter(s.label);
- color = 'background-color:' + ((s.bars && s.bars.show && s.bars.fillColor && s.bars.fill) ? s.bars.fillColor : s.color) + ';';
-
- fragments.push(
- '<td class="flotr-legend-color-box">',
- '<div style="border:1px solid ', legend.labelBoxBorderColor, ';padding:1px">',
- '<div style="width:', (boxWidth-1), 'px;height:', (boxHeight-1), 'px;border:1px solid ', series[i].color, '">', // Border
- '<div style="width:', boxWidth, 'px;height:', boxHeight, 'px;', 'opacity:.4;', color, '"></div>', // Background
- '</div>',
- '</div>',
- '</td>',
- '<td class="flotr-legend-label">', label, '</td>'
- );
- }
- if(rowStarted) fragments.push('</tr>');
-
- if(fragments.length > 0){
- var table = '<table style="font-size:smaller;color:' + options.grid.color + '">' + fragments.join('') + '</table>';
- if(legend.container){
- D.insert(legend.container, table);
- }
- else {
- var styles = {position: 'absolute', 'z-index': 2};
-
- if(p.charAt(0) == 'n') { styles.top = (m + plotOffset.top) + 'px'; styles.bottom = 'auto'; }
- else if(p.charAt(0) == 's') { styles.bottom = (m + plotOffset.bottom) + 'px'; styles.top = 'auto'; }
- if(p.charAt(1) == 'e') { styles.right = (m + plotOffset.right) + 'px'; styles.left = 'auto'; }
- else if(p.charAt(1) == 'w') { styles.left = (m + plotOffset.left) + 'px'; styles.right = 'auto'; }
-
- var div = D.create('div'), size;
- div.className = 'flotr-legend';
- D.setStyles(div, styles);
- D.insert(div, table);
- D.insert(this.el, div);
-
- if(!legend.backgroundOpacity)
- return;
-
- var c = legend.backgroundColor || options.grid.backgroundColor || '#ffffff';
-
- _.extend(styles, D.size(div), {
- 'backgroundColor': c,
- 'z-index': 1
- });
- styles.width += 'px';
- styles.height += 'px';
-
- // Put in the transparent background separately to avoid blended labels and
- div = D.create('div');
- div.className = 'flotr-legend-bg';
- D.setStyles(div, styles);
- D.opacity(div, legend.backgroundOpacity);
- D.insert(div, ' ');
- D.insert(this.el, div);
- }
- }
- }
- }
- }
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/selection.js b/addons/web_graph/static/lib/flotr2/js/plugins/selection.js
deleted file mode 100644
index bb508840d6d..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/selection.js
+++ /dev/null
@@ -1,278 +0,0 @@
-/**
- * Selection Handles Plugin
- *
- *
- * Options
- * show - True enables the handles plugin.
- * drag - Left and Right drag handles
- * scroll - Scrolling handle
- */
-(function () {
-
-function isLeftClick (e, type) {
- return (e.which ? (e.which === 1) : (e.button === 0 || e.button === 1));
-}
-
-function boundX(x, graph) {
- return Math.min(Math.max(0, x), graph.plotWidth - 1);
-}
-
-function boundY(y, graph) {
- return Math.min(Math.max(0, y), graph.plotHeight);
-}
-
-var
- D = Flotr.DOM,
- E = Flotr.EventAdapter,
- _ = Flotr._;
-
-
-Flotr.addPlugin('selection', {
-
- options: {
- pinchOnly: null, // Only select on pinch
- mode: null, // => one of null, 'x', 'y' or 'xy'
- color: '#B6D9FF', // => selection box color
- fps: 20 // => frames-per-second
- },
-
- callbacks: {
- 'flotr:mouseup' : function (event) {
-
- var
- options = this.options.selection,
- selection = this.selection,
- pointer = this.getEventPosition(event);
-
- if (!options || !options.mode) return;
- if (selection.interval) clearInterval(selection.interval);
-
- if (this.multitouches) {
- selection.updateSelection();
- } else
- if (!options.pinchOnly) {
- selection.setSelectionPos(selection.selection.second, pointer);
- }
- selection.clearSelection();
-
- if(selection.selecting && selection.selectionIsSane()){
- selection.drawSelection();
- selection.fireSelectEvent();
- this.ignoreClick = true;
- }
- },
- 'flotr:mousedown' : function (event) {
-
- var
- options = this.options.selection,
- selection = this.selection,
- pointer = this.getEventPosition(event);
-
- if (!options || !options.mode) return;
- if (!options.mode || (!isLeftClick(event) && _.isUndefined(event.touches))) return;
- if (!options.pinchOnly) selection.setSelectionPos(selection.selection.first, pointer);
- if (selection.interval) clearInterval(selection.interval);
-
- this.lastMousePos.pageX = null;
- selection.selecting = false;
- selection.interval = setInterval(
- _.bind(selection.updateSelection, this),
- 1000 / options.fps
- );
- },
- 'flotr:destroy' : function (event) {
- clearInterval(this.selection.interval);
- }
- },
-
- // TODO This isn't used. Maybe it belongs in the draw area and fire select event methods?
- getArea: function() {
-
- var s = this.selection.selection,
- first = s.first,
- second = s.second;
-
- return {
- x1: Math.min(first.x, second.x),
- x2: Math.max(first.x, second.x),
- y1: Math.min(first.y, second.y),
- y2: Math.max(first.y, second.y)
- };
- },
-
- selection: {first: {x: -1, y: -1}, second: {x: -1, y: -1}},
- prevSelection: null,
- interval: null,
-
- /**
- * Fires the 'flotr:select' event when the user made a selection.
- */
- fireSelectEvent: function(name){
- var a = this.axes,
- s = this.selection.selection,
- x1, x2, y1, y2;
-
- name = name || 'select';
-
- x1 = a.x.p2d(s.first.x);
- x2 = a.x.p2d(s.second.x);
- y1 = a.y.p2d(s.first.y);
- y2 = a.y.p2d(s.second.y);
-
- E.fire(this.el, 'flotr:'+name, [{
- x1:Math.min(x1, x2),
- y1:Math.min(y1, y2),
- x2:Math.max(x1, x2),
- y2:Math.max(y1, y2),
- xfirst:x1, xsecond:x2, yfirst:y1, ysecond:y2
- }, this]);
- },
-
- /**
- * Allows the user the manually select an area.
- * @param {Object} area - Object with coordinates to select.
- */
- setSelection: function(area, preventEvent){
- var options = this.options,
- xa = this.axes.x,
- ya = this.axes.y,
- vertScale = ya.scale,
- hozScale = xa.scale,
- selX = options.selection.mode.indexOf('x') != -1,
- selY = options.selection.mode.indexOf('y') != -1,
- s = this.selection.selection;
-
- this.selection.clearSelection();
-
- s.first.y = boundY((selX && !selY) ? 0 : (ya.max - area.y1) * vertScale, this);
- s.second.y = boundY((selX && !selY) ? this.plotHeight - 1: (ya.max - area.y2) * vertScale, this);
- s.first.x = boundX((selY && !selX) ? 0 : area.x1, this);
- s.second.x = boundX((selY && !selX) ? this.plotWidth : area.x2, this);
-
- this.selection.drawSelection();
- if (!preventEvent)
- this.selection.fireSelectEvent();
- },
-
- /**
- * Calculates the position of the selection.
- * @param {Object} pos - Position object.
- * @param {Event} event - Event object.
- */
- setSelectionPos: function(pos, pointer) {
- var mode = this.options.selection.mode,
- selection = this.selection.selection;
-
- if(mode.indexOf('x') == -1) {
- pos.x = (pos == selection.first) ? 0 : this.plotWidth;
- }else{
- pos.x = boundX(pointer.relX, this);
- }
-
- if (mode.indexOf('y') == -1) {
- pos.y = (pos == selection.first) ? 0 : this.plotHeight - 1;
- }else{
- pos.y = boundY(pointer.relY, this);
- }
- },
- /**
- * Draws the selection box.
- */
- drawSelection: function() {
-
- this.selection.fireSelectEvent('selecting');
-
- var s = this.selection.selection,
- octx = this.octx,
- options = this.options,
- plotOffset = this.plotOffset,
- prevSelection = this.selection.prevSelection;
-
- if (prevSelection &&
- s.first.x == prevSelection.first.x &&
- s.first.y == prevSelection.first.y &&
- s.second.x == prevSelection.second.x &&
- s.second.y == prevSelection.second.y) {
- return;
- }
-
- octx.save();
- octx.strokeStyle = this.processColor(options.selection.color, {opacity: 0.8});
- octx.lineWidth = 1;
- octx.lineJoin = 'miter';
- octx.fillStyle = this.processColor(options.selection.color, {opacity: 0.4});
-
- this.selection.prevSelection = {
- first: { x: s.first.x, y: s.first.y },
- second: { x: s.second.x, y: s.second.y }
- };
-
- var x = Math.min(s.first.x, s.second.x),
- y = Math.min(s.first.y, s.second.y),
- w = Math.abs(s.second.x - s.first.x),
- h = Math.abs(s.second.y - s.first.y);
-
- octx.fillRect(x + plotOffset.left+0.5, y + plotOffset.top+0.5, w, h);
- octx.strokeRect(x + plotOffset.left+0.5, y + plotOffset.top+0.5, w, h);
- octx.restore();
- },
-
- /**
- * Updates (draws) the selection box.
- */
- updateSelection: function(){
- if (!this.lastMousePos.pageX) return;
-
- this.selection.selecting = true;
-
- if (this.multitouches) {
- this.selection.setSelectionPos(this.selection.selection.first, this.getEventPosition(this.multitouches[0]));
- this.selection.setSelectionPos(this.selection.selection.second, this.getEventPosition(this.multitouches[1]));
- } else
- if (this.options.selection.pinchOnly) {
- return;
- } else {
- this.selection.setSelectionPos(this.selection.selection.second, this.lastMousePos);
- }
-
- this.selection.clearSelection();
-
- if(this.selection.selectionIsSane()) {
- this.selection.drawSelection();
- }
- },
-
- /**
- * Removes the selection box from the overlay canvas.
- */
- clearSelection: function() {
- if (!this.selection.prevSelection) return;
-
- var prevSelection = this.selection.prevSelection,
- lw = 1,
- plotOffset = this.plotOffset,
- x = Math.min(prevSelection.first.x, prevSelection.second.x),
- y = Math.min(prevSelection.first.y, prevSelection.second.y),
- w = Math.abs(prevSelection.second.x - prevSelection.first.x),
- h = Math.abs(prevSelection.second.y - prevSelection.first.y);
-
- this.octx.clearRect(x + plotOffset.left - lw + 0.5,
- y + plotOffset.top - lw,
- w + 2 * lw + 0.5,
- h + 2 * lw + 0.5);
-
- this.selection.prevSelection = null;
- },
- /**
- * Determines whether or not the selection is sane and should be drawn.
- * @return {Boolean} - True when sane, false otherwise.
- */
- selectionIsSane: function(){
- var s = this.selection.selection;
- return Math.abs(s.second.x - s.first.x) >= 5 ||
- Math.abs(s.second.y - s.first.y) >= 5;
- }
-
-});
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/spreadsheet.js b/addons/web_graph/static/lib/flotr2/js/plugins/spreadsheet.js
deleted file mode 100644
index d75cb1991b1..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/spreadsheet.js
+++ /dev/null
@@ -1,296 +0,0 @@
-/** Spreadsheet **/
-(function() {
-
-function getRowLabel(value){
- if (this.options.spreadsheet.tickFormatter){
- //TODO maybe pass the xaxis formatter to the custom tick formatter as an opt-out?
- return this.options.spreadsheet.tickFormatter(value);
- }
- else {
- var t = _.find(this.axes.x.ticks, function(t){return t.v == value;});
- if (t) {
- return t.label;
- }
- return value;
- }
-}
-
-var
- D = Flotr.DOM,
- _ = Flotr._;
-
-Flotr.addPlugin('spreadsheet', {
- options: {
- show: false, // => show the data grid using two tabs
- tabGraphLabel: 'Graph',
- tabDataLabel: 'Data',
- toolbarDownload: 'Download CSV', // @todo: add better language support
- toolbarSelectAll: 'Select all',
- csvFileSeparator: ',',
- decimalSeparator: '.',
- tickFormatter: null,
- initialTab: 'graph'
- },
- /**
- * Builds the tabs in the DOM
- */
- callbacks: {
- 'flotr:afterconstruct': function(){
- // @TODO necessary?
- //this.el.select('.flotr-tabs-group,.flotr-datagrid-container').invoke('remove');
-
- if (!this.options.spreadsheet.show) return;
-
- var ss = this.spreadsheet,
- container = D.node('<div class="flotr-tabs-group" style="position:absolute;left:0px;width:'+this.canvasWidth+'px"></div>'),
- graph = D.node('<div style="float:left" class="flotr-tab selected">'+this.options.spreadsheet.tabGraphLabel+'</div>'),
- data = D.node('<div style="float:left" class="flotr-tab">'+this.options.spreadsheet.tabDataLabel+'</div>'),
- offset;
-
- ss.tabsContainer = container;
- ss.tabs = { graph : graph, data : data };
-
- D.insert(container, graph);
- D.insert(container, data);
- D.insert(this.el, container);
-
- offset = D.size(data).height + 2;
- this.plotOffset.bottom += offset;
-
- D.setStyles(container, {top: this.canvasHeight-offset+'px'});
-
- this.
- observe(graph, 'click', function(){ss.showTab('graph');}).
- observe(data, 'click', function(){ss.showTab('data');});
- if (this.options.spreadsheet.initialTab !== 'graph'){
- ss.showTab(this.options.spreadsheet.initialTab);
- }
- }
- },
- /**
- * Builds a matrix of the data to make the correspondance between the x values and the y values :
- * X value => Y values from the axes
- * @return {Array} The data grid
- */
- loadDataGrid: function(){
- if (this.seriesData) return this.seriesData;
-
- var s = this.series,
- rows = {};
-
- /* The data grid is a 2 dimensions array. There is a row for each X value.
- * Each row contains the x value and the corresponding y value for each serie ('undefined' if there isn't one)
- **/
- _.each(s, function(serie, i){
- _.each(serie.data, function (v) {
- var x = v[0],
- y = v[1],
- r = rows[x];
- if (r) {
- r[i+1] = y;
- } else {
- var newRow = [];
- newRow[0] = x;
- newRow[i+1] = y;
- rows[x] = newRow;
- }
- });
- });
-
- // The data grid is sorted by x value
- this.seriesData = _.sortBy(rows, function(row, x){
- return parseInt(x, 10);
- });
- return this.seriesData;
- },
- /**
- * Constructs the data table for the spreadsheet
- * @todo make a spreadsheet manager (Flotr.Spreadsheet)
- * @return {Element} The resulting table element
- */
- constructDataGrid: function(){
- // If the data grid has already been built, nothing to do here
- if (this.spreadsheet.datagrid) return this.spreadsheet.datagrid;
-
- var s = this.series,
- datagrid = this.spreadsheet.loadDataGrid(),
- colgroup = ['<colgroup><col />'],
- buttonDownload, buttonSelect, t;
-
- // First row : series' labels
- var html = ['<table class="flotr-datagrid"><tr class="first-row">'];
- html.push('<th>&nbsp;</th>');
- _.each(s, function(serie,i){
- html.push('<th scope="col">'+(serie.label || String.fromCharCode(65+i))+'</th>');
- colgroup.push('<col />');
- });
- html.push('</tr>');
- // Data rows
- _.each(datagrid, function(row){
- html.push('<tr>');
- _.times(s.length+1, function(i){
- var tag = 'td',
- value = row[i],
- // TODO: do we really want to handle problems with floating point
- // precision here?
- content = (!_.isUndefined(value) ? Math.round(value*100000)/100000 : '');
- if (i === 0) {
- tag = 'th';
- var label = getRowLabel.call(this, content);
- if (label) content = label;
- }
-
- html.push('<'+tag+(tag=='th'?' scope="row"':'')+'>'+content+'</'+tag+'>');
- }, this);
- html.push('</tr>');
- }, this);
- colgroup.push('</colgroup>');
- t = D.node(html.join(''));
-
- /**
- * @TODO disabled this
- if (!Flotr.isIE || Flotr.isIE == 9) {
- function handleMouseout(){
- t.select('colgroup col.hover, th.hover').invoke('removeClassName', 'hover');
- }
- function handleMouseover(e){
- var td = e.element(),
- siblings = td.previousSiblings();
- t.select('th[scope=col]')[siblings.length-1].addClassName('hover');
- t.select('colgroup col')[siblings.length].addClassName('hover');
- }
- _.each(t.select('td'), function(td) {
- Flotr.EventAdapter.
- observe(td, 'mouseover', handleMouseover).
- observe(td, 'mouseout', handleMouseout);
- });
- }
- */
-
- buttonDownload = D.node(
- '<button type="button" class="flotr-datagrid-toolbar-button">' +
- this.options.spreadsheet.toolbarDownload +
- '</button>');
-
- buttonSelect = D.node(
- '<button type="button" class="flotr-datagrid-toolbar-button">' +
- this.options.spreadsheet.toolbarSelectAll+
- '</button>');
-
- this.
- observe(buttonDownload, 'click', _.bind(this.spreadsheet.downloadCSV, this)).
- observe(buttonSelect, 'click', _.bind(this.spreadsheet.selectAllData, this));
-
- var toolbar = D.node('<div class="flotr-datagrid-toolbar"></div>');
- D.insert(toolbar, buttonDownload);
- D.insert(toolbar, buttonSelect);
-
- var containerHeight =this.canvasHeight - D.size(this.spreadsheet.tabsContainer).height-2,
- container = D.node('<div class="flotr-datagrid-container" style="position:absolute;left:0px;top:0px;width:'+
- this.canvasWidth+'px;height:'+containerHeight+'px;overflow:auto;z-index:10"></div>');
-
- D.insert(container, toolbar);
- D.insert(container, t);
- D.insert(this.el, container);
- this.spreadsheet.datagrid = t;
- this.spreadsheet.container = container;
-
- return t;
- },
- /**
- * Shows the specified tab, by its name
- * @todo make a tab manager (Flotr.Tabs)
- * @param {String} tabName - The tab name
- */
- showTab: function(tabName){
- if (this.spreadsheet.activeTab === tabName){
- return;
- }
- switch(tabName) {
- case 'graph':
- D.hide(this.spreadsheet.container);
- D.removeClass(this.spreadsheet.tabs.data, 'selected');
- D.addClass(this.spreadsheet.tabs.graph, 'selected');
- break;
- case 'data':
- if (!this.spreadsheet.datagrid)
- this.spreadsheet.constructDataGrid();
- D.show(this.spreadsheet.container);
- D.addClass(this.spreadsheet.tabs.data, 'selected');
- D.removeClass(this.spreadsheet.tabs.graph, 'selected');
- break;
- default:
- throw 'Illegal tab name: ' + tabName;
- }
- this.spreadsheet.activeTab = tabName;
- },
- /**
- * Selects the data table in the DOM for copy/paste
- */
- selectAllData: function(){
- if (this.spreadsheet.tabs) {
- var selection, range, doc, win, node = this.spreadsheet.constructDataGrid();
-
- this.spreadsheet.showTab('data');
-
- // deferred to be able to select the table
- setTimeout(function () {
- if ((doc = node.ownerDocument) && (win = doc.defaultView) &&
- win.getSelection && doc.createRange &&
- (selection = window.getSelection()) &&
- selection.removeAllRanges) {
- range = doc.createRange();
- range.selectNode(node);
- selection.removeAllRanges();
- selection.addRange(range);
- }
- else if (document.body && document.body.createTextRange &&
- (range = document.body.createTextRange())) {
- range.moveToElementText(node);
- range.select();
- }
- }, 0);
- return true;
- }
- else return false;
- },
- /**
- * Converts the data into CSV in order to download a file
- */
- downloadCSV: function(){
- var csv = '',
- series = this.series,
- options = this.options,
- dg = this.spreadsheet.loadDataGrid(),
- separator = encodeURIComponent(options.spreadsheet.csvFileSeparator);
-
- if (options.spreadsheet.decimalSeparator === options.spreadsheet.csvFileSeparator) {
- throw "The decimal separator is the same as the column separator ("+options.spreadsheet.decimalSeparator+")";
- }
-
- // The first row
- _.each(series, function(serie, i){
- csv += separator+'"'+(serie.label || String.fromCharCode(65+i)).replace(/\"/g, '\\"')+'"';
- });
-
- csv += "%0D%0A"; // \r\n
-
- // For each row
- csv += _.reduce(dg, function(memo, row){
- var rowLabel = getRowLabel.call(this, row[0]) || '';
- rowLabel = '"'+(rowLabel+'').replace(/\"/g, '\\"')+'"';
- var numbers = row.slice(1).join(separator);
- if (options.spreadsheet.decimalSeparator !== '.') {
- numbers = numbers.replace(/\./g, options.spreadsheet.decimalSeparator);
- }
- return memo + rowLabel+separator+numbers+"%0D%0A"; // \t and \r\n
- }, '', this);
-
- if (Flotr.isIE && Flotr.isIE < 9) {
- csv = csv.replace(new RegExp(separator, 'g'), decodeURIComponent(separator)).replace(/%0A/g, '\n').replace(/%0D/g, '\r');
- window.open().document.write(csv);
- }
- else window.open('data:text/csv,'+csv);
- }
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/plugins/titles.js b/addons/web_graph/static/lib/flotr2/js/plugins/titles.js
deleted file mode 100644
index cf95d9e7c80..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/plugins/titles.js
+++ /dev/null
@@ -1,177 +0,0 @@
-(function () {
-
-var D = Flotr.DOM;
-
-Flotr.addPlugin('titles', {
- callbacks: {
- 'flotr:afterdraw': function() {
- this.titles.drawTitles();
- }
- },
- /**
- * Draws the title and the subtitle
- */
- drawTitles : function () {
- var html,
- options = this.options,
- margin = options.grid.labelMargin,
- ctx = this.ctx,
- a = this.axes;
-
- if (!options.HtmlText && this.textEnabled) {
- var style = {
- size: options.fontSize,
- color: options.grid.color,
- textAlign: 'center'
- };
-
- // Add subtitle
- if (options.subtitle){
- Flotr.drawText(
- ctx, options.subtitle,
- this.plotOffset.left + this.plotWidth/2,
- this.titleHeight + this.subtitleHeight - 2,
- style
- );
- }
-
- style.weight = 1.5;
- style.size *= 1.5;
-
- // Add title
- if (options.title){
- Flotr.drawText(
- ctx, options.title,
- this.plotOffset.left + this.plotWidth/2,
- this.titleHeight - 2,
- style
- );
- }
-
- style.weight = 1.8;
- style.size *= 0.8;
-
- // Add x axis title
- if (a.x.options.title && a.x.used){
- style.textAlign = a.x.options.titleAlign || 'center';
- style.textBaseline = 'top';
- style.angle = Flotr.toRad(a.x.options.titleAngle);
- style = Flotr.getBestTextAlign(style.angle, style);
- Flotr.drawText(
- ctx, a.x.options.title,
- this.plotOffset.left + this.plotWidth/2,
- this.plotOffset.top + a.x.maxLabel.height + this.plotHeight + 2 * margin,
- style
- );
- }
-
- // Add x2 axis title
- if (a.x2.options.title && a.x2.used){
- style.textAlign = a.x2.options.titleAlign || 'center';
- style.textBaseline = 'bottom';
- style.angle = Flotr.toRad(a.x2.options.titleAngle);
- style = Flotr.getBestTextAlign(style.angle, style);
- Flotr.drawText(
- ctx, a.x2.options.title,
- this.plotOffset.left + this.plotWidth/2,
- this.plotOffset.top - a.x2.maxLabel.height - 2 * margin,
- style
- );
- }
-
- // Add y axis title
- if (a.y.options.title && a.y.used){
- style.textAlign = a.y.options.titleAlign || 'right';
- style.textBaseline = 'middle';
- style.angle = Flotr.toRad(a.y.options.titleAngle);
- style = Flotr.getBestTextAlign(style.angle, style);
- Flotr.drawText(
- ctx, a.y.options.title,
- this.plotOffset.left - a.y.maxLabel.width - 2 * margin,
- this.plotOffset.top + this.plotHeight / 2,
- style
- );
- }
-
- // Add y2 axis title
- if (a.y2.options.title && a.y2.used){
- style.textAlign = a.y2.options.titleAlign || 'left';
- style.textBaseline = 'middle';
- style.angle = Flotr.toRad(a.y2.options.titleAngle);
- style = Flotr.getBestTextAlign(style.angle, style);
- Flotr.drawText(
- ctx, a.y2.options.title,
- this.plotOffset.left + this.plotWidth + a.y2.maxLabel.width + 2 * margin,
- this.plotOffset.top + this.plotHeight / 2,
- style
- );
- }
- }
- else {
- html = [];
-
- // Add title
- if (options.title)
- html.push(
- '<div style="position:absolute;top:0;left:',
- this.plotOffset.left, 'px;font-size:1em;font-weight:bold;text-align:center;width:',
- this.plotWidth,'px;" class="flotr-title">', options.title, '</div>'
- );
-
- // Add subtitle
- if (options.subtitle)
- html.push(
- '<div style="position:absolute;top:', this.titleHeight, 'px;left:',
- this.plotOffset.left, 'px;font-size:smaller;text-align:center;width:',
- this.plotWidth, 'px;" class="flotr-subtitle">', options.subtitle, '</div>'
- );
-
- html.push('</div>');
-
- html.push('<div class="flotr-axis-title" style="font-weight:bold;">');
-
- // Add x axis title
- if (a.x.options.title && a.x.used)
- html.push(
- '<div style="position:absolute;top:',
- (this.plotOffset.top + this.plotHeight + options.grid.labelMargin + a.x.titleSize.height),
- 'px;left:', this.plotOffset.left, 'px;width:', this.plotWidth,
- 'px;text-align:center;" class="flotr-axis-title">', a.x.options.title, '</div>'
- );
-
- // Add x2 axis title
- if (a.x2.options.title && a.x2.used)
- html.push(
- '<div style="position:absolute;top:0;left:', this.plotOffset.left, 'px;width:',
- this.plotWidth, 'px;text-align:center;" class="flotr-axis-title">', a.x2.options.title, '</div>'
- );
-
- // Add y axis title
- if (a.y.options.title && a.y.used)
- html.push(
- '<div style="position:absolute;top:',
- (this.plotOffset.top + this.plotHeight/2 - a.y.titleSize.height/2),
- 'px;left:0;text-align:right;" class="flotr-axis-title">', a.y.options.title, '</div>'
- );
-
- // Add y2 axis title
- if (a.y2.options.title && a.y2.used)
- html.push(
- '<div style="position:absolute;top:',
- (this.plotOffset.top + this.plotHeight/2 - a.y.titleSize.height/2),
- 'px;right:0;text-align:right;" class="flotr-axis-title">', a.y2.options.title, '</div>'
- );
-
- html = html.join('');
-
- var div = D.create('div');
- D.setStyles({
- color: options.grid.color
- });
- div.className = 'flotr-titles';
- D.insert(this.el, div);
- D.insert(div, html);
- }
- }
-});
-})();