'),f.x.options.title&&f.x.used&&b.push('
',f.x.options.title,"
"),f.x2.options.title&&f.x2.used&&b.push('
',f.x2.options.title,"
"),f.y.options.title&&f.y.used&&b.push('
',f.y.options.title,"
"),f.y2.options.title&&f.y2.used&&b.push('
',f.y2.options.title,"
"),b=b.join("");var h=a.create("div");a.setStyles({color:c.grid.color}),h.className="flotr-titles",a.insert(this.el,h),a.insert(h,b)}}})}();
diff --git a/addons/web_graph/static/lib/flotr2/js/Axis.js b/addons/web_graph/static/lib/flotr2/js/Axis.js
deleted file mode 100644
index 1c697309ef8..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Axis.js
+++ /dev/null
@@ -1,303 +0,0 @@
-/**
- * Flotr Axis Library
- */
-
-(function () {
-
-var
- _ = Flotr._,
- LOGARITHMIC = 'logarithmic';
-
-function Axis (o) {
-
- this.orientation = 1;
- this.offset = 0;
- this.datamin = Number.MAX_VALUE;
- this.datamax = -Number.MAX_VALUE;
-
- _.extend(this, o);
-
- this._setTranslations();
-}
-
-
-// Prototype
-Axis.prototype = {
-
- setScale : function () {
- var length = this.length;
- if (this.options.scaling == LOGARITHMIC) {
- this.scale = length / (log(this.max, this.options.base) - log(this.min, this.options.base));
- } else {
- this.scale = length / (this.max - this.min);
- }
- },
-
- calculateTicks : function () {
- var options = this.options;
-
- this.ticks = [];
- this.minorTicks = [];
-
- // User Ticks
- if(options.ticks){
- this._cleanUserTicks(options.ticks, this.ticks);
- this._cleanUserTicks(options.minorTicks || [], this.minorTicks);
- }
- else {
- if (options.mode == 'time') {
- this._calculateTimeTicks();
- } else if (options.scaling === 'logarithmic') {
- this._calculateLogTicks();
- } else {
- this._calculateTicks();
- }
- }
- },
-
- /**
- * Calculates the range of an axis to apply autoscaling.
- */
- calculateRange: function () {
-
- if (!this.used) return;
-
- var axis = this,
- o = axis.options,
- min = o.min !== null ? o.min : axis.datamin,
- max = o.max !== null ? o.max : axis.datamax,
- margin = o.autoscaleMargin;
-
- if (o.scaling == 'logarithmic') {
- if (min <= 0) min = axis.datamin;
-
- // Let it widen later on
- if (max <= 0) max = min;
- }
-
- if (max == min) {
- var widen = max ? 0.01 : 1.00;
- if (o.min === null) min -= widen;
- if (o.max === null) max += widen;
- }
-
- if (o.scaling === 'logarithmic') {
- if (min < 0) min = max / o.base; // Could be the result of widening
-
- var maxexp = Math.log(max);
- if (o.base != Math.E) maxexp /= Math.log(o.base);
- maxexp = Math.ceil(maxexp);
-
- var minexp = Math.log(min);
- if (o.base != Math.E) minexp /= Math.log(o.base);
- minexp = Math.ceil(minexp);
-
- axis.tickSize = Flotr.getTickSize(o.noTicks, minexp, maxexp, o.tickDecimals === null ? 0 : o.tickDecimals);
-
- // Try to determine a suitable amount of miniticks based on the length of a decade
- if (o.minorTickFreq === null) {
- if (maxexp - minexp > 10)
- o.minorTickFreq = 0;
- else if (maxexp - minexp > 5)
- o.minorTickFreq = 2;
- else
- o.minorTickFreq = 5;
- }
- } else {
- axis.tickSize = Flotr.getTickSize(o.noTicks, min, max, o.tickDecimals);
- }
-
- axis.min = min;
- axis.max = max; //extendRange may use axis.min or axis.max, so it should be set before it is caled
-
- // Autoscaling. @todo This probably fails with log scale. Find a testcase and fix it
- if(o.min === null && o.autoscale){
- axis.min -= axis.tickSize * margin;
- // Make sure we don't go below zero if all values are positive.
- if(axis.min < 0 && axis.datamin >= 0) axis.min = 0;
- axis.min = axis.tickSize * Math.floor(axis.min / axis.tickSize);
- }
-
- if(o.max === null && o.autoscale){
- axis.max += axis.tickSize * margin;
- if(axis.max > 0 && axis.datamax <= 0 && axis.datamax != axis.datamin) axis.max = 0;
- axis.max = axis.tickSize * Math.ceil(axis.max / axis.tickSize);
- }
-
- if (axis.min == axis.max) axis.max = axis.min + 1;
- },
-
- calculateTextDimensions : function (T, options) {
-
- var maxLabel = '',
- length,
- i;
-
- if (this.options.showLabels) {
- for (i = 0; i < this.ticks.length; ++i) {
- length = this.ticks[i].label.length;
- if (length > maxLabel.length){
- maxLabel = this.ticks[i].label;
- }
- }
- }
-
- this.maxLabel = T.dimensions(
- maxLabel,
- {size:options.fontSize, angle: Flotr.toRad(this.options.labelsAngle)},
- 'font-size:smaller;',
- 'flotr-grid-label'
- );
-
- this.titleSize = T.dimensions(
- this.options.title,
- {size:options.fontSize*1.2, angle: Flotr.toRad(this.options.titleAngle)},
- 'font-weight:bold;',
- 'flotr-axis-title'
- );
- },
-
- _cleanUserTicks : function (ticks, axisTicks) {
-
- var axis = this, options = this.options,
- v, i, label, tick;
-
- if(_.isFunction(ticks)) ticks = ticks({min : axis.min, max : axis.max});
-
- for(i = 0; i < ticks.length; ++i){
- tick = ticks[i];
- if(typeof(tick) === 'object'){
- v = tick[0];
- label = (tick.length > 1) ? tick[1] : options.tickFormatter(v, {min : axis.min, max : axis.max});
- } else {
- v = tick;
- label = options.tickFormatter(v, {min : this.min, max : this.max});
- }
- axisTicks[i] = { v: v, label: label };
- }
- },
-
- _calculateTimeTicks : function () {
- this.ticks = Flotr.Date.generator(this);
- },
-
- _calculateLogTicks : function () {
-
- var axis = this,
- o = axis.options,
- v,
- decadeStart;
-
- var max = Math.log(axis.max);
- if (o.base != Math.E) max /= Math.log(o.base);
- max = Math.ceil(max);
-
- var min = Math.log(axis.min);
- if (o.base != Math.E) min /= Math.log(o.base);
- min = Math.ceil(min);
-
- for (i = min; i < max; i += axis.tickSize) {
- decadeStart = (o.base == Math.E) ? Math.exp(i) : Math.pow(o.base, i);
- // Next decade begins here:
- var decadeEnd = decadeStart * ((o.base == Math.E) ? Math.exp(axis.tickSize) : Math.pow(o.base, axis.tickSize));
- var stepSize = (decadeEnd - decadeStart) / o.minorTickFreq;
-
- axis.ticks.push({v: decadeStart, label: o.tickFormatter(decadeStart, {min : axis.min, max : axis.max})});
- for (v = decadeStart + stepSize; v < decadeEnd; v += stepSize)
- axis.minorTicks.push({v: v, label: o.tickFormatter(v, {min : axis.min, max : axis.max})});
- }
-
- // Always show the value at the would-be start of next decade (end of this decade)
- decadeStart = (o.base == Math.E) ? Math.exp(i) : Math.pow(o.base, i);
- axis.ticks.push({v: decadeStart, label: o.tickFormatter(decadeStart, {min : axis.min, max : axis.max})});
- },
-
- _calculateTicks : function () {
-
- var axis = this,
- o = axis.options,
- tickSize = axis.tickSize,
- min = axis.min,
- max = axis.max,
- start = tickSize * Math.ceil(min / tickSize), // Round to nearest multiple of tick size.
- decimals,
- minorTickSize,
- v, v2,
- i, j;
-
- if (o.minorTickFreq)
- minorTickSize = tickSize / o.minorTickFreq;
-
- // Then store all possible ticks.
- for (i = 0; (v = v2 = start + i * tickSize) <= max; ++i){
-
- // Round (this is always needed to fix numerical instability).
- decimals = o.tickDecimals;
- if (decimals === null) decimals = 1 - Math.floor(Math.log(tickSize) / Math.LN10);
- if (decimals < 0) decimals = 0;
-
- v = v.toFixed(decimals);
- axis.ticks.push({ v: v, label: o.tickFormatter(v, {min : axis.min, max : axis.max}) });
-
- if (o.minorTickFreq) {
- for (j = 0; j < o.minorTickFreq && (i * tickSize + j * minorTickSize) < max; ++j) {
- v = v2 + j * minorTickSize;
- axis.minorTicks.push({ v: v, label: o.tickFormatter(v, {min : axis.min, max : axis.max}) });
- }
- }
- }
-
- },
-
- _setTranslations : function (logarithmic) {
- this.d2p = (logarithmic ? d2pLog : d2p);
- this.p2d = (logarithmic ? p2dLog : p2d);
- }
-};
-
-
-// Static Methods
-_.extend(Axis, {
- getAxes : function (options) {
- return {
- x: new Axis({options: options.xaxis, n: 1, length: this.plotWidth}),
- x2: new Axis({options: options.x2axis, n: 2, length: this.plotWidth}),
- y: new Axis({options: options.yaxis, n: 1, length: this.plotHeight, offset: this.plotHeight, orientation: -1}),
- y2: new Axis({options: options.y2axis, n: 2, length: this.plotHeight, offset: this.plotHeight, orientation: -1})
- };
- }
-});
-
-
-// Helper Methods
-
-function d2p (dataValue) {
- return this.offset + this.orientation * (dataValue - this.min) * this.scale;
-}
-
-function p2d (pointValue) {
- return (this.offset + this.orientation * pointValue) / this.scale + this.min;
-}
-
-function d2pLog (dataValue) {
- return this.offset + this.orientation * (log(dataValue, this.options.base) - log(this.min, this.options.base)) * this.scale;
-}
-
-function p2dLog (pointValue) {
- return exp((this.offset + this.orientation * pointValue) / this.scale + log(this.min, this.options.base), this.options.base);
-}
-
-function log (value, base) {
- value = Math.log(Math.max(value, Number.MIN_VALUE));
- if (base !== Math.E)
- value /= Math.log(base);
- return value;
-}
-
-function exp (value, base) {
- return (base === Math.E) ? Math.exp(value) : Math.pow(base, value);
-}
-
-Flotr.Axis = Axis;
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Color.js b/addons/web_graph/static/lib/flotr2/js/Color.js
deleted file mode 100644
index ab4ba0b432d..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Color.js
+++ /dev/null
@@ -1,163 +0,0 @@
-/**
- * Flotr Color
- */
-
-(function () {
-
-var
- _ = Flotr._;
-
-// Constructor
-function Color (r, g, b, a) {
- this.rgba = ['r','g','b','a'];
- var x = 4;
- while(-1<--x){
- this[this.rgba[x]] = arguments[x] || ((x==3) ? 1.0 : 0);
- }
- this.normalize();
-}
-
-// Constants
-var COLOR_NAMES = {
- aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],
- brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],
- darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],
- darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],
- darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],
- khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],
- lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],
- maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],
- violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]
-};
-
-Color.prototype = {
- scale: function(rf, gf, bf, af){
- var x = 4;
- while (-1 < --x) {
- if (!_.isUndefined(arguments[x])) this[this.rgba[x]] *= arguments[x];
- }
- return this.normalize();
- },
- alpha: function(alpha) {
- if (!_.isUndefined(alpha) && !_.isNull(alpha)) {
- this.a = alpha;
- }
- return this.normalize();
- },
- clone: function(){
- return new Color(this.r, this.b, this.g, this.a);
- },
- limit: function(val,minVal,maxVal){
- return Math.max(Math.min(val, maxVal), minVal);
- },
- normalize: function(){
- var limit = this.limit;
- this.r = limit(parseInt(this.r, 10), 0, 255);
- this.g = limit(parseInt(this.g, 10), 0, 255);
- this.b = limit(parseInt(this.b, 10), 0, 255);
- this.a = limit(this.a, 0, 1);
- return this;
- },
- distance: function(color){
- if (!color) return;
- color = new Color.parse(color);
- var dist = 0, x = 3;
- while(-1<--x){
- dist += Math.abs(this[this.rgba[x]] - color[this.rgba[x]]);
- }
- return dist;
- },
- toString: function(){
- return (this.a >= 1.0) ? 'rgb('+[this.r,this.g,this.b].join(',')+')' : 'rgba('+[this.r,this.g,this.b,this.a].join(',')+')';
- },
- contrast: function () {
- var
- test = 1 - ( 0.299 * this.r + 0.587 * this.g + 0.114 * this.b) / 255;
- return (test < 0.5 ? '#000000' : '#ffffff');
- }
-};
-
-_.extend(Color, {
- /**
- * Parses a color string and returns a corresponding Color.
- * The different tests are in order of probability to improve speed.
- * @param {String, Color} str - string thats representing a color
- * @return {Color} returns a Color object or false
- */
- parse: function(color){
- if (color instanceof Color) return color;
-
- var result;
-
- // #a0b1c2
- if((result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)))
- return new Color(parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16));
-
- // rgb(num,num,num)
- if((result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)))
- return new Color(parseInt(result[1], 10), parseInt(result[2], 10), parseInt(result[3], 10));
-
- // #fff
- if((result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)))
- return new Color(parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16));
-
- // rgba(num,num,num,num)
- if((result = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(color)))
- return new Color(parseInt(result[1], 10), parseInt(result[2], 10), parseInt(result[3], 10), parseFloat(result[4]));
-
- // rgb(num%,num%,num%)
- if((result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)))
- return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55);
-
- // rgba(num%,num%,num%,num)
- if((result = /rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(color)))
- return new Color(parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55, parseFloat(result[4]));
-
- // Otherwise, we're most likely dealing with a named color.
- var name = (color+'').replace(/^\s*([\S\s]*?)\s*$/, '$1').toLowerCase();
- if(name == 'transparent'){
- return new Color(255, 255, 255, 0);
- }
- return (result = COLOR_NAMES[name]) ? new Color(result[0], result[1], result[2]) : new Color(0, 0, 0, 0);
- },
-
- /**
- * Process color and options into color style.
- */
- processColor: function(color, options) {
-
- var opacity = options.opacity;
- if (!color) return 'rgba(0, 0, 0, 0)';
- if (color instanceof Color) return color.alpha(opacity).toString();
- if (_.isString(color)) return Color.parse(color).alpha(opacity).toString();
-
- var grad = color.colors ? color : {colors: color};
-
- if (!options.ctx) {
- if (!_.isArray(grad.colors)) return 'rgba(0, 0, 0, 0)';
- return Color.parse(_.isArray(grad.colors[0]) ? grad.colors[0][1] : grad.colors[0]).alpha(opacity).toString();
- }
- grad = _.extend({start: 'top', end: 'bottom'}, grad);
-
- if (/top/i.test(grad.start)) options.x1 = 0;
- if (/left/i.test(grad.start)) options.y1 = 0;
- if (/bottom/i.test(grad.end)) options.x2 = 0;
- if (/right/i.test(grad.end)) options.y2 = 0;
-
- var i, c, stop, gradient = options.ctx.createLinearGradient(options.x1, options.y1, options.x2, options.y2);
- for (i = 0; i < grad.colors.length; i++) {
- c = grad.colors[i];
- if (_.isArray(c)) {
- stop = c[0];
- c = c[1];
- }
- else stop = i / (grad.colors.length-1);
- gradient.addColorStop(stop, Color.parse(c).alpha(opacity));
- }
- return gradient;
- }
-});
-
-Flotr.Color = Color;
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/DOM.js b/addons/web_graph/static/lib/flotr2/js/DOM.js
deleted file mode 100644
index 43df857395b..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/DOM.js
+++ /dev/null
@@ -1,88 +0,0 @@
-(function () {
-
-var _ = Flotr._;
-
-Flotr.DOM = {
- addClass: function(element, name){
- var classList = (element.className ? element.className : '');
- if (_.include(classList.split(/\s+/g), name)) return;
- element.className = (classList ? classList + ' ' : '') + name;
- },
- /**
- * Create an element.
- */
- create: function(tag){
- return document.createElement(tag);
- },
- node: function(html) {
- var div = Flotr.DOM.create('div'), n;
- div.innerHTML = html;
- n = div.children[0];
- div.innerHTML = '';
- return n;
- },
- /**
- * Remove all children.
- */
- empty: function(element){
- element.innerHTML = '';
- /*
- if (!element) return;
- _.each(element.childNodes, function (e) {
- Flotr.DOM.empty(e);
- element.removeChild(e);
- });
- */
- },
- hide: function(element){
- Flotr.DOM.setStyles(element, {display:'none'});
- },
- /**
- * Insert a child.
- * @param {Element} element
- * @param {Element|String} Element or string to be appended.
- */
- insert: function(element, child){
- if(_.isString(child))
- element.innerHTML += child;
- else if (_.isElement(child))
- element.appendChild(child);
- },
- // @TODO find xbrowser implementation
- opacity: function(element, opacity) {
- element.style.opacity = opacity;
- },
- position: function(element, p){
- if (!element.offsetParent)
- return {left: (element.offsetLeft || 0), top: (element.offsetTop || 0)};
-
- p = this.position(element.offsetParent);
- p.left += element.offsetLeft;
- p.top += element.offsetTop;
- return p;
- },
- removeClass: function(element, name) {
- var classList = (element.className ? element.className : '');
- element.className = _.filter(classList.split(/\s+/g), function (c) {
- if (c != name) return true; }
- ).join(' ');
- },
- setStyles: function(element, o) {
- _.each(o, function (value, key) {
- element.style[key] = value;
- });
- },
- show: function(element){
- Flotr.DOM.setStyles(element, {display:''});
- },
- /**
- * Return element size.
- */
- size: function(element){
- return {
- height : element.offsetHeight,
- width : element.offsetWidth };
- }
-};
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Date.js b/addons/web_graph/static/lib/flotr2/js/Date.js
deleted file mode 100644
index fe72dba709f..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Date.js
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * Flotr Date
- */
-Flotr.Date = {
-
- set : function (date, name, mode, value) {
- mode = mode || 'UTC';
- name = 'set' + (mode === 'UTC' ? 'UTC' : '') + name;
- date[name](value);
- },
-
- get : function (date, name, mode) {
- mode = mode || 'UTC';
- name = 'get' + (mode === 'UTC' ? 'UTC' : '') + name;
- return date[name]();
- },
-
- format: function(d, format, mode) {
- if (!d) return;
-
- // We should maybe use an "official" date format spec, like PHP date() or ColdFusion
- // http://fr.php.net/manual/en/function.date.php
- // http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_29.html
- var
- get = this.get,
- tokens = {
- h: get(d, 'Hours', mode).toString(),
- H: leftPad(get(d, 'Hours', mode)),
- M: leftPad(get(d, 'Minutes', mode)),
- S: leftPad(get(d, 'Seconds', mode)),
- s: get(d, 'Milliseconds', mode),
- d: get(d, 'Date', mode).toString(),
- m: (get(d, 'Month') + 1).toString(),
- y: get(d, 'FullYear').toString(),
- b: Flotr.Date.monthNames[get(d, 'Month', mode)]
- };
-
- function leftPad(n){
- n += '';
- return n.length == 1 ? "0" + n : n;
- }
-
- var r = [], c,
- escape = false;
-
- for (var i = 0; i < format.length; ++i) {
- c = format.charAt(i);
-
- if (escape) {
- r.push(tokens[c] || c);
- escape = false;
- }
- else if (c == "%")
- escape = true;
- else
- r.push(c);
- }
- return r.join('');
- },
- getFormat: function(time, span) {
- var tu = Flotr.Date.timeUnits;
- if (time < tu.second) return "%h:%M:%S.%s";
- else if (time < tu.minute) return "%h:%M:%S";
- else if (time < tu.day) return (span < 2 * tu.day) ? "%h:%M" : "%b %d %h:%M";
- else if (time < tu.month) return "%b %d";
- else if (time < tu.year) return (span < tu.year) ? "%b" : "%b %y";
- else return "%y";
- },
- formatter: function (v, axis) {
- var
- options = axis.options,
- scale = Flotr.Date.timeUnits[options.timeUnit],
- d = new Date(v * scale);
-
- // first check global format
- if (axis.options.timeFormat)
- return Flotr.Date.format(d, options.timeFormat, options.timeMode);
-
- var span = (axis.max - axis.min) * scale,
- t = axis.tickSize * Flotr.Date.timeUnits[axis.tickUnit];
-
- return Flotr.Date.format(d, Flotr.Date.getFormat(t, span), options.timeMode);
- },
- generator: function(axis) {
-
- var
- set = this.set,
- get = this.get,
- timeUnits = this.timeUnits,
- spec = this.spec,
- options = axis.options,
- mode = options.timeMode,
- scale = timeUnits[options.timeUnit],
- min = axis.min * scale,
- max = axis.max * scale,
- delta = (max - min) / options.noTicks,
- ticks = [],
- tickSize = axis.tickSize,
- tickUnit,
- formatter, i;
-
- // Use custom formatter or time tick formatter
- formatter = (options.tickFormatter === Flotr.defaultTickFormatter ?
- this.formatter : options.tickFormatter
- );
-
- for (i = 0; i < spec.length - 1; ++i) {
- var d = spec[i][0] * timeUnits[spec[i][1]];
- if (delta < (d + spec[i+1][0] * timeUnits[spec[i+1][1]]) / 2 && d >= tickSize)
- break;
- }
- tickSize = spec[i][0];
- tickUnit = spec[i][1];
-
- // special-case the possibility of several years
- if (tickUnit == "year") {
- tickSize = Flotr.getTickSize(options.noTicks*timeUnits.year, min, max, 0);
-
- // Fix for 0.5 year case
- if (tickSize == 0.5) {
- tickUnit = "month";
- tickSize = 6;
- }
- }
-
- axis.tickUnit = tickUnit;
- axis.tickSize = tickSize;
-
- var
- d = new Date(min);
-
- var step = tickSize * timeUnits[tickUnit];
-
- function setTick (name) {
- set(d, name, mode, Flotr.floorInBase(
- get(d, name, mode), tickSize
- ));
- }
-
- switch (tickUnit) {
- case "millisecond": setTick('Milliseconds'); break;
- case "second": setTick('Seconds'); break;
- case "minute": setTick('Minutes'); break;
- case "hour": setTick('Hours'); break;
- case "month": setTick('Month'); break;
- case "year": setTick('FullYear'); break;
- }
-
- // reset smaller components
- if (step >= timeUnits.second) set(d, 'Milliseconds', mode, 0);
- if (step >= timeUnits.minute) set(d, 'Seconds', mode, 0);
- if (step >= timeUnits.hour) set(d, 'Minutes', mode, 0);
- if (step >= timeUnits.day) set(d, 'Hours', mode, 0);
- if (step >= timeUnits.day * 4) set(d, 'Date', mode, 1);
- if (step >= timeUnits.year) set(d, 'Month', mode, 0);
-
- var carry = 0, v = NaN, prev;
- do {
- prev = v;
- v = d.getTime();
- ticks.push({ v: v / scale, label: formatter(v / scale, axis) });
- if (tickUnit == "month") {
- if (tickSize < 1) {
- /* a bit complicated - we'll divide the month up but we need to take care of fractions
- so we don't end up in the middle of a day */
- set(d, 'Date', mode, 1);
- var start = d.getTime();
- set(d, 'Month', mode, get(d, 'Month', mode) + 1)
- var end = d.getTime();
- d.setTime(v + carry * timeUnits.hour + (end - start) * tickSize);
- carry = get(d, 'Hours', mode)
- set(d, 'Hours', mode, 0);
- }
- else
- set(d, 'Month', mode, get(d, 'Month', mode) + tickSize);
- }
- else if (tickUnit == "year") {
- set(d, 'FullYear', mode, get(d, 'FullYear', mode) + tickSize);
- }
- else
- d.setTime(v + step);
-
- } while (v < max && v != prev);
-
- return ticks;
- },
- timeUnits: {
- millisecond: 1,
- second: 1000,
- minute: 1000 * 60,
- hour: 1000 * 60 * 60,
- day: 1000 * 60 * 60 * 24,
- month: 1000 * 60 * 60 * 24 * 30,
- year: 1000 * 60 * 60 * 24 * 365.2425
- },
- // the allowed tick sizes, after 1 year we use an integer algorithm
- spec: [
- [1, "millisecond"], [20, "millisecond"], [50, "millisecond"], [100, "millisecond"], [200, "millisecond"], [500, "millisecond"],
- [1, "second"], [2, "second"], [5, "second"], [10, "second"], [30, "second"],
- [1, "minute"], [2, "minute"], [5, "minute"], [10, "minute"], [30, "minute"],
- [1, "hour"], [2, "hour"], [4, "hour"], [8, "hour"], [12, "hour"],
- [1, "day"], [2, "day"], [3, "day"],
- [0.25, "month"], [0.5, "month"], [1, "month"], [2, "month"], [3, "month"], [6, "month"],
- [1, "year"]
- ],
- monthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
-};
diff --git a/addons/web_graph/static/lib/flotr2/js/DefaultOptions.js b/addons/web_graph/static/lib/flotr2/js/DefaultOptions.js
deleted file mode 100644
index 7399553df6a..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/DefaultOptions.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Flotr Defaults
- */
-Flotr.defaultOptions = {
- colors: ['#00A8F0', '#C0D800', '#CB4B4B', '#4DA74D', '#9440ED'], //=> The default colorscheme. When there are > 5 series, additional colors are generated.
- ieBackgroundColor: '#FFFFFF', // Background color for excanvas clipping
- title: null, // => The graph's title
- subtitle: null, // => The graph's subtitle
- shadowSize: 4, // => size of the 'fake' shadow
- defaultType: null, // => default series type
- HtmlText: true, // => wether to draw the text using HTML or on the canvas
- fontColor: '#545454', // => default font color
- fontSize: 7.5, // => canvas' text font size
- resolution: 1, // => resolution of the graph, to have printer-friendly graphs !
- parseFloat: true, // => whether to preprocess data for floats (ie. if input is string)
- xaxis: {
- ticks: null, // => format: either [1, 3] or [[1, 'a'], 3]
- minorTicks: null, // => format: either [1, 3] or [[1, 'a'], 3]
- showLabels: true, // => setting to true will show the axis ticks labels, hide otherwise
- showMinorLabels: false,// => true to show the axis minor ticks labels, false to hide
- labelsAngle: 0, // => labels' angle, in degrees
- title: null, // => axis title
- titleAngle: 0, // => axis title's angle, in degrees
- noTicks: 5, // => number of ticks for automagically generated ticks
- minorTickFreq: null, // => number of minor ticks between major ticks for autogenerated ticks
- tickFormatter: Flotr.defaultTickFormatter, // => fn: number, Object -> string
- tickDecimals: null, // => no. of decimals, null means auto
- min: null, // => min. value to show, null means set automatically
- max: null, // => max. value to show, null means set automatically
- autoscale: false, // => Turns autoscaling on with true
- autoscaleMargin: 0, // => margin in % to add if auto-setting min/max
- color: null, // => color of the ticks
- mode: 'normal', // => can be 'time' or 'normal'
- timeFormat: null,
- timeMode:'UTC', // => For UTC time ('local' for local time).
- timeUnit:'millisecond',// => Unit for time (millisecond, second, minute, hour, day, month, year)
- scaling: 'linear', // => Scaling, can be 'linear' or 'logarithmic'
- base: Math.E,
- titleAlign: 'center',
- margin: true // => Turn off margins with false
- },
- x2axis: {},
- yaxis: {
- ticks: null, // => format: either [1, 3] or [[1, 'a'], 3]
- minorTicks: null, // => format: either [1, 3] or [[1, 'a'], 3]
- showLabels: true, // => setting to true will show the axis ticks labels, hide otherwise
- showMinorLabels: false,// => true to show the axis minor ticks labels, false to hide
- labelsAngle: 0, // => labels' angle, in degrees
- title: null, // => axis title
- titleAngle: 90, // => axis title's angle, in degrees
- noTicks: 5, // => number of ticks for automagically generated ticks
- minorTickFreq: null, // => number of minor ticks between major ticks for autogenerated ticks
- tickFormatter: Flotr.defaultTickFormatter, // => fn: number, Object -> string
- tickDecimals: null, // => no. of decimals, null means auto
- min: null, // => min. value to show, null means set automatically
- max: null, // => max. value to show, null means set automatically
- autoscale: false, // => Turns autoscaling on with true
- autoscaleMargin: 0, // => margin in % to add if auto-setting min/max
- color: null, // => The color of the ticks
- scaling: 'linear', // => Scaling, can be 'linear' or 'logarithmic'
- base: Math.E,
- titleAlign: 'center',
- margin: true // => Turn off margins with false
- },
- y2axis: {
- titleAngle: 270
- },
- grid: {
- color: '#545454', // => primary color used for outline and labels
- backgroundColor: null, // => null for transparent, else color
- backgroundImage: null, // => background image. String or object with src, left and top
- watermarkAlpha: 0.4, // =>
- tickColor: '#DDDDDD', // => color used for the ticks
- labelMargin: 3, // => margin in pixels
- verticalLines: true, // => whether to show gridlines in vertical direction
- minorVerticalLines: null, // => whether to show gridlines for minor ticks in vertical dir.
- horizontalLines: true, // => whether to show gridlines in horizontal direction
- minorHorizontalLines: null, // => whether to show gridlines for minor ticks in horizontal dir.
- outlineWidth: 1, // => width of the grid outline/border in pixels
- outline : 'nsew', // => walls of the outline to display
- circular: false // => if set to true, the grid will be circular, must be used when radars are drawn
- },
- mouse: {
- track: false, // => true to track the mouse, no tracking otherwise
- trackAll: false,
- position: 'se', // => position of the value box (default south-east)
- relative: false, // => next to the mouse cursor
- trackFormatter: Flotr.defaultTrackFormatter, // => formats the values in the value box
- margin: 5, // => margin in pixels of the valuebox
- lineColor: '#FF3F19', // => line color of points that are drawn when mouse comes near a value of a series
- trackDecimals: 1, // => decimals for the track values
- sensibility: 2, // => the lower this number, the more precise you have to aim to show a value
- trackY: true, // => whether or not to track the mouse in the y axis
- radius: 3, // => radius of the track point
- fillColor: null, // => color to fill our select bar with only applies to bar and similar graphs (only bars for now)
- fillOpacity: 0.4 // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- }
-};
diff --git a/addons/web_graph/static/lib/flotr2/js/EventAdapter.js b/addons/web_graph/static/lib/flotr2/js/EventAdapter.js
deleted file mode 100644
index 062ceeab294..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/EventAdapter.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/**
- * Flotr Event Adapter
- */
-(function () {
-var
- F = Flotr,
- bean = F.bean;
-F.EventAdapter = {
- observe: function(object, name, callback) {
- bean.add(object, name, callback);
- return this;
- },
- fire: function(object, name, args) {
- bean.fire(object, name, args);
- if (typeof(Prototype) != 'undefined')
- Event.fire(object, name, args);
- // @TODO Someone who uses mootools, add mootools adapter for existing applciations.
- return this;
- },
- stopObserving: function(object, name, callback) {
- bean.remove(object, name, callback);
- return this;
- },
- eventPointer: function(e) {
- if (!F._.isUndefined(e.touches) && e.touches.length > 0) {
- return {
- x : e.touches[0].pageX,
- y : e.touches[0].pageY
- };
- } else if (!F._.isUndefined(e.changedTouches) && e.changedTouches.length > 0) {
- return {
- x : e.changedTouches[0].pageX,
- y : e.changedTouches[0].pageY
- };
- } else if (e.pageX || e.pageY) {
- return {
- x : e.pageX,
- y : e.pageY
- };
- } else if (e.clientX || e.clientY) {
- var
- d = document,
- b = d.body,
- de = d.documentElement;
- return {
- x: e.clientX + b.scrollLeft + de.scrollLeft,
- y: e.clientY + b.scrollTop + de.scrollTop
- };
- }
- }
-};
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Flotr.js b/addons/web_graph/static/lib/flotr2/js/Flotr.js
deleted file mode 100644
index e8256096adb..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Flotr.js
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * Flotr2 (c) 2012 Carl Sutherland
- * MIT License
- * Special thanks to:
- * Flotr: http://code.google.com/p/flotr/ (fork)
- * Flot: https://github.com/flot/flot (original fork)
- */
-(function () {
-
-var
- global = this,
- previousFlotr = this.Flotr,
- Flotr;
-
-Flotr = {
- _: _,
- bean: bean,
- isIphone: /iphone/i.test(navigator.userAgent),
- isIE: (navigator.appVersion.indexOf("MSIE") != -1 ? parseFloat(navigator.appVersion.split("MSIE")[1]) : false),
-
- /**
- * An object of the registered graph types. Use Flotr.addType(type, object)
- * to add your own type.
- */
- graphTypes: {},
-
- /**
- * The list of the registered plugins
- */
- plugins: {},
-
- /**
- * Can be used to add your own chart type.
- * @param {String} name - Type of chart, like 'pies', 'bars' etc.
- * @param {String} graphType - The object containing the basic drawing functions (draw, etc)
- */
- addType: function(name, graphType){
- Flotr.graphTypes[name] = graphType;
- Flotr.defaultOptions[name] = graphType.options || {};
- Flotr.defaultOptions.defaultType = Flotr.defaultOptions.defaultType || name;
- },
-
- /**
- * Can be used to add a plugin
- * @param {String} name - The name of the plugin
- * @param {String} plugin - The object containing the plugin's data (callbacks, options, function1, function2, ...)
- */
- addPlugin: function(name, plugin){
- Flotr.plugins[name] = plugin;
- Flotr.defaultOptions[name] = plugin.options || {};
- },
-
- /**
- * Draws the graph. This function is here for backwards compatibility with Flotr version 0.1.0alpha.
- * You could also draw graphs by directly calling Flotr.Graph(element, data, options).
- * @param {Element} el - element to insert the graph into
- * @param {Object} data - an array or object of dataseries
- * @param {Object} options - an object containing options
- * @param {Class} _GraphKlass_ - (optional) Class to pass the arguments to, defaults to Flotr.Graph
- * @return {Object} returns a new graph object and of course draws the graph.
- */
- draw: function(el, data, options, GraphKlass){
- GraphKlass = GraphKlass || Flotr.Graph;
- return new GraphKlass(el, data, options);
- },
-
- /**
- * Recursively merges two objects.
- * @param {Object} src - source object (likely the object with the least properties)
- * @param {Object} dest - destination object (optional, object with the most properties)
- * @return {Object} recursively merged Object
- * @TODO See if we can't remove this.
- */
- merge: function(src, dest){
- var i, v, result = dest || {};
-
- for (i in src) {
- v = src[i];
- if (v && typeof(v) === 'object') {
- if (v.constructor === Array) {
- result[i] = this._.clone(v);
- } else if (v.constructor !== RegExp && !this._.isElement(v)) {
- result[i] = Flotr.merge(v, (dest ? dest[i] : undefined));
- } else {
- result[i] = v;
- }
- } else {
- result[i] = v;
- }
- }
-
- return result;
- },
-
- /**
- * Recursively clones an object.
- * @param {Object} object - The object to clone
- * @return {Object} the clone
- * @TODO See if we can't remove this.
- */
- clone: function(object){
- return Flotr.merge(object, {});
- },
-
- /**
- * Function calculates the ticksize and returns it.
- * @param {Integer} noTicks - number of ticks
- * @param {Integer} min - lower bound integer value for the current axis
- * @param {Integer} max - upper bound integer value for the current axis
- * @param {Integer} decimals - number of decimals for the ticks
- * @return {Integer} returns the ticksize in pixels
- */
- getTickSize: function(noTicks, min, max, decimals){
- var delta = (max - min) / noTicks,
- magn = Flotr.getMagnitude(delta),
- tickSize = 10,
- norm = delta / magn; // Norm is between 1.0 and 10.0.
-
- if(norm < 1.5) tickSize = 1;
- else if(norm < 2.25) tickSize = 2;
- else if(norm < 3) tickSize = ((decimals === 0) ? 2 : 2.5);
- else if(norm < 7.5) tickSize = 5;
-
- return tickSize * magn;
- },
-
- /**
- * Default tick formatter.
- * @param {String, Integer} val - tick value integer
- * @param {Object} axisOpts - the axis' options
- * @return {String} formatted tick string
- */
- defaultTickFormatter: function(val, axisOpts){
- return val+'';
- },
-
- /**
- * Formats the mouse tracker values.
- * @param {Object} obj - Track value Object {x:..,y:..}
- * @return {String} Formatted track string
- */
- defaultTrackFormatter: function(obj){
- return '('+obj.x+', '+obj.y+')';
- },
-
- /**
- * Utility function to convert file size values in bytes to kB, MB, ...
- * @param value {Number} - The value to convert
- * @param precision {Number} - The number of digits after the comma (default: 2)
- * @param base {Number} - The base (default: 1000)
- */
- engineeringNotation: function(value, precision, base){
- var sizes = ['Y','Z','E','P','T','G','M','k',''],
- fractionSizes = ['y','z','a','f','p','n','µ','m',''],
- total = sizes.length;
-
- base = base || 1000;
- precision = Math.pow(10, precision || 2);
-
- if (value === 0) return 0;
-
- if (value > 1) {
- while (total-- && (value >= base)) value /= base;
- }
- else {
- sizes = fractionSizes;
- total = sizes.length;
- while (total-- && (value < 1)) value *= base;
- }
-
- return (Math.round(value * precision) / precision) + sizes[total];
- },
-
- /**
- * Returns the magnitude of the input value.
- * @param {Integer, Float} x - integer or float value
- * @return {Integer, Float} returns the magnitude of the input value
- */
- getMagnitude: function(x){
- return Math.pow(10, Math.floor(Math.log(x) / Math.LN10));
- },
- toPixel: function(val){
- return Math.floor(val)+0.5;//((val-Math.round(val) < 0.4) ? (Math.floor(val)-0.5) : val);
- },
- toRad: function(angle){
- return -angle * (Math.PI/180);
- },
- floorInBase: function(n, base) {
- return base * Math.floor(n / base);
- },
- drawText: function(ctx, text, x, y, style) {
- if (!ctx.fillText) {
- ctx.drawText(text, x, y, style);
- return;
- }
-
- style = this._.extend({
- size: Flotr.defaultOptions.fontSize,
- color: '#000000',
- textAlign: 'left',
- textBaseline: 'bottom',
- weight: 1,
- angle: 0
- }, style);
-
- ctx.save();
- ctx.translate(x, y);
- ctx.rotate(style.angle);
- ctx.fillStyle = style.color;
- ctx.font = (style.weight > 1 ? "bold " : "") + (style.size*1.3) + "px sans-serif";
- ctx.textAlign = style.textAlign;
- ctx.textBaseline = style.textBaseline;
- ctx.fillText(text, 0, 0);
- ctx.restore();
- },
- getBestTextAlign: function(angle, style) {
- style = style || {textAlign: 'center', textBaseline: 'middle'};
- angle += Flotr.getTextAngleFromAlign(style);
-
- if (Math.abs(Math.cos(angle)) > 10e-3)
- style.textAlign = (Math.cos(angle) > 0 ? 'right' : 'left');
-
- if (Math.abs(Math.sin(angle)) > 10e-3)
- style.textBaseline = (Math.sin(angle) > 0 ? 'top' : 'bottom');
-
- return style;
- },
- alignTable: {
- 'right middle' : 0,
- 'right top' : Math.PI/4,
- 'center top' : Math.PI/2,
- 'left top' : 3*(Math.PI/4),
- 'left middle' : Math.PI,
- 'left bottom' : -3*(Math.PI/4),
- 'center bottom': -Math.PI/2,
- 'right bottom' : -Math.PI/4,
- 'center middle': 0
- },
- getTextAngleFromAlign: function(style) {
- return Flotr.alignTable[style.textAlign+' '+style.textBaseline] || 0;
- },
- noConflict : function () {
- global.Flotr = previousFlotr;
- return this;
- }
-};
-
-global.Flotr = Flotr;
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Graph.js b/addons/web_graph/static/lib/flotr2/js/Graph.js
deleted file mode 100644
index 0e0310a5f4e..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Graph.js
+++ /dev/null
@@ -1,745 +0,0 @@
-/**
- * Flotr Graph class that plots a graph on creation.
- */
-(function () {
-
-var
- D = Flotr.DOM,
- E = Flotr.EventAdapter,
- _ = Flotr._,
- flotr = Flotr;
-/**
- * Flotr Graph constructor.
- * @param {Element} el - element to insert the graph into
- * @param {Object} data - an array or object of dataseries
- * @param {Object} options - an object containing options
- */
-Graph = function(el, data, options){
-// Let's see if we can get away with out this [JS]
-// try {
- this._setEl(el);
- this._initMembers();
- this._initPlugins();
-
- E.fire(this.el, 'flotr:beforeinit', [this]);
-
- this.data = data;
- this.series = flotr.Series.getSeries(data);
- this._initOptions(options);
- this._initGraphTypes();
- this._initCanvas();
- this._text = new flotr.Text({
- element : this.el,
- ctx : this.ctx,
- html : this.options.HtmlText,
- textEnabled : this.textEnabled
- });
- E.fire(this.el, 'flotr:afterconstruct', [this]);
- this._initEvents();
-
- this.findDataRanges();
- this.calculateSpacing();
-
- this.draw(_.bind(function() {
- E.fire(this.el, 'flotr:afterinit', [this]);
- }, this));
-/*
- try {
- } catch (e) {
- try {
- console.error(e);
- } catch (e2) {}
- }*/
-};
-
-function observe (object, name, callback) {
- E.observe.apply(this, arguments);
- this._handles.push(arguments);
- return this;
-}
-
-Graph.prototype = {
-
- destroy: function () {
- E.fire(this.el, 'flotr:destroy');
- _.each(this._handles, function (handle) {
- E.stopObserving.apply(this, handle);
- });
- this._handles = [];
- this.el.graph = null;
- },
-
- observe : observe,
-
- /**
- * @deprecated
- */
- _observe : observe,
-
- processColor: function(color, options){
- var o = { x1: 0, y1: 0, x2: this.plotWidth, y2: this.plotHeight, opacity: 1, ctx: this.ctx };
- _.extend(o, options);
- return flotr.Color.processColor(color, o);
- },
- /**
- * Function determines the min and max values for the xaxis and yaxis.
- *
- * TODO logarithmic range validation (consideration of 0)
- */
- findDataRanges: function(){
- var a = this.axes,
- xaxis, yaxis, range;
-
- _.each(this.series, function (series) {
- range = series.getRange();
- if (range) {
- xaxis = series.xaxis;
- yaxis = series.yaxis;
- xaxis.datamin = Math.min(range.xmin, xaxis.datamin);
- xaxis.datamax = Math.max(range.xmax, xaxis.datamax);
- yaxis.datamin = Math.min(range.ymin, yaxis.datamin);
- yaxis.datamax = Math.max(range.ymax, yaxis.datamax);
- xaxis.used = (xaxis.used || range.xused);
- yaxis.used = (yaxis.used || range.yused);
- }
- }, this);
-
- // Check for empty data, no data case (none used)
- if (!a.x.used && !a.x2.used) a.x.used = true;
- if (!a.y.used && !a.y2.used) a.y.used = true;
-
- _.each(a, function (axis) {
- axis.calculateRange();
- });
-
- var
- types = _.keys(flotr.graphTypes),
- drawn = false;
-
- _.each(this.series, function (series) {
- if (series.hide) return;
- _.each(types, function (type) {
- if (series[type] && series[type].show) {
- this.extendRange(type, series);
- drawn = true;
- }
- }, this);
- if (!drawn) {
- this.extendRange(this.options.defaultType, series);
- }
- }, this);
- },
-
- extendRange : function (type, series) {
- if (this[type].extendRange) this[type].extendRange(series, series.data, series[type], this[type]);
- if (this[type].extendYRange) this[type].extendYRange(series.yaxis, series.data, series[type], this[type]);
- if (this[type].extendXRange) this[type].extendXRange(series.xaxis, series.data, series[type], this[type]);
- },
-
- /**
- * Calculates axis label sizes.
- */
- calculateSpacing: function(){
-
- var a = this.axes,
- options = this.options,
- series = this.series,
- margin = options.grid.labelMargin,
- T = this._text,
- x = a.x,
- x2 = a.x2,
- y = a.y,
- y2 = a.y2,
- maxOutset = options.grid.outlineWidth,
- i, j, l, dim;
-
- // TODO post refactor, fix this
- _.each(a, function (axis) {
- axis.calculateTicks();
- axis.calculateTextDimensions(T, options);
- });
-
- // Title height
- dim = T.dimensions(
- options.title,
- {size: options.fontSize*1.5},
- 'font-size:1em;font-weight:bold;',
- 'flotr-title'
- );
- this.titleHeight = dim.height;
-
- // Subtitle height
- dim = T.dimensions(
- options.subtitle,
- {size: options.fontSize},
- 'font-size:smaller;',
- 'flotr-subtitle'
- );
- this.subtitleHeight = dim.height;
-
- for(j = 0; j < options.length; ++j){
- if (series[j].points.show){
- maxOutset = Math.max(maxOutset, series[j].points.radius + series[j].points.lineWidth/2);
- }
- }
-
- var p = this.plotOffset;
- if (x.options.margin === false) {
- p.bottom = 0;
- p.top = 0;
- } else {
- p.bottom += (options.grid.circular ? 0 : (x.used && x.options.showLabels ? (x.maxLabel.height + margin) : 0)) +
- (x.used && x.options.title ? (x.titleSize.height + margin) : 0) + maxOutset;
-
- p.top += (options.grid.circular ? 0 : (x2.used && x2.options.showLabels ? (x2.maxLabel.height + margin) : 0)) +
- (x2.used && x2.options.title ? (x2.titleSize.height + margin) : 0) + this.subtitleHeight + this.titleHeight + maxOutset;
- }
- if (y.options.margin === false) {
- p.left = 0;
- p.right = 0;
- } else {
- p.left += (options.grid.circular ? 0 : (y.used && y.options.showLabels ? (y.maxLabel.width + margin) : 0)) +
- (y.used && y.options.title ? (y.titleSize.width + margin) : 0) + maxOutset;
-
- p.right += (options.grid.circular ? 0 : (y2.used && y2.options.showLabels ? (y2.maxLabel.width + margin) : 0)) +
- (y2.used && y2.options.title ? (y2.titleSize.width + margin) : 0) + maxOutset;
- }
-
- p.top = Math.floor(p.top); // In order the outline not to be blured
-
- this.plotWidth = this.canvasWidth - p.left - p.right;
- this.plotHeight = this.canvasHeight - p.bottom - p.top;
-
- // TODO post refactor, fix this
- x.length = x2.length = this.plotWidth;
- y.length = y2.length = this.plotHeight;
- y.offset = y2.offset = this.plotHeight;
- x.setScale();
- x2.setScale();
- y.setScale();
- y2.setScale();
- },
- /**
- * Draws grid, labels, series and outline.
- */
- draw: function(after) {
-
- var
- context = this.ctx,
- i;
-
- E.fire(this.el, 'flotr:beforedraw', [this.series, this]);
-
- if (this.series.length) {
-
- context.save();
- context.translate(this.plotOffset.left, this.plotOffset.top);
-
- for (i = 0; i < this.series.length; i++) {
- if (!this.series[i].hide) this.drawSeries(this.series[i]);
- }
-
- context.restore();
- this.clip();
- }
-
- E.fire(this.el, 'flotr:afterdraw', [this.series, this]);
- if (after) after();
- },
- /**
- * Actually draws the graph.
- * @param {Object} series - series to draw
- */
- drawSeries: function(series){
-
- function drawChart (series, typeKey) {
- var options = this.getOptions(series, typeKey);
- this[typeKey].draw(options);
- }
-
- var drawn = false;
- series = series || this.series;
-
- _.each(flotr.graphTypes, function (type, typeKey) {
- if (series[typeKey] && series[typeKey].show && this[typeKey]) {
- drawn = true;
- drawChart.call(this, series, typeKey);
- }
- }, this);
-
- if (!drawn) drawChart.call(this, series, this.options.defaultType);
- },
-
- getOptions : function (series, typeKey) {
- var
- type = series[typeKey],
- graphType = this[typeKey],
- options = {
- context : this.ctx,
- width : this.plotWidth,
- height : this.plotHeight,
- fontSize : this.options.fontSize,
- fontColor : this.options.fontColor,
- textEnabled : this.textEnabled,
- htmlText : this.options.HtmlText,
- text : this._text, // TODO Is this necessary?
- element : this.el,
- data : series.data,
- color : series.color,
- shadowSize : series.shadowSize,
- xScale : _.bind(series.xaxis.d2p, series.xaxis),
- yScale : _.bind(series.yaxis.d2p, series.yaxis)
- };
-
- options = flotr.merge(type, options);
-
- // Fill
- options.fillStyle = this.processColor(
- type.fillColor || series.color,
- {opacity: type.fillOpacity}
- );
-
- return options;
- },
- /**
- * Calculates the coordinates from a mouse event object.
- * @param {Event} event - Mouse Event object.
- * @return {Object} Object with coordinates of the mouse.
- */
- getEventPosition: function (e){
-
- var
- d = document,
- b = d.body,
- de = d.documentElement,
- axes = this.axes,
- plotOffset = this.plotOffset,
- lastMousePos = this.lastMousePos,
- pointer = E.eventPointer(e),
- dx = pointer.x - lastMousePos.pageX,
- dy = pointer.y - lastMousePos.pageY,
- r, rx, ry;
-
- if ('ontouchstart' in this.el) {
- r = D.position(this.overlay);
- rx = pointer.x - r.left - plotOffset.left;
- ry = pointer.y - r.top - plotOffset.top;
- } else {
- r = this.overlay.getBoundingClientRect();
- rx = e.clientX - r.left - plotOffset.left - b.scrollLeft - de.scrollLeft;
- ry = e.clientY - r.top - plotOffset.top - b.scrollTop - de.scrollTop;
- }
-
- return {
- x: axes.x.p2d(rx),
- x2: axes.x2.p2d(rx),
- y: axes.y.p2d(ry),
- y2: axes.y2.p2d(ry),
- relX: rx,
- relY: ry,
- dX: dx,
- dY: dy,
- absX: pointer.x,
- absY: pointer.y,
- pageX: pointer.x,
- pageY: pointer.y
- };
- },
- /**
- * Observes the 'click' event and fires the 'flotr:click' event.
- * @param {Event} event - 'click' Event object.
- */
- clickHandler: function(event){
- if(this.ignoreClick){
- this.ignoreClick = false;
- return this.ignoreClick;
- }
- E.fire(this.el, 'flotr:click', [this.getEventPosition(event), this]);
- },
- /**
- * Observes mouse movement over the graph area. Fires the 'flotr:mousemove' event.
- * @param {Event} event - 'mousemove' Event object.
- */
- mouseMoveHandler: function(event){
- if (this.mouseDownMoveHandler) return;
- var pos = this.getEventPosition(event);
- E.fire(this.el, 'flotr:mousemove', [event, pos, this]);
- this.lastMousePos = pos;
- },
- /**
- * Observes the 'mousedown' event.
- * @param {Event} event - 'mousedown' Event object.
- */
- mouseDownHandler: function (event){
-
- /*
- // @TODO Context menu?
- if(event.isRightClick()) {
- event.stop();
-
- var overlay = this.overlay;
- overlay.hide();
-
- function cancelContextMenu () {
- overlay.show();
- E.stopObserving(document, 'mousemove', cancelContextMenu);
- }
- E.observe(document, 'mousemove', cancelContextMenu);
- return;
- }
- */
-
- if (this.mouseUpHandler) return;
- this.mouseUpHandler = _.bind(function (e) {
- E.stopObserving(document, 'mouseup', this.mouseUpHandler);
- E.stopObserving(document, 'mousemove', this.mouseDownMoveHandler);
- this.mouseDownMoveHandler = null;
- this.mouseUpHandler = null;
- // @TODO why?
- //e.stop();
- E.fire(this.el, 'flotr:mouseup', [e, this]);
- }, this);
- this.mouseDownMoveHandler = _.bind(function (e) {
- var pos = this.getEventPosition(e);
- E.fire(this.el, 'flotr:mousemove', [event, pos, this]);
- this.lastMousePos = pos;
- }, this);
- E.observe(document, 'mouseup', this.mouseUpHandler);
- E.observe(document, 'mousemove', this.mouseDownMoveHandler);
- E.fire(this.el, 'flotr:mousedown', [event, this]);
- this.ignoreClick = false;
- },
- drawTooltip: function(content, x, y, options) {
- var mt = this.getMouseTrack(),
- style = '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;',
- p = options.position,
- m = options.margin,
- plotOffset = this.plotOffset;
-
- if(x !== null && y !== null){
- if (!options.relative) { // absolute to the canvas
- if(p.charAt(0) == 'n') style += 'top:' + (m + plotOffset.top) + 'px;bottom:auto;';
- else if(p.charAt(0) == 's') style += 'bottom:' + (m + plotOffset.bottom) + 'px;top:auto;';
- if(p.charAt(1) == 'e') style += 'right:' + (m + plotOffset.right) + 'px;left:auto;';
- else if(p.charAt(1) == 'w') style += 'left:' + (m + plotOffset.left) + 'px;right:auto;';
- }
- else { // relative to the mouse
- if(p.charAt(0) == 'n') style += 'bottom:' + (m - plotOffset.top - y + this.canvasHeight) + 'px;top:auto;';
- else if(p.charAt(0) == 's') style += 'top:' + (m + plotOffset.top + y) + 'px;bottom:auto;';
- if(p.charAt(1) == 'e') style += 'left:' + (m + plotOffset.left + x) + 'px;right:auto;';
- else if(p.charAt(1) == 'w') style += 'right:' + (m - plotOffset.left - x + this.canvasWidth) + 'px;left:auto;';
- }
-
- mt.style.cssText = style;
- D.empty(mt);
- D.insert(mt, content);
- D.show(mt);
- }
- else {
- D.hide(mt);
- }
- },
-
- clip: function () {
-
- var
- ctx = this.ctx,
- o = this.plotOffset,
- w = this.canvasWidth,
- h = this.canvasHeight;
-
- if (flotr.isIE && flotr.isIE < 9) {
- // Clipping for excanvas :-(
- ctx.save();
- ctx.fillStyle = this.processColor(this.options.ieBackgroundColor);
- ctx.fillRect(0, 0, w, o.top);
- ctx.fillRect(0, 0, o.left, h);
- ctx.fillRect(0, h - o.bottom, w, o.bottom);
- ctx.fillRect(w - o.right, 0, o.right,h);
- ctx.restore();
- } else {
- ctx.clearRect(0, 0, w, o.top);
- ctx.clearRect(0, 0, o.left, h);
- ctx.clearRect(0, h - o.bottom, w, o.bottom);
- ctx.clearRect(w - o.right, 0, o.right,h);
- }
- },
-
- _initMembers: function() {
- this._handles = [];
- this.lastMousePos = {pageX: null, pageY: null };
- this.plotOffset = {left: 0, right: 0, top: 0, bottom: 0};
- this.ignoreClick = true;
- this.prevHit = null;
- },
-
- _initGraphTypes: function() {
- _.each(flotr.graphTypes, function(handler, graphType){
- this[graphType] = flotr.clone(handler);
- }, this);
- },
-
- _initEvents: function () {
-
- var
- el = this.el,
- touchendHandler, movement, touchend;
-
- if ('ontouchstart' in el) {
-
- touchendHandler = _.bind(function (e) {
- touchend = true;
- E.stopObserving(document, 'touchend', touchendHandler);
- E.fire(el, 'flotr:mouseup', [event, this]);
- this.multitouches = null;
-
- if (!movement) {
- this.clickHandler(e);
- }
- }, this);
-
- this.observe(this.overlay, 'touchstart', _.bind(function (e) {
- movement = false;
- touchend = false;
- this.ignoreClick = false;
-
- if (e.touches && e.touches.length > 1) {
- this.multitouches = e.touches;
- }
-
- E.fire(el, 'flotr:mousedown', [event, this]);
- this.observe(document, 'touchend', touchendHandler);
- }, this));
-
- this.observe(this.overlay, 'touchmove', _.bind(function (e) {
-
- var pos = this.getEventPosition(e);
-
- e.preventDefault();
-
- movement = true;
-
- if (this.multitouches || (e.touches && e.touches.length > 1)) {
- this.multitouches = e.touches;
- } else {
- if (!touchend) {
- E.fire(el, 'flotr:mousemove', [event, pos, this]);
- }
- }
- this.lastMousePos = pos;
- }, this));
-
- } else {
- this.
- observe(this.overlay, 'mousedown', _.bind(this.mouseDownHandler, this)).
- observe(el, 'mousemove', _.bind(this.mouseMoveHandler, this)).
- observe(this.overlay, 'click', _.bind(this.clickHandler, this)).
- observe(el, 'mouseout', function () {
- E.fire(el, 'flotr:mouseout');
- });
- }
- },
-
- /**
- * Initializes the canvas and it's overlay canvas element. When the browser is IE, this makes use
- * of excanvas. The overlay canvas is inserted for displaying interactions. After the canvas elements
- * are created, the elements are inserted into the container element.
- */
- _initCanvas: function(){
- var el = this.el,
- o = this.options,
- children = el.children,
- removedChildren = [],
- child, i,
- size, style;
-
- // Empty the el
- for (i = children.length; i--;) {
- child = children[i];
- if (!this.canvas && child.className === 'flotr-canvas') {
- this.canvas = child;
- } else if (!this.overlay && child.className === 'flotr-overlay') {
- this.overlay = child;
- } else {
- removedChildren.push(child);
- }
- }
- for (i = removedChildren.length; i--;) {
- el.removeChild(removedChildren[i]);
- }
-
- D.setStyles(el, {position: 'relative'}); // For positioning labels and overlay.
- size = {};
- size.width = el.clientWidth;
- size.height = el.clientHeight;
-
- if(size.width <= 0 || size.height <= 0 || o.resolution <= 0){
- throw 'Invalid dimensions for plot, width = ' + size.width + ', height = ' + size.height + ', resolution = ' + o.resolution;
- }
-
- // Main canvas for drawing graph types
- this.canvas = getCanvas(this.canvas, 'canvas');
- // Overlay canvas for interactive features
- this.overlay = getCanvas(this.overlay, 'overlay');
- this.ctx = getContext(this.canvas);
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- this.octx = getContext(this.overlay);
- this.octx.clearRect(0, 0, this.overlay.width, this.overlay.height);
- this.canvasHeight = size.height;
- this.canvasWidth = size.width;
- this.textEnabled = !!this.ctx.drawText || !!this.ctx.fillText; // Enable text functions
-
- function getCanvas(canvas, name){
- if(!canvas){
- canvas = D.create('canvas');
- if (typeof FlashCanvas != "undefined" && typeof canvas.getContext === 'function') {
- FlashCanvas.initElement(canvas);
- }
- canvas.className = 'flotr-'+name;
- canvas.style.cssText = 'position:absolute;left:0px;top:0px;';
- D.insert(el, canvas);
- }
- _.each(size, function(size, attribute){
- D.show(canvas);
- if (name == 'canvas' && canvas.getAttribute(attribute) === size) {
- return;
- }
- canvas.setAttribute(attribute, size * o.resolution);
- canvas.style[attribute] = size + 'px';
- });
- canvas.context_ = null; // Reset the ExCanvas context
- return canvas;
- }
-
- function getContext(canvas){
- if(window.G_vmlCanvasManager) window.G_vmlCanvasManager.initElement(canvas); // For ExCanvas
- var context = canvas.getContext('2d');
- if(!window.G_vmlCanvasManager) context.scale(o.resolution, o.resolution);
- return context;
- }
- },
-
- _initPlugins: function(){
- // TODO Should be moved to flotr and mixed in.
- _.each(flotr.plugins, function(plugin, name){
- _.each(plugin.callbacks, function(fn, c){
- this.observe(this.el, c, _.bind(fn, this));
- }, this);
- this[name] = flotr.clone(plugin);
- _.each(this[name], function(fn, p){
- if (_.isFunction(fn))
- this[name][p] = _.bind(fn, this);
- }, this);
- }, this);
- },
-
- /**
- * Sets options and initializes some variables and color specific values, used by the constructor.
- * @param {Object} opts - options object
- */
- _initOptions: function(opts){
- var options = flotr.clone(flotr.defaultOptions);
- options.x2axis = _.extend(_.clone(options.xaxis), options.x2axis);
- options.y2axis = _.extend(_.clone(options.yaxis), options.y2axis);
- this.options = flotr.merge(opts || {}, options);
-
- if (this.options.grid.minorVerticalLines === null &&
- this.options.xaxis.scaling === 'logarithmic') {
- this.options.grid.minorVerticalLines = true;
- }
- if (this.options.grid.minorHorizontalLines === null &&
- this.options.yaxis.scaling === 'logarithmic') {
- this.options.grid.minorHorizontalLines = true;
- }
-
- E.fire(this.el, 'flotr:afterinitoptions', [this]);
-
- this.axes = flotr.Axis.getAxes(this.options);
-
- // Initialize some variables used throughout this function.
- var assignedColors = [],
- colors = [],
- ln = this.series.length,
- neededColors = this.series.length,
- oc = this.options.colors,
- usedColors = [],
- variation = 0,
- c, i, j, s;
-
- // Collect user-defined colors from series.
- for(i = neededColors - 1; i > -1; --i){
- c = this.series[i].color;
- if(c){
- --neededColors;
- if(_.isNumber(c)) assignedColors.push(c);
- else usedColors.push(flotr.Color.parse(c));
- }
- }
-
- // Calculate the number of colors that need to be generated.
- for(i = assignedColors.length - 1; i > -1; --i)
- neededColors = Math.max(neededColors, assignedColors[i] + 1);
-
- // Generate needed number of colors.
- for(i = 0; colors.length < neededColors;){
- c = (oc.length == i) ? new flotr.Color(100, 100, 100) : flotr.Color.parse(oc[i]);
-
- // Make sure each serie gets a different color.
- var sign = variation % 2 == 1 ? -1 : 1,
- factor = 1 + sign * Math.ceil(variation / 2) * 0.2;
- c.scale(factor, factor, factor);
-
- /**
- * @todo if we're getting too close to something else, we should probably skip this one
- */
- colors.push(c);
-
- if(++i >= oc.length){
- i = 0;
- ++variation;
- }
- }
-
- // Fill the options with the generated colors.
- for(i = 0, j = 0; i < ln; ++i){
- s = this.series[i];
-
- // Assign the color.
- if (!s.color){
- s.color = colors[j++].toString();
- }else if(_.isNumber(s.color)){
- s.color = colors[s.color].toString();
- }
-
- // Every series needs an axis
- if (!s.xaxis) s.xaxis = this.axes.x;
- if (s.xaxis == 1) s.xaxis = this.axes.x;
- else if (s.xaxis == 2) s.xaxis = this.axes.x2;
-
- if (!s.yaxis) s.yaxis = this.axes.y;
- if (s.yaxis == 1) s.yaxis = this.axes.y;
- else if (s.yaxis == 2) s.yaxis = this.axes.y2;
-
- // Apply missing options to the series.
- for (var t in flotr.graphTypes){
- s[t] = _.extend(_.clone(this.options[t]), s[t]);
- }
- s.mouse = _.extend(_.clone(this.options.mouse), s.mouse);
-
- if (_.isUndefined(s.shadowSize)) s.shadowSize = this.options.shadowSize;
- }
- },
-
- _setEl: function(el) {
- if (!el) throw 'The target container doesn\'t exist';
- else if (el.graph instanceof Graph) el.graph.destroy();
- else if (!el.clientWidth) throw 'The target container must be visible';
-
- el.graph = this;
- this.el = el;
- }
-};
-
-Flotr.Graph = Graph;
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Series.js b/addons/web_graph/static/lib/flotr2/js/Series.js
deleted file mode 100644
index e9a0c0fbeaa..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Series.js
+++ /dev/null
@@ -1,74 +0,0 @@
-/**
- * Flotr Series Library
- */
-
-(function () {
-
-var
- _ = Flotr._;
-
-function Series (o) {
- _.extend(this, o);
-}
-
-Series.prototype = {
-
- getRange: function () {
-
- var
- data = this.data,
- length = data.length,
- xmin = Number.MAX_VALUE,
- ymin = Number.MAX_VALUE,
- xmax = -Number.MAX_VALUE,
- ymax = -Number.MAX_VALUE,
- xused = false,
- yused = false,
- x, y, i;
-
- if (length < 0 || this.hide) return false;
-
- for (i = 0; i < length; i++) {
- x = data[i][0];
- y = data[i][1];
- if (x < xmin) { xmin = x; xused = true; }
- if (x > xmax) { xmax = x; xused = true; }
- if (y < ymin) { ymin = y; yused = true; }
- if (y > ymax) { ymax = y; yused = true; }
- }
-
- return {
- xmin : xmin,
- xmax : xmax,
- ymin : ymin,
- ymax : ymax,
- xused : xused,
- yused : yused
- };
- }
-};
-
-_.extend(Series, {
- /**
- * Collects dataseries from input and parses the series into the right format. It returns an Array
- * of Objects each having at least the 'data' key set.
- * @param {Array, Object} data - Object or array of dataseries
- * @return {Array} Array of Objects parsed into the right format ({(...,) data: [[x1,y1], [x2,y2], ...] (, ...)})
- */
- getSeries: function(data){
- return _.map(data, function(s){
- var series;
- if (s.data) {
- series = new Series();
- _.extend(series, s);
- } else {
- series = new Series({data:s});
- }
- return series;
- });
- }
-});
-
-Flotr.Series = Series;
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/Text.js b/addons/web_graph/static/lib/flotr2/js/Text.js
deleted file mode 100644
index f24cf7ac4bf..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/Text.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/**
- * Text Utilities
- */
-(function () {
-
-var
- F = Flotr,
- D = F.DOM,
- _ = F._,
-
-Text = function (o) {
- this.o = o;
-};
-
-Text.prototype = {
-
- dimensions : function (text, canvasStyle, htmlStyle, className) {
-
- if (!text) return { width : 0, height : 0 };
-
- return (this.o.html) ?
- this.html(text, this.o.element, htmlStyle, className) :
- this.canvas(text, canvasStyle);
- },
-
- canvas : function (text, style) {
-
- if (!this.o.textEnabled) return;
- style = style || {};
-
- var
- metrics = this.measureText(text, style),
- width = metrics.width,
- height = style.size || F.defaultOptions.fontSize,
- angle = style.angle || 0,
- cosAngle = Math.cos(angle),
- sinAngle = Math.sin(angle),
- widthPadding = 2,
- heightPadding = 6,
- bounds;
-
- bounds = {
- width: Math.abs(cosAngle * width) + Math.abs(sinAngle * height) + widthPadding,
- height: Math.abs(sinAngle * width) + Math.abs(cosAngle * height) + heightPadding
- };
-
- return bounds;
- },
-
- html : function (text, element, style, className) {
-
- var div = D.create('div');
-
- D.setStyles(div, { 'position' : 'absolute', 'top' : '-10000px' });
- D.insert(div, '
' + text + '
');
- D.insert(this.o.element, div);
-
- return D.size(div);
- },
-
- measureText : function (text, style) {
-
- var
- context = this.o.ctx,
- metrics;
-
- if (!context.fillText || (F.isIphone && context.measure)) {
- return { width : context.measure(text, style)};
- }
-
- style = _.extend({
- size: F.defaultOptions.fontSize,
- weight: 1,
- angle: 0
- }, style);
-
- context.save();
- context.font = (style.weight > 1 ? "bold " : "") + (style.size*1.3) + "px sans-serif";
- metrics = context.measureText(text);
- context.restore();
-
- return metrics;
- }
-};
-
-Flotr.Text = Text;
-
-})();
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 = ''+this.canvas.firstChild.innerHTML+'';
- 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('
');
- options = options.handles;
-
- // Drag handles
- if (options.drag) {
- right = D.node('
');
- left = D.node('
');
- 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('
');
- 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('
');
- 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
(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 += [
- '' + tick.label + '
'
- ].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 ? '' : ' ');
- 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(
- '',
- '',
- '
', // Border
- '
', // Background
- '
',
- '
',
- ' ',
- '', label, ' '
- );
- }
- if(rowStarted) fragments.push(' ');
-
- if(fragments.length > 0){
- var table = '' + fragments.join('') + '
';
- 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('
'),
- graph = D.node(''+this.options.spreadsheet.tabGraphLabel+'
'),
- data = D.node(''+this.options.spreadsheet.tabDataLabel+'
'),
- 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 = [' '],
- buttonDownload, buttonSelect, t;
-
- // First row : series' labels
- var html = [''];
- html.push(' ');
- _.each(s, function(serie,i){
- html.push(''+(serie.label || String.fromCharCode(65+i))+' ');
- colgroup.push(' ');
- });
- html.push(' ');
- // Data rows
- _.each(datagrid, function(row){
- html.push('');
- _.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(' ');
- }, this);
- colgroup.push('');
- 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(
- '' +
- this.options.spreadsheet.toolbarDownload +
- ' ');
-
- buttonSelect = D.node(
- '' +
- this.options.spreadsheet.toolbarSelectAll+
- ' ');
-
- this.
- observe(buttonDownload, 'click', _.bind(this.spreadsheet.downloadCSV, this)).
- observe(buttonSelect, 'click', _.bind(this.spreadsheet.selectAllData, this));
-
- var toolbar = D.node('
');
- D.insert(toolbar, buttonDownload);
- D.insert(toolbar, buttonSelect);
-
- var containerHeight =this.canvasHeight - D.size(this.spreadsheet.tabsContainer).height-2,
- container = D.node('
');
-
- 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(
- '', options.title, '
'
- );
-
- // Add subtitle
- if (options.subtitle)
- html.push(
- '', options.subtitle, '
'
- );
-
- html.push('');
-
- html.push('');
-
- // Add x axis title
- if (a.x.options.title && a.x.used)
- html.push(
- '
', a.x.options.title, '
'
- );
-
- // Add x2 axis title
- if (a.x2.options.title && a.x2.used)
- html.push(
- '
', a.x2.options.title, '
'
- );
-
- // Add y axis title
- if (a.y.options.title && a.y.used)
- html.push(
- '
', a.y.options.title, '
'
- );
-
- // Add y2 axis title
- if (a.y2.options.title && a.y2.used)
- html.push(
- '
', a.y2.options.title, '
'
- );
-
- 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);
- }
- }
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/types/bars.js b/addons/web_graph/static/lib/flotr2/js/types/bars.js
deleted file mode 100644
index 03e7988b785..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/bars.js
+++ /dev/null
@@ -1,274 +0,0 @@
-/** Bars **/
-Flotr.addType('bars', {
-
- options: {
- show: false, // => setting to true will show bars, false will hide
- lineWidth: 2, // => in pixels
- barWidth: 1, // => in units of the x axis
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillColor: null, // => fill color
- fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- horizontal: false, // => horizontal bars (x and y inverted)
- stacked: false, // => stacked bar charts
- centered: true, // => center the bars to their x axis value
- topPadding: 0.1 // => top padding in percent
- },
-
- stack : {
- positive : [],
- negative : [],
- _positive : [], // Shadow
- _negative : [] // Shadow
- },
-
- draw : function (options) {
- var
- context = options.context;
-
- context.save();
- context.lineJoin = 'miter';
- // @TODO linewidth not interpreted the right way.
- context.lineWidth = options.lineWidth;
- context.strokeStyle = options.color;
- if (options.fill) context.fillStyle = options.fillStyle;
-
- this.plot(options);
-
- context.restore();
- },
-
- plot : function (options) {
-
- var
- data = options.data,
- context = options.context,
- shadowSize = options.shadowSize,
- i, geometry, left, top, width, height;
-
- if (data.length < 1) return;
-
- this.translate(context, options.horizontal);
-
- for (i = 0; i < data.length; i++) {
-
- geometry = this.getBarGeometry(data[i][0], data[i][1], options);
- if (geometry === null) continue;
-
- left = geometry.left;
- top = geometry.top;
- width = geometry.width;
- height = geometry.height;
-
- if (options.fill) context.fillRect(left, top, width, height);
- if (shadowSize) {
- context.save();
- context.fillStyle = 'rgba(0,0,0,0.05)';
- context.fillRect(left + shadowSize, top + shadowSize, width, height);
- context.restore();
- }
- if (options.lineWidth) {
- context.strokeRect(left, top, width, height);
- }
- }
- },
-
- translate : function (context, horizontal) {
- if (horizontal) {
- context.rotate(-Math.PI / 2);
- context.scale(-1, 1);
- }
- },
-
- getBarGeometry : function (x, y, options) {
-
- var
- horizontal = options.horizontal,
- barWidth = options.barWidth,
- centered = options.centered,
- stack = options.stacked ? this.stack : false,
- lineWidth = options.lineWidth,
- bisection = centered ? barWidth / 2 : 0,
- xScale = horizontal ? options.yScale : options.xScale,
- yScale = horizontal ? options.xScale : options.yScale,
- xValue = horizontal ? y : x,
- yValue = horizontal ? x : y,
- stackOffset = 0,
- stackValue, left, right, top, bottom;
-
- // Stacked bars
- if (stack) {
- stackValue = yValue > 0 ? stack.positive : stack.negative;
- stackOffset = stackValue[xValue] || stackOffset;
- stackValue[xValue] = stackOffset + yValue;
- }
-
- left = xScale(xValue - bisection);
- right = xScale(xValue + barWidth - bisection);
- top = yScale(yValue + stackOffset);
- bottom = yScale(stackOffset);
-
- // TODO for test passing... probably looks better without this
- if (bottom < 0) bottom = 0;
-
- // TODO Skipping...
- // if (right < xa.min || left > xa.max || top < ya.min || bottom > ya.max) continue;
-
- return (x === null || y === null) ? null : {
- x : xValue,
- y : yValue,
- xScale : xScale,
- yScale : yScale,
- top : top,
- left : Math.min(left, right) - lineWidth / 2,
- width : Math.abs(right - left) - lineWidth,
- height : bottom - top
- };
- },
-
- hit : function (options) {
- var
- data = options.data,
- args = options.args,
- mouse = args[0],
- n = args[1],
- x = mouse.x,
- y = mouse.y,
- hitGeometry = this.getBarGeometry(x, y, options),
- width = hitGeometry.width / 2,
- left = hitGeometry.left,
- geometry, i;
-
- for (i = data.length; i--;) {
- geometry = this.getBarGeometry(data[i][0], data[i][1], options);
- if (geometry.y > hitGeometry.y && Math.abs(left - geometry.left) < width) {
- n.x = data[i][0];
- n.y = data[i][1];
- n.index = i;
- n.seriesIndex = options.index;
- }
- }
- },
-
- drawHit : function (options) {
- // TODO hits for stacked bars; implement using calculateStack option?
- var
- context = options.context,
- args = options.args,
- geometry = this.getBarGeometry(args.x, args.y, options),
- left = geometry.left,
- top = geometry.top,
- width = geometry.width,
- height = geometry.height;
-
- context.save();
- context.strokeStyle = options.color;
- context.lineWidth = options.lineWidth;
- this.translate(context, options.horizontal);
-
- // Draw highlight
- context.beginPath();
- context.moveTo(left, top + height);
- context.lineTo(left, top);
- context.lineTo(left + width, top);
- context.lineTo(left + width, top + height);
- if (options.fill) {
- context.fillStyle = options.fillStyle;
- context.fill();
- }
- context.stroke();
- context.closePath();
-
- context.restore();
- },
-
- clearHit: function (options) {
- var
- context = options.context,
- args = options.args,
- geometry = this.getBarGeometry(args.x, args.y, options),
- left = geometry.left,
- width = geometry.width,
- top = geometry.top,
- height = geometry.height,
- lineWidth = 2 * options.lineWidth;
-
- context.save();
- this.translate(context, options.horizontal);
- context.clearRect(
- left - lineWidth,
- Math.min(top, top + height) - lineWidth,
- width + 2 * lineWidth,
- Math.abs(height) + 2 * lineWidth
- );
- context.restore();
- },
-
- extendXRange : function (axis, data, options, bars) {
- this._extendRange(axis, data, options, bars);
- },
-
- extendYRange : function (axis, data, options, bars) {
- this._extendRange(axis, data, options, bars);
- },
- _extendRange: function (axis, data, options, bars) {
-
- var
- max = axis.options.max;
-
- if (_.isNumber(max) || _.isString(max)) return;
-
- var
- newmin = axis.min,
- newmax = axis.max,
- horizontal = options.horizontal,
- orientation = axis.orientation,
- positiveSums = this.positiveSums || {},
- negativeSums = this.negativeSums || {},
- value, datum, index, j;
-
- // Sides of bars
- if ((orientation == 1 && !horizontal) || (orientation == -1 && horizontal)) {
- if (options.centered) {
- newmax = Math.max(axis.datamax + options.barWidth, newmax);
- newmin = Math.min(axis.datamin - options.barWidth, newmin);
- }
- }
-
- if (options.stacked &&
- ((orientation == 1 && horizontal) || (orientation == -1 && !horizontal))){
-
- for (j = data.length; j--;) {
- value = data[j][(orientation == 1 ? 1 : 0)]+'';
- datum = data[j][(orientation == 1 ? 0 : 1)];
-
- // Positive
- if (datum > 0) {
- positiveSums[value] = (positiveSums[value] || 0) + datum;
- newmax = Math.max(newmax, positiveSums[value]);
- }
-
- // Negative
- else {
- negativeSums[value] = (negativeSums[value] || 0) + datum;
- newmin = Math.min(newmin, negativeSums[value]);
- }
- }
- }
-
- // End of bars
- if ((orientation == 1 && horizontal) || (orientation == -1 && !horizontal)) {
- if (options.topPadding && (axis.max === axis.datamax || (options.stacked && this.stackMax !== newmax))) {
- newmax += options.topPadding * (newmax - newmin);
- }
- }
-
- this.stackMin = newmin;
- this.stackMax = newmax;
- this.negativeSums = negativeSums;
- this.positiveSums = positiveSums;
-
- axis.max = newmax;
- axis.min = newmin;
- }
-
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/bubbles.js b/addons/web_graph/static/lib/flotr2/js/types/bubbles.js
deleted file mode 100644
index a97c5a28a93..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/bubbles.js
+++ /dev/null
@@ -1,119 +0,0 @@
-/** Bubbles **/
-Flotr.addType('bubbles', {
- options: {
- show: false, // => setting to true will show radar chart, false will hide
- lineWidth: 2, // => line width in pixels
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- baseRadius: 2 // => ratio of the radar, against the plot size
- },
- draw : function (options) {
- var
- context = options.context,
- shadowSize = options.shadowSize;
-
- context.save();
- context.lineWidth = options.lineWidth;
-
- // Shadows
- context.fillStyle = 'rgba(0,0,0,0.05)';
- context.strokeStyle = 'rgba(0,0,0,0.05)';
- this.plot(options, shadowSize / 2);
- context.strokeStyle = 'rgba(0,0,0,0.1)';
- this.plot(options, shadowSize / 4);
-
- // Chart
- context.strokeStyle = options.color;
- context.fillStyle = options.fillStyle;
- this.plot(options);
-
- context.restore();
- },
- plot : function (options, offset) {
-
- var
- data = options.data,
- context = options.context,
- geometry,
- i, x, y, z;
-
- offset = offset || 0;
-
- for (i = 0; i < data.length; ++i){
-
- geometry = this.getGeometry(data[i], options);
-
- context.beginPath();
- context.arc(geometry.x + offset, geometry.y + offset, geometry.z, 0, 2 * Math.PI, true);
- context.stroke();
- if (options.fill) context.fill();
- context.closePath();
- }
- },
- getGeometry : function (point, options) {
- return {
- x : options.xScale(point[0]),
- y : options.yScale(point[1]),
- z : point[2] * options.baseRadius
- };
- },
- hit : function (options) {
- var
- data = options.data,
- args = options.args,
- mouse = args[0],
- n = args[1],
- x = mouse.x,
- y = mouse.y,
- geometry,
- dx, dy;
-
- for (i = data.length; i--;) {
- geometry = this.getGeometry(data[i], options);
-
- dx = geometry.x - options.xScale(x);
- dy = geometry.y - options.yScale(y);
-
- if (Math.sqrt(dx * dx + dy * dy) < geometry.z) {
- n.x = data[i][0];
- n.y = data[i][1];
- n.index = i;
- n.seriesIndex = options.index;
- }
- }
- },
- drawHit : function (options) {
-
- var
- context = options.context,
- geometry = this.getGeometry(options.data[options.args.index], options);
-
- context.save();
- context.lineWidth = options.lineWidth;
- context.fillStyle = options.fillStyle;
- context.strokeStyle = options.color;
- context.beginPath();
- context.arc(geometry.x, geometry.y, geometry.z, 0, 2 * Math.PI, true);
- context.fill();
- context.stroke();
- context.closePath();
- context.restore();
- },
- clearHit : function (options) {
-
- var
- context = options.context,
- geometry = this.getGeometry(options.data[options.args.index], options),
- offset = geometry.z + options.lineWidth;
-
- context.save();
- context.clearRect(
- geometry.x - offset,
- geometry.y - offset,
- 2 * offset,
- 2 * offset
- );
- context.restore();
- }
- // TODO Add a hit calculation method (like pie)
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/candles.js b/addons/web_graph/static/lib/flotr2/js/types/candles.js
deleted file mode 100644
index 0e484b366cc..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/candles.js
+++ /dev/null
@@ -1,127 +0,0 @@
-/** Candles **/
-Flotr.addType('candles', {
- options: {
- show: false, // => setting to true will show candle sticks, false will hide
- lineWidth: 1, // => in pixels
- wickLineWidth: 1, // => in pixels
- candleWidth: 0.6, // => in units of the x axis
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- upFillColor: '#00A8F0',// => up sticks fill color
- downFillColor: '#CB4B4B',// => down sticks fill color
- fillOpacity: 0.5, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- // TODO Test this barcharts option.
- barcharts: false // => draw as barcharts (not standard bars but financial barcharts)
- },
-
- draw : function (options) {
-
- var
- context = options.context;
-
- context.save();
- context.lineJoin = 'miter';
- context.lineCap = 'butt';
- // @TODO linewidth not interpreted the right way.
- context.lineWidth = options.wickLineWidth || options.lineWidth;
-
- this.plot(options);
-
- context.restore();
- },
-
- plot : function (options) {
-
- var
- data = options.data,
- context = options.context,
- xScale = options.xScale,
- yScale = options.yScale,
- width = options.candleWidth / 2,
- shadowSize = options.shadowSize,
- lineWidth = options.lineWidth,
- wickLineWidth = options.wickLineWidth,
- pixelOffset = (wickLineWidth % 2) / 2,
- color,
- datum, x, y,
- open, high, low, close,
- left, right, bottom, top, bottom2, top2,
- i;
-
- if (data.length < 1) return;
-
- for (i = 0; i < data.length; i++) {
- datum = data[i];
- x = datum[0];
- open = datum[1];
- high = datum[2];
- low = datum[3];
- close = datum[4];
- left = xScale(x - width);
- right = xScale(x + width);
- bottom = yScale(low);
- top = yScale(high);
- bottom2 = yScale(Math.min(open, close));
- top2 = yScale(Math.max(open, close));
-
- /*
- // TODO skipping
- if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max)
- continue;
- */
-
- color = options[open > close ? 'downFillColor' : 'upFillColor'];
-
- // Fill the candle.
- // TODO Test the barcharts option
- if (options.fill && !options.barcharts) {
- context.fillStyle = 'rgba(0,0,0,0.05)';
- context.fillRect(left + shadowSize, top2 + shadowSize, right - left, bottom2 - top2);
- context.save();
- context.globalAlpha = options.fillOpacity;
- context.fillStyle = color;
- context.fillRect(left, top2 + lineWidth, right - left, bottom2 - top2);
- context.restore();
- }
-
- // Draw candle outline/border, high, low.
- if (lineWidth || wickLineWidth) {
-
- x = Math.floor((left + right) / 2) + pixelOffset;
-
- context.strokeStyle = color;
- context.beginPath();
-
- // TODO Again with the bartcharts
- if (options.barcharts) {
-
- context.moveTo(x, Math.floor(top + width));
- context.lineTo(x, Math.floor(bottom + width));
-
- y = Math.floor(open + width) + 0.5;
- context.moveTo(Math.floor(left) + pixelOffset, y);
- context.lineTo(x, y);
-
- y = Math.floor(close + width) + 0.5;
- context.moveTo(Math.floor(right) + pixelOffset, y);
- context.lineTo(x, y);
- } else {
- context.strokeRect(left, top2 + lineWidth, right - left, bottom2 - top2);
-
- context.moveTo(x, Math.floor(top2 + lineWidth));
- context.lineTo(x, Math.floor(top + lineWidth));
- context.moveTo(x, Math.floor(bottom2 + lineWidth));
- context.lineTo(x, Math.floor(bottom + lineWidth));
- }
-
- context.closePath();
- context.stroke();
- }
- }
- },
- extendXRange: function (axis, data, options) {
- if (axis.options.max === null) {
- axis.max = Math.max(axis.datamax + 0.5, axis.max);
- axis.min = Math.min(axis.datamin - 0.5, axis.min);
- }
- }
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/gantt.js b/addons/web_graph/static/lib/flotr2/js/types/gantt.js
deleted file mode 100644
index 1498bcb51cf..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/gantt.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/** Gantt
- * Base on data in form [s,y,d] where:
- * y - executor or simply y value
- * s - task start value
- * d - task duration
- * **/
-Flotr.addType('gantt', {
- options: {
- show: false, // => setting to true will show gantt, false will hide
- lineWidth: 2, // => in pixels
- barWidth: 1, // => in units of the x axis
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillColor: null, // => fill color
- fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- centered: true // => center the bars to their x axis value
- },
- /**
- * Draws gantt series in the canvas element.
- * @param {Object} series - Series with options.gantt.show = true.
- */
- draw: function(series) {
- var ctx = this.ctx,
- bw = series.gantt.barWidth,
- lw = Math.min(series.gantt.lineWidth, bw);
-
- ctx.save();
- ctx.translate(this.plotOffset.left, this.plotOffset.top);
- ctx.lineJoin = 'miter';
-
- /**
- * @todo linewidth not interpreted the right way.
- */
- ctx.lineWidth = lw;
- ctx.strokeStyle = series.color;
-
- ctx.save();
- this.gantt.plotShadows(series, bw, 0, series.gantt.fill);
- ctx.restore();
-
- if(series.gantt.fill){
- var color = series.gantt.fillColor || series.color;
- ctx.fillStyle = this.processColor(color, {opacity: series.gantt.fillOpacity});
- }
-
- this.gantt.plot(series, bw, 0, series.gantt.fill);
- ctx.restore();
- },
- plot: function(series, barWidth, offset, fill){
- var data = series.data;
- if(data.length < 1) return;
-
- var xa = series.xaxis,
- ya = series.yaxis,
- ctx = this.ctx, i;
-
- for(i = 0; i < data.length; i++){
- var y = data[i][0],
- s = data[i][1],
- d = data[i][2],
- drawLeft = true, drawTop = true, drawRight = true;
-
- if (s === null || d === null) continue;
-
- var left = s,
- right = s + d,
- bottom = y - (series.gantt.centered ? barWidth/2 : 0),
- top = y + barWidth - (series.gantt.centered ? barWidth/2 : 0);
-
- if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max)
- continue;
-
- if(left < xa.min){
- left = xa.min;
- drawLeft = false;
- }
-
- if(right > xa.max){
- right = xa.max;
- if (xa.lastSerie != series)
- drawTop = false;
- }
-
- if(bottom < ya.min)
- bottom = ya.min;
-
- if(top > ya.max){
- top = ya.max;
- if (ya.lastSerie != series)
- drawTop = false;
- }
-
- /**
- * Fill the bar.
- */
- if(fill){
- ctx.beginPath();
- ctx.moveTo(xa.d2p(left), ya.d2p(bottom) + offset);
- ctx.lineTo(xa.d2p(left), ya.d2p(top) + offset);
- ctx.lineTo(xa.d2p(right), ya.d2p(top) + offset);
- ctx.lineTo(xa.d2p(right), ya.d2p(bottom) + offset);
- ctx.fill();
- ctx.closePath();
- }
-
- /**
- * Draw bar outline/border.
- */
- if(series.gantt.lineWidth && (drawLeft || drawRight || drawTop)){
- ctx.beginPath();
- ctx.moveTo(xa.d2p(left), ya.d2p(bottom) + offset);
-
- ctx[drawLeft ?'lineTo':'moveTo'](xa.d2p(left), ya.d2p(top) + offset);
- ctx[drawTop ?'lineTo':'moveTo'](xa.d2p(right), ya.d2p(top) + offset);
- ctx[drawRight?'lineTo':'moveTo'](xa.d2p(right), ya.d2p(bottom) + offset);
-
- ctx.stroke();
- ctx.closePath();
- }
- }
- },
- plotShadows: function(series, barWidth, offset){
- var data = series.data;
- if(data.length < 1) return;
-
- var i, y, s, d,
- xa = series.xaxis,
- ya = series.yaxis,
- ctx = this.ctx,
- sw = this.options.shadowSize;
-
- for(i = 0; i < data.length; i++){
- y = data[i][0];
- s = data[i][1];
- d = data[i][2];
-
- if (s === null || d === null) continue;
-
- var left = s,
- right = s + d,
- bottom = y - (series.gantt.centered ? barWidth/2 : 0),
- top = y + barWidth - (series.gantt.centered ? barWidth/2 : 0);
-
- if(right < xa.min || left > xa.max || top < ya.min || bottom > ya.max)
- continue;
-
- if(left < xa.min) left = xa.min;
- if(right > xa.max) right = xa.max;
- if(bottom < ya.min) bottom = ya.min;
- if(top > ya.max) top = ya.max;
-
- var width = xa.d2p(right)-xa.d2p(left)-((xa.d2p(right)+sw <= this.plotWidth) ? 0 : sw);
- var height = ya.d2p(bottom)-ya.d2p(top)-((ya.d2p(bottom)+sw <= this.plotHeight) ? 0 : sw );
-
- ctx.fillStyle = 'rgba(0,0,0,0.05)';
- ctx.fillRect(Math.min(xa.d2p(left)+sw, this.plotWidth), Math.min(ya.d2p(top)+sw, this.plotHeight), width, height);
- }
- },
- extendXRange: function(axis) {
- if(axis.options.max === null){
- var newmin = axis.min,
- newmax = axis.max,
- i, j, x, s, g,
- stackedSumsPos = {},
- stackedSumsNeg = {},
- lastSerie = null;
-
- for(i = 0; i < this.series.length; ++i){
- s = this.series[i];
- g = s.gantt;
-
- if(g.show && s.xaxis == axis) {
- for (j = 0; j < s.data.length; j++) {
- if (g.show) {
- y = s.data[j][0]+'';
- stackedSumsPos[y] = Math.max((stackedSumsPos[y] || 0), s.data[j][1]+s.data[j][2]);
- lastSerie = s;
- }
- }
- for (j in stackedSumsPos) {
- newmax = Math.max(stackedSumsPos[j], newmax);
- }
- }
- }
- axis.lastSerie = lastSerie;
- axis.max = newmax;
- axis.min = newmin;
- }
- },
- extendYRange: function(axis){
- if(axis.options.max === null){
- var newmax = Number.MIN_VALUE,
- newmin = Number.MAX_VALUE,
- i, j, s, g,
- stackedSumsPos = {},
- stackedSumsNeg = {},
- lastSerie = null;
-
- for(i = 0; i < this.series.length; ++i){
- s = this.series[i];
- g = s.gantt;
-
- if (g.show && !s.hide && s.yaxis == axis) {
- var datamax = Number.MIN_VALUE, datamin = Number.MAX_VALUE;
- for(j=0; j < s.data.length; j++){
- datamax = Math.max(datamax,s.data[j][0]);
- datamin = Math.min(datamin,s.data[j][0]);
- }
-
- if (g.centered) {
- newmax = Math.max(datamax + 0.5, newmax);
- newmin = Math.min(datamin - 0.5, newmin);
- }
- else {
- newmax = Math.max(datamax + 1, newmax);
- newmin = Math.min(datamin, newmin);
- }
- // For normal horizontal bars
- if (g.barWidth + datamax > newmax){
- newmax = axis.max + g.barWidth;
- }
- }
- }
- axis.lastSerie = lastSerie;
- axis.max = newmax;
- axis.min = newmin;
- axis.tickSize = Flotr.getTickSize(axis.options.noTicks, newmin, newmax, axis.options.tickDecimals);
- }
- }
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/lines.js b/addons/web_graph/static/lib/flotr2/js/types/lines.js
deleted file mode 100644
index d65971b2dfe..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/lines.js
+++ /dev/null
@@ -1,275 +0,0 @@
-/** Lines **/
-Flotr.addType('lines', {
- options: {
- show: false, // => setting to true will show lines, false will hide
- lineWidth: 2, // => line width in pixels
- fill: false, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillBorder: false, // => draw a border around the fill
- fillColor: null, // => fill color
- fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- steps: false, // => draw steps
- stacked: false // => setting to true will show stacked lines, false will show normal lines
- },
-
- stack : {
- values : []
- },
-
- /**
- * Draws lines series in the canvas element.
- * @param {Object} options
- */
- draw : function (options) {
-
- var
- context = options.context,
- lineWidth = options.lineWidth,
- shadowSize = options.shadowSize,
- offset;
-
- context.save();
- context.lineJoin = 'round';
-
- if (shadowSize) {
-
- context.lineWidth = shadowSize / 2;
- offset = lineWidth / 2 + context.lineWidth / 2;
-
- // @TODO do this instead with a linear gradient
- context.strokeStyle = "rgba(0,0,0,0.1)";
- this.plot(options, offset + shadowSize / 2, false);
-
- context.strokeStyle = "rgba(0,0,0,0.2)";
- this.plot(options, offset, false);
- }
-
- context.lineWidth = lineWidth;
- context.strokeStyle = options.color;
-
- this.plot(options, 0, true);
-
- context.restore();
- },
-
- plot : function (options, shadowOffset, incStack) {
-
- var
- context = options.context,
- width = options.width,
- height = options.height,
- xScale = options.xScale,
- yScale = options.yScale,
- data = options.data,
- stack = options.stacked ? this.stack : false,
- length = data.length - 1,
- prevx = null,
- prevy = null,
- zero = yScale(0),
- x1, x2, y1, y2, stack1, stack2, i;
-
- if (length < 1) return;
-
- context.beginPath();
-
- for (i = 0; i < length; ++i) {
-
- // To allow empty values
- if (data[i][1] === null || data[i+1][1] === null) continue;
-
- // Zero is infinity for log scales
- // TODO handle zero for logarithmic
- // if (xa.options.scaling === 'logarithmic' && (data[i][0] <= 0 || data[i+1][0] <= 0)) continue;
- // if (ya.options.scaling === 'logarithmic' && (data[i][1] <= 0 || data[i+1][1] <= 0)) continue;
-
- x1 = xScale(data[i][0]);
- x2 = xScale(data[i+1][0]);
-
- if (stack) {
-
- stack1 = stack.values[data[i][0]] || 0;
- stack2 = stack.values[data[i+1][0]] || stack.values[data[i][0]] || 0;
-
- y1 = yScale(data[i][1] + stack1);
- y2 = yScale(data[i+1][1] + stack2);
-
- if(incStack){
- stack.values[data[i][0]] = data[i][1]+stack1;
-
- if(i == length-1)
- stack.values[data[i+1][0]] = data[i+1][1]+stack2;
- }
- }
- else{
- y1 = yScale(data[i][1]);
- y2 = yScale(data[i+1][1]);
- }
-
- if (
- (y1 > height && y2 > height) ||
- (y1 < 0 && y2 < 0) ||
- (x1 < 0 && x2 < 0) ||
- (x1 > width && x2 > width)
- ) continue;
-
- if((prevx != x1) || (prevy != y1 + shadowOffset))
- context.moveTo(x1, y1 + shadowOffset);
-
- prevx = x2;
- prevy = y2 + shadowOffset;
- if (options.steps) {
- context.lineTo(prevx + shadowOffset / 2, y1 + shadowOffset);
- context.lineTo(prevx + shadowOffset / 2, prevy);
- } else {
- context.lineTo(prevx, prevy);
- }
- }
-
- if (!options.fill || options.fill && !options.fillBorder) context.stroke();
-
- // TODO stacked lines
- if(!shadowOffset && options.fill){
- x1 = xScale(data[0][0]);
- context.fillStyle = options.fillStyle;
- context.lineTo(x2, zero);
- context.lineTo(x1, zero);
- context.lineTo(x1, yScale(data[0][1]));
- context.fill();
- if (options.fillBorder) {
- context.stroke();
- }
- }
-
- context.closePath();
- },
-
- // Perform any pre-render precalculations (this should be run on data first)
- // - Pie chart total for calculating measures
- // - Stacks for lines and bars
- // precalculate : function () {
- // }
- //
- //
- // Get any bounds after pre calculation (axis can fetch this if does not have explicit min/max)
- // getBounds : function () {
- // }
- // getMin : function () {
- // }
- // getMax : function () {
- // }
- //
- //
- // Padding around rendered elements
- // getPadding : function () {
- // }
-
- extendYRange : function (axis, data, options, lines) {
-
- var o = axis.options;
-
- // If stacked and auto-min
- if (options.stacked && ((!o.max && o.max !== 0) || (!o.min && o.min !== 0))) {
-
- var
- newmax = axis.max,
- newmin = axis.min,
- positiveSums = lines.positiveSums || {},
- negativeSums = lines.negativeSums || {},
- x, j;
-
- for (j = 0; j < data.length; j++) {
-
- x = data[j][0] + '';
-
- // Positive
- if (data[j][1] > 0) {
- positiveSums[x] = (positiveSums[x] || 0) + data[j][1];
- newmax = Math.max(newmax, positiveSums[x]);
- }
-
- // Negative
- else {
- negativeSums[x] = (negativeSums[x] || 0) + data[j][1];
- newmin = Math.min(newmin, negativeSums[x]);
- }
- }
-
- lines.negativeSums = negativeSums;
- lines.positiveSums = positiveSums;
-
- axis.max = newmax;
- axis.min = newmin;
- }
-
- if (options.steps) {
-
- this.hit = function (options) {
- var
- data = options.data,
- args = options.args,
- yScale = options.yScale,
- mouse = args[0],
- length = data.length,
- n = args[1],
- x = mouse.x,
- relY = mouse.relY,
- i;
-
- for (i = 0; i < length - 1; i++) {
- if (x >= data[i][0] && x <= data[i+1][0]) {
- if (Math.abs(yScale(data[i][1]) - relY) < 8) {
- n.x = data[i][0];
- n.y = data[i][1];
- n.index = i;
- n.seriesIndex = options.index;
- }
- break;
- }
- }
- };
-
- this.drawHit = function (options) {
- var
- context = options.context,
- args = options.args,
- data = options.data,
- xScale = options.xScale,
- index = args.index,
- x = xScale(args.x),
- y = options.yScale(args.y),
- x2;
-
- if (data.length - 1 > index) {
- x2 = options.xScale(data[index + 1][0]);
- context.save();
- context.strokeStyle = options.color;
- context.lineWidth = options.lineWidth;
- context.beginPath();
- context.moveTo(x, y);
- context.lineTo(x2, y);
- context.stroke();
- context.closePath();
- context.restore();
- }
- };
-
- this.clearHit = function (options) {
- var
- context = options.context,
- args = options.args,
- data = options.data,
- xScale = options.xScale,
- width = options.lineWidth,
- index = args.index,
- x = xScale(args.x),
- y = options.yScale(args.y),
- x2;
-
- if (data.length - 1 > index) {
- x2 = options.xScale(data[index + 1][0]);
- context.clearRect(x - width, y - width, x2 - x + 2 * width, 2 * width);
- }
- };
- }
- }
-
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/markers.js b/addons/web_graph/static/lib/flotr2/js/types/markers.js
deleted file mode 100644
index ee1104e3568..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/markers.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/** Markers **/
-/**
- * Formats the marker labels.
- * @param {Object} obj - Marker value Object {x:..,y:..}
- * @return {String} Formatted marker string
- */
-(function () {
-
-Flotr.defaultMarkerFormatter = function(obj){
- return (Math.round(obj.y*100)/100)+'';
-};
-
-Flotr.addType('markers', {
- options: {
- show: false, // => setting to true will show markers, false will hide
- lineWidth: 1, // => line width of the rectangle around the marker
- color: '#000000', // => text color
- fill: false, // => fill or not the marekers' rectangles
- fillColor: "#FFFFFF", // => fill color
- fillOpacity: 0.4, // => fill opacity
- stroke: false, // => draw the rectangle around the markers
- position: 'ct', // => the markers position (vertical align: b, m, t, horizontal align: l, c, r)
- verticalMargin: 0, // => the margin between the point and the text.
- labelFormatter: Flotr.defaultMarkerFormatter,
- fontSize: Flotr.defaultOptions.fontSize,
- stacked: false, // => true if markers should be stacked
- stackingType: 'b', // => define staching behavior, (b- bars like, a - area like) (see Issue 125 for details)
- horizontal: false // => true if markers should be horizontal (For now only in a case on horizontal stacked bars, stacks should be calculated horizontaly)
- },
-
- // TODO test stacked markers.
- stack : {
- positive : [],
- negative : [],
- values : []
- },
-
- draw : function (options) {
-
- var
- data = options.data,
- context = options.context,
- stack = options.stacked ? options.stack : false,
- stackType = options.stackingType,
- stackOffsetNeg,
- stackOffsetPos,
- stackOffset,
- i, x, y, label;
-
- context.save();
- context.lineJoin = 'round';
- context.lineWidth = options.lineWidth;
- context.strokeStyle = 'rgba(0,0,0,0.5)';
- context.fillStyle = options.fillStyle;
-
- function stackPos (a, b) {
- stackOffsetPos = stack.negative[a] || 0;
- stackOffsetNeg = stack.positive[a] || 0;
- if (b > 0) {
- stack.positive[a] = stackOffsetPos + b;
- return stackOffsetPos + b;
- } else {
- stack.negative[a] = stackOffsetNeg + b;
- return stackOffsetNeg + b;
- }
- }
-
- for (i = 0; i < data.length; ++i) {
-
- x = data[i][0];
- y = data[i][1];
-
- if (stack) {
- if (stackType == 'b') {
- if (options.horizontal) y = stackPos(y, x);
- else x = stackPos(x, y);
- } else if (stackType == 'a') {
- stackOffset = stack.values[x] || 0;
- stack.values[x] = stackOffset + y;
- y = stackOffset + y;
- }
- }
-
- label = options.labelFormatter({x: x, y: y, index: i, data : data});
- this.plot(options.xScale(x), options.yScale(y), label, options);
- }
- context.restore();
- },
- plot: function(x, y, label, options) {
- var context = options.context;
- if (isImage(label) && !label.complete) {
- throw 'Marker image not loaded.';
- } else {
- this._plot(x, y, label, options);
- }
- },
-
- _plot: function(x, y, label, options) {
- var context = options.context,
- margin = 2,
- left = x,
- top = y,
- dim;
-
- if (isImage(label))
- dim = {height : label.height, width: label.width};
- else
- dim = options.text.canvas(label);
-
- dim.width = Math.floor(dim.width+margin*2);
- dim.height = Math.floor(dim.height+margin*2);
-
- if (options.position.indexOf('c') != -1) left -= dim.width/2 + margin;
- else if (options.position.indexOf('l') != -1) left -= dim.width;
-
- if (options.position.indexOf('m') != -1) top -= dim.height/2 + margin;
- else if (options.position.indexOf('t') != -1) top -= dim.height + options.verticalMargin;
- else top += options.verticalMargin;
-
- left = Math.floor(left)+0.5;
- top = Math.floor(top)+0.5;
-
- if(options.fill)
- context.fillRect(left, top, dim.width, dim.height);
-
- if(options.stroke)
- context.strokeRect(left, top, dim.width, dim.height);
-
- if (isImage(label))
- context.drawImage(label, left+margin, top+margin);
- else
- Flotr.drawText(context, label, left+margin, top+margin, {textBaseline: 'top', textAlign: 'left', size: options.fontSize, color: options.color});
- }
-});
-
-function isImage (i) {
- return typeof i === 'object' && i.constructor && (Image ? true : i.constructor === Image);
-}
-
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/types/pie.js b/addons/web_graph/static/lib/flotr2/js/types/pie.js
deleted file mode 100644
index ec932be5e6d..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/pie.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/** Pie **/
-/**
- * Formats the pies labels.
- * @param {Object} slice - Slice object
- * @return {String} Formatted pie label string
- */
-(function () {
-
-var
- _ = Flotr._;
-
-Flotr.defaultPieLabelFormatter = function (total, value) {
- return (100 * value / total).toFixed(2)+'%';
-};
-
-Flotr.addType('pie', {
- options: {
- show: false, // => setting to true will show bars, false will hide
- lineWidth: 1, // => in pixels
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillColor: null, // => fill color
- fillOpacity: 0.6, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- explode: 6, // => the number of pixels the splices will be far from the center
- sizeRatio: 0.6, // => the size ratio of the pie relative to the plot
- startAngle: Math.PI/4, // => the first slice start angle
- labelFormatter: Flotr.defaultPieLabelFormatter,
- pie3D: false, // => whether to draw the pie in 3 dimenstions or not (ineffective)
- pie3DviewAngle: (Math.PI/2 * 0.8),
- pie3DspliceThickness: 20
- },
-
- draw : function (options) {
-
- // TODO 3D charts what?
-
- var
- data = options.data,
- context = options.context,
- canvas = context.canvas,
- lineWidth = options.lineWidth,
- shadowSize = options.shadowSize,
- sizeRatio = options.sizeRatio,
- height = options.height,
- width = options.width,
- explode = options.explode,
- color = options.color,
- fill = options.fill,
- fillStyle = options.fillStyle,
- radius = Math.min(canvas.width, canvas.height) * sizeRatio / 2,
- value = data[0][1],
- html = [],
- vScale = 1,//Math.cos(series.pie.viewAngle);
- measure = Math.PI * 2 * value / this.total,
- startAngle = this.startAngle || (2 * Math.PI * options.startAngle), // TODO: this initial startAngle is already in radians (fixing will be test-unstable)
- endAngle = startAngle + measure,
- bisection = startAngle + measure / 2,
- label = options.labelFormatter(this.total, value),
- //plotTickness = Math.sin(series.pie.viewAngle)*series.pie.spliceThickness / vScale;
- explodeCoeff = explode + radius + 4,
- distX = Math.cos(bisection) * explodeCoeff,
- distY = Math.sin(bisection) * explodeCoeff,
- textAlign = distX < 0 ? 'right' : 'left',
- textBaseline = distY > 0 ? 'top' : 'bottom',
- style,
- x, y,
- distX, distY;
-
- context.save();
- context.translate(width / 2, height / 2);
- context.scale(1, vScale);
-
- x = Math.cos(bisection) * explode;
- y = Math.sin(bisection) * explode;
-
- // Shadows
- if (shadowSize > 0) {
- this.plotSlice(x + shadowSize, y + shadowSize, radius, startAngle, endAngle, context);
- if (fill) {
- context.fillStyle = 'rgba(0,0,0,0.1)';
- context.fill();
- }
- }
-
- this.plotSlice(x, y, radius, startAngle, endAngle, context);
- if (fill) {
- context.fillStyle = fillStyle;
- context.fill();
- }
- context.lineWidth = lineWidth;
- context.strokeStyle = color;
- context.stroke();
-
- style = {
- size : options.fontSize * 1.2,
- color : options.fontColor,
- weight : 1.5
- };
-
- if (label) {
- if (options.htmlText || !options.textEnabled) {
- divStyle = 'position:absolute;' + textBaseline + ':' + (height / 2 + (textBaseline === 'top' ? distY : -distY)) + 'px;';
- divStyle += textAlign + ':' + (width / 2 + (textAlign === 'right' ? -distX : distX)) + 'px;';
- html.push('
', label, '
');
- }
- else {
- style.textAlign = textAlign;
- style.textBaseline = textBaseline;
- Flotr.drawText(context, label, distX, distY, style);
- }
- }
-
- if (options.htmlText || !options.textEnabled) {
- var div = Flotr.DOM.node('
');
- Flotr.DOM.insert(div, html.join(''));
- Flotr.DOM.insert(options.element, div);
- }
-
- context.restore();
-
- // New start angle
- this.startAngle = endAngle;
- this.slices = this.slices || [];
- this.slices.push({
- radius : Math.min(canvas.width, canvas.height) * sizeRatio / 2,
- x : x,
- y : y,
- explode : explode,
- start : startAngle,
- end : endAngle
- });
- },
- plotSlice : function (x, y, radius, startAngle, endAngle, context) {
- context.beginPath();
- context.moveTo(x, y);
- context.arc(x, y, radius, startAngle, endAngle, false);
- context.lineTo(x, y);
- context.closePath();
- },
- hit : function (options) {
-
- var
- data = options.data[0],
- args = options.args,
- index = options.index,
- mouse = args[0],
- n = args[1],
- slice = this.slices[index],
- x = mouse.relX - options.width / 2,
- y = mouse.relY - options.height / 2,
- r = Math.sqrt(x * x + y * y),
- theta = Math.atan(y / x),
- circle = Math.PI * 2,
- explode = slice.explode || options.explode,
- start = slice.start % circle,
- end = slice.end % circle;
-
- if (x < 0) {
- theta += Math.PI;
- } else if (x > 0 && y < 0) {
- theta += circle;
- }
-
- if (r < slice.radius + explode && r > explode) {
- if ((start > end && (theta < end || theta > start)) ||
- (theta > start && theta < end)) {
-
- // TODO Decouple this from hit plugin (chart shouldn't know what n means)
- n.x = data[0];
- n.y = data[1];
- n.sAngle = start;
- n.eAngle = end;
- n.index = 0;
- n.seriesIndex = index;
- n.fraction = data[1] / this.total;
- }
- }
- },
- drawHit: function (options) {
- var
- context = options.context,
- slice = this.slices[options.args.seriesIndex];
-
- context.save();
- context.translate(options.width / 2, options.height / 2);
- this.plotSlice(slice.x, slice.y, slice.radius, slice.start, slice.end, context);
- context.stroke();
- context.restore();
- },
- clearHit : function (options) {
- var
- context = options.context,
- slice = this.slices[options.args.seriesIndex],
- padding = 2 * options.lineWidth,
- radius = slice.radius + padding;
-
- context.save();
- context.translate(options.width / 2, options.height / 2);
- context.clearRect(
- slice.x - radius,
- slice.y - radius,
- 2 * radius + padding,
- 2 * radius + padding
- );
- context.restore();
- },
- extendYRange : function (axis, data) {
- this.total = (this.total || 0) + data[0][1];
- }
-});
-})();
diff --git a/addons/web_graph/static/lib/flotr2/js/types/points.js b/addons/web_graph/static/lib/flotr2/js/types/points.js
deleted file mode 100644
index ebb360e6fae..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/points.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/** Points **/
-Flotr.addType('points', {
- options: {
- show: false, // => setting to true will show points, false will hide
- radius: 3, // => point radius (pixels)
- lineWidth: 2, // => line width in pixels
- fill: true, // => true to fill the points with a color, false for (transparent) no fill
- fillColor: '#FFFFFF', // => fill color
- fillOpacity: 0.4 // => opacity of color inside the points
- },
-
- draw : function (options) {
- var
- context = options.context,
- lineWidth = options.lineWidth,
- shadowSize = options.shadowSize;
-
- context.save();
-
- if (shadowSize > 0) {
- context.lineWidth = shadowSize / 2;
-
- context.strokeStyle = 'rgba(0,0,0,0.1)';
- this.plot(options, shadowSize / 2 + context.lineWidth / 2);
-
- context.strokeStyle = 'rgba(0,0,0,0.2)';
- this.plot(options, context.lineWidth / 2);
- }
-
- context.lineWidth = options.lineWidth;
- context.strokeStyle = options.color;
- context.fillStyle = options.fillColor || options.color;
-
- this.plot(options);
- context.restore();
- },
-
- plot : function (options, offset) {
- var
- data = options.data,
- context = options.context,
- xScale = options.xScale,
- yScale = options.yScale,
- i, x, y;
-
- for (i = data.length - 1; i > -1; --i) {
- y = data[i][1];
- if (y === null) continue;
-
- x = xScale(data[i][0]);
- y = yScale(y);
-
- if (x < 0 || x > options.width || y < 0 || y > options.height) continue;
-
- context.beginPath();
- if (offset) {
- context.arc(x, y + offset, options.radius, 0, Math.PI, false);
- } else {
- context.arc(x, y, options.radius, 0, 2 * Math.PI, true);
- if (options.fill) context.fill();
- }
- context.stroke();
- context.closePath();
- }
- }
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/radar.js b/addons/web_graph/static/lib/flotr2/js/types/radar.js
deleted file mode 100644
index d693ddc78ec..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/radar.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/** Radar **/
-Flotr.addType('radar', {
- options: {
- show: false, // => setting to true will show radar chart, false will hide
- lineWidth: 2, // => line width in pixels
- fill: true, // => true to fill the area from the line to the x axis, false for (transparent) no fill
- fillOpacity: 0.4, // => opacity of the fill color, set to 1 for a solid fill, 0 hides the fill
- radiusRatio: 0.90 // => ratio of the radar, against the plot size
- },
- draw : function (options) {
- var
- context = options.context,
- shadowSize = options.shadowSize;
-
- context.save();
- context.translate(options.width / 2, options.height / 2);
- context.lineWidth = options.lineWidth;
-
- // Shadow
- context.fillStyle = 'rgba(0,0,0,0.05)';
- context.strokeStyle = 'rgba(0,0,0,0.05)';
- this.plot(options, shadowSize / 2);
- context.strokeStyle = 'rgba(0,0,0,0.1)';
- this.plot(options, shadowSize / 4);
-
- // Chart
- context.strokeStyle = options.color;
- context.fillStyle = options.fillStyle;
- this.plot(options);
-
- context.restore();
- },
- plot : function (options, offset) {
- var
- data = options.data,
- context = options.context,
- radius = Math.min(options.height, options.width) * options.radiusRatio / 2,
- step = 2 * Math.PI / data.length,
- angle = -Math.PI / 2,
- i, ratio;
-
- offset = offset || 0;
-
- context.beginPath();
- for (i = 0; i < data.length; ++i) {
- ratio = data[i][1] / this.max;
-
- context[i === 0 ? 'moveTo' : 'lineTo'](
- Math.cos(i * step + angle) * radius * ratio + offset,
- Math.sin(i * step + angle) * radius * ratio + offset
- );
- }
- context.closePath();
- if (options.fill) context.fill();
- context.stroke();
- },
- extendYRange : function (axis, data) {
- this.max = Math.max(axis.max, this.max || -Number.MAX_VALUE);
- }
-});
diff --git a/addons/web_graph/static/lib/flotr2/js/types/timeline.js b/addons/web_graph/static/lib/flotr2/js/types/timeline.js
deleted file mode 100644
index 59ea6094c01..00000000000
--- a/addons/web_graph/static/lib/flotr2/js/types/timeline.js
+++ /dev/null
@@ -1,90 +0,0 @@
-Flotr.addType('timeline', {
- options: {
- show: false,
- lineWidth: 1,
- barWidth: 0.2,
- fill: true,
- fillColor: null,
- fillOpacity: 0.4,
- centered: true
- },
-
- draw : function (options) {
-
- var
- context = options.context;
-
- context.save();
- context.lineJoin = 'miter';
- context.lineWidth = options.lineWidth;
- context.strokeStyle = options.color;
- context.fillStyle = options.fillStyle;
-
- this.plot(options);
-
- context.restore();
- },
-
- plot : function (options) {
-
- var
- data = options.data,
- context = options.context,
- xScale = options.xScale,
- yScale = options.yScale,
- barWidth = options.barWidth,
- lineWidth = options.lineWidth,
- i;
-
- Flotr._.each(data, function (timeline) {
-
- var
- x = timeline[0],
- y = timeline[1],
- w = timeline[2],
- h = barWidth,
-
- xt = Math.ceil(xScale(x)),
- wt = Math.ceil(xScale(x + w)) - xt,
- yt = Math.round(yScale(y)),
- ht = Math.round(yScale(y - h)) - yt,
-
- x0 = xt - lineWidth / 2,
- y0 = Math.round(yt - ht / 2) - lineWidth / 2;
-
- context.strokeRect(x0, y0, wt, ht);
- context.fillRect(x0, y0, wt, ht);
-
- });
- },
-
- extendRange : function (series) {
-
- var
- data = series.data,
- xa = series.xaxis,
- ya = series.yaxis,
- w = series.timeline.barWidth;
-
- if (xa.options.min === null)
- xa.min = xa.datamin - w / 2;
-
- if (xa.options.max === null) {
-
- var
- max = xa.max;
-
- Flotr._.each(data, function (timeline) {
- max = Math.max(max, timeline[0] + timeline[2]);
- }, this);
-
- xa.max = max + w / 2;
- }
-
- if (ya.options.min === null)
- ya.min = ya.datamin - w;
- if (ya.options.min === null)
- ya.max = ya.datamax + w;
- }
-
-});
diff --git a/addons/web_graph/static/lib/flotr2/lib/base64.js b/addons/web_graph/static/lib/flotr2/lib/base64.js
deleted file mode 100644
index 3306e49f9f7..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/base64.js
+++ /dev/null
@@ -1,113 +0,0 @@
-/* Copyright (C) 1999 Masanao Izumo
- * Version: 1.0
- * LastModified: Dec 25 1999
- * This library is free. You can redistribute it and/or modify it.
- */
-
-/*
- * Interfaces:
- * b64 = base64encode(data);
- * data = base64decode(b64);
- */
-
-(function() {
-
-var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-var base64DecodeChars = [
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
- -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
- -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1];
-
-function base64encode(str) {
- var out, i, len;
- var c1, c2, c3;
-
- len = str.length;
- i = 0;
- out = "";
- while(i < len) {
- c1 = str.charCodeAt(i++) & 0xff;
- if(i == len)
- {
- out += base64EncodeChars.charAt(c1 >> 2);
- out += base64EncodeChars.charAt((c1 & 0x3) << 4);
- out += "==";
- break;
- }
- c2 = str.charCodeAt(i++);
- if(i == len)
- {
- out += base64EncodeChars.charAt(c1 >> 2);
- out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
- out += base64EncodeChars.charAt((c2 & 0xF) << 2);
- out += "=";
- break;
- }
- c3 = str.charCodeAt(i++);
- out += base64EncodeChars.charAt(c1 >> 2);
- out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
- out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
- out += base64EncodeChars.charAt(c3 & 0x3F);
- }
- return out;
-}
-
-function base64decode(str) {
- var c1, c2, c3, c4;
- var i, len, out;
-
- len = str.length;
- i = 0;
- out = "";
- while(i < len) {
- /* c1 */
- do {
- c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
- } while(i < len && c1 == -1);
- if(c1 == -1)
- break;
-
- /* c2 */
- do {
- c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
- } while(i < len && c2 == -1);
- if(c2 == -1)
- break;
-
- out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
-
- /* c3 */
- do {
- c3 = str.charCodeAt(i++) & 0xff;
- if(c3 == 61)
- return out;
- c3 = base64DecodeChars[c3];
- } while(i < len && c3 == -1);
- if(c3 == -1)
- break;
-
- out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
-
- /* c4 */
- do {
- c4 = str.charCodeAt(i++) & 0xff;
- if(c4 == 61)
- return out;
- c4 = base64DecodeChars[c4];
- } while(i < len && c4 == -1);
- if(c4 == -1)
- break;
- out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
- }
- return out;
-}
-
-if (!window.btoa) window.btoa = base64encode;
-if (!window.atob) window.atob = base64decode;
-
-})();
\ No newline at end of file
diff --git a/addons/web_graph/static/lib/flotr2/lib/bean-min.js b/addons/web_graph/static/lib/flotr2/lib/bean-min.js
deleted file mode 100644
index 2471420fe25..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/bean-min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/*!
- * bean.js - copyright Jacob Thornton 2011
- * https://github.com/fat/bean
- * MIT License
- * special thanks to:
- * dean edwards: http://dean.edwards.name/
- * dperini: https://github.com/dperini/nwevents
- * the entire mootools team: github.com/mootools/mootools-core
- *//*global module:true, define:true*/
-!function(a,b,c){typeof module!="undefined"?module.exports=c(a,b):typeof define=="function"&&typeof define.amd=="object"?define(c):b[a]=c(a,b)}("bean",this,function(a,b){var c=window,d=b[a],e=/over|out/,f=/[^\.]*(?=\..*)\.|.*/,g=/\..*/,h="addEventListener",i="attachEvent",j="removeEventListener",k="detachEvent",l=document||{},m=l.documentElement||{},n=m[h],o=n?h:i,p=Array.prototype.slice,q=/click|mouse|menu|drag|drop/i,r=/^touch|^gesture/i,s={one:1},t=function(a,b,c){for(c=0;c0){b=b.split(" ");for(j=b.length;j--;)G(a,b[j],c);return a}h=l&&b.replace(g,""),h&&u[h]&&(h=u[h].type);if(!b||l){if(i=l&&b.replace(f,""))i=i.split(".");k(a,h,c,i)}else if(typeof b=="function")k(a,null,b);else for(d in b)b.hasOwnProperty(d)&&G(a,d,b[d]);return a},H=function(a,b,c,d,e){var f,g,h,i,j=c,k=c&&typeof c=="string";if(b&&!c&&typeof b=="object")for(f in b)b.hasOwnProperty(f)&&H.apply(this,[a,f,b[f]]);else{i=arguments.length>3?p.call(arguments,3):[],g=(k?c:b).split(" "),k&&(c=F(b,j=d,e))&&(i=p.call(i,1)),this===s&&(c=C(G,a,b,c,j));for(h=g.length;h--;)E(a,g[h],c,j,i)}return a},I=function(){return H.apply(s,arguments)},J=n?function(a,b,d){var e=l.createEvent(a?"HTMLEvents":"UIEvents");e[a?"initEvent":"initUIEvent"](b,!0,!0,c,1),d.dispatchEvent(e)}:function(a,b,c){c=w(c,a),a?c.fireEvent("on"+b,l.createEventObject()):c["_on"+b]++},K=function(a,b,c){var d,e,h,i,j,k=b.split(" ");for(d=k.length;d--;){b=k[d].replace(g,"");if(i=k[d].replace(f,""))i=i.split(".");if(!i&&!c&&a[o])J(t[b],b,a);else{j=y.get(a,b),c=[!1].concat(c);for(e=0,h=j.length;e 0) {
- // remove(el, 't1 t2 t3', fn) or remove(el, 't1 t2 t3')
- typeSpec = typeSpec.split(' ')
- for (i = typeSpec.length; i--;)
- remove(element, typeSpec[i], fn)
- return element
- }
- type = isString && typeSpec.replace(nameRegex, '')
- if (type && customEvents[type])
- type = customEvents[type].type
- if (!typeSpec || isString) {
- // remove(el) or remove(el, t1.ns) or remove(el, .ns) or remove(el, .ns1.ns2.ns3)
- if (namespaces = isString && typeSpec.replace(namespaceRegex, ''))
- namespaces = namespaces.split('.')
- rm(element, type, fn, namespaces)
- } else if (typeof typeSpec === 'function') {
- // remove(el, fn)
- rm(element, null, typeSpec)
- } else {
- // remove(el, { t1: fn1, t2, fn2 })
- for (k in typeSpec) {
- if (typeSpec.hasOwnProperty(k))
- remove(element, k, typeSpec[k])
- }
- }
- return element
- }
-
- , add = function (element, events, fn, delfn, $) {
- var type, types, i, args
- , originalFn = fn
- , isDel = fn && typeof fn === 'string'
-
- if (events && !fn && typeof events === 'object') {
- for (type in events) {
- if (events.hasOwnProperty(type))
- add.apply(this, [ element, type, events[type] ])
- }
- } else {
- args = arguments.length > 3 ? slice.call(arguments, 3) : []
- types = (isDel ? fn : events).split(' ')
- isDel && (fn = del(events, (originalFn = delfn), $)) && (args = slice.call(args, 1))
- // special case for one()
- this === ONE && (fn = once(remove, element, events, fn, originalFn))
- for (i = types.length; i--;) addListener(element, types[i], fn, originalFn, args)
- }
- return element
- }
-
- , one = function () {
- return add.apply(ONE, arguments)
- }
-
- , fireListener = W3C_MODEL ? function (isNative, type, element) {
- var evt = doc.createEvent(isNative ? 'HTMLEvents' : 'UIEvents')
- evt[isNative ? 'initEvent' : 'initUIEvent'](type, true, true, win, 1)
- element.dispatchEvent(evt)
- } : function (isNative, type, element) {
- element = targetElement(element, isNative)
- // if not-native then we're using onpropertychange so we just increment a custom property
- isNative ? element.fireEvent('on' + type, doc.createEventObject()) : element['_on' + type]++
- }
-
- , fire = function (element, type, args) {
- var i, j, l, names, handlers
- , types = type.split(' ')
-
- for (i = types.length; i--;) {
- type = types[i].replace(nameRegex, '')
- if (names = types[i].replace(namespaceRegex, ''))
- names = names.split('.')
- if (!names && !args && element[eventSupport]) {
- fireListener(nativeEvents[type], type, element)
- } else {
- // non-native event, either because of a namespace, arguments or a non DOM element
- // iterate over all listeners and manually 'fire'
- handlers = registry.get(element, type)
- args = [false].concat(args)
- for (j = 0, l = handlers.length; j < l; j++) {
- if (handlers[j].inNamespaces(names))
- handlers[j].handler.apply(element, args)
- }
- }
- }
- return element
- }
-
- , clone = function (element, from, type) {
- var i = 0
- , handlers = registry.get(from, type)
- , l = handlers.length
-
- for (;i < l; i++)
- handlers[i].original && add(element, handlers[i].type, handlers[i].original)
- return element
- }
-
- , bean = {
- add: add
- , one: one
- , remove: remove
- , clone: clone
- , fire: fire
- , noConflict: function () {
- context[name] = old
- return this
- }
- }
-
- if (win[attachEvent]) {
- // for IE, clean up on unload to avoid leaks
- var cleanup = function () {
- var i, entries = registry.entries()
- for (i in entries) {
- if (entries[i].type && entries[i].type !== 'unload')
- remove(entries[i].element, entries[i].type)
- }
- win[detachEvent]('onunload', cleanup)
- win.CollectGarbage && win.CollectGarbage()
- }
- win[attachEvent]('onunload', cleanup)
- }
-
- return bean
-});
diff --git a/addons/web_graph/static/lib/flotr2/lib/canvas2image.js b/addons/web_graph/static/lib/flotr2/lib/canvas2image.js
deleted file mode 100644
index e064cdac8b9..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/canvas2image.js
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Canvas2Image v0.1
- * Copyright (c) 2008 Jacob Seidelin, cupboy@gmail.com
- * MIT License [http://www.opensource.org/licenses/mit-license.php]
- */
-
-var Canvas2Image = (function() {
- // check if we have canvas support
- var oCanvas = document.createElement("canvas"),
- sc = String.fromCharCode,
- strDownloadMime = "image/octet-stream",
- bReplaceDownloadMime = false;
-
- // no canvas, bail out.
- if (!oCanvas.getContext) {
- return {
- saveAsBMP : function(){},
- saveAsPNG : function(){},
- saveAsJPEG : function(){}
- }
- }
-
- var bHasImageData = !!(oCanvas.getContext("2d").getImageData),
- bHasDataURL = !!(oCanvas.toDataURL),
- bHasBase64 = !!(window.btoa);
-
- // ok, we're good
- var readCanvasData = function(oCanvas) {
- var iWidth = parseInt(oCanvas.width),
- iHeight = parseInt(oCanvas.height);
- return oCanvas.getContext("2d").getImageData(0,0,iWidth,iHeight);
- }
-
- // base64 encodes either a string or an array of charcodes
- var encodeData = function(data) {
- var i, aData, strData = "";
-
- if (typeof data == "string") {
- strData = data;
- } else {
- aData = data;
- for (i = 0; i < aData.length; i++) {
- strData += sc(aData[i]);
- }
- }
- return btoa(strData);
- }
-
- // creates a base64 encoded string containing BMP data takes an imagedata object as argument
- var createBMP = function(oData) {
- var strHeader = '',
- iWidth = oData.width,
- iHeight = oData.height;
-
- strHeader += 'BM';
-
- var iFileSize = iWidth*iHeight*4 + 54; // total header size = 54 bytes
- strHeader += sc(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256);
- strHeader += sc(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256);
- strHeader += sc(iFileSize % 256); iFileSize = Math.floor(iFileSize / 256);
- strHeader += sc(iFileSize % 256);
-
- strHeader += sc(0, 0, 0, 0, 54, 0, 0, 0); // data offset
- strHeader += sc(40, 0, 0, 0); // info header size
-
- var iImageWidth = iWidth;
- strHeader += sc(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256);
- strHeader += sc(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256);
- strHeader += sc(iImageWidth % 256); iImageWidth = Math.floor(iImageWidth / 256);
- strHeader += sc(iImageWidth % 256);
-
- var iImageHeight = iHeight;
- strHeader += sc(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256);
- strHeader += sc(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256);
- strHeader += sc(iImageHeight % 256); iImageHeight = Math.floor(iImageHeight / 256);
- strHeader += sc(iImageHeight % 256);
-
- strHeader += sc(1, 0, 32, 0); // num of planes & num of bits per pixel
- strHeader += sc(0, 0, 0, 0); // compression = none
-
- var iDataSize = iWidth*iHeight*4;
- strHeader += sc(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256);
- strHeader += sc(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256);
- strHeader += sc(iDataSize % 256); iDataSize = Math.floor(iDataSize / 256);
- strHeader += sc(iDataSize % 256);
-
- strHeader += sc(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); // these bytes are not used
-
- var aImgData = oData.data,
- strPixelData = "",
- c, x, y = iHeight,
- iOffsetX, iOffsetY, strPixelRow;
-
- do {
- iOffsetY = iWidth*(y-1)*4;
- strPixelRow = "";
- for (x = 0; x < iWidth; x++) {
- iOffsetX = 4*x;
- strPixelRow += sc(
- aImgData[iOffsetY + iOffsetX + 2], // B
- aImgData[iOffsetY + iOffsetX + 1], // G
- aImgData[iOffsetY + iOffsetX], // R
- aImgData[iOffsetY + iOffsetX + 3] // A
- );
- }
- strPixelData += strPixelRow;
- } while (--y);
-
- return encodeData(strHeader + strPixelData);
- }
-
- // sends the generated file to the client
- var saveFile = function(strData) {
- if (!window.open(strData)) {
- document.location.href = strData;
- }
- }
-
- var makeDataURI = function(strData, strMime) {
- return "data:" + strMime + ";base64," + strData;
- }
-
- // generates a object containing the imagedata
- var makeImageObject = function(strSource) {
- var oImgElement = document.createElement("img");
- oImgElement.src = strSource;
- return oImgElement;
- }
-
- var scaleCanvas = function(oCanvas, iWidth, iHeight) {
- if (iWidth && iHeight) {
- var oSaveCanvas = document.createElement("canvas");
-
- oSaveCanvas.width = iWidth;
- oSaveCanvas.height = iHeight;
- oSaveCanvas.style.width = iWidth+"px";
- oSaveCanvas.style.height = iHeight+"px";
-
- var oSaveCtx = oSaveCanvas.getContext("2d");
-
- oSaveCtx.drawImage(oCanvas, 0, 0, oCanvas.width, oCanvas.height, 0, 0, iWidth, iWidth);
-
- return oSaveCanvas;
- }
- return oCanvas;
- }
-
- return {
- saveAsPNG : function(oCanvas, bReturnImg, iWidth, iHeight) {
- if (!bHasDataURL) return false;
-
- var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight),
- strMime = "image/png",
- strData = oScaledCanvas.toDataURL(strMime);
-
- if (bReturnImg) {
- return makeImageObject(strData);
- } else {
- saveFile(bReplaceDownloadMime ? strData.replace(strMime, strDownloadMime) : strData);
- }
- return true;
- },
-
- saveAsJPEG : function(oCanvas, bReturnImg, iWidth, iHeight) {
- if (!bHasDataURL) return false;
-
- var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight),
- strMime = "image/jpeg",
- strData = oScaledCanvas.toDataURL(strMime);
-
- // check if browser actually supports jpeg by looking for the mime type in the data uri. if not, return false
- if (strData.indexOf(strMime) != 5) return false;
-
- if (bReturnImg) {
- return makeImageObject(strData);
- } else {
- saveFile(bReplaceDownloadMime ? strData.replace(strMime, strDownloadMime) : strData);
- }
- return true;
- },
-
- saveAsBMP : function(oCanvas, bReturnImg, iWidth, iHeight) {
- if (!(bHasDataURL && bHasImageData && bHasBase64)) return false;
-
- var oScaledCanvas = scaleCanvas(oCanvas, iWidth, iHeight),
- strMime = "image/bmp",
- oData = readCanvasData(oScaledCanvas),
- strImgData = createBMP(oData);
-
- if (bReturnImg) {
- return makeImageObject(makeDataURI(strImgData, strMime));
- } else {
- saveFile(makeDataURI(strImgData, strMime));
- }
- return true;
- }
- };
-})();
\ No newline at end of file
diff --git a/addons/web_graph/static/lib/flotr2/lib/canvastext.js b/addons/web_graph/static/lib/flotr2/lib/canvastext.js
deleted file mode 100644
index 2df45bae0d8..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/canvastext.js
+++ /dev/null
@@ -1,429 +0,0 @@
-/**
- * This code is released to the public domain by Jim Studt, 2007.
- * He may keep some sort of up to date copy at http://www.federated.com/~jim/canvastext/
- * It as been modified by Fabien Ménager to handle font style like size, weight, color and rotation.
- * A partial support for special characters has been added too.
- */
-var CanvasText = {
- /** The letters definition. It is a list of letters,
- * with their width, and the coordinates of points compositing them.
- * The syntax for the points is : [x, y], null value means "pen up"
- */
- letters: {
- '\n':{ width: -1, points: [] },
- ' ': { width: 10, points: [] },
- '!': { width: 10, points: [[5,21],[5,7],null,[5,2],[4,1],[5,0],[6,1],[5,2]] },
- '"': { width: 16, points: [[4,21],[4,14],null,[12,21],[12,14]] },
- '#': { width: 21, points: [[11,25],[4,-7],null,[17,25],[10,-7],null,[4,12],[18,12],null,[3,6],[17,6]] },
- '$': { width: 20, points: [[8,25],[8,-4],null,[12,25],[12,-4],null,[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
- '%': { width: 24, points: [[21,21],[3,0],null,[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],null,[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] },
- '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] },
- '\'':{ width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] },
- '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] },
- ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] },
- '*': { width: 16, points: [[8,21],[8,9],null,[3,18],[13,12],null,[13,18],[3,12]] },
- '+': { width: 26, points: [[13,18],[13,0],null,[4,9],[22,9]] },
- ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
- '-': { width: 26, points: [[4,9],[22,9]] },
- '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] },
- '/': { width: 22, points: [[20,25],[2,-7]] },
- '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] },
- '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] },
- '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] },
- '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
- '4': { width: 20, points: [[13,21],[3,7],[18,7],null,[13,21],[13,0]] },
- '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
- '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] },
- '7': { width: 20, points: [[17,21],[7,0],null,[3,21],[17,21]] },
- '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] },
- '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] },
- ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],null,[5,2],[4,1],[5,0],[6,1],[5,2]] },
- ';': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],null,[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
- '<': { width: 24, points: [[20,18],[4,9],[20,0]] },
- '=': { width: 26, points: [[4,12],[22,12],null,[4,6],[22,6]] },
- '>': { width: 24, points: [[4,18],[20,9],[4,0]] },
- '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],null,[9,2],[8,1],[9,0],[10,1],[9,2]] },
- '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],null,[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],null,[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],null,[19,16],[18,8],[18,6],[19,5]] },
- 'A': { width: 18, points: [[9,21],[1,0],null,[9,21],[17,0],null,[4,7],[14,7]] },
- 'B': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],null,[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] },
- 'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] },
- 'D': { width: 21, points: [[4,21],[4,0],null,[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] },
- 'E': { width: 19, points: [[4,21],[4,0],null,[4,21],[17,21],null,[4,11],[12,11],null,[4,0],[17,0]] },
- 'F': { width: 18, points: [[4,21],[4,0],null,[4,21],[17,21],null,[4,11],[12,11]] },
- 'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],null,[13,8],[18,8]] },
- 'H': { width: 22, points: [[4,21],[4,0],null,[18,21],[18,0],null,[4,11],[18,11]] },
- 'I': { width: 8, points: [[4,21],[4,0]] },
- 'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] },
- 'K': { width: 21, points: [[4,21],[4,0],null,[18,21],[4,7],null,[9,12],[18,0]] },
- 'L': { width: 17, points: [[4,21],[4,0],null,[4,0],[16,0]] },
- 'M': { width: 24, points: [[4,21],[4,0],null,[4,21],[12,0],null,[20,21],[12,0],null,[20,21],[20,0]] },
- 'N': { width: 22, points: [[4,21],[4,0],null,[4,21],[18,0],null,[18,21],[18,0]] },
- 'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] },
- 'P': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] },
- 'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],null,[12,4],[18,-2]] },
- 'R': { width: 21, points: [[4,21],[4,0],null,[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],null,[11,11],[18,0]] },
- 'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
- 'T': { width: 16, points: [[8,21],[8,0],null,[1,21],[15,21]] },
- 'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] },
- 'V': { width: 18, points: [[1,21],[9,0],null,[17,21],[9,0]] },
- 'W': { width: 24, points: [[2,21],[7,0],null,[12,21],[7,0],null,[12,21],[17,0],null,[22,21],[17,0]] },
- 'X': { width: 20, points: [[3,21],[17,0],null,[17,21],[3,0]] },
- 'Y': { width: 18, points: [[1,21],[9,11],[9,0],null,[17,21],[9,11]] },
- 'Z': { width: 20, points: [[17,21],[3,0],null,[3,21],[17,21],null,[3,0],[17,0]] },
- '[': { width: 14, points: [[4,25],[4,-7],null,[5,25],[5,-7],null,[4,25],[11,25],null,[4,-7],[11,-7]] },
- '\\':{ width: 14, points: [[0,21],[14,-3]] },
- ']': { width: 14, points: [[9,25],[9,-7],null,[10,25],[10,-7],null,[3,25],[10,25],null,[3,-7],[10,-7]] },
- '^': { width: 14, points: [[3,10],[8,18],[13,10]] },
- '_': { width: 16, points: [[0,-2],[16,-2]] },
- '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] },
- 'a': { width: 19, points: [[15,14],[15,0],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'b': { width: 19, points: [[4,21],[4,0],null,[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
- 'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'd': { width: 19, points: [[15,21],[15,0],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],null,[2,14],[9,14]] },
- 'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'h': { width: 19, points: [[4,21],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
- 'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],null,[4,14],[4,0]] },
- 'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],null,[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] },
- 'k': { width: 17, points: [[4,21],[4,0],null,[14,14],[4,4],null,[8,8],[15,0]] },
- 'l': { width: 8, points: [[4,21],[4,0]] },
- 'm': { width: 30, points: [[4,14],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],null,[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] },
- 'n': { width: 19, points: [[4,14],[4,0],null,[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
- 'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] },
- 'p': { width: 19, points: [[4,14],[4,-7],null,[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
- 'q': { width: 19, points: [[15,14],[15,-7],null,[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
- 'r': { width: 13, points: [[4,14],[4,0],null,[4,8],[5,11],[7,13],[9,14],[12,14]] },
- 's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] },
- 't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],null,[2,14],[9,14]] },
- 'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],null,[15,14],[15,0]] },
- 'v': { width: 16, points: [[2,14],[8,0],null,[14,14],[8,0]] },
- 'w': { width: 22, points: [[3,14],[7,0],null,[11,14],[7,0],null,[11,14],[15,0],null,[19,14],[15,0]] },
- 'x': { width: 17, points: [[3,14],[14,0],null,[14,14],[3,0]] },
- 'y': { width: 16, points: [[2,14],[8,0],null,[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] },
- 'z': { width: 17, points: [[14,14],[3,0],null,[3,14],[14,14],null,[3,0],[14,0]] },
- '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],null,[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],null,[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] },
- '|': { width: 8, points: [[4,25],[4,-7]] },
- '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],null,[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],null,[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] },
- '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],null,[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] },
-
- // Lower case Latin-1
- 'à': { diacritic: '`', letter: 'a' },
- 'á': { diacritic: '´', letter: 'a' },
- 'â': { diacritic: '^', letter: 'a' },
- 'ä': { diacritic: '¨', letter: 'a' },
- 'ã': { diacritic: '~', letter: 'a' },
-
- 'è': { diacritic: '`', letter: 'e' },
- 'é': { diacritic: '´', letter: 'e' },
- 'ê': { diacritic: '^', letter: 'e' },
- 'ë': { diacritic: '¨', letter: 'e' },
-
- 'ì': { diacritic: '`', letter: 'i' },
- 'í': { diacritic: '´', letter: 'i' },
- 'î': { diacritic: '^', letter: 'i' },
- 'ï': { diacritic: '¨', letter: 'i' },
-
- 'ò': { diacritic: '`', letter: 'o' },
- 'ó': { diacritic: '´', letter: 'o' },
- 'ô': { diacritic: '^', letter: 'o' },
- 'ö': { diacritic: '¨', letter: 'o' },
- 'õ': { diacritic: '~', letter: 'o' },
-
- 'ù': { diacritic: '`', letter: 'u' },
- 'ú': { diacritic: '´', letter: 'u' },
- 'û': { diacritic: '^', letter: 'u' },
- 'ü': { diacritic: '¨', letter: 'u' },
-
- 'ý': { diacritic: '´', letter: 'y' },
- 'ÿ': { diacritic: '¨', letter: 'y' },
-
- 'ç': { diacritic: '¸', letter: 'c' },
- 'ñ': { diacritic: '~', letter: 'n' },
-
- // Upper case Latin-1
- 'À': { diacritic: '`', letter: 'A' },
- 'Á': { diacritic: '´', letter: 'A' },
- 'Â': { diacritic: '^', letter: 'A' },
- 'Ä': { diacritic: '¨', letter: 'A' },
- 'Ã': { diacritic: '~', letter: 'A' },
-
- 'È': { diacritic: '`', letter: 'E' },
- 'É': { diacritic: '´', letter: 'E' },
- 'Ê': { diacritic: '^', letter: 'E' },
- 'Ë': { diacritic: '¨', letter: 'E' },
-
- 'Ì': { diacritic: '`', letter: 'I' },
- 'Í': { diacritic: '´', letter: 'I' },
- 'Î': { diacritic: '^', letter: 'I' },
- 'Ï': { diacritic: '¨', letter: 'I' },
-
- 'Ò': { diacritic: '`', letter: 'O' },
- 'Ó': { diacritic: '´', letter: 'O' },
- 'Ô': { diacritic: '^', letter: 'O' },
- 'Ö': { diacritic: '¨', letter: 'O' },
- 'Õ': { diacritic: '~', letter: 'O' },
-
- 'Ù': { diacritic: '`', letter: 'U' },
- 'Ú': { diacritic: '´', letter: 'U' },
- 'Û': { diacritic: '^', letter: 'U' },
- 'Ü': { diacritic: '¨', letter: 'U' },
-
- 'Ý': { diacritic: '´', letter: 'Y' },
-
- 'Ç': { diacritic: '¸', letter: 'C' },
- 'Ñ': { diacritic: '~', letter: 'N' }
- },
-
- specialchars: {
- 'pi': { width: 19, points: [[6,14],[6,0],null,[14,14],[14,0],null,[2,13],[6,16],[13,13],[17,16]] }
- },
-
- /** Diacritics, used to draw accentuated letters */
- diacritics: {
- '¸': { entity: 'cedil', points: [[6,-4],[4,-6],[2,-7],[1,-7]] },
- '´': { entity: 'acute', points: [[8,19],[13,22]] },
- '`': { entity: 'grave', points: [[7,22],[12,19]] },
- '^': { entity: 'circ', points: [[5.5,19],[9.5,23],[12.5,19]] },
- '¨': { entity: 'trema', points: [[5,21],[6,20],[7,21],[6,22],[5,21],null,[12,21],[13,20],[14,21],[13,22],[12,21]] },
- '~': { entity: 'tilde', points: [[4,18],[7,22],[10,18],[13,22]] }
- },
-
- /** The default font styling */
- style: {
- size: 8, // font height in pixels
- font: null, // not yet implemented
- color: '#000000', // font color
- weight: 1, // float, 1 for 'normal'
- textAlign: 'left', // left, right, center
- textBaseline: 'bottom', // top, middle, bottom
- adjustAlign: false, // modifies the alignments if the angle is different from 0 to make the spin point always at the good position
- angle: 0, // in radians, anticlockwise
- tracking: 1, // space between the letters, float, 1 for 'normal'
- boundingBoxColor: '#ff0000', // color of the bounding box (null to hide), can be used for debug and font drawing
- originPointColor: '#000000' // color of the bounding box (null to hide), can be used for debug and font drawing
- },
-
- debug: false,
- _bufferLexemes: {},
-
- extend: function(dest, src) {
- for (var property in src) {
- if (property in dest) continue;
- dest[property] = src[property];
- }
- return dest;
- },
-
- /** Get the letter data corresponding to a char
- * @param {String} ch - The char
- */
- letter: function(ch) {
- return CanvasText.letters[ch];
- },
-
- parseLexemes: function(str) {
- if (CanvasText._bufferLexemes[str])
- return CanvasText._bufferLexemes[str];
-
- var i, c, matches = str.match(/&[A-Za-z]{2,5};|\s|./g),
- result = [], chars = [];
-
- for (i = 0; i < matches.length; i++) {
- c = matches[i];
- if (c.length == 1)
- chars.push(c);
- else {
- var entity = c.substring(1, c.length-1);
- if (CanvasText.specialchars[entity])
- chars.push(entity);
- else
- chars = chars.concat(c.toArray());
- }
- }
- for (i = 0; i < chars.length; i++) {
- c = chars[i];
- if (c = CanvasText.letters[c] || CanvasText.specialchars[c]) result.push(c);
- }
- for (i = 0; i < result.length; i++) {
- if (result === null || typeof result === 'undefined')
- delete result[i];
- }
- return CanvasText._bufferLexemes[str] = result;
- },
-
- /** Get the font ascent for a given style
- * @param {Object} style - The reference style
- */
- ascent: function(style) {
- style = style || CanvasText.style;
- return (style.size || CanvasText.style.size);
- },
-
- /** Get the font descent for a given style
- * @param {Object} style - The reference style
- * */
- descent: function(style) {
- style = style || CanvasText.style;
- return 7.0*(style.size || CanvasText.style.size)/25.0;
- },
-
- /** Measure the text horizontal size
- * @param {String} str - The text
- * @param {Object} style - Text style
- * */
- measure: function(str, style) {
- if (!str) return;
- style = style || CanvasText.style;
-
- var i, width, lexemes = CanvasText.parseLexemes(str),
- total = 0;
-
- for (i = lexemes.length-1; i > -1; --i) {
- c = lexemes[i];
- width = (c.diacritic) ? CanvasText.letter(c.letter).width : c.width;
- total += width * (style.tracking || CanvasText.style.tracking) * (style.size || CanvasText.style.size) / 25.0;
- }
- return total;
- },
-
- getDimensions: function(str, style) {
- style = style || CanvasText.style;
-
- var width = CanvasText.measure(str, style),
- height = style.size || CanvasText.style.size,
- angle = style.angle || CanvasText.style.angle;
-
- if (style.angle == 0) return {width: width, height: height};
- return {
- width: Math.abs(Math.cos(angle) * width) + Math.abs(Math.sin(angle) * height),
- height: Math.abs(Math.sin(angle) * width) + Math.abs(Math.cos(angle) * height)
- }
- },
-
- /** Draws serie of points at given coordinates
- * @param {Canvas context} ctx - The canvas context
- * @param {Array} points - The points to draw
- * @param {Number} x - The X coordinate
- * @param {Number} y - The Y coordinate
- * @param {Number} mag - The scale
- */
- drawPoints: function (ctx, points, x, y, mag, offset) {
- var i, a, penUp = true, needStroke = 0;
- offset = offset || {x:0, y:0};
-
- ctx.beginPath();
- for (i = 0; i < points.length; i++) {
- a = points[i];
- if (!a) {
- penUp = true;
- continue;
- }
- if (penUp) {
- ctx.moveTo(x + a[0]*mag + offset.x, y - a[1]*mag + offset.y);
- penUp = false;
- }
- else {
- ctx.lineTo(x + a[0]*mag + offset.x, y - a[1]*mag + offset.y);
- }
- }
- ctx.stroke();
- ctx.closePath();
- },
-
- /** Draws a text at given coordinates and with a given style
- * @param {String} str - The text to draw
- * @param {Number} xOrig - The X coordinate
- * @param {Number} yOrig - The Y coordinate
- * @param {Object} style - The font style
- */
- draw: function(str, xOrig, yOrig, style) {
- if (!str) return;
- CanvasText.extend(style, CanvasText.style);
-
- var i, c, total = 0,
- mag = style.size / 25.0,
- x = 0, y = 0,
- lexemes = CanvasText.parseLexemes(str),
- offset = {x: 0, y: 0},
- measure = CanvasText.measure(str, style),
- align;
-
- if (style.adjustAlign) {
- align = CanvasText.getBestAlign(style.angle, style);
- CanvasText.extend(style, align);
- }
-
- switch (style.textAlign) {
- case 'left': break;
- case 'center': offset.x = -measure / 2; break;
- case 'right': offset.x = -measure; break;
- }
-
- switch (style.textBaseline) {
- case 'bottom': break;
- case 'middle': offset.y = style.size / 2; break;
- case 'top': offset.y = style.size; break;
- }
-
- this.save();
- this.translate(xOrig, yOrig);
- this.rotate(style.angle);
- this.lineCap = "round";
- this.lineWidth = 2.0 * mag * (style.weight || CanvasText.style.weight);
- this.strokeStyle = style.color || CanvasText.style.color;
-
- for (i = 0; i < lexemes.length; i++) {
- c = lexemes[i];
- if (c.width == -1) {
- x = 0;
- y = style.size * 1.4;
- continue;
- }
-
- var points = c.points,
- width = c.width;
-
- if (c.diacritic) {
- var dia = CanvasText.diacritics[c.diacritic],
- character = CanvasText.letter(c.letter);
-
- CanvasText.drawPoints(this, dia.points, x, y - (c.letter.toUpperCase() == c.letter ? 3 : 0), mag, offset);
- points = character.points;
- width = character.width;
- }
-
- CanvasText.drawPoints(this, points, x, y, mag, offset);
-
- if (CanvasText.debug) {
- this.save();
- this.lineJoin = "miter";
- this.lineWidth = 0.5;
- this.strokeStyle = (style.boundingBoxColor || CanvasText.style.boundingBoxColor);
- this.strokeRect(x+offset.x, y+offset.y, width*mag, -style.size);
-
- this.fillStyle = (style.originPointColor || CanvasText.style.originPointColor);
- this.beginPath();
- this.arc(0, 0, 1.5, 0, Math.PI*2, true);
- this.fill();
- this.closePath();
- this.restore();
- }
-
- x += width*mag*(style.tracking || CanvasText.style.tracking);
- }
- this.restore();
- return total;
- }
-};
-
-/** The text functions are bound to the CanvasRenderingContext2D prototype */
-CanvasText.proto = window.CanvasRenderingContext2D ? window.CanvasRenderingContext2D.prototype : document.createElement('canvas').getContext('2d').__proto__;
-
-if (CanvasText.proto) {
- CanvasText.proto.drawText = CanvasText.draw;
- CanvasText.proto.measure = CanvasText.measure;
- CanvasText.proto.getTextBounds = CanvasText.getDimensions;
- CanvasText.proto.fontAscent = CanvasText.ascent;
- CanvasText.proto.fontDescent = CanvasText.descent;
-}
\ No newline at end of file
diff --git a/addons/web_graph/static/lib/flotr2/lib/excanvas.js b/addons/web_graph/static/lib/flotr2/lib/excanvas.js
deleted file mode 100644
index 005bab1186f..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/excanvas.js
+++ /dev/null
@@ -1,1425 +0,0 @@
-// Copyright 2006 Google Inc.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-
-// Known Issues:
-//
-// * Patterns only support repeat.
-// * Radial gradient are not implemented. The VML version of these look very
-// different from the canvas one.
-// * Clipping paths are not implemented.
-// * Coordsize. The width and height attribute have higher priority than the
-// width and height style values which isn't correct.
-// * Painting mode isn't implemented.
-// * Canvas width/height should is using content-box by default. IE in
-// Quirks mode will draw the canvas using border-box. Either change your
-// doctype to HTML5
-// (http://www.whatwg.org/specs/web-apps/current-work/#the-doctype)
-// or use Box Sizing Behavior from WebFX
-// (http://webfx.eae.net/dhtml/boxsizing/boxsizing.html)
-// * Non uniform scaling does not correctly scale strokes.
-// * Optimize. There is always room for speed improvements.
-
-// Only add this code if we do not already have a canvas implementation
-if (!document.createElement('canvas').getContext) {
-
-(function() {
-
- // alias some functions to make (compiled) code shorter
- var m = Math;
- var mr = m.round;
- var ms = m.sin;
- var mc = m.cos;
- var abs = m.abs;
- var sqrt = m.sqrt;
-
- // this is used for sub pixel precision
- var Z = 10;
- var Z2 = Z / 2;
-
- var IE_VERSION = +navigator.userAgent.match(/MSIE ([\d.]+)?/)[1];
-
- /**
- * This funtion is assigned to the elements as element.getContext().
- * @this {HTMLElement}
- * @return {CanvasRenderingContext2D_}
- */
- function getContext() {
- return this.context_ ||
- (this.context_ = new CanvasRenderingContext2D_(this));
- }
-
- var slice = Array.prototype.slice;
-
- /**
- * Binds a function to an object. The returned function will always use the
- * passed in {@code obj} as {@code this}.
- *
- * Example:
- *
- * g = bind(f, obj, a, b)
- * g(c, d) // will do f.call(obj, a, b, c, d)
- *
- * @param {Function} f The function to bind the object to
- * @param {Object} obj The object that should act as this when the function
- * is called
- * @param {*} var_args Rest arguments that will be used as the initial
- * arguments when the function is called
- * @return {Function} A new function that has bound this
- */
- function bind(f, obj, var_args) {
- var a = slice.call(arguments, 2);
- return function() {
- return f.apply(obj, a.concat(slice.call(arguments)));
- };
- }
-
- function encodeHtmlAttribute(s) {
- return String(s).replace(/&/g, '&').replace(/"/g, '"');
- }
-
- function addNamespace(doc, prefix, urn) {
- if (!doc.namespaces[prefix]) {
- doc.namespaces.add(prefix, urn, '#default#VML');
- }
- }
-
- function addNamespacesAndStylesheet(doc) {
- addNamespace(doc, 'g_vml_', 'urn:schemas-microsoft-com:vml');
- addNamespace(doc, 'g_o_', 'urn:schemas-microsoft-com:office:office');
-
- // Setup default CSS. Only add one style sheet per document
- if (!doc.styleSheets['ex_canvas_']) {
- var ss = doc.createStyleSheet();
- ss.owningElement.id = 'ex_canvas_';
- ss.cssText = 'canvas{display:inline-block;overflow:hidden;' +
- // default size is 300x150 in Gecko and Opera
- 'text-align:left;width:300px;height:150px}';
- }
- }
-
- // Add namespaces and stylesheet at startup.
- addNamespacesAndStylesheet(document);
-
- var G_vmlCanvasManager_ = {
- init: function(opt_doc) {
- var doc = opt_doc || document;
- // Create a dummy element so that IE will allow canvas elements to be
- // recognized.
- doc.createElement('canvas');
- doc.attachEvent('onreadystatechange', bind(this.init_, this, doc));
- },
-
- init_: function(doc) {
- // find all canvas elements
- var els = doc.getElementsByTagName('canvas');
- for (var i = 0; i < els.length; i++) {
- this.initElement(els[i]);
- }
- },
-
- /**
- * Public initializes a canvas element so that it can be used as canvas
- * element from now on. This is called automatically before the page is
- * loaded but if you are creating elements using createElement you need to
- * make sure this is called on the element.
- * @param {HTMLElement} el The canvas element to initialize.
- * @return {HTMLElement} the element that was created.
- */
- initElement: function(el) {
- if (!el.getContext) {
- el.getContext = getContext;
-
- // Add namespaces and stylesheet to document of the element.
- addNamespacesAndStylesheet(el.ownerDocument);
-
- // Remove fallback content. There is no way to hide text nodes so we
- // just remove all childNodes. We could hide all elements and remove
- // text nodes but who really cares about the fallback content.
- el.innerHTML = '';
-
- // do not use inline function because that will leak memory
- el.attachEvent('onpropertychange', onPropertyChange);
- el.attachEvent('onresize', onResize);
-
- var attrs = el.attributes;
- if (attrs.width && attrs.width.specified) {
- // TODO: use runtimeStyle and coordsize
- // el.getContext().setWidth_(attrs.width.nodeValue);
- el.style.width = attrs.width.nodeValue + 'px';
- } else {
- el.width = el.clientWidth;
- }
- if (attrs.height && attrs.height.specified) {
- // TODO: use runtimeStyle and coordsize
- // el.getContext().setHeight_(attrs.height.nodeValue);
- el.style.height = attrs.height.nodeValue + 'px';
- } else {
- el.height = el.clientHeight;
- }
- //el.getContext().setCoordsize_()
- }
- return el;
- }
- };
-
- function onPropertyChange(e) {
- var el = e.srcElement;
-
- switch (e.propertyName) {
- case 'width':
- el.getContext().clearRect();
- el.style.width = el.attributes.width.nodeValue + 'px';
- // In IE8 this does not trigger onresize.
- if (el.firstChild) {
- el.firstChild.style.width = el.clientWidth + 'px';
- }
- break;
- case 'height':
- el.getContext().clearRect();
- el.style.height = el.attributes.height.nodeValue + 'px';
- if (el.firstChild) {
- el.firstChild.style.height = el.clientHeight + 'px';
- }
- break;
- }
- }
-
- function onResize(e) {
- var el = e.srcElement;
- if (el.firstChild) {
- el.firstChild.style.width = el.clientWidth + 'px';
- el.firstChild.style.height = el.clientHeight + 'px';
- }
- }
-
- G_vmlCanvasManager_.init();
-
- // precompute "00" to "FF"
- var decToHex = [];
- for (var i = 0; i < 16; i++) {
- for (var j = 0; j < 16; j++) {
- decToHex[i * 16 + j] = i.toString(16) + j.toString(16);
- }
- }
-
- function createMatrixIdentity() {
- return [
- [1, 0, 0],
- [0, 1, 0],
- [0, 0, 1]
- ];
- }
-
- function matrixMultiply(m1, m2) {
- var result = createMatrixIdentity();
-
- for (var x = 0; x < 3; x++) {
- for (var y = 0; y < 3; y++) {
- var sum = 0;
-
- for (var z = 0; z < 3; z++) {
- sum += m1[x][z] * m2[z][y];
- }
-
- result[x][y] = sum;
- }
- }
- return result;
- }
-
- function copyState(o1, o2) {
- o2.fillStyle = o1.fillStyle;
- o2.lineCap = o1.lineCap;
- o2.lineJoin = o1.lineJoin;
- o2.lineWidth = o1.lineWidth;
- o2.miterLimit = o1.miterLimit;
- o2.shadowBlur = o1.shadowBlur;
- o2.shadowColor = o1.shadowColor;
- o2.shadowOffsetX = o1.shadowOffsetX;
- o2.shadowOffsetY = o1.shadowOffsetY;
- o2.strokeStyle = o1.strokeStyle;
- o2.globalAlpha = o1.globalAlpha;
- o2.font = o1.font;
- o2.textAlign = o1.textAlign;
- o2.textBaseline = o1.textBaseline;
- o2.arcScaleX_ = o1.arcScaleX_;
- o2.arcScaleY_ = o1.arcScaleY_;
- o2.lineScale_ = o1.lineScale_;
- }
-
- var colorData = {
- aliceblue: '#F0F8FF',
- antiquewhite: '#FAEBD7',
- aquamarine: '#7FFFD4',
- azure: '#F0FFFF',
- beige: '#F5F5DC',
- bisque: '#FFE4C4',
- black: '#000000',
- blanchedalmond: '#FFEBCD',
- blueviolet: '#8A2BE2',
- brown: '#A52A2A',
- burlywood: '#DEB887',
- cadetblue: '#5F9EA0',
- chartreuse: '#7FFF00',
- chocolate: '#D2691E',
- coral: '#FF7F50',
- cornflowerblue: '#6495ED',
- cornsilk: '#FFF8DC',
- crimson: '#DC143C',
- cyan: '#00FFFF',
- darkblue: '#00008B',
- darkcyan: '#008B8B',
- darkgoldenrod: '#B8860B',
- darkgray: '#A9A9A9',
- darkgreen: '#006400',
- darkgrey: '#A9A9A9',
- darkkhaki: '#BDB76B',
- darkmagenta: '#8B008B',
- darkolivegreen: '#556B2F',
- darkorange: '#FF8C00',
- darkorchid: '#9932CC',
- darkred: '#8B0000',
- darksalmon: '#E9967A',
- darkseagreen: '#8FBC8F',
- darkslateblue: '#483D8B',
- darkslategray: '#2F4F4F',
- darkslategrey: '#2F4F4F',
- darkturquoise: '#00CED1',
- darkviolet: '#9400D3',
- deeppink: '#FF1493',
- deepskyblue: '#00BFFF',
- dimgray: '#696969',
- dimgrey: '#696969',
- dodgerblue: '#1E90FF',
- firebrick: '#B22222',
- floralwhite: '#FFFAF0',
- forestgreen: '#228B22',
- gainsboro: '#DCDCDC',
- ghostwhite: '#F8F8FF',
- gold: '#FFD700',
- goldenrod: '#DAA520',
- grey: '#808080',
- greenyellow: '#ADFF2F',
- honeydew: '#F0FFF0',
- hotpink: '#FF69B4',
- indianred: '#CD5C5C',
- indigo: '#4B0082',
- ivory: '#FFFFF0',
- khaki: '#F0E68C',
- lavender: '#E6E6FA',
- lavenderblush: '#FFF0F5',
- lawngreen: '#7CFC00',
- lemonchiffon: '#FFFACD',
- lightblue: '#ADD8E6',
- lightcoral: '#F08080',
- lightcyan: '#E0FFFF',
- lightgoldenrodyellow: '#FAFAD2',
- lightgreen: '#90EE90',
- lightgrey: '#D3D3D3',
- lightpink: '#FFB6C1',
- lightsalmon: '#FFA07A',
- lightseagreen: '#20B2AA',
- lightskyblue: '#87CEFA',
- lightslategray: '#778899',
- lightslategrey: '#778899',
- lightsteelblue: '#B0C4DE',
- lightyellow: '#FFFFE0',
- limegreen: '#32CD32',
- linen: '#FAF0E6',
- magenta: '#FF00FF',
- mediumaquamarine: '#66CDAA',
- mediumblue: '#0000CD',
- mediumorchid: '#BA55D3',
- mediumpurple: '#9370DB',
- mediumseagreen: '#3CB371',
- mediumslateblue: '#7B68EE',
- mediumspringgreen: '#00FA9A',
- mediumturquoise: '#48D1CC',
- mediumvioletred: '#C71585',
- midnightblue: '#191970',
- mintcream: '#F5FFFA',
- mistyrose: '#FFE4E1',
- moccasin: '#FFE4B5',
- navajowhite: '#FFDEAD',
- oldlace: '#FDF5E6',
- olivedrab: '#6B8E23',
- orange: '#FFA500',
- orangered: '#FF4500',
- orchid: '#DA70D6',
- palegoldenrod: '#EEE8AA',
- palegreen: '#98FB98',
- paleturquoise: '#AFEEEE',
- palevioletred: '#DB7093',
- papayawhip: '#FFEFD5',
- peachpuff: '#FFDAB9',
- peru: '#CD853F',
- pink: '#FFC0CB',
- plum: '#DDA0DD',
- powderblue: '#B0E0E6',
- rosybrown: '#BC8F8F',
- royalblue: '#4169E1',
- saddlebrown: '#8B4513',
- salmon: '#FA8072',
- sandybrown: '#F4A460',
- seagreen: '#2E8B57',
- seashell: '#FFF5EE',
- sienna: '#A0522D',
- skyblue: '#87CEEB',
- slateblue: '#6A5ACD',
- slategray: '#708090',
- slategrey: '#708090',
- snow: '#FFFAFA',
- springgreen: '#00FF7F',
- steelblue: '#4682B4',
- tan: '#D2B48C',
- thistle: '#D8BFD8',
- tomato: '#FF6347',
- turquoise: '#40E0D0',
- violet: '#EE82EE',
- wheat: '#F5DEB3',
- whitesmoke: '#F5F5F5',
- yellowgreen: '#9ACD32'
- };
-
-
- function getRgbHslContent(styleString) {
- var start = styleString.indexOf('(', 3);
- var end = styleString.indexOf(')', start + 1);
- var parts = styleString.substring(start + 1, end).split(',');
- // add alpha if needed
- if (parts.length != 4 || styleString.charAt(3) != 'a') {
- parts[3] = 1;
- }
- return parts;
- }
-
- function percent(s) {
- return parseFloat(s) / 100;
- }
-
- function clamp(v, min, max) {
- return Math.min(max, Math.max(min, v));
- }
-
- function hslToRgb(parts){
- var r, g, b, h, s, l;
- h = parseFloat(parts[0]) / 360 % 360;
- if (h < 0)
- h++;
- s = clamp(percent(parts[1]), 0, 1);
- l = clamp(percent(parts[2]), 0, 1);
- if (s == 0) {
- r = g = b = l; // achromatic
- } else {
- var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
- var p = 2 * l - q;
- r = hueToRgb(p, q, h + 1 / 3);
- g = hueToRgb(p, q, h);
- b = hueToRgb(p, q, h - 1 / 3);
- }
-
- return '#' + decToHex[Math.floor(r * 255)] +
- decToHex[Math.floor(g * 255)] +
- decToHex[Math.floor(b * 255)];
- }
-
- function hueToRgb(m1, m2, h) {
- if (h < 0)
- h++;
- if (h > 1)
- h--;
-
- if (6 * h < 1)
- return m1 + (m2 - m1) * 6 * h;
- else if (2 * h < 1)
- return m2;
- else if (3 * h < 2)
- return m1 + (m2 - m1) * (2 / 3 - h) * 6;
- else
- return m1;
- }
-
- var processStyleCache = {};
-
- function processStyle(styleString) {
- if (styleString in processStyleCache) {
- return processStyleCache[styleString];
- }
-
- var str, alpha = 1;
-
- styleString = String(styleString);
- if (styleString.charAt(0) == '#') {
- str = styleString;
- } else if (/^rgb/.test(styleString)) {
- var parts = getRgbHslContent(styleString);
- var str = '#', n;
- for (var i = 0; i < 3; i++) {
- if (parts[i].indexOf('%') != -1) {
- n = Math.floor(percent(parts[i]) * 255);
- } else {
- n = +parts[i];
- }
- str += decToHex[clamp(n, 0, 255)];
- }
- alpha = +parts[3];
- } else if (/^hsl/.test(styleString)) {
- var parts = getRgbHslContent(styleString);
- str = hslToRgb(parts);
- alpha = parts[3];
- } else {
- str = colorData[styleString] || styleString;
- }
- return processStyleCache[styleString] = {color: str, alpha: alpha};
- }
-
- var DEFAULT_STYLE = {
- style: 'normal',
- variant: 'normal',
- weight: 'normal',
- size: 10,
- family: 'sans-serif'
- };
-
- // Internal text style cache
- var fontStyleCache = {};
-
- function processFontStyle(styleString) {
- if (fontStyleCache[styleString]) {
- return fontStyleCache[styleString];
- }
-
- var el = document.createElement('div');
- var style = el.style;
- try {
- style.font = styleString;
- } catch (ex) {
- // Ignore failures to set to invalid font.
- }
-
- return fontStyleCache[styleString] = {
- style: style.fontStyle || DEFAULT_STYLE.style,
- variant: style.fontVariant || DEFAULT_STYLE.variant,
- weight: style.fontWeight || DEFAULT_STYLE.weight,
- size: style.fontSize || DEFAULT_STYLE.size,
- family: style.fontFamily || DEFAULT_STYLE.family
- };
- }
-
- function getComputedStyle(style, element) {
- var computedStyle = {};
-
- for (var p in style) {
- computedStyle[p] = style[p];
- }
-
- // Compute the size
- var canvasFontSize = parseFloat(element.currentStyle.fontSize),
- fontSize = parseFloat(style.size);
-
- if (typeof style.size == 'number') {
- computedStyle.size = style.size;
- } else if (style.size.indexOf('px') != -1) {
- computedStyle.size = fontSize;
- } else if (style.size.indexOf('em') != -1) {
- computedStyle.size = canvasFontSize * fontSize;
- } else if(style.size.indexOf('%') != -1) {
- computedStyle.size = (canvasFontSize / 100) * fontSize;
- } else if (style.size.indexOf('pt') != -1) {
- computedStyle.size = fontSize / .75;
- } else {
- computedStyle.size = canvasFontSize;
- }
-
- // Different scaling between normal text and VML text. This was found using
- // trial and error to get the same size as non VML text.
- //computedStyle.size *= 0.981;
-
- return computedStyle;
- }
-
- function buildStyle(style) {
- return style.style + ' ' + style.variant + ' ' + style.weight + ' ' +
- style.size + 'px ' + style.family;
- }
-
- var lineCapMap = {
- 'butt': 'flat',
- 'round': 'round'
- };
-
- function processLineCap(lineCap) {
- return lineCapMap[lineCap] || 'square';
- }
-
- /**
- * This class implements CanvasRenderingContext2D interface as described by
- * the WHATWG.
- * @param {HTMLElement} canvasElement The element that the 2D context should
- * be associated with
- */
- function CanvasRenderingContext2D_(canvasElement) {
- this.m_ = createMatrixIdentity();
-
- this.mStack_ = [];
- this.aStack_ = [];
- this.currentPath_ = [];
-
- // Canvas context properties
- this.strokeStyle = '#000';
- this.fillStyle = '#000';
-
- this.lineWidth = 1;
- this.lineJoin = 'miter';
- this.lineCap = 'butt';
- this.miterLimit = Z * 1;
- this.globalAlpha = 1;
- this.font = '10px sans-serif';
- this.textAlign = 'left';
- this.textBaseline = 'alphabetic';
- this.canvas = canvasElement;
-
- var cssText = 'width:' + canvasElement.clientWidth + 'px;height:' +
- canvasElement.clientHeight + 'px;overflow:hidden;position:absolute';
- var el = canvasElement.ownerDocument.createElement('div');
- el.style.cssText = cssText;
- canvasElement.appendChild(el);
-
- var overlayEl = el.cloneNode(false);
- // Use a non transparent background.
- overlayEl.style.backgroundColor = 'red';
- overlayEl.style.filter = 'alpha(opacity=0)';
- canvasElement.appendChild(overlayEl);
-
- this.element_ = el;
- this.arcScaleX_ = 1;
- this.arcScaleY_ = 1;
- this.lineScale_ = 1;
- }
-
- var contextPrototype = CanvasRenderingContext2D_.prototype;
- contextPrototype.clearRect = function() {
- if (this.textMeasureEl_) {
- this.textMeasureEl_.removeNode(true);
- this.textMeasureEl_ = null;
- }
- this.element_.innerHTML = '';
- };
-
- contextPrototype.beginPath = function() {
- // TODO: Branch current matrix so that save/restore has no effect
- // as per safari docs.
- this.currentPath_ = [];
- };
-
- contextPrototype.moveTo = function(aX, aY) {
- var p = getCoords(this, aX, aY);
- this.currentPath_.push({type: 'moveTo', x: p.x, y: p.y});
- this.currentX_ = p.x;
- this.currentY_ = p.y;
- };
-
- contextPrototype.lineTo = function(aX, aY) {
- var p = getCoords(this, aX, aY);
- this.currentPath_.push({type: 'lineTo', x: p.x, y: p.y});
-
- this.currentX_ = p.x;
- this.currentY_ = p.y;
- };
-
- contextPrototype.bezierCurveTo = function(aCP1x, aCP1y,
- aCP2x, aCP2y,
- aX, aY) {
- var p = getCoords(this, aX, aY);
- var cp1 = getCoords(this, aCP1x, aCP1y);
- var cp2 = getCoords(this, aCP2x, aCP2y);
- bezierCurveTo(this, cp1, cp2, p);
- };
-
- // Helper function that takes the already fixed cordinates.
- function bezierCurveTo(self, cp1, cp2, p) {
- self.currentPath_.push({
- type: 'bezierCurveTo',
- cp1x: cp1.x,
- cp1y: cp1.y,
- cp2x: cp2.x,
- cp2y: cp2.y,
- x: p.x,
- y: p.y
- });
- self.currentX_ = p.x;
- self.currentY_ = p.y;
- }
-
- contextPrototype.quadraticCurveTo = function(aCPx, aCPy, aX, aY) {
- // the following is lifted almost directly from
- // http://developer.mozilla.org/en/docs/Canvas_tutorial:Drawing_shapes
-
- var cp = getCoords(this, aCPx, aCPy);
- var p = getCoords(this, aX, aY);
-
- var cp1 = {
- x: this.currentX_ + 2.0 / 3.0 * (cp.x - this.currentX_),
- y: this.currentY_ + 2.0 / 3.0 * (cp.y - this.currentY_)
- };
- var cp2 = {
- x: cp1.x + (p.x - this.currentX_) / 3.0,
- y: cp1.y + (p.y - this.currentY_) / 3.0
- };
-
- bezierCurveTo(this, cp1, cp2, p);
- };
-
- contextPrototype.arc = function(aX, aY, aRadius,
- aStartAngle, aEndAngle, aClockwise) {
- aRadius *= Z;
- var arcType = aClockwise ? 'at' : 'wa';
-
- var xStart = aX + mc(aStartAngle) * aRadius - Z2;
- var yStart = aY + ms(aStartAngle) * aRadius - Z2;
-
- var xEnd = aX + mc(aEndAngle) * aRadius - Z2;
- var yEnd = aY + ms(aEndAngle) * aRadius - Z2;
-
- // IE won't render arches drawn counter clockwise if xStart == xEnd.
- if ((abs(xStart - xEnd) < 10e-8) && !aClockwise) {
- xStart += 0.125; // Offset xStart by 1/80 of a pixel. Use something
- // that can be represented in binary
- }
- // IE won't render arches drawn clockwise if yStart is very close to yEnd.
- if ((abs(yStart - yEnd) < 10e-8) && aClockwise) {
- yStart -= 0.125; // Offset yStart by 1/80 of a pixel. Use something
- // that can be represented in binary
- }
-
- var p = getCoords(this, aX, aY);
- var pStart = getCoords(this, xStart, yStart);
- var pEnd = getCoords(this, xEnd, yEnd);
-
- this.currentPath_.push({type: arcType,
- x: p.x,
- y: p.y,
- radius: aRadius,
- xStart: pStart.x,
- yStart: pStart.y,
- xEnd: pEnd.x,
- yEnd: pEnd.y});
-
- };
-
- contextPrototype.rect = function(aX, aY, aWidth, aHeight) {
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- };
-
- contextPrototype.strokeRect = function(aX, aY, aWidth, aHeight) {
- var oldPath = this.currentPath_;
- this.beginPath();
-
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- this.stroke();
-
- this.currentPath_ = oldPath;
- };
-
- contextPrototype.fillRect = function(aX, aY, aWidth, aHeight) {
- var oldPath = this.currentPath_;
- this.beginPath();
-
- this.moveTo(aX, aY);
- this.lineTo(aX + aWidth, aY);
- this.lineTo(aX + aWidth, aY + aHeight);
- this.lineTo(aX, aY + aHeight);
- this.closePath();
- this.fill();
-
- this.currentPath_ = oldPath;
- };
-
- contextPrototype.createLinearGradient = function(aX0, aY0, aX1, aY1) {
- var gradient = new CanvasGradient_('gradient');
- gradient.x0_ = aX0;
- gradient.y0_ = aY0;
- gradient.x1_ = aX1;
- gradient.y1_ = aY1;
- return gradient;
- };
-
- contextPrototype.createRadialGradient = function(aX0, aY0, aR0,
- aX1, aY1, aR1) {
- var gradient = new CanvasGradient_('gradientradial');
- gradient.x0_ = aX0;
- gradient.y0_ = aY0;
- gradient.r0_ = aR0;
- gradient.x1_ = aX1;
- gradient.y1_ = aY1;
- gradient.r1_ = aR1;
- return gradient;
- };
-
- contextPrototype.drawImage = function(image, var_args) {
- var dx, dy, dw, dh, sx, sy, sw, sh;
-
- // to find the original width we overide the width and height
- var oldRuntimeWidth = image.runtimeStyle.width;
- var oldRuntimeHeight = image.runtimeStyle.height;
- image.runtimeStyle.width = 'auto';
- image.runtimeStyle.height = 'auto';
-
- // get the original size
- var w = image.width;
- var h = image.height;
-
- // and remove overides
- image.runtimeStyle.width = oldRuntimeWidth;
- image.runtimeStyle.height = oldRuntimeHeight;
-
- if (arguments.length == 3) {
- dx = arguments[1];
- dy = arguments[2];
- sx = sy = 0;
- sw = dw = w;
- sh = dh = h;
- } else if (arguments.length == 5) {
- dx = arguments[1];
- dy = arguments[2];
- dw = arguments[3];
- dh = arguments[4];
- sx = sy = 0;
- sw = w;
- sh = h;
- } else if (arguments.length == 9) {
- sx = arguments[1];
- sy = arguments[2];
- sw = arguments[3];
- sh = arguments[4];
- dx = arguments[5];
- dy = arguments[6];
- dw = arguments[7];
- dh = arguments[8];
- } else {
- throw Error('Invalid number of arguments');
- }
-
- var d = getCoords(this, dx, dy);
-
- var w2 = sw / 2;
- var h2 = sh / 2;
-
- var vmlStr = [];
-
- var W = 10;
- var H = 10;
-
- // For some reason that I've now forgotten, using divs didn't work
- vmlStr.push(' ' ,
- ' ',
- ' ');
-
- this.element_.insertAdjacentHTML('BeforeEnd', vmlStr.join(''));
- };
-
- contextPrototype.stroke = function(aFill) {
- var lineStr = [];
- var lineOpen = false;
-
- var W = 10;
- var H = 10;
-
- lineStr.push('');
-
- if (!aFill) {
- appendStroke(this, lineStr);
- } else {
- appendFill(this, lineStr, min, max);
- }
-
- lineStr.push(' ');
-
- this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
- };
-
- function appendStroke(ctx, lineStr) {
- var a = processStyle(ctx.strokeStyle);
- var color = a.color;
- var opacity = a.alpha * ctx.globalAlpha;
- var lineWidth = ctx.lineScale_ * ctx.lineWidth;
-
- // VML cannot correctly render a line if the width is less than 1px.
- // In that case, we dilute the color to make the line look thinner.
- if (lineWidth < 1) {
- opacity *= lineWidth;
- }
-
- lineStr.push(
- ' '
- );
- }
-
- function appendFill(ctx, lineStr, min, max) {
- var fillStyle = ctx.fillStyle;
- var arcScaleX = ctx.arcScaleX_;
- var arcScaleY = ctx.arcScaleY_;
- var width = max.x - min.x;
- var height = max.y - min.y;
- if (fillStyle instanceof CanvasGradient_) {
- // TODO: Gradients transformed with the transformation matrix.
- var angle = 0;
- var focus = {x: 0, y: 0};
-
- // additional offset
- var shift = 0;
- // scale factor for offset
- var expansion = 1;
-
- if (fillStyle.type_ == 'gradient') {
- var x0 = fillStyle.x0_ / arcScaleX;
- var y0 = fillStyle.y0_ / arcScaleY;
- var x1 = fillStyle.x1_ / arcScaleX;
- var y1 = fillStyle.y1_ / arcScaleY;
- var p0 = getCoords(ctx, x0, y0);
- var p1 = getCoords(ctx, x1, y1);
- var dx = p1.x - p0.x;
- var dy = p1.y - p0.y;
- angle = Math.atan2(dx, dy) * 180 / Math.PI;
-
- // The angle should be a non-negative number.
- if (angle < 0) {
- angle += 360;
- }
-
- // Very small angles produce an unexpected result because they are
- // converted to a scientific notation string.
- if (angle < 1e-6) {
- angle = 0;
- }
- } else {
- var p0 = getCoords(ctx, fillStyle.x0_, fillStyle.y0_);
- focus = {
- x: (p0.x - min.x) / width,
- y: (p0.y - min.y) / height
- };
-
- width /= arcScaleX * Z;
- height /= arcScaleY * Z;
- var dimension = m.max(width, height);
- shift = 2 * fillStyle.r0_ / dimension;
- expansion = 2 * fillStyle.r1_ / dimension - shift;
- }
-
- // We need to sort the color stops in ascending order by offset,
- // otherwise IE won't interpret it correctly.
- var stops = fillStyle.colors_;
- stops.sort(function(cs1, cs2) {
- return cs1.offset - cs2.offset;
- });
-
- var length = stops.length;
- var color1 = stops[0].color;
- var color2 = stops[length - 1].color;
- var opacity1 = stops[0].alpha * ctx.globalAlpha;
- var opacity2 = stops[length - 1].alpha * ctx.globalAlpha;
-
- var colors = [];
- for (var i = 0; i < length; i++) {
- var stop = stops[i];
- colors.push(stop.offset * expansion + shift + ' ' + stop.color);
- }
-
- // When colors attribute is used, the meanings of opacity and o:opacity2
- // are reversed.
- lineStr.push(' ');
- } else if (fillStyle instanceof CanvasPattern_) {
- if (width && height) {
- var deltaLeft = -min.x;
- var deltaTop = -min.y;
- lineStr.push(' ');
- }
- } else {
- var a = processStyle(ctx.fillStyle);
- var color = a.color;
- var opacity = a.alpha * ctx.globalAlpha;
- lineStr.push(' ');
- }
- }
-
- contextPrototype.fill = function() {
- this.stroke(true);
- };
-
- contextPrototype.closePath = function() {
- this.currentPath_.push({type: 'close'});
- };
-
- function getCoords(ctx, aX, aY) {
- var m = ctx.m_;
- return {
- x: Z * (aX * m[0][0] + aY * m[1][0] + m[2][0]) - Z2,
- y: Z * (aX * m[0][1] + aY * m[1][1] + m[2][1]) - Z2
- };
- };
-
- contextPrototype.save = function() {
- var o = {};
- copyState(this, o);
- this.aStack_.push(o);
- this.mStack_.push(this.m_);
- this.m_ = matrixMultiply(createMatrixIdentity(), this.m_);
- };
-
- contextPrototype.restore = function() {
- if (this.aStack_.length) {
- copyState(this.aStack_.pop(), this);
- this.m_ = this.mStack_.pop();
- }
- };
-
- function matrixIsFinite(m) {
- return isFinite(m[0][0]) && isFinite(m[0][1]) &&
- isFinite(m[1][0]) && isFinite(m[1][1]) &&
- isFinite(m[2][0]) && isFinite(m[2][1]);
- }
-
- function setM(ctx, m, updateLineScale) {
- if (!matrixIsFinite(m)) {
- return;
- }
- ctx.m_ = m;
-
- if (updateLineScale) {
- // Get the line scale.
- // Determinant of this.m_ means how much the area is enlarged by the
- // transformation. So its square root can be used as a scale factor
- // for width.
- var det = m[0][0] * m[1][1] - m[0][1] * m[1][0];
- ctx.lineScale_ = sqrt(abs(det));
- }
- }
-
- contextPrototype.translate = function(aX, aY) {
- var m1 = [
- [1, 0, 0],
- [0, 1, 0],
- [aX, aY, 1]
- ];
-
- setM(this, matrixMultiply(m1, this.m_), false);
- };
-
- contextPrototype.rotate = function(aRot) {
- var c = mc(aRot);
- var s = ms(aRot);
-
- var m1 = [
- [c, s, 0],
- [-s, c, 0],
- [0, 0, 1]
- ];
-
- setM(this, matrixMultiply(m1, this.m_), false);
- };
-
- contextPrototype.scale = function(aX, aY) {
- this.arcScaleX_ *= aX;
- this.arcScaleY_ *= aY;
- var m1 = [
- [aX, 0, 0],
- [0, aY, 0],
- [0, 0, 1]
- ];
-
- setM(this, matrixMultiply(m1, this.m_), true);
- };
-
- contextPrototype.transform = function(m11, m12, m21, m22, dx, dy) {
- var m1 = [
- [m11, m12, 0],
- [m21, m22, 0],
- [dx, dy, 1]
- ];
-
- setM(this, matrixMultiply(m1, this.m_), true);
- };
-
- contextPrototype.setTransform = function(m11, m12, m21, m22, dx, dy) {
- var m = [
- [m11, m12, 0],
- [m21, m22, 0],
- [dx, dy, 1]
- ];
-
- setM(this, m, true);
- };
-
- /**
- * The text drawing function.
- * The maxWidth argument isn't taken in account, since no browser supports
- * it yet.
- */
- contextPrototype.drawText_ = function(text, x, y, maxWidth, stroke) {
- var m = this.m_,
- delta = 1000,
- left = 0,
- right = delta,
- offset = {x: 0, y: 0},
- lineStr = [];
-
- var fontStyle = getComputedStyle(processFontStyle(this.font),
- this.element_);
-
- var fontStyleString = buildStyle(fontStyle);
-
- var elementStyle = this.element_.currentStyle;
- var textAlign = this.textAlign.toLowerCase();
- switch (textAlign) {
- case 'left':
- case 'center':
- case 'right':
- break;
- case 'end':
- textAlign = elementStyle.direction == 'ltr' ? 'right' : 'left';
- break;
- case 'start':
- textAlign = elementStyle.direction == 'rtl' ? 'right' : 'left';
- break;
- default:
- textAlign = 'left';
- }
-
- // 1.75 is an arbitrary number, as there is no info about the text baseline
- switch (this.textBaseline) {
- case 'hanging':
- case 'top':
- offset.y = fontStyle.size / 1.75;
- break;
- case 'middle':
- break;
- default:
- case null:
- case 'alphabetic':
- case 'ideographic':
- case 'bottom':
- offset.y = -fontStyle.size / 2.25;
- break;
- }
-
- switch(textAlign) {
- case 'right':
- left = delta;
- right = 0.05;
- break;
- case 'center':
- left = right = delta / 2;
- break;
- }
-
- var d = getCoords(this, x + offset.x, y + offset.y);
-
- lineStr.push('');
-
- if (stroke) {
- appendStroke(this, lineStr);
- } else {
- // TODO: Fix the min and max params.
- appendFill(this, lineStr, {x: -left, y: 0},
- {x: right, y: fontStyle.size});
- }
-
- var skewM = m[0][0].toFixed(3) + ',' + m[1][0].toFixed(3) + ',' +
- m[0][1].toFixed(3) + ',' + m[1][1].toFixed(3) + ',0,0';
-
- var skewOffset = mr(d.x / Z) + ',' + mr(d.y / Z);
-
- lineStr.push(' ',
- ' ',
- ' ');
-
- this.element_.insertAdjacentHTML('beforeEnd', lineStr.join(''));
- };
-
- contextPrototype.fillText = function(text, x, y, maxWidth) {
- this.drawText_(text, x, y, maxWidth, false);
- };
-
- contextPrototype.strokeText = function(text, x, y, maxWidth) {
- this.drawText_(text, x, y, maxWidth, true);
- };
-
- contextPrototype.measureText = function(text) {
- if (!this.textMeasureEl_) {
- var s = ' ';
- this.element_.insertAdjacentHTML('beforeEnd', s);
- this.textMeasureEl_ = this.element_.lastChild;
- }
- var doc = this.element_.ownerDocument;
- this.textMeasureEl_.innerHTML = '';
- this.textMeasureEl_.style.font = this.font;
- // Don't use innerHTML or innerText because they allow markup/whitespace.
- this.textMeasureEl_.appendChild(doc.createTextNode(text));
- return {width: this.textMeasureEl_.offsetWidth};
- };
-
- /******** STUBS ********/
- contextPrototype.clip = function() {
- // TODO: Implement
- };
-
- contextPrototype.arcTo = function() {
- // TODO: Implement
- };
-
- contextPrototype.createPattern = function(image, repetition) {
- return new CanvasPattern_(image, repetition);
- };
-
- // Gradient / Pattern Stubs
- function CanvasGradient_(aType) {
- this.type_ = aType;
- this.x0_ = 0;
- this.y0_ = 0;
- this.r0_ = 0;
- this.x1_ = 0;
- this.y1_ = 0;
- this.r1_ = 0;
- this.colors_ = [];
- }
-
- CanvasGradient_.prototype.addColorStop = function(aOffset, aColor) {
- aColor = processStyle(aColor);
- this.colors_.push({offset: aOffset,
- color: aColor.color,
- alpha: aColor.alpha});
- };
-
- function CanvasPattern_(image, repetition) {
- assertImageIsValid(image);
- switch (repetition) {
- case 'repeat':
- case null:
- case '':
- this.repetition_ = 'repeat';
- break
- case 'repeat-x':
- case 'repeat-y':
- case 'no-repeat':
- this.repetition_ = repetition;
- break;
- default:
- throwException('SYNTAX_ERR');
- }
-
- this.src_ = image.src;
- this.width_ = image.width;
- this.height_ = image.height;
- }
-
- function throwException(s) {
- throw new DOMException_(s);
- }
-
- function assertImageIsValid(img) {
- if (!img || img.nodeType != 1 || img.tagName != 'IMG') {
- throwException('TYPE_MISMATCH_ERR');
- }
- if (img.readyState != 'complete') {
- throwException('INVALID_STATE_ERR');
- }
- }
-
- function DOMException_(s) {
- this.code = this[s];
- this.message = s +': DOM Exception ' + this.code;
- }
- var p = DOMException_.prototype = new Error;
- p.INDEX_SIZE_ERR = 1;
- p.DOMSTRING_SIZE_ERR = 2;
- p.HIERARCHY_REQUEST_ERR = 3;
- p.WRONG_DOCUMENT_ERR = 4;
- p.INVALID_CHARACTER_ERR = 5;
- p.NO_DATA_ALLOWED_ERR = 6;
- p.NO_MODIFICATION_ALLOWED_ERR = 7;
- p.NOT_FOUND_ERR = 8;
- p.NOT_SUPPORTED_ERR = 9;
- p.INUSE_ATTRIBUTE_ERR = 10;
- p.INVALID_STATE_ERR = 11;
- p.SYNTAX_ERR = 12;
- p.INVALID_MODIFICATION_ERR = 13;
- p.NAMESPACE_ERR = 14;
- p.INVALID_ACCESS_ERR = 15;
- p.VALIDATION_ERR = 16;
- p.TYPE_MISMATCH_ERR = 17;
-
- // set up externs
- G_vmlCanvasManager = G_vmlCanvasManager_;
- CanvasRenderingContext2D = CanvasRenderingContext2D_;
- CanvasGradient = CanvasGradient_;
- CanvasPattern = CanvasPattern_;
- DOMException = DOMException_;
-})();
-
-} // if
diff --git a/addons/web_graph/static/lib/flotr2/lib/imagediff.js b/addons/web_graph/static/lib/flotr2/lib/imagediff.js
deleted file mode 100644
index ac1d2745018..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/imagediff.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/*! imagediff.js 1.0.2
- * (c) 2011 Carl Sutherland, Humble Software Development
- * imagediff.js is freely distributable under the MIT license.
- * Thanks to Jacob Thornton for the node/amd integration bits.
- * For details and documentation:
- * https://github.com/HumbleSoftware/js-imagediff
- */
-(function (name, definition) {
- var root = this;
- if (typeof module != 'undefined') {
- module.exports = definition();
- } else if (typeof define == 'function' && typeof define.amd == 'object') {
- define(definition);
- } else {
- root[name] = definition(root, name);
- }
-})('imagediff', function (root, name) {
-
- var
- TYPE_ARRAY = '[object Array]',
- TYPE_CANVAS = '[object HTMLCanvasElement]',
- TYPE_CONTEXT = '[object CanvasRenderingContext2D]',
- TYPE_IMAGE = '[object HTMLImageElement]',
-
- OBJECT = 'object',
- UNDEFINED = 'undefined',
-
- canvas = getCanvas(),
- context = canvas.getContext('2d'),
- previous = root[name],
- imagediff, jasmine;
-
- // Creation
- function getCanvas (width, height) {
- var
- canvas = document.createElement('canvas');
- if (width) canvas.width = width;
- if (height) canvas.height = height;
- return canvas;
- }
- function getImageData (width, height) {
- canvas.width = width;
- canvas.height = height;
- context.clearRect(0, 0, width, height);
- return context.createImageData(width, height);
- }
-
-
- // Type Checking
- function isImage (object) {
- return isType(object, TYPE_IMAGE);
- }
- function isCanvas (object) {
- return isType(object, TYPE_CANVAS);
- }
- function isContext (object) {
- return isType(object, TYPE_CONTEXT);
- }
- function isImageData (object) {
- var
- imageData = getImageData(1, 1);
- isImageData = function (object) {
- return (object && imageData.constructor === object.constructor ? true : false);
- };
- return isImageData(object);
- }
- function isImageType (object) {
- return (
- isImage(object) ||
- isCanvas(object) ||
- isContext(object) ||
- isImageData(object)
- );
- }
- function isType (object, type) {
- return typeof (object) === 'object' && Object.prototype.toString.apply(object) === type;
- }
-
-
- // Type Conversion
- function copyImageData (imageData) {
- var
- height = imageData.height,
- width = imageData.width;
- canvas.width = width;
- canvas.height = height;
- context.putImageData(imageData, 0, 0);
- return context.getImageData(0, 0, width, height);
- }
- function toImageData (object) {
- if (isImage(object)) { return toImageDataFromImage(object); }
- if (isCanvas(object)) { return toImageDataFromCanvas(object); }
- if (isContext(object)) { return toImageDataFromContext(object); }
- if (isImageData(object)) { return object; }
- }
- function toImageDataFromImage (image) {
- var
- height = image.height,
- width = image.width;
- canvas.width = width;
- canvas.height = height;
- context.clearRect(0, 0, width, height);
- context.drawImage(image, 0, 0);
- return context.getImageData(0, 0, width, height);
- }
- function toImageDataFromCanvas (canvas) {
- var
- height = canvas.height,
- width = canvas.width,
- context = canvas.getContext('2d');
- return context.getImageData(0, 0, width, height);
- }
- function toImageDataFromContext (context) {
- var
- canvas = context.canvas,
- height = canvas.height,
- width = canvas.width;
- return context.getImageData(0, 0, width, height);
- }
- function toCanvas (object) {
- var
- data = toImageData(object),
- canvas = getCanvas(data.width, data.height),
- context = canvas.getContext('2d');
-
- context.putImageData(data, 0, 0);
- return canvas;
- }
-
-
- // ImageData Equality Operators
- function equalWidth (a, b) {
- return a.width === b.width;
- }
- function equalHeight (a, b) {
- return a.height === b.height;
- }
- function equalDimensions (a, b) {
- return equalHeight(a, b) && equalWidth(a, b);
- }
- function equal (a, b, tolerance) {
-
- var
- aData = a.data,
- bData = b.data,
- length = aData.length,
- tolerance = tolerance || 0,
- i;
-
- if (!equalDimensions(a, b)) return false;
- for (i = length; i--;) if (aData[i] !== bData[i] && Math.abs(aData[i] - bData[i]) > tolerance) return false;
-
- return true;
- }
-
-
- // Diff
- function diff (a, b) {
- return (equalDimensions(a, b) ? diffEqual : diffUnequal)(a, b);
- }
- function diffEqual (a, b) {
-
- var
- height = a.height,
- width = a.width,
- c = getImageData(width, height), // c = a - b
- aData = a.data,
- bData = b.data,
- cData = c.data,
- length = cData.length,
- row, column,
- i, j, k, v;
-
- for (i = 0; i < length; i += 4) {
- cData[i] = Math.abs(aData[i] - bData[i]);
- cData[i+1] = Math.abs(aData[i+1] - bData[i+1]);
- cData[i+2] = Math.abs(aData[i+2] - bData[i+2]);
- cData[i+3] = Math.abs(255 - aData[i+3] - bData[i+3]);
- }
-
- return c;
- }
- function diffUnequal (a, b) {
-
- var
- height = Math.max(a.height, b.height),
- width = Math.max(a.width, b.width),
- c = getImageData(width, height), // c = a - b
- aData = a.data,
- bData = b.data,
- cData = c.data,
- rowOffset,
- columnOffset,
- row, column,
- i, j, k, v;
-
-
- for (i = cData.length - 1; i > 0; i = i - 4) {
- cData[i] = 255;
- }
-
- // Add First Image
- offsets(a);
- for (row = a.height; row--;){
- for (column = a.width; column--;) {
- i = 4 * ((row + rowOffset) * width + (column + columnOffset));
- j = 4 * (row * a.width + column);
- cData[i+0] = aData[j+0]; // r
- cData[i+1] = aData[j+1]; // g
- cData[i+2] = aData[j+2]; // b
- // cData[i+3] = aData[j+3]; // a
- }
- }
-
- // Subtract Second Image
- offsets(b);
- for (row = b.height; row--;){
- for (column = b.width; column--;) {
- i = 4 * ((row + rowOffset) * width + (column + columnOffset));
- j = 4 * (row * b.width + column);
- cData[i+0] = Math.abs(cData[i+0] - bData[j+0]); // r
- cData[i+1] = Math.abs(cData[i+1] - bData[j+1]); // g
- cData[i+2] = Math.abs(cData[i+2] - bData[j+2]); // b
- }
- }
-
- // Helpers
- function offsets (imageData) {
- rowOffset = Math.floor((height - imageData.height) / 2);
- columnOffset = Math.floor((width - imageData.width) / 2);
- }
-
- return c;
- }
-
-
- // Validation
- function checkType () {
- var i;
- for (i = 0; i < arguments.length; i++) {
- if (!isImageType(arguments[i])) {
- throw {
- name : 'ImageTypeError',
- message : 'Submitted object was not an image.'
- };
- }
- }
- }
-
-
- // Jasmine Matchers
- function get (element, content) {
- element = document.createElement(element);
- if (element && content) {
- element.innerHTML = content;
- }
- return element;
- }
- jasmine = {
-
- toBeImageData : function () {
- return imagediff.isImageData(this.actual);
- },
-
- toImageDiffEqual : function (expected, tolerance) {
-
- this.message = function() {
-
- var
- div = get('div'),
- a = get('div', 'Actual:
'),
- b = get('div', 'Expected:
'),
- c = get('div', 'Diff:
'),
- diff = imagediff.diff(this.actual, expected),
- canvas = getCanvas(),
- context;
-
- canvas.height = diff.height;
- canvas.width = diff.width;
-
- context = canvas.getContext('2d');
- context.putImageData(diff, 0, 0);
-
- a.appendChild(toCanvas(this.actual));
- b.appendChild(toCanvas(expected));
- c.appendChild(canvas);
-
- div.appendChild(a);
- div.appendChild(b);
- div.appendChild(c);
-
- return [
- div,
- "Expected not to be equal."
- ];
- };
-
- return imagediff.equal(this.actual, expected, tolerance);
- }
- };
-
- // Definition
- imagediff = {
-
- createCanvas : getCanvas,
- createImageData : getImageData,
-
- isImage : isImage,
- isCanvas : isCanvas,
- isContext : isContext,
- isImageData : isImageData,
- isImageType : isImageType,
-
- toImageData : function (object) {
- checkType(object);
- if (isImageData(object)) { return copyImageData(object); }
- return toImageData(object);
- },
-
- equal : function (a, b, tolerance) {
- checkType(a, b);
- a = toImageData(a);
- b = toImageData(b);
- return equal(a, b, tolerance);
- },
- diff : function (a, b) {
- checkType(a, b);
- a = toImageData(a);
- b = toImageData(b);
- return diff(a, b);
- },
-
- jasmine : jasmine,
-
- // Compatibility
- noConflict : function () {
- root[name] = previous;
- return imagediff;
- }
- };
-
- return imagediff;
-});
diff --git a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine-html.js b/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine-html.js
deleted file mode 100644
index 73834010f60..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine-html.js
+++ /dev/null
@@ -1,190 +0,0 @@
-jasmine.TrivialReporter = function(doc) {
- this.document = doc || document;
- this.suiteDivs = {};
- this.logRunningSpecs = false;
-};
-
-jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
- var el = document.createElement(type);
-
- for (var i = 2; i < arguments.length; i++) {
- var child = arguments[i];
-
- if (typeof child === 'string') {
- el.appendChild(document.createTextNode(child));
- } else {
- if (child) { el.appendChild(child); }
- }
- }
-
- for (var attr in attrs) {
- if (attr == "className") {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr]);
- }
- }
-
- return el;
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
- var showPassed, showSkipped;
-
- this.outerDiv = this.createDom('div', { className: 'jasmine_reporter' },
- this.createDom('div', { className: 'banner' },
- this.createDom('div', { className: 'logo' },
- this.createDom('span', { className: 'title' }, "Jasmine"),
- this.createDom('span', { className: 'version' }, runner.env.versionString())),
- this.createDom('div', { className: 'options' },
- "Show ",
- showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
- showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
- this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
- )
- ),
-
- this.runnerDiv = this.createDom('div', { className: 'runner running' },
- this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
- this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
- this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
- );
-
- this.document.body.appendChild(this.outerDiv);
-
- var suites = runner.suites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- var suiteDiv = this.createDom('div', { className: 'suite' },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
- this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
- this.suiteDivs[suite.id] = suiteDiv;
- var parentDiv = this.outerDiv;
- if (suite.parentSuite) {
- parentDiv = this.suiteDivs[suite.parentSuite.id];
- }
- parentDiv.appendChild(suiteDiv);
- }
-
- this.startedAt = new Date();
-
- var self = this;
- showPassed.onclick = function(evt) {
- if (showPassed.checked) {
- self.outerDiv.className += ' show-passed';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
- }
- };
-
- showSkipped.onclick = function(evt) {
- if (showSkipped.checked) {
- self.outerDiv.className += ' show-skipped';
- } else {
- self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
- }
- };
-};
-
-jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
- var results = runner.results();
- var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
- this.runnerDiv.setAttribute("class", className);
- //do it twice for IE
- this.runnerDiv.setAttribute("className", className);
- var specs = runner.specs();
- var specCount = 0;
- for (var i = 0; i < specs.length; i++) {
- if (this.specFilter(specs[i])) {
- specCount++;
- }
- }
- var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
- message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
- this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
-
- this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
-};
-
-jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
- var results = suite.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.totalCount === 0) { // todo: change this to check results.skipped
- status = 'skipped';
- }
- this.suiteDivs[suite.id].className += " " + status;
-};
-
-jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
- if (this.logRunningSpecs) {
- this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
- }
-};
-
-jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
- var results = spec.results();
- var status = results.passed() ? 'passed' : 'failed';
- if (results.skipped) {
- status = 'skipped';
- }
- var specDiv = this.createDom('div', { className: 'spec ' + status },
- this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
- this.createDom('a', {
- className: 'description',
- href: '?spec=' + encodeURIComponent(spec.getFullName()),
- title: spec.getFullName()
- }, spec.description));
-
-
- var resultItems = results.getItems();
- var messagesDiv = this.createDom('div', { className: 'messages' });
- for (var i = 0; i < resultItems.length; i++) {
- var result = resultItems[i];
-
- if (result.type == 'log') {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
- } else if (result.type == 'expect' && result.passed && !result.passed()) {
- messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
-
- if (result.trace.stack) {
- messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
- }
- }
- }
-
- if (messagesDiv.childNodes.length > 0) {
- specDiv.appendChild(messagesDiv);
- }
-
- this.suiteDivs[spec.suite.id].appendChild(specDiv);
-};
-
-jasmine.TrivialReporter.prototype.log = function() {
- var console = jasmine.getGlobal().console;
- if (console && console.log) {
- if (console.log.apply) {
- console.log.apply(console, arguments);
- } else {
- console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
- }
- }
-};
-
-jasmine.TrivialReporter.prototype.getLocation = function() {
- return this.document.location;
-};
-
-jasmine.TrivialReporter.prototype.specFilter = function(spec) {
- var paramMap = {};
- var params = this.getLocation().search.substring(1).split('&');
- for (var i = 0; i < params.length; i++) {
- var p = params[i].split('=');
- paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
- }
-
- if (!paramMap.spec) {
- return true;
- }
- return spec.getFullName().indexOf(paramMap.spec) === 0;
-};
diff --git a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.css b/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.css
deleted file mode 100644
index 6583fe7c66d..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.css
+++ /dev/null
@@ -1,166 +0,0 @@
-body {
- font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif;
-}
-
-
-.jasmine_reporter a:visited, .jasmine_reporter a {
- color: #303;
-}
-
-.jasmine_reporter a:hover, .jasmine_reporter a:active {
- color: blue;
-}
-
-.run_spec {
- float:right;
- padding-right: 5px;
- font-size: .8em;
- text-decoration: none;
-}
-
-.jasmine_reporter {
- margin: 0 5px;
-}
-
-.banner {
- color: #303;
- background-color: #fef;
- padding: 5px;
-}
-
-.logo {
- float: left;
- font-size: 1.1em;
- padding-left: 5px;
-}
-
-.logo .version {
- font-size: .6em;
- padding-left: 1em;
-}
-
-.runner.running {
- background-color: yellow;
-}
-
-
-.options {
- text-align: right;
- font-size: .8em;
-}
-
-
-
-
-.suite {
- border: 1px outset gray;
- margin: 5px 0;
- padding-left: 1em;
-}
-
-.suite .suite {
- margin: 5px;
-}
-
-.suite.passed {
- background-color: #dfd;
-}
-
-.suite.failed {
- background-color: #fdd;
-}
-
-.spec {
- margin: 5px;
- padding-left: 1em;
- clear: both;
-}
-
-.spec.failed, .spec.passed, .spec.skipped {
- padding-bottom: 5px;
- border: 1px solid gray;
-}
-
-.spec.failed {
- background-color: #fbb;
- border-color: red;
-}
-
-.spec.passed {
- background-color: #bfb;
- border-color: green;
-}
-
-.spec.skipped {
- background-color: #bbb;
-}
-
-.messages {
- border-left: 1px dashed gray;
- padding-left: 1em;
- padding-right: 1em;
-}
-
-.passed {
- background-color: #cfc;
- display: none;
-}
-
-.failed {
- background-color: #fbb;
-}
-
-.skipped {
- color: #777;
- background-color: #eee;
- display: none;
-}
-
-
-/*.resultMessage {*/
- /*white-space: pre;*/
-/*}*/
-
-.resultMessage span.result {
- display: block;
- line-height: 2em;
- color: black;
-}
-
-.resultMessage .mismatch {
- color: black;
-}
-
-.stackTrace {
- white-space: pre;
- font-size: .8em;
- margin-left: 10px;
- max-height: 5em;
- overflow: auto;
- border: 1px inset red;
- padding: 1em;
- background: #eef;
-}
-
-.finished-at {
- padding-left: 1em;
- font-size: .6em;
-}
-
-.show-passed .passed,
-.show-skipped .skipped {
- display: block;
-}
-
-
-#jasmine_content {
- position:fixed;
- right: 100%;
-}
-
-.runner {
- border: 1px solid gray;
- display: block;
- margin: 5px 0;
- padding: 2px 0 2px 10px;
-}
diff --git a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.js b/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.js
deleted file mode 100644
index c3d2dc7d2d3..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine.js
+++ /dev/null
@@ -1,2476 +0,0 @@
-var isCommonJS = typeof window == "undefined";
-
-/**
- * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
- *
- * @namespace
- */
-var jasmine = {};
-if (isCommonJS) exports.jasmine = jasmine;
-/**
- * @private
- */
-jasmine.unimplementedMethod_ = function() {
- throw new Error("unimplemented method");
-};
-
-/**
- * Use jasmine.undefined
instead of undefined
, since undefined
is just
- * a plain old variable and may be redefined by somebody else.
- *
- * @private
- */
-jasmine.undefined = jasmine.___undefined___;
-
-/**
- * Show diagnostic messages in the console if set to true
- *
- */
-jasmine.VERBOSE = false;
-
-/**
- * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed.
- *
- */
-jasmine.DEFAULT_UPDATE_INTERVAL = 250;
-
-/**
- * Default timeout interval in milliseconds for waitsFor() blocks.
- */
-jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000;
-
-jasmine.getGlobal = function() {
- function getGlobal() {
- return this;
- }
-
- return getGlobal();
-};
-
-/**
- * Allows for bound functions to be compared. Internal use only.
- *
- * @ignore
- * @private
- * @param base {Object} bound 'this' for the function
- * @param name {Function} function to find
- */
-jasmine.bindOriginal_ = function(base, name) {
- var original = base[name];
- if (original.apply) {
- return function() {
- return original.apply(base, arguments);
- };
- } else {
- // IE support
- return jasmine.getGlobal()[name];
- }
-};
-
-jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout');
-jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout');
-jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval');
-jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval');
-
-jasmine.MessageResult = function(values) {
- this.type = 'log';
- this.values = values;
- this.trace = new Error(); // todo: test better
-};
-
-jasmine.MessageResult.prototype.toString = function() {
- var text = "";
- for (var i = 0; i < this.values.length; i++) {
- if (i > 0) text += " ";
- if (jasmine.isString_(this.values[i])) {
- text += this.values[i];
- } else {
- text += jasmine.pp(this.values[i]);
- }
- }
- return text;
-};
-
-jasmine.ExpectationResult = function(params) {
- this.type = 'expect';
- this.matcherName = params.matcherName;
- this.passed_ = params.passed;
- this.expected = params.expected;
- this.actual = params.actual;
- this.message = this.passed_ ? 'Passed.' : params.message;
-
- var trace = (params.trace || new Error(this.message));
- this.trace = this.passed_ ? '' : trace;
-};
-
-jasmine.ExpectationResult.prototype.toString = function () {
- return this.message;
-};
-
-jasmine.ExpectationResult.prototype.passed = function () {
- return this.passed_;
-};
-
-/**
- * Getter for the Jasmine environment. Ensures one gets created
- */
-jasmine.getEnv = function() {
- var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env();
- return env;
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isArray_ = function(value) {
- return jasmine.isA_("Array", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isString_ = function(value) {
- return jasmine.isA_("String", value);
-};
-
-/**
- * @ignore
- * @private
- * @param value
- * @returns {Boolean}
- */
-jasmine.isNumber_ = function(value) {
- return jasmine.isA_("Number", value);
-};
-
-/**
- * @ignore
- * @private
- * @param {String} typeName
- * @param value
- * @returns {Boolean}
- */
-jasmine.isA_ = function(typeName, value) {
- return Object.prototype.toString.apply(value) === '[object ' + typeName + ']';
-};
-
-/**
- * Pretty printer for expecations. Takes any object and turns it into a human-readable string.
- *
- * @param value {Object} an object to be outputted
- * @returns {String}
- */
-jasmine.pp = function(value) {
- var stringPrettyPrinter = new jasmine.StringPrettyPrinter();
- stringPrettyPrinter.format(value);
- return stringPrettyPrinter.string;
-};
-
-/**
- * Returns true if the object is a DOM Node.
- *
- * @param {Object} obj object to check
- * @returns {Boolean}
- */
-jasmine.isDomNode = function(obj) {
- return obj.nodeType > 0;
-};
-
-/**
- * Returns a matchable 'generic' object of the class type. For use in expecations of type when values don't matter.
- *
- * @example
- * // don't care about which function is passed in, as long as it's a function
- * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function));
- *
- * @param {Class} clazz
- * @returns matchable object of the type clazz
- */
-jasmine.any = function(clazz) {
- return new jasmine.Matchers.Any(clazz);
-};
-
-/**
- * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks.
- *
- * Spies should be created in test setup, before expectations. They can then be checked, using the standard Jasmine
- * expectation syntax. Spies can be checked if they were called or not and what the calling params were.
- *
- * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs).
- *
- * Spies are torn down at the end of every spec.
- *
- * Note: Do not call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj.
- *
- * @example
- * // a stub
- * var myStub = jasmine.createSpy('myStub'); // can be used anywhere
- *
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // actual foo.not will not be called, execution stops
- * spyOn(foo, 'not');
-
- // foo.not spied upon, execution will continue to implementation
- * spyOn(foo, 'not').andCallThrough();
- *
- * // fake example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- *
- * // foo.not(val) will return val
- * spyOn(foo, 'not').andCallFake(function(value) {return value;});
- *
- * // mock example
- * foo.not(7 == 7);
- * expect(foo.not).toHaveBeenCalled();
- * expect(foo.not).toHaveBeenCalledWith(true);
- *
- * @constructor
- * @see spyOn, jasmine.createSpy, jasmine.createSpyObj
- * @param {String} name
- */
-jasmine.Spy = function(name) {
- /**
- * The name of the spy, if provided.
- */
- this.identity = name || 'unknown';
- /**
- * Is this Object a spy?
- */
- this.isSpy = true;
- /**
- * The actual function this spy stubs.
- */
- this.plan = function() {
- };
- /**
- * Tracking of the most recent call to the spy.
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy.mostRecentCall.args = [1, 2];
- */
- this.mostRecentCall = {};
-
- /**
- * Holds arguments for each call to the spy, indexed by call count
- * @example
- * var mySpy = jasmine.createSpy('foo');
- * mySpy(1, 2);
- * mySpy(7, 8);
- * mySpy.mostRecentCall.args = [7, 8];
- * mySpy.argsForCall[0] = [1, 2];
- * mySpy.argsForCall[1] = [7, 8];
- */
- this.argsForCall = [];
- this.calls = [];
-};
-
-/**
- * Tells a spy to call through to the actual implemenatation.
- *
- * @example
- * var foo = {
- * bar: function() { // do some stuff }
- * }
- *
- * // defining a spy on an existing property: foo.bar
- * spyOn(foo, 'bar').andCallThrough();
- */
-jasmine.Spy.prototype.andCallThrough = function() {
- this.plan = this.originalValue;
- return this;
-};
-
-/**
- * For setting the return value of a spy.
- *
- * @example
- * // defining a spy from scratch: foo() returns 'baz'
- * var foo = jasmine.createSpy('spy on foo').andReturn('baz');
- *
- * // defining a spy on an existing property: foo.bar() returns 'baz'
- * spyOn(foo, 'bar').andReturn('baz');
- *
- * @param {Object} value
- */
-jasmine.Spy.prototype.andReturn = function(value) {
- this.plan = function() {
- return value;
- };
- return this;
-};
-
-/**
- * For throwing an exception when a spy is called.
- *
- * @example
- * // defining a spy from scratch: foo() throws an exception w/ message 'ouch'
- * var foo = jasmine.createSpy('spy on foo').andThrow('baz');
- *
- * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch'
- * spyOn(foo, 'bar').andThrow('baz');
- *
- * @param {String} exceptionMsg
- */
-jasmine.Spy.prototype.andThrow = function(exceptionMsg) {
- this.plan = function() {
- throw exceptionMsg;
- };
- return this;
-};
-
-/**
- * Calls an alternate implementation when a spy is called.
- *
- * @example
- * var baz = function() {
- * // do some stuff, return something
- * }
- * // defining a spy from scratch: foo() calls the function baz
- * var foo = jasmine.createSpy('spy on foo').andCall(baz);
- *
- * // defining a spy on an existing property: foo.bar() calls an anonymnous function
- * spyOn(foo, 'bar').andCall(function() { return 'baz';} );
- *
- * @param {Function} fakeFunc
- */
-jasmine.Spy.prototype.andCallFake = function(fakeFunc) {
- this.plan = fakeFunc;
- return this;
-};
-
-/**
- * Resets all of a spy's the tracking variables so that it can be used again.
- *
- * @example
- * spyOn(foo, 'bar');
- *
- * foo.bar();
- *
- * expect(foo.bar.callCount).toEqual(1);
- *
- * foo.bar.reset();
- *
- * expect(foo.bar.callCount).toEqual(0);
- */
-jasmine.Spy.prototype.reset = function() {
- this.wasCalled = false;
- this.callCount = 0;
- this.argsForCall = [];
- this.calls = [];
- this.mostRecentCall = {};
-};
-
-jasmine.createSpy = function(name) {
-
- var spyObj = function() {
- spyObj.wasCalled = true;
- spyObj.callCount++;
- var args = jasmine.util.argsToArray(arguments);
- spyObj.mostRecentCall.object = this;
- spyObj.mostRecentCall.args = args;
- spyObj.argsForCall.push(args);
- spyObj.calls.push({object: this, args: args});
- return spyObj.plan.apply(this, arguments);
- };
-
- var spy = new jasmine.Spy(name);
-
- for (var prop in spy) {
- spyObj[prop] = spy[prop];
- }
-
- spyObj.reset();
-
- return spyObj;
-};
-
-/**
- * Determines whether an object is a spy.
- *
- * @param {jasmine.Spy|Object} putativeSpy
- * @returns {Boolean}
- */
-jasmine.isSpy = function(putativeSpy) {
- return putativeSpy && putativeSpy.isSpy;
-};
-
-/**
- * Creates a more complicated spy: an Object that has every property a function that is a spy. Used for stubbing something
- * large in one call.
- *
- * @param {String} baseName name of spy class
- * @param {Array} methodNames array of names of methods to make spies
- */
-jasmine.createSpyObj = function(baseName, methodNames) {
- if (!jasmine.isArray_(methodNames) || methodNames.length === 0) {
- throw new Error('createSpyObj requires a non-empty array of method names to create spies for');
- }
- var obj = {};
- for (var i = 0; i < methodNames.length; i++) {
- obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]);
- }
- return obj;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the current spec's output.
- *
- * Be careful not to leave calls to jasmine.log
in production code.
- */
-jasmine.log = function() {
- var spec = jasmine.getEnv().currentSpec;
- spec.log.apply(spec, arguments);
-};
-
-/**
- * Function that installs a spy on an existing object's method name. Used within a Spec to create a spy.
- *
- * @example
- * // spy example
- * var foo = {
- * not: function(bool) { return !bool; }
- * }
- * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops
- *
- * @see jasmine.createSpy
- * @param obj
- * @param methodName
- * @returns a Jasmine spy that can be chained with all spy methods
- */
-var spyOn = function(obj, methodName) {
- return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
-};
-if (isCommonJS) exports.spyOn = spyOn;
-
-/**
- * Creates a Jasmine spec that will be added to the current suite.
- *
- * // TODO: pending tests
- *
- * @example
- * it('should be true', function() {
- * expect(true).toEqual(true);
- * });
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var it = function(desc, func) {
- return jasmine.getEnv().it(desc, func);
-};
-if (isCommonJS) exports.it = it;
-
-/**
- * Creates a disabled Jasmine spec.
- *
- * A convenience method that allows existing specs to be disabled temporarily during development.
- *
- * @param {String} desc description of this specification
- * @param {Function} func defines the preconditions and expectations of the spec
- */
-var xit = function(desc, func) {
- return jasmine.getEnv().xit(desc, func);
-};
-if (isCommonJS) exports.xit = xit;
-
-/**
- * Starts a chain for a Jasmine expectation.
- *
- * It is passed an Object that is the actual value and should chain to one of the many
- * jasmine.Matchers functions.
- *
- * @param {Object} actual Actual value to test against and expected value
- */
-var expect = function(actual) {
- return jasmine.getEnv().currentSpec.expect(actual);
-};
-if (isCommonJS) exports.expect = expect;
-
-/**
- * Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
- *
- * @param {Function} func Function that defines part of a jasmine spec.
- */
-var runs = function(func) {
- jasmine.getEnv().currentSpec.runs(func);
-};
-if (isCommonJS) exports.runs = runs;
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-var waits = function(timeout) {
- jasmine.getEnv().currentSpec.waits(timeout);
-};
-if (isCommonJS) exports.waits = waits;
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
-};
-if (isCommonJS) exports.waitsFor = waitsFor;
-
-/**
- * A function that is called before each spec in a suite.
- *
- * Used for spec setup, including validating assumptions.
- *
- * @param {Function} beforeEachFunction
- */
-var beforeEach = function(beforeEachFunction) {
- jasmine.getEnv().beforeEach(beforeEachFunction);
-};
-if (isCommonJS) exports.beforeEach = beforeEach;
-
-/**
- * A function that is called after each spec in a suite.
- *
- * Used for restoring any state that is hijacked during spec execution.
- *
- * @param {Function} afterEachFunction
- */
-var afterEach = function(afterEachFunction) {
- jasmine.getEnv().afterEach(afterEachFunction);
-};
-if (isCommonJS) exports.afterEach = afterEach;
-
-/**
- * Defines a suite of specifications.
- *
- * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared
- * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization
- * of setup in some tests.
- *
- * @example
- * // TODO: a simple suite
- *
- * // TODO: a simple suite with a nested describe block
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var describe = function(description, specDefinitions) {
- return jasmine.getEnv().describe(description, specDefinitions);
-};
-if (isCommonJS) exports.describe = describe;
-
-/**
- * Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
- *
- * @param {String} description A string, usually the class under test.
- * @param {Function} specDefinitions function that defines several specs.
- */
-var xdescribe = function(description, specDefinitions) {
- return jasmine.getEnv().xdescribe(description, specDefinitions);
-};
-if (isCommonJS) exports.xdescribe = xdescribe;
-
-
-// Provide the XMLHttpRequest class for IE 5.x-6.x:
-jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
- function tryIt(f) {
- try {
- return f();
- } catch(e) {
- }
- return null;
- }
-
- var xhr = tryIt(function() {
- return new ActiveXObject("Msxml2.XMLHTTP.6.0");
- }) ||
- tryIt(function() {
- return new ActiveXObject("Msxml2.XMLHTTP.3.0");
- }) ||
- tryIt(function() {
- return new ActiveXObject("Msxml2.XMLHTTP");
- }) ||
- tryIt(function() {
- return new ActiveXObject("Microsoft.XMLHTTP");
- });
-
- if (!xhr) throw new Error("This browser does not support XMLHttpRequest.");
-
- return xhr;
-} : XMLHttpRequest;
-/**
- * @namespace
- */
-jasmine.util = {};
-
-/**
- * Declare that a child class inherit it's prototype from the parent class.
- *
- * @private
- * @param {Function} childClass
- * @param {Function} parentClass
- */
-jasmine.util.inherit = function(childClass, parentClass) {
- /**
- * @private
- */
- var subclass = function() {
- };
- subclass.prototype = parentClass.prototype;
- childClass.prototype = new subclass();
-};
-
-jasmine.util.formatException = function(e) {
- var lineNumber;
- if (e.line) {
- lineNumber = e.line;
- }
- else if (e.lineNumber) {
- lineNumber = e.lineNumber;
- }
-
- var file;
-
- if (e.sourceURL) {
- file = e.sourceURL;
- }
- else if (e.fileName) {
- file = e.fileName;
- }
-
- var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString();
-
- if (file && lineNumber) {
- message += ' in ' + file + ' (line ' + lineNumber + ')';
- }
-
- return message;
-};
-
-jasmine.util.htmlEscape = function(str) {
- if (!str) return str;
- return str.replace(/&/g, '&')
- .replace(//g, '>');
-};
-
-jasmine.util.argsToArray = function(args) {
- var arrayOfArgs = [];
- for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]);
- return arrayOfArgs;
-};
-
-jasmine.util.extend = function(destination, source) {
- for (var property in source) destination[property] = source[property];
- return destination;
-};
-
-/**
- * Environment for Jasmine
- *
- * @constructor
- */
-jasmine.Env = function() {
- this.currentSpec = null;
- this.currentSuite = null;
- this.currentRunner_ = new jasmine.Runner(this);
-
- this.reporter = new jasmine.MultiReporter();
-
- this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL;
- this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL;
- this.lastUpdate = 0;
- this.specFilter = function() {
- return true;
- };
-
- this.nextSpecId_ = 0;
- this.nextSuiteId_ = 0;
- this.equalityTesters_ = [];
-
- // wrap matchers
- this.matchersClass = function() {
- jasmine.Matchers.apply(this, arguments);
- };
- jasmine.util.inherit(this.matchersClass, jasmine.Matchers);
-
- jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass);
-};
-
-
-jasmine.Env.prototype.setTimeout = jasmine.setTimeout;
-jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout;
-jasmine.Env.prototype.setInterval = jasmine.setInterval;
-jasmine.Env.prototype.clearInterval = jasmine.clearInterval;
-
-/**
- * @returns an object containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.version = function () {
- if (jasmine.version_) {
- return jasmine.version_;
- } else {
- throw new Error('Version not set');
- }
-};
-
-/**
- * @returns string containing jasmine version build info, if set.
- */
-jasmine.Env.prototype.versionString = function() {
- if (!jasmine.version_) {
- return "version unknown";
- }
-
- var version = this.version();
- var versionString = version.major + "." + version.minor + "." + version.build;
- if (version.release_candidate) {
- versionString += ".rc" + version.release_candidate;
- }
- versionString += " revision " + version.revision;
- return versionString;
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSpecId = function () {
- return this.nextSpecId_++;
-};
-
-/**
- * @returns a sequential integer starting at 0
- */
-jasmine.Env.prototype.nextSuiteId = function () {
- return this.nextSuiteId_++;
-};
-
-/**
- * Register a reporter to receive status updates from Jasmine.
- * @param {jasmine.Reporter} reporter An object which will receive status updates.
- */
-jasmine.Env.prototype.addReporter = function(reporter) {
- this.reporter.addReporter(reporter);
-};
-
-jasmine.Env.prototype.execute = function() {
- this.currentRunner_.execute();
-};
-
-jasmine.Env.prototype.describe = function(description, specDefinitions) {
- var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite);
-
- var parentSuite = this.currentSuite;
- if (parentSuite) {
- parentSuite.add(suite);
- } else {
- this.currentRunner_.add(suite);
- }
-
- this.currentSuite = suite;
-
- var declarationError = null;
- try {
- specDefinitions.call(suite);
- } catch(e) {
- declarationError = e;
- }
-
- if (declarationError) {
- this.it("encountered a declaration exception", function() {
- throw declarationError;
- });
- }
-
- this.currentSuite = parentSuite;
-
- return suite;
-};
-
-jasmine.Env.prototype.beforeEach = function(beforeEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.beforeEach(beforeEachFunction);
- } else {
- this.currentRunner_.beforeEach(beforeEachFunction);
- }
-};
-
-jasmine.Env.prototype.currentRunner = function () {
- return this.currentRunner_;
-};
-
-jasmine.Env.prototype.afterEach = function(afterEachFunction) {
- if (this.currentSuite) {
- this.currentSuite.afterEach(afterEachFunction);
- } else {
- this.currentRunner_.afterEach(afterEachFunction);
- }
-
-};
-
-jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) {
- return {
- execute: function() {
- }
- };
-};
-
-jasmine.Env.prototype.it = function(description, func) {
- var spec = new jasmine.Spec(this, this.currentSuite, description);
- this.currentSuite.add(spec);
- this.currentSpec = spec;
-
- if (func) {
- spec.runs(func);
- }
-
- return spec;
-};
-
-jasmine.Env.prototype.xit = function(desc, func) {
- return {
- id: this.nextSpecId(),
- runs: function() {
- }
- };
-};
-
-jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) {
- if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) {
- return true;
- }
-
- a.__Jasmine_been_here_before__ = b;
- b.__Jasmine_been_here_before__ = a;
-
- var hasKey = function(obj, keyName) {
- return obj !== null && obj[keyName] !== jasmine.undefined;
- };
-
- for (var property in b) {
- if (!hasKey(a, property) && hasKey(b, property)) {
- mismatchKeys.push("expected has key '" + property + "', but missing from actual.");
- }
- }
- for (property in a) {
- if (!hasKey(b, property) && hasKey(a, property)) {
- mismatchKeys.push("expected missing key '" + property + "', but present in actual.");
- }
- }
- for (property in b) {
- if (property == '__Jasmine_been_here_before__') continue;
- if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) {
- mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual.");
- }
- }
-
- if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) {
- mismatchValues.push("arrays were not the same length");
- }
-
- delete a.__Jasmine_been_here_before__;
- delete b.__Jasmine_been_here_before__;
- return (mismatchKeys.length === 0 && mismatchValues.length === 0);
-};
-
-jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) {
- mismatchKeys = mismatchKeys || [];
- mismatchValues = mismatchValues || [];
-
- for (var i = 0; i < this.equalityTesters_.length; i++) {
- var equalityTester = this.equalityTesters_[i];
- var result = equalityTester(a, b, this, mismatchKeys, mismatchValues);
- if (result !== jasmine.undefined) return result;
- }
-
- if (a === b) return true;
-
- if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) {
- return (a == jasmine.undefined && b == jasmine.undefined);
- }
-
- if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) {
- return a === b;
- }
-
- if (a instanceof Date && b instanceof Date) {
- return a.getTime() == b.getTime();
- }
-
- if (a instanceof jasmine.Matchers.Any) {
- return a.matches(b);
- }
-
- if (b instanceof jasmine.Matchers.Any) {
- return b.matches(a);
- }
-
- if (jasmine.isString_(a) && jasmine.isString_(b)) {
- return (a == b);
- }
-
- if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) {
- return (a == b);
- }
-
- if (typeof a === "object" && typeof b === "object") {
- return this.compareObjects_(a, b, mismatchKeys, mismatchValues);
- }
-
- //Straight check
- return (a === b);
-};
-
-jasmine.Env.prototype.contains_ = function(haystack, needle) {
- if (jasmine.isArray_(haystack)) {
- for (var i = 0; i < haystack.length; i++) {
- if (this.equals_(haystack[i], needle)) return true;
- }
- return false;
- }
- return haystack.indexOf(needle) >= 0;
-};
-
-jasmine.Env.prototype.addEqualityTester = function(equalityTester) {
- this.equalityTesters_.push(equalityTester);
-};
-/** No-op base class for Jasmine reporters.
- *
- * @constructor
- */
-jasmine.Reporter = function() {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerStarting = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportRunnerResults = function(runner) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecStarting = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.reportSpecResults = function(spec) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.Reporter.prototype.log = function(str) {
-};
-
-/**
- * Blocks are functions with executable code that make up a spec.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {Function} func
- * @param {jasmine.Spec} spec
- */
-jasmine.Block = function(env, func, spec) {
- this.env = env;
- this.func = func;
- this.spec = spec;
-};
-
-jasmine.Block.prototype.execute = function(onComplete) {
- try {
- this.func.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- }
- onComplete();
-};
-/** JavaScript API reporter.
- *
- * @constructor
- */
-jasmine.JsApiReporter = function() {
- this.started = false;
- this.finished = false;
- this.suites_ = [];
- this.results_ = {};
-};
-
-jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) {
- this.started = true;
- var suites = runner.topLevelSuites();
- for (var i = 0; i < suites.length; i++) {
- var suite = suites[i];
- this.suites_.push(this.summarize_(suite));
- }
-};
-
-jasmine.JsApiReporter.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) {
- var isSuite = suiteOrSpec instanceof jasmine.Suite;
- var summary = {
- id: suiteOrSpec.id,
- name: suiteOrSpec.description,
- type: isSuite ? 'suite' : 'spec',
- children: []
- };
-
- if (isSuite) {
- var children = suiteOrSpec.children();
- for (var i = 0; i < children.length; i++) {
- summary.children.push(this.summarize_(children[i]));
- }
- }
- return summary;
-};
-
-jasmine.JsApiReporter.prototype.results = function() {
- return this.results_;
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) {
- return this.results_[specId];
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) {
- this.finished = true;
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) {
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) {
- this.results_[spec.id] = {
- messages: spec.results().getItems(),
- result: spec.results().failedCount > 0 ? "failed" : "passed"
- };
-};
-
-//noinspection JSUnusedLocalSymbols
-jasmine.JsApiReporter.prototype.log = function(str) {
-};
-
-jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){
- var results = {};
- for (var i = 0; i < specIds.length; i++) {
- var specId = specIds[i];
- results[specId] = this.summarizeResult_(this.results_[specId]);
- }
- return results;
-};
-
-jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){
- var summaryMessages = [];
- var messagesLength = result.messages.length;
- for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) {
- var resultMessage = result.messages[messageIndex];
- summaryMessages.push({
- text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined,
- passed: resultMessage.passed ? resultMessage.passed() : true,
- type: resultMessage.type,
- message: resultMessage.message,
- trace: {
- stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined
- }
- });
- }
-
- return {
- result : result.result,
- messages : summaryMessages
- };
-};
-
-/**
- * @constructor
- * @param {jasmine.Env} env
- * @param actual
- * @param {jasmine.Spec} spec
- */
-jasmine.Matchers = function(env, actual, spec, opt_isNot) {
- this.env = env;
- this.actual = actual;
- this.spec = spec;
- this.isNot = opt_isNot || false;
- this.reportWasCalled_ = false;
-};
-
-// todo: @deprecated as of Jasmine 0.11, remove soon [xw]
-jasmine.Matchers.pp = function(str) {
- throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!");
-};
-
-// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw]
-jasmine.Matchers.prototype.report = function(result, failing_message, details) {
- throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs");
-};
-
-jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) {
- for (var methodName in prototype) {
- if (methodName == 'report') continue;
- var orig = prototype[methodName];
- matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig);
- }
-};
-
-jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) {
- return function() {
- var matcherArgs = jasmine.util.argsToArray(arguments);
- var result = matcherFunction.apply(this, arguments);
-
- if (this.isNot) {
- result = !result;
- }
-
- if (this.reportWasCalled_) return result;
-
- var message;
- if (!result) {
- if (this.message) {
- message = this.message.apply(this, arguments);
- if (jasmine.isArray_(message)) {
- message = message[this.isNot ? 1 : 0];
- }
- } else {
- var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
- message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate;
- if (matcherArgs.length > 0) {
- for (var i = 0; i < matcherArgs.length; i++) {
- if (i > 0) message += ",";
- message += " " + jasmine.pp(matcherArgs[i]);
- }
- }
- message += ".";
- }
- }
- var expectationResult = new jasmine.ExpectationResult({
- matcherName: matcherName,
- passed: result,
- expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0],
- actual: this.actual,
- message: message
- });
- this.spec.addMatcherResult(expectationResult);
- return jasmine.undefined;
- };
-};
-
-
-
-
-/**
- * toBe: compares the actual to the expected using ===
- * @param expected
- */
-jasmine.Matchers.prototype.toBe = function(expected) {
- return this.actual === expected;
-};
-
-/**
- * toNotBe: compares the actual to the expected using !==
- * @param expected
- * @deprecated as of 1.0. Use not.toBe() instead.
- */
-jasmine.Matchers.prototype.toNotBe = function(expected) {
- return this.actual !== expected;
-};
-
-/**
- * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toEqual = function(expected) {
- return this.env.equals_(this.actual, expected);
-};
-
-/**
- * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual
- * @param expected
- * @deprecated as of 1.0. Use not.toNotEqual() instead.
- */
-jasmine.Matchers.prototype.toNotEqual = function(expected) {
- return !this.env.equals_(this.actual, expected);
-};
-
-/**
- * Matcher that compares the actual to the expected using a regular expression. Constructs a RegExp, so takes
- * a pattern or a String.
- *
- * @param expected
- */
-jasmine.Matchers.prototype.toMatch = function(expected) {
- return new RegExp(expected).test(this.actual);
-};
-
-/**
- * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch
- * @param expected
- * @deprecated as of 1.0. Use not.toMatch() instead.
- */
-jasmine.Matchers.prototype.toNotMatch = function(expected) {
- return !(new RegExp(expected).test(this.actual));
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeDefined = function() {
- return (this.actual !== jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to jasmine.undefined.
- */
-jasmine.Matchers.prototype.toBeUndefined = function() {
- return (this.actual === jasmine.undefined);
-};
-
-/**
- * Matcher that compares the actual to null.
- */
-jasmine.Matchers.prototype.toBeNull = function() {
- return (this.actual === null);
-};
-
-/**
- * Matcher that boolean not-nots the actual.
- */
-jasmine.Matchers.prototype.toBeTruthy = function() {
- return !!this.actual;
-};
-
-
-/**
- * Matcher that boolean nots the actual.
- */
-jasmine.Matchers.prototype.toBeFalsy = function() {
- return !this.actual;
-};
-
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called.
- */
-jasmine.Matchers.prototype.toHaveBeenCalled = function() {
- if (arguments.length > 0) {
- throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to have been called.",
- "Expected spy " + this.actual.identity + " not to have been called."
- ];
- };
-
- return this.actual.wasCalled;
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */
-jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled;
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was not called.
- *
- * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead
- */
-jasmine.Matchers.prototype.wasNotCalled = function() {
- if (arguments.length > 0) {
- throw new Error('wasNotCalled does not take arguments');
- }
-
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy " + this.actual.identity + " to not have been called.",
- "Expected spy " + this.actual.identity + " to have been called."
- ];
- };
-
- return !this.actual.wasCalled;
-};
-
-/**
- * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters.
- *
- * @example
- *
- */
-jasmine.Matchers.prototype.toHaveBeenCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
- this.message = function() {
- if (this.actual.callCount === 0) {
- // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw]
- return [
- "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.",
- "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."
- ];
- } else {
- return [
- "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall),
- "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall)
- ];
- }
- };
-
- return this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith;
-
-/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */
-jasmine.Matchers.prototype.wasNotCalledWith = function() {
- var expectedArgs = jasmine.util.argsToArray(arguments);
- if (!jasmine.isSpy(this.actual)) {
- throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.');
- }
-
- this.message = function() {
- return [
- "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was",
- "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was"
- ];
- };
-
- return !this.env.contains_(this.actual.argsForCall, expectedArgs);
-};
-
-/**
- * Matcher that checks that the expected item is an element in the actual Array.
- *
- * @param {Object} expected
- */
-jasmine.Matchers.prototype.toContain = function(expected) {
- return this.env.contains_(this.actual, expected);
-};
-
-/**
- * Matcher that checks that the expected item is NOT an element in the actual Array.
- *
- * @param {Object} expected
- * @deprecated as of 1.0. Use not.toNotContain() instead.
- */
-jasmine.Matchers.prototype.toNotContain = function(expected) {
- return !this.env.contains_(this.actual, expected);
-};
-
-jasmine.Matchers.prototype.toBeLessThan = function(expected) {
- return this.actual < expected;
-};
-
-jasmine.Matchers.prototype.toBeGreaterThan = function(expected) {
- return this.actual > expected;
-};
-
-/**
- * Matcher that checks that the expected item is equal to the actual item
- * up to a given level of decimal precision (default 2).
- *
- * @param {Number} expected
- * @param {Number} precision
- */
-jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) {
- if (!(precision === 0)) {
- precision = precision || 2;
- }
- var multiplier = Math.pow(10, precision);
- var actual = Math.round(this.actual * multiplier);
- expected = Math.round(expected * multiplier);
- return expected == actual;
-};
-
-/**
- * Matcher that checks that the expected exception was thrown by the actual.
- *
- * @param {String} expected
- */
-jasmine.Matchers.prototype.toThrow = function(expected) {
- var result = false;
- var exception;
- if (typeof this.actual != 'function') {
- throw new Error('Actual is not a function');
- }
- try {
- this.actual();
- } catch (e) {
- exception = e;
- }
- if (exception) {
- result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected));
- }
-
- var not = this.isNot ? "not " : "";
-
- this.message = function() {
- if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) {
- return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].join(' ');
- } else {
- return "Expected function to throw an exception.";
- }
- };
-
- return result;
-};
-
-jasmine.Matchers.Any = function(expectedClass) {
- this.expectedClass = expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.matches = function(other) {
- if (this.expectedClass == String) {
- return typeof other == 'string' || other instanceof String;
- }
-
- if (this.expectedClass == Number) {
- return typeof other == 'number' || other instanceof Number;
- }
-
- if (this.expectedClass == Function) {
- return typeof other == 'function' || other instanceof Function;
- }
-
- if (this.expectedClass == Object) {
- return typeof other == 'object';
- }
-
- return other instanceof this.expectedClass;
-};
-
-jasmine.Matchers.Any.prototype.toString = function() {
- return '';
-};
-
-/**
- * @constructor
- */
-jasmine.MultiReporter = function() {
- this.subReporters_ = [];
-};
-jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter);
-
-jasmine.MultiReporter.prototype.addReporter = function(reporter) {
- this.subReporters_.push(reporter);
-};
-
-(function() {
- var functionNames = [
- "reportRunnerStarting",
- "reportRunnerResults",
- "reportSuiteResults",
- "reportSpecStarting",
- "reportSpecResults",
- "log"
- ];
- for (var i = 0; i < functionNames.length; i++) {
- var functionName = functionNames[i];
- jasmine.MultiReporter.prototype[functionName] = (function(functionName) {
- return function() {
- for (var j = 0; j < this.subReporters_.length; j++) {
- var subReporter = this.subReporters_[j];
- if (subReporter[functionName]) {
- subReporter[functionName].apply(subReporter, arguments);
- }
- }
- };
- })(functionName);
- }
-})();
-/**
- * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults
- *
- * @constructor
- */
-jasmine.NestedResults = function() {
- /**
- * The total count of results
- */
- this.totalCount = 0;
- /**
- * Number of passed results
- */
- this.passedCount = 0;
- /**
- * Number of failed results
- */
- this.failedCount = 0;
- /**
- * Was this suite/spec skipped?
- */
- this.skipped = false;
- /**
- * @ignore
- */
- this.items_ = [];
-};
-
-/**
- * Roll up the result counts.
- *
- * @param result
- */
-jasmine.NestedResults.prototype.rollupCounts = function(result) {
- this.totalCount += result.totalCount;
- this.passedCount += result.passedCount;
- this.failedCount += result.failedCount;
-};
-
-/**
- * Adds a log message.
- * @param values Array of message parts which will be concatenated later.
- */
-jasmine.NestedResults.prototype.log = function(values) {
- this.items_.push(new jasmine.MessageResult(values));
-};
-
-/**
- * Getter for the results: message & results.
- */
-jasmine.NestedResults.prototype.getItems = function() {
- return this.items_;
-};
-
-/**
- * Adds a result, tracking counts (total, passed, & failed)
- * @param {jasmine.ExpectationResult|jasmine.NestedResults} result
- */
-jasmine.NestedResults.prototype.addResult = function(result) {
- if (result.type != 'log') {
- if (result.items_) {
- this.rollupCounts(result);
- } else {
- this.totalCount++;
- if (result.passed()) {
- this.passedCount++;
- } else {
- this.failedCount++;
- }
- }
- }
- this.items_.push(result);
-};
-
-/**
- * @returns {Boolean} True if everything below passed
- */
-jasmine.NestedResults.prototype.passed = function() {
- return this.passedCount === this.totalCount;
-};
-/**
- * Base class for pretty printing for expectation results.
- */
-jasmine.PrettyPrinter = function() {
- this.ppNestLevel_ = 0;
-};
-
-/**
- * Formats a value in a nice, human-readable string.
- *
- * @param value
- */
-jasmine.PrettyPrinter.prototype.format = function(value) {
- if (this.ppNestLevel_ > 40) {
- throw new Error('jasmine.PrettyPrinter: format() nested too deeply!');
- }
-
- this.ppNestLevel_++;
- try {
- if (value === jasmine.undefined) {
- this.emitScalar('undefined');
- } else if (value === null) {
- this.emitScalar('null');
- } else if (value === jasmine.getGlobal()) {
- this.emitScalar('');
- } else if (value instanceof jasmine.Matchers.Any) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'string') {
- this.emitString(value);
- } else if (jasmine.isSpy(value)) {
- this.emitScalar("spy on " + value.identity);
- } else if (value instanceof RegExp) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'function') {
- this.emitScalar('Function');
- } else if (typeof value.nodeType === 'number') {
- this.emitScalar('HTMLNode');
- } else if (value instanceof Date) {
- this.emitScalar('Date(' + value + ')');
- } else if (value.__Jasmine_been_here_before__) {
- this.emitScalar('');
- } else if (jasmine.isArray_(value) || typeof value == 'object') {
- value.__Jasmine_been_here_before__ = true;
- if (jasmine.isArray_(value)) {
- this.emitArray(value);
- } else {
- this.emitObject(value);
- }
- delete value.__Jasmine_been_here_before__;
- } else {
- this.emitScalar(value.toString());
- }
- } finally {
- this.ppNestLevel_--;
- }
-};
-
-jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) {
- for (var property in obj) {
- if (property == '__Jasmine_been_here_before__') continue;
- fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined &&
- obj.__lookupGetter__(property) !== null) : false);
- }
-};
-
-jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_;
-jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_;
-
-jasmine.StringPrettyPrinter = function() {
- jasmine.PrettyPrinter.call(this);
-
- this.string = '';
-};
-jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter);
-
-jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) {
- this.append(value);
-};
-
-jasmine.StringPrettyPrinter.prototype.emitString = function(value) {
- this.append("'" + value + "'");
-};
-
-jasmine.StringPrettyPrinter.prototype.emitArray = function(array) {
- this.append('[ ');
- for (var i = 0; i < array.length; i++) {
- if (i > 0) {
- this.append(', ');
- }
- this.format(array[i]);
- }
- this.append(' ]');
-};
-
-jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) {
- var self = this;
- this.append('{ ');
- var first = true;
-
- this.iterateObject(obj, function(property, isGetter) {
- if (first) {
- first = false;
- } else {
- self.append(', ');
- }
-
- self.append(property);
- self.append(' : ');
- if (isGetter) {
- self.append('');
- } else {
- self.format(obj[property]);
- }
- });
-
- this.append(' }');
-};
-
-jasmine.StringPrettyPrinter.prototype.append = function(value) {
- this.string += value;
-};
-jasmine.Queue = function(env) {
- this.env = env;
- this.blocks = [];
- this.running = false;
- this.index = 0;
- this.offset = 0;
- this.abort = false;
-};
-
-jasmine.Queue.prototype.addBefore = function(block) {
- this.blocks.unshift(block);
-};
-
-jasmine.Queue.prototype.add = function(block) {
- this.blocks.push(block);
-};
-
-jasmine.Queue.prototype.insertNext = function(block) {
- this.blocks.splice((this.index + this.offset + 1), 0, block);
- this.offset++;
-};
-
-jasmine.Queue.prototype.start = function(onComplete) {
- this.running = true;
- this.onComplete = onComplete;
- this.next_();
-};
-
-jasmine.Queue.prototype.isRunning = function() {
- return this.running;
-};
-
-jasmine.Queue.LOOP_DONT_RECURSE = true;
-
-jasmine.Queue.prototype.next_ = function() {
- var self = this;
- var goAgain = true;
-
- while (goAgain) {
- goAgain = false;
-
- if (self.index < self.blocks.length && !this.abort) {
- var calledSynchronously = true;
- var completedSynchronously = false;
-
- var onComplete = function () {
- if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) {
- completedSynchronously = true;
- return;
- }
-
- if (self.blocks[self.index].abort) {
- self.abort = true;
- }
-
- self.offset = 0;
- self.index++;
-
- var now = new Date().getTime();
- if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) {
- self.env.lastUpdate = now;
- self.env.setTimeout(function() {
- self.next_();
- }, 0);
- } else {
- if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) {
- goAgain = true;
- } else {
- self.next_();
- }
- }
- };
- self.blocks[self.index].execute(onComplete);
-
- calledSynchronously = false;
- if (completedSynchronously) {
- onComplete();
- }
-
- } else {
- self.running = false;
- if (self.onComplete) {
- self.onComplete();
- }
- }
- }
-};
-
-jasmine.Queue.prototype.results = function() {
- var results = new jasmine.NestedResults();
- for (var i = 0; i < this.blocks.length; i++) {
- if (this.blocks[i].results) {
- results.addResult(this.blocks[i].results());
- }
- }
- return results;
-};
-
-
-/**
- * Runner
- *
- * @constructor
- * @param {jasmine.Env} env
- */
-jasmine.Runner = function(env) {
- var self = this;
- self.env = env;
- self.queue = new jasmine.Queue(env);
- self.before_ = [];
- self.after_ = [];
- self.suites_ = [];
-};
-
-jasmine.Runner.prototype.execute = function() {
- var self = this;
- if (self.env.reporter.reportRunnerStarting) {
- self.env.reporter.reportRunnerStarting(this);
- }
- self.queue.start(function () {
- self.finishCallback();
- });
-};
-
-jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.splice(0,0,beforeEachFunction);
-};
-
-jasmine.Runner.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.splice(0,0,afterEachFunction);
-};
-
-
-jasmine.Runner.prototype.finishCallback = function() {
- this.env.reporter.reportRunnerResults(this);
-};
-
-jasmine.Runner.prototype.addSuite = function(suite) {
- this.suites_.push(suite);
-};
-
-jasmine.Runner.prototype.add = function(block) {
- if (block instanceof jasmine.Suite) {
- this.addSuite(block);
- }
- this.queue.add(block);
-};
-
-jasmine.Runner.prototype.specs = function () {
- var suites = this.suites();
- var specs = [];
- for (var i = 0; i < suites.length; i++) {
- specs = specs.concat(suites[i].specs());
- }
- return specs;
-};
-
-jasmine.Runner.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Runner.prototype.topLevelSuites = function() {
- var topLevelSuites = [];
- for (var i = 0; i < this.suites_.length; i++) {
- if (!this.suites_[i].parentSuite) {
- topLevelSuites.push(this.suites_[i]);
- }
- }
- return topLevelSuites;
-};
-
-jasmine.Runner.prototype.results = function() {
- return this.queue.results();
-};
-/**
- * Internal representation of a Jasmine specification, or test.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {jasmine.Suite} suite
- * @param {String} description
- */
-jasmine.Spec = function(env, suite, description) {
- if (!env) {
- throw new Error('jasmine.Env() required');
- }
- if (!suite) {
- throw new Error('jasmine.Suite() required');
- }
- var spec = this;
- spec.id = env.nextSpecId ? env.nextSpecId() : null;
- spec.env = env;
- spec.suite = suite;
- spec.description = description;
- spec.queue = new jasmine.Queue(env);
-
- spec.afterCallbacks = [];
- spec.spies_ = [];
-
- spec.results_ = new jasmine.NestedResults();
- spec.results_.description = description;
- spec.matchersClass = null;
-};
-
-jasmine.Spec.prototype.getFullName = function() {
- return this.suite.getFullName() + ' ' + this.description + '.';
-};
-
-
-jasmine.Spec.prototype.results = function() {
- return this.results_;
-};
-
-/**
- * All parameters are pretty-printed and concatenated together, then written to the spec's output.
- *
- * Be careful not to leave calls to jasmine.log
in production code.
- */
-jasmine.Spec.prototype.log = function() {
- return this.results_.log(arguments);
-};
-
-jasmine.Spec.prototype.runs = function (func) {
- var block = new jasmine.Block(this.env, func, this);
- this.addToQueue(block);
- return this;
-};
-
-jasmine.Spec.prototype.addToQueue = function (block) {
- if (this.queue.isRunning()) {
- this.queue.insertNext(block);
- } else {
- this.queue.add(block);
- }
-};
-
-/**
- * @param {jasmine.ExpectationResult} result
- */
-jasmine.Spec.prototype.addMatcherResult = function(result) {
- this.results_.addResult(result);
-};
-
-jasmine.Spec.prototype.expect = function(actual) {
- var positive = new (this.getMatchersClass_())(this.env, actual, this);
- positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
- return positive;
-};
-
-/**
- * Waits a fixed time period before moving to the next block.
- *
- * @deprecated Use waitsFor() instead
- * @param {Number} timeout milliseconds to wait
- */
-jasmine.Spec.prototype.waits = function(timeout) {
- var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this);
- this.addToQueue(waitsFunc);
- return this;
-};
-
-/**
- * Waits for the latchFunction to return true before proceeding to the next block.
- *
- * @param {Function} latchFunction
- * @param {String} optional_timeoutMessage
- * @param {Number} optional_timeout
- */
-jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
- var latchFunction_ = null;
- var optional_timeoutMessage_ = null;
- var optional_timeout_ = null;
-
- for (var i = 0; i < arguments.length; i++) {
- var arg = arguments[i];
- switch (typeof arg) {
- case 'function':
- latchFunction_ = arg;
- break;
- case 'string':
- optional_timeoutMessage_ = arg;
- break;
- case 'number':
- optional_timeout_ = arg;
- break;
- }
- }
-
- var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this);
- this.addToQueue(waitsForFunc);
- return this;
-};
-
-jasmine.Spec.prototype.fail = function (e) {
- var expectationResult = new jasmine.ExpectationResult({
- passed: false,
- message: e ? jasmine.util.formatException(e) : 'Exception',
- trace: { stack: e.stack }
- });
- this.results_.addResult(expectationResult);
-};
-
-jasmine.Spec.prototype.getMatchersClass_ = function() {
- return this.matchersClass || this.env.matchersClass;
-};
-
-jasmine.Spec.prototype.addMatchers = function(matchersPrototype) {
- var parent = this.getMatchersClass_();
- var newMatchersClass = function() {
- parent.apply(this, arguments);
- };
- jasmine.util.inherit(newMatchersClass, parent);
- jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass);
- this.matchersClass = newMatchersClass;
-};
-
-jasmine.Spec.prototype.finishCallback = function() {
- this.env.reporter.reportSpecResults(this);
-};
-
-jasmine.Spec.prototype.finish = function(onComplete) {
- this.removeAllSpies();
- this.finishCallback();
- if (onComplete) {
- onComplete();
- }
-};
-
-jasmine.Spec.prototype.after = function(doAfter) {
- if (this.queue.isRunning()) {
- this.queue.add(new jasmine.Block(this.env, doAfter, this));
- } else {
- this.afterCallbacks.unshift(doAfter);
- }
-};
-
-jasmine.Spec.prototype.execute = function(onComplete) {
- var spec = this;
- if (!spec.env.specFilter(spec)) {
- spec.results_.skipped = true;
- spec.finish(onComplete);
- return;
- }
-
- this.env.reporter.reportSpecStarting(this);
-
- spec.env.currentSpec = spec;
-
- spec.addBeforesAndAftersToQueue();
-
- spec.queue.start(function () {
- spec.finish(onComplete);
- });
-};
-
-jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() {
- var runner = this.env.currentRunner();
- var i;
-
- for (var suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this));
- }
- }
- for (i = 0; i < runner.before_.length; i++) {
- this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this));
- }
- for (i = 0; i < this.afterCallbacks.length; i++) {
- this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this));
- }
- for (suite = this.suite; suite; suite = suite.parentSuite) {
- for (i = 0; i < suite.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, suite.after_[i], this));
- }
- }
- for (i = 0; i < runner.after_.length; i++) {
- this.queue.add(new jasmine.Block(this.env, runner.after_[i], this));
- }
-};
-
-jasmine.Spec.prototype.explodes = function() {
- throw 'explodes function should not have been called';
-};
-
-jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) {
- if (obj == jasmine.undefined) {
- throw "spyOn could not find an object to spy upon for " + methodName + "()";
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) {
- throw methodName + '() method does not exist';
- }
-
- if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) {
- throw new Error(methodName + ' has already been spied upon');
- }
-
- var spyObj = jasmine.createSpy(methodName);
-
- this.spies_.push(spyObj);
- spyObj.baseObj = obj;
- spyObj.methodName = methodName;
- spyObj.originalValue = obj[methodName];
-
- obj[methodName] = spyObj;
-
- return spyObj;
-};
-
-jasmine.Spec.prototype.removeAllSpies = function() {
- for (var i = 0; i < this.spies_.length; i++) {
- var spy = this.spies_[i];
- spy.baseObj[spy.methodName] = spy.originalValue;
- }
- this.spies_ = [];
-};
-
-/**
- * Internal representation of a Jasmine suite.
- *
- * @constructor
- * @param {jasmine.Env} env
- * @param {String} description
- * @param {Function} specDefinitions
- * @param {jasmine.Suite} parentSuite
- */
-jasmine.Suite = function(env, description, specDefinitions, parentSuite) {
- var self = this;
- self.id = env.nextSuiteId ? env.nextSuiteId() : null;
- self.description = description;
- self.queue = new jasmine.Queue(env);
- self.parentSuite = parentSuite;
- self.env = env;
- self.before_ = [];
- self.after_ = [];
- self.children_ = [];
- self.suites_ = [];
- self.specs_ = [];
-};
-
-jasmine.Suite.prototype.getFullName = function() {
- var fullName = this.description;
- for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) {
- fullName = parentSuite.description + ' ' + fullName;
- }
- return fullName;
-};
-
-jasmine.Suite.prototype.finish = function(onComplete) {
- this.env.reporter.reportSuiteResults(this);
- this.finished = true;
- if (typeof(onComplete) == 'function') {
- onComplete();
- }
-};
-
-jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) {
- beforeEachFunction.typeName = 'beforeEach';
- this.before_.unshift(beforeEachFunction);
-};
-
-jasmine.Suite.prototype.afterEach = function(afterEachFunction) {
- afterEachFunction.typeName = 'afterEach';
- this.after_.unshift(afterEachFunction);
-};
-
-jasmine.Suite.prototype.results = function() {
- return this.queue.results();
-};
-
-jasmine.Suite.prototype.add = function(suiteOrSpec) {
- this.children_.push(suiteOrSpec);
- if (suiteOrSpec instanceof jasmine.Suite) {
- this.suites_.push(suiteOrSpec);
- this.env.currentRunner().addSuite(suiteOrSpec);
- } else {
- this.specs_.push(suiteOrSpec);
- }
- this.queue.add(suiteOrSpec);
-};
-
-jasmine.Suite.prototype.specs = function() {
- return this.specs_;
-};
-
-jasmine.Suite.prototype.suites = function() {
- return this.suites_;
-};
-
-jasmine.Suite.prototype.children = function() {
- return this.children_;
-};
-
-jasmine.Suite.prototype.execute = function(onComplete) {
- var self = this;
- this.queue.start(function () {
- self.finish(onComplete);
- });
-};
-jasmine.WaitsBlock = function(env, timeout, spec) {
- this.timeout = timeout;
- jasmine.Block.call(this, env, null, spec);
-};
-
-jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block);
-
-jasmine.WaitsBlock.prototype.execute = function (onComplete) {
- if (jasmine.VERBOSE) {
- this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...');
- }
- this.env.setTimeout(function () {
- onComplete();
- }, this.timeout);
-};
-/**
- * A block which waits for some condition to become true, with timeout.
- *
- * @constructor
- * @extends jasmine.Block
- * @param {jasmine.Env} env The Jasmine environment.
- * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true.
- * @param {Function} latchFunction A function which returns true when the desired condition has been met.
- * @param {String} message The message to display if the desired condition hasn't been met within the given time period.
- * @param {jasmine.Spec} spec The Jasmine spec.
- */
-jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) {
- this.timeout = timeout || env.defaultTimeoutInterval;
- this.latchFunction = latchFunction;
- this.message = message;
- this.totalTimeSpentWaitingForLatch = 0;
- jasmine.Block.call(this, env, null, spec);
-};
-jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block);
-
-jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10;
-
-jasmine.WaitsForBlock.prototype.execute = function(onComplete) {
- if (jasmine.VERBOSE) {
- this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen'));
- }
- var latchFunctionResult;
- try {
- latchFunctionResult = this.latchFunction.apply(this.spec);
- } catch (e) {
- this.spec.fail(e);
- onComplete();
- return;
- }
-
- if (latchFunctionResult) {
- onComplete();
- } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) {
- var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen');
- this.spec.fail({
- name: 'timeout',
- message: message
- });
-
- this.abort = true;
- onComplete();
- } else {
- this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT;
- var self = this;
- this.env.setTimeout(function() {
- self.execute(onComplete);
- }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT);
- }
-};
-// Mock setTimeout, clearTimeout
-// Contributed by Pivotal Computer Systems, www.pivotalsf.com
-
-jasmine.FakeTimer = function() {
- this.reset();
-
- var self = this;
- self.setTimeout = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false);
- return self.timeoutsMade;
- };
-
- self.setInterval = function(funcToCall, millis) {
- self.timeoutsMade++;
- self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true);
- return self.timeoutsMade;
- };
-
- self.clearTimeout = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
- self.clearInterval = function(timeoutKey) {
- self.scheduledFunctions[timeoutKey] = jasmine.undefined;
- };
-
-};
-
-jasmine.FakeTimer.prototype.reset = function() {
- this.timeoutsMade = 0;
- this.scheduledFunctions = {};
- this.nowMillis = 0;
-};
-
-jasmine.FakeTimer.prototype.tick = function(millis) {
- var oldMillis = this.nowMillis;
- var newMillis = oldMillis + millis;
- this.runFunctionsWithinRange(oldMillis, newMillis);
- this.nowMillis = newMillis;
-};
-
-jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) {
- var scheduledFunc;
- var funcsToRun = [];
- for (var timeoutKey in this.scheduledFunctions) {
- scheduledFunc = this.scheduledFunctions[timeoutKey];
- if (scheduledFunc != jasmine.undefined &&
- scheduledFunc.runAtMillis >= oldMillis &&
- scheduledFunc.runAtMillis <= nowMillis) {
- funcsToRun.push(scheduledFunc);
- this.scheduledFunctions[timeoutKey] = jasmine.undefined;
- }
- }
-
- if (funcsToRun.length > 0) {
- funcsToRun.sort(function(a, b) {
- return a.runAtMillis - b.runAtMillis;
- });
- for (var i = 0; i < funcsToRun.length; ++i) {
- try {
- var funcToRun = funcsToRun[i];
- this.nowMillis = funcToRun.runAtMillis;
- funcToRun.funcToCall();
- if (funcToRun.recurring) {
- this.scheduleFunction(funcToRun.timeoutKey,
- funcToRun.funcToCall,
- funcToRun.millis,
- true);
- }
- } catch(e) {
- }
- }
- this.runFunctionsWithinRange(oldMillis, nowMillis);
- }
-};
-
-jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) {
- this.scheduledFunctions[timeoutKey] = {
- runAtMillis: this.nowMillis + millis,
- funcToCall: funcToCall,
- recurring: recurring,
- timeoutKey: timeoutKey,
- millis: millis
- };
-};
-
-/**
- * @namespace
- */
-jasmine.Clock = {
- defaultFakeTimer: new jasmine.FakeTimer(),
-
- reset: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.reset();
- },
-
- tick: function(millis) {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.defaultFakeTimer.tick(millis);
- },
-
- runFunctionsWithinRange: function(oldMillis, nowMillis) {
- jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis);
- },
-
- scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) {
- jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring);
- },
-
- useMock: function() {
- if (!jasmine.Clock.isInstalled()) {
- var spec = jasmine.getEnv().currentSpec;
- spec.after(jasmine.Clock.uninstallMock);
-
- jasmine.Clock.installMock();
- }
- },
-
- installMock: function() {
- jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer;
- },
-
- uninstallMock: function() {
- jasmine.Clock.assertInstalled();
- jasmine.Clock.installed = jasmine.Clock.real;
- },
-
- real: {
- setTimeout: jasmine.getGlobal().setTimeout,
- clearTimeout: jasmine.getGlobal().clearTimeout,
- setInterval: jasmine.getGlobal().setInterval,
- clearInterval: jasmine.getGlobal().clearInterval
- },
-
- assertInstalled: function() {
- if (!jasmine.Clock.isInstalled()) {
- throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()");
- }
- },
-
- isInstalled: function() {
- return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer;
- },
-
- installed: null
-};
-jasmine.Clock.installed = jasmine.Clock.real;
-
-//else for IE support
-jasmine.getGlobal().setTimeout = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setTimeout.apply) {
- return jasmine.Clock.installed.setTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setTimeout(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().setInterval = function(funcToCall, millis) {
- if (jasmine.Clock.installed.setInterval.apply) {
- return jasmine.Clock.installed.setInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.setInterval(funcToCall, millis);
- }
-};
-
-jasmine.getGlobal().clearTimeout = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearTimeout.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearTimeout(timeoutKey);
- }
-};
-
-jasmine.getGlobal().clearInterval = function(timeoutKey) {
- if (jasmine.Clock.installed.clearTimeout.apply) {
- return jasmine.Clock.installed.clearInterval.apply(this, arguments);
- } else {
- return jasmine.Clock.installed.clearInterval(timeoutKey);
- }
-};
-
-jasmine.version_= {
- "major": 1,
- "minor": 1,
- "build": 0,
- "revision": 1315677058
-};
diff --git a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine_favicon.png b/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine_favicon.png
deleted file mode 100644
index bd147955254..00000000000
Binary files a/addons/web_graph/static/lib/flotr2/lib/jasmine/jasmine_favicon.png and /dev/null differ
diff --git a/addons/web_graph/static/lib/flotr2/lib/prototype.js b/addons/web_graph/static/lib/flotr2/lib/prototype.js
deleted file mode 100644
index 41bd8e30e4a..00000000000
--- a/addons/web_graph/static/lib/flotr2/lib/prototype.js
+++ /dev/null
@@ -1,4320 +0,0 @@
-/* Prototype JavaScript framework, version 1.6.0.3
- * (c) 2005-2008 Sam Stephenson
- *
- * Prototype is freely distributable under the terms of an MIT-style license.
- * For details, see the Prototype web site: http://www.prototypejs.org/
- *
- *--------------------------------------------------------------------------*/
-
-var Prototype = {
- Version: '1.6.0.3',
-
- Browser: {
- IE: !!(window.attachEvent &&
- navigator.userAgent.indexOf('Opera') === -1),
- Opera: navigator.userAgent.indexOf('Opera') > -1,
- WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
- Gecko: navigator.userAgent.indexOf('Gecko') > -1 &&
- navigator.userAgent.indexOf('KHTML') === -1,
- MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
- },
-
- BrowserFeatures: {
- XPath: !!document.evaluate,
- SelectorsAPI: !!document.querySelector,
- ElementExtensions: !!window.HTMLElement,
- SpecificElementExtensions:
- document.createElement('div')['__proto__'] &&
- document.createElement('div')['__proto__'] !==
- document.createElement('form')['__proto__']
- },
-
- ScriptFragment: '