highstock-release
Advanced tools
Comparing version 2.1.9 to 2.1.10
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
@@ -8,12 +8,12 @@ Standalone Highcharts Framework | ||
*/ | ||
var HighchartsAdapter=function(){function o(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var f=b.HCEvents,k,h,l,g;if(b.removeEventListener)k=a;else if(b.attachEvent)k=d;else return;c?(h={},h[c]=!0):h=f;for(g in h)if(f[g])for(l=f[g].length;l--;)k(b,g,f[g][l])}c.HCExtended||Highcharts.extend(c,{HCExtended:!0,HCEvents:{},bind:function(a,b){var d=this,c=this.HCEvents,h;if(d.addEventListener)d.addEventListener(a, | ||
b,!1);else if(d.attachEvent){h=function(a){a.target=a.srcElement||window;b.call(d,a)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[b.toString()]=h;d.attachEvent("on"+a,h)}c[a]===q&&(c[a]=[]);c[a].push(b)},unbind:function(c,i){var f,k;c?(f=this.HCEvents[c]||[],i?(k=HighchartsAdapter.inArray(i,f),k>-1&&(f.splice(k,1),this.HCEvents[c]=f),this.removeEventListener?a(this,c,i):this.attachEvent&&d(this,c,i)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},trigger:function(a, | ||
b){var d=this.HCEvents[a]||[],c=d.length,h,g,j;g=function(){b.defaultPrevented=!0};for(h=0;h<c;h++){j=d[h];if(b.stopped)break;b.preventDefault=g;b.target=this;if(!b.type)b.type=a;j.call(this,b)===!1&&b.preventDefault()}}});return c}var q,j=document,p=[],g=[],m={},n;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};return{init:function(c){if(!j.defaultView)this._getStyle=function(a,d){var b;return a.style[d]?a.style[d]:(d==="opacity"&&(d="filter"),b=a.currentStyle[d.replace(/\-(\w)/g, | ||
function(a,b){return b.toUpperCase()})],d==="filter"&&(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(a,b){return b/100})),b===""?1:b)},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(HighchartsAdapter._getStyle(a,"padding"),10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b= | ||
d.length;c<b;c++)if(d[c]===a)return c;return-1};if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,i=a.length;c<i;c++)d(a[c],c)&&b.push(a[c]);return b};n=function(a,c,b){this.options=c;this.elem=a;this.prop=b};n.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element;if(m[this.prop])m[this.prop](this);else a&&b?d.attr("d",c.step(a[0],a[1],this.now,this.toD)):d.attr?b&&d.attr(this.prop,this.now):(a={},a[this.prop]=this.now+this.unit,Highcharts.css(d,a));this.options.step&& | ||
this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=this,i=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;i.elem=this.elem;if(i()&&g.push(i)===1)i.timerId=setInterval(function(){for(f=0;f<g.length;f++)g[f]()||g.splice(f--,1);g.length||clearInterval(i.timerId)},13)},step:function(a){var c=+new Date,b;b=this.options;var e=this.elem,i;if(e.attr&&!e.element)b=!1;else if(a||c>=b.duration+this.startTime){this.now= | ||
this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=!0;for(i in b.curAnim)b.curAnim[i]!==!0&&(a=!1);a&&b.complete&&b.complete.call(e);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,i="",f,g,h;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration= | ||
400;b.easing=Math[b.easing]||Math.easeInOutSine;b.curAnim=Highcharts.extend({},d);for(h in d)g=new n(a,b,h),f=null,h==="d"?(g.paths=c.init(a,a.d,d.d),g.toD=d.d,e=0,f=1):a.attr?e=a.attr(h):(e=parseFloat(HighchartsAdapter._getStyle(a,h))||0,h!=="opacity"&&(i="px")),f||(f=d[h]),f.match&&f.match("px")&&(f=f.replace(/px/g,"")),g.custom(e,f,i)}},_getStyle:function(c,a){return window.getComputedStyle(c,void 0).getPropertyValue(a)},addAnimSetter:function(c,a){m[c]=a},getScript:function(c,a){var d=j.getElementsByTagName("head")[0], | ||
b=j.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,a){return a.indexOf?a.indexOf(c):p.indexOf.call(a,c)},adapterRun:function(c,a){return parseInt(HighchartsAdapter._getStyle(c,a),10)},grep:function(c,a){return p.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){var a=document.documentElement,c=c.getBoundingClientRect();return{top:c.top+(window.pageYOffset||a.scrollTop)- | ||
(a.clientTop||0),left:c.left+(window.pageXOffset||a.scrollLeft)-(a.clientLeft||0)}},addEvent:function(c,a,d){o(c).bind(a,d)},removeEvent:function(c,a,d){o(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e;j.createEvent&&(c.dispatchEvent||c.fireEvent)?(e=j.createEvent("Events"),e.initEvent(a,!0,!0),e.target=c,Highcharts.extend(e,d),c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)):c.HCExtended===!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c}, | ||
stop:function(c){for(var a=g.length,d;a--;)d=g[a],d.elem===c&&g.splice(a,1)},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}(); | ||
(function(j,l){typeof module==="object"&&module.exports?module.exports=j.document?l(j):function(j){return l(j)}:j.HighchartsAdapter=l()})(typeof window!=="undefined"?window:this,function(j){function l(c){function a(a,b,d){a.removeEventListener(b,d,!1)}function d(a,b,d){d=a.HCProxiedMethods[d.toString()];a.detachEvent("on"+b,d)}function b(b,c){var f=b.HCEvents,k,h,p,g;if(b.removeEventListener)k=a;else if(b.attachEvent)k=d;else return;c?(h={},h[c]=!0):h=f;for(g in h)if(f[g])for(p=f[g].length;p--;)k(b, | ||
g,f[g][p])}if(!c.HCExtended)c.HCExtended=!0,c.HCEvents={},c.bind=function(a,b){var d=this,c=this.HCEvents,h;if(d.addEventListener)d.addEventListener(a,b,!1);else if(d.attachEvent){h=function(a){a.target=a.srcElement||m;b.call(d,a)};if(!d.HCProxiedMethods)d.HCProxiedMethods={};d.HCProxiedMethods[b.toString()]=h;d.attachEvent("on"+a,h)}c[a]===u&&(c[a]=[]);c[a].push(b)},c.unbind=function(c,i){var f,k;c?(f=this.HCEvents[c]||[],i?(k=s.inArray(i,f),k>-1&&(f.splice(k,1),this.HCEvents[c]=f),this.removeEventListener? | ||
a(this,c,i):this.attachEvent&&d(this,c,i)):(b(this,c),this.HCEvents[c]=[])):(b(this),this.HCEvents={})},c.trigger=function(a,b){var d=this.HCEvents[a]||[],c=d.length,h,g,j;g=function(){b.defaultPrevented=!0};for(h=0;h<c;h++){j=d[h];if(b.stopped)break;b.preventDefault=g;b.target=this;if(!b.type)b.type=a;j.call(this,b)===!1&&b.preventDefault()}};return c}var u,m=j||window,n=m.document,t=[],o,g=[],q={},s,r;Math.easeInOutSine=function(c,a,d,b){return-d/2*(Math.cos(Math.PI*c/b)-1)+a};o=function(c,a){var d= | ||
m.getComputedStyle(c,void 0);return d&&d.getPropertyValue(a)};return s={init:function(c){if(!n.defaultView)o=function(a,d){var b;if(a.style[d])return a.style[d];d==="opacity"&&(d="filter");b=a.currentStyle[d.replace(/\-(\w)/g,function(a,b){return b.toUpperCase()})];d==="filter"&&(b=b.replace(/alpha\(opacity=([0-9]+)\)/,function(a,b){return b/100}));return b===""?1:b},this.adapterRun=function(a,d){var b={width:"clientWidth",height:"clientHeight"}[d];if(b)return a.style.zoom=1,a[b]-2*parseInt(o(a,"padding"), | ||
10)};if(!Array.prototype.forEach)this.each=function(a,d){for(var b=0,c=a.length;b<c;b++)if(d.call(a[b],a[b],b,a)===!1)return b};if(!Array.prototype.indexOf)this.inArray=function(a,d){var b,c=0;if(d)for(b=d.length;c<b;c++)if(d[c]===a)return c;return-1};if(!Array.prototype.filter)this.grep=function(a,d){for(var b=[],c=0,i=a.length;c<i;c++)d(a[c],c)&&b.push(a[c]);return b};r=function(a,c,b){this.options=c;this.elem=a;this.prop=b};r.prototype={update:function(){var a;a=this.paths;var d=this.elem,b=d.element, | ||
e;if(q[this.prop])q[this.prop](this);else if(a&&b)d.attr("d",c.step(a[0],a[1],this.now,this.toD));else if(d.attr)b&&d.attr(this.prop,this.now);else for(e in a={},a[this.prop]=this.now+this.unit,a)d.style[e]=a[e];this.options.step&&this.options.step.call(this.elem,this.now,this)},custom:function(a,c,b){var e=this,i=function(a){return e.step(a)},f;this.startTime=+new Date;this.start=a;this.end=c;this.unit=b;this.now=this.start;this.pos=this.state=0;i.elem=this.elem;if(i()&&g.push(i)===1)i.timerId=setInterval(function(){for(f= | ||
0;f<g.length;f++)g[f]()||g.splice(f--,1);g.length||clearInterval(i.timerId)},13)},step:function(a){var c=+new Date,b;b=this.options;var e=this.elem,i;if(e.attr&&!e.element)b=!1;else if(a||c>=b.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();a=this.options.curAnim[this.prop]=!0;for(i in b.curAnim)b.curAnim[i]!==!0&&(a=!1);a&&b.complete&&b.complete.call(e);b=!1}else e=c-this.startTime,this.state=e/b.duration,this.pos=b.easing(e,0,1,b.duration),this.now=this.start+(this.end- | ||
this.start)*this.pos,this.update(),b=!0;return b}};this.animate=function(a,d,b){var e,i="",f,g,h;if(typeof b!=="object"||b===null)e=arguments,b={duration:e[2],easing:e[3],complete:e[4]};if(typeof b.duration!=="number")b.duration=400;b.easing=Math[b.easing]||Math.easeInOutSine;b.curAnim={};for(f in d)b.curAnim[f]=d[f];for(h in d)g=new r(a,b,h),f=null,h==="d"?(g.paths=c.init(a,a.d,d.d),g.toD=d.d,e=0,f=1):a.attr?e=a.attr(h):(e=parseFloat(o(a,h))||0,h!=="opacity"&&(i="px")),f||(f=d[h]),f.match&&f.match("px")&& | ||
(f=f.replace(/px/g,"")),g.custom(e,f,i)}},addAnimSetter:function(c,a){q[c]=a},getScript:function(c,a){var d=n.getElementsByTagName("head")[0],b=n.createElement("script");b.type="text/javascript";b.src=c;b.onload=a;d.appendChild(b)},inArray:function(c,a){return a.indexOf?a.indexOf(c):t.indexOf.call(a,c)},adapterRun:function(c,a){return parseInt(o(c,a),10)},grep:function(c,a){return t.filter.call(c,a)},map:function(c,a){for(var d=[],b=0,e=c.length;b<e;b++)d[b]=a.call(c[b],c[b],b,c);return d},offset:function(c){var a= | ||
document.documentElement,c=c.getBoundingClientRect();return{top:c.top+(m.pageYOffset||a.scrollTop)-(a.clientTop||0),left:c.left+(m.pageXOffset||a.scrollLeft)-(a.clientLeft||0)}},addEvent:function(c,a,d){l(c).bind(a,d)},removeEvent:function(c,a,d){l(c).unbind(a,d)},fireEvent:function(c,a,d,b){var e,g;if(n.createEvent&&(c.dispatchEvent||c.fireEvent)){e=n.createEvent("Events");e.initEvent(a,!0,!0);e.target=c;for(g in d)e[g]=d[g];c.dispatchEvent?c.dispatchEvent(e):c.fireEvent(a,e)}else c.HCExtended=== | ||
!0&&(d=d||{},c.trigger(a,d));d&&d.defaultPrevented&&(b=null);b&&b(d)},washMouseEvent:function(c){return c},stop:function(c){for(var a=g.length,d;a--;)d=g[a],d.elem===c&&g.splice(a,1)},each:function(c,a){return Array.prototype.forEach.call(c,a)}}}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* | ||
@@ -9,11 +9,22 @@ * Standalone Highcharts Framework | ||
(function (root, factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = root.document ? | ||
factory(root) : | ||
function (w) { | ||
return factory(w); | ||
}; | ||
} else { | ||
root.HighchartsAdapter = factory(); | ||
} | ||
}(typeof window !== 'undefined' ? window : this, function (w) { | ||
/*global Highcharts */ | ||
var HighchartsAdapter = (function () { | ||
var UNDEFINED, | ||
doc = document, | ||
win = w || window, | ||
doc = win.document, | ||
emptyArray = [], | ||
_getStyle, | ||
timers = [], | ||
animSetters = {}, | ||
HighchartsAdapter, | ||
Fx; | ||
@@ -25,2 +36,9 @@ | ||
/** | ||
* Internal method to return CSS value for given element and property | ||
*/ | ||
_getStyle = function (el, prop) { | ||
var style = win.getComputedStyle(el, undefined); | ||
return style && style.getPropertyValue(prop); | ||
}; | ||
@@ -75,109 +93,107 @@ | ||
if (!obj.HCExtended) { | ||
Highcharts.extend(obj, { | ||
HCExtended: true, | ||
obj.HCExtended = true; | ||
HCEvents: {}, | ||
obj.HCEvents = {}; | ||
bind: function (name, fn) { | ||
var el = this, | ||
events = this.HCEvents, | ||
wrappedFn; | ||
obj.bind = function (name, fn) { | ||
var el = this, | ||
events = this.HCEvents, | ||
wrappedFn; | ||
// handle DOM events in modern browsers | ||
if (el.addEventListener) { | ||
el.addEventListener(name, fn, false); | ||
// handle DOM events in modern browsers | ||
if (el.addEventListener) { | ||
el.addEventListener(name, fn, false); | ||
// handle old IE implementation | ||
} else if (el.attachEvent) { | ||
wrappedFn = function (e) { | ||
e.target = e.srcElement || window; // #2820 | ||
fn.call(el, e); | ||
}; | ||
// handle old IE implementation | ||
} else if (el.attachEvent) { | ||
wrappedFn = function (e) { | ||
e.target = e.srcElement || win; // #2820 | ||
fn.call(el, e); | ||
}; | ||
if (!el.HCProxiedMethods) { | ||
el.HCProxiedMethods = {}; | ||
} | ||
if (!el.HCProxiedMethods) { | ||
el.HCProxiedMethods = {}; | ||
} | ||
// link wrapped fn with original fn, so we can get this in removeEvent | ||
el.HCProxiedMethods[fn.toString()] = wrappedFn; | ||
// link wrapped fn with original fn, so we can get this in removeEvent | ||
el.HCProxiedMethods[fn.toString()] = wrappedFn; | ||
el.attachEvent('on' + name, wrappedFn); | ||
} | ||
el.attachEvent('on' + name, wrappedFn); | ||
} | ||
if (events[name] === UNDEFINED) { | ||
events[name] = []; | ||
} | ||
if (events[name] === UNDEFINED) { | ||
events[name] = []; | ||
} | ||
events[name].push(fn); | ||
}, | ||
events[name].push(fn); | ||
}; | ||
unbind: function (name, fn) { | ||
var events, | ||
index; | ||
obj.unbind = function (name, fn) { | ||
var events, | ||
index; | ||
if (name) { | ||
events = this.HCEvents[name] || []; | ||
if (fn) { | ||
index = HighchartsAdapter.inArray(fn, events); | ||
if (index > -1) { | ||
events.splice(index, 1); | ||
this.HCEvents[name] = events; | ||
} | ||
if (this.removeEventListener) { | ||
removeOneEvent(this, name, fn); | ||
} else if (this.attachEvent) { | ||
IERemoveOneEvent(this, name, fn); | ||
} | ||
} else { | ||
removeAllEvents(this, name); | ||
this.HCEvents[name] = []; | ||
if (name) { | ||
events = this.HCEvents[name] || []; | ||
if (fn) { | ||
index = HighchartsAdapter.inArray(fn, events); | ||
if (index > -1) { | ||
events.splice(index, 1); | ||
this.HCEvents[name] = events; | ||
} | ||
if (this.removeEventListener) { | ||
removeOneEvent(this, name, fn); | ||
} else if (this.attachEvent) { | ||
IERemoveOneEvent(this, name, fn); | ||
} | ||
} else { | ||
removeAllEvents(this); | ||
this.HCEvents = {}; | ||
removeAllEvents(this, name); | ||
this.HCEvents[name] = []; | ||
} | ||
}, | ||
} else { | ||
removeAllEvents(this); | ||
this.HCEvents = {}; | ||
} | ||
}; | ||
trigger: function (name, args) { | ||
var events = this.HCEvents[name] || [], | ||
target = this, | ||
len = events.length, | ||
i, | ||
preventDefault, | ||
fn; | ||
obj.trigger = function (name, args) { | ||
var events = this.HCEvents[name] || [], | ||
target = this, | ||
len = events.length, | ||
i, | ||
preventDefault, | ||
fn; | ||
// Attach a simple preventDefault function to skip default handler if called | ||
preventDefault = function () { | ||
args.defaultPrevented = true; | ||
}; | ||
for (i = 0; i < len; i++) { | ||
fn = events[i]; | ||
// Attach a simple preventDefault function to skip default handler if called | ||
preventDefault = function () { | ||
args.defaultPrevented = true; | ||
}; | ||
for (i = 0; i < len; i++) { | ||
fn = events[i]; | ||
// args is never null here | ||
if (args.stopped) { | ||
return; | ||
} | ||
// args is never null here | ||
if (args.stopped) { | ||
return; | ||
} | ||
args.preventDefault = preventDefault; | ||
args.target = target; | ||
args.preventDefault = preventDefault; | ||
args.target = target; | ||
// If the type is not set, we're running a custom event (#2297). If it is set, | ||
// we're running a browser event, and setting it will cause en error in | ||
// IE8 (#2465). | ||
if (!args.type) { | ||
args.type = name; | ||
} | ||
// If the type is not set, we're running a custom event (#2297). If it is set, | ||
// we're running a browser event, and setting it will cause en error in | ||
// IE8 (#2465). | ||
if (!args.type) { | ||
args.type = name; | ||
} | ||
// If the event handler return false, prevent the default handler from executing | ||
if (fn.call(this, args) === false) { | ||
args.preventDefault(); | ||
} | ||
// If the event handler return false, prevent the default handler from executing | ||
if (fn.call(this, args) === false) { | ||
args.preventDefault(); | ||
} | ||
} | ||
}); | ||
}; | ||
} | ||
@@ -189,3 +205,3 @@ | ||
return { | ||
HighchartsAdapter = { | ||
@@ -202,23 +218,24 @@ /** | ||
if (!doc.defaultView) { | ||
this._getStyle = function (el, prop) { | ||
_getStyle = function (el, prop) { | ||
var val; | ||
if (el.style[prop]) { | ||
return el.style[prop]; | ||
} else { | ||
if (prop === 'opacity') { | ||
prop = 'filter'; | ||
} | ||
/*jslint unparam: true*/ | ||
val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { return b.toUpperCase(); })]; | ||
if (prop === 'filter') { | ||
val = val.replace( | ||
/alpha\(opacity=([0-9]+)\)/, | ||
function (a, b) { | ||
return b / 100; | ||
} | ||
); | ||
} | ||
/*jslint unparam: false*/ | ||
return val === '' ? 1 : val; | ||
} | ||
} | ||
if (prop === 'opacity') { | ||
prop = 'filter'; | ||
} | ||
val = el.currentStyle[prop.replace(/\-(\w)/g, function (a, b) { | ||
return b.toUpperCase(); | ||
})]; | ||
if (prop === 'filter') { | ||
val = val.replace( | ||
/alpha\(opacity=([0-9]+)\)/, | ||
function (a, b) { | ||
return b / 100; | ||
} | ||
); | ||
} | ||
return val === '' ? 1 : val; | ||
}; | ||
@@ -230,3 +247,3 @@ this.adapterRun = function (elem, method) { | ||
elem.style.zoom = 1; | ||
return elem[alias] - 2 * parseInt(HighchartsAdapter._getStyle(elem, 'padding'), 10); | ||
return elem[alias] - 2 * parseInt(_getStyle(elem, 'padding'), 10); | ||
} | ||
@@ -268,3 +285,3 @@ }; | ||
if (!Array.prototype.filter) { | ||
this.grep = function (elements, callback) { | ||
this.grep = function (elements, fn) { | ||
var ret = [], | ||
@@ -275,3 +292,3 @@ i = 0, | ||
for (; i < length; i++) { | ||
if (!!callback(elements[i], i)) { | ||
if (!!fn(elements[i], i)) { | ||
ret.push(elements[i]); | ||
@@ -302,3 +319,4 @@ } | ||
elem = this.elem, | ||
elemelem = elem.element; // if destroyed, it is null | ||
elemelem = elem.element, | ||
prop; // if destroyed, it is null | ||
@@ -319,7 +337,9 @@ // Animation setter defined from outside | ||
// HTML styles | ||
// HTML styles, raw HTML content like container size | ||
} else { | ||
styles = {}; | ||
styles[this.prop] = this.now + this.unit; | ||
Highcharts.css(elem, styles); | ||
for (prop in styles) { | ||
elem.style[prop] = styles[prop]; | ||
} | ||
} | ||
@@ -418,2 +438,3 @@ | ||
name, | ||
key, | ||
PX = 'px'; | ||
@@ -433,3 +454,6 @@ | ||
opt.easing = Math[opt.easing] || Math.easeInOutSine; | ||
opt.curAnim = Highcharts.extend({}, prop); | ||
opt.curAnim = {}; | ||
for (key in prop) { | ||
opt.curAnim[key] = prop[key]; | ||
} | ||
@@ -452,3 +476,3 @@ for (name in prop) { | ||
} else { | ||
start = parseFloat(HighchartsAdapter._getStyle(el, name)) || 0; | ||
start = parseFloat(_getStyle(el, name)) || 0; | ||
if (name !== 'opacity') { | ||
@@ -471,9 +495,2 @@ unit = PX; | ||
/** | ||
* Internal method to return CSS value for given element and property | ||
*/ | ||
_getStyle: function (el, prop) { | ||
return window.getComputedStyle(el, undefined).getPropertyValue(prop); | ||
}, | ||
/** | ||
* Add an animation setter for a specific property | ||
@@ -514,3 +531,3 @@ */ | ||
adapterRun: function (elem, method) { | ||
return parseInt(HighchartsAdapter._getStyle(elem, method), 10); | ||
return parseInt(_getStyle(elem, method), 10); | ||
}, | ||
@@ -546,4 +563,4 @@ | ||
return { | ||
top: box.top + (window.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0), | ||
left: box.left + (window.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0) | ||
top: box.top + (win.pageYOffset || docElem.scrollTop) - (docElem.clientTop || 0), | ||
left: box.left + (win.pageXOffset || docElem.scrollLeft) - (docElem.clientLeft || 0) | ||
}; | ||
@@ -570,3 +587,4 @@ }, | ||
fireEvent: function (el, type, eventArguments, defaultFunction) { | ||
var e; | ||
var e, | ||
key; | ||
@@ -578,3 +596,5 @@ if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) { | ||
Highcharts.extend(e, eventArguments); | ||
for (key in eventArguments) { | ||
e[key] = eventArguments[key]; | ||
} | ||
@@ -632,2 +652,3 @@ if (el.dispatchEvent) { | ||
}; | ||
}()); | ||
return HighchartsAdapter; | ||
})); |
{ | ||
"name": "highstock", | ||
"version": "v2.1.9", | ||
"version": "v2.1.10", | ||
"main": [ | ||
@@ -5,0 +5,0 @@ "highstock.js", |
/* | ||
Highcharts JS v4.1.9 (2015-10-07) | ||
Highcharts JS v4.1.10 (2015-12-07) | ||
(c) 2009-2013 Torstein H?nsi | ||
3D features for Highcharts JS | ||
License: www.highcharts.com/license | ||
@license: www.highcharts.com/license | ||
*/ | ||
(function(d){function p(c,b,a){var e,g,f=b.options.chart.options3d,h=!1;a?(h=b.inverted,a=b.plotWidth/2,b=b.plotHeight/2,e=f.depth/2,g=z(f.depth,1)*z(f.viewDistance,0)):(a=b.plotLeft+b.plotWidth/2,b=b.plotTop+b.plotHeight/2,e=f.depth/2,g=z(f.depth,1)*z(f.viewDistance,0));var j=[],i=a,k=b,l=e,q=g,a=A*(h?f.beta:-f.beta),f=A*(h?-f.alpha:f.alpha),o=m(a),x=n(a),r=m(f),v=n(f),t,u,y,w,s,p;d.each(c,function(a){t=(h?a.y:a.x)-i;u=(h?a.x:a.y)-k;y=(a.z||0)-l;w=x*t-o*y;s=-o*r*t-x*r*y+v*u;p=o*v*t+x*v*y+r*u;q>0&& | ||
q<Number.POSITIVE_INFINITY&&(w*=q/(p+l+q),s*=q/(p+l+q));w+=i;s+=k;p+=l;j.push({x:h?s:w,y:h?w:s,z:p})});return j}function B(c){return c!==void 0&&c!==null}function F(c){var b=0,a,e;for(a=0;a<c.length;a++)e=(a+1)%c.length,b+=c[a].x*c[e].y-c[e].x*c[a].y;return b/2}function D(c){var b=0,a;for(a=0;a<c.length;a++)b+=c[a].z;return c.length?b/c.length:0}function s(c,b,a,e,g,f,d,j){var i=[];return f>g&&f-g>o/2+1.0E-4?(i=i.concat(s(c,b,a,e,g,g+o/2,d,j)),i=i.concat(s(c,b,a,e,g+o/2,f,d,j))):f<g&&g-f>o/2+1.0E-4? | ||
(i=i.concat(s(c,b,a,e,g,g-o/2,d,j)),i=i.concat(s(c,b,a,e,g-o/2,f,d,j))):(i=f-g,["C",c+a*n(g)-a*C*i*m(g)+d,b+e*m(g)+e*C*i*n(g)+j,c+a*n(f)+a*C*i*m(f)+d,b+e*m(f)-e*C*i*n(f)+j,c+a*n(f)+d,b+e*m(f)+j])}function G(c){if(this.chart.is3d()){var b=this.chart.options.plotOptions.column.grouping;if(b!==void 0&&!b&&this.group.zIndex!==void 0&&!this.zIndexSet)this.group.attr({zIndex:this.group.zIndex*10}),this.zIndexSet=!0;var a=this.options,e=this.options.states;this.borderWidth=a.borderWidth=B(a.edgeWidth)?a.edgeWidth: | ||
1;d.each(this.data,function(b){if(b.y!==null)b=b.pointAttr,this.borderColor=d.pick(a.edgeColor,b[""].fill),b[""].stroke=this.borderColor,b.hover.stroke=d.pick(e.hover.edgeColor,this.borderColor),b.select.stroke=d.pick(e.select.edgeColor,this.borderColor)})}c.apply(this,[].slice.call(arguments,1))}var o=Math.PI,A=o/180,m=Math.sin,n=Math.cos,z=d.pick,H=Math.round;d.perspective=p;var C=4*(Math.sqrt(2)-1)/3/(o/2);d.SVGRenderer.prototype.toLinePath=function(c,b){var a=[];d.each(c,function(b){a.push("L", | ||
b.x,b.y)});c.length&&(a[0]="M",b&&a.push("Z"));return a};d.SVGRenderer.prototype.cuboid=function(c){var b=this.g(),c=this.cuboidPath(c);b.front=this.path(c[0]).attr({zIndex:c[3],"stroke-linejoin":"round"}).add(b);b.top=this.path(c[1]).attr({zIndex:c[4],"stroke-linejoin":"round"}).add(b);b.side=this.path(c[2]).attr({zIndex:c[5],"stroke-linejoin":"round"}).add(b);b.fillSetter=function(a){var b=d.Color(a).brighten(0.1).get(),c=d.Color(a).brighten(-0.1).get();this.front.attr({fill:a});this.top.attr({fill:b}); | ||
this.side.attr({fill:c});this.color=a;return this};b.opacitySetter=function(a){this.front.attr({opacity:a});this.top.attr({opacity:a});this.side.attr({opacity:a});return this};b.attr=function(a){a.shapeArgs||B(a.x)?(a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0],zIndex:a[3]}),this.top.attr({d:a[1],zIndex:a[4]}),this.side.attr({d:a[2],zIndex:a[5]})):d.SVGElement.prototype.attr.call(this,a);return this};b.animate=function(a,b,c){B(a.x)&&B(a.y)?(a=this.renderer.cuboidPath(a),this.front.attr({zIndex:a[3]}).animate({d:a[0]}, | ||
b,c),this.top.attr({zIndex:a[4]}).animate({d:a[1]},b,c),this.side.attr({zIndex:a[5]}).animate({d:a[2]},b,c)):a.opacity?(this.front.animate(a,b,c),this.top.animate(a,b,c),this.side.animate(a,b,c)):d.SVGElement.prototype.animate.call(this,a,b,c);return this};b.destroy=function(){this.front.destroy();this.top.destroy();this.side.destroy();return null};b.attr({zIndex:-c[3]});return b};d.SVGRenderer.prototype.cuboidPath=function(c){var b=c.x,a=c.y,e=c.z,g=c.height,f=c.width,h=c.depth,j=d.map,i=[{x:b,y:a, | ||
z:e},{x:b+f,y:a,z:e},{x:b+f,y:a+g,z:e},{x:b,y:a+g,z:e},{x:b,y:a+g,z:e+h},{x:b+f,y:a+g,z:e+h},{x:b+f,y:a,z:e+h},{x:b,y:a,z:e+h}],i=p(i,d.charts[this.chartIndex],c.insidePlotArea),a=function(a,b){a=j(a,function(a){return i[a]});b=j(b,function(a){return i[a]});return F(a)<0?a:F(b)<0?b:[]},c=a([3,2,1,0],[7,6,5,4]),b=a([1,6,7,0],[4,5,2,3]),a=a([1,2,5,6],[0,7,4,3]);return[this.toLinePath(c,!0),this.toLinePath(b,!0),this.toLinePath(a,!0),D(c),D(b),D(a)]};d.SVGRenderer.prototype.arc3d=function(c){c.alpha*= | ||
A;c.beta*=A;var b=this.g(),a=this.arc3dPath(c),e=b.renderer,g=a.zTop*100;b.shapeArgs=c;b.top=e.path(a.top).setRadialReference(c.center).attr({zIndex:a.zTop}).add(b);b.side1=e.path(a.side2).attr({zIndex:a.zSide1});b.side2=e.path(a.side1).attr({zIndex:a.zSide2});b.inn=e.path(a.inn).attr({zIndex:a.zInn});b.out=e.path(a.out).attr({zIndex:a.zOut});b.fillSetter=function(a){this.color=a;var b=d.Color(a).brighten(-0.1).get();this.side1.attr({fill:b});this.side2.attr({fill:b});this.inn.attr({fill:b});this.out.attr({fill:b}); | ||
this.top.attr({fill:a});return this};b.translateXSetter=function(a){this.out.attr({translateX:a});this.inn.attr({translateX:a});this.side1.attr({translateX:a});this.side2.attr({translateX:a});this.top.attr({translateX:a})};b.translateYSetter=function(a){this.out.attr({translateY:a});this.inn.attr({translateY:a});this.side1.attr({translateY:a});this.side2.attr({translateY:a});this.top.attr({translateY:a})};b.animate=function(a,b,c){B(a.end)||B(a.start)?(this._shapeArgs=this.shapeArgs,d.SVGElement.prototype.animate.call(this, | ||
{_args:a},{duration:b,start:function(){var a=arguments[0].elem,b=a._shapeArgs;b.fill!==a.color&&a.attr({fill:b.fill})},step:function(){var a=arguments[1],b=a.elem,c=b._shapeArgs,e=a.end,a=a.pos,c=d.merge(c,{x:c.x+(e.x-c.x)*a,y:c.y+(e.y-c.y)*a,r:c.r+(e.r-c.r)*a,innerR:c.innerR+(e.innerR-c.innerR)*a,start:c.start+(e.start-c.start)*a,end:c.end+(e.end-c.end)*a}),e=b.renderer.arc3dPath(c);b.shapeArgs=c;b.top.attr({d:e.top,zIndex:e.zTop});b.inn.attr({d:e.inn,zIndex:e.zInn});b.out.attr({d:e.out,zIndex:e.zOut}); | ||
b.side1.attr({d:e.side1,zIndex:e.zSide1});b.side2.attr({d:e.side2,zIndex:e.zSide2})}},c)):d.SVGElement.prototype.animate.call(this,a,b,c);return this};b.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();d.SVGElement.prototype.destroy.call(this)};b.hide=function(){this.top.hide();this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};b.show=function(){this.top.show();this.out.show();this.inn.show();this.side1.show(); | ||
this.side2.show()};b.zIndex=g;b.attr({zIndex:g});return b};d.SVGRenderer.prototype.arc3dPath=function(c){function b(a){a%=2*o;a>o&&(a=2*o-a);return a}var a=c.x,e=c.y,d=c.start,f=c.end-1.0E-5,h=c.r,j=c.innerR,i=c.depth,k=c.alpha,l=c.beta,q=n(d),p=m(d),c=n(f),x=m(f),r=h*n(l);h*=n(k);var v=j*n(l),t=j*n(k),j=i*m(l),u=i*m(k),i=["M",a+r*q,e+h*p],i=i.concat(s(a,e,r,h,d,f,0,0)),i=i.concat(["L",a+v*c,e+t*x]),i=i.concat(s(a,e,v,t,f,d,0,0)),i=i.concat(["Z"]),y=l>0?o/2:0,l=k>0?0:o/2,y=d>-y?d:f>-y?-y:d,w=f<o- | ||
l?f:d<o-l?o-l:f,k=["M",a+r*n(y),e+h*m(y)],k=k.concat(s(a,e,r,h,y,w,0,0));f>o-l&&d<o-l&&(k=k.concat(["L",a+r*n(w)+j,e+h*m(w)+u]),k=k.concat(s(a,e,r,h,w,f,j,u)),k=k.concat(["L",a+r*n(f),e+h*m(f)]),k=k.concat(s(a,e,r,h,f,w,0,0)));k=k.concat(["L",a+r*n(w)+j,e+h*m(w)+u]);k=k.concat(s(a,e,r,h,w,y,j,u));k=k.concat(["Z"]);l=["M",a+v*q,e+t*p];l=l.concat(s(a,e,v,t,d,f,0,0));l=l.concat(["L",a+v*n(f)+j,e+t*m(f)+u]);l=l.concat(s(a,e,v,t,f,d,j,u));l=l.concat(["Z"]);q=["M",a+r*q,e+h*p,"L",a+r*q+j,e+h*p+u,"L",a+ | ||
v*q+j,e+t*p+u,"L",a+v*q,e+t*p,"Z"];a=["M",a+r*c,e+h*x,"L",a+r*c+j,e+h*x+u,"L",a+v*c+j,e+t*x+u,"L",a+v*c,e+t*x,"Z"];x=Math.atan2(u,-j);e=Math.abs(f+x);c=Math.abs(d+x);d=Math.abs((d+f)/2+x);e=b(e);c=b(c);d=b(d);d*=1E5;f=c*1E5;e*=1E5;return{top:i,zTop:o*1E5+1,out:k,zOut:Math.max(d,f,e),inn:l,zInn:Math.max(d,f,e),side1:q,zSide1:e*0.99,side2:a,zSide2:f*0.99}};d.Chart.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};d.wrap(d.Chart.prototype,"isInsidePlot", | ||
function(c){return this.is3d()?!0:c.apply(this,[].slice.call(arguments,1))});d.getOptions().chart.options3d={enabled:!1,alpha:0,beta:0,depth:100,viewDistance:25,frame:{bottom:{size:1,color:"rgba(255,255,255,0)"},side:{size:1,color:"rgba(255,255,255,0)"},back:{size:1,color:"rgba(255,255,255,0)"}}};d.wrap(d.Chart.prototype,"init",function(c){var b=[].slice.call(arguments,1),a;if(b[0].chart.options3d&&b[0].chart.options3d.enabled)b[0].chart.options3d.alpha=(b[0].chart.options3d.alpha||0)%360,b[0].chart.options3d.beta= | ||
(b[0].chart.options3d.beta||0)%360,a=b[0].plotOptions||{},a=a.pie||{},a.borderColor=d.pick(a.borderColor,void 0);c.apply(this,b)});d.wrap(d.Chart.prototype,"setChartSize",function(c){c.apply(this,[].slice.call(arguments,1));if(this.is3d()){var b=this.inverted,a=this.clipBox,e=this.margin;a[b?"y":"x"]=-(e[3]||0);a[b?"x":"y"]=-(e[0]||0);a[b?"height":"width"]=this.chartWidth+(e[3]||0)+(e[1]||0);a[b?"width":"height"]=this.chartHeight+(e[0]||0)+(e[2]||0)}});d.wrap(d.Chart.prototype,"redraw",function(c){if(this.is3d())this.isDirtyBox= | ||
!0;c.apply(this,[].slice.call(arguments,1))});d.wrap(d.Chart.prototype,"renderSeries",function(c){var b=this.series.length;if(this.is3d())for(;b--;)c=this.series[b],c.translate(),c.render();else c.call(this)});d.Chart.prototype.retrieveStacks=function(c){var b=this.series,a={},e,g=1;d.each(this.series,function(d){e=z(d.options.stack,c?0:b.length-1-d.index);a[e]?a[e].series.push(d):(a[e]={series:[d],position:g},g++)});a.totalStacks=g+1;return a};d.wrap(d.Axis.prototype,"setOptions",function(c,b){var a; | ||
c.call(this,b);if(this.chart.is3d())a=this.options,a.tickWidth=d.pick(a.tickWidth,0),a.gridLineWidth=d.pick(a.gridLineWidth,1)});d.wrap(d.Axis.prototype,"render",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.chart,a=b.renderer,e=b.options.chart.options3d,d=e.frame,f=d.bottom,h=d.back,d=d.side,j=e.depth,i=this.height,k=this.width,l=this.left,q=this.top;if(!this.isZAxis)this.horiz?(h={x:l,y:q+(b.xAxis[0].opposite?-f.size:i),z:0,width:k,height:f.size,depth:j,insidePlotArea:!1}, | ||
this.bottomFrame?this.bottomFrame.animate(h):this.bottomFrame=a.cuboid(h).attr({fill:f.color,zIndex:b.yAxis[0].reversed&&e.alpha>0?4:-1}).css({stroke:f.color}).add()):(e={x:l+(b.yAxis[0].opposite?0:-d.size),y:q+(b.xAxis[0].opposite?-f.size:0),z:j,width:k+d.size,height:i+f.size,depth:h.size,insidePlotArea:!1},this.backFrame?this.backFrame.animate(e):this.backFrame=a.cuboid(e).attr({fill:h.color,zIndex:-3}).css({stroke:h.color}).add(),b={x:l+(b.yAxis[0].opposite?k:-d.size),y:q+(b.xAxis[0].opposite? | ||
-f.size:0),z:0,width:d.size,height:i+f.size,depth:j,insidePlotArea:!1},this.sideFrame?this.sideFrame.animate(b):this.sideFrame=a.cuboid(b).attr({fill:d.color,zIndex:-2}).css({stroke:d.color}).add())}});d.wrap(d.Axis.prototype,"getPlotLinePath",function(c){var b=c.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d())return b;if(b===null)return b;var a=this.chart.options.chart.options3d,a=this.isZAxis?this.chart.plotWidth:a.depth,d=this.opposite;this.horiz&&(d=!d);b=[this.swapZ({x:b[1],y:b[2], | ||
z:d?a:0}),this.swapZ({x:b[1],y:b[2],z:a}),this.swapZ({x:b[4],y:b[5],z:a}),this.swapZ({x:b[4],y:b[5],z:d?0:a})];b=p(b,this.chart,!1);return b=this.chart.renderer.toLinePath(b,!1)});d.wrap(d.Axis.prototype,"getLinePath",function(c){return this.chart.is3d()?[]:c.apply(this,[].slice.call(arguments,1))});d.wrap(d.Axis.prototype,"getPlotBandPath",function(c){if(this.chart.is3d()){var b=arguments,a=b[1],b=this.getPlotLinePath(b[2]);(a=this.getPlotLinePath(a))&&b?a.push("L",b[10],b[11],"L",b[7],b[8],"L", | ||
b[4],b[5],"L",b[1],b[2]):a=null;return a}else return c.apply(this,[].slice.call(arguments,1))});d.wrap(d.Tick.prototype,"getMarkPath",function(c){var b=c.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return b;b=[this.axis.swapZ({x:b[1],y:b[2],z:0}),this.axis.swapZ({x:b[4],y:b[5],z:0})];b=p(b,this.axis.chart,!1);return b=["M",b[0].x,b[0].y,"L",b[1].x,b[1].y]});d.wrap(d.Tick.prototype,"getLabelPosition",function(c){var b=c.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return b; | ||
var a=p([this.axis.swapZ({x:b.x,y:b.y,z:0})],this.axis.chart,!1)[0];a.x-=!this.axis.horiz&&this.axis.opposite?this.axis.transA:0;a.old=b;return a});d.wrap(d.Tick.prototype,"handleOverflow",function(c,b){if(this.axis.chart.is3d())b=b.old;return c.call(this,b)});d.wrap(d.Axis.prototype,"getTitlePosition",function(c){var b=c.apply(this,[].slice.call(arguments,1));return!this.chart.is3d()?b:b=p([this.swapZ({x:b.x,y:b.y,z:0})],this.chart,!1)[0]});d.wrap(d.Axis.prototype,"drawCrosshair",function(c){var b= | ||
arguments;this.chart.is3d()&&b[2]&&(b[2]={plotX:b[2].plotXold||b[2].plotX,plotY:b[2].plotYold||b[2].plotY});c.apply(this,[].slice.call(b,1))});d.Axis.prototype.swapZ=function(c,b){if(this.isZAxis){var a=b?0:this.chart.plotLeft,d=this.chart;return{x:a+(d.yAxis[0].opposite?c.z:d.xAxis[0].width-c.z),y:c.y,z:c.x-a}}else return c};var E=d.ZAxis=function(){this.isZAxis=!0;this.init.apply(this,arguments)};d.extend(E.prototype,d.Axis.prototype);d.extend(E.prototype,{setOptions:function(c){c=d.merge({offset:0, | ||
lineWidth:0},c);d.Axis.prototype.setOptions.call(this,c);this.coll="zAxis"},setAxisSize:function(){d.Axis.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-this.width-this.left},getSeriesExtremes:function(){var c=this,b=c.chart;c.hasVisibleSeries=!1;c.dataMin=c.dataMax=c.ignoreMinPadding=c.ignoreMaxPadding=null;c.buildStacks&&c.buildStacks();d.each(c.series,function(a){if(a.visible||!b.options.chart.ignoreHiddenSeries)if(c.hasVisibleSeries= | ||
!0,a=a.zData,a.length)c.dataMin=Math.min(z(c.dataMin,a[0]),Math.min.apply(null,a)),c.dataMax=Math.max(z(c.dataMax,a[0]),Math.max.apply(null,a))})}});d.wrap(d.Chart.prototype,"getAxes",function(c){var b=this,a=this.options,a=a.zAxis=d.splat(a.zAxis||{});c.call(this);if(b.is3d())this.zAxis=[],d.each(a,function(a,c){a.index=c;a.isX=!0;(new E(b,a)).setScale()})});d.wrap(d.seriesTypes.column.prototype,"translate",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.chart, | ||
a=this.options,e=a.depth||25,g=(a.stacking?a.stack||0:this._i)*(e+(a.groupZPadding||1));a.grouping!==!1&&(g=0);g+=a.groupZPadding||1;d.each(this.data,function(a){if(a.y!==null){var c=a.shapeArgs,d=a.tooltipPos;a.shapeType="cuboid";c.z=g;c.depth=e;c.insidePlotArea=!0;d=p([{x:d[0],y:d[1],z:g}],b,!1)[0];a.tooltipPos=[d.x,d.y]}});this.z=g}});d.wrap(d.seriesTypes.column.prototype,"animate",function(c){if(this.chart.is3d()){var b=arguments[1],a=this.yAxis,e=this,g=this.yAxis.reversed;if(d.svg)b?d.each(e.data, | ||
function(b){if(b.y!==null&&(b.height=b.shapeArgs.height,b.shapey=b.shapeArgs.y,b.shapeArgs.height=1,!g))b.shapeArgs.y=b.stackY?b.plotY+a.translate(b.stackY):b.plotY+(b.negative?-b.height:b.height)}):(d.each(e.data,function(a){if(a.y!==null)a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,e.options.animation)}),this.drawDataLabels(),e.animate=null)}else c.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.column.prototype,"init",function(c){c.apply(this, | ||
[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.options,a=b.grouping,d=b.stacking,g=0;if(a===void 0||a){a=this.chart.retrieveStacks(d);d=b.stack||0;for(g=0;g<a[d].series.length;g++)if(a[d].series[g]===this)break;g=a.totalStacks*10-10*(a.totalStacks-a[d].position)-g}b.zIndex=g}});d.wrap(d.Series.prototype,"alignDataLabel",function(c){if(this.chart.is3d()&&(this.type==="column"||this.type==="columnrange")){var b=arguments[4],a={x:b.x,y:b.y,z:this.z},a=p([a],this.chart,!0)[0];b.x=a.x;b.y= | ||
a.y}c.apply(this,[].slice.call(arguments,1))});d.seriesTypes.columnrange&&d.wrap(d.seriesTypes.columnrange.prototype,"drawPoints",G);d.wrap(d.seriesTypes.column.prototype,"drawPoints",G);d.wrap(d.seriesTypes.pie.prototype,"translate",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this,a=b.chart,e=b.options,g=e.depth||0,f=a.options.chart.options3d,h={x:a.plotWidth/2,y:a.plotHeight/2,z:f.depth},j=f.alpha,i=f.beta,k=e.stacking?(e.stack||0)*g:b._i*g;k+=g/2;e.grouping!== | ||
!1&&(k=0);d.each(b.data,function(a){var c=a.shapeArgs;a.shapeType="arc3d";c.z=k;c.depth=g*0.75;c.origin=h;c.alpha=j;c.beta=i;c.center=b.center;c=(c.end+c.start)/2;a.slicedTranslation={translateX:H(n(c)*e.slicedOffset*n(j*A)),translateY:H(m(c)*e.slicedOffset*n(j*A))}})}});d.wrap(d.seriesTypes.pie.prototype.pointClass.prototype,"haloPath",function(c){var b=arguments;return this.series.chart.is3d()?[]:c.call(this,b[1])});d.wrap(d.seriesTypes.pie.prototype,"drawPoints",function(c){var b=this.group,a= | ||
this.options,e=a.states;if(this.chart.is3d())this.borderWidth=a.borderWidth=a.edgeWidth||1,this.borderColor=a.edgeColor=d.pick(a.edgeColor,a.borderColor,void 0),e.hover.borderColor=d.pick(e.hover.edgeColor,this.borderColor),e.hover.borderWidth=d.pick(e.hover.edgeWidth,this.borderWidth),e.select.borderColor=d.pick(e.select.edgeColor,this.borderColor),e.select.borderWidth=d.pick(e.select.edgeWidth,this.borderWidth),d.each(this.data,function(a){var b=a.pointAttr;b[""].stroke=a.series.borderColor||a.color; | ||
b[""]["stroke-width"]=a.series.borderWidth;b.hover.stroke=e.hover.borderColor;b.hover["stroke-width"]=e.hover.borderWidth;b.select.stroke=e.select.borderColor;b.select["stroke-width"]=e.select.borderWidth});c.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&d.each(this.points,function(a){var c=a.graphic;c.out.add(b);c.inn.add(b);c.side1.add(b);c.side2.add(b);c[a.y?"show":"hide"]()})});d.wrap(d.seriesTypes.pie.prototype,"drawDataLabels",function(c){if(this.chart.is3d()){var b=this;d.each(b.data, | ||
function(a){var c=a.shapeArgs,d=c.r,f=c.depth,h=(c.alpha||b.chart.options.chart.options3d.alpha)*A,c=(c.start+c.end)/2,a=a.labelPos;a[1]+=-d*(1-n(h))*m(c)+(m(c)>0?m(h)*f:0);a[3]+=-d*(1-n(h))*m(c)+(m(c)>0?m(h)*f:0);a[5]+=-d*(1-n(h))*m(c)+(m(c)>0?m(h)*f:0)})}c.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.pie.prototype,"addPoint",function(c){c.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});d.wrap(d.seriesTypes.pie.prototype,"animate",function(c){if(this.chart.is3d()){var b= | ||
arguments[1],a=this.options.animation,e=this.center,g=this.group,f=this.markerGroup;if(d.svg)if(a===!0&&(a={}),b){if(g.oldtranslateX=g.translateX,g.oldtranslateY=g.translateY,b={translateX:e[0],translateY:e[1],scaleX:0.001,scaleY:0.001},g.attr(b),f)f.attrSetters=g.attrSetters,f.attr(b)}else b={translateX:g.oldtranslateX,translateY:g.oldtranslateY,scaleX:1,scaleY:1},g.animate(b,a),f&&f.animate(b,a),this.animate=null}else c.apply(this,[].slice.call(arguments,1))});d.wrap(d.seriesTypes.scatter.prototype, | ||
"translate",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.chart,a=d.pick(this.zAxis,b.options.zAxis[0]),e=[],g,f,h;for(h=0;h<this.data.length;h++)g=this.data[h],f=a.isLog&&a.val2lin?a.val2lin(g.z):g.z,g.plotZ=a.translate(f),g.isInside=g.isInside?f>=a.min&&f<=a.max:!1,e.push({x:g.plotX,y:g.plotY,z:g.plotZ});b=p(e,b,!0);for(h=0;h<this.data.length;h++)g=this.data[h],a=b[h],g.plotXold=g.plotX,g.plotYold=g.plotY,g.plotX=a.x,g.plotY=a.y,g.plotZ=a.z}});d.wrap(d.seriesTypes.scatter.prototype, | ||
"init",function(c,b,a){if(b.is3d())this.axisTypes=["xAxis","yAxis","zAxis"],this.pointArrayMap=["x","y","z"],this.parallelArrays=["x","y","z"];c=c.apply(this,[b,a]);if(this.chart.is3d())this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>":"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>";return c});if(d.VMLRenderer)d.setOptions({animate:!1}),d.VMLRenderer.prototype.cuboid= | ||
d.SVGRenderer.prototype.cuboid,d.VMLRenderer.prototype.cuboidPath=d.SVGRenderer.prototype.cuboidPath,d.VMLRenderer.prototype.toLinePath=d.SVGRenderer.prototype.toLinePath,d.VMLRenderer.prototype.createElement3D=d.SVGRenderer.prototype.createElement3D,d.VMLRenderer.prototype.arc3d=function(c){c=d.SVGRenderer.prototype.arc3d.call(this,c);c.css({zIndex:c.zIndex});return c},d.VMLRenderer.prototype.arc3dPath=d.SVGRenderer.prototype.arc3dPath,d.wrap(d.Axis.prototype,"render",function(c){c.apply(this,[].slice.call(arguments, | ||
1));this.sideFrame&&(this.sideFrame.css({zIndex:0}),this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))})})(Highcharts); | ||
(function(c){typeof module==="object"&&module.exports?module.exports=c:c(Highcharts)})(function(c){function r(d,b,a){var e,g,f=b.options.chart.options3d,c=!1;a?(c=b.inverted,a=b.plotWidth/2,b=b.plotHeight/2,e=f.depth/2,g=u(f.depth,1)*u(f.viewDistance,0)):(a=b.plotLeft+b.plotWidth/2,b=b.plotTop+b.plotHeight/2,e=f.depth/2,g=u(f.depth,1)*u(f.viewDistance,0));var j=[],k=a,i=b,l=e,w=g,a=A*(c?f.beta:-f.beta),f=A*(c?-f.alpha:f.alpha),o=p(a),q=m(a),n=p(f),y=m(f),x,s,z,t,v,C;B(d,function(a){x=(c?a.y:a.x)- | ||
k;s=(c?a.x:a.y)-i;z=(a.z||0)-l;t=q*x-o*z;v=-o*n*x+y*s-q*n*z;C=o*y*x+n*s+q*y*z;w>0&&w<Number.POSITIVE_INFINITY&&(t*=w/(C+l+w),v*=w/(C+l+w));t+=k;v+=i;C+=l;j.push({x:c?v:t,y:c?t:v,z:C})});return j}function D(d){return d!==void 0&&d!==null}function I(d){var b=0,a,e;for(a=0;a<d.length;a++)e=(a+1)%d.length,b+=d[a].x*d[e].y-d[e].x*d[a].y;return b/2}function F(d){var b=0,a;for(a=0;a<d.length;a++)b+=d[a].z;return d.length?b/d.length:0}function q(d,b,a,e,c,f,h,j){var k=[];f>c&&f-c>o/2+1.0E-4?(k=k.concat(q(d, | ||
b,a,e,c,c+o/2,h,j)),k=k.concat(q(d,b,a,e,c+o/2,f,h,j))):f<c&&c-f>o/2+1.0E-4?(k=k.concat(q(d,b,a,e,c,c-o/2,h,j)),k=k.concat(q(d,b,a,e,c-o/2,f,h,j))):(k=f-c,k=["C",d+a*m(c)-a*E*k*p(c)+h,b+e*p(c)+e*E*k*m(c)+j,d+a*m(f)+a*E*k*p(f)+h,b+e*p(f)-e*E*k*m(f)+j,d+a*m(f)+h,b+e*p(f)+j]);return k}function J(d){if(this.chart.is3d()){var b=this.chart.options.plotOptions.column.grouping;if(b!==void 0&&!b&&this.group.zIndex!==void 0&&!this.zIndexSet)this.group.attr({zIndex:this.group.zIndex*10}),this.zIndexSet=!0;var a= | ||
this.options,e=this.options.states;this.borderWidth=a.borderWidth=D(a.edgeWidth)?a.edgeWidth:1;c.each(this.data,function(b){if(b.y!==null)b=b.pointAttr,this.borderColor=c.pick(a.edgeColor,b[""].fill),b[""].stroke=this.borderColor,b.hover.stroke=c.pick(e.hover.edgeColor,this.borderColor),b.select.stroke=c.pick(e.select.edgeColor,this.borderColor)})}d.apply(this,[].slice.call(arguments,1))}var B=c.each,M=c.extend,N=c.inArray,G=c.merge,u=c.pick,K=c.wrap,o=Math.PI,A=o/180,p=Math.sin,m=Math.cos,L=Math.round; | ||
c.perspective=r;var E=4*(Math.sqrt(2)-1)/3/(o/2);c.SVGRenderer.prototype.toLinePath=function(d,b){var a=[];c.each(d,function(b){a.push("L",b.x,b.y)});d.length&&(a[0]="M",b&&a.push("Z"));return a};c.SVGRenderer.prototype.cuboid=function(d){var b=this.g(),d=this.cuboidPath(d);b.front=this.path(d[0]).attr({zIndex:d[3],"stroke-linejoin":"round"}).add(b);b.top=this.path(d[1]).attr({zIndex:d[4],"stroke-linejoin":"round"}).add(b);b.side=this.path(d[2]).attr({zIndex:d[5],"stroke-linejoin":"round"}).add(b); | ||
b.fillSetter=function(a){var b=c.Color(a).brighten(0.1).get(),d=c.Color(a).brighten(-0.1).get();this.front.attr({fill:a});this.top.attr({fill:b});this.side.attr({fill:d});this.color=a;return this};b.opacitySetter=function(a){this.front.attr({opacity:a});this.top.attr({opacity:a});this.side.attr({opacity:a});return this};b.attr=function(a){a.shapeArgs||D(a.x)?(a=this.renderer.cuboidPath(a.shapeArgs||a),this.front.attr({d:a[0],zIndex:a[3]}),this.top.attr({d:a[1],zIndex:a[4]}),this.side.attr({d:a[2], | ||
zIndex:a[5]})):c.SVGElement.prototype.attr.call(this,a);return this};b.animate=function(a,b,d){D(a.x)&&D(a.y)?(a=this.renderer.cuboidPath(a),this.front.attr({zIndex:a[3]}).animate({d:a[0]},b,d),this.top.attr({zIndex:a[4]}).animate({d:a[1]},b,d),this.side.attr({zIndex:a[5]}).animate({d:a[2]},b,d)):a.opacity?(this.front.animate(a,b,d),this.top.animate(a,b,d),this.side.animate(a,b,d)):c.SVGElement.prototype.animate.call(this,a,b,d);return this};b.destroy=function(){this.front.destroy();this.top.destroy(); | ||
this.side.destroy();return null};b.attr({zIndex:-d[3]});return b};c.SVGRenderer.prototype.cuboidPath=function(d){function b(a){return i[a]}var a=d.x,e=d.y,g=d.z,f=d.height,h=d.width,j=d.depth,k=c.map,i=[{x:a,y:e,z:g},{x:a+h,y:e,z:g},{x:a+h,y:e+f,z:g},{x:a,y:e+f,z:g},{x:a,y:e+f,z:g+j},{x:a+h,y:e+f,z:g+j},{x:a+h,y:e,z:g+j},{x:a,y:e,z:g+j}],i=r(i,c.charts[this.chartIndex],d.insidePlotArea),e=function(a,d){a=k(a,b);d=k(d,b);return I(a)<0?a:I(d)<0?d:[]},d=e([3,2,1,0],[7,6,5,4]),a=e([1,6,7,0],[4,5,2,3]), | ||
e=e([1,2,5,6],[0,7,4,3]);return[this.toLinePath(d,!0),this.toLinePath(a,!0),this.toLinePath(e,!0),F(d),F(a),F(e)]};c.SVGRenderer.prototype.arc3d=function(d){function b(a){var b=!1,d={},e;for(e in a)N(e,g)!==-1&&(d[e]=a[e],delete a[e],b=!0);return b?d:!1}var a=this.g(),e=a.renderer,g="x,y,r,innerR,start,end".split(","),d=G(d);d.alpha*=A;d.beta*=A;a.top=e.path();a.side1=e.path();a.side2=e.path();a.inn=e.path();a.out=e.path();a.onAdd=function(){var b=a.parentGroup;a.top.add(a);a.out.add(b);a.inn.add(b); | ||
a.side1.add(b);a.side2.add(b)};a.setPaths=function(b){var d=a.renderer.arc3dPath(b),e=d.zTop*100;a.attribs=b;a.top.attr({d:d.top,zIndex:d.zTop});a.inn.attr({d:d.inn,zIndex:d.zInn});a.out.attr({d:d.out,zIndex:d.zOut});a.side1.attr({d:d.side1,zIndex:d.zSide1});a.side2.attr({d:d.side2,zIndex:d.zSide2});a.zIndex=e;a.attr({zIndex:e});b.center&&(a.top.setRadialReference(b.center),delete b.center)};a.setPaths(d);a.fillSetter=function(a){var b=c.Color(a).brighten(-0.1).get();this.fill=a;this.side1.attr({fill:b}); | ||
this.side2.attr({fill:b});this.inn.attr({fill:b});this.out.attr({fill:b});this.top.attr({fill:a});return this};B(["opacity","translateX","translateY","visibility"],function(b){a[b+"Setter"]=function(b,d){a[d]=b;B(["out","inn","side1","side2","top"],function(e){a[e].attr(d,b)})}});K(a,"attr",function(d,e,c){var g;if(typeof e==="object"&&(g=b(e)))M(a.attribs,g),a.setPaths(a.attribs);return d.call(this,e,c)});K(a,"animate",function(a,d,e,c){var g,l=this.attribs,m;delete d.center;delete d.z;delete d.depth; | ||
delete d.alpha;delete d.beta;if(e=u(e,this.renderer.globalAnimation))if(typeof e!=="object"&&(e={}),d=G(d),g=b(d))m=g,e.step=function(a,b){function d(a){return l[a]+(u(m[a],l[a])-l[a])*b.pos}b.elem.setPaths(G(l,{x:d("x"),y:d("y"),r:d("r"),innerR:d("innerR"),start:d("start"),end:d("end")}))};return a.call(this,d,e,c)});a.destroy=function(){this.top.destroy();this.out.destroy();this.inn.destroy();this.side1.destroy();this.side2.destroy();c.SVGElement.prototype.destroy.call(this)};a.hide=function(){this.top.hide(); | ||
this.out.hide();this.inn.hide();this.side1.hide();this.side2.hide()};a.show=function(){this.top.show();this.out.show();this.inn.show();this.side1.show();this.side2.show()};return a};c.SVGRenderer.prototype.arc3dPath=function(d){function b(a){a%=2*o;a>o&&(a=2*o-a);return a}var a=d.x,e=d.y,c=d.start,f=d.end-1.0E-5,h=d.r,j=d.innerR,k=d.depth,i=d.alpha,l=d.beta,w=m(c),u=p(c),d=m(f),r=p(f),n=h*m(l);h*=m(i);var y=j*m(l),x=j*m(i),j=k*p(l),s=k*p(i),k=["M",a+n*w,e+h*u],k=k.concat(q(a,e,n,h,c,f,0,0)),k=k.concat(["L", | ||
a+y*d,e+x*r]),k=k.concat(q(a,e,y,x,f,c,0,0)),k=k.concat(["Z"]),z=l>0?o/2:0,l=i>0?0:o/2,z=c>-z?c:f>-z?-z:c,t=f<o-l?f:c<o-l?o-l:f,v=2*o-l,i=["M",a+n*m(z),e+h*p(z)],i=i.concat(q(a,e,n,h,z,t,0,0));f>v&&c<v?(i=i.concat(["L",a+n*m(t)+j,e+h*p(t)+s]),i=i.concat(q(a,e,n,h,t,v,j,s)),i=i.concat(["L",a+n*m(v),e+h*p(v)]),i=i.concat(q(a,e,n,h,v,f,0,0)),i=i.concat(["L",a+n*m(f)+j,e+h*p(f)+s]),i=i.concat(q(a,e,n,h,f,v,j,s)),i=i.concat(["L",a+n*m(v),e+h*p(v)]),i=i.concat(q(a,e,n,h,v,t,0,0))):f>o-l&&c<o-l&&(i=i.concat(["L", | ||
a+n*m(t)+j,e+h*p(t)+s]),i=i.concat(q(a,e,n,h,t,f,j,s)),i=i.concat(["L",a+n*m(f),e+h*p(f)]),i=i.concat(q(a,e,n,h,f,t,0,0)));i=i.concat(["L",a+n*m(t)+j,e+h*p(t)+s]);i=i.concat(q(a,e,n,h,t,z,j,s));i=i.concat(["Z"]);l=["M",a+y*w,e+x*u];l=l.concat(q(a,e,y,x,c,f,0,0));l=l.concat(["L",a+y*m(f)+j,e+x*p(f)+s]);l=l.concat(q(a,e,y,x,f,c,j,s));l=l.concat(["Z"]);w=["M",a+n*w,e+h*u,"L",a+n*w+j,e+h*u+s,"L",a+y*w+j,e+x*u+s,"L",a+y*w,e+x*u,"Z"];a=["M",a+n*d,e+h*r,"L",a+n*d+j,e+h*r+s,"L",a+y*d+j,e+x*r+s,"L",a+y*d, | ||
e+x*r,"Z"];r=Math.atan2(s,-j);e=Math.abs(f+r);d=Math.abs(c+r);c=Math.abs((c+f)/2+r);e=b(e);d=b(d);c=b(c);c*=1E5;f=d*1E5;e*=1E5;return{top:k,zTop:o*1E5+1,out:i,zOut:Math.max(c,f,e),inn:l,zInn:Math.max(c,f,e),side1:w,zSide1:e*0.99,side2:a,zSide2:f*0.99}};c.Chart.prototype.is3d=function(){return this.options.chart.options3d&&this.options.chart.options3d.enabled};c.wrap(c.Chart.prototype,"isInsidePlot",function(d){return this.is3d()||d.apply(this,[].slice.call(arguments,1))});c.getOptions().chart.options3d= | ||
{enabled:!1,alpha:0,beta:0,depth:100,viewDistance:25,frame:{bottom:{size:1,color:"rgba(255,255,255,0)"},side:{size:1,color:"rgba(255,255,255,0)"},back:{size:1,color:"rgba(255,255,255,0)"}}};c.wrap(c.Chart.prototype,"init",function(d){var b=[].slice.call(arguments,1),a;if(b[0].chart.options3d&&b[0].chart.options3d.enabled)b[0].chart.options3d.alpha=(b[0].chart.options3d.alpha||0)%360,b[0].chart.options3d.beta=(b[0].chart.options3d.beta||0)%360,a=b[0].plotOptions||{},a=a.pie||{},a.borderColor=c.pick(a.borderColor, | ||
void 0);d.apply(this,b)});c.wrap(c.Chart.prototype,"setChartSize",function(d){d.apply(this,[].slice.call(arguments,1));if(this.is3d()){var b=this.inverted,a=this.clipBox,c=this.margin;a[b?"y":"x"]=-(c[3]||0);a[b?"x":"y"]=-(c[0]||0);a[b?"height":"width"]=this.chartWidth+(c[3]||0)+(c[1]||0);a[b?"width":"height"]=this.chartHeight+(c[0]||0)+(c[2]||0)}});c.wrap(c.Chart.prototype,"redraw",function(d){if(this.is3d())this.isDirtyBox=!0;d.apply(this,[].slice.call(arguments,1))});c.wrap(c.Chart.prototype,"renderSeries", | ||
function(d){var b=this.series.length;if(this.is3d())for(;b--;)d=this.series[b],d.translate(),d.render();else d.call(this)});c.Chart.prototype.retrieveStacks=function(d){var b=this.series,a={},e,g=1;c.each(this.series,function(c){e=u(c.options.stack,d?0:b.length-1-c.index);a[e]?a[e].series.push(c):(a[e]={series:[c],position:g},g++)});a.totalStacks=g+1;return a};c.wrap(c.Axis.prototype,"setOptions",function(d,b){var a;d.call(this,b);if(this.chart.is3d())a=this.options,a.tickWidth=c.pick(a.tickWidth, | ||
0),a.gridLineWidth=c.pick(a.gridLineWidth,1)});c.wrap(c.Axis.prototype,"render",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.chart,a=b.renderer,c=b.options.chart.options3d,g=c.frame,f=g.bottom,h=g.back,g=g.side,j=c.depth,k=this.height,i=this.width,l=this.left,m=this.top;if(!this.isZAxis)this.horiz?(h={x:l,y:m+(b.xAxis[0].opposite?-f.size:k),z:0,width:i,height:f.size,depth:j,insidePlotArea:!1},this.bottomFrame?this.bottomFrame.animate(h):this.bottomFrame=a.cuboid(h).attr({fill:f.color, | ||
zIndex:b.yAxis[0].reversed&&c.alpha>0?4:-1}).css({stroke:f.color}).add()):(c={x:l+(b.yAxis[0].opposite?0:-g.size),y:m+(b.xAxis[0].opposite?-f.size:0),z:j,width:i+g.size,height:k+f.size,depth:h.size,insidePlotArea:!1},this.backFrame?this.backFrame.animate(c):this.backFrame=a.cuboid(c).attr({fill:h.color,zIndex:-3}).css({stroke:h.color}).add(),b={x:l+(b.yAxis[0].opposite?i:-g.size),y:m+(b.xAxis[0].opposite?-f.size:0),z:0,width:g.size,height:k+f.size,depth:j,insidePlotArea:!1},this.sideFrame?this.sideFrame.animate(b): | ||
this.sideFrame=a.cuboid(b).attr({fill:g.color,zIndex:-2}).css({stroke:g.color}).add())}});c.wrap(c.Axis.prototype,"getPlotLinePath",function(d){var b=d.apply(this,[].slice.call(arguments,1));if(!this.chart.is3d())return b;if(b===null)return b;var a=this.chart,c=a.options.chart.options3d,a=this.isZAxis?a.plotWidth:c.depth,c=this.opposite;this.horiz&&(c=!c);b=[this.swapZ({x:b[1],y:b[2],z:c?a:0}),this.swapZ({x:b[1],y:b[2],z:a}),this.swapZ({x:b[4],y:b[5],z:a}),this.swapZ({x:b[4],y:b[5],z:c?0:a})];b=r(b, | ||
this.chart,!1);return b=this.chart.renderer.toLinePath(b,!1)});c.wrap(c.Axis.prototype,"getLinePath",function(d){return this.chart.is3d()?[]:d.apply(this,[].slice.call(arguments,1))});c.wrap(c.Axis.prototype,"getPlotBandPath",function(d){if(!this.chart.is3d())return d.apply(this,[].slice.call(arguments,1));var b=arguments,a=b[1],b=this.getPlotLinePath(b[2]);(a=this.getPlotLinePath(a))&&b?a.push("L",b[10],b[11],"L",b[7],b[8],"L",b[4],b[5],"L",b[1],b[2]):a=null;return a});c.wrap(c.Tick.prototype,"getMarkPath", | ||
function(d){var b=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return b;b=[this.axis.swapZ({x:b[1],y:b[2],z:0}),this.axis.swapZ({x:b[4],y:b[5],z:0})];b=r(b,this.axis.chart,!1);return b=["M",b[0].x,b[0].y,"L",b[1].x,b[1].y]});c.wrap(c.Tick.prototype,"getLabelPosition",function(d){var b=d.apply(this,[].slice.call(arguments,1));if(!this.axis.chart.is3d())return b;var a=r([this.axis.swapZ({x:b.x,y:b.y,z:0})],this.axis.chart,!1)[0];a.x-=!this.axis.horiz&&this.axis.opposite?this.axis.transA: | ||
0;a.old=b;return a});c.wrap(c.Tick.prototype,"handleOverflow",function(d,b){if(this.axis.chart.is3d())b=b.old;return d.call(this,b)});c.wrap(c.Axis.prototype,"getTitlePosition",function(d){var b=this.chart.is3d(),a,c;if(b)c=this.axisTitleMargin,this.axisTitleMargin=0;a=d.apply(this,[].slice.call(arguments,1));if(b)a=r([this.swapZ({x:a.x,y:a.y,z:0})],this.chart,!1)[0],a[this.horiz?"y":"x"]+=(this.horiz?1:-1)*(this.opposite?-1:1)*c,this.axisTitleMargin=c;return a});c.wrap(c.Axis.prototype,"drawCrosshair", | ||
function(d){var b=arguments;this.chart.is3d()&&b[2]&&(b[2]={plotX:b[2].plotXold||b[2].plotX,plotY:b[2].plotYold||b[2].plotY});d.apply(this,[].slice.call(b,1))});c.Axis.prototype.swapZ=function(d,b){if(this.isZAxis){var a=b?0:this.chart.plotLeft,c=this.chart;return{x:a+(c.yAxis[0].opposite?d.z:c.xAxis[0].width-d.z),y:d.y,z:d.x-a}}return d};var H=c.ZAxis=function(){this.isZAxis=!0;this.init.apply(this,arguments)};c.extend(H.prototype,c.Axis.prototype);c.extend(H.prototype,{setOptions:function(d){d= | ||
c.merge({offset:0,lineWidth:0},d);c.Axis.prototype.setOptions.call(this,d);this.coll="zAxis"},setAxisSize:function(){c.Axis.prototype.setAxisSize.call(this);this.width=this.len=this.chart.options.chart.options3d.depth;this.right=this.chart.chartWidth-this.width-this.left},getSeriesExtremes:function(){var d=this,b=d.chart;d.hasVisibleSeries=!1;d.dataMin=d.dataMax=d.ignoreMinPadding=d.ignoreMaxPadding=null;d.buildStacks&&d.buildStacks();c.each(d.series,function(a){if(a.visible||!b.options.chart.ignoreHiddenSeries)if(d.hasVisibleSeries= | ||
!0,a=a.zData,a.length)d.dataMin=Math.min(u(d.dataMin,a[0]),Math.min.apply(null,a)),d.dataMax=Math.max(u(d.dataMax,a[0]),Math.max.apply(null,a))})}});c.wrap(c.Chart.prototype,"getAxes",function(d){var b=this,a=this.options,a=a.zAxis=c.splat(a.zAxis||{});d.call(this);if(b.is3d())this.zAxis=[],c.each(a,function(a,d){a.index=d;a.isX=!0;(new H(b,a)).setScale()})});c.wrap(c.seriesTypes.column.prototype,"translate",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.chart, | ||
a=this.options,e=a.depth||25,g=(a.stacking?a.stack||0:this._i)*(e+(a.groupZPadding||1));a.grouping!==!1&&(g=0);g+=a.groupZPadding||1;c.each(this.data,function(a){if(a.y!==null){var d=a.shapeArgs,c=a.tooltipPos;a.shapeType="cuboid";d.z=g;d.depth=e;d.insidePlotArea=!0;c=r([{x:c[0],y:c[1],z:g}],b,!1)[0];a.tooltipPos=[c.x,c.y]}});this.z=g}});c.wrap(c.seriesTypes.column.prototype,"animate",function(d){if(this.chart.is3d()){var b=arguments[1],a=this.yAxis,e=this,g=this.yAxis.reversed;if(c.svg)b?c.each(e.data, | ||
function(b){if(b.y!==null&&(b.height=b.shapeArgs.height,b.shapey=b.shapeArgs.y,b.shapeArgs.height=1,!g))b.shapeArgs.y=b.stackY?b.plotY+a.translate(b.stackY):b.plotY+(b.negative?-b.height:b.height)}):(c.each(e.data,function(a){if(a.y!==null)a.shapeArgs.height=a.height,a.shapeArgs.y=a.shapey,a.graphic&&a.graphic.animate(a.shapeArgs,e.options.animation)}),this.drawDataLabels(),e.animate=null)}else d.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.column.prototype,"init",function(d){d.apply(this, | ||
[].slice.call(arguments,1));if(this.chart.is3d()){var b=this.options,a=b.grouping,c=b.stacking,g=u(this.yAxis.options.reversedStacks,!0),f=0;if(a===void 0||a){a=this.chart.retrieveStacks(c);f=b.stack||0;for(c=0;c<a[f].series.length;c++)if(a[f].series[c]===this)break;f=10*(a.totalStacks-a[f].position)+(g?c:-c);this.xAxis.reversed||(f=a.totalStacks*10-f)}b.zIndex=f}});c.wrap(c.Series.prototype,"alignDataLabel",function(c){if(this.chart.is3d()&&(this.type==="column"||this.type==="columnrange")){var b= | ||
arguments[4],a={x:b.x,y:b.y,z:this.z},a=r([a],this.chart,!0)[0];b.x=a.x;b.y=a.y}c.apply(this,[].slice.call(arguments,1))});c.seriesTypes.columnrange&&c.wrap(c.seriesTypes.columnrange.prototype,"drawPoints",J);c.wrap(c.seriesTypes.column.prototype,"drawPoints",J);c.wrap(c.seriesTypes.pie.prototype,"translate",function(c){c.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b=this,a=b.options,e=a.depth||0,g=b.chart.options.chart.options3d,f=g.alpha,h=g.beta,j=a.stacking?(a.stack||0)*e: | ||
b._i*e;j+=e/2;a.grouping!==!1&&(j=0);B(b.data,function(c){var d=c.shapeArgs;c.shapeType="arc3d";d.z=j;d.depth=e*0.75;d.alpha=f;d.beta=h;d.center=b.center;d=(d.end+d.start)/2;c.slicedTranslation={translateX:L(m(d)*a.slicedOffset*m(f*A)),translateY:L(p(d)*a.slicedOffset*m(f*A))}})}});c.wrap(c.seriesTypes.pie.prototype.pointClass.prototype,"haloPath",function(c){var b=arguments;return this.series.chart.is3d()?[]:c.call(this,b[1])});c.wrap(c.seriesTypes.pie.prototype,"drawPoints",function(d){var b=this.options, | ||
a=b.states;if(this.chart.is3d())this.borderWidth=b.borderWidth=b.edgeWidth||1,this.borderColor=b.edgeColor=c.pick(b.edgeColor,b.borderColor,void 0),a.hover.borderColor=c.pick(a.hover.edgeColor,this.borderColor),a.hover.borderWidth=c.pick(a.hover.edgeWidth,this.borderWidth),a.select.borderColor=c.pick(a.select.edgeColor,this.borderColor),a.select.borderWidth=c.pick(a.select.edgeWidth,this.borderWidth),B(this.data,function(b){var c=b.pointAttr;c[""].stroke=b.series.borderColor||b.color;c[""]["stroke-width"]= | ||
b.series.borderWidth;c.hover.stroke=a.hover.borderColor;c.hover["stroke-width"]=a.hover.borderWidth;c.select.stroke=a.select.borderColor;c.select["stroke-width"]=a.select.borderWidth});d.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&B(this.points,function(a){var b=a.graphic;if(b)b[a.y?"show":"hide"]()})});c.wrap(c.seriesTypes.pie.prototype,"drawDataLabels",function(c){if(this.chart.is3d()){var b=this.chart.options.chart.options3d;B(this.data,function(a){var c=a.shapeArgs,d=c.r,f=(c.beta|| | ||
b.beta)*A,h=(c.start+c.end)/2,j=a.labelPos,k=-d*(1-m((c.alpha||b.alpha)*A))*p(h),i=d*(m(f)-1)*m(h);B([0,2,4],function(a){j[a]+=i;j[a+1]+=k})})}c.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.pie.prototype,"addPoint",function(c){c.apply(this,[].slice.call(arguments,1));this.chart.is3d()&&this.update(this.userOptions,!0)});c.wrap(c.seriesTypes.pie.prototype,"animate",function(d){if(this.chart.is3d()){var b=arguments[1],a=this.options.animation,e=this.center,g=this.group,f=this.markerGroup; | ||
if(c.svg)if(a===!0&&(a={}),b){if(g.oldtranslateX=g.translateX,g.oldtranslateY=g.translateY,b={translateX:e[0],translateY:e[1],scaleX:0.001,scaleY:0.001},g.attr(b),f)f.attrSetters=g.attrSetters,f.attr(b)}else b={translateX:g.oldtranslateX,translateY:g.oldtranslateY,scaleX:1,scaleY:1},g.animate(b,a),f&&f.animate(b,a),this.animate=null}else d.apply(this,[].slice.call(arguments,1))});c.wrap(c.seriesTypes.scatter.prototype,"translate",function(d){d.apply(this,[].slice.call(arguments,1));if(this.chart.is3d()){var b= | ||
this.chart,a=c.pick(this.zAxis,b.options.zAxis[0]),e=[],g,f,h;for(h=0;h<this.data.length;h++)g=this.data[h],f=a.isLog&&a.val2lin?a.val2lin(g.z):g.z,g.plotZ=a.translate(f),g.isInside=g.isInside?f>=a.min&&f<=a.max:!1,e.push({x:g.plotX,y:g.plotY,z:g.plotZ});b=r(e,b,!0);for(h=0;h<this.data.length;h++)g=this.data[h],a=b[h],g.plotXold=g.plotX,g.plotYold=g.plotY,g.plotX=a.x,g.plotY=a.y,g.plotZ=a.z}});c.wrap(c.seriesTypes.scatter.prototype,"init",function(c,b,a){if(b.is3d())this.axisTypes=["xAxis","yAxis", | ||
"zAxis"],this.pointArrayMap=["x","y","z"],this.parallelArrays=["x","y","z"];c=c.apply(this,[b,a]);if(this.chart.is3d())this.tooltipOptions.pointFormat=this.userOptions.tooltip?this.userOptions.tooltip.pointFormat||"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>":"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>";return c});if(c.VMLRenderer)c.setOptions({animate:!1}),c.VMLRenderer.prototype.cuboid=c.SVGRenderer.prototype.cuboid,c.VMLRenderer.prototype.cuboidPath= | ||
c.SVGRenderer.prototype.cuboidPath,c.VMLRenderer.prototype.toLinePath=c.SVGRenderer.prototype.toLinePath,c.VMLRenderer.prototype.createElement3D=c.SVGRenderer.prototype.createElement3D,c.VMLRenderer.prototype.arc3d=function(d){d=c.SVGRenderer.prototype.arc3d.call(this,d);d.css({zIndex:d.zIndex});return d},c.VMLRenderer.prototype.arc3dPath=c.SVGRenderer.prototype.arc3dPath,c.wrap(c.Axis.prototype,"render",function(c){c.apply(this,[].slice.call(arguments,1));this.sideFrame&&(this.sideFrame.css({zIndex:0}), | ||
this.sideFrame.front.attr({fill:this.sideFrame.color}));this.bottomFrame&&(this.bottomFrame.css({zIndex:1}),this.bottomFrame.front.attr({fill:this.bottomFrame.color}));this.backFrame&&(this.backFrame.css({zIndex:0}),this.backFrame.front.attr({fill:this.backFrame.color}))})}); |
@@ -5,1567 +5,1708 @@ // ==ClosureCompiler== | ||
/** | ||
* @license Highcharts JS v4.1.9 (2015-10-07) | ||
* @license Highcharts JS v4.1.10 (2015-12-07) | ||
* | ||
* (c) 2009-2013 Torstein Hønsi | ||
* 3D features for Highcharts JS | ||
* | ||
* License: www.highcharts.com/license | ||
* @license: www.highcharts.com/license | ||
*/ | ||
// JSLint options: | ||
/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */ | ||
(function (Highcharts) { | ||
/** | ||
Shorthands for often used function | ||
*/ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
/** | ||
* Mathematical Functionility | ||
*/ | ||
var PI = Math.PI, | ||
deg2rad = (PI / 180), // degrees to radians | ||
sin = Math.sin, | ||
cos = Math.cos, | ||
pick = Highcharts.pick, | ||
round = Math.round; | ||
Shorthands for often used function | ||
*/ | ||
var each = Highcharts.each, | ||
extend = Highcharts.extend, | ||
inArray = Highcharts.inArray, | ||
merge = Highcharts.merge, | ||
pick = Highcharts.pick, | ||
wrap = Highcharts.wrap; | ||
/** | ||
* Mathematical Functionility | ||
*/ | ||
var PI = Math.PI, | ||
deg2rad = (PI / 180), // degrees to radians | ||
sin = Math.sin, | ||
cos = Math.cos, | ||
round = Math.round; | ||
/** | ||
* Transforms a given array of points according to the angles in chart.options. | ||
* Parameters: | ||
* - points: the array of points | ||
* - chart: the chart | ||
* - insidePlotArea: wether to verifiy the points are inside the plotArea | ||
* Returns: | ||
* - an array of transformed points | ||
*/ | ||
function perspective(points, chart, insidePlotArea) { | ||
var options3d = chart.options.chart.options3d, | ||
inverted = false, | ||
origin; | ||
/** | ||
* Transforms a given array of points according to the angles in chart.options. | ||
* Parameters: | ||
* - points: the array of points | ||
* - chart: the chart | ||
* - insidePlotArea: wether to verifiy the points are inside the plotArea | ||
* Returns: | ||
* - an array of transformed points | ||
*/ | ||
function perspective(points, chart, insidePlotArea) { | ||
var options3d = chart.options.chart.options3d, | ||
inverted = false, | ||
origin; | ||
if (insidePlotArea) { | ||
inverted = chart.inverted; | ||
origin = { | ||
x: chart.plotWidth / 2, | ||
y: chart.plotHeight / 2, | ||
z: options3d.depth / 2, | ||
vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) | ||
}; | ||
} else { | ||
origin = { | ||
x: chart.plotLeft + (chart.plotWidth / 2), | ||
y: chart.plotTop + (chart.plotHeight / 2), | ||
z: options3d.depth / 2, | ||
vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) | ||
}; | ||
} | ||
if (insidePlotArea) { | ||
inverted = chart.inverted; | ||
origin = { | ||
x: chart.plotWidth / 2, | ||
y: chart.plotHeight / 2, | ||
z: options3d.depth / 2, | ||
vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) | ||
}; | ||
} else { | ||
origin = { | ||
x: chart.plotLeft + (chart.plotWidth / 2), | ||
y: chart.plotTop + (chart.plotHeight / 2), | ||
z: options3d.depth / 2, | ||
vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0) | ||
}; | ||
} | ||
var result = [], | ||
xe = origin.x, | ||
ye = origin.y, | ||
ze = origin.z, | ||
vd = origin.vd, | ||
angle1 = deg2rad * (inverted ? options3d.beta : -options3d.beta), | ||
angle2 = deg2rad * (inverted ? -options3d.alpha : options3d.alpha), | ||
s1 = sin(angle1), | ||
c1 = cos(angle1), | ||
s2 = sin(angle2), | ||
c2 = cos(angle2); | ||
var result = [], | ||
xe = origin.x, | ||
ye = origin.y, | ||
ze = origin.z, | ||
vd = origin.vd, | ||
angle1 = deg2rad * (inverted ? options3d.beta : -options3d.beta), | ||
angle2 = deg2rad * (inverted ? -options3d.alpha : options3d.alpha), | ||
s1 = sin(angle1), | ||
c1 = cos(angle1), | ||
s2 = sin(angle2), | ||
c2 = cos(angle2); | ||
var x, y, z, px, py, pz; | ||
var x, y, z, px, py, pz; | ||
// Transform each point | ||
Highcharts.each(points, function (point) { | ||
x = (inverted ? point.y : point.x) - xe; | ||
y = (inverted ? point.x : point.y) - ye; | ||
z = (point.z || 0) - ze; | ||
// Transform each point | ||
each(points, function (point) { | ||
x = (inverted ? point.y : point.x) - xe; | ||
y = (inverted ? point.x : point.y) - ye; | ||
z = (point.z || 0) - ze; | ||
//Apply 3-D rotation | ||
px = c1 * x - s1 * z; | ||
py = -s1 * s2 * x - c1 * s2 * z + c2 * y; | ||
pz = s1 * c2 * x + c1 * c2 * z + s2 * y; | ||
// Apply 3-D rotation | ||
// Euler Angles (XYZ): cosA = cos(Alfa|Roll), cosB = cos(Beta|Pitch), cosG = cos(Gamma|Yaw) | ||
// | ||
// Composite rotation: | ||
// | cosB * cosG | cosB * sinG | -sinB | | ||
// | sinA * sinB * cosG - cosA * sinG | sinA * sinB * sinG + cosA * cosG | sinA * cosB | | ||
// | cosA * sinB * cosG + sinA * sinG | cosA * sinB * sinG - sinA * cosG | cosA * cosB | | ||
// | ||
// Now, Gamma/Yaw is not used (angle=0), so we assume cosG = 1 and sinG = 0, so we get: | ||
// | cosB | 0 | - sinB | | ||
// | sinA * sinB | cosA | sinA * cosB | | ||
// | cosA * sinB | - sinA | cosA * cosB | | ||
// | ||
// But in browsers, y is reversed, so we get sinA => -sinA. The general result is: | ||
// | cosB | 0 | - sinB | | x | | px | | ||
// | - sinA * sinB | cosA | - sinA * cosB | x | y | = | py | | ||
// | cosA * sinB | sinA | cosA * cosB | | z | | pz | | ||
// | ||
// Result: | ||
px = c1 * x - s1 * z; | ||
py = -s1 * s2 * x + c2 * y - c1 * s2 * z; | ||
pz = s1 * c2 * x + s2 * y + c1 * c2 * z; | ||
//Apply perspective | ||
if ((vd > 0) && (vd < Number.POSITIVE_INFINITY)) { | ||
px = px * (vd / (pz + ze + vd)); | ||
py = py * (vd / (pz + ze + vd)); | ||
} | ||
//Apply translation | ||
px = px + xe; | ||
py = py + ye; | ||
pz = pz + ze; | ||
// Apply perspective | ||
if ((vd > 0) && (vd < Number.POSITIVE_INFINITY)) { | ||
px = px * (vd / (pz + ze + vd)); | ||
py = py * (vd / (pz + ze + vd)); | ||
} | ||
result.push({ | ||
x: (inverted ? py : px), | ||
y: (inverted ? px : py), | ||
z: pz | ||
}); | ||
}); | ||
return result; | ||
} | ||
// Make function acessible to plugins | ||
Highcharts.perspective = perspective; | ||
/*** | ||
EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES | ||
***/ | ||
////// HELPER METHODS ////// | ||
var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2); | ||
//Apply translation | ||
px = px + xe; | ||
py = py + ye; | ||
pz = pz + ze; | ||
function defined(obj) { | ||
return obj !== undefined && obj !== null; | ||
} | ||
result.push({ | ||
x: (inverted ? py : px), | ||
y: (inverted ? px : py), | ||
z: pz | ||
}); | ||
}); | ||
return result; | ||
} | ||
// Make function acessible to plugins | ||
Highcharts.perspective = perspective; | ||
/*** | ||
EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES | ||
***/ | ||
////// HELPER METHODS ////// | ||
//Shoelace algorithm -- http://en.wikipedia.org/wiki/Shoelace_formula | ||
function shapeArea(vertexes) { | ||
var area = 0, | ||
i, | ||
j; | ||
for (i = 0; i < vertexes.length; i++) { | ||
j = (i + 1) % vertexes.length; | ||
area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y; | ||
} | ||
return area / 2; | ||
} | ||
var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2); | ||
function averageZ(vertexes) { | ||
var z = 0, | ||
i; | ||
for (i = 0; i < vertexes.length; i++) { | ||
z += vertexes[i].z; | ||
} | ||
return vertexes.length ? z / vertexes.length : 0; | ||
} | ||
function defined(obj) { | ||
return obj !== undefined && obj !== null; | ||
} | ||
/** Method to construct a curved path | ||
* Can 'wrap' around more then 180 degrees | ||
*/ | ||
function curveTo(cx, cy, rx, ry, start, end, dx, dy) { | ||
var result = []; | ||
if ((end > start) && (end - start > PI / 2 + 0.0001)) { | ||
result = result.concat(curveTo(cx, cy, rx, ry, start, start + (PI / 2), dx, dy)); | ||
result = result.concat(curveTo(cx, cy, rx, ry, start + (PI / 2), end, dx, dy)); | ||
return result; | ||
} else if ((end < start) && (start - end > PI / 2 + 0.0001)) { | ||
result = result.concat(curveTo(cx, cy, rx, ry, start, start - (PI / 2), dx, dy)); | ||
result = result.concat(curveTo(cx, cy, rx, ry, start - (PI / 2), end, dx, dy)); | ||
return result; | ||
} else { | ||
var arcAngle = end - start; | ||
return [ | ||
'C', | ||
cx + (rx * cos(start)) - ((rx * dFactor * arcAngle) * sin(start)) + dx, | ||
cy + (ry * sin(start)) + ((ry * dFactor * arcAngle) * cos(start)) + dy, | ||
cx + (rx * cos(end)) + ((rx * dFactor * arcAngle) * sin(end)) + dx, | ||
cy + (ry * sin(end)) - ((ry * dFactor * arcAngle) * cos(end)) + dy, | ||
//Shoelace algorithm -- http://en.wikipedia.org/wiki/Shoelace_formula | ||
function shapeArea(vertexes) { | ||
var area = 0, | ||
i, | ||
j; | ||
for (i = 0; i < vertexes.length; i++) { | ||
j = (i + 1) % vertexes.length; | ||
area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y; | ||
} | ||
return area / 2; | ||
} | ||
cx + (rx * cos(end)) + dx, | ||
cy + (ry * sin(end)) + dy | ||
]; | ||
} | ||
} | ||
function averageZ(vertexes) { | ||
var z = 0, | ||
i; | ||
for (i = 0; i < vertexes.length; i++) { | ||
z += vertexes[i].z; | ||
} | ||
return vertexes.length ? z / vertexes.length : 0; | ||
} | ||
Highcharts.SVGRenderer.prototype.toLinePath = function (points, closed) { | ||
var result = []; | ||
/** Method to construct a curved path | ||
* Can 'wrap' around more then 180 degrees | ||
*/ | ||
function curveTo(cx, cy, rx, ry, start, end, dx, dy) { | ||
var result = []; | ||
if ((end > start) && (end - start > PI / 2 + 0.0001)) { | ||
result = result.concat(curveTo(cx, cy, rx, ry, start, start + (PI / 2), dx, dy)); | ||
result = result.concat(curveTo(cx, cy, rx, ry, start + (PI / 2), end, dx, dy)); | ||
} else if ((end < start) && (start - end > PI / 2 + 0.0001)) { | ||
result = result.concat(curveTo(cx, cy, rx, ry, start, start - (PI / 2), dx, dy)); | ||
result = result.concat(curveTo(cx, cy, rx, ry, start - (PI / 2), end, dx, dy)); | ||
} else { | ||
var arcAngle = end - start; | ||
result = [ | ||
'C', | ||
cx + (rx * cos(start)) - ((rx * dFactor * arcAngle) * sin(start)) + dx, | ||
cy + (ry * sin(start)) + ((ry * dFactor * arcAngle) * cos(start)) + dy, | ||
cx + (rx * cos(end)) + ((rx * dFactor * arcAngle) * sin(end)) + dx, | ||
cy + (ry * sin(end)) - ((ry * dFactor * arcAngle) * cos(end)) + dy, | ||
// Put "L x y" for each point | ||
Highcharts.each(points, function (point) { | ||
result.push('L', point.x, point.y); | ||
}); | ||
cx + (rx * cos(end)) + dx, | ||
cy + (ry * sin(end)) + dy | ||
]; | ||
} | ||
return result; | ||
} | ||
if (points.length) { | ||
// Set the first element to M | ||
result[0] = 'M'; | ||
Highcharts.SVGRenderer.prototype.toLinePath = function (points, closed) { | ||
var result = []; | ||
// If it is a closed line, add Z | ||
if (closed) { | ||
result.push('Z'); | ||
} | ||
} | ||
return result; | ||
}; | ||
// Put "L x y" for each point | ||
Highcharts.each(points, function (point) { | ||
result.push('L', point.x, point.y); | ||
}); | ||
////// CUBOIDS ////// | ||
Highcharts.SVGRenderer.prototype.cuboid = function (shapeArgs) { | ||
if (points.length) { | ||
// Set the first element to M | ||
result[0] = 'M'; | ||
var result = this.g(), | ||
paths = this.cuboidPath(shapeArgs); | ||
// If it is a closed line, add Z | ||
if (closed) { | ||
result.push('Z'); | ||
} | ||
} | ||
// create the 3 sides | ||
result.front = this.path(paths[0]).attr({zIndex: paths[3], 'stroke-linejoin': 'round'}).add(result); | ||
result.top = this.path(paths[1]).attr({zIndex: paths[4], 'stroke-linejoin': 'round'}).add(result); | ||
result.side = this.path(paths[2]).attr({zIndex: paths[5], 'stroke-linejoin': 'round'}).add(result); | ||
return result; | ||
}; | ||
// apply the fill everywhere, the top a bit brighter, the side a bit darker | ||
result.fillSetter = function (color) { | ||
var c0 = color, | ||
c1 = Highcharts.Color(color).brighten(0.1).get(), | ||
c2 = Highcharts.Color(color).brighten(-0.1).get(); | ||
////// CUBOIDS ////// | ||
Highcharts.SVGRenderer.prototype.cuboid = function (shapeArgs) { | ||
this.front.attr({fill: c0}); | ||
this.top.attr({fill: c1}); | ||
this.side.attr({fill: c2}); | ||
var result = this.g(), | ||
paths = this.cuboidPath(shapeArgs); | ||
this.color = color; | ||
return this; | ||
}; | ||
// create the 3 sides | ||
result.front = this.path(paths[0]).attr({ zIndex: paths[3], 'stroke-linejoin': 'round' }).add(result); | ||
result.top = this.path(paths[1]).attr({ zIndex: paths[4], 'stroke-linejoin': 'round' }).add(result); | ||
result.side = this.path(paths[2]).attr({ zIndex: paths[5], 'stroke-linejoin': 'round' }).add(result); | ||
// apply opacaity everywhere | ||
result.opacitySetter = function (opacity) { | ||
this.front.attr({opacity: opacity}); | ||
this.top.attr({opacity: opacity}); | ||
this.side.attr({opacity: opacity}); | ||
return this; | ||
}; | ||
// apply the fill everywhere, the top a bit brighter, the side a bit darker | ||
result.fillSetter = function (color) { | ||
var c0 = color, | ||
c1 = Highcharts.Color(color).brighten(0.1).get(), | ||
c2 = Highcharts.Color(color).brighten(-0.1).get(); | ||
result.attr = function (args) { | ||
if (args.shapeArgs || defined(args.x)) { | ||
var shapeArgs = args.shapeArgs || args; | ||
var paths = this.renderer.cuboidPath(shapeArgs); | ||
this.front.attr({d: paths[0], zIndex: paths[3]}); | ||
this.top.attr({d: paths[1], zIndex: paths[4]}); | ||
this.side.attr({d: paths[2], zIndex: paths[5]}); | ||
} else { | ||
Highcharts.SVGElement.prototype.attr.call(this, args); | ||
} | ||
this.front.attr({ fill: c0 }); | ||
this.top.attr({ fill: c1 }); | ||
this.side.attr({ fill: c2 }); | ||
return this; | ||
}; | ||
result.animate = function (args, duration, complete) { | ||
if (defined(args.x) && defined(args.y)) { | ||
var paths = this.renderer.cuboidPath(args); | ||
this.front.attr({zIndex: paths[3]}).animate({d: paths[0]}, duration, complete); | ||
this.top.attr({zIndex: paths[4]}).animate({d: paths[1]}, duration, complete); | ||
this.side.attr({zIndex: paths[5]}).animate({d: paths[2]}, duration, complete); | ||
} else if (args.opacity) { | ||
this.front.animate(args, duration, complete); | ||
this.top.animate(args, duration, complete); | ||
this.side.animate(args, duration, complete); | ||
} else { | ||
Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete); | ||
} | ||
return this; | ||
}; | ||
this.color = color; | ||
return this; | ||
}; | ||
// destroy all children | ||
result.destroy = function () { | ||
this.front.destroy(); | ||
this.top.destroy(); | ||
this.side.destroy(); | ||
// apply opacaity everywhere | ||
result.opacitySetter = function (opacity) { | ||
this.front.attr({ opacity: opacity }); | ||
this.top.attr({ opacity: opacity }); | ||
this.side.attr({ opacity: opacity }); | ||
return this; | ||
}; | ||
return null; | ||
}; | ||
result.attr = function (args) { | ||
if (args.shapeArgs || defined(args.x)) { | ||
var shapeArgs = args.shapeArgs || args; | ||
var paths = this.renderer.cuboidPath(shapeArgs); | ||
this.front.attr({ d: paths[0], zIndex: paths[3] }); | ||
this.top.attr({ d: paths[1], zIndex: paths[4] }); | ||
this.side.attr({ d: paths[2], zIndex: paths[5] }); | ||
} else { | ||
Highcharts.SVGElement.prototype.attr.call(this, args); | ||
} | ||
// Apply the Z index to the cuboid group | ||
result.attr({ zIndex: -paths[3] }); | ||
return this; | ||
}; | ||
return result; | ||
}; | ||
result.animate = function (args, duration, complete) { | ||
if (defined(args.x) && defined(args.y)) { | ||
var paths = this.renderer.cuboidPath(args); | ||
this.front.attr({ zIndex: paths[3] }).animate({ d: paths[0] }, duration, complete); | ||
this.top.attr({ zIndex: paths[4] }).animate({ d: paths[1] }, duration, complete); | ||
this.side.attr({ zIndex: paths[5] }).animate({ d: paths[2] }, duration, complete); | ||
} else if (args.opacity) { | ||
this.front.animate(args, duration, complete); | ||
this.top.animate(args, duration, complete); | ||
this.side.animate(args, duration, complete); | ||
} else { | ||
Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete); | ||
} | ||
return this; | ||
}; | ||
/** | ||
* Generates a cuboid | ||
*/ | ||
Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) { | ||
var x = shapeArgs.x, | ||
y = shapeArgs.y, | ||
z = shapeArgs.z, | ||
h = shapeArgs.height, | ||
w = shapeArgs.width, | ||
d = shapeArgs.depth, | ||
chart = Highcharts.charts[this.chartIndex], | ||
map = Highcharts.map; | ||
// destroy all children | ||
result.destroy = function () { | ||
this.front.destroy(); | ||
this.top.destroy(); | ||
this.side.destroy(); | ||
// The 8 corners of the cube | ||
var pArr = [ | ||
{x: x, y: y, z: z}, | ||
{x: x + w, y: y, z: z}, | ||
{x: x + w, y: y + h, z: z}, | ||
{x: x, y: y + h, z: z}, | ||
{x: x, y: y + h, z: z + d}, | ||
{x: x + w, y: y + h, z: z + d}, | ||
{x: x + w, y: y, z: z + d}, | ||
{x: x, y: y, z: z + d} | ||
]; | ||
return null; | ||
}; | ||
// apply perspective | ||
pArr = perspective(pArr, chart, shapeArgs.insidePlotArea); | ||
// Apply the Z index to the cuboid group | ||
result.attr({ zIndex: -paths[3] }); | ||
// helper method to decide which side is visible | ||
var pickShape = function (path1, path2) { | ||
path1 = map(path1, function (i) { return pArr[i]; }); | ||
path2 = map(path2, function (i) { return pArr[i]; }); | ||
if (shapeArea(path1) < 0) { | ||
return path1; | ||
} else if (shapeArea(path2) < 0) { | ||
return path2; | ||
} else { | ||
return []; | ||
} | ||
}; | ||
return result; | ||
}; | ||
// front or back | ||
var front = [3, 2, 1, 0]; | ||
var back = [7, 6, 5, 4]; | ||
var path1 = pickShape(front, back); | ||
/** | ||
* Generates a cuboid | ||
*/ | ||
Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) { | ||
var x = shapeArgs.x, | ||
y = shapeArgs.y, | ||
z = shapeArgs.z, | ||
h = shapeArgs.height, | ||
w = shapeArgs.width, | ||
d = shapeArgs.depth, | ||
chart = Highcharts.charts[this.chartIndex], | ||
map = Highcharts.map; | ||
// top or bottom | ||
var top = [1, 6, 7, 0]; | ||
var bottom = [4, 5, 2, 3]; | ||
var path2 = pickShape(top, bottom); | ||
// The 8 corners of the cube | ||
var pArr = [ | ||
{ x: x, y: y, z: z }, | ||
{ x: x + w, y: y, z: z }, | ||
{ x: x + w, y: y + h, z: z }, | ||
{ x: x, y: y + h, z: z }, | ||
{ x: x, y: y + h, z: z + d }, | ||
{ x: x + w, y: y + h, z: z + d }, | ||
{ x: x + w, y: y, z: z + d }, | ||
{ x: x, y: y, z: z + d } | ||
]; | ||
// side | ||
var right = [1, 2, 5, 6]; | ||
var left = [0, 7, 4, 3]; | ||
var path3 = pickShape(right, left); | ||
// apply perspective | ||
pArr = perspective(pArr, chart, shapeArgs.insidePlotArea); | ||
return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3)]; | ||
}; | ||
// helper method to decide which side is visible | ||
function mapPath(i) { | ||
return pArr[i]; | ||
} | ||
var pickShape = function (path1, path2) { | ||
var ret; | ||
path1 = map(path1, mapPath); | ||
path2 = map(path2, mapPath); | ||
if (shapeArea(path1) < 0) { | ||
ret = path1; | ||
} else if (shapeArea(path2) < 0) { | ||
ret = path2; | ||
} else { | ||
ret = []; | ||
} | ||
return ret; | ||
}; | ||
////// SECTORS ////// | ||
Highcharts.SVGRenderer.prototype.arc3d = function (shapeArgs) { | ||
// front or back | ||
var front = [3, 2, 1, 0]; | ||
var back = [7, 6, 5, 4]; | ||
var path1 = pickShape(front, back); | ||
shapeArgs.alpha *= deg2rad; | ||
shapeArgs.beta *= deg2rad; | ||
var result = this.g(), | ||
paths = this.arc3dPath(shapeArgs), | ||
renderer = result.renderer; | ||
// top or bottom | ||
var top = [1, 6, 7, 0]; | ||
var bottom = [4, 5, 2, 3]; | ||
var path2 = pickShape(top, bottom); | ||
var zIndex = paths.zTop * 100; | ||
// side | ||
var right = [1, 2, 5, 6]; | ||
var left = [0, 7, 4, 3]; | ||
var path3 = pickShape(right, left); | ||
result.shapeArgs = shapeArgs; // Store for later use | ||
return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3)]; | ||
}; | ||
// create the different sub sections of the shape | ||
result.top = renderer.path(paths.top).setRadialReference(shapeArgs.center).attr({zIndex: paths.zTop}).add(result); | ||
result.side1 = renderer.path(paths.side2).attr({zIndex: paths.zSide1}); | ||
result.side2 = renderer.path(paths.side1).attr({zIndex: paths.zSide2}); | ||
result.inn = renderer.path(paths.inn).attr({zIndex: paths.zInn}); | ||
result.out = renderer.path(paths.out).attr({zIndex: paths.zOut}); | ||
////// SECTORS ////// | ||
Highcharts.SVGRenderer.prototype.arc3d = function (attribs) { | ||
// apply the fill to the top and a darker shade to the sides | ||
result.fillSetter = function (color) { | ||
this.color = color; | ||
var wrapper = this.g(), | ||
renderer = wrapper.renderer, | ||
customAttribs = ['x', 'y', 'r', 'innerR', 'start', 'end']; | ||
var c0 = color, | ||
c2 = Highcharts.Color(color).brighten(-0.1).get(); | ||
this.side1.attr({fill: c2}); | ||
this.side2.attr({fill: c2}); | ||
this.inn.attr({fill: c2}); | ||
this.out.attr({fill: c2}); | ||
this.top.attr({fill: c0}); | ||
return this; | ||
}; | ||
// apply the translation to all | ||
result.translateXSetter = function (value) { | ||
this.out.attr({translateX: value}); | ||
this.inn.attr({translateX: value}); | ||
this.side1.attr({translateX: value}); | ||
this.side2.attr({translateX: value}); | ||
this.top.attr({translateX: value}); | ||
}; | ||
result.translateYSetter = function (value) { | ||
this.out.attr({translateY: value}); | ||
this.inn.attr({translateY: value}); | ||
this.side1.attr({translateY: value}); | ||
this.side2.attr({translateY: value}); | ||
this.top.attr({translateY: value}); | ||
}; | ||
/** | ||
* Get custom attributes. Mutate the original object and return an object with only custom attr. | ||
*/ | ||
function suckOutCustom(params) { | ||
var hasCA = false, | ||
ca = {}; | ||
for (var key in params) { | ||
if (inArray(key, customAttribs) !== -1) { | ||
ca[key] = params[key]; | ||
delete params[key]; | ||
hasCA = true; | ||
} | ||
} | ||
return hasCA ? ca : false; | ||
} | ||
result.animate = function (args, duration, complete) { | ||
if (defined(args.end) || defined(args.start)) { | ||
this._shapeArgs = this.shapeArgs; | ||
attribs = merge(attribs); | ||
Highcharts.SVGElement.prototype.animate.call(this, { | ||
_args: args | ||
}, { | ||
duration: duration, | ||
start: function () { | ||
var args = arguments, | ||
fx = args[0], | ||
elem = fx.elem, | ||
end = elem._shapeArgs; | ||
attribs.alpha *= deg2rad; | ||
attribs.beta *= deg2rad; | ||
// Create the different sub sections of the shape | ||
wrapper.top = renderer.path(); | ||
wrapper.side1 = renderer.path(); | ||
wrapper.side2 = renderer.path(); | ||
wrapper.inn = renderer.path(); | ||
wrapper.out = renderer.path(); | ||
if (end.fill !== elem.color) { | ||
elem.attr({ | ||
fill: end.fill | ||
}); | ||
} | ||
}, | ||
step: function () { | ||
var args = arguments, | ||
fx = args[1], | ||
result = fx.elem, | ||
start = result._shapeArgs, | ||
end = fx.end, | ||
pos = fx.pos, | ||
sA = Highcharts.merge(start, { | ||
x: start.x + ((end.x - start.x) * pos), | ||
y: start.y + ((end.y - start.y) * pos), | ||
r: start.r + ((end.r - start.r) * pos), | ||
innerR: start.innerR + ((end.innerR - start.innerR) * pos), | ||
start: start.start + ((end.start - start.start) * pos), | ||
end: start.end + ((end.end - start.end) * pos) | ||
}); | ||
/** | ||
* Add all faces | ||
*/ | ||
wrapper.onAdd = function () { | ||
var parent = wrapper.parentGroup; | ||
wrapper.top.add(wrapper); | ||
wrapper.out.add(parent); | ||
wrapper.inn.add(parent); | ||
wrapper.side1.add(parent); | ||
wrapper.side2.add(parent); | ||
}; | ||
var paths = result.renderer.arc3dPath(sA); | ||
/** | ||
* Compute the transformed paths and set them to the composite shapes | ||
*/ | ||
wrapper.setPaths = function (attribs) { | ||
result.shapeArgs = sA; | ||
var paths = wrapper.renderer.arc3dPath(attribs), | ||
zIndex = paths.zTop * 100; | ||
result.top.attr({d: paths.top, zIndex: paths.zTop}); | ||
result.inn.attr({d: paths.inn, zIndex: paths.zInn}); | ||
result.out.attr({d: paths.out, zIndex: paths.zOut}); | ||
result.side1.attr({d: paths.side1, zIndex: paths.zSide1}); | ||
result.side2.attr({d: paths.side2, zIndex: paths.zSide2}); | ||
wrapper.attribs = attribs; | ||
} | ||
}, complete); | ||
} else { | ||
Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete); | ||
} | ||
return this; | ||
}; | ||
wrapper.top.attr({ d: paths.top, zIndex: paths.zTop }); | ||
wrapper.inn.attr({ d: paths.inn, zIndex: paths.zInn }); | ||
wrapper.out.attr({ d: paths.out, zIndex: paths.zOut }); | ||
wrapper.side1.attr({ d: paths.side1, zIndex: paths.zSide1 }); | ||
wrapper.side2.attr({ d: paths.side2, zIndex: paths.zSide2 }); | ||
// destroy all children | ||
result.destroy = function () { | ||
this.top.destroy(); | ||
this.out.destroy(); | ||
this.inn.destroy(); | ||
this.side1.destroy(); | ||
this.side2.destroy(); | ||
Highcharts.SVGElement.prototype.destroy.call(this); | ||
}; | ||
// hide all children | ||
result.hide = function () { | ||
this.top.hide(); | ||
this.out.hide(); | ||
this.inn.hide(); | ||
this.side1.hide(); | ||
this.side2.hide(); | ||
}; | ||
result.show = function () { | ||
this.top.show(); | ||
this.out.show(); | ||
this.inn.show(); | ||
this.side1.show(); | ||
this.side2.show(); | ||
}; | ||
// show all children | ||
result.zIndex = zIndex; | ||
result.attr({zIndex: zIndex}); | ||
return result; | ||
}; | ||
// show all children | ||
wrapper.zIndex = zIndex; | ||
wrapper.attr({ zIndex: zIndex }); | ||
/** | ||
* Generate the paths required to draw a 3D arc | ||
*/ | ||
Highcharts.SVGRenderer.prototype.arc3dPath = function (shapeArgs) { | ||
var cx = shapeArgs.x, // x coordinate of the center | ||
cy = shapeArgs.y, // y coordinate of the center | ||
start = shapeArgs.start, // start angle | ||
end = shapeArgs.end - 0.00001, // end angle | ||
r = shapeArgs.r, // radius | ||
ir = shapeArgs.innerR, // inner radius | ||
d = shapeArgs.depth, // depth | ||
alpha = shapeArgs.alpha, // alpha rotation of the chart | ||
beta = shapeArgs.beta; // beta rotation of the chart | ||
// Set the radial gradient center the first time | ||
if (attribs.center) { | ||
wrapper.top.setRadialReference(attribs.center); | ||
delete attribs.center; | ||
} | ||
}; | ||
wrapper.setPaths(attribs); | ||
// Derived Variables | ||
var cs = cos(start), // cosinus of the start angle | ||
ss = sin(start), // sinus of the start angle | ||
ce = cos(end), // cosinus of the end angle | ||
se = sin(end), // sinus of the end angle | ||
rx = r * cos(beta), // x-radius | ||
ry = r * cos(alpha), // y-radius | ||
irx = ir * cos(beta), // x-radius (inner) | ||
iry = ir * cos(alpha), // y-radius (inner) | ||
dx = d * sin(beta), // distance between top and bottom in x | ||
dy = d * sin(alpha); // distance between top and bottom in y | ||
// Apply the fill to the top and a darker shade to the sides | ||
wrapper.fillSetter = function (value) { | ||
var darker = Highcharts.Color(value).brighten(-0.1).get(); | ||
this.fill = value; | ||
// TOP | ||
var top = ['M', cx + (rx * cs), cy + (ry * ss)]; | ||
top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0)); | ||
top = top.concat([ | ||
'L', cx + (irx * ce), cy + (iry * se) | ||
]); | ||
top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0)); | ||
top = top.concat(['Z']); | ||
this.side1.attr({ fill: darker }); | ||
this.side2.attr({ fill: darker }); | ||
this.inn.attr({ fill: darker }); | ||
this.out.attr({ fill: darker }); | ||
this.top.attr({ fill: value }); | ||
return this; | ||
}; | ||
// OUTSIDE | ||
var b = (beta > 0 ? PI / 2 : 0), | ||
a = (alpha > 0 ? 0 : PI / 2); | ||
// Apply the same value to all. These properties cascade down to the children | ||
// when set to the composite arc3d. | ||
each(['opacity', 'translateX', 'translateY', 'visibility'], function (setter) { | ||
wrapper[setter + 'Setter'] = function (value, key) { | ||
wrapper[key] = value; | ||
each(['out', 'inn', 'side1', 'side2', 'top'], function (el) { | ||
wrapper[el].attr(key, value); | ||
}); | ||
}; | ||
}); | ||
var start2 = start > -b ? start : (end > -b ? -b : start), | ||
end2 = end < PI - a ? end : (start < PI - a ? PI - a : end); | ||
var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))]; | ||
out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0)); | ||
// When slice goes over middle, need to add both, left and right outer side: | ||
if (end > PI - a && start < PI - a) { | ||
// Go to outer side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy | ||
]); | ||
// Curve to the true end of the slice | ||
out = out.concat(curveTo(cx, cy, rx, ry, end2, end, dx, dy)); | ||
// Go to the inner side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end)), cy + (ry * sin(end)) | ||
]); | ||
// Go back to the artifical end2 | ||
out = out.concat(curveTo(cx, cy, rx, ry, end, end2, 0, 0)); | ||
} | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy | ||
]); | ||
out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy)); | ||
out = out.concat(['Z']); | ||
/** | ||
* Override attr to remove shape attributes and use those to set child paths | ||
*/ | ||
wrap(wrapper, 'attr', function (proceed, params, val) { | ||
var ca; | ||
if (typeof params === 'object') { | ||
ca = suckOutCustom(params); | ||
if (ca) { | ||
extend(wrapper.attribs, ca); | ||
wrapper.setPaths(wrapper.attribs); | ||
} | ||
} | ||
return proceed.call(this, params, val); | ||
}); | ||
// INSIDE | ||
var inn = ['M', cx + (irx * cs), cy + (iry * ss)]; | ||
inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0)); | ||
inn = inn.concat([ | ||
'L', cx + (irx * cos(end)) + dx, cy + (iry * sin(end)) + dy | ||
]); | ||
inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy)); | ||
inn = inn.concat(['Z']); | ||
/** | ||
* Override the animate function by sucking out custom parameters related to the shapes directly, | ||
* and update the shapes from the animation step. | ||
*/ | ||
wrap(wrapper, 'animate', function (proceed, params, animation, complete) { | ||
var ca, | ||
from = this.attribs, | ||
to; | ||
// SIDES | ||
var side1 = [ | ||
'M', cx + (rx * cs), cy + (ry * ss), | ||
'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy, | ||
'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy, | ||
'L', cx + (irx * cs), cy + (iry * ss), | ||
'Z' | ||
]; | ||
var side2 = [ | ||
'M', cx + (rx * ce), cy + (ry * se), | ||
'L', cx + (rx * ce) + dx, cy + (ry * se) + dy, | ||
'L', cx + (irx * ce) + dx, cy + (iry * se) + dy, | ||
'L', cx + (irx * ce), cy + (iry * se), | ||
'Z' | ||
]; | ||
// correction for changed position of vanishing point caused by alpha and beta rotations | ||
var angleCorr = Math.atan2(dy, -dx), | ||
angleEnd = Math.abs(end + angleCorr), | ||
angleStart = Math.abs(start + angleCorr), | ||
angleMid = Math.abs((start + end) / 2 + angleCorr); | ||
// set to 0-PI range | ||
function toZeroPIRange(angle) { | ||
angle = angle % (2 * PI); | ||
if (angle > PI) { | ||
angle = 2 * PI - angle; | ||
} | ||
return angle; | ||
} | ||
angleEnd = toZeroPIRange(angleEnd); | ||
angleStart = toZeroPIRange(angleStart); | ||
angleMid = toZeroPIRange(angleMid); | ||
// *1e5 is to compensate pInt in zIndexSetter | ||
var incPrecision = 1e5, | ||
a1 = angleMid * incPrecision, | ||
a2 = angleStart * incPrecision, | ||
a3 = angleEnd * incPrecision; | ||
return { | ||
top: top, | ||
zTop: PI * incPrecision + 1, // max angle is PI, so this is allways higher | ||
out: out, | ||
zOut: Math.max(a1, a2, a3), | ||
inn: inn, | ||
zInn: Math.max(a1, a2, a3), | ||
side1: side1, | ||
zSide1: a3 * 0.99, // to keep below zOut and zInn in case of same values | ||
side2: side2, | ||
zSide2: a2 * 0.99 | ||
}; | ||
}; | ||
/*** | ||
EXTENSION FOR 3D CHARTS | ||
***/ | ||
// Shorthand to check the is3d flag | ||
Highcharts.Chart.prototype.is3d = function () { | ||
return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280 | ||
}; | ||
// Attribute-line properties connected to 3D. These shouldn't have been in the | ||
// attribs collection in the first place. | ||
delete params.center; | ||
delete params.z; | ||
delete params.depth; | ||
delete params.alpha; | ||
delete params.beta; | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'isInsidePlot', function (proceed) { | ||
if (this.is3d()) { | ||
return true; | ||
} else { | ||
return proceed.apply(this, [].slice.call(arguments, 1)); | ||
} | ||
}); | ||
animation = pick(animation, this.renderer.globalAnimation); | ||
if (animation) { | ||
if (typeof animation !== 'object') { | ||
animation = {}; | ||
} | ||
params = merge(params); // Don't mutate the original object | ||
ca = suckOutCustom(params); | ||
if (ca) { | ||
to = ca; | ||
animation.step = function (a, fx) { | ||
function interpolate(key) { | ||
return from[key] + (pick(to[key], from[key]) - from[key]) * fx.pos; | ||
} | ||
fx.elem.setPaths(merge(from, { | ||
x: interpolate('x'), | ||
y: interpolate('y'), | ||
r: interpolate('r'), | ||
innerR: interpolate('innerR'), | ||
start: interpolate('start'), | ||
end: interpolate('end') | ||
})); | ||
}; | ||
} | ||
} | ||
return proceed.call(this, params, animation, complete); | ||
}); | ||
var defaultChartOptions = Highcharts.getOptions(); | ||
defaultChartOptions.chart.options3d = { | ||
enabled: false, | ||
alpha: 0, | ||
beta: 0, | ||
depth: 100, | ||
viewDistance: 25, | ||
frame: { | ||
bottom: { size: 1, color: 'rgba(255,255,255,0)' }, | ||
side: { size: 1, color: 'rgba(255,255,255,0)' }, | ||
back: { size: 1, color: 'rgba(255,255,255,0)' } | ||
} | ||
}; | ||
// destroy all children | ||
wrapper.destroy = function () { | ||
this.top.destroy(); | ||
this.out.destroy(); | ||
this.inn.destroy(); | ||
this.side1.destroy(); | ||
this.side2.destroy(); | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed) { | ||
var args = [].slice.call(arguments, 1), | ||
plotOptions, | ||
pieOptions; | ||
Highcharts.SVGElement.prototype.destroy.call(this); | ||
}; | ||
// hide all children | ||
wrapper.hide = function () { | ||
this.top.hide(); | ||
this.out.hide(); | ||
this.inn.hide(); | ||
this.side1.hide(); | ||
this.side2.hide(); | ||
}; | ||
wrapper.show = function () { | ||
this.top.show(); | ||
this.out.show(); | ||
this.inn.show(); | ||
this.side1.show(); | ||
this.side2.show(); | ||
}; | ||
return wrapper; | ||
}; | ||
if (args[0].chart.options3d && args[0].chart.options3d.enabled) { | ||
// Normalize alpha and beta to (-360, 360) range | ||
args[0].chart.options3d.alpha = (args[0].chart.options3d.alpha || 0) % 360; | ||
args[0].chart.options3d.beta = (args[0].chart.options3d.beta || 0) % 360; | ||
/** | ||
* Generate the paths required to draw a 3D arc | ||
*/ | ||
Highcharts.SVGRenderer.prototype.arc3dPath = function (shapeArgs) { | ||
var cx = shapeArgs.x, // x coordinate of the center | ||
cy = shapeArgs.y, // y coordinate of the center | ||
start = shapeArgs.start, // start angle | ||
end = shapeArgs.end - 0.00001, // end angle | ||
r = shapeArgs.r, // radius | ||
ir = shapeArgs.innerR, // inner radius | ||
d = shapeArgs.depth, // depth | ||
alpha = shapeArgs.alpha, // alpha rotation of the chart | ||
beta = shapeArgs.beta; // beta rotation of the chart | ||
plotOptions = args[0].plotOptions || {}; | ||
pieOptions = plotOptions.pie || {}; | ||
// Derived Variables | ||
var cs = cos(start), // cosinus of the start angle | ||
ss = sin(start), // sinus of the start angle | ||
ce = cos(end), // cosinus of the end angle | ||
se = sin(end), // sinus of the end angle | ||
rx = r * cos(beta), // x-radius | ||
ry = r * cos(alpha), // y-radius | ||
irx = ir * cos(beta), // x-radius (inner) | ||
iry = ir * cos(alpha), // y-radius (inner) | ||
dx = d * sin(beta), // distance between top and bottom in x | ||
dy = d * sin(alpha); // distance between top and bottom in y | ||
pieOptions.borderColor = Highcharts.pick(pieOptions.borderColor, undefined); | ||
} | ||
proceed.apply(this, args); | ||
}); | ||
// TOP | ||
var top = ['M', cx + (rx * cs), cy + (ry * ss)]; | ||
top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0)); | ||
top = top.concat([ | ||
'L', cx + (irx * ce), cy + (iry * se) | ||
]); | ||
top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0)); | ||
top = top.concat(['Z']); | ||
// OUTSIDE | ||
var b = (beta > 0 ? PI / 2 : 0), | ||
a = (alpha > 0 ? 0 : PI / 2); | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'setChartSize', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
var start2 = start > -b ? start : (end > -b ? -b : start), | ||
end2 = end < PI - a ? end : (start < PI - a ? PI - a : end), | ||
midEnd = 2 * PI - a; | ||
// When slice goes over bottom middle, need to add both, left and right outer side. | ||
// Additionally, when we cross right hand edge, create sharp edge. Outer shape/wall: | ||
// | ||
// ------- | ||
// / ^ \ | ||
// 4) / / \ \ 1) | ||
// / / \ \ | ||
// / / \ \ | ||
// (c)=> ==== ==== <=(d) | ||
// \ \ / / | ||
// \ \<=(a)/ / | ||
// \ \ / / <=(b) | ||
// 3) \ v / 2) | ||
// ------- | ||
// | ||
// (a) - inner side | ||
// (b) - outer side | ||
// (c) - left edge (sharp) | ||
// (d) - right edge (sharp) | ||
// 1..n - rendering order for startAngle = 0, when set to e.g 90, order changes clockwise (1->2, 2->3, n->1) and counterclockwise for negative startAngle | ||
if (this.is3d()) { | ||
var inverted = this.inverted, | ||
clipBox = this.clipBox, | ||
margin = this.margin, | ||
x = inverted ? 'y' : 'x', | ||
y = inverted ? 'x' : 'y', | ||
w = inverted ? 'height' : 'width', | ||
h = inverted ? 'width' : 'height'; | ||
var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))]; | ||
out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0)); | ||
clipBox[x] = -(margin[3] || 0); | ||
clipBox[y] = -(margin[0] || 0); | ||
clipBox[w] = this.chartWidth + (margin[3] || 0) + (margin[1] || 0); | ||
clipBox[h] = this.chartHeight + (margin[0] || 0) + (margin[2] || 0); | ||
} | ||
}); | ||
if (end > midEnd && start < midEnd) { // When shape is wide, it can cross both, (c) and (d) edges, when using startAngle | ||
// Go to outer side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy | ||
]); | ||
// Curve to the right edge of the slice (d) | ||
out = out.concat(curveTo(cx, cy, rx, ry, end2, midEnd, dx, dy)); | ||
// Go to the inner side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd)) | ||
]); | ||
// Curve to the true end of the slice | ||
out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end, 0, 0)); | ||
// Go to the outer side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end)) + dx, cy + (ry * sin(end)) + dy | ||
]); | ||
// Go back to middle (d) | ||
out = out.concat(curveTo(cx, cy, rx, ry, end, midEnd, dx, dy)); | ||
out = out.concat([ | ||
'L', cx + (rx * cos(midEnd)), cy + (ry * sin(midEnd)) | ||
]); | ||
// Go back to the left edge | ||
out = out.concat(curveTo(cx, cy, rx, ry, midEnd, end2, 0, 0)); | ||
} else if (end > PI - a && start < PI - a) { // But shape can cross also only (c) edge: | ||
// Go to outer side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy | ||
]); | ||
// Curve to the true end of the slice | ||
out = out.concat(curveTo(cx, cy, rx, ry, end2, end, dx, dy)); | ||
// Go to the inner side | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end)), cy + (ry * sin(end)) | ||
]); | ||
// Go back to the artifical end2 | ||
out = out.concat(curveTo(cx, cy, rx, ry, end, end2, 0, 0)); | ||
} | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'redraw', function (proceed) { | ||
if (this.is3d()) { | ||
// Set to force a redraw of all elements | ||
this.isDirtyBox = true; | ||
} | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
out = out.concat([ | ||
'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy | ||
]); | ||
out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy)); | ||
out = out.concat(['Z']); | ||
// Draw the series in the reverse order (#3803, #3917) | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'renderSeries', function (proceed) { | ||
var series, | ||
i = this.series.length; | ||
if (this.is3d()) { | ||
while (i--) { | ||
series = this.series[i]; | ||
series.translate(); | ||
series.render(); | ||
} | ||
} else { | ||
proceed.call(this); | ||
} | ||
}); | ||
// INSIDE | ||
var inn = ['M', cx + (irx * cs), cy + (iry * ss)]; | ||
inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0)); | ||
inn = inn.concat([ | ||
'L', cx + (irx * cos(end)) + dx, cy + (iry * sin(end)) + dy | ||
]); | ||
inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy)); | ||
inn = inn.concat(['Z']); | ||
Highcharts.Chart.prototype.retrieveStacks = function (stacking) { | ||
var series = this.series, | ||
stacks = {}, | ||
stackNumber, | ||
i = 1; | ||
// SIDES | ||
var side1 = [ | ||
'M', cx + (rx * cs), cy + (ry * ss), | ||
'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy, | ||
'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy, | ||
'L', cx + (irx * cs), cy + (iry * ss), | ||
'Z' | ||
]; | ||
var side2 = [ | ||
'M', cx + (rx * ce), cy + (ry * se), | ||
'L', cx + (rx * ce) + dx, cy + (ry * se) + dy, | ||
'L', cx + (irx * ce) + dx, cy + (iry * se) + dy, | ||
'L', cx + (irx * ce), cy + (iry * se), | ||
'Z' | ||
]; | ||
Highcharts.each(this.series, function (s) { | ||
stackNumber = pick(s.options.stack, (stacking ? 0 : series.length - 1 - s.index)); // #3841, #4532 | ||
if (!stacks[stackNumber]) { | ||
stacks[stackNumber] = { series: [s], position: i}; | ||
i++; | ||
} else { | ||
stacks[stackNumber].series.push(s); | ||
} | ||
}); | ||
// correction for changed position of vanishing point caused by alpha and beta rotations | ||
var angleCorr = Math.atan2(dy, -dx), | ||
angleEnd = Math.abs(end + angleCorr), | ||
angleStart = Math.abs(start + angleCorr), | ||
angleMid = Math.abs((start + end) / 2 + angleCorr); | ||
stacks.totalStacks = i + 1; | ||
return stacks; | ||
}; | ||
// set to 0-PI range | ||
function toZeroPIRange(angle) { | ||
angle = angle % (2 * PI); | ||
if (angle > PI) { | ||
angle = 2 * PI - angle; | ||
} | ||
return angle; | ||
} | ||
angleEnd = toZeroPIRange(angleEnd); | ||
angleStart = toZeroPIRange(angleStart); | ||
angleMid = toZeroPIRange(angleMid); | ||
/*** | ||
EXTENSION TO THE AXIS | ||
***/ | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'setOptions', function (proceed, userOptions) { | ||
var options; | ||
proceed.call(this, userOptions); | ||
if (this.chart.is3d()) { | ||
options = this.options; | ||
options.tickWidth = Highcharts.pick(options.tickWidth, 0); | ||
options.gridLineWidth = Highcharts.pick(options.gridLineWidth, 1); | ||
} | ||
}); | ||
// *1e5 is to compensate pInt in zIndexSetter | ||
var incPrecision = 1e5, | ||
a1 = angleMid * incPrecision, | ||
a2 = angleStart * incPrecision, | ||
a3 = angleEnd * incPrecision; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
return { | ||
top: top, | ||
zTop: PI * incPrecision + 1, // max angle is PI, so this is allways higher | ||
out: out, | ||
zOut: Math.max(a1, a2, a3), | ||
inn: inn, | ||
zInn: Math.max(a1, a2, a3), | ||
side1: side1, | ||
zSide1: a3 * 0.99, // to keep below zOut and zInn in case of same values | ||
side2: side2, | ||
zSide2: a2 * 0.99 | ||
}; | ||
}; | ||
/*** | ||
EXTENSION FOR 3D CHARTS | ||
***/ | ||
// Shorthand to check the is3d flag | ||
Highcharts.Chart.prototype.is3d = function () { | ||
return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280 | ||
}; | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'isInsidePlot', function (proceed) { | ||
return this.is3d() || proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
var chart = this.chart, | ||
renderer = chart.renderer, | ||
options3d = chart.options.chart.options3d, | ||
frame = options3d.frame, | ||
fbottom = frame.bottom, | ||
fback = frame.back, | ||
fside = frame.side, | ||
depth = options3d.depth, | ||
height = this.height, | ||
width = this.width, | ||
left = this.left, | ||
top = this.top; | ||
var defaultChartOptions = Highcharts.getOptions(); | ||
defaultChartOptions.chart.options3d = { | ||
enabled: false, | ||
alpha: 0, | ||
beta: 0, | ||
depth: 100, | ||
viewDistance: 25, | ||
frame: { | ||
bottom: { size: 1, color: 'rgba(255,255,255,0)' }, | ||
side: { size: 1, color: 'rgba(255,255,255,0)' }, | ||
back: { size: 1, color: 'rgba(255,255,255,0)' } | ||
} | ||
}; | ||
if (this.isZAxis) { | ||
return; | ||
} else if (this.horiz) { | ||
var bottomShape = { | ||
x: left, | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : height), | ||
z: 0, | ||
width: width, | ||
height: fbottom.size, | ||
depth: depth, | ||
insidePlotArea: false | ||
}; | ||
if (!this.bottomFrame) { | ||
this.bottomFrame = renderer.cuboid(bottomShape).attr({ | ||
fill: fbottom.color, | ||
zIndex: (chart.yAxis[0].reversed && options3d.alpha > 0 ? 4 : -1) | ||
}) | ||
.css({ | ||
stroke: fbottom.color | ||
}).add(); | ||
} else { | ||
this.bottomFrame.animate(bottomShape); | ||
} | ||
} else { | ||
// BACK | ||
var backShape = { | ||
x: left + (chart.yAxis[0].opposite ? 0 : -fside.size), | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0), | ||
z: depth, | ||
width: width + fside.size, | ||
height: height + fbottom.size, | ||
depth: fback.size, | ||
insidePlotArea: false | ||
}; | ||
if (!this.backFrame) { | ||
this.backFrame = renderer.cuboid(backShape).attr({ | ||
fill: fback.color, | ||
zIndex: -3 | ||
}).css({ | ||
stroke: fback.color | ||
}).add(); | ||
} else { | ||
this.backFrame.animate(backShape); | ||
} | ||
var sideShape = { | ||
x: left + (chart.yAxis[0].opposite ? width : -fside.size), | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0), | ||
z: 0, | ||
width: fside.size, | ||
height: height + fbottom.size, | ||
depth: depth, | ||
insidePlotArea: false | ||
}; | ||
if (!this.sideFrame) { | ||
this.sideFrame = renderer.cuboid(sideShape).attr({ | ||
fill: fside.color, | ||
zIndex: -2 | ||
}).css({ | ||
stroke: fside.color | ||
}).add(); | ||
} else { | ||
this.sideFrame.animate(sideShape); | ||
} | ||
} | ||
}); | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed) { | ||
var args = [].slice.call(arguments, 1), | ||
plotOptions, | ||
pieOptions; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed) { | ||
var path = proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (args[0].chart.options3d && args[0].chart.options3d.enabled) { | ||
// Normalize alpha and beta to (-360, 360) range | ||
args[0].chart.options3d.alpha = (args[0].chart.options3d.alpha || 0) % 360; | ||
args[0].chart.options3d.beta = (args[0].chart.options3d.beta || 0) % 360; | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return path; | ||
} | ||
plotOptions = args[0].plotOptions || {}; | ||
pieOptions = plotOptions.pie || {}; | ||
if (path === null) { return path; } | ||
pieOptions.borderColor = Highcharts.pick(pieOptions.borderColor, undefined); | ||
} | ||
proceed.apply(this, args); | ||
}); | ||
var chart = this.chart, | ||
options3d = chart.options.chart.options3d; | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'setChartSize', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
var d = this.isZAxis ? this.chart.plotWidth : options3d.depth, | ||
opposite = this.opposite; | ||
if (this.horiz) { | ||
opposite = !opposite; | ||
} | ||
var pArr = [ | ||
this.swapZ({ x: path[1], y: path[2], z: (opposite ? d : 0)}), | ||
this.swapZ({ x: path[1], y: path[2], z: d }), | ||
this.swapZ({ x: path[4], y: path[5], z: d }), | ||
this.swapZ({ x: path[4], y: path[5], z: (opposite ? 0 : d)}) | ||
]; | ||
if (this.is3d()) { | ||
var inverted = this.inverted, | ||
clipBox = this.clipBox, | ||
margin = this.margin, | ||
x = inverted ? 'y' : 'x', | ||
y = inverted ? 'x' : 'y', | ||
w = inverted ? 'height' : 'width', | ||
h = inverted ? 'width' : 'height'; | ||
pArr = perspective(pArr, this.chart, false); | ||
path = this.chart.renderer.toLinePath(pArr, false); | ||
clipBox[x] = -(margin[3] || 0); | ||
clipBox[y] = -(margin[0] || 0); | ||
clipBox[w] = this.chartWidth + (margin[3] || 0) + (margin[1] || 0); | ||
clipBox[h] = this.chartHeight + (margin[0] || 0) + (margin[2] || 0); | ||
} | ||
}); | ||
return path; | ||
}); | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'redraw', function (proceed) { | ||
if (this.is3d()) { | ||
// Set to force a redraw of all elements | ||
this.isDirtyBox = true; | ||
} | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
// Do not draw axislines in 3D | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getLinePath', function (proceed) { | ||
return this.chart.is3d() ? [] : proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
// Draw the series in the reverse order (#3803, #3917) | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'renderSeries', function (proceed) { | ||
var series, | ||
i = this.series.length; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotBandPath', function (proceed) { | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { | ||
var args = arguments, | ||
from = args[1], | ||
to = args[2]; | ||
var toPath = this.getPlotLinePath(to), | ||
path = this.getPlotLinePath(from); | ||
if (path && toPath) { | ||
path.push( | ||
'L', | ||
toPath[10], // These two do not exist in the regular getPlotLine | ||
toPath[11], // ---- # 3005 | ||
'L', | ||
toPath[7], | ||
toPath[8], | ||
'L', | ||
toPath[4], | ||
toPath[5], | ||
'L', | ||
toPath[1], | ||
toPath[2] | ||
); | ||
} else { // outside the axis area | ||
path = null; | ||
} | ||
return path; | ||
} | ||
}); | ||
if (this.is3d()) { | ||
while (i--) { | ||
series = this.series[i]; | ||
series.translate(); | ||
series.render(); | ||
} | ||
} else { | ||
proceed.call(this); | ||
} | ||
}); | ||
/*** | ||
EXTENSION TO THE TICKS | ||
***/ | ||
Highcharts.Chart.prototype.retrieveStacks = function (stacking) { | ||
var series = this.series, | ||
stacks = {}, | ||
stackNumber, | ||
i = 1; | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'getMarkPath', function (proceed) { | ||
var path = proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.each(this.series, function (s) { | ||
stackNumber = pick(s.options.stack, (stacking ? 0 : series.length - 1 - s.index)); // #3841, #4532 | ||
if (!stacks[stackNumber]) { | ||
stacks[stackNumber] = { series: [s], position: i }; | ||
i++; | ||
} else { | ||
stacks[stackNumber].series.push(s); | ||
} | ||
}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.axis.chart.is3d()) { | ||
return path; | ||
} | ||
stacks.totalStacks = i + 1; | ||
return stacks; | ||
}; | ||
var pArr = [ | ||
this.axis.swapZ({x: path[1], y: path[2], z: 0}), | ||
this.axis.swapZ({x: path[4], y: path[5], z: 0}) | ||
]; | ||
/*** | ||
EXTENSION TO THE AXIS | ||
***/ | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'setOptions', function (proceed, userOptions) { | ||
var options; | ||
proceed.call(this, userOptions); | ||
if (this.chart.is3d()) { | ||
options = this.options; | ||
options.tickWidth = Highcharts.pick(options.tickWidth, 0); | ||
options.gridLineWidth = Highcharts.pick(options.gridLineWidth, 1); | ||
} | ||
}); | ||
pArr = perspective(pArr, this.axis.chart, false); | ||
path = [ | ||
'M', pArr[0].x, pArr[0].y, | ||
'L', pArr[1].x, pArr[1].y | ||
]; | ||
return path; | ||
}); | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'getLabelPosition', function (proceed) { | ||
var pos = proceed.apply(this, [].slice.call(arguments, 1)); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
// Do not do this if the chart is not 3D | ||
if (!this.axis.chart.is3d()) { | ||
return pos; | ||
} | ||
var chart = this.chart, | ||
renderer = chart.renderer, | ||
options3d = chart.options.chart.options3d, | ||
frame = options3d.frame, | ||
fbottom = frame.bottom, | ||
fback = frame.back, | ||
fside = frame.side, | ||
depth = options3d.depth, | ||
height = this.height, | ||
width = this.width, | ||
left = this.left, | ||
top = this.top; | ||
var new_pos = perspective([this.axis.swapZ({x: pos.x, y: pos.y, z: 0})], this.axis.chart, false)[0]; | ||
new_pos.x = new_pos.x - (!this.axis.horiz && this.axis.opposite ? this.axis.transA : 0); //#3788 | ||
new_pos.old = pos; | ||
return new_pos; | ||
}); | ||
if (this.isZAxis) { | ||
return; | ||
} | ||
if (this.horiz) { | ||
var bottomShape = { | ||
x: left, | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : height), | ||
z: 0, | ||
width: width, | ||
height: fbottom.size, | ||
depth: depth, | ||
insidePlotArea: false | ||
}; | ||
if (!this.bottomFrame) { | ||
this.bottomFrame = renderer.cuboid(bottomShape).attr({ | ||
fill: fbottom.color, | ||
zIndex: (chart.yAxis[0].reversed && options3d.alpha > 0 ? 4 : -1) | ||
}) | ||
.css({ | ||
stroke: fbottom.color | ||
}).add(); | ||
} else { | ||
this.bottomFrame.animate(bottomShape); | ||
} | ||
} else { | ||
// BACK | ||
var backShape = { | ||
x: left + (chart.yAxis[0].opposite ? 0 : -fside.size), | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0), | ||
z: depth, | ||
width: width + fside.size, | ||
height: height + fbottom.size, | ||
depth: fback.size, | ||
insidePlotArea: false | ||
}; | ||
if (!this.backFrame) { | ||
this.backFrame = renderer.cuboid(backShape).attr({ | ||
fill: fback.color, | ||
zIndex: -3 | ||
}).css({ | ||
stroke: fback.color | ||
}).add(); | ||
} else { | ||
this.backFrame.animate(backShape); | ||
} | ||
var sideShape = { | ||
x: left + (chart.yAxis[0].opposite ? width : -fside.size), | ||
y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0), | ||
z: 0, | ||
width: fside.size, | ||
height: height + fbottom.size, | ||
depth: depth, | ||
insidePlotArea: false | ||
}; | ||
if (!this.sideFrame) { | ||
this.sideFrame = renderer.cuboid(sideShape).attr({ | ||
fill: fside.color, | ||
zIndex: -2 | ||
}).css({ | ||
stroke: fside.color | ||
}).add(); | ||
} else { | ||
this.sideFrame.animate(sideShape); | ||
} | ||
} | ||
}); | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'handleOverflow', function (proceed, xy) { | ||
if (this.axis.chart.is3d()) { | ||
xy = xy.old; | ||
} | ||
return proceed.call(this, xy); | ||
}); | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed) { | ||
var path = proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getTitlePosition', function (proceed) { | ||
var pos = proceed.apply(this, [].slice.call(arguments, 1)); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return path; | ||
} | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return pos; | ||
} | ||
if (path === null) { | ||
return path; | ||
} | ||
pos = perspective([this.swapZ({x: pos.x, y: pos.y, z: 0})], this.chart, false)[0]; | ||
return pos; | ||
}); | ||
var chart = this.chart, | ||
options3d = chart.options.chart.options3d, | ||
d = this.isZAxis ? chart.plotWidth : options3d.depth, | ||
opposite = this.opposite; | ||
if (this.horiz) { | ||
opposite = !opposite; | ||
} | ||
var pArr = [ | ||
this.swapZ({ x: path[1], y: path[2], z: (opposite ? d : 0) }), | ||
this.swapZ({ x: path[1], y: path[2], z: d }), | ||
this.swapZ({ x: path[4], y: path[5], z: d }), | ||
this.swapZ({ x: path[4], y: path[5], z: (opposite ? 0 : d) }) | ||
]; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'drawCrosshair', function (proceed) { | ||
var args = arguments; | ||
if (this.chart.is3d()) { | ||
if (args[2]) { | ||
args[2] = { | ||
plotX: args[2].plotXold || args[2].plotX, | ||
plotY: args[2].plotYold || args[2].plotY | ||
}; | ||
} | ||
} | ||
proceed.apply(this, [].slice.call(args, 1)); | ||
}); | ||
pArr = perspective(pArr, this.chart, false); | ||
path = this.chart.renderer.toLinePath(pArr, false); | ||
/*** | ||
Z-AXIS | ||
***/ | ||
return path; | ||
}); | ||
Highcharts.Axis.prototype.swapZ = function (p, insidePlotArea) { | ||
if (this.isZAxis) { | ||
var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft; | ||
var chart = this.chart; | ||
return { | ||
x: plotLeft + (chart.yAxis[0].opposite ? p.z : chart.xAxis[0].width - p.z), | ||
y: p.y, | ||
z: p.x - plotLeft | ||
}; | ||
} else { | ||
return p; | ||
} | ||
}; | ||
// Do not draw axislines in 3D | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getLinePath', function (proceed) { | ||
return this.chart.is3d() ? [] : proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
var ZAxis = Highcharts.ZAxis = function () { | ||
this.isZAxis = true; | ||
this.init.apply(this, arguments); | ||
}; | ||
Highcharts.extend(ZAxis.prototype, Highcharts.Axis.prototype); | ||
Highcharts.extend(ZAxis.prototype, { | ||
setOptions: function (userOptions) { | ||
userOptions = Highcharts.merge({ | ||
offset: 0, | ||
lineWidth: 0 | ||
}, userOptions); | ||
Highcharts.Axis.prototype.setOptions.call(this, userOptions); | ||
this.coll = 'zAxis'; | ||
}, | ||
setAxisSize: function () { | ||
Highcharts.Axis.prototype.setAxisSize.call(this); | ||
this.width = this.len = this.chart.options.chart.options3d.depth; | ||
this.right = this.chart.chartWidth - this.width - this.left; | ||
}, | ||
getSeriesExtremes: function () { | ||
var axis = this, | ||
chart = axis.chart; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotBandPath', function (proceed) { | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return proceed.apply(this, [].slice.call(arguments, 1)); | ||
} | ||
axis.hasVisibleSeries = false; | ||
var args = arguments, | ||
from = args[1], | ||
to = args[2], | ||
toPath = this.getPlotLinePath(to), | ||
path = this.getPlotLinePath(from); | ||
// Reset properties in case we're redrawing (#3353) | ||
axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null; | ||
if (axis.buildStacks) { | ||
axis.buildStacks(); | ||
} | ||
if (path && toPath) { | ||
path.push( | ||
'L', | ||
toPath[10], // These two do not exist in the regular getPlotLine | ||
toPath[11], // ---- # 3005 | ||
'L', | ||
toPath[7], | ||
toPath[8], | ||
'L', | ||
toPath[4], | ||
toPath[5], | ||
'L', | ||
toPath[1], | ||
toPath[2] | ||
); | ||
} else { // outside the axis area | ||
path = null; | ||
} | ||
// loop through this axis' series | ||
Highcharts.each(axis.series, function (series) { | ||
return path; | ||
}); | ||
if (series.visible || !chart.options.chart.ignoreHiddenSeries) { | ||
/*** | ||
EXTENSION TO THE TICKS | ||
***/ | ||
var seriesOptions = series.options, | ||
zData, | ||
threshold = seriesOptions.threshold; | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'getMarkPath', function (proceed) { | ||
var path = proceed.apply(this, [].slice.call(arguments, 1)); | ||
axis.hasVisibleSeries = true; | ||
// Do not do this if the chart is not 3D | ||
if (!this.axis.chart.is3d()) { | ||
return path; | ||
} | ||
// Validate threshold in logarithmic axes | ||
if (axis.isLog && threshold <= 0) { | ||
threshold = null; | ||
} | ||
var pArr = [ | ||
this.axis.swapZ({ x: path[1], y: path[2], z: 0 }), | ||
this.axis.swapZ({ x: path[4], y: path[5], z: 0 }) | ||
]; | ||
zData = series.zData; | ||
if (zData.length) { | ||
axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData)); | ||
axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData)); | ||
} | ||
} | ||
}); | ||
} | ||
}); | ||
pArr = perspective(pArr, this.axis.chart, false); | ||
path = [ | ||
'M', pArr[0].x, pArr[0].y, | ||
'L', pArr[1].x, pArr[1].y | ||
]; | ||
return path; | ||
}); | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'getLabelPosition', function (proceed) { | ||
var pos = proceed.apply(this, [].slice.call(arguments, 1)); | ||
/** | ||
* Extend the chart getAxes method to also get the color axis | ||
*/ | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'getAxes', function (proceed) { | ||
var chart = this, | ||
options = this.options, | ||
zAxisOptions = options.zAxis = Highcharts.splat(options.zAxis || {}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.axis.chart.is3d()) { | ||
return pos; | ||
} | ||
proceed.call(this); | ||
var newPos = perspective([this.axis.swapZ({ x: pos.x, y: pos.y, z: 0 })], this.axis.chart, false)[0]; | ||
newPos.x = newPos.x - (!this.axis.horiz && this.axis.opposite ? this.axis.transA : 0); //#3788 | ||
newPos.old = pos; | ||
return newPos; | ||
}); | ||
if (!chart.is3d()) { | ||
return; | ||
} | ||
this.zAxis = []; | ||
Highcharts.each(zAxisOptions, function (axisOptions, i) { | ||
axisOptions.index = i; | ||
axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis | ||
var zAxis = new ZAxis(chart, axisOptions); | ||
zAxis.setScale(); | ||
}); | ||
}); | ||
/*** | ||
EXTENSION FOR 3D COLUMNS | ||
***/ | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.wrap(Highcharts.Tick.prototype, 'handleOverflow', function (proceed, xy) { | ||
if (this.axis.chart.is3d()) { | ||
xy = xy.old; | ||
} | ||
return proceed.call(this, xy); | ||
}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'getTitlePosition', function (proceed) { | ||
var is3d = this.chart.is3d(), | ||
pos, | ||
axisTitleMargin; | ||
var series = this, | ||
chart = series.chart, | ||
seriesOptions = series.options, | ||
depth = seriesOptions.depth || 25; | ||
// Pull out the axis title margin, that is not subject to the perspective | ||
if (is3d) { | ||
axisTitleMargin = this.axisTitleMargin; | ||
this.axisTitleMargin = 0; | ||
} | ||
var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i; | ||
var z = stack * (depth + (seriesOptions.groupZPadding || 1)); | ||
pos = proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (seriesOptions.grouping !== false) { z = 0; } | ||
if (is3d) { | ||
pos = perspective([this.swapZ({ x: pos.x, y: pos.y, z: 0 })], this.chart, false)[0]; | ||
z += (seriesOptions.groupZPadding || 1); | ||
// Re-apply the axis title margin outside the perspective | ||
pos[this.horiz ? 'y' : 'x'] += (this.horiz ? 1 : -1) * // horizontal axis reverses the margin ... | ||
(this.opposite ? -1 : 1) * // ... so does opposite axes | ||
axisTitleMargin; | ||
this.axisTitleMargin = axisTitleMargin; | ||
} | ||
return pos; | ||
}); | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
var shapeArgs = point.shapeArgs, | ||
tooltipPos = point.tooltipPos; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'drawCrosshair', function (proceed) { | ||
var args = arguments; | ||
if (this.chart.is3d()) { | ||
if (args[2]) { | ||
args[2] = { | ||
plotX: args[2].plotXold || args[2].plotX, | ||
plotY: args[2].plotYold || args[2].plotY | ||
}; | ||
} | ||
} | ||
proceed.apply(this, [].slice.call(args, 1)); | ||
}); | ||
point.shapeType = 'cuboid'; | ||
shapeArgs.z = z; | ||
shapeArgs.depth = depth; | ||
shapeArgs.insidePlotArea = true; | ||
/*** | ||
Z-AXIS | ||
***/ | ||
// Translate the tooltip position in 3d space | ||
tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], chart, false)[0]; | ||
point.tooltipPos = [tooltipPos.x, tooltipPos.y]; | ||
} | ||
}); | ||
// store for later use #4067 | ||
series.z = z; | ||
}); | ||
Highcharts.Axis.prototype.swapZ = function (p, insidePlotArea) { | ||
if (this.isZAxis) { | ||
var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft; | ||
var chart = this.chart; | ||
return { | ||
x: plotLeft + (chart.yAxis[0].opposite ? p.z : chart.xAxis[0].width - p.z), | ||
y: p.y, | ||
z: p.x - plotLeft | ||
}; | ||
} | ||
return p; | ||
}; | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'animate', function (proceed) { | ||
if (!this.chart.is3d()) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { | ||
var args = arguments, | ||
init = args[1], | ||
yAxis = this.yAxis, | ||
series = this, | ||
reversed = this.yAxis.reversed; | ||
var ZAxis = Highcharts.ZAxis = function () { | ||
this.isZAxis = true; | ||
this.init.apply(this, arguments); | ||
}; | ||
Highcharts.extend(ZAxis.prototype, Highcharts.Axis.prototype); | ||
Highcharts.extend(ZAxis.prototype, { | ||
setOptions: function (userOptions) { | ||
userOptions = Highcharts.merge({ | ||
offset: 0, | ||
lineWidth: 0 | ||
}, userOptions); | ||
Highcharts.Axis.prototype.setOptions.call(this, userOptions); | ||
this.coll = 'zAxis'; | ||
}, | ||
setAxisSize: function () { | ||
Highcharts.Axis.prototype.setAxisSize.call(this); | ||
this.width = this.len = this.chart.options.chart.options3d.depth; | ||
this.right = this.chart.chartWidth - this.width - this.left; | ||
}, | ||
getSeriesExtremes: function () { | ||
var axis = this, | ||
chart = axis.chart; | ||
if (Highcharts.svg) { // VML is too slow anyway | ||
if (init) { | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
point.height = point.shapeArgs.height; | ||
point.shapey = point.shapeArgs.y; //#2968 | ||
point.shapeArgs.height = 1; | ||
if (!reversed) { | ||
if (point.stackY) { | ||
point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY); | ||
} else { | ||
point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height); | ||
} | ||
} | ||
} | ||
}); | ||
axis.hasVisibleSeries = false; | ||
} else { // run the animation | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
point.shapeArgs.height = point.height; | ||
point.shapeArgs.y = point.shapey; //#2968 | ||
// null value do not have a graphic | ||
if (point.graphic) { | ||
point.graphic.animate(point.shapeArgs, series.options.animation); | ||
} | ||
} | ||
}); | ||
// Reset properties in case we're redrawing (#3353) | ||
axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null; | ||
// redraw datalabels to the correct position | ||
this.drawDataLabels(); | ||
if (axis.buildStacks) { | ||
axis.buildStacks(); | ||
} | ||
// delete this function to allow it only once | ||
series.animate = null; | ||
} | ||
} | ||
} | ||
}); | ||
// loop through this axis' series | ||
Highcharts.each(axis.series, function (series) { | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'init', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (series.visible || !chart.options.chart.ignoreHiddenSeries) { | ||
if (this.chart.is3d()) { | ||
var seriesOptions = this.options, | ||
grouping = seriesOptions.grouping, | ||
stacking = seriesOptions.stacking, | ||
z = 0; | ||
if (!(grouping !== undefined && !grouping)) { | ||
var stacks = this.chart.retrieveStacks(stacking), | ||
stack = seriesOptions.stack || 0, | ||
i; // position within the stack | ||
for (i = 0; i < stacks[stack].series.length; i++) { | ||
if (stacks[stack].series[i] === this) { | ||
break; | ||
} | ||
} | ||
z = (stacks.totalStacks * 10) - (10 * (stacks.totalStacks - stacks[stack].position)) - i; | ||
} | ||
seriesOptions.zIndex = z; | ||
} | ||
}); | ||
function draw3DPoints(proceed) { | ||
// Do not do this if the chart is not 3D | ||
if (this.chart.is3d()) { | ||
var grouping = this.chart.options.plotOptions.column.grouping; | ||
if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) { | ||
this.group.attr({zIndex : (this.group.zIndex * 10)}); | ||
this.zIndexSet = true; // #4062 set zindex only once | ||
} | ||
var seriesOptions = series.options, | ||
zData, | ||
threshold = seriesOptions.threshold; | ||
var options = this.options, | ||
states = this.options.states; | ||
this.borderWidth = options.borderWidth = defined(options.edgeWidth) ? options.edgeWidth : 1; //#4055 | ||
axis.hasVisibleSeries = true; | ||
Highcharts.each(this.data, function (point) { | ||
if (point.y !== null) { | ||
var pointAttr = point.pointAttr; | ||
// Validate threshold in logarithmic axes | ||
if (axis.isLog && threshold <= 0) { | ||
threshold = null; | ||
} | ||
// Set the border color to the fill color to provide a smooth edge | ||
this.borderColor = Highcharts.pick(options.edgeColor, pointAttr[''].fill); | ||
zData = series.zData; | ||
if (zData.length) { | ||
axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData)); | ||
axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData)); | ||
} | ||
} | ||
}); | ||
} | ||
}); | ||
pointAttr[''].stroke = this.borderColor; | ||
pointAttr.hover.stroke = Highcharts.pick(states.hover.edgeColor, this.borderColor); | ||
pointAttr.select.stroke = Highcharts.pick(states.select.edgeColor, this.borderColor); | ||
} | ||
}); | ||
} | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} | ||
/** | ||
* Extend the chart getAxes method to also get the color axis | ||
*/ | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'getAxes', function (proceed) { | ||
var chart = this, | ||
options = this.options, | ||
zAxisOptions = options.zAxis = Highcharts.splat(options.zAxis || {}); | ||
Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed) { | ||
// Only do this for 3D columns and columnranges | ||
if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) { | ||
var series = this, | ||
chart = series.chart; | ||
proceed.call(this); | ||
var args = arguments, | ||
alignTo = args[4]; | ||
var pos = ({x: alignTo.x, y: alignTo.y, z: series.z}); | ||
pos = perspective([pos], chart, true)[0]; | ||
alignTo.x = pos.x; | ||
alignTo.y = pos.y; | ||
} | ||
if (!chart.is3d()) { | ||
return; | ||
} | ||
this.zAxis = []; | ||
Highcharts.each(zAxisOptions, function (axisOptions, i) { | ||
axisOptions.index = i; | ||
axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis | ||
var zAxis = new ZAxis(chart, axisOptions); | ||
zAxis.setScale(); | ||
}); | ||
}); | ||
/*** | ||
EXTENSION FOR 3D COLUMNS | ||
***/ | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
if (Highcharts.seriesTypes.columnrange) { | ||
Highcharts.wrap(Highcharts.seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints); | ||
} | ||
var series = this, | ||
chart = series.chart, | ||
seriesOptions = series.options, | ||
depth = seriesOptions.depth || 25; | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'drawPoints', draw3DPoints); | ||
var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i; | ||
var z = stack * (depth + (seriesOptions.groupZPadding || 1)); | ||
/*** | ||
EXTENSION FOR 3D CYLINDRICAL COLUMNS | ||
Not supported | ||
***/ | ||
/* | ||
var defaultOptions = Highcharts.getOptions(); | ||
defaultOptions.plotOptions.cylinder = Highcharts.merge(defaultOptions.plotOptions.column); | ||
var CylinderSeries = Highcharts.extendClass(Highcharts.seriesTypes.column, { | ||
type: 'cylinder' | ||
}); | ||
Highcharts.seriesTypes.cylinder = CylinderSeries; | ||
if (seriesOptions.grouping !== false) { | ||
z = 0; | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.cylinder.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
z += (seriesOptions.groupZPadding || 1); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
var shapeArgs = point.shapeArgs, | ||
tooltipPos = point.tooltipPos; | ||
var series = this, | ||
chart = series.chart, | ||
options = chart.options, | ||
cylOptions = options.plotOptions.cylinder, | ||
options3d = options.chart.options3d, | ||
depth = cylOptions.depth || 0, | ||
origin = { | ||
x: chart.inverted ? chart.plotHeight / 2 : chart.plotWidth / 2, | ||
y: chart.inverted ? chart.plotWidth / 2 : chart.plotHeight / 2, | ||
z: options3d.depth, | ||
vd: options3d.viewDistance | ||
}, | ||
alpha = options3d.alpha; | ||
point.shapeType = 'cuboid'; | ||
shapeArgs.z = z; | ||
shapeArgs.depth = depth; | ||
shapeArgs.insidePlotArea = true; | ||
var z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth; | ||
z += depth / 2; | ||
// Translate the tooltip position in 3d space | ||
tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], chart, false)[0]; | ||
point.tooltipPos = [tooltipPos.x, tooltipPos.y]; | ||
} | ||
}); | ||
// store for later use #4067 | ||
series.z = z; | ||
}); | ||
if (cylOptions.grouping !== false) { z = 0; } | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'animate', function (proceed) { | ||
if (!this.chart.is3d()) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { | ||
var args = arguments, | ||
init = args[1], | ||
yAxis = this.yAxis, | ||
series = this, | ||
reversed = this.yAxis.reversed; | ||
Highcharts.each(series.data, function (point) { | ||
var shapeArgs = point.shapeArgs; | ||
point.shapeType = 'arc3d'; | ||
shapeArgs.x += depth / 2; | ||
shapeArgs.z = z; | ||
shapeArgs.start = 0; | ||
shapeArgs.end = 2 * PI; | ||
shapeArgs.r = depth * 0.95; | ||
shapeArgs.innerR = 0; | ||
shapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z; | ||
shapeArgs.alpha = 90 - alpha; | ||
shapeArgs.beta = 0; | ||
shapeArgs.origin = origin; | ||
}); | ||
}); | ||
*//*** | ||
EXTENSION FOR 3D PIES | ||
***/ | ||
if (Highcharts.svg) { // VML is too slow anyway | ||
if (init) { | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
point.height = point.shapeArgs.height; | ||
point.shapey = point.shapeArgs.y; //#2968 | ||
point.shapeArgs.height = 1; | ||
if (!reversed) { | ||
if (point.stackY) { | ||
point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY); | ||
} else { | ||
point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height); | ||
} | ||
} | ||
} | ||
}); | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { // run the animation | ||
Highcharts.each(series.data, function (point) { | ||
if (point.y !== null) { | ||
point.shapeArgs.height = point.height; | ||
point.shapeArgs.y = point.shapey; //#2968 | ||
// null value do not have a graphic | ||
if (point.graphic) { | ||
point.graphic.animate(point.shapeArgs, series.options.animation); | ||
} | ||
} | ||
}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
var series = this, | ||
chart = series.chart, | ||
options = chart.options, | ||
seriesOptions = series.options, | ||
depth = seriesOptions.depth || 0, | ||
options3d = options.chart.options3d, | ||
origin = { | ||
x: chart.plotWidth / 2, | ||
y: chart.plotHeight / 2, | ||
z: options3d.depth | ||
}, | ||
alpha = options3d.alpha, | ||
beta = options3d.beta, | ||
z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth; | ||
// redraw datalabels to the correct position | ||
this.drawDataLabels(); | ||
z += depth / 2; | ||
// delete this function to allow it only once | ||
series.animate = null; | ||
} | ||
} | ||
} | ||
}); | ||
if (seriesOptions.grouping !== false) { z = 0; } | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'init', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.each(series.data, function (point) { | ||
if (this.chart.is3d()) { | ||
var seriesOptions = this.options, | ||
grouping = seriesOptions.grouping, | ||
stacking = seriesOptions.stacking, | ||
reversedStacks = pick(this.yAxis.options.reversedStacks, true), | ||
z = 0; | ||
if (!(grouping !== undefined && !grouping)) { | ||
var stacks = this.chart.retrieveStacks(stacking), | ||
stack = seriesOptions.stack || 0, | ||
i; // position within the stack | ||
for (i = 0; i < stacks[stack].series.length; i++) { | ||
if (stacks[stack].series[i] === this) { | ||
break; | ||
} | ||
} | ||
z = (10 * (stacks.totalStacks - stacks[stack].position)) + (reversedStacks ? i : -i); // #4369 | ||
var shapeArgs = point.shapeArgs, | ||
angle; | ||
// In case when axis is reversed, columns are also reversed inside the group (#3737) | ||
if (!this.xAxis.reversed) { | ||
z = (stacks.totalStacks * 10) - z; | ||
} | ||
} | ||
point.shapeType = 'arc3d'; | ||
seriesOptions.zIndex = z; | ||
} | ||
}); | ||
function draw3DPoints(proceed) { | ||
// Do not do this if the chart is not 3D | ||
if (this.chart.is3d()) { | ||
var grouping = this.chart.options.plotOptions.column.grouping; | ||
if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) { | ||
this.group.attr({ zIndex: this.group.zIndex * 10 }); | ||
this.zIndexSet = true; // #4062 set zindex only once | ||
} | ||
shapeArgs.z = z; | ||
shapeArgs.depth = depth * 0.75; | ||
shapeArgs.origin = origin; | ||
shapeArgs.alpha = alpha; | ||
shapeArgs.beta = beta; | ||
shapeArgs.center = series.center; | ||
angle = (shapeArgs.end + shapeArgs.start) / 2; | ||
var options = this.options, | ||
states = this.options.states; | ||
point.slicedTranslation = { | ||
translateX : round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)), | ||
translateY : round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)) | ||
}; | ||
}); | ||
}); | ||
this.borderWidth = options.borderWidth = defined(options.edgeWidth) ? options.edgeWidth : 1; //#4055 | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function (proceed) { | ||
var args = arguments; | ||
return this.series.chart.is3d() ? [] : proceed.call(this, args[1]); | ||
}); | ||
Highcharts.each(this.data, function (point) { | ||
if (point.y !== null) { | ||
var pointAttr = point.pointAttr; | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawPoints', function (proceed) { | ||
// Set the border color to the fill color to provide a smooth edge | ||
this.borderColor = Highcharts.pick(options.edgeColor, pointAttr[''].fill); | ||
var seriesGroup = this.group, | ||
options = this.options, | ||
states = options.states; | ||
pointAttr[''].stroke = this.borderColor; | ||
pointAttr.hover.stroke = Highcharts.pick(states.hover.edgeColor, this.borderColor); | ||
pointAttr.select.stroke = Highcharts.pick(states.select.edgeColor, this.borderColor); | ||
} | ||
}); | ||
} | ||
// Do not do this if the chart is not 3D | ||
if (this.chart.is3d()) { | ||
// Set the border color to the fill color to provide a smooth edge | ||
this.borderWidth = options.borderWidth = options.edgeWidth || 1; | ||
this.borderColor = options.edgeColor = Highcharts.pick(options.edgeColor, options.borderColor, undefined); | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} | ||
states.hover.borderColor = Highcharts.pick(states.hover.edgeColor, this.borderColor); | ||
states.hover.borderWidth = Highcharts.pick(states.hover.edgeWidth, this.borderWidth); | ||
states.select.borderColor = Highcharts.pick(states.select.edgeColor, this.borderColor); | ||
states.select.borderWidth = Highcharts.pick(states.select.edgeWidth, this.borderWidth); | ||
Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed) { | ||
Highcharts.each(this.data, function (point) { | ||
var pointAttr = point.pointAttr; | ||
pointAttr[''].stroke = point.series.borderColor || point.color; | ||
pointAttr['']['stroke-width'] = point.series.borderWidth; | ||
pointAttr.hover.stroke = states.hover.borderColor; | ||
pointAttr.hover['stroke-width'] = states.hover.borderWidth; | ||
pointAttr.select.stroke = states.select.borderColor; | ||
pointAttr.select['stroke-width'] = states.select.borderWidth; | ||
}); | ||
} | ||
// Only do this for 3D columns and columnranges | ||
if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) { | ||
var series = this, | ||
chart = series.chart; | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
var args = arguments, | ||
alignTo = args[4]; | ||
if (this.chart.is3d()) { | ||
Highcharts.each(this.points, function (point) { | ||
var graphic = point.graphic; | ||
var pos = ({ x: alignTo.x, y: alignTo.y, z: series.z }); | ||
pos = perspective([pos], chart, true)[0]; | ||
alignTo.x = pos.x; | ||
alignTo.y = pos.y; | ||
} | ||
graphic.out.add(seriesGroup); | ||
graphic.inn.add(seriesGroup); | ||
graphic.side1.add(seriesGroup); | ||
graphic.side2.add(seriesGroup); | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
// Hide null or 0 points (#3006, 3650) | ||
graphic[point.y ? 'show' : 'hide'](); | ||
}); | ||
} | ||
}); | ||
if (Highcharts.seriesTypes.columnrange) { | ||
Highcharts.wrap(Highcharts.seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints); | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawDataLabels', function (proceed) { | ||
if (this.chart.is3d()) { | ||
var series = this; | ||
Highcharts.each(series.data, function (point) { | ||
var shapeArgs = point.shapeArgs, | ||
r = shapeArgs.r, | ||
d = shapeArgs.depth, | ||
a1 = (shapeArgs.alpha || series.chart.options.chart.options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values | ||
a2 = (shapeArgs.start + shapeArgs.end) / 2, | ||
labelPos = point.labelPos; | ||
Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'drawPoints', draw3DPoints); | ||
labelPos[1] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0); | ||
labelPos[3] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0); | ||
labelPos[5] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0); | ||
/*** | ||
EXTENSION FOR 3D CYLINDRICAL COLUMNS | ||
Not supported | ||
***/ | ||
/* | ||
var defaultOptions = Highcharts.getOptions(); | ||
defaultOptions.plotOptions.cylinder = Highcharts.merge(defaultOptions.plotOptions.column); | ||
var CylinderSeries = Highcharts.extendClass(Highcharts.seriesTypes.column, { | ||
type: 'cylinder' | ||
}); | ||
Highcharts.seriesTypes.cylinder = CylinderSeries; | ||
}); | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.cylinder.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'addPoint', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (this.chart.is3d()) { | ||
// destroy (and rebuild) everything!!! | ||
this.update(this.userOptions, true); // #3845 pass the old options | ||
} | ||
}); | ||
var series = this, | ||
chart = series.chart, | ||
options = chart.options, | ||
cylOptions = options.plotOptions.cylinder, | ||
options3d = options.chart.options3d, | ||
depth = cylOptions.depth || 0, | ||
alpha = options3d.alpha; | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'animate', function (proceed) { | ||
if (!this.chart.is3d()) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { | ||
var args = arguments, | ||
init = args[1], | ||
animation = this.options.animation, | ||
attribs, | ||
center = this.center, | ||
group = this.group, | ||
markerGroup = this.markerGroup; | ||
var z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth; | ||
z += depth / 2; | ||
if (Highcharts.svg) { // VML is too slow anyway | ||
if (animation === true) { | ||
animation = {}; | ||
} | ||
// Initialize the animation | ||
if (init) { | ||
// Scale down the group and place it in the center | ||
group.oldtranslateX = group.translateX; | ||
group.oldtranslateY = group.translateY; | ||
attribs = { | ||
translateX: center[0], | ||
translateY: center[1], | ||
scaleX: 0.001, // #1499 | ||
scaleY: 0.001 | ||
}; | ||
group.attr(attribs); | ||
if (markerGroup) { | ||
markerGroup.attrSetters = group.attrSetters; | ||
markerGroup.attr(attribs); | ||
} | ||
// Run the animation | ||
} else { | ||
attribs = { | ||
translateX: group.oldtranslateX, | ||
translateY: group.oldtranslateY, | ||
scaleX: 1, | ||
scaleY: 1 | ||
}; | ||
group.animate(attribs, animation); | ||
if (cylOptions.grouping !== false) { z = 0; } | ||
if (markerGroup) { | ||
markerGroup.animate(attribs, animation); | ||
} | ||
// Delete this function to allow it only once | ||
this.animate = null; | ||
} | ||
} | ||
} | ||
});/*** | ||
EXTENSION FOR 3D SCATTER CHART | ||
***/ | ||
Highcharts.each(series.data, function (point) { | ||
var shapeArgs = point.shapeArgs; | ||
point.shapeType = 'arc3d'; | ||
shapeArgs.x += depth / 2; | ||
shapeArgs.z = z; | ||
shapeArgs.start = 0; | ||
shapeArgs.end = 2 * PI; | ||
shapeArgs.r = depth * 0.95; | ||
shapeArgs.innerR = 0; | ||
shapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z; | ||
shapeArgs.alpha = 90 - alpha; | ||
shapeArgs.beta = 0; | ||
}); | ||
}); | ||
*/ | ||
/*** | ||
EXTENSION FOR 3D PIES | ||
***/ | ||
Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'translate', function (proceed) { | ||
//function translate3d(proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'translate', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
var series = this, | ||
chart = series.chart, | ||
zAxis = Highcharts.pick(series.zAxis, chart.options.zAxis[0]), | ||
rawPoints = [], | ||
rawPoint, | ||
projectedPoints, | ||
projectedPoint, | ||
zValue, | ||
i; | ||
// Do not do this if the chart is not 3D | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
for (i = 0; i < series.data.length; i++) { | ||
rawPoint = series.data[i]; | ||
zValue = zAxis.isLog && zAxis.val2lin ? zAxis.val2lin(rawPoint.z) : rawPoint.z; // #4562 | ||
rawPoint.plotZ = zAxis.translate(zValue); | ||
var series = this, | ||
chart = series.chart, | ||
options = chart.options, | ||
seriesOptions = series.options, | ||
depth = seriesOptions.depth || 0, | ||
options3d = options.chart.options3d, | ||
alpha = options3d.alpha, | ||
beta = options3d.beta, | ||
z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth; | ||
rawPoint.isInside = rawPoint.isInside ? (zValue >= zAxis.min && zValue <= zAxis.max) : false; | ||
z += depth / 2; | ||
rawPoints.push({ | ||
x: rawPoint.plotX, | ||
y: rawPoint.plotY, | ||
z: rawPoint.plotZ | ||
}); | ||
} | ||
if (seriesOptions.grouping !== false) { | ||
z = 0; | ||
} | ||
projectedPoints = perspective(rawPoints, chart, true); | ||
each(series.data, function (point) { | ||
for (i = 0; i < series.data.length; i++) { | ||
rawPoint = series.data[i]; | ||
projectedPoint = projectedPoints[i]; | ||
var shapeArgs = point.shapeArgs, | ||
angle; | ||
rawPoint.plotXold = rawPoint.plotX; | ||
rawPoint.plotYold = rawPoint.plotY; | ||
point.shapeType = 'arc3d'; | ||
rawPoint.plotX = projectedPoint.x; | ||
rawPoint.plotY = projectedPoint.y; | ||
rawPoint.plotZ = projectedPoint.z; | ||
shapeArgs.z = z; | ||
shapeArgs.depth = depth * 0.75; | ||
shapeArgs.alpha = alpha; | ||
shapeArgs.beta = beta; | ||
shapeArgs.center = series.center; | ||
angle = (shapeArgs.end + shapeArgs.start) / 2; | ||
} | ||
point.slicedTranslation = { | ||
translateX: round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)), | ||
translateY: round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)) | ||
}; | ||
}); | ||
}); | ||
}); | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function (proceed) { | ||
var args = arguments; | ||
return this.series.chart.is3d() ? [] : proceed.call(this, args[1]); | ||
}); | ||
Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proceed, chart, options) { | ||
if (chart.is3d()) { | ||
// add a third coordinate | ||
this.axisTypes = ['xAxis', 'yAxis', 'zAxis']; | ||
this.pointArrayMap = ['x', 'y', 'z']; | ||
this.parallelArrays = ['x', 'y', 'z']; | ||
} | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawPoints', function (proceed) { | ||
var result = proceed.apply(this, [chart, options]); | ||
var options = this.options, | ||
states = options.states; | ||
if (this.chart.is3d()) { | ||
// Set a new default tooltip formatter | ||
var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>'; | ||
if (this.userOptions.tooltip) { | ||
this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip; | ||
} else { | ||
this.tooltipOptions.pointFormat = default3dScatterTooltip; | ||
} | ||
} | ||
return result; | ||
}); | ||
/** | ||
* Extension to the VML Renderer | ||
*/ | ||
if (Highcharts.VMLRenderer) { | ||
// Do not do this if the chart is not 3D | ||
if (this.chart.is3d()) { | ||
// Set the border color to the fill color to provide a smooth edge | ||
this.borderWidth = options.borderWidth = options.edgeWidth || 1; | ||
this.borderColor = options.edgeColor = Highcharts.pick(options.edgeColor, options.borderColor, undefined); | ||
Highcharts.setOptions({animate: false}); | ||
states.hover.borderColor = Highcharts.pick(states.hover.edgeColor, this.borderColor); | ||
states.hover.borderWidth = Highcharts.pick(states.hover.edgeWidth, this.borderWidth); | ||
states.select.borderColor = Highcharts.pick(states.select.edgeColor, this.borderColor); | ||
states.select.borderWidth = Highcharts.pick(states.select.edgeWidth, this.borderWidth); | ||
Highcharts.VMLRenderer.prototype.cuboid = Highcharts.SVGRenderer.prototype.cuboid; | ||
Highcharts.VMLRenderer.prototype.cuboidPath = Highcharts.SVGRenderer.prototype.cuboidPath; | ||
each(this.data, function (point) { | ||
var pointAttr = point.pointAttr; | ||
pointAttr[''].stroke = point.series.borderColor || point.color; | ||
pointAttr['']['stroke-width'] = point.series.borderWidth; | ||
pointAttr.hover.stroke = states.hover.borderColor; | ||
pointAttr.hover['stroke-width'] = states.hover.borderWidth; | ||
pointAttr.select.stroke = states.select.borderColor; | ||
pointAttr.select['stroke-width'] = states.select.borderWidth; | ||
}); | ||
} | ||
Highcharts.VMLRenderer.prototype.toLinePath = Highcharts.SVGRenderer.prototype.toLinePath; | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
Highcharts.VMLRenderer.prototype.createElement3D = Highcharts.SVGRenderer.prototype.createElement3D; | ||
if (this.chart.is3d()) { | ||
each(this.points, function (point) { | ||
var graphic = point.graphic; | ||
Highcharts.VMLRenderer.prototype.arc3d = function (shapeArgs) { | ||
var result = Highcharts.SVGRenderer.prototype.arc3d.call(this, shapeArgs); | ||
result.css({zIndex: result.zIndex}); | ||
return result; | ||
}; | ||
// #4584 Check if has graphic - null points don't have it | ||
if (graphic) { | ||
// Hide null or 0 points (#3006, 3650) | ||
graphic[point.y ? 'show' : 'hide'](); | ||
} | ||
}); | ||
} | ||
}); | ||
Highcharts.VMLRenderer.prototype.arc3dPath = Highcharts.SVGRenderer.prototype.arc3dPath; | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawDataLabels', function (proceed) { | ||
if (this.chart.is3d()) { | ||
var series = this, | ||
chart = series.chart, | ||
options3d = chart.options.chart.options3d; | ||
each(series.data, function (point) { | ||
var shapeArgs = point.shapeArgs, | ||
r = shapeArgs.r, | ||
a1 = (shapeArgs.alpha || options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values | ||
b1 = (shapeArgs.beta || options3d.beta) * deg2rad, | ||
a2 = (shapeArgs.start + shapeArgs.end) / 2, | ||
labelPos = point.labelPos, | ||
labelIndexes = [0, 2, 4], // [x1, y1, x2, y2, x3, y3] | ||
yOffset = (-r * (1 - cos(a1)) * sin(a2)), // + (sin(a2) > 0 ? sin(a1) * d : 0) | ||
xOffset = r * (cos(b1) - 1) * cos(a2); | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
// VML doesn't support a negative z-index | ||
if (this.sideFrame) { | ||
this.sideFrame.css({zIndex: 0}); | ||
this.sideFrame.front.attr({fill: this.sideFrame.color}); | ||
} | ||
if (this.bottomFrame) { | ||
this.bottomFrame.css({zIndex: 1}); | ||
this.bottomFrame.front.attr({fill: this.bottomFrame.color}); | ||
} | ||
if (this.backFrame) { | ||
this.backFrame.css({zIndex: 0}); | ||
this.backFrame.front.attr({fill: this.backFrame.color}); | ||
} | ||
}); | ||
// Apply perspective on label positions | ||
each(labelIndexes, function (index) { | ||
labelPos[index] += xOffset; | ||
labelPos[index + 1] += yOffset; | ||
}); | ||
}); | ||
} | ||
} | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
}); | ||
}(Highcharts)); | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'addPoint', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (this.chart.is3d()) { | ||
// destroy (and rebuild) everything!!! | ||
this.update(this.userOptions, true); // #3845 pass the old options | ||
} | ||
}); | ||
Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'animate', function (proceed) { | ||
if (!this.chart.is3d()) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
} else { | ||
var args = arguments, | ||
init = args[1], | ||
animation = this.options.animation, | ||
attribs, | ||
center = this.center, | ||
group = this.group, | ||
markerGroup = this.markerGroup; | ||
if (Highcharts.svg) { // VML is too slow anyway | ||
if (animation === true) { | ||
animation = {}; | ||
} | ||
// Initialize the animation | ||
if (init) { | ||
// Scale down the group and place it in the center | ||
group.oldtranslateX = group.translateX; | ||
group.oldtranslateY = group.translateY; | ||
attribs = { | ||
translateX: center[0], | ||
translateY: center[1], | ||
scaleX: 0.001, // #1499 | ||
scaleY: 0.001 | ||
}; | ||
group.attr(attribs); | ||
if (markerGroup) { | ||
markerGroup.attrSetters = group.attrSetters; | ||
markerGroup.attr(attribs); | ||
} | ||
// Run the animation | ||
} else { | ||
attribs = { | ||
translateX: group.oldtranslateX, | ||
translateY: group.oldtranslateY, | ||
scaleX: 1, | ||
scaleY: 1 | ||
}; | ||
group.animate(attribs, animation); | ||
if (markerGroup) { | ||
markerGroup.animate(attribs, animation); | ||
} | ||
// Delete this function to allow it only once | ||
this.animate = null; | ||
} | ||
} | ||
} | ||
}); | ||
/*** | ||
EXTENSION FOR 3D SCATTER CHART | ||
***/ | ||
Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'translate', function (proceed) { | ||
//function translate3d(proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
if (!this.chart.is3d()) { | ||
return; | ||
} | ||
var series = this, | ||
chart = series.chart, | ||
zAxis = Highcharts.pick(series.zAxis, chart.options.zAxis[0]), | ||
rawPoints = [], | ||
rawPoint, | ||
projectedPoints, | ||
projectedPoint, | ||
zValue, | ||
i; | ||
for (i = 0; i < series.data.length; i++) { | ||
rawPoint = series.data[i]; | ||
zValue = zAxis.isLog && zAxis.val2lin ? zAxis.val2lin(rawPoint.z) : rawPoint.z; // #4562 | ||
rawPoint.plotZ = zAxis.translate(zValue); | ||
rawPoint.isInside = rawPoint.isInside ? (zValue >= zAxis.min && zValue <= zAxis.max) : false; | ||
rawPoints.push({ | ||
x: rawPoint.plotX, | ||
y: rawPoint.plotY, | ||
z: rawPoint.plotZ | ||
}); | ||
} | ||
projectedPoints = perspective(rawPoints, chart, true); | ||
for (i = 0; i < series.data.length; i++) { | ||
rawPoint = series.data[i]; | ||
projectedPoint = projectedPoints[i]; | ||
rawPoint.plotXold = rawPoint.plotX; | ||
rawPoint.plotYold = rawPoint.plotY; | ||
rawPoint.plotX = projectedPoint.x; | ||
rawPoint.plotY = projectedPoint.y; | ||
rawPoint.plotZ = projectedPoint.z; | ||
} | ||
}); | ||
Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proceed, chart, options) { | ||
if (chart.is3d()) { | ||
// add a third coordinate | ||
this.axisTypes = ['xAxis', 'yAxis', 'zAxis']; | ||
this.pointArrayMap = ['x', 'y', 'z']; | ||
this.parallelArrays = ['x', 'y', 'z']; | ||
} | ||
var result = proceed.apply(this, [chart, options]); | ||
if (this.chart.is3d()) { | ||
// Set a new default tooltip formatter | ||
var default3dScatterTooltip = 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>z: <b>{point.z}</b><br/>'; | ||
if (this.userOptions.tooltip) { | ||
this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip; | ||
} else { | ||
this.tooltipOptions.pointFormat = default3dScatterTooltip; | ||
} | ||
} | ||
return result; | ||
}); | ||
/** | ||
* Extension to the VML Renderer | ||
*/ | ||
if (Highcharts.VMLRenderer) { | ||
Highcharts.setOptions({ animate: false }); | ||
Highcharts.VMLRenderer.prototype.cuboid = Highcharts.SVGRenderer.prototype.cuboid; | ||
Highcharts.VMLRenderer.prototype.cuboidPath = Highcharts.SVGRenderer.prototype.cuboidPath; | ||
Highcharts.VMLRenderer.prototype.toLinePath = Highcharts.SVGRenderer.prototype.toLinePath; | ||
Highcharts.VMLRenderer.prototype.createElement3D = Highcharts.SVGRenderer.prototype.createElement3D; | ||
Highcharts.VMLRenderer.prototype.arc3d = function (shapeArgs) { | ||
var result = Highcharts.SVGRenderer.prototype.arc3d.call(this, shapeArgs); | ||
result.css({ zIndex: result.zIndex }); | ||
return result; | ||
}; | ||
Highcharts.VMLRenderer.prototype.arc3dPath = Highcharts.SVGRenderer.prototype.arc3dPath; | ||
Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) { | ||
proceed.apply(this, [].slice.call(arguments, 1)); | ||
// VML doesn't support a negative z-index | ||
if (this.sideFrame) { | ||
this.sideFrame.css({ zIndex: 0 }); | ||
this.sideFrame.front.attr({ fill: this.sideFrame.color }); | ||
} | ||
if (this.bottomFrame) { | ||
this.bottomFrame.css({ zIndex: 1 }); | ||
this.bottomFrame.front.attr({ fill: this.bottomFrame.color }); | ||
} | ||
if (this.backFrame) { | ||
this.backFrame.css({ zIndex: 0 }); | ||
this.backFrame.front.attr({ fill: this.backFrame.color }); | ||
} | ||
}); | ||
} | ||
})); |
/* | ||
Highcharts JS v4.1.9 (2015-10-07) | ||
Highcharts JS v4.1.10 (2015-12-07) | ||
@@ -8,49 +8,49 @@ (c) 2009-2014 Torstein Honsi | ||
*/ | ||
(function(n,G){function L(a,b,c){this.init.call(this,a,b,c)}var Q=n.arrayMin,R=n.arrayMax,s=n.each,I=n.extend,t=n.merge,S=n.map,o=n.pick,B=n.pInt,p=n.getOptions().plotOptions,i=n.seriesTypes,u=n.extendClass,M=n.splat,r=n.wrap,N=n.Axis,z=n.Tick,J=n.Point,T=n.Pointer,U=n.CenteredSeriesMixin,A=n.TrackerMixin,w=n.Series,y=Math,E=y.round,C=y.floor,O=y.max,V=n.Color,v=function(){};I(L.prototype,{init:function(a,b,c){var d=this,e=d.defaultOptions;d.chart=b;d.options=a=t(e,b.angular?{background:{}}:void 0, | ||
a);(a=a.background)&&s([].concat(M(a)).reverse(),function(a){var b=a.backgroundColor,k=c.userOptions,a=t(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a);k.plotBands=k.plotBands||[];k.plotBands!==c.options.plotBands&&k.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0, | ||
"#FFF"],[1,"#DDD"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});var H=N.prototype,z=z.prototype,W={getOffset:v,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:v,setCategories:v,setTitle:v},P={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0}, | ||
zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=t(this.defaultOptions,this.defaultRadialOptions,a);if(!a.plotBands)a.plotBands=[]},getOffset:function(){H.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= | ||
U.getCenter.call(this.pane)},getLinePath:function(a,b){var c=this.center,b=o(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){H.setAxisTranslation.call(this);if(this.center)this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset: | ||
0},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){H.setAxisSize.call(this);if(this.isRadial){this.center=this.pane.center=n.CenteredSeriesMixin.getCenter.call(this.pane);if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;this.len=this.width=this.height=this.center[2]*o(this.sector,1)/2}},getPosition:function(a,b){return this.postTranslate(this.isCircular?this.translate(a):0,o(this.isCircular? | ||
b:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,e=this.startAngleRad,f=d[2]/2,h=[o(c.outerRadius,"100%"),c.innerRadius,o(c.thickness,10)],k=/%$/,g,j=this.isCircular;this.options.gridLineInterpolation==="polygon"?d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(a=Math.max(a,this.min), | ||
b=Math.min(b,this.max),j||(h[0]=this.translate(a),h[1]=this.translate(b)),h=S(h,function(a){k.test(a)&&(a=B(a,10)*f/100);return a}),c.shape==="circle"||!j?(a=-Math.PI/2,b=Math.PI*1.5,g=!0):(a=e+this.translate(a),b=e+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],h[0],h[0],{start:Math.min(a,b),end:Math.max(a,b),innerR:o(h[1],h[0]-h[2]),open:g}));return d},getPlotLinePath:function(a,b){var c=this,d=c.center,e=c.chart,f=c.getPosition(a),h,k,g;c.isCircular?g=["M",d[0]+ | ||
e.plotLeft,d[1]+e.plotTop,"L",f.x,f.y]:c.options.gridLineInterpolation==="circle"?(a=c.translate(a))&&(g=c.getLinePath(0,a)):(s(e.xAxis,function(a){a.pane===c.pane&&(h=a)}),g=[],a=c.translate(a),d=h.tickPositions,h.autoConnect&&(d=d.concat([d[0]])),b&&(d=[].concat(d).reverse()),s(d,function(f,b){k=h.getPosition(f,a);g.push(b?"L":"M",k.x,k.y)}));return g},getTitlePosition:function(){var a=this.center,b=this.chart,c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25, | ||
low:0}[c.align]*a[2]+(c.y||0)}}};r(H,"init",function(a,b,c){var l;var d=b.angular,e=b.polar,f=c.isX,h=d&&f,k,g;g=b.options;var j=c.pane||0;if(d){if(I(this,h?W:P),k=!f)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)I(this,P),this.defaultRadialOptions=(k=f)?this.defaultRadialXOptions:t(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!h&&(d||e)){a=this.options;if(!b.panes)b.panes=[];this.pane=(l=b.panes[j]=b.panes[j]||new L(M(g.pane)[j],b,this),j=l);j=j.options; | ||
b.inverted=!1;g.chart.zoomType=null;this.startAngleRad=b=(j.startAngle-90)*Math.PI/180;this.endAngleRad=g=(o(j.endAngle,j.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=k)&&c.max===G&&g-b===2*Math.PI)this.autoConnect=!0}});r(z,"getPosition",function(a,b,c,d,e){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,e)});r(z,"getLabelPosition",function(a,b,c,d,e,f,h,k,g){var j=this.axis,m=f.y,l=20,i=f.align,x=(j.translate(this.pos)+j.startAngleRad+Math.PI/ | ||
2)/Math.PI*180%360;j.isRadial?(a=j.getPosition(this.pos,j.center[2]/2+o(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:x}):m===null&&(m=j.chart.renderer.fontMetrics(d.styles.fontSize).b-d.getBBox().height/2),i===null&&(j.isCircular?(this.label.getBBox().width>j.len*j.tickInterval/(j.max-j.min)&&(l=0),i=x>l&&x<180-l?"left":x>180+l&&x<360-l?"right":"center"):i="center",d.attr({align:i})),a.x+=f.x,a.y+=m):a=a.call(this,b,c,d,e,f,h,k,g);return a});r(z,"getMarkPath",function(a,b,c,d,e,f,h){var k= | ||
this.axis;k.isRadial?(a=k.getPosition(this.pos,k.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,e,f,h);return b});p.arearange=t(p.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}});i.arearange=u(i.area,{type:"arearange",pointArrayMap:["low","high"], | ||
dataLabelCollections:["dataLabel","dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var b=this.chart,c=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=c.x-b.plotLeft;a.plotHigh=c.y-b.plotTop},getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y=null;else if(b.low===null&&b.high!==null)b.y=b.high});w.prototype.getSegments.call(this)}, | ||
translate:function(){var a=this,b=a.yAxis;i.area.prototype.translate.apply(a);s(a.points,function(a){var d=a.low,e=a.high,f=a.plotY;e===null&&d===null?a.y=null:d===null?(a.plotLow=a.plotY=null,a.plotHigh=b.translate(e,0,1,0,1)):e===null?(a.plotLow=f,a.plotHigh=null):(a.plotLow=f,a.plotHigh=b.translate(e,0,1,0,1))});this.chart.polar&&s(this.points,function(b){a.highToXY(b)})},getSegmentPath:function(a){var b,c=[],d=a.length,e=w.prototype.getSegmentPath,f,h;h=this.options;var k=h.step;for(b=HighchartsAdapter.grep(a, | ||
function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotHighX||f.plotX,plotY:f.plotHigh});a=e.call(this,b);if(k)k===!0&&(k="left"),h.step={left:"right",center:"center",right:"left"}[k];c=e.call(this,c);h.step=k;h=[].concat(a,c);this.chart.polar||(c[0]="L");this.areaPath=this.areaPath.concat(a,c);return h},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],e=w.prototype,f=this.options.dataLabels,h=f.align,k=f.inside,g,j,m=this.chart.inverted;if(f.enabled|| | ||
this._hasPointLabels){for(c=b;c--;)if(g=a[c])if(j=k?g.plotHigh<g.plotLow:g.plotHigh>g.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,d[c]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=j,m){if(!h)f.align=j?"right":"left";f.x=f.xHigh}else f.y=f.yHigh;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments);for(c=b;c--;)if(g=a[c])if(j=k?g.plotHigh<g.plotLow:g.plotHigh>g.plotLow,g.dataLabelUpper=g.dataLabel,g.dataLabel=d[c],g.y=g.low,g.plotY=g._plotY,g.below=!j,m){if(!h)f.align=j?"left":"right"; | ||
f.x=f.xLow}else f.y=f.yLow;e.drawDataLabels&&e.drawDataLabels.apply(this,arguments)}f.align=h},alignDataLabel:function(){i.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:v,getSymbol:v,drawPoints:v});p.areasplinerange=t(p.arearange);i.areasplinerange=u(i.arearange,{type:"areasplinerange",getPointSpline:i.spline.prototype.getPointSpline});(function(){var a=i.column.prototype;p.columnrange=t(p.column,p.arearange,{lineWidth:1,pointRange:null});i.columnrange=u(i.arearange,{type:"columnrange", | ||
translate:function(){var b=this,c=b.yAxis,d;a.translate.apply(b);s(b.points,function(a){var f=a.shapeArgs,h=b.options.minPointLength,k;a.tooltipPos=null;a.plotHigh=d=c.translate(a.high,0,1,0,1);a.plotLow=a.plotY;k=d;a=a.plotY-d;Math.abs(a)<h?(h-=a,a+=h,k-=h/2):a<0&&(a*=-1,k-=a);f.height=a;f.y=k})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:v,crispCol:a.crispCol,pointAttrToOptions:a.pointAttrToOptions,drawPoints:a.drawPoints,drawTracker:a.drawTracker,animate:a.animate,getColumnMetrics:a.getColumnMetrics})})(); | ||
p.gauge=t(p.line,{dataLabels:{enabled:!0,defer:!1,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});A={type:"gauge",pointClass:u(J,{setState:function(a){this.state=a}}),angular:!0,drawGraph:v,fixedBox:!0,forceDL:!0,trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var e=t(b.dial,d.dial),f=B(o(e.radius, | ||
80))*c[2]/200,h=B(o(e.baseLength,70))*f/100,k=B(o(e.rearLength,10))*f/100,g=e.baseWidth||3,j=e.topWidth||1,m=b.overshoot,l=a.startAngleRad+a.translate(d.y,null,null,null,!0);m&&typeof m==="number"?(m=m/180*Math.PI,l=Math.max(a.startAngleRad-m,Math.min(a.endAngleRad+m,l))):b.wrap===!1&&(l=Math.max(a.startAngleRad,Math.min(a.endAngleRad,l)));l=l*180/Math.PI;d.shapeType="path";d.shapeArgs={d:e.path||["M",-k,-g/2,"L",h,-g/2,f,-j/2,f,j/2,h,g/2,-k,g/2,"z"],translateX:c[0],translateY:c[1],rotation:l};d.plotX= | ||
c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,e=d.pivot,f=a.chart.renderer;s(a.points,function(b){var c=b.graphic,g=b.shapeArgs,e=g.d,m=t(d.dial,b.dial);c?(c.animate(g),g.d=e):b.graphic=f[b.shapeType](g).attr({stroke:m.borderColor||"none","stroke-width":m.borderWidth||0,fill:m.backgroundColor||"black",rotation:g.rotation}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,o(e.radius,5)).attr({"stroke-width":e.borderWidth|| | ||
0,stroke:e.borderColor||"silver",fill:e.backgroundColor||"black"}).translate(b[0],b[1]).add(a.group)},animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation},b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);w.prototype.render.call(this);this.group.clip(this.chart.clipRect)}, | ||
setData:function(a,b){w.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();o(b,!0)&&this.chart.redraw()},drawTracker:A&&A.drawTrackerPoint};i.gauge=u(i.line,A);p.boxplot=t(p.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}},threshold:null,tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> <b> {series.name}</b><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'}, | ||
whiskerLength:"50%",whiskerWidth:2});i.boxplot=u(i.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color","stroke-width":"lineWidth"},drawDataLabels:v,translate:function(){var a=this.yAxis,b=this.pointArrayMap;i.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a= | ||
this,b=a.options,c=a.chart.renderer,d,e,f,h,k,g,j,m,l,i,x,n,K,p,t,r,v,u,w,y,B,A,z=a.doQuartiles!==!1,F,D=a.options.whiskerLength;s(a.points,function(q){l=q.graphic;B=q.shapeArgs;x={};p={};r={};A=q.color||a.color;if(q.plotY!==G)if(d=q.pointAttr[q.selected?"selected":""],v=B.width,u=C(B.x),w=u+v,y=E(v/2),e=C(z?q.q1Plot:q.lowPlot),f=C(z?q.q3Plot:q.lowPlot),h=C(q.highPlot),k=C(q.lowPlot),x.stroke=q.stemColor||b.stemColor||A,x["stroke-width"]=o(q.stemWidth,b.stemWidth,b.lineWidth),x.dashstyle=q.stemDashStyle|| | ||
b.stemDashStyle,p.stroke=q.whiskerColor||b.whiskerColor||A,p["stroke-width"]=o(q.whiskerWidth,b.whiskerWidth,b.lineWidth),r.stroke=q.medianColor||b.medianColor||A,r["stroke-width"]=o(q.medianWidth,b.medianWidth,b.lineWidth),j=x["stroke-width"]%2/2,m=u+y+j,i=["M",m,f,"L",m,h,"M",m,e,"L",m,k],z&&(j=d["stroke-width"]%2/2,m=C(m)+j,e=C(e)+j,f=C(f)+j,u+=j,w+=j,n=["M",u,f,"L",u,e,"L",w,e,"L",w,f,"L",u,f,"z"]),D&&(j=p["stroke-width"]%2/2,h+=j,k+=j,F=/%$/.test(D)?y*parseFloat(D)/100:D/2,K=["M",m-F,h,"L",m+ | ||
F,h,"M",m-F,k,"L",m+F,k]),j=r["stroke-width"]%2/2,g=E(q.medianPlot)+j,t=["M",u,g,"L",w,g],l)q.stem.animate({d:i}),D&&q.whiskers.animate({d:K}),z&&q.box.animate({d:n}),q.medianShape.animate({d:t});else{q.graphic=l=c.g().add(a.group);q.stem=c.path(i).attr(x).add(l);if(D)q.whiskers=c.path(K).attr(p).add(l);if(z)q.box=c.path(n).attr(d).add(l);q.medianShape=c.path(t).attr(r).add(l)}})},setStackedPoints:v});p.errorbar=t(p.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'}, | ||
whiskerWidth:null});i.errorbar=u(i.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low,a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:i.arearange?i.arearange.prototype.drawDataLabels:v,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||i.column.prototype.getColumnMetrics.call(this)}});p.waterfall=t(p.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333",dataLabels:{inside:!0},states:{hover:{lineWidthPlus:0}}}); | ||
i.waterfall=u(i.column,{type:"waterfall",upColorProp:"fill",pointValKey:"y",translate:function(){var a=this.options,b=this.yAxis,c,d,e,f,h,k,g,j,m,l=a.threshold,X=a.stacking;i.column.prototype.translate.apply(this);g=j=l;d=this.points;for(c=0,a=d.length;c<a;c++){e=d[c];k=this.processedYData[c];f=e.shapeArgs;m=(h=X&&b.stacks[(this.negStacks&&k<l?"-":"")+this.stackKey])?h[e.x].points[this.index+","+c]:[0,k];if(e.isSum)e.y=k;else if(e.isIntermediateSum)e.y=k-j;h=O(g,g+e.y)+m[0];f.y=b.translate(h,0,1); | ||
if(e.isSum)f.y=b.translate(m[1],0,1),f.height=Math.min(b.translate(m[0],0,1),b.len)-f.y;else if(e.isIntermediateSum)f.y=b.translate(m[1],0,1),f.height=Math.min(b.translate(j,0,1),b.len)-f.y,j=m[1];else{if(g!==0)f.height=k>0?b.translate(g,0,1)-f.y:b.translate(g,0,1)-b.translate(g-k,0,1);g+=k}f.height<0&&(f.y+=f.height,f.height*=-1);e.plotY=f.y=E(f.y)-this.borderWidth%2/2;f.height=O(E(f.height),0.001);e.yBottom=f.y+f.height;f=e.plotY+(e.negative?f.height:0);this.chart.inverted?e.tooltipPos[0]=b.len- | ||
f:e.tooltipPos[1]=f}},processData:function(a){var b=this.yData,c=this.options.data,d,e=b.length,f,h,k,g,j,m;h=f=k=g=this.options.threshold||0;for(m=0;m<e;m++)j=b[m],d=c&&c[m]?c[m]:{},j==="sum"||d.isSum?b[m]=h:j==="intermediateSum"||d.isIntermediateSum?b[m]=f:(h+=j,f+=j),k=Math.min(h,k),g=Math.max(h,g);w.prototype.processData.call(this,a);this.dataMin=k;this.dataMax=g},toYData:function(a){if(a.isSum)return a.x===0?null:"sum";else if(a.isIntermediateSum)return a.x===0?null:"intermediateSum";return a.y}, | ||
getAttribs:function(){i.column.prototype.getAttribs.apply(this,arguments);var a=this,b=a.options,c=b.states,d=b.upColor||a.color,b=n.Color(d).brighten(0.1).get(),e=t(a.pointAttr),f=a.upColorProp;e[""][f]=d;e.hover[f]=c.hover.upColor||b;e.select[f]=c.select.upColor||d;s(a.points,function(f){if(!f.options.color)f.y>0?(f.pointAttr=e,f.color=d):f.pointAttr=a.pointAttr})},getGraphPath:function(){var a=this.data,b=a.length,c=E(this.options.lineWidth+this.borderWidth)%2/2,d=[],e,f,h;for(h=1;h<b;h++)f=a[h].shapeArgs, | ||
e=a[h-1].shapeArgs,f=["M",e.x+e.width,e.y+c,"L",f.x,e.y+c],a[h-1].y<0&&(f[2]+=e.height,f[5]+=e.height),d=d.concat(f);return d},getExtremes:v,drawGraph:w.prototype.drawGraph});p.polygon=t(p.scatter,{marker:{enabled:!1}});i.polygon=u(i.scatter,{type:"polygon",fillGraph:!0,getSegmentPath:function(a){return w.prototype.getSegmentPath.call(this,a).concat("z")},drawGraph:w.prototype.drawGraph,drawLegendSymbol:n.LegendSymbolMixin.drawRectangle});p.bubble=t(p.scatter,{dataLabels:{formatter:function(){return this.point.z}, | ||
inside:!0,verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"},turboThreshold:0,zThreshold:0,zoneAxis:"z"});A=u(J,{haloPath:function(){return J.prototype.haloPath.call(this,this.shapeArgs.r+this.series.options.states.hover.halo.size)},ttBelow:!1});i.bubble=u(i.scatter,{type:"bubble",pointClass:A,pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group", | ||
"dataLabelsGroup"],bubblePadding:!0,zoneAxis:"z",pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=o(b.fillOpacity,0.5),a=a||b.fillColor||this.color;c!==1&&(a=V(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=w.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var e,f,h,k=this.zData,g=[],j=this.options,m=j.sizeBy!=="width", | ||
l=j.zThreshold,i=b-a;for(f=0,e=k.length;f<e;f++)h=k[f],j.sizeByAbsoluteValue&&(h=Math.abs(h-l),b=Math.max(b-l,Math.abs(a-l)),a=0),h===null?h=null:h<a?h=c/2-1:(h=i>0?(h-a)/i:0.5,m&&h>=0&&(h=Math.sqrt(h)),h=y.ceil(c+h*(d-c))/2),g.push(h);this.radii=g},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,e=this.radii;i.scatter.prototype.translate.call(this); | ||
for(a=b.length;a--;)c=b[a],d=e?e[a]:0,typeof d==="number"&&d>=this.minPxSize/2?(c.shapeType="circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d,height:2*d}):c.shapeArgs=c.plotY=c.dlBox=G},drawLegendSymbol:function(a,b){var c=B(a.itemStyle.fontSize)/2;b.legendSymbol=this.chart.renderer.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:i.column.prototype.drawPoints,alignDataLabel:i.column.prototype.alignDataLabel, | ||
buildKDTree:v,applyZones:v});N.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,e=b,f=this.isXAxis,h=f?"xData":"yData",k=this.min,g={},j=y.min(c.plotWidth,c.plotHeight),m=Number.MAX_VALUE,l=-Number.MAX_VALUE,i=this.max-k,x=b/i,n=[];s(this.series,function(b){var h=b.options;if(b.bubblePadding&&(b.visible||!c.options.chart.ignoreHiddenSeries))if(a.allowZoomOutside=!0,n.push(b),f)s(["minSize","maxSize"],function(a){var b=h[a],f=/%$/.test(b),b=B(b);g[a]=f?j*b/100:b}),b.minPxSize= | ||
g.minSize,b.maxPxSize=g.maxSize,b=b.zData,b.length&&(m=o(h.zMin,y.min(m,y.max(Q(b),h.displayNegative===!1?h.zThreshold:-Number.MAX_VALUE))),l=o(h.zMax,y.max(l,R(b))))});s(n,function(a){var b=a[h],c=b.length,g;f&&a.getRadii(m,l,a.minPxSize,a.maxPxSize);if(i>0)for(;c--;)typeof b[c]==="number"&&(g=a.radii[c],d=Math.min((b[c]-k)*x-g,d),e=Math.max((b[c]-k)*x+g,e))});n.length&&i>0&&!this.isLog&&(e-=b,x*=(b+d-e)/b,s([["min","userMin",d],["max","userMax",e]],function(b){o(a.options[b[0]],a[b[1]])===G&&(a[b[0]]+= | ||
b[2]/x)}))};(function(){function a(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0],b[1])},this.closedStacks=!0}function b(a,b){var c=this.chart,g=this.options.animation,d=this.group,e=this.markerGroup,l=this.xAxis.center,i=c.plotLeft,n=c.plotTop;if(c.polar){if(c.renderer.isSVG)g===!0&&(g={}),b?(c={translateX:l[0]+i,translateY:l[1]+n,scaleX:0.001,scaleY:0.001},d.attr(c),e&&e.attr(c)):(c={translateX:i,translateY:n,scaleX:1,scaleY:1}, | ||
d.animate(c,g),e&&e.animate(c,g),this.animate=null)}else a.call(this,b)}var c=w.prototype,d=T.prototype,e;c.searchPointByAngle=function(a){var b=this.chart,c=this.xAxis.pane.center;return this.searchKDTree({clientX:180+Math.atan2(a.chartX-c[0]-b.plotLeft,a.chartY-c[1]-b.plotTop)*(-180/Math.PI)})};r(c,"buildKDTree",function(a){if(this.chart.polar)this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.kdDimensions=2;a.apply(this)});c.toXY=function(a){var b,c=this.chart,g=a.plotX;b=a.plotY;a.rectPlotX= | ||
g;a.rectPlotY=b;b=this.xAxis.postTranslate(a.plotX,this.yAxis.len-b);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop;this.kdByAngle?(c=(g/Math.PI*180+this.xAxis.pane.options.startAngle)%360,c<0&&(c+=360),a.clientX=c):a.clientX=a.plotX};i.area&&r(i.area.prototype,"init",a);i.areaspline&&r(i.areaspline.prototype,"init",a);i.spline&&r(i.spline.prototype,"getPointSpline",function(a,b,c,g){var d,e,l,i,n,p,o;if(this.chart.polar){d=c.plotX;e=c.plotY;a=b[g-1];l=b[g+1];this.connectEnds&& | ||
(a||(a=b[b.length-2]),l||(l=b[1]));if(a&&l)i=a.plotX,n=a.plotY,b=l.plotX,p=l.plotY,i=(1.5*d+i)/2.5,n=(1.5*e+n)/2.5,l=(1.5*d+b)/2.5,o=(1.5*e+p)/2.5,b=Math.sqrt(Math.pow(i-d,2)+Math.pow(n-e,2)),p=Math.sqrt(Math.pow(l-d,2)+Math.pow(o-e,2)),i=Math.atan2(n-e,i-d),n=Math.atan2(o-e,l-d),o=Math.PI/2+(i+n)/2,Math.abs(i-o)>Math.PI/2&&(o-=Math.PI),i=d+Math.cos(o)*b,n=e+Math.sin(o)*b,l=d+Math.cos(Math.PI+o)*p,o=e+Math.sin(Math.PI+o)*p,c.rightContX=l,c.rightContY=o;g?(c=["C",a.rightContX||a.plotX,a.rightContY|| | ||
a.plotY,i||d,n||e,d,e],a.rightContX=a.rightContY=null):c=["M",d,e]}else c=a.call(this,b,c,g);return c});r(c,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate)){a=this.points;for(b=a.length;b--;)this.toXY(a[b])}});r(c,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this, | ||
b)});r(c,"animate",b);if(i.column)e=i.column.prototype,r(e,"animate",b),r(e,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,e=b.startAngleRad,i=this.chart.renderer,l,n;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(n=b.length;n--;)l=b[n],a=l.barX+e,l.shapeType="path",l.shapeArgs={d:i.symbols.arc(d[0],d[1],c-l.plotY,null,{start:a,end:a+l.pointWidth,innerR:c-o(l.yBottom,c)})},this.toXY(l),l.tooltipPos=[l.plotX,l.plotY],l.ttBelow=l.plotY>d[1]}}),r(e,"alignDataLabel", | ||
function(a,b,d,e,j,i){if(this.chart.polar){a=b.rectPlotX/Math.PI*180;if(e.align===null)e.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(e.verticalAlign===null)e.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";c.alignDataLabel.call(this,b,d,e,j,i)}else a.call(this,b,d,e,j,i)});r(d,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var e=a.isXAxis,f=a.center,i=b.chartX-f[0]-c.plotLeft,f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a, | ||
value:a.translate(e?Math.PI-Math.atan2(i,f):Math.sqrt(Math.pow(i,2)+Math.pow(f,2)),!0)})}):d=a.call(this,b);return d})})()})(Highcharts); | ||
(function(m){typeof module==="object"&&module.exports?module.exports=m:m(Highcharts)})(function(m){function K(a,b,c){this.init(a,b,c)}var P=m.arrayMin,Q=m.arrayMax,s=m.each,H=m.extend,t=m.merge,R=m.map,p=m.pick,A=m.pInt,o=m.getOptions().plotOptions,i=m.seriesTypes,u=m.extendClass,L=m.splat,r=m.wrap,M=m.Axis,z=m.Tick,I=m.Point,S=m.Pointer,T=m.CenteredSeriesMixin,B=m.TrackerMixin,w=m.Series,x=Math,E=x.round,C=x.floor,N=x.max,U=m.Color,v=function(){};H(K.prototype,{init:function(a,b,c){var d=this,e= | ||
d.defaultOptions;d.chart=b;d.options=a=t(e,b.angular?{background:{}}:void 0,a);(a=a.background)&&s([].concat(L(a)).reverse(),function(a){var b=a.backgroundColor,j=c.userOptions,a=t(d.defaultBackgroundOptions,a);if(b)a.backgroundColor=b;a.color=a.backgroundColor;c.options.plotBands.unshift(a);j.plotBands=j.plotBands||[];j.plotBands!==c.options.plotBands&&j.plotBands.unshift(a)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{shape:"circle",borderWidth:1,borderColor:"silver", | ||
backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#FFF"],[1,"#DDD"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});var G=M.prototype,z=z.prototype,V={getOffset:v,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:v,setCategories:v,setTitle:v},O={isRadial:!0,defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1, | ||
tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2},defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=t(this.defaultOptions,this.defaultRadialOptions,a);if(!a.plotBands)a.plotBands=[]},getOffset:function(){G.getOffset.call(this); | ||
this.chart.axisOffset[this.side]=0;this.center=this.pane.center=T.getCenter.call(this.pane)},getLinePath:function(a,b){var c=this.center,b=p(b,c[2]/2-this.offset);return this.chart.renderer.symbols.arc(this.left+c[0],this.top+c[1],b,b,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0})},setAxisTranslation:function(){G.setAxisTranslation.call(this);if(this.center)this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/(this.max-this.min||1):this.center[2]/2/(this.max-this.min|| | ||
1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0},beforeSetTickPositions:function(){this.autoConnect&&(this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0)},setAxisSize:function(){G.setAxisSize.call(this);if(this.isRadial){this.center=this.pane.center=m.CenteredSeriesMixin.getCenter.call(this.pane);if(this.isCircular)this.sector=this.endAngleRad-this.startAngleRad;this.len=this.width=this.height=this.center[2]*p(this.sector,1)/2}},getPosition:function(a, | ||
b){return this.postTranslate(this.isCircular?this.translate(a):0,p(this.isCircular?b:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,b){var c=this.chart,d=this.center,a=this.startAngleRad+a;return{x:c.plotLeft+d[0]+Math.cos(a)*b,y:c.plotTop+d[1]+Math.sin(a)*b}},getPlotBandPath:function(a,b,c){var d=this.center,e=this.startAngleRad,f=d[2]/2,h=[p(c.outerRadius,"100%"),c.innerRadius,p(c.thickness,10)],j=/%$/,n,g=this.isCircular;this.options.gridLineInterpolation==="polygon"? | ||
d=this.getPlotLinePath(a).concat(this.getPlotLinePath(b,!0)):(a=Math.max(a,this.min),b=Math.min(b,this.max),g||(h[0]=this.translate(a),h[1]=this.translate(b)),h=R(h,function(a){j.test(a)&&(a=A(a,10)*f/100);return a}),c.shape==="circle"||!g?(a=-Math.PI/2,b=Math.PI*1.5,n=!0):(a=e+this.translate(a),b=e+this.translate(b)),d=this.chart.renderer.symbols.arc(this.left+d[0],this.top+d[1],h[0],h[0],{start:Math.min(a,b),end:Math.max(a,b),innerR:p(h[1],h[0]-h[2]),open:n}));return d},getPlotLinePath:function(a, | ||
b){var c=this,d=c.center,e=c.chart,f=c.getPosition(a),h,j,n;c.isCircular?n=["M",d[0]+e.plotLeft,d[1]+e.plotTop,"L",f.x,f.y]:c.options.gridLineInterpolation==="circle"?(a=c.translate(a))&&(n=c.getLinePath(0,a)):(s(e.xAxis,function(a){a.pane===c.pane&&(h=a)}),n=[],a=c.translate(a),d=h.tickPositions,h.autoConnect&&(d=d.concat([d[0]])),b&&(d=[].concat(d).reverse()),s(d,function(f,b){j=h.getPosition(f,a);n.push(b?"L":"M",j.x,j.y)}));return n},getTitlePosition:function(){var a=this.center,b=this.chart, | ||
c=this.options.title;return{x:b.plotLeft+a[0]+(c.x||0),y:b.plotTop+a[1]-{high:0.5,middle:0.25,low:0}[c.align]*a[2]+(c.y||0)}}};r(G,"init",function(a,b,c){var k;var d=b.angular,e=b.polar,f=c.isX,h=d&&f,j,n;n=b.options;var g=c.pane||0;if(d){if(H(this,h?V:O),j=!f)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else if(e)H(this,O),this.defaultRadialOptions=(j=f)?this.defaultRadialXOptions:t(this.defaultYAxisOptions,this.defaultRadialYOptions);a.call(this,b,c);if(!h&&(d||e)){a=this.options;if(!b.panes)b.panes= | ||
[];this.pane=(k=b.panes[g]=b.panes[g]||new K(L(n.pane)[g],b,this),g=k);g=g.options;b.inverted=!1;n.chart.zoomType=null;this.startAngleRad=b=(g.startAngle-90)*Math.PI/180;this.endAngleRad=n=(p(g.endAngle,g.startAngle+360)-90)*Math.PI/180;this.offset=a.offset||0;if((this.isCircular=j)&&c.max===void 0&&n-b===2*Math.PI)this.autoConnect=!0}});r(z,"getPosition",function(a,b,c,d,e){var f=this.axis;return f.getPosition?f.getPosition(c):a.call(this,b,c,d,e)});r(z,"getLabelPosition",function(a,b,c,d,e,f,h, | ||
j,n){var g=this.axis,l=f.y,k=20,i=f.align,y=(g.translate(this.pos)+g.startAngleRad+Math.PI/2)/Math.PI*180%360;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+p(f.distance,-25)),f.rotation==="auto"?d.attr({rotation:y}):l===null&&(l=g.chart.renderer.fontMetrics(d.styles.fontSize).b-d.getBBox().height/2),i===null&&(g.isCircular?(this.label.getBBox().width>g.len*g.tickInterval/(g.max-g.min)&&(k=0),i=y>k&&y<180-k?"left":y>180+k&&y<360-k?"right":"center"):i="center",d.attr({align:i})),a.x+=f.x,a.y+= | ||
l):a=a.call(this,b,c,d,e,f,h,j,n);return a});r(z,"getMarkPath",function(a,b,c,d,e,f,h){var j=this.axis;j.isRadial?(a=j.getPosition(this.pos,j.center[2]/2+d),b=["M",b,c,"L",a.x,a.y]):b=a.call(this,b,c,d,e,f,h);return b});o.arearange=t(o.area,{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'<span style="color:{series.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0}, | ||
states:{hover:{halo:!1}}});i.arearange=u(i.area,{type:"arearange",pointArrayMap:["low","high"],dataLabelCollections:["dataLabel","dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var b=this.chart,c=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=c.x-b.plotLeft;a.plotHigh=c.y-b.plotTop},getSegments:function(){var a=this;s(a.points,function(b){if(!a.options.connectNulls&&(b.low===null||b.high===null))b.y= | ||
null;else if(b.low===null&&b.high!==null)b.y=b.high});w.prototype.getSegments.call(this)},translate:function(){var a=this,b=a.yAxis;i.area.prototype.translate.apply(a);s(a.points,function(a){var d=a.low,e=a.high,f=a.plotY;e===null&&d===null?a.y=null:d===null?(a.plotLow=a.plotY=null,a.plotHigh=b.translate(e,0,1,0,1)):e===null?(a.plotLow=f,a.plotHigh=null):(a.plotLow=f,a.plotHigh=b.translate(e,0,1,0,1))});this.chart.polar&&s(this.points,function(b){a.highToXY(b)})},getSegmentPath:function(a){var b, | ||
c=[],d=a.length,e=w.prototype.getSegmentPath,f,h;h=this.options;var j=h.step;for(b=m.grep(a,function(a){return a.plotLow!==null});d--;)f=a[d],f.plotHigh!==null&&c.push({plotX:f.plotHighX||f.plotX,plotY:f.plotHigh});a=e.call(this,b);if(j)j===!0&&(j="left"),h.step={left:"right",center:"center",right:"left"}[j];c=e.call(this,c);h.step=j;h=[].concat(a,c);this.chart.polar||(c[0]="L");this.areaPath=this.areaPath.concat(a,c);return h},drawDataLabels:function(){var a=this.data,b=a.length,c,d=[],e=w.prototype, | ||
f=this.options.dataLabels,h=f.align,j=f.verticalAlign,n=f.inside,g,l,k=this.chart.inverted;if(f.enabled||this._hasPointLabels){for(c=b;c--;)if(g=a[c]){l=n?g.plotHigh<g.plotLow:g.plotHigh>g.plotLow;g.y=g.high;g._plotY=g.plotY;g.plotY=g.plotHigh;d[c]=g.dataLabel;g.dataLabel=g.dataLabelUpper;g.below=l;if(k){if(!h)f.align=l?"right":"left"}else if(!j)f.verticalAlign=l?"top":"bottom";f.x=f.xHigh;f.y=f.yHigh}e.drawDataLabels&&e.drawDataLabels.apply(this,arguments);for(c=b;c--;)if(g=a[c]){l=n?g.plotHigh< | ||
g.plotLow:g.plotHigh>g.plotLow;g.dataLabelUpper=g.dataLabel;g.dataLabel=d[c];g.y=g.low;g.plotY=g._plotY;g.below=!l;if(k){if(!h)f.align=l?"left":"right"}else if(!j)f.verticalAlign=l?"bottom":"top";f.x=f.xLow;f.y=f.yLow}e.drawDataLabels&&e.drawDataLabels.apply(this,arguments)}f.align=h;f.verticalAlign=j},alignDataLabel:function(){i.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:v,getSymbol:v,drawPoints:v});o.areasplinerange=t(o.arearange);i.areasplinerange=u(i.arearange,{type:"areasplinerange", | ||
getPointSpline:i.spline.prototype.getPointSpline});(function(){var a=i.column.prototype;o.columnrange=t(o.column,o.arearange,{lineWidth:1,pointRange:null});i.columnrange=u(i.arearange,{type:"columnrange",translate:function(){var b=this,c=b.yAxis,d;a.translate.apply(b);s(b.points,function(a){var f=a.shapeArgs,h=b.options.minPointLength,j;a.tooltipPos=null;a.plotHigh=d=c.translate(a.high,0,1,0,1);a.plotLow=a.plotY;j=d;a=a.plotY-d;Math.abs(a)<h?(h-=a,a+=h,j-=h/2):a<0&&(a*=-1,j-=a);f.height=a;f.y=j})}, | ||
directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:v,crispCol:a.crispCol,pointAttrToOptions:a.pointAttrToOptions,drawPoints:a.drawPoints,drawTracker:a.drawTracker,animate:a.animate,getColumnMetrics:a.getColumnMetrics})})();o.gauge=t(o.line,{dataLabels:{enabled:!0,defer:!1,y:15,borderWidth:1,borderColor:"silver",borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1});B={type:"gauge",pointClass:u(I,{setState:function(a){this.state= | ||
a}}),angular:!0,drawGraph:v,fixedBox:!0,forceDL:!0,trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,b=this.options,c=a.center;this.generatePoints();s(this.points,function(d){var e=t(b.dial,d.dial),f=A(p(e.radius,80))*c[2]/200,h=A(p(e.baseLength,70))*f/100,j=A(p(e.rearLength,10))*f/100,n=e.baseWidth||3,g=e.topWidth||1,l=b.overshoot,k=a.startAngleRad+a.translate(d.y,null,null,null,!0);l&&typeof l==="number"?(l=l/180*Math.PI,k=Math.max(a.startAngleRad-l,Math.min(a.endAngleRad+ | ||
l,k))):b.wrap===!1&&(k=Math.max(a.startAngleRad,Math.min(a.endAngleRad,k)));k=k*180/Math.PI;d.shapeType="path";d.shapeArgs={d:e.path||["M",-j,-n/2,"L",h,-n/2,f,-g/2,f,g/2,h,n/2,-j,n/2,"z"],translateX:c[0],translateY:c[1],rotation:k};d.plotX=c[0];d.plotY=c[1]})},drawPoints:function(){var a=this,b=a.yAxis.center,c=a.pivot,d=a.options,e=d.pivot,f=a.chart.renderer;s(a.points,function(b){var c=b.graphic,e=b.shapeArgs,g=e.d,l=t(d.dial,b.dial);c?(c.animate(e),e.d=g):b.graphic=f[b.shapeType](e).attr({stroke:l.borderColor|| | ||
"none","stroke-width":l.borderWidth||0,fill:l.backgroundColor||"black",rotation:e.rotation,zIndex:1}).add(a.group)});c?c.animate({translateX:b[0],translateY:b[1]}):a.pivot=f.circle(0,0,p(e.radius,5)).attr({"stroke-width":e.borderWidth||0,stroke:e.borderColor||"silver",fill:e.backgroundColor||"black",zIndex:2}).translate(b[0],b[1]).add(a.group)},animate:function(a){var b=this;if(!a)s(b.points,function(a){var d=a.graphic;d&&(d.attr({rotation:b.yAxis.startAngleRad*180/Math.PI}),d.animate({rotation:a.shapeArgs.rotation}, | ||
b.options.animation))}),b.animate=null},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);w.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,b){w.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();p(b,!0)&&this.chart.redraw()},drawTracker:B&&B.drawTrackerPoint};i.gauge=u(i.line,B);o.boxplot=t(o.column,{fillColor:"#FFFFFF",lineWidth:1,medianWidth:2,states:{hover:{brightness:-0.3}}, | ||
threshold:null,tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> <b> {series.name}</b><br/>Maximum: {point.high}<br/>Upper quartile: {point.q3}<br/>Median: {point.median}<br/>Lower quartile: {point.q1}<br/>Minimum: {point.low}<br/>'},whiskerLength:"50%",whiskerWidth:2});i.boxplot=u(i.column,{type:"boxplot",pointArrayMap:["low","q1","median","q3","high"],toYData:function(a){return[a.low,a.q1,a.median,a.q3,a.high]},pointValKey:"high",pointAttrToOptions:{fill:"fillColor",stroke:"color", | ||
"stroke-width":"lineWidth"},drawDataLabels:v,translate:function(){var a=this.yAxis,b=this.pointArrayMap;i.column.prototype.translate.apply(this);s(this.points,function(c){s(b,function(b){c[b]!==null&&(c[b+"Plot"]=a.translate(c[b],0,1,0,1))})})},drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e,f,h,j,n,g,l,k,i,y,m,J,o,t,r,v,u,w,x,B,A,z=a.doQuartiles!==!1,F,D=a.options.whiskerLength;s(a.points,function(q){k=q.graphic;B=q.shapeArgs;y={};o={};r={};A=q.color||a.color;if(q.plotY!==void 0)if(d= | ||
q.pointAttr[q.selected?"selected":""],v=B.width,u=C(B.x),w=u+v,x=E(v/2),e=C(z?q.q1Plot:q.lowPlot),f=C(z?q.q3Plot:q.lowPlot),h=C(q.highPlot),j=C(q.lowPlot),y.stroke=q.stemColor||b.stemColor||A,y["stroke-width"]=p(q.stemWidth,b.stemWidth,b.lineWidth),y.dashstyle=q.stemDashStyle||b.stemDashStyle,o.stroke=q.whiskerColor||b.whiskerColor||A,o["stroke-width"]=p(q.whiskerWidth,b.whiskerWidth,b.lineWidth),r.stroke=q.medianColor||b.medianColor||A,r["stroke-width"]=p(q.medianWidth,b.medianWidth,b.lineWidth), | ||
g=y["stroke-width"]%2/2,l=u+x+g,i=["M",l,f,"L",l,h,"M",l,e,"L",l,j],z&&(g=d["stroke-width"]%2/2,l=C(l)+g,e=C(e)+g,f=C(f)+g,u+=g,w+=g,m=["M",u,f,"L",u,e,"L",w,e,"L",w,f,"L",u,f,"z"]),D&&(g=o["stroke-width"]%2/2,h+=g,j+=g,F=/%$/.test(D)?x*parseFloat(D)/100:D/2,J=["M",l-F,h,"L",l+F,h,"M",l-F,j,"L",l+F,j]),g=r["stroke-width"]%2/2,n=E(q.medianPlot)+g,t=["M",u,n,"L",w,n],k)q.stem.animate({d:i}),D&&q.whiskers.animate({d:J}),z&&q.box.animate({d:m}),q.medianShape.animate({d:t});else{q.graphic=k=c.g().add(a.group); | ||
q.stem=c.path(i).attr(y).add(k);if(D)q.whiskers=c.path(J).attr(o).add(k);if(z)q.box=c.path(m).attr(d).add(k);q.medianShape=c.path(t).attr(r).add(k)}})},setStackedPoints:v});o.errorbar=t(o.boxplot,{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'<span style="color:{point.color}">\u25cf</span> {series.name}: <b>{point.low}</b> - <b>{point.high}</b><br/>'},whiskerWidth:null});i.errorbar=u(i.boxplot,{type:"errorbar",pointArrayMap:["low","high"],toYData:function(a){return[a.low, | ||
a.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:i.arearange?i.arearange.prototype.drawDataLabels:v,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||i.column.prototype.getColumnMetrics.call(this)}});o.waterfall=t(o.column,{lineWidth:1,lineColor:"#333",dashStyle:"dot",borderColor:"#333",dataLabels:{inside:!0},states:{hover:{lineWidthPlus:0}}});i.waterfall=u(i.column,{type:"waterfall",upColorProp:"fill",pointValKey:"y",translate:function(){var a=this.options, | ||
b=this.yAxis,c,d,e,f,h,j,n,g,l,k=a.threshold,m=a.stacking;i.column.prototype.translate.apply(this);n=g=k;d=this.points;for(c=0,a=d.length;c<a;c++){e=d[c];j=this.processedYData[c];f=e.shapeArgs;l=(h=m&&b.stacks[(this.negStacks&&j<k?"-":"")+this.stackKey])?h[e.x].points[this.index+","+c]:[0,j];if(e.isSum)e.y=j;else if(e.isIntermediateSum)e.y=j-g;h=N(n,n+e.y)+l[0];f.y=b.translate(h,0,1);if(e.isSum)f.y=b.translate(l[1],0,1),f.height=Math.min(b.translate(l[0],0,1),b.len)-f.y;else if(e.isIntermediateSum)f.y= | ||
b.translate(l[1],0,1),f.height=Math.min(b.translate(g,0,1),b.len)-f.y,g=l[1];else{if(n!==0)f.height=j>0?b.translate(n,0,1)-f.y:b.translate(n,0,1)-b.translate(n-j,0,1);n+=j}f.height<0&&(f.y+=f.height,f.height*=-1);e.plotY=f.y=E(f.y)-this.borderWidth%2/2;f.height=N(E(f.height),0.001);e.yBottom=f.y+f.height;f=e.plotY+(e.negative?f.height:0);this.chart.inverted?e.tooltipPos[0]=b.len-f:e.tooltipPos[1]=f}},processData:function(a){var b=this.yData,c=this.options.data,d,e=b.length,f,h,j,n,g,l;h=f=j=n=this.options.threshold|| | ||
0;for(l=0;l<e;l++)g=b[l],d=c&&c[l]?c[l]:{},g==="sum"||d.isSum?b[l]=h:g==="intermediateSum"||d.isIntermediateSum?b[l]=f:(h+=g,f+=g),j=Math.min(h,j),n=Math.max(h,n);w.prototype.processData.call(this,a);this.dataMin=j;this.dataMax=n},toYData:function(a){return a.isSum?a.x===0?null:"sum":a.isIntermediateSum?a.x===0?null:"intermediateSum":a.y},getAttribs:function(){i.column.prototype.getAttribs.apply(this,arguments);var a=this,b=a.options,c=b.states,d=b.upColor||a.color,b=m.Color(d).brighten(0.1).get(), | ||
e=t(a.pointAttr),f=a.upColorProp;e[""][f]=d;e.hover[f]=c.hover.upColor||b;e.select[f]=c.select.upColor||d;s(a.points,function(f){if(!f.options.color)f.y>0?(f.pointAttr=e,f.color=d):f.pointAttr=a.pointAttr})},getGraphPath:function(){var a=this.data,b=a.length,c=E(this.options.lineWidth+this.borderWidth)%2/2,d=[],e,f,h;for(h=1;h<b;h++)f=a[h].shapeArgs,e=a[h-1].shapeArgs,f=["M",e.x+e.width,e.y+c,"L",f.x,e.y+c],a[h-1].y<0&&(f[2]+=e.height,f[5]+=e.height),d=d.concat(f);return d},getExtremes:v,drawGraph:w.prototype.drawGraph}); | ||
o.polygon=t(o.scatter,{marker:{enabled:!1}});i.polygon=u(i.scatter,{type:"polygon",fillGraph:!0,getSegmentPath:function(a){return w.prototype.getSegmentPath.call(this,a).concat("z")},drawGraph:w.prototype.drawGraph,drawLegendSymbol:m.LegendSymbolMixin.drawRectangle});o.bubble=t(o.scatter,{dataLabels:{formatter:function(){return this.point.z},inside:!0,verticalAlign:"middle"},marker:{lineColor:null,lineWidth:1},minSize:8,maxSize:"20%",softThreshold:!1,states:{hover:{halo:{size:5}}},tooltip:{pointFormat:"({point.x}, {point.y}), Size: {point.z}"}, | ||
turboThreshold:0,zThreshold:0,zoneAxis:"z"});B=u(I,{haloPath:function(){return I.prototype.haloPath.call(this,this.shapeArgs.r+this.series.options.states.hover.halo.size)},ttBelow:!1});i.bubble=u(i.scatter,{type:"bubble",pointClass:B,pointArrayMap:["y","z"],parallelArrays:["x","y","z"],trackerGroups:["group","dataLabelsGroup"],bubblePadding:!0,zoneAxis:"z",pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor"},applyOpacity:function(a){var b=this.options.marker,c=p(b.fillOpacity, | ||
0.5),a=a||b.fillColor||this.color;c!==1&&(a=U(a).setOpacity(c).get("rgba"));return a},convertAttribs:function(){var a=w.prototype.convertAttribs.apply(this,arguments);a.fill=this.applyOpacity(a.fill);return a},getRadii:function(a,b,c,d){var e,f,h,j=this.zData,n=[],g=this.options,l=g.sizeBy!=="width",k=g.zThreshold,i=b-a;for(f=0,e=j.length;f<e;f++)h=j[f],g.sizeByAbsoluteValue&&h!==null&&(h=Math.abs(h-k),b=Math.max(b-k,Math.abs(a-k)),a=0),h===null?h=null:h<a?h=c/2-1:(h=i>0?(h-a)/i:0.5,l&&h>=0&&(h=Math.sqrt(h)), | ||
h=x.ceil(c+h*(d-c))/2),n.push(h);this.radii=n},animate:function(a){var b=this.options.animation;if(!a)s(this.points,function(a){var d=a.graphic,a=a.shapeArgs;d&&a&&(d.attr("r",1),d.animate({r:a.r},b))}),this.animate=null},translate:function(){var a,b=this.data,c,d,e=this.radii;i.scatter.prototype.translate.call(this);for(a=b.length;a--;)c=b[a],d=e?e[a]:0,typeof d==="number"&&d>=this.minPxSize/2?(c.shapeType="circle",c.shapeArgs={x:c.plotX,y:c.plotY,r:d},c.dlBox={x:c.plotX-d,y:c.plotY-d,width:2*d, | ||
height:2*d}):c.shapeArgs=c.plotY=c.dlBox=void 0},drawLegendSymbol:function(a,b){var c=this.chart.renderer,d=c.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=c.circle(d,a.baseline-d,d).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker=!0},drawPoints:i.column.prototype.drawPoints,alignDataLabel:i.column.prototype.alignDataLabel,buildKDTree:v,applyZones:v});M.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,d=0,e=b,f=this.isXAxis,h=f?"xData":"yData",j=this.min,n= | ||
{},g=x.min(c.plotWidth,c.plotHeight),l=Number.MAX_VALUE,k=-Number.MAX_VALUE,i=this.max-j,m=b/i,o=[];s(this.series,function(b){var h=b.options;if(b.bubblePadding&&(b.visible||!c.options.chart.ignoreHiddenSeries))if(a.allowZoomOutside=!0,o.push(b),f)s(["minSize","maxSize"],function(a){var b=h[a],f=/%$/.test(b),b=A(b);n[a]=f?g*b/100:b}),b.minPxSize=n.minSize,b.maxPxSize=n.maxSize,b=b.zData,b.length&&(l=p(h.zMin,x.min(l,x.max(P(b),h.displayNegative===!1?h.zThreshold:-Number.MAX_VALUE))),k=p(h.zMax,x.max(k, | ||
Q(b))))});s(o,function(a){var b=a[h],c=b.length,g;f&&a.getRadii(l,k,a.minPxSize,a.maxPxSize);if(i>0)for(;c--;)typeof b[c]==="number"&&(g=a.radii[c],d=Math.min((b[c]-j)*m-g,d),e=Math.max((b[c]-j)*m+g,e))});o.length&&i>0&&!this.isLog&&(e-=b,m*=(b+d-e)/b,s([["min","userMin",d],["max","userMax",e]],function(b){p(a.options[b[0]],a[b[1]])===void 0&&(a[b[0]]+=b[2]/m)}))};(function(){function a(a,b,c){a.call(this,b,c);if(this.chart.polar)this.closeSegment=function(a){var b=this.xAxis.center;a.push("L",b[0], | ||
b[1])},this.closedStacks=!0}function b(a,b){var c=this.chart,d=this.options.animation,g=this.group,e=this.markerGroup,k=this.xAxis.center,i=c.plotLeft,m=c.plotTop;if(c.polar){if(c.renderer.isSVG)d===!0&&(d={}),b?(c={translateX:k[0]+i,translateY:k[1]+m,scaleX:0.001,scaleY:0.001},g.attr(c),e&&e.attr(c)):(c={translateX:i,translateY:m,scaleX:1,scaleY:1},g.animate(c,d),e&&e.animate(c,d),this.animate=null)}else a.call(this,b)}var c=w.prototype,d=S.prototype,e;c.searchPointByAngle=function(a){var b=this.chart, | ||
c=this.xAxis.pane.center;return this.searchKDTree({clientX:180+Math.atan2(a.chartX-c[0]-b.plotLeft,a.chartY-c[1]-b.plotTop)*(-180/Math.PI)})};r(c,"buildKDTree",function(a){if(this.chart.polar)this.kdByAngle?this.searchPoint=this.searchPointByAngle:this.kdDimensions=2;a.apply(this)});c.toXY=function(a){var b,c=this.chart,d=a.plotX;b=a.plotY;a.rectPlotX=d;a.rectPlotY=b;b=this.xAxis.postTranslate(a.plotX,this.yAxis.len-b);a.plotX=a.polarPlotX=b.x-c.plotLeft;a.plotY=a.polarPlotY=b.y-c.plotTop;this.kdByAngle? | ||
(c=(d/Math.PI*180+this.xAxis.pane.options.startAngle)%360,c<0&&(c+=360),a.clientX=c):a.clientX=a.plotX};i.area&&r(i.area.prototype,"init",a);i.areaspline&&r(i.areaspline.prototype,"init",a);i.spline&&r(i.spline.prototype,"getPointSpline",function(a,b,c,d){var g,e,k,i,m,o,p;if(this.chart.polar){g=c.plotX;e=c.plotY;a=b[d-1];k=b[d+1];this.connectEnds&&(a||(a=b[b.length-2]),k||(k=b[1]));if(a&&k)i=a.plotX,m=a.plotY,b=k.plotX,o=k.plotY,i=(1.5*g+i)/2.5,m=(1.5*e+m)/2.5,k=(1.5*g+b)/2.5,p=(1.5*e+o)/2.5,b=Math.sqrt(Math.pow(i- | ||
g,2)+Math.pow(m-e,2)),o=Math.sqrt(Math.pow(k-g,2)+Math.pow(p-e,2)),i=Math.atan2(m-e,i-g),m=Math.atan2(p-e,k-g),p=Math.PI/2+(i+m)/2,Math.abs(i-p)>Math.PI/2&&(p-=Math.PI),i=g+Math.cos(p)*b,m=e+Math.sin(p)*b,k=g+Math.cos(Math.PI+p)*o,p=e+Math.sin(Math.PI+p)*o,c.rightContX=k,c.rightContY=p;d?(c=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,i||g,m||e,g,e],a.rightContX=a.rightContY=null):c=["M",g,e]}else c=a.call(this,b,c,d);return c});r(c,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&& | ||
(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate)){a=this.points;for(b=a.length;b--;)this.toXY(a[b])}});r(c,"getSegmentPath",function(a,b){var c=this.points;if(this.chart.polar&&this.options.connectEnds!==!1&&b[b.length-1]===c[c.length-1]&&c[0].y!==null)this.connectEnds=!0,b=[].concat(b,[c[0]]);return a.call(this,b)});r(c,"animate",b);if(i.column)e=i.column.prototype,r(e,"animate",b),r(e,"translate",function(a){var b=this.xAxis,c=this.yAxis.len,d=b.center,e=b.startAngleRad,i= | ||
this.chart.renderer,k,m;this.preventPostTranslate=!0;a.call(this);if(b.isRadial){b=this.points;for(m=b.length;m--;)k=b[m],a=k.barX+e,k.shapeType="path",k.shapeArgs={d:i.symbols.arc(d[0],d[1],c-k.plotY,null,{start:a,end:a+k.pointWidth,innerR:c-p(k.yBottom,c)})},this.toXY(k),k.tooltipPos=[k.plotX,k.plotY],k.ttBelow=k.plotY>d[1]}}),r(e,"alignDataLabel",function(a,b,d,e,g,i){if(this.chart.polar){a=b.rectPlotX/Math.PI*180;if(e.align===null)e.align=a>20&&a<160?"left":a>200&&a<340?"right":"center";if(e.verticalAlign=== | ||
null)e.verticalAlign=a<45||a>315?"bottom":a>135&&a<225?"top":"middle";c.alignDataLabel.call(this,b,d,e,g,i)}else a.call(this,b,d,e,g,i)});r(d,"getCoordinates",function(a,b){var c=this.chart,d={xAxis:[],yAxis:[]};c.polar?s(c.axes,function(a){var e=a.isXAxis,f=a.center,i=b.chartX-f[0]-c.plotLeft,f=b.chartY-f[1]-c.plotTop;d[e?"xAxis":"yAxis"].push({axis:a,value:a.translate(e?Math.PI-Math.atan2(i,f):Math.sqrt(Math.pow(i,2)+Math.pow(f,2)),!0)})}):d=a.call(this,b);return d})})()}); |
@@ -1,11 +0,12 @@ | ||
(function(g,p){function x(a,b,c,d,i){i=i||0;d=d||y;m(a.slice(i,i+d),b);i+d<a.length?setTimeout(function(){x(a,b,c,d,i+d)}):c&&c()}var O=function(){},P=g.Color,l=g.Series,e=g.seriesTypes,m=g.each,s=g.extend,Q=p.addEvent,R=p.fireEvent,S=g.merge,T=g.pick,k=g.wrap,q=g.getOptions().plotOptions,y=5E4;m(["area","arearange","column","line","scatter"],function(a){if(q[a])q[a].boostThreshold=5E3});m(["translate","generatePoints","drawTracker","drawPoints","render"],function(a){function b(b){var d=this.options.stacking&& | ||
(a==="translate"||a==="generatePoints");if((this.processedXData||this.options.data).length<(this.options.boostThreshold||Number.MAX_VALUE)||d){if(a==="render"&&this.image)this.image.attr({href:""}),this.animate=null;b.call(this)}else if(this[a+"Canvas"])this[a+"Canvas"]()}k(l.prototype,a,b);a==="translate"&&(e.column&&k(e.column.prototype,a,b),e.arearange&&k(e.arearange.prototype,a,b))});k(l.prototype,"getExtremes",function(a){this.hasExtremes()||a.apply(this,Array.prototype.slice.call(arguments, | ||
1))});k(l.prototype,"setData",function(a){this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))});k(l.prototype,"processData",function(a){this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))});g.extend(l.prototype,{pointRange:0,hasExtremes:function(a){var b=this.options,c=this.xAxis&&this.xAxis.options,d=this.yAxis&&this.yAxis.options;return b.data.length>(b.boostThreshold||Number.MAX_VALUE)&&typeof d.min==="number"&&typeof d.max==="number"&&(!a||typeof c.min=== | ||
"number"&&typeof c.max==="number")},destroyGraphics:function(){var a=this,b=this.points,c,d;for(d=0;d<b.length;d+=1)if((c=b[d])&&c.graphic)c.graphic=c.graphic.destroy();m(["graph","area"],function(b){a[b]&&(a[b]=a[b].destroy())})},getContext:function(){var a=this.chart.plotWidth,b=this.chart.plotHeight;this.canvas?this.ctx.clearRect(0,0,a,b):(this.canvas=document.createElement("canvas"),this.image=this.chart.renderer.image("",0,0,a,b).add(this.group),this.ctx=this.canvas.getContext("2d"));this.canvas.setAttribute("width", | ||
a);this.canvas.setAttribute("height",b);this.image.attr({width:a,height:b});return this.ctx},canvasToSVG:function(){this.image.attr({href:this.canvas.toDataURL("image/png")})},cvsLineTo:function(a,b,c){a.lineTo(b,c)},renderCanvas:function(){var a=this,b=a.options,c=a.chart,d=this.xAxis,i=this.yAxis,h,g,e=0,k=a.processedXData,l=a.processedYData,m=b.data,j=d.getExtremes(),p=j.min,q=j.max,j=i.getExtremes(),U=j.min,V=j.max,z={},t,W=!!a.sampling,A,B=b.marker&&b.marker.radius,C=this.cvsDrawPoint,D=b.lineWidth? | ||
this.cvsLineTo:!1,E=B<=1?this.cvsMarkerSquare:this.cvsMarkerCircle,X=b.enableMouseTracking!==!1,F,j=b.threshold,n=i.getThreshold(j),G=typeof j==="number",H=n,Y=this.fill,I=a.pointArrayMap&&a.pointArrayMap.join(",")==="low,high",J=!!b.stacking,Z=a.cropStart||0,j=c.options.loading,$=a.requireSorting,K,aa=b.connectNulls,L=!k,u,v,o,r,ba=a.fillOpacity?(new P(a.color)).setOpacity(T(b.fillOpacity,0.75)).get():a.color,M=function(){Y?(h.fillStyle=ba,h.fill()):(h.strokeStyle=a.color,h.lineWidth=b.lineWidth, | ||
h.stroke())},N=function(a,b,c){e===0&&h.beginPath();K?h.moveTo(a,b):C?C(h,a,b,c,F):D?D(h,a,b):E&&E(h,a,b,B);e+=1;e===1E3&&(M(),e=0);F={clientX:a,plotY:b,yBottom:c}},w=function(a,b,c){X&&!z[a+","+b]&&(A.push({clientX:a,plotX:a,plotY:b,i:Z+c}),z[a+","+b]=!0)};this.points&&this.destroyGraphics();a.plotGroup("group","series",a.visible?"visible":"hidden",b.zIndex,c.seriesGroup);a.getAttribs();a.markerGroup=a.group;Q(a,"destroy",function(){a.markerGroup=null});A=this.points=[];h=this.getContext();a.buildKDTree= | ||
O;if(m.length>99999)c.options.loading=S(j,{labelStyle:{backgroundColor:"rgba(255,255,255,0.75)",padding:"1em",borderRadius:"0.5em"},style:{backgroundColor:"none",opacity:1}}),c.showLoading("Drawing..."),c.options.loading=j,c.loadingShown===!0?c.loadingShown=1:c.loadingShown+=1;g=0;x(J?a.data:k||m,function(b){var c,f,e,h=!0;L?(c=b[0],f=b[1]):(c=b,f=l[g]);if(I)L&&(f=b.slice(1,3)),e=f[0],f=f[1];else if(J)c=b.x,f=b.stackY,e=f-b.y;b=f===null;$||(h=f>=U&&f<=V);if(!b&&c>=p&&c<=q&&h)if(c=Math.round(d.toPixels(c, | ||
!0)),W){if(o===void 0||c===t){I||(e=f);if(r===void 0||f>v)v=f,r=g;if(o===void 0||e<u)u=e,o=g}c!==t&&(o!==void 0&&(f=i.toPixels(v,!0),n=i.toPixels(u,!0),N(c,G?Math.min(f,H):f,G?Math.max(n,H):n),w(c,f,r),n!==f&&w(c,n,o)),o=r=void 0,t=c)}else f=Math.round(i.toPixels(f,!0)),N(c,f,n),w(c,f,g);K=b&&!aa;g+=1;g%y===0&&a.canvasToSVG()},function(){var b=c.loadingDiv,d=+c.loadingShown;M();a.canvasToSVG();R(a,"renderedCanvas");if(d===1)s(b.style,{transition:"opacity 250ms",opacity:0}),c.loadingShown=!1,setTimeout(function(){b.parentNode&& | ||
b.parentNode.removeChild(b);c.loadingDiv=c.loadingSpan=null},250);if(d)c.loadingShown=d-1;a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},c.renderer.forExport?Number.MAX_VALUE:void 0)}});e.scatter.prototype.cvsMarkerCircle=function(a,b,c,d){a.moveTo(b,c);a.arc(b,c,d,0,2*Math.PI,!1)};e.scatter.prototype.cvsMarkerSquare=function(a,b,c,d){a.moveTo(b,c);a.rect(b-d,c-d,d*2,d*2)};e.scatter.prototype.fill=!0;s(e.area.prototype,{cvsDrawPoint:function(a,b,c,d,e){e&&b!==e.clientX&& | ||
(a.moveTo(e.clientX,e.yBottom),a.lineTo(e.clientX,e.plotY),a.lineTo(b,c),a.lineTo(b,d))},fill:!0,fillOpacity:!0,sampling:!0});s(e.column.prototype,{cvsDrawPoint:function(a,b,c,d){a.rect(b-1,c,1,d-c)},fill:!0,sampling:!0});k(l.prototype,"searchPoint",function(a){var b=a.apply(this,[].slice.call(arguments,1)),c=b;if(b&&!(b instanceof this.pointClass))c=(new this.pointClass).init(this,this.options.data[b.i]),c.dist=b.dist,c.category=c.x,c.plotX=b.plotX,c.plotY=b.plotY;return c})})(Highcharts,HighchartsAdapter); | ||
(function(c){typeof module==="object"&&module.exports?module.exports=c:c(Highcharts)})(function(c){function u(a,b,d,e,f){f=f||0;e=e||v;k(a.slice(f,f+e),b);f+e<a.length?setTimeout(function(){u(a,b,d,e,f+e)}):d&&d()}var L=function(){},M=c.Color,j=c.Series,h=c.seriesTypes,k=c.each,p=c.extend,N=c.addEvent,O=c.fireEvent,P=c.merge,Q=c.pick,g=c.wrap,n=c.getOptions().plotOptions,v=5E4;k(["area","arearange","column","line","scatter"],function(a){if(n[a])n[a].boostThreshold=5E3});k(["translate","generatePoints", | ||
"drawTracker","drawPoints","render"],function(a){function b(b){var e=this.options.stacking&&(a==="translate"||a==="generatePoints");if((this.processedXData||this.options.data).length<(this.options.boostThreshold||Number.MAX_VALUE)||e){if(a==="render"&&this.image)this.image.attr({href:""}),this.animate=null;b.call(this)}else if(this[a+"Canvas"])this[a+"Canvas"]()}g(j.prototype,a,b);a==="translate"&&(h.column&&g(h.column.prototype,a,b),h.arearange&&g(h.arearange.prototype,a,b))});g(j.prototype,"getExtremes", | ||
function(a){this.hasExtremes()||a.apply(this,Array.prototype.slice.call(arguments,1))});g(j.prototype,"setData",function(a){this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))});g(j.prototype,"processData",function(a){this.hasExtremes(!0)||a.apply(this,Array.prototype.slice.call(arguments,1))});c.extend(j.prototype,{pointRange:0,hasExtremes:function(a){var b=this.options,d=this.xAxis&&this.xAxis.options,e=this.yAxis&&this.yAxis.options;return b.data.length>(b.boostThreshold|| | ||
Number.MAX_VALUE)&&typeof e.min==="number"&&typeof e.max==="number"&&(!a||typeof d.min==="number"&&typeof d.max==="number")},destroyGraphics:function(){var a=this,b=this.points,d,e;if(b)for(e=0;e<b.length;e+=1)if((d=b[e])&&d.graphic)d.graphic=d.graphic.destroy();k(["graph","area","tracker"],function(b){a[b]&&(a[b]=a[b].destroy())})},getContext:function(){var a=this.chart,b=a.plotWidth,d=a.plotHeight,e=this.ctx,f=function(a,b,d,e,f,c,i){a.call(this,d,b,e,f,c,i)};this.canvas?e.clearRect(0,0,b,d):(this.canvas= | ||
document.createElement("canvas"),this.image=a.renderer.image("",0,0,b,d).add(this.group),this.ctx=e=this.canvas.getContext("2d"),a.inverted&&k(["moveTo","lineTo","rect","arc"],function(a){g(e,a,f)}));this.canvas.setAttribute("width",b);this.canvas.setAttribute("height",d);this.image.attr({width:b,height:d});return e},canvasToSVG:function(){this.image.attr({href:this.canvas.toDataURL("image/png")})},cvsLineTo:function(a,b,d){a.lineTo(b,d)},renderCanvas:function(){var a=this,b=a.options,d=a.chart,e= | ||
this.xAxis,f=this.yAxis,c,h,g=0,j=a.processedXData,k=a.processedYData,n=b.data,i=e.getExtremes(),R=i.min,S=i.max,i=f.getExtremes(),T=i.min,U=i.max,w={},q,V=!!a.sampling,x,y=b.marker&&b.marker.radius,z=this.cvsDrawPoint,A=b.lineWidth?this.cvsLineTo:!1,B=y<=1?this.cvsMarkerSquare:this.cvsMarkerCircle,W=b.enableMouseTracking!==!1,C,i=b.threshold,l=f.getThreshold(i),D=typeof i==="number",E=l,X=this.fill,F=a.pointArrayMap&&a.pointArrayMap.join(",")==="low,high",G=!!b.stacking,Y=a.cropStart||0,i=d.options.loading, | ||
Z=a.requireSorting,H,$=b.connectNulls,I=!j,r,s,m,o,aa=a.fillOpacity?(new M(a.color)).setOpacity(Q(b.fillOpacity,0.75)).get():a.color,J=function(){X?(c.fillStyle=aa,c.fill()):(c.strokeStyle=a.color,c.lineWidth=b.lineWidth,c.stroke())},K=function(a,b,d){g===0&&c.beginPath();H?c.moveTo(a,b):z?z(c,a,b,d,C):A?A(c,a,b):B&&B(c,a,b,y);g+=1;g===1E3&&(J(),g=0);C={clientX:a,plotY:b,yBottom:d}},t=function(a,b,c){W&&!w[a+","+b]&&(w[a+","+b]=!0,d.inverted&&(a=e.len-a,b=f.len-b),x.push({clientX:a,plotX:a,plotY:b, | ||
i:Y+c}))};(this.points||this.graph)&&this.destroyGraphics();a.plotGroup("group","series",a.visible?"visible":"hidden",b.zIndex,d.seriesGroup);a.getAttribs();a.markerGroup=a.group;N(a,"destroy",function(){a.markerGroup=null});x=this.points=[];c=this.getContext();a.buildKDTree=L;if(n.length>99999)d.options.loading=P(i,{labelStyle:{backgroundColor:"rgba(255,255,255,0.75)",padding:"1em",borderRadius:"0.5em"},style:{backgroundColor:"none",opacity:1}}),d.showLoading("Drawing..."),d.options.loading=i,d.loadingShown=== | ||
!0?d.loadingShown=1:d.loadingShown+=1;h=0;u(G?a.data:j||n,function(b){var d,c,g,i=!0;I?(d=b[0],c=b[1]):(d=b,c=k[h]);if(F)I&&(c=b.slice(1,3)),g=c[0],c=c[1];else if(G)d=b.x,c=b.stackY,g=c-b.y;b=c===null;Z||(i=c>=T&&c<=U);if(!b&&d>=R&&d<=S&&i)if(d=Math.round(e.toPixels(d,!0)),V){if(m===void 0||d===q){F||(g=c);if(o===void 0||c>s)s=c,o=h;if(m===void 0||g<r)r=g,m=h}d!==q&&(m!==void 0&&(c=f.toPixels(s,!0),l=f.toPixels(r,!0),K(d,D?Math.min(c,E):c,D?Math.max(l,E):l),t(d,c,o),l!==c&&t(d,l,m)),m=o=void 0,q= | ||
d)}else c=Math.round(f.toPixels(c,!0)),K(d,c,l),t(d,c,h);H=b&&!$;h+=1;h%v===0&&a.canvasToSVG()},function(){var b=d.loadingDiv,c=+d.loadingShown;J();a.canvasToSVG();O(a,"renderedCanvas");if(c===1)p(b.style,{transition:"opacity 250ms",opacity:0}),d.loadingShown=!1,setTimeout(function(){b.parentNode&&b.parentNode.removeChild(b);d.loadingDiv=d.loadingSpan=null},250);if(c)d.loadingShown=c-1;a.directTouch=!1;a.options.stickyTracking=!0;delete a.buildKDTree;a.buildKDTree()},d.renderer.forExport?Number.MAX_VALUE: | ||
void 0)}});h.scatter.prototype.cvsMarkerCircle=function(a,b,d,c){a.moveTo(b,d);a.arc(b,d,c,0,2*Math.PI,!1)};h.scatter.prototype.cvsMarkerSquare=function(a,b,d,c){a.moveTo(b,d);a.rect(b-c,d-c,c*2,c*2)};h.scatter.prototype.fill=!0;p(h.area.prototype,{cvsDrawPoint:function(a,b,d,c,f){f&&b!==f.clientX&&(a.moveTo(f.clientX,f.yBottom),a.lineTo(f.clientX,f.plotY),a.lineTo(b,d),a.lineTo(b,c))},fill:!0,fillOpacity:!0,sampling:!0});p(h.column.prototype,{cvsDrawPoint:function(a,b,c,e){a.rect(b-1,c,1,e-c)},fill:!0, | ||
sampling:!0});j.prototype.getPoint=function(a){var b=a;if(a&&!(a instanceof this.pointClass))b=(new this.pointClass).init(this,this.options.data[a.i]),b.dist=a.dist,b.category=b.x,b.plotX=a.plotX,b.plotY=a.plotY;return b};g(j.prototype,"searchPoint",function(a){return this.getPoint(a.apply(this,[].slice.call(arguments,1)))})}); |
@@ -45,8 +45,15 @@ /** | ||
*/ | ||
/*global document, Highcharts, HighchartsAdapter, setTimeout */ | ||
(function (H, HA) { | ||
/* eslint indent: [2, 4] */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (H) { | ||
'use strict'; | ||
var noop = function () { return undefined; }, | ||
var noop = function () {}, | ||
Color = H.Color, | ||
@@ -57,4 +64,4 @@ Series = H.Series, | ||
extend = H.extend, | ||
addEvent = HA.addEvent, | ||
fireEvent = HA.fireEvent, | ||
addEvent = H.addEvent, | ||
fireEvent = H.fireEvent, | ||
merge = H.merge, | ||
@@ -66,3 +73,3 @@ pick = H.pick, | ||
function eachAsync(arr, fn, callback, chunkSize, i) { | ||
function eachAsync(arr, fn, finalFunc, chunkSize, i) { | ||
i = i || 0; | ||
@@ -73,6 +80,6 @@ chunkSize = chunkSize || CHUNK_SIZE; | ||
setTimeout(function () { | ||
eachAsync(arr, fn, callback, chunkSize, i + chunkSize); | ||
eachAsync(arr, fn, finalFunc, chunkSize, i + chunkSize); | ||
}); | ||
} else if (callback) { | ||
callback(); | ||
} else if (finalFunc) { | ||
finalFunc(); | ||
} | ||
@@ -168,10 +175,12 @@ } | ||
for (i = 0; i < points.length; i = i + 1) { | ||
point = points[i]; | ||
if (point && point.graphic) { | ||
point.graphic = point.graphic.destroy(); | ||
if (points) { | ||
for (i = 0; i < points.length; i = i + 1) { | ||
point = points[i]; | ||
if (point && point.graphic) { | ||
point.graphic = point.graphic.destroy(); | ||
} | ||
} | ||
} | ||
each(['graph', 'area'], function (prop) { | ||
each(['graph', 'area', 'tracker'], function (prop) { | ||
if (series[prop]) { | ||
@@ -188,11 +197,21 @@ series[prop] = series[prop].destroy(); | ||
getContext: function () { | ||
var width = this.chart.plotWidth, | ||
height = this.chart.plotHeight; | ||
var chart = this.chart, | ||
width = chart.plotWidth, | ||
height = chart.plotHeight, | ||
ctx = this.ctx, | ||
swapXY = function (proceed, x, y, a, b, c, d) { | ||
proceed.call(this, y, x, a, b, c, d); | ||
}; | ||
if (!this.canvas) { | ||
this.canvas = document.createElement('canvas'); | ||
this.image = this.chart.renderer.image('', 0, 0, width, height).add(this.group); | ||
this.ctx = this.canvas.getContext('2d'); | ||
this.image = chart.renderer.image('', 0, 0, width, height).add(this.group); | ||
this.ctx = ctx = this.canvas.getContext('2d'); | ||
if (chart.inverted) { | ||
each(['moveTo', 'lineTo', 'rect', 'arc'], function (fn) { | ||
wrap(ctx, fn, swapXY); | ||
}); | ||
} | ||
} else { | ||
this.ctx.clearRect(0, 0, width, height); | ||
ctx.clearRect(0, 0, width, height); | ||
} | ||
@@ -207,3 +226,3 @@ | ||
return this.ctx; | ||
return ctx; | ||
}, | ||
@@ -318,2 +337,9 @@ | ||
if (enableMouseTracking && !pointTaken[clientX + ',' + plotY]) { | ||
pointTaken[clientX + ',' + plotY] = true; | ||
if (chart.inverted) { | ||
clientX = xAxis.len - clientX; | ||
plotY = yAxis.len - plotY; | ||
} | ||
points.push({ | ||
@@ -325,3 +351,2 @@ clientX: clientX, | ||
}); | ||
pointTaken[clientX + ',' + plotY] = true; | ||
} | ||
@@ -331,3 +356,3 @@ }; | ||
// If we are zooming out from SVG mode, destroy the graphics | ||
if (this.points) { | ||
if (this.points || this.graph) { | ||
this.destroyGraphics(); | ||
@@ -501,3 +526,3 @@ } | ||
// Pass tests in Pointer. | ||
// TODO: Replace this with a single property, and replace when zooming in | ||
// Replace this with a single property, and replace when zooming in | ||
// below boostThreshold. | ||
@@ -550,17 +575,29 @@ series.directTouch = false; | ||
/** | ||
* Return a full Point object based on the index. The boost module uses stripped point objects | ||
* for performance reasons. | ||
* @param {Number} boostPoint A stripped-down point object | ||
* @returns {Object} A Point object as per http://api.highcharts.com/highcharts#Point | ||
*/ | ||
Series.prototype.getPoint = function (boostPoint) { | ||
var point = boostPoint; | ||
if (boostPoint && !(boostPoint instanceof this.pointClass)) { | ||
point = (new this.pointClass()).init(this, this.options.data[boostPoint.i]); | ||
point.dist = boostPoint.dist; | ||
point.category = point.x; | ||
point.plotX = boostPoint.plotX; | ||
point.plotY = boostPoint.plotY; | ||
} | ||
return point; | ||
}; | ||
/** | ||
* Return a point instance from the k-d-tree | ||
*/ | ||
wrap(Series.prototype, 'searchPoint', function (proceed) { | ||
var point = proceed.apply(this, [].slice.call(arguments, 1)), | ||
ret = point; | ||
if (point && !(point instanceof this.pointClass)) { | ||
ret = (new this.pointClass()).init(this, this.options.data[point.i]); | ||
ret.dist = point.dist; | ||
ret.category = ret.x; | ||
ret.plotX = point.plotX; | ||
ret.plotY = point.plotY; | ||
} | ||
return ret; | ||
return this.getPoint( | ||
proceed.apply(this, [].slice.call(arguments, 1)) | ||
); | ||
}); | ||
}(Highcharts, HighchartsAdapter)); | ||
})); |
@@ -14,3 +14,3 @@ /* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highcharts JS v4.1.10 (2015-12-07) | ||
CanVGRenderer Extension module | ||
@@ -131,5 +131,5 @@ | ||
if(CanvasRenderingContext2D)CanvasRenderingContext2D.prototype.drawSvg=function(m,a,c,d,b){canvg(this.canvas,m,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:a,offsetY:c,scaleWidth:d,scaleHeight:b})}; | ||
(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:"hidden",position:"absolute"};this.init.apply(this,[a,b,c]);this.canvas=f("canvas",{width:k,height:m},{position:"relative",left:g,top:d},a); | ||
this.ttLine=f("div",null,s,e);this.ttDiv=f("div",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f("div",{width:k,height:m},{visibility:"hidden",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+"px","background-color":d.backgroundColor,"border-style":"solid","border-width":f+"px","border-radius":d.borderRadius+"px"});d.shadow&&(m=k(m,{"box-shadow":"1px 1px 3px gray", | ||
"-webkit-box-shadow":"1px 1px 3px gray"}));a(g,m);a(p,{"border-left":"1px solid darkgray"});e(b,"tooltipRefresh",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:"visible",left:k.x+"px",top:k.y+"px","border-color":d.borderColor});a(p,{visibility:"visible",left:f+d.x+"px",top:e+b.plotTop+"px",height:b.plotHeight+"px"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g, | ||
{visibility:"hidden"});a(p,{visibility:"hidden"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts); | ||
(function(m){var a=m.css,c=m.CanVGRenderer,d=m.SVGRenderer,b=m.extend,k=m.merge,e=m.addEvent,f=m.createElement,g=m.discardElement;b(c.prototype,d.prototype);b(c.prototype,{create:function(a,b,c,d){this.setContainer(b,c,d);this.configure(a)},setContainer:function(a,b,c){var d=a.style,e=a.parentNode,g=d.left,d=d.top,k=a.offsetWidth,m=a.offsetHeight,s={visibility:"hidden",position:"absolute"};this.init(a,b,c);this.canvas=f("canvas",{width:k,height:m},{position:"relative",left:g,top:d},a);this.ttLine= | ||
f("div",null,s,e);this.ttDiv=f("div",null,s,e);this.ttTimer=void 0;this.hiddenSvg=a=f("div",{width:k,height:m},{visibility:"hidden",left:g,top:d},e);a.appendChild(this.box)},configure:function(b){var c=this,d=b.options.tooltip,f=d.borderWidth,g=c.ttDiv,m=d.style,p=c.ttLine,t=parseInt(m.padding,10),m=k(m,{padding:t+"px","background-color":d.backgroundColor,"border-style":"solid","border-width":f+"px","border-radius":d.borderRadius+"px"});d.shadow&&(m=k(m,{"box-shadow":"1px 1px 3px gray","-webkit-box-shadow":"1px 1px 3px gray"})); | ||
a(g,m);a(p,{"border-left":"1px solid darkgray"});e(b,"tooltipRefresh",function(d){var e=b.container,f=e.offsetLeft,e=e.offsetTop,k;g.innerHTML=d.text;k=b.tooltip.getPosition(g.offsetWidth,g.offsetHeight,{plotX:d.x,plotY:d.y});a(g,{visibility:"visible",left:k.x+"px",top:k.y+"px","border-color":d.borderColor});a(p,{visibility:"visible",left:f+d.x+"px",top:e+b.plotTop+"px",height:b.plotHeight+"px"});c.ttTimer!==void 0&&clearTimeout(c.ttTimer);c.ttTimer=setTimeout(function(){a(g,{visibility:"hidden"}); | ||
a(p,{visibility:"hidden"})},3E3)})},destroy:function(){g(this.canvas);this.ttTimer!==void 0&&clearTimeout(this.ttTimer);g(this.ttLine);g(this.ttDiv);g(this.hiddenSvg);return d.prototype.destroy.apply(this)},color:function(a,b,c){a&&a.linearGradient&&(a=a.stops[a.stops.length-1][1]);return d.prototype.color.call(this,a,b,c)},draw:function(){window.canvg(this.canvas,this.hiddenSvg.innerHTML)}})})(Highcharts); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
Data module | ||
@@ -9,19 +9,19 @@ | ||
*/ | ||
(function(g){var k=g.each,t=g.pick,r=HighchartsAdapter.inArray,u=g.splat,j,p=function(b,a){this.init(b,a)};g.extend(p.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.firstRowAsNames=t(b.firstRowAsNames,!0);this.decimalRegex=b.decimalPoint&&RegExp("^([0-9]+)"+b.decimalPoint+"([0-9]+)$");this.rawColumns=[];this.columns.length?this.dataFound():(this.parseCSV(),this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b= | ||
this.chartOptions,a=this.options,e=[],f=function(b){return(g.seriesTypes[b||"line"].prototype.pointArrayMap||[0]).length},d=b&&b.chart&&b.chart.type,c=[],h=[],n=0,i;k(b&&b.series||[],function(b){c.push(f(b.type||d))});k(a&&a.seriesMapping||[],function(b){e.push(b.x||0)});e.length===0&&e.push(0);k(a&&a.seriesMapping||[],function(a){var e=new j,o,q=c[n]||f(d),m=g.seriesTypes[((b&&b.series||[])[n]||{}).type||d||"line"].prototype.pointArrayMap||["y"];e.addColumnReader(a.x,"x");for(o in a)a.hasOwnProperty(o)&& | ||
o!=="x"&&e.addColumnReader(a[o],o);for(i=0;i<q;i++)e.hasReader(m[i])||e.addColumnReader(void 0,m[i]);h.push(e);n++});a=g.seriesTypes[d||"line"].prototype.pointArrayMap;a===void 0&&(a=["y"]);this.valueCount={global:f(d),xColumns:e,individual:c,seriesBuilders:h,globalPointArrayMap:a}},dataFound:function(){if(this.options.switchRowsAndColumns)this.columns=this.rowsToColumns(this.columns);this.getColumnDistribution();this.parseTypes();this.parsed()!==!1&&this.complete()},parseCSV:function(){var b=this, | ||
a=this.options,e=a.csv,f=this.columns,d=a.startRow||0,c=a.endRow||Number.MAX_VALUE,h=a.startColumn||0,n=a.endColumn||Number.MAX_VALUE,i,g,s=0;e&&(g=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||"\n"),i=a.itemDelimiter||(e.indexOf("\t")!==-1?"\t":","),k(g,function(a,e){var g=b.trim(a),v=g.indexOf("#")===0;e>=d&&e<=c&&!v&&g!==""&&(g=a.split(i),k(g,function(b,a){a>=h&&a<=n&&(f[a-h]||(f[a-h]=[]),f[a-h][s]=b)}),s+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a= | ||
b.table,e=this.columns,f=b.startRow||0,d=b.endRow||Number.MAX_VALUE,c=b.startColumn||0,h=b.endColumn||Number.MAX_VALUE;a&&(typeof a==="string"&&(a=document.getElementById(a)),k(a.getElementsByTagName("tr"),function(b,a){a>=f&&a<=d&&k(b.children,function(b,d){if((b.tagName==="TD"||b.tagName==="TH")&&d>=c&&d<=h)e[d-c]||(e[d-c]=[]),e[d-c][a-f]=b.innerHTML})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b=this,a=this.options,e=a.googleSpreadsheetKey,f=this.columns,d=a.startRow||0,c=a.endRow|| | ||
Number.MAX_VALUE,h=a.startColumn||0,n=a.endColumn||Number.MAX_VALUE,i,g;e&&jQuery.ajax({dataType:"json",url:"https://spreadsheets.google.com/feeds/cells/"+e+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",error:a.error,success:function(a){var a=a.feed.entry,e,k=a.length,m=0,j=0,l;for(l=0;l<k;l++)e=a[l],m=Math.max(m,e.gs$cell.col),j=Math.max(j,e.gs$cell.row);for(l=0;l<m;l++)if(l>=h&&l<=n)f[l-h]=[],f[l-h].length=Math.min(j,c-d);for(l=0;l<k;l++)if(e=a[l],i=e.gs$cell.row- | ||
1,g=e.gs$cell.col-1,g>=h&&g<=n&&i>=d&&i<=c)f[g-h][i-d]=e.content.$t;b.dataFound()}})},trim:function(b,a){typeof b==="string"&&(b=b.replace(/^\s+|\s+$/g,""),a&&/^[0-9\s]+$/.test(b)&&(b=b.replace(/\s/g,"")),this.decimalRegex&&(b=b.replace(this.decimalRegex,"$1.$2")));return b},parseTypes:function(){for(var b=this.columns,a=b.length;a--;)this.parseColumn(b[a],a)},parseColumn:function(b,a){var e=this.rawColumns,f=this.columns,d=b.length,c,h,g,i,k=this.firstRowAsNames,j=r(a,this.valueCount.xColumns)!== | ||
-1,o=[],q=this.chartOptions,m,p=(this.options.columnTypes||[])[a],q=j&&(q&&q.xAxis&&u(q.xAxis)[0].type==="category"||p==="string");for(e[a]||(e[a]=[]);d--;)if(c=o[d]||b[d],g=this.trim(c),i=this.trim(c,!0),h=parseFloat(i),e[a][d]===void 0&&(e[a][d]=g),q||d===0&&k)b[d]=g;else if(+i===h)b[d]=h,h>31536E6&&p!=="float"?b.isDatetime=!0:b.isNumeric=!0,b[d+1]!==void 0&&(m=h>b[d+1]);else if(h=this.parseDate(c),j&&typeof h==="number"&&!isNaN(h)&&p!=="float"){if(o[d]=c,b[d]=h,b.isDatetime=!0,b[d+1]!==void 0){c= | ||
h>b[d+1];if(c!==m&&m!==void 0)this.alternativeFormat?(this.dateFormat=this.alternativeFormat,d=b.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):b.unsorted=!0;m=c}}else if(b[d]=g===""?null:g,d!==0&&(b.isDatetime||b.isNumeric))b.mixed=!0;j&&b.mixed&&(f[a]=e[a]);if(j&&m&&this.options.sort)for(a=0;a<f.length;a++)f[a].reverse(),k&&f[a].unshift(f[a].pop())},dateFormats:{"YYYY-mm-dd":{regex:/^([0-9]{4})[\-\/\.]([0-9]{2})[\-\/\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[1], | ||
b[2]-1,+b[3])}},"dd/mm/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[2]-1,+b[1])},alternative:"mm/dd/YYYY"},"mm/dd/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[1]-1,+b[2])}},"dd/mm/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[2]-1,+b[1])},alternative:"mm/dd/YY"},"mm/dd/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/, | ||
parser:function(b){return Date.UTC(+b[3]+2E3,b[1]-1,+b[2])}}},parseDate:function(b){var a=this.options.parseDate,e,f,d=this.options.dateFormat||this.dateFormat,c;if(a)e=a(b);else if(typeof b==="string"){if(d)a=this.dateFormats[d],(c=b.match(a.regex))&&(e=a.parser(c));else for(f in this.dateFormats)if(a=this.dateFormats[f],c=b.match(a.regex)){this.dateFormat=f;this.alternativeFormat=a.alternative;e=a.parser(c);break}c||(c=Date.parse(b),typeof c==="object"&&c!==null&&c.getTime?e=c.getTime()-c.getTimezoneOffset()* | ||
6E4:typeof c==="number"&&!isNaN(c)&&(e=c-(new Date(c)).getTimezoneOffset()*6E4))}return e},rowsToColumns:function(b){var a,e,f,d,c;if(b){c=[];e=b.length;for(a=0;a<e;a++){d=b[a].length;for(f=0;f<d;f++)c[f]||(c[f]=[]),c[f][a]=b[a][f]}}return c},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(b,a){var e,f,d=[],c=[],h;for(f=0;f<b;f+=1)d.push(!0);for(e=0;e<a.length;e+=1){h=a[e].getReferencedColumnIndexes();for(f=0;f<h.length;f+=1)d[h[f]]= | ||
!1}for(f=0;f<d.length;f+=1)d[f]&&c.push(f);return c},complete:function(){var b=this.columns,a,e=this.options,f,d,c,h,g=[],i;if(e.complete||e.afterComplete){for(c=0;c<b.length;c++)if(this.firstRowAsNames)b[c].name=b[c].shift();f=[];d=this.getFreeIndexes(b.length,this.valueCount.seriesBuilders);for(c=0;c<this.valueCount.seriesBuilders.length;c++)i=this.valueCount.seriesBuilders[c],i.populateColumns(d)&&g.push(i);for(;d.length>0;){i=new j;i.addColumnReader(0,"x");c=r(0,d);c!==-1&&d.splice(c,1);for(c= | ||
0;c<this.valueCount.global;c++)i.addColumnReader(void 0,this.valueCount.globalPointArrayMap[c]);i.populateColumns(d)&&g.push(i)}g.length>0&&g[0].readers.length>0&&(i=b[g[0].readers[0].columnIndex],i!==void 0&&(i.isDatetime?a="datetime":i.isNumeric||(a="category")));if(a==="category")for(c=0;c<g.length;c++){i=g[c];for(d=0;d<i.readers.length;d++)if(i.readers[d].configName==="x")i.readers[d].configName="name"}for(c=0;c<g.length;c++){i=g[c];d=[];for(h=0;h<b[0].length;h++)d[h]=i.read(b,h);f[c]={data:d}; | ||
if(i.name)f[c].name=i.name;if(a==="category")f[c].turboThreshold=0}b={series:f};if(a)b.xAxis={type:a};e.complete&&e.complete(b);e.afterComplete&&e.afterComplete(b)}}});g.Data=p;g.data=function(b,a){return new p(b,a)};g.wrap(g.Chart.prototype,"init",function(b,a,e){var f=this;a&&a.data?g.data(g.extend(a.data,{afterComplete:function(d){var c,h;if(a.hasOwnProperty("series"))if(typeof a.series==="object")for(c=Math.max(a.series.length,d.series.length);c--;)h=a.series[c]||{},a.series[c]=g.merge(h,d.series[c]); | ||
else delete a.series;a=g.merge(d,a);b.call(f,a,e)}}),a):b.call(f,a,e)});j=function(){this.readers=[];this.pointIsArray=!0};j.prototype.populateColumns=function(b){var a=!0;k(this.readers,function(a){if(a.columnIndex===void 0)a.columnIndex=b.shift()});k(this.readers,function(b){b.columnIndex===void 0&&(a=!1)});return a};j.prototype.read=function(b,a){var e=this.pointIsArray,f=e?[]:{},d;k(this.readers,function(c){var d=b[c.columnIndex][a];e?f.push(d):f[c.configName]=d});if(this.name===void 0&&this.readers.length>= | ||
2&&(d=this.getReferencedColumnIndexes(),d.length>=2))d.shift(),d.sort(),this.name=b[d.shift()].name;return f};j.prototype.addColumnReader=function(b,a){this.readers.push({columnIndex:b,configName:a});if(!(a==="x"||a==="y"||a===void 0))this.pointIsArray=!1};j.prototype.getReferencedColumnIndexes=function(){var b,a=[],e;for(b=0;b<this.readers.length;b+=1)e=this.readers[b],e.columnIndex!==void 0&&a.push(e.columnIndex);return a};j.prototype.hasReader=function(b){var a,e;for(a=0;a<this.readers.length;a+= | ||
1)if(e=this.readers[a],e.configName===b)return!0}})(Highcharts); | ||
(function(g){typeof module==="object"&&module.exports?module.exports=g:g(Highcharts)})(function(g){var j=g.each,t=g.pick,r=g.inArray,u=g.splat,k,p=function(b,a){this.init(b,a)};g.extend(p.prototype,{init:function(b,a){this.options=b;this.chartOptions=a;this.columns=b.columns||this.rowsToColumns(b.rows)||[];this.firstRowAsNames=t(b.firstRowAsNames,!0);this.decimalRegex=b.decimalPoint&&RegExp("^(-?[0-9]+)"+b.decimalPoint+"([0-9]+)$");this.rawColumns=[];this.columns.length?this.dataFound():(this.parseCSV(), | ||
this.parseTable(),this.parseGoogleSpreadsheet())},getColumnDistribution:function(){var b=this.chartOptions,a=this.options,e=[],f=function(b){return(g.seriesTypes[b||"line"].prototype.pointArrayMap||[0]).length},d=b&&b.chart&&b.chart.type,c=[],h=[],q=0,i;j(b&&b.series||[],function(b){c.push(f(b.type||d))});j(a&&a.seriesMapping||[],function(b){e.push(b.x||0)});e.length===0&&e.push(0);j(a&&a.seriesMapping||[],function(a){var e=new k,o,n=c[q]||f(d),m=g.seriesTypes[((b&&b.series||[])[q]||{}).type||d|| | ||
"line"].prototype.pointArrayMap||["y"];e.addColumnReader(a.x,"x");for(o in a)a.hasOwnProperty(o)&&o!=="x"&&e.addColumnReader(a[o],o);for(i=0;i<n;i++)e.hasReader(m[i])||e.addColumnReader(void 0,m[i]);h.push(e);q++});a=g.seriesTypes[d||"line"].prototype.pointArrayMap;a===void 0&&(a=["y"]);this.valueCount={global:f(d),xColumns:e,individual:c,seriesBuilders:h,globalPointArrayMap:a}},dataFound:function(){if(this.options.switchRowsAndColumns)this.columns=this.rowsToColumns(this.columns);this.getColumnDistribution(); | ||
this.parseTypes();this.parsed()!==!1&&this.complete()},parseCSV:function(){var b=this,a=this.options,e=a.csv,f=this.columns,d=a.startRow||0,c=a.endRow||Number.MAX_VALUE,h=a.startColumn||0,q=a.endColumn||Number.MAX_VALUE,i,g,s=0;e&&(g=e.replace(/\r\n/g,"\n").replace(/\r/g,"\n").split(a.lineDelimiter||"\n"),i=a.itemDelimiter||(e.indexOf("\t")!==-1?"\t":","),j(g,function(a,e){var g=b.trim(a),v=g.indexOf("#")===0;e>=d&&e<=c&&!v&&g!==""&&(g=a.split(i),j(g,function(b,a){a>=h&&a<=q&&(f[a-h]||(f[a-h]=[]), | ||
f[a-h][s]=b)}),s+=1)}),this.dataFound())},parseTable:function(){var b=this.options,a=b.table,e=this.columns,f=b.startRow||0,d=b.endRow||Number.MAX_VALUE,c=b.startColumn||0,h=b.endColumn||Number.MAX_VALUE;a&&(typeof a==="string"&&(a=document.getElementById(a)),j(a.getElementsByTagName("tr"),function(b,a){a>=f&&a<=d&&j(b.children,function(b,d){if((b.tagName==="TD"||b.tagName==="TH")&&d>=c&&d<=h)e[d-c]||(e[d-c]=[]),e[d-c][a-f]=b.innerHTML})}),this.dataFound())},parseGoogleSpreadsheet:function(){var b= | ||
this,a=this.options,e=a.googleSpreadsheetKey,f=this.columns,d=a.startRow||0,c=a.endRow||Number.MAX_VALUE,h=a.startColumn||0,g=a.endColumn||Number.MAX_VALUE,i,j;e&&jQuery.ajax({dataType:"json",url:"https://spreadsheets.google.com/feeds/cells/"+e+"/"+(a.googleSpreadsheetWorksheet||"od6")+"/public/values?alt=json-in-script&callback=?",error:a.error,success:function(a){var a=a.feed.entry,e,n=a.length,m=0,k=0,l;for(l=0;l<n;l++)e=a[l],m=Math.max(m,e.gs$cell.col),k=Math.max(k,e.gs$cell.row);for(l=0;l<m;l++)if(l>= | ||
h&&l<=g)f[l-h]=[],f[l-h].length=Math.min(k,c-d);for(l=0;l<n;l++)if(e=a[l],i=e.gs$cell.row-1,j=e.gs$cell.col-1,j>=h&&j<=g&&i>=d&&i<=c)f[j-h][i-d]=e.content.$t;b.dataFound()}})},trim:function(b,a){typeof b==="string"&&(b=b.replace(/^\s+|\s+$/g,""),a&&/^[0-9\s]+$/.test(b)&&(b=b.replace(/\s/g,"")),this.decimalRegex&&(b=b.replace(this.decimalRegex,"$1.$2")));return b},parseTypes:function(){for(var b=this.columns,a=b.length;a--;)this.parseColumn(b[a],a)},parseColumn:function(b,a){var e=this.rawColumns, | ||
f=this.columns,d=b.length,c,h,g,i,j=this.firstRowAsNames,k=r(a,this.valueCount.xColumns)!==-1,o=[],n=this.chartOptions,m,p=(this.options.columnTypes||[])[a],n=k&&(n&&n.xAxis&&u(n.xAxis)[0].type==="category"||p==="string");for(e[a]||(e[a]=[]);d--;)if(c=o[d]||b[d],g=this.trim(c),i=this.trim(c,!0),h=parseFloat(i),e[a][d]===void 0&&(e[a][d]=g),n||d===0&&j)b[d]=g;else if(+i===h)b[d]=h,h>31536E6&&p!=="float"?b.isDatetime=!0:b.isNumeric=!0,b[d+1]!==void 0&&(m=h>b[d+1]);else if(h=this.parseDate(c),k&&typeof h=== | ||
"number"&&!isNaN(h)&&p!=="float"){if(o[d]=c,b[d]=h,b.isDatetime=!0,b[d+1]!==void 0){c=h>b[d+1];if(c!==m&&m!==void 0)this.alternativeFormat?(this.dateFormat=this.alternativeFormat,d=b.length,this.alternativeFormat=this.dateFormats[this.dateFormat].alternative):b.unsorted=!0;m=c}}else if(b[d]=g===""?null:g,d!==0&&(b.isDatetime||b.isNumeric))b.mixed=!0;k&&b.mixed&&(f[a]=e[a]);if(k&&m&&this.options.sort)for(a=0;a<f.length;a++)f[a].reverse(),j&&f[a].unshift(f[a].pop())},dateFormats:{"YYYY-mm-dd":{regex:/^([0-9]{4})[\-\/\.]([0-9]{2})[\-\/\.]([0-9]{2})$/, | ||
parser:function(b){return Date.UTC(+b[1],b[2]-1,+b[3])}},"dd/mm/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[2]-1,+b[1])},alternative:"mm/dd/YYYY"},"mm/dd/YYYY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/,parser:function(b){return Date.UTC(+b[3],b[1]-1,+b[2])}},"dd/mm/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[2]-1,+b[1])},alternative:"mm/dd/YY"}, | ||
"mm/dd/YY":{regex:/^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/,parser:function(b){return Date.UTC(+b[3]+2E3,b[1]-1,+b[2])}}},parseDate:function(b){var a=this.options.parseDate,e,f,d=this.options.dateFormat||this.dateFormat,c;if(a)e=a(b);else if(typeof b==="string"){if(d)a=this.dateFormats[d],(c=b.match(a.regex))&&(e=a.parser(c));else for(f in this.dateFormats)if(a=this.dateFormats[f],c=b.match(a.regex)){this.dateFormat=f;this.alternativeFormat=a.alternative;e=a.parser(c);break}c||(c=Date.parse(b), | ||
typeof c==="object"&&c!==null&&c.getTime?e=c.getTime()-c.getTimezoneOffset()*6E4:typeof c==="number"&&!isNaN(c)&&(e=c-(new Date(c)).getTimezoneOffset()*6E4))}return e},rowsToColumns:function(b){var a,e,f,d,c;if(b){c=[];e=b.length;for(a=0;a<e;a++){d=b[a].length;for(f=0;f<d;f++)c[f]||(c[f]=[]),c[f][a]=b[a][f]}}return c},parsed:function(){if(this.options.parsed)return this.options.parsed.call(this,this.columns)},getFreeIndexes:function(b,a){var e,f,d=[],c=[],h;for(f=0;f<b;f+=1)d.push(!0);for(e=0;e<a.length;e+= | ||
1){h=a[e].getReferencedColumnIndexes();for(f=0;f<h.length;f+=1)d[h[f]]=!1}for(f=0;f<d.length;f+=1)d[f]&&c.push(f);return c},complete:function(){var b=this.columns,a,e=this.options,f,d,c,h,g=[],i;if(e.complete||e.afterComplete){for(c=0;c<b.length;c++)if(this.firstRowAsNames)b[c].name=b[c].shift();f=[];d=this.getFreeIndexes(b.length,this.valueCount.seriesBuilders);for(c=0;c<this.valueCount.seriesBuilders.length;c++)i=this.valueCount.seriesBuilders[c],i.populateColumns(d)&&g.push(i);for(;d.length>0;){i= | ||
new k;i.addColumnReader(0,"x");c=r(0,d);c!==-1&&d.splice(c,1);for(c=0;c<this.valueCount.global;c++)i.addColumnReader(void 0,this.valueCount.globalPointArrayMap[c]);i.populateColumns(d)&&g.push(i)}g.length>0&&g[0].readers.length>0&&(i=b[g[0].readers[0].columnIndex],i!==void 0&&(i.isDatetime?a="datetime":i.isNumeric||(a="category")));if(a==="category")for(c=0;c<g.length;c++){i=g[c];for(d=0;d<i.readers.length;d++)if(i.readers[d].configName==="x")i.readers[d].configName="name"}for(c=0;c<g.length;c++){i= | ||
g[c];d=[];for(h=0;h<b[0].length;h++)d[h]=i.read(b,h);f[c]={data:d};if(i.name)f[c].name=i.name;if(a==="category")f[c].turboThreshold=0}b={series:f};if(a)b.xAxis={type:a};e.complete&&e.complete(b);e.afterComplete&&e.afterComplete(b)}}});g.Data=p;g.data=function(b,a){return new p(b,a)};g.wrap(g.Chart.prototype,"init",function(b,a,e){var f=this;a&&a.data?g.data(g.extend(a.data,{afterComplete:function(d){var c,h;if(a.hasOwnProperty("series"))if(typeof a.series==="object")for(c=Math.max(a.series.length, | ||
d.series.length);c--;)h=a.series[c]||{},a.series[c]=g.merge(h,d.series[c]);else delete a.series;a=g.merge(d,a);b.call(f,a,e)}}),a):b.call(f,a,e)});k=function(){this.readers=[];this.pointIsArray=!0};k.prototype.populateColumns=function(b){var a=!0;j(this.readers,function(a){if(a.columnIndex===void 0)a.columnIndex=b.shift()});j(this.readers,function(b){b.columnIndex===void 0&&(a=!1)});return a};k.prototype.read=function(b,a){var e=this.pointIsArray,f=e?[]:{},d;j(this.readers,function(c){var d=b[c.columnIndex][a]; | ||
e?f.push(d):f[c.configName]=d});if(this.name===void 0&&this.readers.length>=2&&(d=this.getReferencedColumnIndexes(),d.length>=2))d.shift(),d.sort(),this.name=b[d.shift()].name;return f};k.prototype.addColumnReader=function(b,a){this.readers.push({columnIndex:b,configName:a});if(!(a==="x"||a==="y"||a===void 0))this.pointIsArray=!1};k.prototype.getReferencedColumnIndexes=function(){var b,a=[],e;for(b=0;b<this.readers.length;b+=1)e=this.readers[b],e.columnIndex!==void 0&&a.push(e.columnIndex);return a}; | ||
k.prototype.hasReader=function(b){var a,e;for(a=0;a<this.readers.length;a+=1)if(e=this.readers[a],e.configName===b)return!0}}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* Data module | ||
@@ -10,6 +10,10 @@ * | ||
// JSLint options: | ||
/*global jQuery, HighchartsAdapter */ | ||
(function (Highcharts) { | ||
/*global jQuery */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
@@ -19,3 +23,3 @@ // Utilities | ||
pick = Highcharts.pick, | ||
inArray = HighchartsAdapter.inArray, | ||
inArray = Highcharts.inArray, | ||
splat = Highcharts.splat, | ||
@@ -33,736 +37,736 @@ SeriesBuilder; | ||
/** | ||
* Initialize the Data object with the given options | ||
*/ | ||
init: function (options, chartOptions) { | ||
this.options = options; | ||
this.chartOptions = chartOptions; | ||
this.columns = options.columns || this.rowsToColumns(options.rows) || []; | ||
this.firstRowAsNames = pick(options.firstRowAsNames, true); | ||
this.decimalRegex = options.decimalPoint && new RegExp('^([0-9]+)' + options.decimalPoint + '([0-9]+)$'); | ||
/** | ||
* Initialize the Data object with the given options | ||
*/ | ||
init: function (options, chartOptions) { | ||
this.options = options; | ||
this.chartOptions = chartOptions; | ||
this.columns = options.columns || this.rowsToColumns(options.rows) || []; | ||
this.firstRowAsNames = pick(options.firstRowAsNames, true); | ||
this.decimalRegex = options.decimalPoint && new RegExp('^(-?[0-9]+)' + options.decimalPoint + '([0-9]+)$'); | ||
// This is a two-dimensional array holding the raw, trimmed string values | ||
// with the same organisation as the columns array. It makes it possible | ||
// for example to revert from interpreted timestamps to string-based | ||
// categories. | ||
this.rawColumns = []; | ||
// This is a two-dimensional array holding the raw, trimmed string values | ||
// with the same organisation as the columns array. It makes it possible | ||
// for example to revert from interpreted timestamps to string-based | ||
// categories. | ||
this.rawColumns = []; | ||
// No need to parse or interpret anything | ||
if (this.columns.length) { | ||
this.dataFound(); | ||
// No need to parse or interpret anything | ||
if (this.columns.length) { | ||
this.dataFound(); | ||
// Parse and interpret | ||
} else { | ||
// Parse and interpret | ||
} else { | ||
// Parse a CSV string if options.csv is given | ||
this.parseCSV(); | ||
// Parse a HTML table if options.table is given | ||
this.parseTable(); | ||
// Parse a CSV string if options.csv is given | ||
this.parseCSV(); | ||
// Parse a HTML table if options.table is given | ||
this.parseTable(); | ||
// Parse a Google Spreadsheet | ||
this.parseGoogleSpreadsheet(); | ||
} | ||
// Parse a Google Spreadsheet | ||
this.parseGoogleSpreadsheet(); | ||
} | ||
}, | ||
}, | ||
/** | ||
* Get the column distribution. For example, a line series takes a single column for | ||
* Y values. A range series takes two columns for low and high values respectively, | ||
* and an OHLC series takes four columns. | ||
*/ | ||
getColumnDistribution: function () { | ||
var chartOptions = this.chartOptions, | ||
options = this.options, | ||
xColumns = [], | ||
getValueCount = function (type) { | ||
return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length; | ||
}, | ||
getPointArrayMap = function (type) { | ||
return Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap; | ||
}, | ||
globalType = chartOptions && chartOptions.chart && chartOptions.chart.type, | ||
individualCounts = [], | ||
seriesBuilders = [], | ||
seriesIndex = 0, | ||
i; | ||
/** | ||
* Get the column distribution. For example, a line series takes a single column for | ||
* Y values. A range series takes two columns for low and high values respectively, | ||
* and an OHLC series takes four columns. | ||
*/ | ||
getColumnDistribution: function () { | ||
var chartOptions = this.chartOptions, | ||
options = this.options, | ||
xColumns = [], | ||
getValueCount = function (type) { | ||
return (Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap || [0]).length; | ||
}, | ||
getPointArrayMap = function (type) { | ||
return Highcharts.seriesTypes[type || 'line'].prototype.pointArrayMap; | ||
}, | ||
globalType = chartOptions && chartOptions.chart && chartOptions.chart.type, | ||
individualCounts = [], | ||
seriesBuilders = [], | ||
seriesIndex = 0, | ||
i; | ||
each((chartOptions && chartOptions.series) || [], function (series) { | ||
individualCounts.push(getValueCount(series.type || globalType)); | ||
}); | ||
each((chartOptions && chartOptions.series) || [], function (series) { | ||
individualCounts.push(getValueCount(series.type || globalType)); | ||
}); | ||
// Collect the x-column indexes from seriesMapping | ||
each((options && options.seriesMapping) || [], function (mapping) { | ||
xColumns.push(mapping.x || 0); | ||
}); | ||
// Collect the x-column indexes from seriesMapping | ||
each((options && options.seriesMapping) || [], function (mapping) { | ||
xColumns.push(mapping.x || 0); | ||
}); | ||
// If there are no defined series with x-columns, use the first column as x column | ||
if (xColumns.length === 0) { | ||
xColumns.push(0); | ||
} | ||
// If there are no defined series with x-columns, use the first column as x column | ||
if (xColumns.length === 0) { | ||
xColumns.push(0); | ||
} | ||
// Loop all seriesMappings and constructs SeriesBuilders from | ||
// the mapping options. | ||
each((options && options.seriesMapping) || [], function (mapping) { | ||
var builder = new SeriesBuilder(), | ||
name, | ||
numberOfValueColumnsNeeded = individualCounts[seriesIndex] || getValueCount(globalType), | ||
seriesArr = (chartOptions && chartOptions.series) || [], | ||
series = seriesArr[seriesIndex] || {}, | ||
pointArrayMap = getPointArrayMap(series.type || globalType) || ['y']; | ||
// Loop all seriesMappings and constructs SeriesBuilders from | ||
// the mapping options. | ||
each((options && options.seriesMapping) || [], function (mapping) { | ||
var builder = new SeriesBuilder(), | ||
name, | ||
numberOfValueColumnsNeeded = individualCounts[seriesIndex] || getValueCount(globalType), | ||
seriesArr = (chartOptions && chartOptions.series) || [], | ||
series = seriesArr[seriesIndex] || {}, | ||
pointArrayMap = getPointArrayMap(series.type || globalType) || ['y']; | ||
// Add an x reader from the x property or from an undefined column | ||
// if the property is not set. It will then be auto populated later. | ||
builder.addColumnReader(mapping.x, 'x'); | ||
// Add an x reader from the x property or from an undefined column | ||
// if the property is not set. It will then be auto populated later. | ||
builder.addColumnReader(mapping.x, 'x'); | ||
// Add all column mappings | ||
for (name in mapping) { | ||
if (mapping.hasOwnProperty(name) && name !== 'x') { | ||
builder.addColumnReader(mapping[name], name); | ||
// Add all column mappings | ||
for (name in mapping) { | ||
if (mapping.hasOwnProperty(name) && name !== 'x') { | ||
builder.addColumnReader(mapping[name], name); | ||
} | ||
} | ||
} | ||
// Add missing columns | ||
for (i = 0; i < numberOfValueColumnsNeeded; i++) { | ||
if (!builder.hasReader(pointArrayMap[i])) { | ||
//builder.addNextColumnReader(pointArrayMap[i]); | ||
// Create and add a column reader for the next free column index | ||
builder.addColumnReader(undefined, pointArrayMap[i]); | ||
// Add missing columns | ||
for (i = 0; i < numberOfValueColumnsNeeded; i++) { | ||
if (!builder.hasReader(pointArrayMap[i])) { | ||
//builder.addNextColumnReader(pointArrayMap[i]); | ||
// Create and add a column reader for the next free column index | ||
builder.addColumnReader(undefined, pointArrayMap[i]); | ||
} | ||
} | ||
} | ||
seriesBuilders.push(builder); | ||
seriesIndex++; | ||
}); | ||
seriesBuilders.push(builder); | ||
seriesIndex++; | ||
}); | ||
var globalPointArrayMap = getPointArrayMap(globalType); | ||
if (globalPointArrayMap === undefined) { | ||
globalPointArrayMap = ['y']; | ||
} | ||
var globalPointArrayMap = getPointArrayMap(globalType); | ||
if (globalPointArrayMap === undefined) { | ||
globalPointArrayMap = ['y']; | ||
} | ||
this.valueCount = { | ||
global: getValueCount(globalType), | ||
xColumns: xColumns, | ||
individual: individualCounts, | ||
seriesBuilders: seriesBuilders, | ||
globalPointArrayMap: globalPointArrayMap | ||
}; | ||
}, | ||
this.valueCount = { | ||
global: getValueCount(globalType), | ||
xColumns: xColumns, | ||
individual: individualCounts, | ||
seriesBuilders: seriesBuilders, | ||
globalPointArrayMap: globalPointArrayMap | ||
}; | ||
}, | ||
/** | ||
* When the data is parsed into columns, either by CSV, table, GS or direct input, | ||
* continue with other operations. | ||
*/ | ||
dataFound: function () { | ||
if (this.options.switchRowsAndColumns) { | ||
this.columns = this.rowsToColumns(this.columns); | ||
} | ||
/** | ||
* When the data is parsed into columns, either by CSV, table, GS or direct input, | ||
* continue with other operations. | ||
*/ | ||
dataFound: function () { | ||
if (this.options.switchRowsAndColumns) { | ||
this.columns = this.rowsToColumns(this.columns); | ||
} | ||
// Interpret the info about series and columns | ||
this.getColumnDistribution(); | ||
// Interpret the info about series and columns | ||
this.getColumnDistribution(); | ||
// Interpret the values into right types | ||
this.parseTypes(); | ||
// Handle columns if a handleColumns callback is given | ||
if (this.parsed() !== false) { | ||
// Complete if a complete callback is given | ||
this.complete(); | ||
} | ||
}, | ||
/** | ||
* Parse a CSV input string | ||
*/ | ||
parseCSV: function () { | ||
var self = this, | ||
options = this.options, | ||
csv = options.csv, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE, | ||
itemDelimiter, | ||
lines, | ||
activeRowNo = 0; | ||
// Interpret the values into right types | ||
this.parseTypes(); | ||
if (csv) { | ||
// Handle columns if a handleColumns callback is given | ||
if (this.parsed() !== false) { | ||
lines = csv | ||
.replace(/\r\n/g, "\n") // Unix | ||
.replace(/\r/g, "\n") // Mac | ||
.split(options.lineDelimiter || "\n"); | ||
itemDelimiter = options.itemDelimiter || (csv.indexOf('\t') !== -1 ? '\t' : ','); | ||
// Complete if a complete callback is given | ||
this.complete(); | ||
} | ||
each(lines, function (line, rowNo) { | ||
var trimmed = self.trim(line), | ||
isComment = trimmed.indexOf('#') === 0, | ||
isBlank = trimmed === '', | ||
items; | ||
}, | ||
/** | ||
* Parse a CSV input string | ||
*/ | ||
parseCSV: function () { | ||
var self = this, | ||
options = this.options, | ||
csv = options.csv, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE, | ||
itemDelimiter, | ||
lines, | ||
activeRowNo = 0; | ||
if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) { | ||
items = line.split(itemDelimiter); | ||
each(items, function (item, colNo) { | ||
if (colNo >= startColumn && colNo <= endColumn) { | ||
if (!columns[colNo - startColumn]) { | ||
columns[colNo - startColumn] = []; | ||
if (csv) { | ||
lines = csv | ||
.replace(/\r\n/g, '\n') // Unix | ||
.replace(/\r/g, '\n') // Mac | ||
.split(options.lineDelimiter || '\n'); | ||
itemDelimiter = options.itemDelimiter || (csv.indexOf('\t') !== -1 ? '\t' : ','); | ||
each(lines, function (line, rowNo) { | ||
var trimmed = self.trim(line), | ||
isComment = trimmed.indexOf('#') === 0, | ||
isBlank = trimmed === '', | ||
items; | ||
if (rowNo >= startRow && rowNo <= endRow && !isComment && !isBlank) { | ||
items = line.split(itemDelimiter); | ||
each(items, function (item, colNo) { | ||
if (colNo >= startColumn && colNo <= endColumn) { | ||
if (!columns[colNo - startColumn]) { | ||
columns[colNo - startColumn] = []; | ||
} | ||
columns[colNo - startColumn][activeRowNo] = item; | ||
} | ||
columns[colNo - startColumn][activeRowNo] = item; | ||
} | ||
}); | ||
activeRowNo += 1; | ||
} | ||
}); | ||
}); | ||
activeRowNo += 1; | ||
} | ||
}); | ||
this.dataFound(); | ||
} | ||
}, | ||
/** | ||
* Parse a HTML table | ||
*/ | ||
parseTable: function () { | ||
var options = this.options, | ||
table = options.table, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE; | ||
this.dataFound(); | ||
} | ||
}, | ||
/** | ||
* Parse a HTML table | ||
*/ | ||
parseTable: function () { | ||
var options = this.options, | ||
table = options.table, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE; | ||
if (table) { | ||
if (typeof table === 'string') { | ||
table = document.getElementById(table); | ||
} | ||
each(table.getElementsByTagName('tr'), function (tr, rowNo) { | ||
if (rowNo >= startRow && rowNo <= endRow) { | ||
each(tr.children, function (item, colNo) { | ||
if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) { | ||
if (!columns[colNo - startColumn]) { | ||
columns[colNo - startColumn] = []; | ||
if (table) { | ||
if (typeof table === 'string') { | ||
table = document.getElementById(table); | ||
} | ||
each(table.getElementsByTagName('tr'), function (tr, rowNo) { | ||
if (rowNo >= startRow && rowNo <= endRow) { | ||
each(tr.children, function (item, colNo) { | ||
if ((item.tagName === 'TD' || item.tagName === 'TH') && colNo >= startColumn && colNo <= endColumn) { | ||
if (!columns[colNo - startColumn]) { | ||
columns[colNo - startColumn] = []; | ||
} | ||
columns[colNo - startColumn][rowNo - startRow] = item.innerHTML; | ||
} | ||
columns[colNo - startColumn][rowNo - startRow] = item.innerHTML; | ||
} | ||
}); | ||
} | ||
}); | ||
}); | ||
} | ||
}); | ||
this.dataFound(); // continue | ||
} | ||
}, | ||
this.dataFound(); // continue | ||
} | ||
}, | ||
/** | ||
*/ | ||
parseGoogleSpreadsheet: function () { | ||
var self = this, | ||
options = this.options, | ||
googleSpreadsheetKey = options.googleSpreadsheetKey, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE, | ||
gr, // google row | ||
gc; // google column | ||
/** | ||
*/ | ||
parseGoogleSpreadsheet: function () { | ||
var self = this, | ||
options = this.options, | ||
googleSpreadsheetKey = options.googleSpreadsheetKey, | ||
columns = this.columns, | ||
startRow = options.startRow || 0, | ||
endRow = options.endRow || Number.MAX_VALUE, | ||
startColumn = options.startColumn || 0, | ||
endColumn = options.endColumn || Number.MAX_VALUE, | ||
gr, // google row | ||
gc; // google column | ||
if (googleSpreadsheetKey) { | ||
jQuery.ajax({ | ||
dataType: 'json', | ||
url: 'https://spreadsheets.google.com/feeds/cells/' + | ||
googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') + | ||
'/public/values?alt=json-in-script&callback=?', | ||
error: options.error, | ||
success: function (json) { | ||
// Prepare the data from the spreadsheat | ||
var cells = json.feed.entry, | ||
cell, | ||
cellCount = cells.length, | ||
colCount = 0, | ||
rowCount = 0, | ||
i; | ||
// First, find the total number of columns and rows that | ||
// are actually filled with data | ||
for (i = 0; i < cellCount; i++) { | ||
cell = cells[i]; | ||
colCount = Math.max(colCount, cell.gs$cell.col); | ||
rowCount = Math.max(rowCount, cell.gs$cell.row); | ||
} | ||
// Set up arrays containing the column data | ||
for (i = 0; i < colCount; i++) { | ||
if (i >= startColumn && i <= endColumn) { | ||
// Create new columns with the length of either end-start or rowCount | ||
columns[i - startColumn] = []; | ||
// Setting the length to avoid jslint warning | ||
columns[i - startColumn].length = Math.min(rowCount, endRow - startRow); | ||
if (googleSpreadsheetKey) { | ||
jQuery.ajax({ | ||
dataType: 'json', | ||
url: 'https://spreadsheets.google.com/feeds/cells/' + | ||
googleSpreadsheetKey + '/' + (options.googleSpreadsheetWorksheet || 'od6') + | ||
'/public/values?alt=json-in-script&callback=?', | ||
error: options.error, | ||
success: function (json) { | ||
// Prepare the data from the spreadsheat | ||
var cells = json.feed.entry, | ||
cell, | ||
cellCount = cells.length, | ||
colCount = 0, | ||
rowCount = 0, | ||
i; | ||
// First, find the total number of columns and rows that | ||
// are actually filled with data | ||
for (i = 0; i < cellCount; i++) { | ||
cell = cells[i]; | ||
colCount = Math.max(colCount, cell.gs$cell.col); | ||
rowCount = Math.max(rowCount, cell.gs$cell.row); | ||
} | ||
} | ||
// Loop over the cells and assign the value to the right | ||
// place in the column arrays | ||
for (i = 0; i < cellCount; i++) { | ||
cell = cells[i]; | ||
gr = cell.gs$cell.row - 1; // rows start at 1 | ||
gc = cell.gs$cell.col - 1; // columns start at 1 | ||
// Set up arrays containing the column data | ||
for (i = 0; i < colCount; i++) { | ||
if (i >= startColumn && i <= endColumn) { | ||
// Create new columns with the length of either end-start or rowCount | ||
columns[i - startColumn] = []; | ||
// If both row and col falls inside start and end | ||
// set the transposed cell value in the newly created columns | ||
if (gc >= startColumn && gc <= endColumn && | ||
gr >= startRow && gr <= endRow) { | ||
columns[gc - startColumn][gr - startRow] = cell.content.$t; | ||
// Setting the length to avoid jslint warning | ||
columns[i - startColumn].length = Math.min(rowCount, endRow - startRow); | ||
} | ||
} | ||
// Loop over the cells and assign the value to the right | ||
// place in the column arrays | ||
for (i = 0; i < cellCount; i++) { | ||
cell = cells[i]; | ||
gr = cell.gs$cell.row - 1; // rows start at 1 | ||
gc = cell.gs$cell.col - 1; // columns start at 1 | ||
// If both row and col falls inside start and end | ||
// set the transposed cell value in the newly created columns | ||
if (gc >= startColumn && gc <= endColumn && | ||
gr >= startRow && gr <= endRow) { | ||
columns[gc - startColumn][gr - startRow] = cell.content.$t; | ||
} | ||
} | ||
self.dataFound(); | ||
} | ||
self.dataFound(); | ||
}); | ||
} | ||
}, | ||
/** | ||
* Trim a string from whitespace | ||
*/ | ||
trim: function (str, inside) { | ||
if (typeof str === 'string') { | ||
str = str.replace(/^\s+|\s+$/g, ''); | ||
// Clear white space insdie the string, like thousands separators | ||
if (inside && /^[0-9\s]+$/.test(str)) { | ||
str = str.replace(/\s/g, ''); | ||
} | ||
}); | ||
} | ||
}, | ||
/** | ||
* Trim a string from whitespace | ||
*/ | ||
trim: function (str, inside) { | ||
if (typeof str === 'string') { | ||
str = str.replace(/^\s+|\s+$/g, ''); | ||
// Clear white space insdie the string, like thousands separators | ||
if (inside && /^[0-9\s]+$/.test(str)) { | ||
str = str.replace(/\s/g, ''); | ||
if (this.decimalRegex) { | ||
str = str.replace(this.decimalRegex, '$1.$2'); | ||
} | ||
} | ||
return str; | ||
}, | ||
/** | ||
* Parse numeric cells in to number types and date types in to true dates. | ||
*/ | ||
parseTypes: function () { | ||
var columns = this.columns, | ||
col = columns.length; | ||
if (this.decimalRegex) { | ||
str = str.replace(this.decimalRegex, '$1.$2'); | ||
while (col--) { | ||
this.parseColumn(columns[col], col); | ||
} | ||
} | ||
return str; | ||
}, | ||
/** | ||
* Parse numeric cells in to number types and date types in to true dates. | ||
*/ | ||
parseTypes: function () { | ||
var columns = this.columns, | ||
col = columns.length; | ||
while (col--) { | ||
this.parseColumn(columns[col], col); | ||
} | ||
}, | ||
}, | ||
/** | ||
* Parse a single column. Set properties like .isDatetime and .isNumeric. | ||
*/ | ||
parseColumn: function (column, col) { | ||
var rawColumns = this.rawColumns, | ||
columns = this.columns, | ||
row = column.length, | ||
val, | ||
floatVal, | ||
trimVal, | ||
trimInsideVal, | ||
firstRowAsNames = this.firstRowAsNames, | ||
isXColumn = inArray(col, this.valueCount.xColumns) !== -1, | ||
dateVal, | ||
backup = [], | ||
diff, | ||
chartOptions = this.chartOptions, | ||
descending, | ||
columnTypes = this.options.columnTypes || [], | ||
columnType = columnTypes[col], | ||
forceCategory = isXColumn && ((chartOptions && chartOptions.xAxis && splat(chartOptions.xAxis)[0].type === 'category') || columnType === 'string'); | ||
if (!rawColumns[col]) { | ||
rawColumns[col] = []; | ||
} | ||
while (row--) { | ||
val = backup[row] || column[row]; | ||
/** | ||
* Parse a single column. Set properties like .isDatetime and .isNumeric. | ||
*/ | ||
parseColumn: function (column, col) { | ||
var rawColumns = this.rawColumns, | ||
columns = this.columns, | ||
row = column.length, | ||
val, | ||
floatVal, | ||
trimVal, | ||
trimInsideVal, | ||
firstRowAsNames = this.firstRowAsNames, | ||
isXColumn = inArray(col, this.valueCount.xColumns) !== -1, | ||
dateVal, | ||
backup = [], | ||
diff, | ||
chartOptions = this.chartOptions, | ||
descending, | ||
columnTypes = this.options.columnTypes || [], | ||
columnType = columnTypes[col], | ||
forceCategory = isXColumn && ((chartOptions && chartOptions.xAxis && splat(chartOptions.xAxis)[0].type === 'category') || columnType === 'string'); | ||
trimVal = this.trim(val); | ||
trimInsideVal = this.trim(val, true); | ||
floatVal = parseFloat(trimInsideVal); | ||
// Set it the first time | ||
if (rawColumns[col][row] === undefined) { | ||
rawColumns[col][row] = trimVal; | ||
if (!rawColumns[col]) { | ||
rawColumns[col] = []; | ||
} | ||
// Disable number or date parsing by setting the X axis type to category | ||
if (forceCategory || (row === 0 && firstRowAsNames)) { | ||
column[row] = trimVal; | ||
} else if (+trimInsideVal === floatVal) { // is numeric | ||
column[row] = floatVal; | ||
while (row--) { | ||
val = backup[row] || column[row]; | ||
// If the number is greater than milliseconds in a year, assume datetime | ||
if (floatVal > 365 * 24 * 3600 * 1000 && columnType !== 'float') { | ||
column.isDatetime = true; | ||
} else { | ||
column.isNumeric = true; | ||
} | ||
trimVal = this.trim(val); | ||
trimInsideVal = this.trim(val, true); | ||
floatVal = parseFloat(trimInsideVal); | ||
if (column[row + 1] !== undefined) { | ||
descending = floatVal > column[row + 1]; | ||
// Set it the first time | ||
if (rawColumns[col][row] === undefined) { | ||
rawColumns[col][row] = trimVal; | ||
} | ||
// String, continue to determine if it is a date string or really a string | ||
} else { | ||
dateVal = this.parseDate(val); | ||
// Only allow parsing of dates if this column is an x-column | ||
if (isXColumn && typeof dateVal === 'number' && !isNaN(dateVal) && columnType !== 'float') { // is date | ||
backup[row] = val; | ||
column[row] = dateVal; | ||
column.isDatetime = true; | ||
// Disable number or date parsing by setting the X axis type to category | ||
if (forceCategory || (row === 0 && firstRowAsNames)) { | ||
column[row] = trimVal; | ||
// Check if the dates are uniformly descending or ascending. If they | ||
// are not, chances are that they are a different time format, so check | ||
// for alternative. | ||
} else if (+trimInsideVal === floatVal) { // is numeric | ||
column[row] = floatVal; | ||
// If the number is greater than milliseconds in a year, assume datetime | ||
if (floatVal > 365 * 24 * 3600 * 1000 && columnType !== 'float') { | ||
column.isDatetime = true; | ||
} else { | ||
column.isNumeric = true; | ||
} | ||
if (column[row + 1] !== undefined) { | ||
diff = dateVal > column[row + 1]; | ||
if (diff !== descending && descending !== undefined) { | ||
if (this.alternativeFormat) { | ||
this.dateFormat = this.alternativeFormat; | ||
row = column.length; | ||
this.alternativeFormat = this.dateFormats[this.dateFormat].alternative; | ||
} else { | ||
column.unsorted = true; | ||
descending = floatVal > column[row + 1]; | ||
} | ||
// String, continue to determine if it is a date string or really a string | ||
} else { | ||
dateVal = this.parseDate(val); | ||
// Only allow parsing of dates if this column is an x-column | ||
if (isXColumn && typeof dateVal === 'number' && !isNaN(dateVal) && columnType !== 'float') { // is date | ||
backup[row] = val; | ||
column[row] = dateVal; | ||
column.isDatetime = true; | ||
// Check if the dates are uniformly descending or ascending. If they | ||
// are not, chances are that they are a different time format, so check | ||
// for alternative. | ||
if (column[row + 1] !== undefined) { | ||
diff = dateVal > column[row + 1]; | ||
if (diff !== descending && descending !== undefined) { | ||
if (this.alternativeFormat) { | ||
this.dateFormat = this.alternativeFormat; | ||
row = column.length; | ||
this.alternativeFormat = this.dateFormats[this.dateFormat].alternative; | ||
} else { | ||
column.unsorted = true; | ||
} | ||
} | ||
descending = diff; | ||
} | ||
descending = diff; | ||
} else { // string | ||
column[row] = trimVal === '' ? null : trimVal; | ||
if (row !== 0 && (column.isDatetime || column.isNumeric)) { | ||
column.mixed = true; | ||
} | ||
} | ||
} else { // string | ||
column[row] = trimVal === '' ? null : trimVal; | ||
if (row !== 0 && (column.isDatetime || column.isNumeric)) { | ||
column.mixed = true; | ||
} | ||
} | ||
} | ||
} | ||
// If strings are intermixed with numbers or dates in a parsed column, it is an indication | ||
// that parsing went wrong or the data was not intended to display as numbers or dates and | ||
// parsing is too aggressive. Fall back to categories. Demonstrated in the | ||
// highcharts/demo/column-drilldown sample. | ||
if (isXColumn && column.mixed) { | ||
columns[col] = rawColumns[col]; | ||
} | ||
// If strings are intermixed with numbers or dates in a parsed column, it is an indication | ||
// that parsing went wrong or the data was not intended to display as numbers or dates and | ||
// parsing is too aggressive. Fall back to categories. Demonstrated in the | ||
// highcharts/demo/column-drilldown sample. | ||
if (isXColumn && column.mixed) { | ||
columns[col] = rawColumns[col]; | ||
} | ||
// If the 0 column is date or number and descending, reverse all columns. | ||
if (isXColumn && descending && this.options.sort) { | ||
for (col = 0; col < columns.length; col++) { | ||
columns[col].reverse(); | ||
if (firstRowAsNames) { | ||
columns[col].unshift(columns[col].pop()); | ||
// If the 0 column is date or number and descending, reverse all columns. | ||
if (isXColumn && descending && this.options.sort) { | ||
for (col = 0; col < columns.length; col++) { | ||
columns[col].reverse(); | ||
if (firstRowAsNames) { | ||
columns[col].unshift(columns[col].pop()); | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
/** | ||
* A collection of available date formats, extendable from the outside to support | ||
* custom date formats. | ||
*/ | ||
dateFormats: { | ||
'YYYY-mm-dd': { | ||
regex: /^([0-9]{4})[\-\/\.]([0-9]{2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[1], match[2] - 1, +match[3]); | ||
} | ||
}, | ||
'dd/mm/YYYY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3], match[2] - 1, +match[1]); | ||
/** | ||
* A collection of available date formats, extendable from the outside to support | ||
* custom date formats. | ||
*/ | ||
dateFormats: { | ||
'YYYY-mm-dd': { | ||
regex: /^([0-9]{4})[\-\/\.]([0-9]{2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[1], match[2] - 1, +match[3]); | ||
} | ||
}, | ||
alternative: 'mm/dd/YYYY' // different format with the same regex | ||
}, | ||
'mm/dd/YYYY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3], match[1] - 1, +match[2]); | ||
'dd/mm/YYYY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3], match[2] - 1, +match[1]); | ||
}, | ||
alternative: 'mm/dd/YYYY' // different format with the same regex | ||
}, | ||
'mm/dd/YYYY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{4})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3], match[1] - 1, +match[2]); | ||
} | ||
}, | ||
'dd/mm/YY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3] + 2000, match[2] - 1, +match[1]); | ||
}, | ||
alternative: 'mm/dd/YY' // different format with the same regex | ||
}, | ||
'mm/dd/YY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3] + 2000, match[1] - 1, +match[2]); | ||
} | ||
} | ||
}, | ||
'dd/mm/YY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3] + 2000, match[2] - 1, +match[1]); | ||
}, | ||
alternative: 'mm/dd/YY' // different format with the same regex | ||
}, | ||
'mm/dd/YY': { | ||
regex: /^([0-9]{1,2})[\-\/\.]([0-9]{1,2})[\-\/\.]([0-9]{2})$/, | ||
parser: function (match) { | ||
return Date.UTC(+match[3] + 2000, match[1] - 1, +match[2]); | ||
} | ||
} | ||
}, | ||
/** | ||
* Parse a date and return it as a number. Overridable through options.parseDate. | ||
*/ | ||
parseDate: function (val) { | ||
var parseDate = this.options.parseDate, | ||
ret, | ||
key, | ||
format, | ||
dateFormat = this.options.dateFormat || this.dateFormat, | ||
match; | ||
/** | ||
* Parse a date and return it as a number. Overridable through options.parseDate. | ||
*/ | ||
parseDate: function (val) { | ||
var parseDate = this.options.parseDate, | ||
ret, | ||
key, | ||
format, | ||
dateFormat = this.options.dateFormat || this.dateFormat, | ||
match; | ||
if (parseDate) { | ||
ret = parseDate(val); | ||
} else if (typeof val === 'string') { | ||
// Auto-detect the date format the first time | ||
if (!dateFormat) { | ||
for (key in this.dateFormats) { | ||
format = this.dateFormats[key]; | ||
if (parseDate) { | ||
ret = parseDate(val); | ||
} else if (typeof val === 'string') { | ||
// Auto-detect the date format the first time | ||
if (!dateFormat) { | ||
for (key in this.dateFormats) { | ||
format = this.dateFormats[key]; | ||
match = val.match(format.regex); | ||
if (match) { | ||
this.dateFormat = dateFormat = key; | ||
this.alternativeFormat = format.alternative; | ||
ret = format.parser(match); | ||
break; | ||
} | ||
} | ||
// Next time, use the one previously found | ||
} else { | ||
format = this.dateFormats[dateFormat]; | ||
match = val.match(format.regex); | ||
if (match) { | ||
this.dateFormat = dateFormat = key; | ||
this.alternativeFormat = format.alternative; | ||
ret = format.parser(match); | ||
break; | ||
} | ||
} | ||
// Next time, use the one previously found | ||
} else { | ||
format = this.dateFormats[dateFormat]; | ||
match = val.match(format.regex); | ||
if (match) { | ||
ret = format.parser(match); | ||
// Fall back to Date.parse | ||
if (!match) { | ||
match = Date.parse(val); | ||
// External tools like Date.js and MooTools extend Date object and | ||
// returns a date. | ||
if (typeof match === 'object' && match !== null && match.getTime) { | ||
ret = match.getTime() - match.getTimezoneOffset() * 60000; | ||
// Timestamp | ||
} else if (typeof match === 'number' && !isNaN(match)) { | ||
ret = match - (new Date(match)).getTimezoneOffset() * 60000; | ||
} | ||
} | ||
} | ||
// Fall back to Date.parse | ||
if (!match) { | ||
match = Date.parse(val); | ||
// External tools like Date.js and MooTools extend Date object and | ||
// returns a date. | ||
if (typeof match === 'object' && match !== null && match.getTime) { | ||
ret = match.getTime() - match.getTimezoneOffset() * 60000; | ||
// Timestamp | ||
} else if (typeof match === 'number' && !isNaN(match)) { | ||
ret = match - (new Date(match)).getTimezoneOffset() * 60000; | ||
} | ||
} | ||
} | ||
return ret; | ||
}, | ||
/** | ||
* Reorganize rows into columns | ||
*/ | ||
rowsToColumns: function (rows) { | ||
var row, | ||
rowsLength, | ||
col, | ||
colsLength, | ||
columns; | ||
return ret; | ||
}, | ||
/** | ||
* Reorganize rows into columns | ||
*/ | ||
rowsToColumns: function (rows) { | ||
var row, | ||
rowsLength, | ||
col, | ||
colsLength, | ||
columns; | ||
if (rows) { | ||
columns = []; | ||
rowsLength = rows.length; | ||
for (row = 0; row < rowsLength; row++) { | ||
colsLength = rows[row].length; | ||
for (col = 0; col < colsLength; col++) { | ||
if (!columns[col]) { | ||
columns[col] = []; | ||
if (rows) { | ||
columns = []; | ||
rowsLength = rows.length; | ||
for (row = 0; row < rowsLength; row++) { | ||
colsLength = rows[row].length; | ||
for (col = 0; col < colsLength; col++) { | ||
if (!columns[col]) { | ||
columns[col] = []; | ||
} | ||
columns[col][row] = rows[row][col]; | ||
} | ||
columns[col][row] = rows[row][col]; | ||
} | ||
} | ||
} | ||
return columns; | ||
}, | ||
/** | ||
* A hook for working directly on the parsed columns | ||
*/ | ||
parsed: function () { | ||
if (this.options.parsed) { | ||
return this.options.parsed.call(this, this.columns); | ||
} | ||
}, | ||
return columns; | ||
}, | ||
/** | ||
* A hook for working directly on the parsed columns | ||
*/ | ||
parsed: function () { | ||
if (this.options.parsed) { | ||
return this.options.parsed.call(this, this.columns); | ||
} | ||
}, | ||
getFreeIndexes: function (numberOfColumns, seriesBuilders) { | ||
var s, | ||
i, | ||
freeIndexes = [], | ||
freeIndexValues = [], | ||
referencedIndexes; | ||
getFreeIndexes: function (numberOfColumns, seriesBuilders) { | ||
var s, | ||
i, | ||
freeIndexes = [], | ||
freeIndexValues = [], | ||
referencedIndexes; | ||
// Add all columns as free | ||
for (i = 0; i < numberOfColumns; i = i + 1) { | ||
freeIndexes.push(true); | ||
} | ||
// Add all columns as free | ||
for (i = 0; i < numberOfColumns; i = i + 1) { | ||
freeIndexes.push(true); | ||
} | ||
// Loop all defined builders and remove their referenced columns | ||
for (s = 0; s < seriesBuilders.length; s = s + 1) { | ||
referencedIndexes = seriesBuilders[s].getReferencedColumnIndexes(); | ||
// Loop all defined builders and remove their referenced columns | ||
for (s = 0; s < seriesBuilders.length; s = s + 1) { | ||
referencedIndexes = seriesBuilders[s].getReferencedColumnIndexes(); | ||
for (i = 0; i < referencedIndexes.length; i = i + 1) { | ||
freeIndexes[referencedIndexes[i]] = false; | ||
for (i = 0; i < referencedIndexes.length; i = i + 1) { | ||
freeIndexes[referencedIndexes[i]] = false; | ||
} | ||
} | ||
} | ||
// Collect the values for the free indexes | ||
for (i = 0; i < freeIndexes.length; i = i + 1) { | ||
if (freeIndexes[i]) { | ||
freeIndexValues.push(i); | ||
// Collect the values for the free indexes | ||
for (i = 0; i < freeIndexes.length; i = i + 1) { | ||
if (freeIndexes[i]) { | ||
freeIndexValues.push(i); | ||
} | ||
} | ||
} | ||
return freeIndexValues; | ||
}, | ||
/** | ||
* If a complete callback function is provided in the options, interpret the | ||
* columns into a Highcharts options object. | ||
*/ | ||
complete: function () { | ||
return freeIndexValues; | ||
}, | ||
var columns = this.columns, | ||
xColumns = [], | ||
type, | ||
options = this.options, | ||
series, | ||
data, | ||
i, | ||
j, | ||
r, | ||
seriesIndex, | ||
chartOptions, | ||
allSeriesBuilders = [], | ||
builder, | ||
freeIndexes, | ||
typeCol, | ||
index; | ||
/** | ||
* If a complete callback function is provided in the options, interpret the | ||
* columns into a Highcharts options object. | ||
*/ | ||
complete: function () { | ||
var columns = this.columns, | ||
xColumns = [], | ||
type, | ||
options = this.options, | ||
series, | ||
data, | ||
i, | ||
j, | ||
r, | ||
seriesIndex, | ||
chartOptions, | ||
allSeriesBuilders = [], | ||
builder, | ||
freeIndexes, | ||
typeCol, | ||
index; | ||
xColumns.length = columns.length; | ||
if (options.complete || options.afterComplete) { | ||
xColumns.length = columns.length; | ||
if (options.complete || options.afterComplete) { | ||
// Get the names and shift the top row | ||
for (i = 0; i < columns.length; i++) { | ||
if (this.firstRowAsNames) { | ||
columns[i].name = columns[i].shift(); | ||
// Get the names and shift the top row | ||
for (i = 0; i < columns.length; i++) { | ||
if (this.firstRowAsNames) { | ||
columns[i].name = columns[i].shift(); | ||
} | ||
} | ||
} | ||
// Use the next columns for series | ||
series = []; | ||
freeIndexes = this.getFreeIndexes(columns.length, this.valueCount.seriesBuilders); | ||
// Use the next columns for series | ||
series = []; | ||
freeIndexes = this.getFreeIndexes(columns.length, this.valueCount.seriesBuilders); | ||
// Populate defined series | ||
for (seriesIndex = 0; seriesIndex < this.valueCount.seriesBuilders.length; seriesIndex++) { | ||
builder = this.valueCount.seriesBuilders[seriesIndex]; | ||
// Populate defined series | ||
for (seriesIndex = 0; seriesIndex < this.valueCount.seriesBuilders.length; seriesIndex++) { | ||
builder = this.valueCount.seriesBuilders[seriesIndex]; | ||
// If the builder can be populated with remaining columns, then add it to allBuilders | ||
if (builder.populateColumns(freeIndexes)) { | ||
allSeriesBuilders.push(builder); | ||
// If the builder can be populated with remaining columns, then add it to allBuilders | ||
if (builder.populateColumns(freeIndexes)) { | ||
allSeriesBuilders.push(builder); | ||
} | ||
} | ||
} | ||
// Populate dynamic series | ||
while (freeIndexes.length > 0) { | ||
builder = new SeriesBuilder(); | ||
builder.addColumnReader(0, 'x'); | ||
// Mark index as used (not free) | ||
index = inArray(0, freeIndexes); | ||
if (index !== -1) { | ||
freeIndexes.splice(index, 1); | ||
} | ||
// Populate dynamic series | ||
while (freeIndexes.length > 0) { | ||
builder = new SeriesBuilder(); | ||
builder.addColumnReader(0, 'x'); | ||
// Mark index as used (not free) | ||
index = inArray(0, freeIndexes); | ||
if (index !== -1) { | ||
freeIndexes.splice(index, 1); | ||
} | ||
for (i = 0; i < this.valueCount.global; i++) { | ||
// Create and add a column reader for the next free column index | ||
builder.addColumnReader(undefined, this.valueCount.globalPointArrayMap[i]); | ||
} | ||
for (i = 0; i < this.valueCount.global; i++) { | ||
// Create and add a column reader for the next free column index | ||
builder.addColumnReader(undefined, this.valueCount.globalPointArrayMap[i]); | ||
} | ||
// If the builder can be populated with remaining columns, then add it to allBuilders | ||
if (builder.populateColumns(freeIndexes)) { | ||
allSeriesBuilders.push(builder); | ||
// If the builder can be populated with remaining columns, then add it to allBuilders | ||
if (builder.populateColumns(freeIndexes)) { | ||
allSeriesBuilders.push(builder); | ||
} | ||
} | ||
} | ||
// Get the data-type from the first series x column | ||
if (allSeriesBuilders.length > 0 && allSeriesBuilders[0].readers.length > 0) { | ||
typeCol = columns[allSeriesBuilders[0].readers[0].columnIndex]; | ||
if (typeCol !== undefined) { | ||
if (typeCol.isDatetime) { | ||
type = 'datetime'; | ||
} else if (!typeCol.isNumeric) { | ||
type = 'category'; | ||
// Get the data-type from the first series x column | ||
if (allSeriesBuilders.length > 0 && allSeriesBuilders[0].readers.length > 0) { | ||
typeCol = columns[allSeriesBuilders[0].readers[0].columnIndex]; | ||
if (typeCol !== undefined) { | ||
if (typeCol.isDatetime) { | ||
type = 'datetime'; | ||
} else if (!typeCol.isNumeric) { | ||
type = 'category'; | ||
} | ||
} | ||
} | ||
} | ||
// Axis type is category, then the "x" column should be called "name" | ||
if (type === 'category') { | ||
for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) { | ||
builder = allSeriesBuilders[seriesIndex]; | ||
for (r = 0; r < builder.readers.length; r++) { | ||
if (builder.readers[r].configName === 'x') { | ||
builder.readers[r].configName = 'name'; | ||
// Axis type is category, then the "x" column should be called "name" | ||
if (type === 'category') { | ||
for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) { | ||
builder = allSeriesBuilders[seriesIndex]; | ||
for (r = 0; r < builder.readers.length; r++) { | ||
if (builder.readers[r].configName === 'x') { | ||
builder.readers[r].configName = 'name'; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
// Read data for all builders | ||
for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) { | ||
builder = allSeriesBuilders[seriesIndex]; | ||
// Read data for all builders | ||
for (seriesIndex = 0; seriesIndex < allSeriesBuilders.length; seriesIndex++) { | ||
builder = allSeriesBuilders[seriesIndex]; | ||
// Iterate down the cells of each column and add data to the series | ||
data = []; | ||
for (j = 0; j < columns[0].length; j++) { // TODO: which column's length should we use here | ||
data[j] = builder.read(columns, j); | ||
} | ||
// Iterate down the cells of each column and add data to the series | ||
data = []; | ||
for (j = 0; j < columns[0].length; j++) { | ||
data[j] = builder.read(columns, j); | ||
} | ||
// Add the series | ||
series[seriesIndex] = { | ||
data: data | ||
}; | ||
if (builder.name) { | ||
series[seriesIndex].name = builder.name; | ||
// Add the series | ||
series[seriesIndex] = { | ||
data: data | ||
}; | ||
if (builder.name) { | ||
series[seriesIndex].name = builder.name; | ||
} | ||
if (type === 'category') { | ||
series[seriesIndex].turboThreshold = 0; | ||
} | ||
} | ||
if (type === 'category') { | ||
series[seriesIndex].turboThreshold = 0; | ||
} | ||
} | ||
// Do the callback | ||
chartOptions = { | ||
series: series | ||
}; | ||
if (type) { | ||
chartOptions.xAxis = { | ||
type: type | ||
// Do the callback | ||
chartOptions = { | ||
series: series | ||
}; | ||
} | ||
if (options.complete) { | ||
options.complete(chartOptions); | ||
} | ||
if (type) { | ||
chartOptions.xAxis = { | ||
type: type | ||
}; | ||
} | ||
if (options.complete) { | ||
options.complete(chartOptions); | ||
} | ||
// The afterComplete hook is used internally to avoid conflict with the externally | ||
// available complete option. | ||
if (options.afterComplete) { | ||
options.afterComplete(chartOptions); | ||
// The afterComplete hook is used internally to avoid conflict with the externally | ||
// available complete option. | ||
if (options.afterComplete) { | ||
options.afterComplete(chartOptions); | ||
} | ||
} | ||
} | ||
} | ||
}); | ||
@@ -956,2 +960,2 @@ | ||
}(Highcharts)); | ||
})); |
@@ -1,17 +0,17 @@ | ||
(function(f){function A(b,a,c){var d;!a.rgba.length||!b.rgba.length?b=a.raw||"none":(b=b.rgba,a=a.rgba,d=a[3]!==1||b[3]!==1,b=(d?"rgba(":"rgb(")+Math.round(a[0]+(b[0]-a[0])*(1-c))+","+Math.round(a[1]+(b[1]-a[1])*(1-c))+","+Math.round(a[2]+(b[2]-a[2])*(1-c))+(d?","+(a[3]+(b[3]-a[3])*(1-c)):"")+")");return b}var t=function(){},q=f.getOptions(),h=f.each,l=f.extend,B=f.format,u=f.pick,r=f.wrap,m=f.Chart,p=f.seriesTypes,v=p.pie,n=p.column,w=f.Tick,x=HighchartsAdapter.fireEvent,y=HighchartsAdapter.inArray, | ||
z=1;h(["fill","stroke"],function(b){HighchartsAdapter.addAnimSetter(b,function(a){a.elem.attr(b,A(f.Color(a.start),f.Color(a.end),a.pos))})});l(q.lang,{drillUpText:"\u25c1 Back to {series.name}"});q.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right",x:-10,y:10}}};f.SVGRenderer.prototype.Element.prototype.fadeIn= | ||
function(b){this.attr({opacity:0.1,visibility:"inherit"}).animate({opacity:u(this.newOpacity,1)},b||{duration:250})};m.prototype.addSeriesAsDrilldown=function(b,a){this.addSingleSeriesAsDrilldown(b,a);this.applyDrilldown()};m.prototype.addSingleSeriesAsDrilldown=function(b,a){var c=b.series,d=c.xAxis,g=c.yAxis,e;e=b.color||c.color;var i,f=[],j=[],k,o;if(!this.drilldownLevels)this.drilldownLevels=[];k=c.options._levelNumber||0;(o=this.drilldownLevels[this.drilldownLevels.length-1])&&o.levelNumber!== | ||
k&&(o=void 0);a=l({color:e,_ddSeriesId:z++},a);i=y(b,c.points);h(c.chart.series,function(a){if(a.xAxis===d&&!a.isDrilling)a.options._ddSeriesId=a.options._ddSeriesId||z++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||k,o?(f=o.levelSeries,j=o.levelSeriesOptions):(f.push(a),j.push(a.options))});e={levelNumber:k,seriesOptions:c.options,levelSeriesOptions:j,levelSeries:f,shapeArgs:b.shapeArgs,bBox:b.graphic?b.graphic.getBBox():{},color:e,lowerSeriesOptions:a, | ||
pointOptions:c.options.data[i],pointIndex:i,oldExtremes:{xMin:d&&d.userMin,xMax:d&&d.userMax,yMin:g&&g.userMin,yMax:g&&g.userMax}};this.drilldownLevels.push(e);e=e.lowerSeries=this.addSeries(a,!1);e.options._levelNumber=k+1;if(d)d.oldPos=d.pos,d.userMin=d.userMax=null,g.userMin=g.userMax=null;if(c.type===e.type)e.animate=e.animateDrilldown||t,e.options.animation=!0};m.prototype.applyDrilldown=function(){var b=this.drilldownLevels,a;if(b&&b.length>0)a=b[b.length-1].levelNumber,h(this.drilldownLevels, | ||
function(b){b.levelNumber===a&&h(b.levelSeries,function(b){b.options&&b.options._levelNumber===a&&b.remove(!1)})});this.redraw();this.showDrillUpButton()};m.prototype.getDrilldownBackText=function(){var b=this.drilldownLevels;if(b&&b.length>0)return b=b[b.length-1],b.series=b.seriesOptions,B(this.options.lang.drillUpText,b)};m.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton,d,g;this.drillUpButton?this.drillUpButton.attr({text:a}).align(): | ||
(g=(d=c.theme)&&d.states,this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()},d,g&&g.hover,g&&g.select).attr({align:c.position.align,zIndex:9}).add().align(c.position,!1,c.relativeTo||"plotBox"))};m.prototype.drillUp=function(){for(var b=this,a=b.drilldownLevels,c=a[a.length-1].levelNumber,d=a.length,g=b.series,e,i,f,j,k=function(a){var c;h(g,function(b){b.options._ddSeriesId===a._ddSeriesId&&(c=b)});c=c||b.addSeries(a,!1);if(c.type===f.type&&c.animateDrillupTo)c.animate=c.animateDrillupTo; | ||
a===i.seriesOptions&&(j=c)};d--;)if(i=a[d],i.levelNumber===c){a.pop();f=i.lowerSeries;if(!f.chart)for(e=g.length;e--;)if(g[e].options.id===i.lowerSeriesOptions.id&&g[e].options._levelNumber===c+1){f=g[e];break}f.xData=[];h(i.levelSeriesOptions,k);x(b,"drillup",{seriesOptions:i.seriesOptions});if(j.type===f.type)j.drilldownLevel=i,j.options.animation=b.options.drilldown.animation,f.animateDrillupFrom&&f.chart&&f.animateDrillupFrom(i);j.options._levelNumber=c;f.remove(!1);if(j.xAxis)e=i.oldExtremes, | ||
j.xAxis.setExtremes(e.xMin,e.xMax,!1),j.yAxis.setExtremes(e.yMin,e.yMax,!1)}this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();this.ddDupes.length=[]};n.prototype.supportsDrilldown=!0;n.prototype.animateDrillupTo=function(b){if(!b){var a=this,c=a.drilldownLevel;h(this.points,function(a){a.graphic&&a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){a.points&& | ||
h(a.points,function(a,b){var e=b===(c&&c.pointIndex)?"show":"fadeIn",f=e==="show"?!0:void 0;if(a.graphic)a.graphic[e](f);if(a.dataLabel)a.dataLabel[e](f);if(a.connector)a.connector[e](f)})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=t}};n.prototype.animateDrilldown=function(b){var a=this,c=this.chart.drilldownLevels,d,g=this.chart.options.drilldown.animation,e=this.xAxis;if(!b)h(c,function(b){if(a.options._ddSeriesId===b.lowerSeriesOptions._ddSeriesId)d=b.shapeArgs, | ||
d.fill=b.color}),d.x+=u(e.oldPos,e.pos)-e.pos,h(this.points,function(a){a.graphic&&a.graphic.attr(d).animate(l(a.shapeArgs,{fill:a.color}),g);a.dataLabel&&a.dataLabel.fadeIn(g)}),this.animate=null};n.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group,d=this;h(d.trackerGroups,function(a){if(d[a])d[a].on("mouseover")});delete this.group;h(this.points,function(d){var e=d.graphic,i=function(){e.destroy();c&&(c=c.destroy())};e&&(delete d.graphic,a?e.animate(l(b.shapeArgs, | ||
{fill:b.color}),f.merge(a,{complete:i})):(e.attr(b.shapeArgs),i()))})};v&&l(v.prototype,{supportsDrilldown:!0,animateDrillupTo:n.prototype.animateDrillupTo,animateDrillupFrom:n.prototype.animateDrillupFrom,animateDrilldown:function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,d=a.shapeArgs,g=d.start,e=(d.end-g)/this.points.length;if(!b)h(this.points,function(b,h){b.graphic.attr(f.merge(d,{start:g+h*e,end:g+(h+1)*e,fill:a.color}))[c? | ||
"animate":"attr"](l(b.shapeArgs,{fill:b.color}),c)}),this.animate=null}});f.Point.prototype.doDrilldown=function(b,a){var c=this.series.chart,d=c.options.drilldown,f=(d.series||[]).length,e;if(!c.ddDupes)c.ddDupes=[];for(;f--&&!e;)d.series[f].id===this.drilldown&&y(this.drilldown,c.ddDupes)===-1&&(e=d.series[f],c.ddDupes.push(this.drilldown));x(c,"drilldown",{point:this,seriesOptions:e,category:a,points:a!==void 0&&this.series.xAxis.ddPoints[a].slice(0)});e&&(b?c.addSingleSeriesAsDrilldown(this,e): | ||
c.addSeriesAsDrilldown(this,e))};f.Axis.prototype.drilldownCategory=function(b){var a,c,d=this.ddPoints[b];for(a in d)(c=d[a])&&c.series&&c.series.visible&&c.doDrilldown&&c.doDrilldown(!0,b);this.chart.applyDrilldown()};f.Axis.prototype.getDDPoints=function(b,a){var c=this.ddPoints;if(!c)this.ddPoints=c={};c[b]||(c[b]=[]);if(c[b].levelNumber!==a)c[b].length=0;return c[b]};w.prototype.drillable=function(){var b=this.pos,a=this.label,c=this.axis,d=c.ddPoints&&c.ddPoints[b];if(a&&d&&d.length){if(!a.basicStyles)a.basicStyles= | ||
f.merge(a.styles);a.addClass("highcharts-drilldown-axis-label").css(c.chart.options.drilldown.activeAxisLabelStyle).on("click",function(){c.drilldownCategory(b)})}else if(a&&a.basicStyles)a.styles={},a.css(a.basicStyles),a.on("click",null)};r(w.prototype,"addLabel",function(b){b.call(this);this.drillable()});r(f.Point.prototype,"init",function(b,a,c,d){var g=b.call(this,a,c,d),b=(c=a.xAxis)&&c.ticks[d],c=c&&c.getDDPoints(d,a.options._levelNumber);if(g.drilldown&&(f.addEvent(g,"click",function(){a.xAxis&& | ||
a.chart.options.drilldown.allowPointDrilldown===!1?a.xAxis.drilldownCategory(d):g.doDrilldown()}),c))c.push(g),c.levelNumber=a.options._levelNumber;b&&b.drillable();return g});r(f.Series.prototype,"drawDataLabels",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);h(this.points,function(b){b.drilldown&&b.dataLabel&&b.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(a)})});var s,q=function(b){b.call(this);h(this.points,function(a){a.drilldown&&a.graphic&& | ||
a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(s in p)p[s].prototype.supportsDrilldown&&r(p[s].prototype,"drawTracker",q)})(Highcharts); | ||
(function(d){typeof module==="object"&&module.exports?module.exports=d:d(Highcharts)})(function(d){function A(b,a,c){var e;!a.rgba.length||!b.rgba.length?b=a.input||"none":(b=b.rgba,a=a.rgba,e=a[3]!==1||b[3]!==1,b=(e?"rgba(":"rgb(")+Math.round(a[0]+(b[0]-a[0])*(1-c))+","+Math.round(a[1]+(b[1]-a[1])*(1-c))+","+Math.round(a[2]+(b[2]-a[2])*(1-c))+(e?","+(a[3]+(b[3]-a[3])*(1-c)):"")+")");return b}var t=function(){},q=d.getOptions(),h=d.each,l=d.extend,B=d.format,u=d.pick,r=d.wrap,m=d.Chart,p=d.seriesTypes, | ||
v=p.pie,n=p.column,w=d.Tick,x=d.fireEvent,y=d.inArray,z=1;h(["fill","stroke"],function(b){d.addAnimSetter(b,function(a){a.elem.attr(b,A(d.Color(a.start),d.Color(a.end),a.pos))})});l(q.lang,{drillUpText:"\u25c1 Back to {series.name}"});q.drilldown={activeAxisLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},activeDataLabelStyle:{cursor:"pointer",color:"#0d233a",fontWeight:"bold",textDecoration:"underline"},animation:{duration:500},drillUpButton:{position:{align:"right", | ||
x:-10,y:10}}};d.SVGRenderer.prototype.Element.prototype.fadeIn=function(b){this.attr({opacity:0.1,visibility:"inherit"}).animate({opacity:u(this.newOpacity,1)},b||{duration:250})};m.prototype.addSeriesAsDrilldown=function(b,a){this.addSingleSeriesAsDrilldown(b,a);this.applyDrilldown()};m.prototype.addSingleSeriesAsDrilldown=function(b,a){var c=b.series,e=c.xAxis,g=c.yAxis,f;f=b.color||c.color;var i,d=[],j=[],k,o;if(!this.drilldownLevels)this.drilldownLevels=[];k=c.options._levelNumber||0;(o=this.drilldownLevels[this.drilldownLevels.length- | ||
1])&&o.levelNumber!==k&&(o=void 0);a=l({color:f,_ddSeriesId:z++},a);i=y(b,c.points);h(c.chart.series,function(a){if(a.xAxis===e&&!a.isDrilling)a.options._ddSeriesId=a.options._ddSeriesId||z++,a.options._colorIndex=a.userOptions._colorIndex,a.options._levelNumber=a.options._levelNumber||k,o?(d=o.levelSeries,j=o.levelSeriesOptions):(d.push(a),j.push(a.options))});f={levelNumber:k,seriesOptions:c.options,levelSeriesOptions:j,levelSeries:d,shapeArgs:b.shapeArgs,bBox:b.graphic?b.graphic.getBBox():{},color:f, | ||
lowerSeriesOptions:a,pointOptions:c.options.data[i],pointIndex:i,oldExtremes:{xMin:e&&e.userMin,xMax:e&&e.userMax,yMin:g&&g.userMin,yMax:g&&g.userMax}};this.drilldownLevels.push(f);f=f.lowerSeries=this.addSeries(a,!1);f.options._levelNumber=k+1;if(e)e.oldPos=e.pos,e.userMin=e.userMax=null,g.userMin=g.userMax=null;if(c.type===f.type)f.animate=f.animateDrilldown||t,f.options.animation=!0};m.prototype.applyDrilldown=function(){var b=this.drilldownLevels,a;if(b&&b.length>0)a=b[b.length-1].levelNumber, | ||
h(this.drilldownLevels,function(b){b.levelNumber===a&&h(b.levelSeries,function(b){b.options&&b.options._levelNumber===a&&b.remove(!1)})});this.redraw();this.showDrillUpButton()};m.prototype.getDrilldownBackText=function(){var b=this.drilldownLevels;if(b&&b.length>0)return b=b[b.length-1],b.series=b.seriesOptions,B(this.options.lang.drillUpText,b)};m.prototype.showDrillUpButton=function(){var b=this,a=this.getDrilldownBackText(),c=b.options.drilldown.drillUpButton,e,g;this.drillUpButton?this.drillUpButton.attr({text:a}).align(): | ||
(g=(e=c.theme)&&e.states,this.drillUpButton=this.renderer.button(a,null,null,function(){b.drillUp()},e,g&&g.hover,g&&g.select).attr({align:c.position.align,zIndex:9}).add().align(c.position,!1,c.relativeTo||"plotBox"))};m.prototype.drillUp=function(){for(var b=this,a=b.drilldownLevels,c=a[a.length-1].levelNumber,e=a.length,g=b.series,f,i,d,j,k=function(a){var c;h(g,function(b){b.options._ddSeriesId===a._ddSeriesId&&(c=b)});c=c||b.addSeries(a,!1);if(c.type===d.type&&c.animateDrillupTo)c.animate=c.animateDrillupTo; | ||
a===i.seriesOptions&&(j=c)};e--;)if(i=a[e],i.levelNumber===c){a.pop();d=i.lowerSeries;if(!d.chart)for(f=g.length;f--;)if(g[f].options.id===i.lowerSeriesOptions.id&&g[f].options._levelNumber===c+1){d=g[f];break}d.xData=[];h(i.levelSeriesOptions,k);x(b,"drillup",{seriesOptions:i.seriesOptions});if(j.type===d.type)j.drilldownLevel=i,j.options.animation=b.options.drilldown.animation,d.animateDrillupFrom&&d.chart&&d.animateDrillupFrom(i);j.options._levelNumber=c;d.remove(!1);if(j.xAxis)f=i.oldExtremes, | ||
j.xAxis.setExtremes(f.xMin,f.xMax,!1),j.yAxis.setExtremes(f.yMin,f.yMax,!1)}this.redraw();this.drilldownLevels.length===0?this.drillUpButton=this.drillUpButton.destroy():this.drillUpButton.attr({text:this.getDrilldownBackText()}).align();this.ddDupes.length=[]};n.prototype.supportsDrilldown=!0;n.prototype.animateDrillupTo=function(b){if(!b){var a=this,c=a.drilldownLevel;h(this.points,function(a){a.graphic&&a.graphic.hide();a.dataLabel&&a.dataLabel.hide();a.connector&&a.connector.hide()});setTimeout(function(){a.points&& | ||
h(a.points,function(a,b){var f=b===(c&&c.pointIndex)?"show":"fadeIn",d=f==="show"?!0:void 0;if(a.graphic)a.graphic[f](d);if(a.dataLabel)a.dataLabel[f](d);if(a.connector)a.connector[f](d)})},Math.max(this.chart.options.drilldown.animation.duration-50,0));this.animate=t}};n.prototype.animateDrilldown=function(b){var a=this,c=this.chart.drilldownLevels,e,d=this.chart.options.drilldown.animation,f=this.xAxis;if(!b)h(c,function(b){if(a.options._ddSeriesId===b.lowerSeriesOptions._ddSeriesId)e=b.shapeArgs, | ||
e.fill=b.color}),e.x+=u(f.oldPos,f.pos)-f.pos,h(this.points,function(a){a.graphic&&a.graphic.attr(e).animate(l(a.shapeArgs,{fill:a.color}),d);a.dataLabel&&a.dataLabel.fadeIn(d)}),this.animate=null};n.prototype.animateDrillupFrom=function(b){var a=this.chart.options.drilldown.animation,c=this.group,e=this;h(e.trackerGroups,function(a){if(e[a])e[a].on("mouseover")});delete this.group;h(this.points,function(e){var f=e.graphic,i=function(){f.destroy();c&&(c=c.destroy())};f&&(delete e.graphic,a?f.animate(l(b.shapeArgs, | ||
{fill:b.color}),d.merge(a,{complete:i})):(f.attr(b.shapeArgs),i()))})};v&&l(v.prototype,{supportsDrilldown:!0,animateDrillupTo:n.prototype.animateDrillupTo,animateDrillupFrom:n.prototype.animateDrillupFrom,animateDrilldown:function(b){var a=this.chart.drilldownLevels[this.chart.drilldownLevels.length-1],c=this.chart.options.drilldown.animation,e=a.shapeArgs,g=e.start,f=(e.end-g)/this.points.length;if(!b)h(this.points,function(b,h){b.graphic.attr(d.merge(e,{start:g+h*f,end:g+(h+1)*f,fill:a.color}))[c? | ||
"animate":"attr"](l(b.shapeArgs,{fill:b.color}),c)}),this.animate=null}});d.Point.prototype.doDrilldown=function(b,a){var c=this.series.chart,e=c.options.drilldown,d=(e.series||[]).length,f;if(!c.ddDupes)c.ddDupes=[];for(;d--&&!f;)e.series[d].id===this.drilldown&&y(this.drilldown,c.ddDupes)===-1&&(f=e.series[d],c.ddDupes.push(this.drilldown));x(c,"drilldown",{point:this,seriesOptions:f,category:a,points:a!==void 0&&this.series.xAxis.ddPoints[a].slice(0)});f&&(b?c.addSingleSeriesAsDrilldown(this,f): | ||
c.addSeriesAsDrilldown(this,f))};d.Axis.prototype.drilldownCategory=function(b){var a,c,d=this.ddPoints[b];for(a in d)(c=d[a])&&c.series&&c.series.visible&&c.doDrilldown&&c.doDrilldown(!0,b);this.chart.applyDrilldown()};d.Axis.prototype.getDDPoints=function(b,a){var c=this.ddPoints;if(!c)this.ddPoints=c={};c[b]||(c[b]=[]);if(c[b].levelNumber!==a)c[b].length=0;return c[b]};w.prototype.drillable=function(){var b=this.pos,a=this.label,c=this.axis,e=c.ddPoints&&c.ddPoints[b];if(a&&e&&e.length){if(!a.basicStyles)a.basicStyles= | ||
d.merge(a.styles);a.addClass("highcharts-drilldown-axis-label").css(c.chart.options.drilldown.activeAxisLabelStyle).on("click",function(){c.drilldownCategory(b)})}else if(a&&a.basicStyles)a.styles={},a.css(a.basicStyles),a.on("click",null)};r(w.prototype,"addLabel",function(b){b.call(this);this.drillable()});r(d.Point.prototype,"init",function(b,a,c,e){var g=b.call(this,a,c,e),b=(c=a.xAxis)&&c.ticks[e],c=c&&c.getDDPoints(e,a.options._levelNumber);if(g.drilldown&&(d.addEvent(g,"click",function(){a.xAxis&& | ||
a.chart.options.drilldown.allowPointDrilldown===!1?a.xAxis.drilldownCategory(e):g.doDrilldown()}),c))c.push(g),c.levelNumber=a.options._levelNumber;b&&b.drillable();return g});r(d.Series.prototype,"drawDataLabels",function(b){var a=this.chart.options.drilldown.activeDataLabelStyle;b.call(this);h(this.points,function(b){b.drilldown&&b.dataLabel&&b.dataLabel.attr({"class":"highcharts-drilldown-data-label"}).css(a)})});var s,q=function(b){b.call(this);h(this.points,function(a){a.drilldown&&a.graphic&& | ||
a.graphic.attr({"class":"highcharts-drilldown-point"}).css({cursor:"pointer"})})};for(s in p)p[s].prototype.supportsDrilldown&&r(p[s].prototype,"drawTracker",q)}); |
/** | ||
* Highcharts Drilldown plugin | ||
* Highcharts Drilldown module | ||
* | ||
* Author: Torstein Honsi | ||
* License: MIT License | ||
* License: www.highcharts.com/license | ||
* | ||
* Demo: http://jsfiddle.net/highcharts/Vf3yT/ | ||
*/ | ||
/*global Highcharts,HighchartsAdapter*/ | ||
(function (H) { | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (H) { | ||
"use strict"; | ||
'use strict'; | ||
@@ -27,4 +31,4 @@ var noop = function () {}, | ||
Tick = H.Tick, | ||
fireEvent = HighchartsAdapter.fireEvent, | ||
inArray = HighchartsAdapter.inArray, | ||
fireEvent = H.fireEvent, | ||
inArray = H.inArray, | ||
ddSeriesId = 1; | ||
@@ -46,3 +50,3 @@ | ||
if (!to.rgba.length || !from.rgba.length) { | ||
ret = to.raw || 'none'; | ||
ret = to.input || 'none'; | ||
@@ -66,3 +70,3 @@ // Interpolate | ||
each(['fill', 'stroke'], function (prop) { | ||
HighchartsAdapter.addAnimSetter(prop, function (fx) { | ||
H.addAnimSetter(prop, function (fx) { | ||
fx.elem.attr(prop, tweenColors(H.Color(fx.start), H.Color(fx.end), fx.pos)); | ||
@@ -716,2 +720,2 @@ }); | ||
}(Highcharts)); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
Exporting module | ||
@@ -9,17 +9,17 @@ | ||
*/ | ||
(function(g){var z=g.Chart,s=g.addEvent,A=g.removeEvent,B=HighchartsAdapter.fireEvent,j=g.createElement,p=g.discardElement,u=g.css,l=g.merge,m=g.each,q=g.extend,E=g.splat,F=Math.max,k=document,C=window,G=g.isTouchDevice,H=g.Renderer.prototype.symbols,r=g.getOptions(),x;q(r.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",contextButtonTitle:"Chart context menu"});r.navigation= | ||
{menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:G?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}};r.exporting={type:"image/png",url:"http://export.highcharts.com/", | ||
buttons:{contextButton:{menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG",onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}}; | ||
g.post=function(b,a,e){var c,b=j("form",l({method:"post",action:b,enctype:"multipart/form-data"},e),{display:"none"},k.body);for(c in a)j("input",{type:"hidden",name:c,value:a[c]},null,b);b.submit();p(b)};q(z.prototype,{sanitizeSVG:function(b){return b.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g, | ||
(function(f){typeof module==="object"&&module.exports?module.exports=f:f(Highcharts)})(function(f){var z=f.Chart,t=f.addEvent,A=f.removeEvent,B=f.fireEvent,n=f.createElement,r=f.discardElement,v=f.css,l=f.merge,i=f.each,q=f.extend,E=f.splat,F=Math.max,m=document,C=window,G=f.isTouchDevice,H=f.Renderer.prototype.symbols,s=f.getOptions(),y;q(s.lang,{printChart:"Print chart",downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image", | ||
contextButtonTitle:"Chart context menu"});s.navigation={menuStyle:{border:"1px solid #A0A0A0",background:"#FFFFFF",padding:"5px 0"},menuItemStyle:{padding:"0 10px",background:"none",color:"#303030",fontSize:G?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{symbolFill:"#E0E0E0",symbolSize:14,symbolStroke:"#666",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:"right",buttonSpacing:3,height:22,theme:{fill:"white",stroke:"none"},verticalAlign:"top",width:24}}; | ||
s.exporting={type:"image/png",url:"http://export.highcharts.com/",buttons:{contextButton:{menuClassName:"highcharts-contextmenu",symbol:"menu",_titleKey:"contextButtonTitle",menuItems:[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChart()}},{textKey:"downloadJPEG",onclick:function(){this.exportChart({type:"image/jpeg"})}},{textKey:"downloadPDF",onclick:function(){this.exportChart({type:"application/pdf"})}},{textKey:"downloadSVG", | ||
onclick:function(){this.exportChart({type:"image/svg+xml"})}}]}}};f.post=function(a,b,e){var c,a=n("form",l({method:"post",action:a,enctype:"multipart/form-data"},e),{display:"none"},m.body);for(c in b)n("input",{type:"hidden",name:c,value:b[c]},null,a);a.submit();r(a)};q(z.prototype,{sanitizeSVG:function(a){return a.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g,"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/<svg /,'<svg xmlns:xlink="http://www.w3.org/1999/xlink" ').replace(/ (NS[0-9]+\:)?href=/g, | ||
" xlink:href=").replace(/\n/," ").replace(/<\/svg>.*?$/,"</svg>").replace(/(fill|stroke)="rgba\(([ 0-9]+,[ 0-9]+,[ 0-9]+),([ 0-9\.]+)\)"/g,'$1="rgb($2)" $1-opacity="$3"').replace(/ /g,"\u00a0").replace(/­/g,"\u00ad").replace(/<IMG /g,"<image ").replace(/<(\/?)TITLE>/g,"<$1title>").replace(/height=([^" ]+)/g,'height="$1"').replace(/width=([^" ]+)/g,'width="$1"').replace(/hc-svg-href="([^"]+)">/g,'xlink:href="$1"/>').replace(/ id=([^" >]+)/g,' id="$1"').replace(/class=([^" >]+)/g,'class="$1"').replace(/ transform /g, | ||
" ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(a){return a.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(b){var a=this,e,c,f,y,h,d=l(a.options,b),I=d.exporting.allowHTML;if(!k.createElementNS)k.createElementNS=function(a,b){return k.createElement(b)};c=j("div",null,{position:"absolute",top:"-9999em",width:a.chartWidth+"px",height:a.chartHeight+"px"},k.body);f=a.renderTo.style.width;h=a.renderTo.style.height;f=d.exporting.sourceWidth|| | ||
d.chart.width||/px$/.test(f)&&parseInt(f,10)||600;h=d.exporting.sourceHeight||d.chart.height||/px$/.test(h)&&parseInt(h,10)||400;q(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:f,height:h});d.exporting.enabled=!1;delete d.data;d.series=[];m(a.series,function(a){y=l(a.options,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});y.isInternal||d.series.push(y)});b&&m(["xAxis","yAxis"],function(a){m(E(b[a]),function(b,c){d[a][c]=l(d[a][c],b)})});e=new g.Chart(d, | ||
a.callback);m(["xAxis","yAxis"],function(b){m(a[b],function(a,c){var d=e[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;d&&(h!==void 0||f!==void 0)&&d.setExtremes(h,f,!0,!1)})});f=e.getChartHTML();d=null;e.destroy();p(c);if(I&&(c=f.match(/<\/svg>(.*?$)/)))c='<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">'+c[1]+"</body></foreignObject>",f=f.replace("</svg>",c+"</svg>");f=this.sanitizeSVG(f);return f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, | ||
"'")},getSVGForExport:function(b,a){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,a,{exporting:{sourceWidth:b&&b.sourceWidth||e.sourceWidth,sourceHeight:b&&b.sourceHeight||e.sourceHeight}}))},exportChart:function(b,a){var e=this.getSVGForExport(b,a),b=l(this.options.exporting,b);g.post(b.url,{filename:b.filename||"chart",type:b.type,width:b.width||0,scale:b.scale||2,svg:e},b.formAttributes)},print:function(){var b=this,a=b.container,e=[],c=a.parentNode, | ||
f=k.body,g=f.childNodes;if(!b.isPrinting)b.isPrinting=!0,B(b,"beforePrint"),m(g,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"}),f.appendChild(a),C.focus(),C.print(),setTimeout(function(){c.appendChild(a);m(g,function(a,b){if(a.nodeType===1)a.style.display=e[b]});b.isPrinting=!1;B(b,"afterPrint")},1E3)},contextMenu:function(b,a,e,c,f,g,h){var d=this,l=d.options.navigation,D=l.menuItemStyle,n=d.chartWidth,o=d.chartHeight,k="cache-"+b,i=d[k],t=F(f,g),v,w,p,r=function(a){d.pointer.inClass(a.target, | ||
b)||w()};if(!i)d[k]=i=j("div",{className:b},{position:"absolute",zIndex:1E3,padding:t+"px"},d.container),v=j("div",null,q({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},l.menuStyle),i),w=function(){u(i,{display:"none"});h&&h.setState(0);d.openMenu=!1},s(i,"mouseleave",function(){p=setTimeout(w,500)}),s(i,"mouseenter",function(){clearTimeout(p)}),s(document,"mouseup",r),s(d,"destroy",function(){A(document,"mouseup",r)}),m(a,function(a){if(a){var b= | ||
a.separator?j("hr",null,null,v):j("div",{onmouseover:function(){u(this,l.menuItemHoverStyle)},onmouseout:function(){u(this,D)},onclick:function(b){b.stopPropagation();w();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},q({cursor:"pointer"},D),v);d.exportDivElements.push(b)}}),d.exportDivElements.push(v,i),d.exportMenuWidth=i.offsetWidth,d.exportMenuHeight=i.offsetHeight;a={display:"block"};e+d.exportMenuWidth>n?a.right=n-e-f-t+"px":a.left=e-t+"px";c+g+d.exportMenuHeight> | ||
o&&h.alignOptions.verticalAlign!=="top"?a.bottom=o-c-t+"px":a.top=c+g-t+"px";u(i,a);d.openMenu=!0},addButton:function(b){var a=this,e=a.renderer,c=l(a.options.navigation.buttonOptions,b),f=c.onclick,k=c.menuItems,h,d,m={stroke:c.symbolStroke,fill:c.symbolFill},j=c.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=[],a.exportSVGElements=[];if(c.enabled!==!1){var n=c.theme,o=n.states,p=o&&o.hover,o=o&&o.select,i;delete n.states;f?i=function(b){b.stopPropagation(); | ||
f.call(a,b)}:k&&(i=function(){a.contextMenu(d.menuClassName,k,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?n.paddingLeft=g.pick(n.paddingLeft,25):c.text||q(n,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,i,n,p,o).attr({title:a.options.lang[c._titleKey],"stroke-linecap":"round"});d.menuClassName=b.menuClassName||"highcharts-menu-"+a.btnCount++;c.symbol&&(h=e.symbol(c.symbol,c.symbolX-j/2,c.symbolY-j/2,j,j).attr(q(m,{"stroke-width":c.symbolStrokeWidth|| | ||
1,zIndex:1})).add(d));d.add().align(q(c,{width:d.width,x:g.pick(c.x,x)}),!0,"spacingBox");x+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);a.exportSVGElements.push(d,h)}},destroyExport:function(b){var b=b.target,a,e;for(a=0;a<b.exportSVGElements.length;a++)if(e=b.exportSVGElements[a])e.onclick=e.ontouchstart=null,b.exportSVGElements[a]=e.destroy();for(a=0;a<b.exportDivElements.length;a++)e=b.exportDivElements[a],A(e,"mouseleave"),b.exportDivElements[a]=e.onmouseout=e.onmouseover=e.ontouchstart= | ||
e.onclick=null,p(e)}});H.menu=function(b,a,e,c){return["M",b,a+2.5,"L",b+e,a+2.5,"M",b,a+c/2+0.5,"L",b+e,a+c/2+0.5,"M",b,a+c-1.5,"L",b+e,a+c-1.5]};z.prototype.callbacks.push(function(b){var a,e=b.options.exporting,c=e.buttons;x=0;if(e.enabled!==!1){for(a in c)b.addButton(c[a]);s(b,"destroy",b.destroyExport)}})})(Highcharts); | ||
" ").replace(/:(path|rect)/g,"$1").replace(/style="([^"]+)"/g,function(b){return b.toLowerCase()})},getChartHTML:function(){return this.container.innerHTML},getSVG:function(a){var b=this,e,c,g,j,k,d=l(b.options,a),I=d.exporting.allowHTML;if(!m.createElementNS)m.createElementNS=function(b,a){return m.createElement(a)};c=n("div",null,{position:"absolute",top:"-9999em",width:b.chartWidth+"px",height:b.chartHeight+"px"},m.body);g=b.renderTo.style.width;k=b.renderTo.style.height;g=d.exporting.sourceWidth|| | ||
d.chart.width||/px$/.test(g)&&parseInt(g,10)||600;k=d.exporting.sourceHeight||d.chart.height||/px$/.test(k)&&parseInt(k,10)||400;q(d.chart,{animation:!1,renderTo:c,forExport:!0,renderer:"SVGRenderer",width:g,height:k});d.exporting.enabled=!1;delete d.data;d.series=[];i(b.series,function(a){j=l(a.options,{animation:!1,enableMouseTracking:!1,showCheckbox:!1,visible:a.visible});j.isInternal||d.series.push(j)});a&&i(["xAxis","yAxis"],function(b){i(E(a[b]),function(a,c){d[b][c]=l(d[b][c],a)})});e=new f.Chart(d, | ||
b.callback);i(["xAxis","yAxis"],function(a){i(b[a],function(b,c){var d=e[a][c],f=b.getExtremes(),g=f.userMin,f=f.userMax;d&&(g!==void 0||f!==void 0)&&d.setExtremes(g,f,!0,!1)})});g=e.getChartHTML();d=null;e.destroy();r(c);if(I&&(c=g.match(/<\/svg>(.*?$)/)))c='<foreignObject x="0" y="0" width="200" height="200"><body xmlns="http://www.w3.org/1999/xhtml">'+c[1]+"</body></foreignObject>",g=g.replace("</svg>",c+"</svg>");g=this.sanitizeSVG(g);return g=g.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g, | ||
"'")},getSVGForExport:function(a,b){var e=this.options.exporting;return this.getSVG(l({chart:{borderRadius:0}},e.chartOptions,b,{exporting:{sourceWidth:a&&a.sourceWidth||e.sourceWidth,sourceHeight:a&&a.sourceHeight||e.sourceHeight}}))},exportChart:function(a,b){var e=this.getSVGForExport(a,b),a=l(this.options.exporting,a);f.post(a.url,{filename:a.filename||"chart",type:a.type,width:a.width||0,scale:a.scale||2,svg:e},a.formAttributes)},print:function(){var a=this,b=a.container,e=[],c=b.parentNode, | ||
f=m.body,j=f.childNodes;if(!a.isPrinting)a.isPrinting=!0,a.pointer.reset(null,0),B(a,"beforePrint"),i(j,function(a,b){if(a.nodeType===1)e[b]=a.style.display,a.style.display="none"}),f.appendChild(b),C.focus(),C.print(),setTimeout(function(){c.appendChild(b);i(j,function(a,b){if(a.nodeType===1)a.style.display=e[b]});a.isPrinting=!1;B(a,"afterPrint")},1E3)},contextMenu:function(a,b,e,c,f,j,k){var d=this,l=d.options.navigation,D=l.menuItemStyle,o=d.chartWidth,p=d.chartHeight,m="cache-"+a,h=d[m],u=F(f, | ||
j),w,x,r,s=function(b){d.pointer.inClass(b.target,a)||x()};if(!h)d[m]=h=n("div",{className:a},{position:"absolute",zIndex:1E3,padding:u+"px"},d.container),w=n("div",null,q({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},l.menuStyle),h),x=function(){v(h,{display:"none"});k&&k.setState(0);d.openMenu=!1},t(h,"mouseleave",function(){r=setTimeout(x,500)}),t(h,"mouseenter",function(){clearTimeout(r)}),t(document,"mouseup",s),t(d,"destroy",function(){A(document, | ||
"mouseup",s)}),i(b,function(a){if(a){var b=a.separator?n("hr",null,null,w):n("div",{onmouseover:function(){v(this,l.menuItemHoverStyle)},onmouseout:function(){v(this,D)},onclick:function(b){b&&b.stopPropagation();x();a.onclick&&a.onclick.apply(d,arguments)},innerHTML:a.text||d.options.lang[a.textKey]},q({cursor:"pointer"},D),w);d.exportDivElements.push(b)}}),d.exportDivElements.push(w,h),d.exportMenuWidth=h.offsetWidth,d.exportMenuHeight=h.offsetHeight;b={display:"block"};e+d.exportMenuWidth>o?b.right= | ||
o-e-f-u+"px":b.left=e-u+"px";c+j+d.exportMenuHeight>p&&k.alignOptions.verticalAlign!=="top"?b.bottom=p-c-u+"px":b.top=c+j-u+"px";v(h,b);d.openMenu=!0},addButton:function(a){var b=this,e=b.renderer,c=l(b.options.navigation.buttonOptions,a),g=c.onclick,j=c.menuItems,k,d,m={stroke:c.symbolStroke,fill:c.symbolFill},i=c.symbolSize||12;if(!b.btnCount)b.btnCount=0;if(!b.exportDivElements)b.exportDivElements=[],b.exportSVGElements=[];if(c.enabled!==!1){var o=c.theme,p=o.states,n=p&&p.hover,p=p&&p.select, | ||
h;delete o.states;g?h=function(a){a.stopPropagation();g.call(b,a)}:j&&(h=function(){b.contextMenu(d.menuClassName,j,d.translateX,d.translateY,d.width,d.height,d);d.setState(2)});c.text&&c.symbol?o.paddingLeft=f.pick(o.paddingLeft,25):c.text||q(o,{width:c.width,height:c.height,padding:0});d=e.button(c.text,0,0,h,o,n,p).attr({title:b.options.lang[c._titleKey],"stroke-linecap":"round"});d.menuClassName=a.menuClassName||"highcharts-menu-"+b.btnCount++;c.symbol&&(k=e.symbol(c.symbol,c.symbolX-i/2,c.symbolY- | ||
i/2,i,i).attr(q(m,{"stroke-width":c.symbolStrokeWidth||1,zIndex:1})).add(d));d.add().align(q(c,{width:d.width,x:f.pick(c.x,y)}),!0,"spacingBox");y+=(d.width+c.buttonSpacing)*(c.align==="right"?-1:1);b.exportSVGElements.push(d,k)}},destroyExport:function(a){var a=a.target,b,e;for(b=0;b<a.exportSVGElements.length;b++)if(e=a.exportSVGElements[b])e.onclick=e.ontouchstart=null,a.exportSVGElements[b]=e.destroy();for(b=0;b<a.exportDivElements.length;b++)e=a.exportDivElements[b],A(e,"mouseleave"),a.exportDivElements[b]= | ||
e.onmouseout=e.onmouseover=e.ontouchstart=e.onclick=null,r(e)}});H.menu=function(a,b,e,c){return["M",a,b+2.5,"L",a+e,b+2.5,"M",a,b+c/2+0.5,"L",a+e,b+c/2+0.5,"M",a,b+c-1.5,"L",a+e,b+c-1.5]};z.prototype.callbacks.push(function(a){var b,e=a.options.exporting,c=e.buttons;y=0;if(e.enabled!==!1){for(b in c)a.addButton(c[b]);t(a,"destroy",a.destroyExport)}})}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* Exporting module | ||
@@ -10,7 +10,11 @@ * | ||
// JSLint options: | ||
/*global Highcharts, HighchartsAdapter, document, window, Math, setTimeout */ | ||
/* eslint indent:0 */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
(function (Highcharts) { // encapsulate | ||
// create shortcuts | ||
@@ -20,3 +24,3 @@ var Chart = Highcharts.Chart, | ||
removeEvent = Highcharts.removeEvent, | ||
fireEvent = HighchartsAdapter.fireEvent, | ||
fireEvent = Highcharts.fireEvent, | ||
createElement = Highcharts.createElement, | ||
@@ -262,3 +266,3 @@ discardElement = Highcharts.discardElement, | ||
options = merge(chart.options, additionalOptions), // copy the options and add extra options | ||
allowHTML = options.exporting.allowHTML; // docs: experimental, see #2473 | ||
allowHTML = options.exporting.allowHTML; | ||
@@ -268,7 +272,5 @@ | ||
if (!doc.createElementNS) { | ||
/*jslint unparam: true*//* allow unused parameter ns in function below */ | ||
doc.createElementNS = function (ns, tagName) { | ||
return doc.createElement(tagName); | ||
}; | ||
/*jslint unparam: false*/ | ||
} | ||
@@ -375,3 +377,3 @@ | ||
svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1') | ||
.replace(/"/g, "'"); | ||
.replace(/"/g, '\''); | ||
@@ -437,2 +439,3 @@ return svg; | ||
chart.isPrinting = true; | ||
chart.pointer.reset(null, 0); | ||
@@ -564,3 +567,5 @@ fireEvent(chart, 'beforePrint'); | ||
onclick: function (e) { | ||
e.stopPropagation(); | ||
if (e) { // IE7 | ||
e.stopPropagation(); | ||
} | ||
hide(); | ||
@@ -782,2 +787,2 @@ if (item.onclick) { | ||
}(Highcharts)); | ||
})); |
@@ -9,6 +9,6 @@ /* | ||
*/ | ||
(function(c){var q=c.getOptions(),w=q.plotOptions,r=c.seriesTypes,G=c.merge,F=function(){},C=c.each,x=c.pick;w.funnel=G(w.pie,{animation:!1,center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});r.funnel=c.extendClass(r.pie,{type:"funnel",animate:F,translate:function(){var a=function(b,a){return/%$/.test(b)?a*parseInt(b,10)/100:parseInt(b, | ||
10)},D=0,f=this.chart,d=this.options,c=d.reversed,n=d.ignoreHiddenPoint,g=f.plotWidth,h=f.plotHeight,q=0,f=d.center,i=a(f[0],g),r=a(f[1],h),w=a(d.width,g),k,s,e=a(d.height,h),t=a(d.neckWidth,g),u=a(d.neckHeight,h),y=e-u,a=this.data,z,A,x=d.dataLabels.position==="left"?1:0,B,l,E,p,j,v,m;this.getWidthAt=s=function(b){return b>e-u||e===u?t:t+(w-t)*((e-u-b)/(e-u))};this.getX=function(b,a){return i+(a?-1:1)*(s(c?h-b:b)/2+d.dataLabels.distance)};this.center=[i,r,e];this.centerX=i;C(a,function(b){if(!n|| | ||
b.visible!==!1)D+=b.y});C(a,function(b){m=null;A=D?b.y/D:0;l=r-e/2+q*e;j=l+A*e;k=s(l);B=i-k/2;E=B+k;k=s(j);p=i-k/2;v=p+k;l>y?(B=p=i-t/2,E=v=i+t/2):j>y&&(m=j,k=s(y),p=i-k/2,v=p+k,j=y);c&&(l=e-l,j=e-j,m=m?e-m:null);z=["M",B,l,"L",E,l,v,j];m&&z.push(v,m,p,m);z.push(p,j,"Z");b.shapeType="path";b.shapeArgs={d:z};b.percentage=A*100;b.plotX=i;b.plotY=(l+(m||j))/2;b.tooltipPos=[i,b.plotY];b.slice=F;b.half=x;if(!n||b.visible!==!1)q+=A})},drawPoints:function(){var a=this,c=a.options,f=a.chart.renderer;C(a.data, | ||
function(d){var o=d.options,n=d.graphic,g=d.shapeArgs;n?n.animate(g):d.graphic=f.path(g).attr({fill:d.color,stroke:x(o.borderColor,c.borderColor),"stroke-width":x(o.borderWidth,c.borderWidth)}).add(a.group)})},sortByAngle:function(a){a.sort(function(a,c){return a.plotY-c.plotY})},drawDataLabels:function(){var a=this.data,c=this.options.dataLabels.distance,f,d,o,n=a.length,g,h;for(this.center[2]-=2*c;n--;)o=a[n],d=(f=o.half)?1:-1,h=o.plotY,g=this.getX(h,f),o.labelPos=[0,h,g+(c-5)*d,h,g+c*d,h,f?"right": | ||
"left",0];r.pie.prototype.drawDataLabels.call(this)}});q.plotOptions.pyramid=c.merge(q.plotOptions.funnel,{neckWidth:"0%",neckHeight:"0%",reversed:!0});c.seriesTypes.pyramid=c.extendClass(c.seriesTypes.funnel,{type:"pyramid"})})(Highcharts); | ||
(function(b){typeof module==="object"&&module.exports?module.exports=b:b(Highcharts)})(function(b){var q=b.getOptions(),w=q.plotOptions,r=b.seriesTypes,G=b.merge,E=function(){},B=b.each,F=b.pick;w.funnel=G(w.pie,{animation:!1,center:["50%","50%"],width:"90%",neckWidth:"30%",height:"100%",neckHeight:"25%",reversed:!1,dataLabels:{connectorWidth:1,connectorColor:"#606060"},size:!0,states:{select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}}});r.funnel=b.extendClass(r.pie,{type:"funnel",animate:E, | ||
translate:function(){var a=function(k,a){return/%$/.test(k)?a*parseInt(k,10)/100:parseInt(k,10)},b=0,e=this.chart,c=this.options,f=c.reversed,o=c.ignoreHiddenPoint,g=e.plotWidth,h=e.plotHeight,q=0,e=c.center,i=a(e[0],g),x=a(e[1],h),r=a(c.width,g),l,s,d=a(c.height,h),t=a(c.neckWidth,g),C=a(c.neckHeight,h),u=x-d/2+d-C,a=this.data,y,z,w=c.dataLabels.position==="left"?1:0,A,m,D,p,j,v,n;this.getWidthAt=s=function(k){var a=x-d/2;return k>u||d===C?t:t+(r-t)*(1-(k-a)/(d-C))};this.getX=function(k,a){return i+ | ||
(a?-1:1)*(s(f?h-k:k)/2+c.dataLabels.distance)};this.center=[i,x,d];this.centerX=i;B(a,function(a){if(!o||a.visible!==!1)b+=a.y});B(a,function(a){n=null;z=b?a.y/b:0;m=x-d/2+q*d;j=m+z*d;l=s(m);A=i-l/2;D=A+l;l=s(j);p=i-l/2;v=p+l;m>u?(A=p=i-t/2,D=v=i+t/2):j>u&&(n=j,l=s(u),p=i-l/2,v=p+l,j=u);f&&(m=d-m,j=d-j,n=n?d-n:null);y=["M",A,m,"L",D,m,v,j];n&&y.push(v,n,p,n);y.push(p,j,"Z");a.shapeType="path";a.shapeArgs={d:y};a.percentage=z*100;a.plotX=i;a.plotY=(m+(n||j))/2;a.tooltipPos=[i,a.plotY];a.slice=E;a.half= | ||
w;if(!o||a.visible!==!1)q+=z})},drawPoints:function(){var a=this,b=a.options,e=a.chart.renderer;B(a.data,function(c){var f=c.options,o=c.graphic,g=c.shapeArgs;o?o.animate(g):c.graphic=e.path(g).attr({fill:c.color,stroke:F(f.borderColor,b.borderColor),"stroke-width":F(f.borderWidth,b.borderWidth)}).add(a.group)})},sortByAngle:function(a){a.sort(function(a,b){return a.plotY-b.plotY})},drawDataLabels:function(){var a=this.data,b=this.options.dataLabels.distance,e,c,f,o=a.length,g,h;for(this.center[2]-= | ||
2*b;o--;)f=a[o],c=(e=f.half)?1:-1,h=f.plotY,g=this.getX(h,e),f.labelPos=[0,h,g+(b-5)*c,h,g+b*c,h,e?"right":"left",0];r.pie.prototype.drawDataLabels.call(this)}});q.plotOptions.pyramid=b.merge(q.plotOptions.funnel,{neckWidth:"0%",neckHeight:"0%",reversed:!0});b.seriesTypes.pyramid=b.extendClass(b.seriesTypes.funnel,{type:"pyramid"})}); |
@@ -9,5 +9,10 @@ /** | ||
*/ | ||
/*global Highcharts */ | ||
(function (Highcharts) { | ||
/* eslint indent:0 */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
@@ -86,3 +91,3 @@ 'use strict'; | ||
neckHeight = getLength(options.neckHeight, plotHeight), | ||
neckY = height - neckHeight, | ||
neckY = (centerY - height / 2) + height - neckHeight, | ||
data = series.data, | ||
@@ -103,8 +108,10 @@ path, | ||
series.getWidthAt = getWidthAt = function (y) { | ||
return y > height - neckHeight || height === neckHeight ? | ||
var top = (centerY - height / 2); | ||
return y > neckY || height === neckHeight ? | ||
neckWidth : | ||
neckWidth + (width - neckWidth) * ((height - neckHeight - y) / (height - neckHeight)); | ||
neckWidth + (width - neckWidth) * (1 - (y - top) / (height - neckHeight)); | ||
}; | ||
series.getX = function (y, half) { | ||
return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? plotHeight - y : y) / 2) + options.dataLabels.distance); | ||
return centerX + (half ? -1 : 1) * ((getWidthAt(reversed ? plotHeight - y : y) / 2) + options.dataLabels.distance); | ||
}; | ||
@@ -238,9 +245,9 @@ | ||
if (!graphic) { // Create the shapes | ||
point.graphic = renderer.path(shapeArgs). | ||
attr({ | ||
point.graphic = renderer.path(shapeArgs) | ||
.attr({ | ||
fill: point.color, | ||
stroke: pick(pointOptions.borderColor, options.borderColor), | ||
'stroke-width': pick(pointOptions.borderWidth, options.borderWidth) | ||
}). | ||
add(series.group); | ||
}) | ||
.add(series.group); | ||
@@ -319,2 +326,2 @@ } else { // Update the shapes | ||
}(Highcharts)); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highcharts JS v4.1.10 (2015-12-07) | ||
@@ -8,17 +8,17 @@ (c) 2011-2014 Torstein Honsi | ||
*/ | ||
(function(h){var n=h.Axis,r=h.Chart,k=h.Color,y=h.Legend,t=h.LegendSymbolMixin,u=h.Series,z=h.Point,v=h.getOptions(),i=h.each,s=h.extend,w=h.extendClass,l=h.merge,m=h.pick,p=h.seriesTypes,x=h.wrap,o=function(){},q=h.ColorAxis=function(){this.isColorAxis=!0;this.init.apply(this,arguments)};s(q.prototype,n.prototype);s(q.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72,startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50}, | ||
color:"gray",width:0.01},labels:{overflow:"justify"},minColor:"#EFEFFF",maxColor:"#003875",tickLength:5},init:function(a,b){var c=a.options.legend.layout!=="vertical",e;e=l(this.defaultColorAxisOptions,{side:c?2:1,reversed:!c},b,{opposite:!c,showEmpty:!1,title:null,isColor:!0});n.prototype.init.call(this,a,e);b.dataClasses&&this.initDataClasses(b);this.initStops(b);this.horiz=c;this.zoomEnabled=!1},tweenColors:function(a,b,c){var e;!b.rgba.length||!a.rgba.length?a=b.raw||"none":(a=a.rgba,b=b.rgba, | ||
e=b[3]!==1||a[3]!==1,a=(e?"rgba(":"rgb(")+Math.round(b[0]+(a[0]-b[0])*(1-c))+","+Math.round(b[1]+(a[1]-b[1])*(1-c))+","+Math.round(b[2]+(a[2]-b[2])*(1-c))+(e?","+(b[3]+(a[3]-b[3])*(1-c)):"")+")");return a},initDataClasses:function(a){var b=this,c=this.chart,e,d=0,f=this.options,g=a.dataClasses.length;this.dataClasses=e=[];this.legendItems=[];i(a.dataClasses,function(a,h){var i,a=l(a);e.push(a);if(!a.color)f.dataClassColor==="category"?(i=c.options.colors,a.color=i[d++],d===i.length&&(d=0)):a.color= | ||
b.tweenColors(k(f.minColor),k(f.maxColor),g<2?0.5:h/(g-1))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];i(this.stops,function(a){a.color=k(a[1])})},setOptions:function(a){n.prototype.setOptions.call(this,a);this.options.crosshair=this.options.marker;this.coll="colorAxis"},setAxisSize:function(){var a=this.legendSymbol,b=this.chart,c,e,d;if(a)this.left=c=a.attr("x"),this.top=e=a.attr("y"),this.width=d=a.attr("width"),this.height=a=a.attr("height"), | ||
this.right=b.chartWidth-c-d,this.bottom=b.chartHeight-e-a,this.len=this.horiz?d:a,this.pos=this.horiz?c:e},toColor:function(a,b){var c,e=this.stops,d,f=this.dataClasses,g,j;if(f)for(j=f.length;j--;){if(g=f[j],d=g.from,e=g.to,(d===void 0||a>=d)&&(e===void 0||a<=e)){c=g.color;if(b)b.dataClass=j;break}}else{this.isLog&&(a=this.val2lin(a));c=1-(this.max-a)/(this.max-this.min||1);for(j=e.length;j--;)if(c>e[j][0])break;d=e[j]||e[j+1];e=e[j+1]||d;c=1-(e[0]-c)/(e[0]-d[0]||1);c=this.tweenColors(d.color,e.color, | ||
c)}return c},getOffset:function(){var a=this.legendGroup,b=this.chart.axisOffset[this.side];if(a){this.axisParent=a;n.prototype.getOffset.call(this);if(!this.added)this.added=!0,this.labelLeft=0,this.labelRight=this.width;this.chart.axisOffset[this.side]=b}},setLegendColor:function(){var a,b=this.options;a=this.reversed;a=this.horiz?[+a,0,+!a,0]:[0,+!a,0,+a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]},stops:b.stops||[[0,b.minColor],[1,b.maxColor]]}},drawLegendSymbol:function(a, | ||
b){var c=a.padding,e=a.options,d=this.horiz,f=m(e.symbolWidth,d?200:12),g=m(e.symbolHeight,d?12:200),j=m(e.labelPadding,d?16:30),e=m(e.itemDistance,10);this.setLegendColor();b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,f,g).attr({zIndex:1}).add(b.legendGroup);b.legendSymbol.getBBox();this.legendItemWidth=f+c+(d?e:j);this.legendItemHeight=g+c+(d?j:0)},setState:o,visible:!0,setVisible:o,getSeriesExtremes:function(){var a;if(this.series.length)a=this.series[0],this.dataMin=a.valueMin,this.dataMax= | ||
a.valueMax},drawCrosshair:function(a,b){var c=b&&b.plotX,e=b&&b.plotY,d,f=this.pos,g=this.len;if(b)d=this.toPixels(b[b.series.colorKey]),d<f?d=f-2:d>f+g&&(d=f+g+2),b.plotX=d,b.plotY=this.len-d,n.prototype.drawCrosshair.call(this,a,b),b.plotX=c,b.plotY=e,this.cross&&this.cross.attr({fill:this.crosshair.color}).add(this.legendGroup)},getPlotLinePath:function(a,b,c,e,d){return typeof d==="number"?this.horiz?["M",d-4,this.top-6,"L",d+4,this.top-6,d,this.top,"Z"]:["M",this.left,d,"L",this.left-6,d+6,this.left- | ||
6,d-6,"Z"]:n.prototype.getPlotLinePath.call(this,a,b,c,e)},update:function(a,b){var c=this.chart,e=c.legend;i(this.series,function(a){a.isDirtyData=!0});if(a.dataClasses&&e.allItems)i(e.allItems,function(a){a.isDataClass&&a.legendGroup.destroy()}),c.isDirtyLegend=!0;c.options[this.coll]=l(this.userOptions,a);n.prototype.update.call(this,a,b);this.legendItem&&(this.setLegendColor(),e.colorizeItem(this,!0))},getDataClassLegendSymbols:function(){var a=this,b=this.chart,c=this.legendItems,e=b.options.legend, | ||
d=e.valueDecimals,f=e.valueSuffix||"",g;c.length||i(this.dataClasses,function(e,n){var k=!0,l=e.from,m=e.to;g="";l===void 0?g="< ":m===void 0&&(g="> ");l!==void 0&&(g+=h.numberFormat(l,d)+f);l!==void 0&&m!==void 0&&(g+=" - ");m!==void 0&&(g+=h.numberFormat(m,d)+f);c.push(s({chart:b,name:g,options:{},drawLegendSymbol:t.drawRectangle,visible:!0,setState:o,isDataClass:!0,setVisible:function(){k=this.visible=!k;i(a.series,function(a){i(a.points,function(a){a.dataClass===n&&a.setVisible(k)})});b.legend.colorizeItem(this, | ||
k)}},e))});return c},name:""});i(["fill","stroke"],function(a){HighchartsAdapter.addAnimSetter(a,function(b){b.elem.attr(a,q.prototype.tweenColors(k(b.start),k(b.end),b.pos))})});x(r.prototype,"getAxes",function(a){var b=this.options.colorAxis;a.call(this);this.colorAxis=[];b&&new q(this,b)});x(y.prototype,"getAllItems",function(a){var b=[],c=this.chart.colorAxis[0];c&&(c.options.dataClasses?b=b.concat(c.getDataClassLegendSymbols()):b.push(c),i(c.series,function(a){a.options.showInLegend=!1}));return b.concat(a.call(this))}); | ||
r={pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",dashstyle:"dashStyle"},pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:o,parallelArrays:["x","y","value"],colorKey:"value",translateColors:function(){var a=this,b=this.options.nullColor,c=this.colorAxis,e=this.colorKey;i(this.data,function(d){var f=d[e];if(f=d.options.color||(f===null?b:c&&f!==void 0?c.toColor(f, | ||
d):d.color||a.color))d.color=f})}};v.plotOptions.heatmap=l(v.plotOptions.scatter,{animation:!1,borderWidth:0,nullColor:"#F8F8F8",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}<br/>"},states:{normal:{animation:!0},hover:{halo:!1,brightness:0.2}}});p.heatmap=w(p.scatter,l(r,{type:"heatmap",pointArrayMap:["y","value"],hasPointSpecificOptions:!0, | ||
pointClass:w(z,{setVisible:function(a){var b=this,c=a?"show":"hide";i(["graphic","dataLabel"],function(a){if(b[a])b[a][c]()})}}),supportsDrilldown:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var a;p.scatter.prototype.init.apply(this,arguments);a=this.options;this.pointRange=a.pointRange=m(a.pointRange,a.colsize||1);this.yAxis.axisPointRange=a.rowsize||1},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis,e=function(a,b,c){return Math.min(Math.max(b,a),c)};this.generatePoints(); | ||
i(this.points,function(d){var f=(a.colsize||1)/2,g=(a.rowsize||1)/2,h=e(Math.round(b.len-b.translate(d.x-f,0,1,0,1)),0,b.len),f=e(Math.round(b.len-b.translate(d.x+f,0,1,0,1)),0,b.len),i=e(Math.round(c.translate(d.y-g,0,1,0,1)),0,c.len),g=e(Math.round(c.translate(d.y+g,0,1,0,1)),0,c.len);d.plotX=d.clientX=(h+f)/2;d.plotY=(i+g)/2;d.shapeType="rect";d.shapeArgs={x:Math.min(h,f),y:Math.min(i,g),width:Math.abs(f-h),height:Math.abs(g-i)}});this.translateColors();this.chart.hasRendered&&i(this.points,function(a){a.shapeArgs.fill= | ||
a.options.color||a.color})},drawPoints:p.column.prototype.drawPoints,animate:o,getBox:o,drawLegendSymbol:t.drawRectangle,getExtremes:function(){u.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;u.prototype.getExtremes.call(this)}}))})(Highcharts); | ||
(function(d){typeof module==="object"&&module.exports?module.exports=d:d(Highcharts)})(function(d){var m=d.Axis,q=d.Chart,i=d.Color,x=d.Legend,s=d.LegendSymbolMixin,t=d.Series,y=d.Point,u=d.getOptions(),h=d.each,r=d.extend,v=d.extendClass,j=d.merge,k=d.pick,o=d.seriesTypes,w=d.wrap,n=function(){},p=d.ColorAxis=function(){this.isColorAxis=!0;this.init.apply(this,arguments)};r(p.prototype,m.prototype);r(p.prototype,{defaultColorAxisOptions:{lineWidth:0,minPadding:0,maxPadding:0,gridLineWidth:1,tickPixelInterval:72, | ||
startOnTick:!0,endOnTick:!0,offset:0,marker:{animation:{duration:50},color:"gray",width:0.01},labels:{overflow:"justify"},minColor:"#EFEFFF",maxColor:"#003875",tickLength:5},init:function(a,b){var c=a.options.legend.layout!=="vertical",f;f=j(this.defaultColorAxisOptions,{side:c?2:1,reversed:!c},b,{opposite:!c,showEmpty:!1,title:null,isColor:!0});m.prototype.init.call(this,a,f);b.dataClasses&&this.initDataClasses(b);this.initStops(b);this.horiz=c;this.zoomEnabled=!1},tweenColors:function(a,b,c){var f; | ||
!b.rgba.length||!a.rgba.length?a=b.input||"none":(a=a.rgba,b=b.rgba,f=b[3]!==1||a[3]!==1,a=(f?"rgba(":"rgb(")+Math.round(b[0]+(a[0]-b[0])*(1-c))+","+Math.round(b[1]+(a[1]-b[1])*(1-c))+","+Math.round(b[2]+(a[2]-b[2])*(1-c))+(f?","+(b[3]+(a[3]-b[3])*(1-c)):"")+")");return a},initDataClasses:function(a){var b=this,c=this.chart,f,e=0,l=this.options,g=a.dataClasses.length;this.dataClasses=f=[];this.legendItems=[];h(a.dataClasses,function(a,d){var h,a=j(a);f.push(a);if(!a.color)l.dataClassColor==="category"? | ||
(h=c.options.colors,a.color=h[e++],e===h.length&&(e=0)):a.color=b.tweenColors(i(l.minColor),i(l.maxColor),g<2?0.5:d/(g-1))})},initStops:function(a){this.stops=a.stops||[[0,this.options.minColor],[1,this.options.maxColor]];h(this.stops,function(a){a.color=i(a[1])})},setOptions:function(a){m.prototype.setOptions.call(this,a);this.options.crosshair=this.options.marker;this.coll="colorAxis"},setAxisSize:function(){var a=this.legendSymbol,b=this.chart,c,f,e;if(a)this.left=c=a.attr("x"),this.top=f=a.attr("y"), | ||
this.width=e=a.attr("width"),this.height=a=a.attr("height"),this.right=b.chartWidth-c-e,this.bottom=b.chartHeight-f-a,this.len=this.horiz?e:a,this.pos=this.horiz?c:f},toColor:function(a,b){var c,f=this.stops,e,l=this.dataClasses,g,d;if(l)for(d=l.length;d--;){if(g=l[d],e=g.from,f=g.to,(e===void 0||a>=e)&&(f===void 0||a<=f)){c=g.color;if(b)b.dataClass=d;break}}else{this.isLog&&(a=this.val2lin(a));c=1-(this.max-a)/(this.max-this.min||1);for(d=f.length;d--;)if(c>f[d][0])break;e=f[d]||f[d+1];f=f[d+1]|| | ||
e;c=1-(f[0]-c)/(f[0]-e[0]||1);c=this.tweenColors(e.color,f.color,c)}return c},getOffset:function(){var a=this.legendGroup,b=this.chart.axisOffset[this.side];if(a){this.axisParent=a;m.prototype.getOffset.call(this);if(!this.added)this.added=!0,this.labelLeft=0,this.labelRight=this.width;this.chart.axisOffset[this.side]=b}},setLegendColor:function(){var a,b=this.options,c=this.reversed;a=c?1:0;c=c?0:1;a=this.horiz?[a,0,c,0]:[0,c,0,a];this.legendColor={linearGradient:{x1:a[0],y1:a[1],x2:a[2],y2:a[3]}, | ||
stops:b.stops||[[0,b.minColor],[1,b.maxColor]]}},drawLegendSymbol:function(a,b){var c=a.padding,f=a.options,e=this.horiz,d=k(f.symbolWidth,e?200:12),g=k(f.symbolHeight,e?12:200),h=k(f.labelPadding,e?16:30),f=k(f.itemDistance,10);this.setLegendColor();b.legendSymbol=this.chart.renderer.rect(0,a.baseline-11,d,g).attr({zIndex:1}).add(b.legendGroup);this.legendItemWidth=d+c+(e?f:h);this.legendItemHeight=g+c+(e?h:0)},setState:n,visible:!0,setVisible:n,getSeriesExtremes:function(){var a;if(this.series.length)a= | ||
this.series[0],this.dataMin=a.valueMin,this.dataMax=a.valueMax},drawCrosshair:function(a,b){var c=b&&b.plotX,f=b&&b.plotY,e,d=this.pos,g=this.len;if(b)e=this.toPixels(b[b.series.colorKey]),e<d?e=d-2:e>d+g&&(e=d+g+2),b.plotX=e,b.plotY=this.len-e,m.prototype.drawCrosshair.call(this,a,b),b.plotX=c,b.plotY=f,this.cross&&this.cross.attr({fill:this.crosshair.color}).add(this.legendGroup)},getPlotLinePath:function(a,b,c,f,e){return typeof e==="number"?this.horiz?["M",e-4,this.top-6,"L",e+4,this.top-6,e, | ||
this.top,"Z"]:["M",this.left,e,"L",this.left-6,e+6,this.left-6,e-6,"Z"]:m.prototype.getPlotLinePath.call(this,a,b,c,f)},update:function(a,b){var c=this.chart,f=c.legend;h(this.series,function(a){a.isDirtyData=!0});if(a.dataClasses&&f.allItems)h(f.allItems,function(a){a.isDataClass&&a.legendGroup.destroy()}),c.isDirtyLegend=!0;c.options[this.coll]=j(this.userOptions,a);m.prototype.update.call(this,a,b);this.legendItem&&(this.setLegendColor(),f.colorizeItem(this,!0))},getDataClassLegendSymbols:function(){var a= | ||
this,b=this.chart,c=this.legendItems,f=b.options.legend,e=f.valueDecimals,l=f.valueSuffix||"",g;c.length||h(this.dataClasses,function(f,m){var i=!0,j=f.from,k=f.to;g="";j===void 0?g="< ":k===void 0&&(g="> ");j!==void 0&&(g+=d.numberFormat(j,e)+l);j!==void 0&&k!==void 0&&(g+=" - ");k!==void 0&&(g+=d.numberFormat(k,e)+l);c.push(r({chart:b,name:g,options:{},drawLegendSymbol:s.drawRectangle,visible:!0,setState:n,isDataClass:!0,setVisible:function(){i=this.visible=!i;h(a.series,function(a){h(a.points, | ||
function(a){a.dataClass===m&&a.setVisible(i)})});b.legend.colorizeItem(this,i)}},f))});return c},name:""});h(["fill","stroke"],function(a){d.addAnimSetter(a,function(b){b.elem.attr(a,p.prototype.tweenColors(i(b.start),i(b.end),b.pos))})});w(q.prototype,"getAxes",function(a){var b=this.options.colorAxis;a.call(this);this.colorAxis=[];b&&new p(this,b)});w(x.prototype,"getAllItems",function(a){var b=[],c=this.chart.colorAxis[0];c&&(c.options.dataClasses?b=b.concat(c.getDataClassLegendSymbols()):b.push(c), | ||
h(c.series,function(a){a.options.showInLegend=!1}));return b.concat(a.call(this))});q={pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",dashstyle:"dashStyle"},pointArrayMap:["value"],axisTypes:["xAxis","yAxis","colorAxis"],optionalAxis:"colorAxis",trackerGroups:["group","markerGroup","dataLabelsGroup"],getSymbol:n,parallelArrays:["x","y","value"],colorKey:"value",translateColors:function(){var a=this,b=this.options.nullColor,c=this.colorAxis,f=this.colorKey;h(this.data, | ||
function(e){var d=e[f];if(d=e.options.color||(d===null?b:c&&d!==void 0?c.toColor(d,e):e.color||a.color))e.color=d})}};u.plotOptions.heatmap=j(u.plotOptions.scatter,{animation:!1,borderWidth:0,nullColor:"#F8F8F8",dataLabels:{formatter:function(){return this.point.value},inside:!0,verticalAlign:"middle",crop:!1,overflow:!1,padding:0},marker:null,pointRange:null,tooltip:{pointFormat:"{point.x}, {point.y}: {point.value}<br/>"},states:{normal:{animation:!0},hover:{halo:!1,brightness:0.2}}});o.heatmap= | ||
v(o.scatter,j(q,{type:"heatmap",pointArrayMap:["y","value"],hasPointSpecificOptions:!0,pointClass:v(y,{setVisible:function(a){var b=this,c=a?"show":"hide";h(["graphic","dataLabel"],function(a){if(b[a])b[a][c]()})}}),supportsDrilldown:!0,getExtremesFromAll:!0,directTouch:!0,init:function(){var a;o.scatter.prototype.init.apply(this,arguments);a=this.options;a.pointRange=k(a.pointRange,a.colsize||1);this.yAxis.axisPointRange=a.rowsize||1},translate:function(){var a=this.options,b=this.xAxis,c=this.yAxis, | ||
f=function(a,b,c){return Math.min(Math.max(b,a),c)};this.generatePoints();h(this.points,function(e){var d=(a.colsize||1)/2,g=(a.rowsize||1)/2,h=f(Math.round(b.len-b.translate(e.x-d,0,1,0,1)),0,b.len),d=f(Math.round(b.len-b.translate(e.x+d,0,1,0,1)),0,b.len),i=f(Math.round(c.translate(e.y-g,0,1,0,1)),0,c.len),g=f(Math.round(c.translate(e.y+g,0,1,0,1)),0,c.len);e.plotX=e.clientX=(h+d)/2;e.plotY=(i+g)/2;e.shapeType="rect";e.shapeArgs={x:Math.min(h,d),y:Math.min(i,g),width:Math.abs(d-h),height:Math.abs(g- | ||
i)}});this.translateColors();this.chart.hasRendered&&h(this.points,function(a){a.shapeArgs.fill=a.options.color||a.color})},drawPoints:o.column.prototype.drawPoints,animate:n,getBox:n,drawLegendSymbol:s.drawRectangle,getExtremes:function(){t.prototype.getExtremes.call(this,this.valueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;t.prototype.getExtremes.call(this)}}))}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highcharts JS v4.1.10 (2015-12-07) | ||
* | ||
@@ -8,699 +8,705 @@ * (c) 2011-2014 Torstein Honsi | ||
*/ | ||
/* eslint indent: [2, 4] */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
/*global HighchartsAdapter*/ | ||
(function (Highcharts) { | ||
var UNDEFINED, | ||
Axis = Highcharts.Axis, | ||
Chart = Highcharts.Chart, | ||
Color = Highcharts.Color, | ||
Legend = Highcharts.Legend, | ||
LegendSymbolMixin = Highcharts.LegendSymbolMixin, | ||
Series = Highcharts.Series, | ||
Point = Highcharts.Point, | ||
var UNDEFINED, | ||
Axis = Highcharts.Axis, | ||
Chart = Highcharts.Chart, | ||
Color = Highcharts.Color, | ||
Legend = Highcharts.Legend, | ||
LegendSymbolMixin = Highcharts.LegendSymbolMixin, | ||
Series = Highcharts.Series, | ||
Point = Highcharts.Point, | ||
defaultOptions = Highcharts.getOptions(), | ||
each = Highcharts.each, | ||
extend = Highcharts.extend, | ||
extendClass = Highcharts.extendClass, | ||
merge = Highcharts.merge, | ||
pick = Highcharts.pick, | ||
seriesTypes = Highcharts.seriesTypes, | ||
wrap = Highcharts.wrap, | ||
noop = function () {}; | ||
defaultOptions = Highcharts.getOptions(), | ||
each = Highcharts.each, | ||
extend = Highcharts.extend, | ||
extendClass = Highcharts.extendClass, | ||
merge = Highcharts.merge, | ||
pick = Highcharts.pick, | ||
seriesTypes = Highcharts.seriesTypes, | ||
wrap = Highcharts.wrap, | ||
noop = function () {}; | ||
/** | ||
* The ColorAxis object for inclusion in gradient legends | ||
*/ | ||
var ColorAxis = Highcharts.ColorAxis = function () { | ||
this.isColorAxis = true; | ||
this.init.apply(this, arguments); | ||
}; | ||
extend(ColorAxis.prototype, Axis.prototype); | ||
extend(ColorAxis.prototype, { | ||
defaultColorAxisOptions: { | ||
lineWidth: 0, | ||
minPadding: 0, | ||
maxPadding: 0, | ||
gridLineWidth: 1, | ||
tickPixelInterval: 72, | ||
startOnTick: true, | ||
endOnTick: true, | ||
offset: 0, | ||
marker: { | ||
animation: { | ||
duration: 50 | ||
}, | ||
color: 'gray', | ||
width: 0.01 | ||
}, | ||
labels: { | ||
overflow: 'justify' | ||
}, | ||
minColor: '#EFEFFF', | ||
maxColor: '#003875', | ||
tickLength: 5 | ||
}, | ||
init: function (chart, userOptions) { | ||
var horiz = chart.options.legend.layout !== 'vertical', | ||
options; | ||
/** | ||
* The ColorAxis object for inclusion in gradient legends | ||
*/ | ||
var ColorAxis = Highcharts.ColorAxis = function () { | ||
this.isColorAxis = true; | ||
this.init.apply(this, arguments); | ||
}; | ||
extend(ColorAxis.prototype, Axis.prototype); | ||
extend(ColorAxis.prototype, { | ||
defaultColorAxisOptions: { | ||
lineWidth: 0, | ||
minPadding: 0, | ||
maxPadding: 0, | ||
gridLineWidth: 1, | ||
tickPixelInterval: 72, | ||
startOnTick: true, | ||
endOnTick: true, | ||
offset: 0, | ||
marker: { | ||
animation: { | ||
duration: 50 | ||
}, | ||
color: 'gray', | ||
width: 0.01 | ||
}, | ||
labels: { | ||
overflow: 'justify' | ||
}, | ||
minColor: '#EFEFFF', | ||
maxColor: '#003875', | ||
tickLength: 5 | ||
}, | ||
init: function (chart, userOptions) { | ||
var horiz = chart.options.legend.layout !== 'vertical', | ||
options; | ||
// Build the options | ||
options = merge(this.defaultColorAxisOptions, { | ||
side: horiz ? 2 : 1, | ||
reversed: !horiz | ||
}, userOptions, { | ||
opposite: !horiz, | ||
showEmpty: false, | ||
title: null, | ||
isColor: true | ||
}); | ||
// Build the options | ||
options = merge(this.defaultColorAxisOptions, { | ||
side: horiz ? 2 : 1, | ||
reversed: !horiz | ||
}, userOptions, { | ||
opposite: !horiz, | ||
showEmpty: false, | ||
title: null, | ||
isColor: true | ||
}); | ||
Axis.prototype.init.call(this, chart, options); | ||
Axis.prototype.init.call(this, chart, options); | ||
// Base init() pushes it to the xAxis array, now pop it again | ||
//chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop(); | ||
// Base init() pushes it to the xAxis array, now pop it again | ||
//chart[this.isXAxis ? 'xAxis' : 'yAxis'].pop(); | ||
// Prepare data classes | ||
if (userOptions.dataClasses) { | ||
this.initDataClasses(userOptions); | ||
} | ||
this.initStops(userOptions); | ||
// Prepare data classes | ||
if (userOptions.dataClasses) { | ||
this.initDataClasses(userOptions); | ||
} | ||
this.initStops(userOptions); | ||
// Override original axis properties | ||
this.horiz = horiz; | ||
this.zoomEnabled = false; | ||
}, | ||
// Override original axis properties | ||
this.horiz = horiz; | ||
this.zoomEnabled = false; | ||
}, | ||
/* | ||
* Return an intermediate color between two colors, according to pos where 0 | ||
* is the from color and 1 is the to color. | ||
* NOTE: Changes here should be copied | ||
* to the same function in drilldown.src.js and solid-gauge-src.js. | ||
*/ | ||
tweenColors: function (from, to, pos) { | ||
// Check for has alpha, because rgba colors perform worse due to lack of | ||
// support in WebKit. | ||
var hasAlpha, | ||
ret; | ||
/* | ||
* Return an intermediate color between two colors, according to pos where 0 | ||
* is the from color and 1 is the to color. | ||
* NOTE: Changes here should be copied | ||
* to the same function in drilldown.src.js and solid-gauge-src.js. | ||
*/ | ||
tweenColors: function (from, to, pos) { | ||
// Check for has alpha, because rgba colors perform worse due to lack of | ||
// support in WebKit. | ||
var hasAlpha, | ||
ret; | ||
// Unsupported color, return to-color (#3920) | ||
if (!to.rgba.length || !from.rgba.length) { | ||
ret = to.raw || 'none'; | ||
// Unsupported color, return to-color (#3920) | ||
if (!to.rgba.length || !from.rgba.length) { | ||
ret = to.input || 'none'; | ||
// Interpolate | ||
} else { | ||
from = from.rgba; | ||
to = to.rgba; | ||
hasAlpha = (to[3] !== 1 || from[3] !== 1); | ||
ret = (hasAlpha ? 'rgba(' : 'rgb(') + | ||
Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' + | ||
Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' + | ||
Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) + | ||
(hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')'; | ||
} | ||
return ret; | ||
}, | ||
// Interpolate | ||
} else { | ||
from = from.rgba; | ||
to = to.rgba; | ||
hasAlpha = (to[3] !== 1 || from[3] !== 1); | ||
ret = (hasAlpha ? 'rgba(' : 'rgb(') + | ||
Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' + | ||
Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' + | ||
Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) + | ||
(hasAlpha ? (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) : '') + ')'; | ||
} | ||
return ret; | ||
}, | ||
initDataClasses: function (userOptions) { | ||
var axis = this, | ||
chart = this.chart, | ||
dataClasses, | ||
colorCounter = 0, | ||
options = this.options, | ||
len = userOptions.dataClasses.length; | ||
this.dataClasses = dataClasses = []; | ||
this.legendItems = []; | ||
initDataClasses: function (userOptions) { | ||
var axis = this, | ||
chart = this.chart, | ||
dataClasses, | ||
colorCounter = 0, | ||
options = this.options, | ||
len = userOptions.dataClasses.length; | ||
this.dataClasses = dataClasses = []; | ||
this.legendItems = []; | ||
each(userOptions.dataClasses, function (dataClass, i) { | ||
var colors; | ||
each(userOptions.dataClasses, function (dataClass, i) { | ||
var colors; | ||
dataClass = merge(dataClass); | ||
dataClasses.push(dataClass); | ||
if (!dataClass.color) { | ||
if (options.dataClassColor === 'category') { | ||
colors = chart.options.colors; | ||
dataClass.color = colors[colorCounter++]; | ||
// loop back to zero | ||
if (colorCounter === colors.length) { | ||
colorCounter = 0; | ||
} | ||
} else { | ||
dataClass.color = axis.tweenColors( | ||
Color(options.minColor), | ||
Color(options.maxColor), | ||
len < 2 ? 0.5 : i / (len - 1) // #3219 | ||
); | ||
} | ||
} | ||
}); | ||
}, | ||
dataClass = merge(dataClass); | ||
dataClasses.push(dataClass); | ||
if (!dataClass.color) { | ||
if (options.dataClassColor === 'category') { | ||
colors = chart.options.colors; | ||
dataClass.color = colors[colorCounter++]; | ||
// loop back to zero | ||
if (colorCounter === colors.length) { | ||
colorCounter = 0; | ||
} | ||
} else { | ||
dataClass.color = axis.tweenColors( | ||
Color(options.minColor), | ||
Color(options.maxColor), | ||
len < 2 ? 0.5 : i / (len - 1) // #3219 | ||
); | ||
} | ||
} | ||
}); | ||
}, | ||
initStops: function (userOptions) { | ||
this.stops = userOptions.stops || [ | ||
[0, this.options.minColor], | ||
[1, this.options.maxColor] | ||
]; | ||
each(this.stops, function (stop) { | ||
stop.color = Color(stop[1]); | ||
}); | ||
}, | ||
initStops: function (userOptions) { | ||
this.stops = userOptions.stops || [ | ||
[0, this.options.minColor], | ||
[1, this.options.maxColor] | ||
]; | ||
each(this.stops, function (stop) { | ||
stop.color = Color(stop[1]); | ||
}); | ||
}, | ||
/** | ||
* Extend the setOptions method to process extreme colors and color | ||
* stops. | ||
*/ | ||
setOptions: function (userOptions) { | ||
Axis.prototype.setOptions.call(this, userOptions); | ||
/** | ||
* Extend the setOptions method to process extreme colors and color | ||
* stops. | ||
*/ | ||
setOptions: function (userOptions) { | ||
Axis.prototype.setOptions.call(this, userOptions); | ||
this.options.crosshair = this.options.marker; | ||
this.coll = 'colorAxis'; | ||
}, | ||
this.options.crosshair = this.options.marker; | ||
this.coll = 'colorAxis'; | ||
}, | ||
setAxisSize: function () { | ||
var symbol = this.legendSymbol, | ||
chart = this.chart, | ||
x, | ||
y, | ||
width, | ||
height; | ||
setAxisSize: function () { | ||
var symbol = this.legendSymbol, | ||
chart = this.chart, | ||
x, | ||
y, | ||
width, | ||
height; | ||
if (symbol) { | ||
this.left = x = symbol.attr('x'); | ||
this.top = y = symbol.attr('y'); | ||
this.width = width = symbol.attr('width'); | ||
this.height = height = symbol.attr('height'); | ||
this.right = chart.chartWidth - x - width; | ||
this.bottom = chart.chartHeight - y - height; | ||
if (symbol) { | ||
this.left = x = symbol.attr('x'); | ||
this.top = y = symbol.attr('y'); | ||
this.width = width = symbol.attr('width'); | ||
this.height = height = symbol.attr('height'); | ||
this.right = chart.chartWidth - x - width; | ||
this.bottom = chart.chartHeight - y - height; | ||
this.len = this.horiz ? width : height; | ||
this.pos = this.horiz ? x : y; | ||
} | ||
}, | ||
this.len = this.horiz ? width : height; | ||
this.pos = this.horiz ? x : y; | ||
} | ||
}, | ||
/** | ||
* Translate from a value to a color | ||
*/ | ||
toColor: function (value, point) { | ||
var pos, | ||
stops = this.stops, | ||
from, | ||
to, | ||
color, | ||
dataClasses = this.dataClasses, | ||
dataClass, | ||
i; | ||
/** | ||
* Translate from a value to a color | ||
*/ | ||
toColor: function (value, point) { | ||
var pos, | ||
stops = this.stops, | ||
from, | ||
to, | ||
color, | ||
dataClasses = this.dataClasses, | ||
dataClass, | ||
i; | ||
if (dataClasses) { | ||
i = dataClasses.length; | ||
while (i--) { | ||
dataClass = dataClasses[i]; | ||
from = dataClass.from; | ||
to = dataClass.to; | ||
if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) { | ||
color = dataClass.color; | ||
if (point) { | ||
point.dataClass = i; | ||
} | ||
break; | ||
} | ||
} | ||
if (dataClasses) { | ||
i = dataClasses.length; | ||
while (i--) { | ||
dataClass = dataClasses[i]; | ||
from = dataClass.from; | ||
to = dataClass.to; | ||
if ((from === UNDEFINED || value >= from) && (to === UNDEFINED || value <= to)) { | ||
color = dataClass.color; | ||
if (point) { | ||
point.dataClass = i; | ||
} | ||
break; | ||
} | ||
} | ||
} else { | ||
} else { | ||
if (this.isLog) { | ||
value = this.val2lin(value); | ||
} | ||
pos = 1 - ((this.max - value) / ((this.max - this.min) || 1)); | ||
i = stops.length; | ||
while (i--) { | ||
if (pos > stops[i][0]) { | ||
break; | ||
} | ||
} | ||
from = stops[i] || stops[i + 1]; | ||
to = stops[i + 1] || from; | ||
if (this.isLog) { | ||
value = this.val2lin(value); | ||
} | ||
pos = 1 - ((this.max - value) / ((this.max - this.min) || 1)); | ||
i = stops.length; | ||
while (i--) { | ||
if (pos > stops[i][0]) { | ||
break; | ||
} | ||
} | ||
from = stops[i] || stops[i + 1]; | ||
to = stops[i + 1] || from; | ||
// The position within the gradient | ||
pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1); | ||
// The position within the gradient | ||
pos = 1 - (to[0] - pos) / ((to[0] - from[0]) || 1); | ||
color = this.tweenColors( | ||
from.color, | ||
to.color, | ||
pos | ||
); | ||
} | ||
return color; | ||
}, | ||
color = this.tweenColors( | ||
from.color, | ||
to.color, | ||
pos | ||
); | ||
} | ||
return color; | ||
}, | ||
/** | ||
* Override the getOffset method to add the whole axis groups inside the legend. | ||
*/ | ||
getOffset: function () { | ||
var group = this.legendGroup, | ||
sideOffset = this.chart.axisOffset[this.side]; | ||
if (group) { | ||
/** | ||
* Override the getOffset method to add the whole axis groups inside the legend. | ||
*/ | ||
getOffset: function () { | ||
var group = this.legendGroup, | ||
sideOffset = this.chart.axisOffset[this.side]; | ||
// Hook for the getOffset method to add groups to this parent group | ||
this.axisParent = group; | ||
if (group) { | ||
// Call the base | ||
Axis.prototype.getOffset.call(this); | ||
// Hook for the getOffset method to add groups to this parent group | ||
this.axisParent = group; | ||
// First time only | ||
if (!this.added) { | ||
// Call the base | ||
Axis.prototype.getOffset.call(this); | ||
this.added = true; | ||
// First time only | ||
if (!this.added) { | ||
this.labelLeft = 0; | ||
this.labelRight = this.width; | ||
} | ||
// Reset it to avoid color axis reserving space | ||
this.chart.axisOffset[this.side] = sideOffset; | ||
} | ||
}, | ||
this.added = true; | ||
/** | ||
* Create the color gradient | ||
*/ | ||
setLegendColor: function () { | ||
var grad, | ||
horiz = this.horiz, | ||
options = this.options, | ||
reversed = this.reversed; | ||
this.labelLeft = 0; | ||
this.labelRight = this.width; | ||
} | ||
// Reset it to avoid color axis reserving space | ||
this.chart.axisOffset[this.side] = sideOffset; | ||
} | ||
}, | ||
grad = horiz ? [+reversed, 0, +!reversed, 0] : [0, +!reversed, 0, +reversed]; // #3190 | ||
this.legendColor = { | ||
linearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] }, | ||
stops: options.stops || [ | ||
[0, options.minColor], | ||
[1, options.maxColor] | ||
] | ||
}; | ||
}, | ||
/** | ||
* Create the color gradient | ||
*/ | ||
setLegendColor: function () { | ||
var grad, | ||
horiz = this.horiz, | ||
options = this.options, | ||
reversed = this.reversed, | ||
one = reversed ? 1 : 0, | ||
zero = reversed ? 0 : 1; | ||
/** | ||
* The color axis appears inside the legend and has its own legend symbol | ||
*/ | ||
drawLegendSymbol: function (legend, item) { | ||
var padding = legend.padding, | ||
legendOptions = legend.options, | ||
horiz = this.horiz, | ||
box, | ||
width = pick(legendOptions.symbolWidth, horiz ? 200 : 12), | ||
height = pick(legendOptions.symbolHeight, horiz ? 12 : 200), | ||
labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30), | ||
itemDistance = pick(legendOptions.itemDistance, 10); | ||
grad = horiz ? [one, 0, zero, 0] : [0, zero, 0, one]; // #3190 | ||
this.legendColor = { | ||
linearGradient: { x1: grad[0], y1: grad[1], x2: grad[2], y2: grad[3] }, | ||
stops: options.stops || [ | ||
[0, options.minColor], | ||
[1, options.maxColor] | ||
] | ||
}; | ||
}, | ||
this.setLegendColor(); | ||
/** | ||
* The color axis appears inside the legend and has its own legend symbol | ||
*/ | ||
drawLegendSymbol: function (legend, item) { | ||
var padding = legend.padding, | ||
legendOptions = legend.options, | ||
horiz = this.horiz, | ||
width = pick(legendOptions.symbolWidth, horiz ? 200 : 12), | ||
height = pick(legendOptions.symbolHeight, horiz ? 12 : 200), | ||
labelPadding = pick(legendOptions.labelPadding, horiz ? 16 : 30), | ||
itemDistance = pick(legendOptions.itemDistance, 10); | ||
// Create the gradient | ||
item.legendSymbol = this.chart.renderer.rect( | ||
0, | ||
legend.baseline - 11, | ||
width, | ||
height | ||
).attr({ | ||
zIndex: 1 | ||
}).add(item.legendGroup); | ||
box = item.legendSymbol.getBBox(); | ||
this.setLegendColor(); | ||
// Set how much space this legend item takes up | ||
this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding); | ||
this.legendItemHeight = height + padding + (horiz ? labelPadding : 0); | ||
}, | ||
/** | ||
* Fool the legend | ||
*/ | ||
setState: noop, | ||
visible: true, | ||
setVisible: noop, | ||
getSeriesExtremes: function () { | ||
var series; | ||
if (this.series.length) { | ||
series = this.series[0]; | ||
this.dataMin = series.valueMin; | ||
this.dataMax = series.valueMax; | ||
} | ||
}, | ||
drawCrosshair: function (e, point) { | ||
var plotX = point && point.plotX, | ||
plotY = point && point.plotY, | ||
crossPos, | ||
axisPos = this.pos, | ||
axisLen = this.len; | ||
if (point) { | ||
crossPos = this.toPixels(point[point.series.colorKey]); | ||
if (crossPos < axisPos) { | ||
crossPos = axisPos - 2; | ||
} else if (crossPos > axisPos + axisLen) { | ||
crossPos = axisPos + axisLen + 2; | ||
} | ||
point.plotX = crossPos; | ||
point.plotY = this.len - crossPos; | ||
Axis.prototype.drawCrosshair.call(this, e, point); | ||
point.plotX = plotX; | ||
point.plotY = plotY; | ||
if (this.cross) { | ||
this.cross | ||
.attr({ | ||
fill: this.crosshair.color | ||
}) | ||
.add(this.legendGroup); | ||
} | ||
} | ||
}, | ||
getPlotLinePath: function (a, b, c, d, pos) { | ||
if (typeof pos === 'number') { // crosshairs only // #3969 pos can be 0 !! | ||
return this.horiz ? | ||
['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : | ||
['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z']; | ||
} else { | ||
return Axis.prototype.getPlotLinePath.call(this, a, b, c, d); | ||
} | ||
}, | ||
// Create the gradient | ||
item.legendSymbol = this.chart.renderer.rect( | ||
0, | ||
legend.baseline - 11, | ||
width, | ||
height | ||
).attr({ | ||
zIndex: 1 | ||
}).add(item.legendGroup); | ||
update: function (newOptions, redraw) { | ||
var chart = this.chart, | ||
legend = chart.legend; | ||
// Set how much space this legend item takes up | ||
this.legendItemWidth = width + padding + (horiz ? itemDistance : labelPadding); | ||
this.legendItemHeight = height + padding + (horiz ? labelPadding : 0); | ||
}, | ||
/** | ||
* Fool the legend | ||
*/ | ||
setState: noop, | ||
visible: true, | ||
setVisible: noop, | ||
getSeriesExtremes: function () { | ||
var series; | ||
if (this.series.length) { | ||
series = this.series[0]; | ||
this.dataMin = series.valueMin; | ||
this.dataMax = series.valueMax; | ||
} | ||
}, | ||
drawCrosshair: function (e, point) { | ||
var plotX = point && point.plotX, | ||
plotY = point && point.plotY, | ||
crossPos, | ||
axisPos = this.pos, | ||
axisLen = this.len; | ||
each(this.series, function (series) { | ||
series.isDirtyData = true; // Needed for Axis.update when choropleth colors change | ||
}); | ||
if (point) { | ||
crossPos = this.toPixels(point[point.series.colorKey]); | ||
if (crossPos < axisPos) { | ||
crossPos = axisPos - 2; | ||
} else if (crossPos > axisPos + axisLen) { | ||
crossPos = axisPos + axisLen + 2; | ||
} | ||
// When updating data classes, destroy old items and make sure new ones are created (#3207) | ||
if (newOptions.dataClasses && legend.allItems) { | ||
each(legend.allItems, function (item) { | ||
if (item.isDataClass) { | ||
item.legendGroup.destroy(); | ||
} | ||
}); | ||
chart.isDirtyLegend = true; | ||
} | ||
point.plotX = crossPos; | ||
point.plotY = this.len - crossPos; | ||
Axis.prototype.drawCrosshair.call(this, e, point); | ||
point.plotX = plotX; | ||
point.plotY = plotY; | ||
// Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is | ||
// not an array. (#3207) | ||
chart.options[this.coll] = merge(this.userOptions, newOptions); | ||
if (this.cross) { | ||
this.cross | ||
.attr({ | ||
fill: this.crosshair.color | ||
}) | ||
.add(this.legendGroup); | ||
} | ||
} | ||
}, | ||
getPlotLinePath: function (a, b, c, d, pos) { | ||
return typeof pos === 'number' ? // crosshairs only // #3969 pos can be 0 !! | ||
(this.horiz ? | ||
['M', pos - 4, this.top - 6, 'L', pos + 4, this.top - 6, pos, this.top, 'Z'] : | ||
['M', this.left, pos, 'L', this.left - 6, pos + 6, this.left - 6, pos - 6, 'Z'] | ||
) : | ||
Axis.prototype.getPlotLinePath.call(this, a, b, c, d); | ||
}, | ||
Axis.prototype.update.call(this, newOptions, redraw); | ||
if (this.legendItem) { | ||
this.setLegendColor(); | ||
legend.colorizeItem(this, true); | ||
} | ||
}, | ||
update: function (newOptions, redraw) { | ||
var chart = this.chart, | ||
legend = chart.legend; | ||
/** | ||
* Get the legend item symbols for data classes | ||
*/ | ||
getDataClassLegendSymbols: function () { | ||
var axis = this, | ||
chart = this.chart, | ||
legendItems = this.legendItems, | ||
legendOptions = chart.options.legend, | ||
valueDecimals = legendOptions.valueDecimals, | ||
valueSuffix = legendOptions.valueSuffix || '', | ||
name; | ||
each(this.series, function (series) { | ||
series.isDirtyData = true; // Needed for Axis.update when choropleth colors change | ||
}); | ||
if (!legendItems.length) { | ||
each(this.dataClasses, function (dataClass, i) { | ||
var vis = true, | ||
from = dataClass.from, | ||
to = dataClass.to; | ||
// Assemble the default name. This can be overridden by legend.options.labelFormatter | ||
name = ''; | ||
if (from === UNDEFINED) { | ||
name = '< '; | ||
} else if (to === UNDEFINED) { | ||
name = '> '; | ||
} | ||
if (from !== UNDEFINED) { | ||
name += Highcharts.numberFormat(from, valueDecimals) + valueSuffix; | ||
} | ||
if (from !== UNDEFINED && to !== UNDEFINED) { | ||
name += ' - '; | ||
} | ||
if (to !== UNDEFINED) { | ||
name += Highcharts.numberFormat(to, valueDecimals) + valueSuffix; | ||
} | ||
// Add a mock object to the legend items | ||
legendItems.push(extend({ | ||
chart: chart, | ||
name: name, | ||
options: {}, | ||
drawLegendSymbol: LegendSymbolMixin.drawRectangle, | ||
visible: true, | ||
setState: noop, | ||
isDataClass: true, | ||
setVisible: function () { | ||
vis = this.visible = !vis; | ||
each(axis.series, function (series) { | ||
each(series.points, function (point) { | ||
if (point.dataClass === i) { | ||
point.setVisible(vis); | ||
} | ||
}); | ||
}); | ||
chart.legend.colorizeItem(this, vis); | ||
} | ||
}, dataClass)); | ||
}); | ||
} | ||
return legendItems; | ||
}, | ||
name: '' // Prevents 'undefined' in legend in IE8 | ||
}); | ||
// When updating data classes, destroy old items and make sure new ones are created (#3207) | ||
if (newOptions.dataClasses && legend.allItems) { | ||
each(legend.allItems, function (item) { | ||
if (item.isDataClass) { | ||
item.legendGroup.destroy(); | ||
} | ||
}); | ||
chart.isDirtyLegend = true; | ||
} | ||
/** | ||
* Handle animation of the color attributes directly | ||
*/ | ||
each(['fill', 'stroke'], function (prop) { | ||
HighchartsAdapter.addAnimSetter(prop, function (fx) { | ||
fx.elem.attr(prop, ColorAxis.prototype.tweenColors(Color(fx.start), Color(fx.end), fx.pos)); | ||
}); | ||
}); | ||
// Keep the options structure updated for export. Unlike xAxis and yAxis, the colorAxis is | ||
// not an array. (#3207) | ||
chart.options[this.coll] = merge(this.userOptions, newOptions); | ||
/** | ||
* Extend the chart getAxes method to also get the color axis | ||
*/ | ||
wrap(Chart.prototype, 'getAxes', function (proceed) { | ||
Axis.prototype.update.call(this, newOptions, redraw); | ||
if (this.legendItem) { | ||
this.setLegendColor(); | ||
legend.colorizeItem(this, true); | ||
} | ||
}, | ||
var options = this.options, | ||
colorAxisOptions = options.colorAxis; | ||
/** | ||
* Get the legend item symbols for data classes | ||
*/ | ||
getDataClassLegendSymbols: function () { | ||
var axis = this, | ||
chart = this.chart, | ||
legendItems = this.legendItems, | ||
legendOptions = chart.options.legend, | ||
valueDecimals = legendOptions.valueDecimals, | ||
valueSuffix = legendOptions.valueSuffix || '', | ||
name; | ||
proceed.call(this); | ||
if (!legendItems.length) { | ||
each(this.dataClasses, function (dataClass, i) { | ||
var vis = true, | ||
from = dataClass.from, | ||
to = dataClass.to; | ||
this.colorAxis = []; | ||
if (colorAxisOptions) { | ||
proceed = new ColorAxis(this, colorAxisOptions); // Fake assignment for jsLint | ||
} | ||
}); | ||
// Assemble the default name. This can be overridden by legend.options.labelFormatter | ||
name = ''; | ||
if (from === UNDEFINED) { | ||
name = '< '; | ||
} else if (to === UNDEFINED) { | ||
name = '> '; | ||
} | ||
if (from !== UNDEFINED) { | ||
name += Highcharts.numberFormat(from, valueDecimals) + valueSuffix; | ||
} | ||
if (from !== UNDEFINED && to !== UNDEFINED) { | ||
name += ' - '; | ||
} | ||
if (to !== UNDEFINED) { | ||
name += Highcharts.numberFormat(to, valueDecimals) + valueSuffix; | ||
} | ||
// Add a mock object to the legend items | ||
legendItems.push(extend({ | ||
chart: chart, | ||
name: name, | ||
options: {}, | ||
drawLegendSymbol: LegendSymbolMixin.drawRectangle, | ||
visible: true, | ||
setState: noop, | ||
isDataClass: true, | ||
setVisible: function () { | ||
vis = this.visible = !vis; | ||
each(axis.series, function (series) { | ||
each(series.points, function (point) { | ||
if (point.dataClass === i) { | ||
point.setVisible(vis); | ||
} | ||
}); | ||
}); | ||
/** | ||
* Wrap the legend getAllItems method to add the color axis. This also removes the | ||
* axis' own series to prevent them from showing up individually. | ||
*/ | ||
wrap(Legend.prototype, 'getAllItems', function (proceed) { | ||
var allItems = [], | ||
colorAxis = this.chart.colorAxis[0]; | ||
chart.legend.colorizeItem(this, vis); | ||
} | ||
}, dataClass)); | ||
}); | ||
} | ||
return legendItems; | ||
}, | ||
name: '' // Prevents 'undefined' in legend in IE8 | ||
}); | ||
if (colorAxis) { | ||
/** | ||
* Handle animation of the color attributes directly | ||
*/ | ||
each(['fill', 'stroke'], function (prop) { | ||
Highcharts.addAnimSetter(prop, function (fx) { | ||
fx.elem.attr(prop, ColorAxis.prototype.tweenColors(Color(fx.start), Color(fx.end), fx.pos)); | ||
}); | ||
}); | ||
// Data classes | ||
if (colorAxis.options.dataClasses) { | ||
allItems = allItems.concat(colorAxis.getDataClassLegendSymbols()); | ||
// Gradient legend | ||
} else { | ||
// Add this axis on top | ||
allItems.push(colorAxis); | ||
} | ||
/** | ||
* Extend the chart getAxes method to also get the color axis | ||
*/ | ||
wrap(Chart.prototype, 'getAxes', function (proceed) { | ||
// Don't add the color axis' series | ||
each(colorAxis.series, function (series) { | ||
series.options.showInLegend = false; | ||
}); | ||
} | ||
var options = this.options, | ||
colorAxisOptions = options.colorAxis; | ||
return allItems.concat(proceed.call(this)); | ||
});/** | ||
* Mixin for maps and heatmaps | ||
*/ | ||
var colorPointMixin = { | ||
/** | ||
* Set the visibility of a single point | ||
*/ | ||
setVisible: function (vis) { | ||
var point = this, | ||
method = vis ? 'show' : 'hide'; | ||
proceed.call(this); | ||
// Show and hide associated elements | ||
each(['graphic', 'dataLabel'], function (key) { | ||
if (point[key]) { | ||
point[key][method](); | ||
} | ||
}); | ||
} | ||
}; | ||
var colorSeriesMixin = { | ||
this.colorAxis = []; | ||
if (colorAxisOptions) { | ||
new ColorAxis(this, colorAxisOptions); // eslint-disable-line no-new | ||
} | ||
}); | ||
pointAttrToOptions: { // mapping between SVG attributes and the corresponding options | ||
stroke: 'borderColor', | ||
'stroke-width': 'borderWidth', | ||
fill: 'color', | ||
dashstyle: 'dashStyle' | ||
}, | ||
pointArrayMap: ['value'], | ||
axisTypes: ['xAxis', 'yAxis', 'colorAxis'], | ||
optionalAxis: 'colorAxis', | ||
trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'], | ||
getSymbol: noop, | ||
parallelArrays: ['x', 'y', 'value'], | ||
colorKey: 'value', | ||
/** | ||
* In choropleth maps, the color is a result of the value, so this needs translation too | ||
*/ | ||
translateColors: function () { | ||
var series = this, | ||
nullColor = this.options.nullColor, | ||
colorAxis = this.colorAxis, | ||
colorKey = this.colorKey; | ||
each(this.data, function (point) { | ||
var value = point[colorKey], | ||
color; | ||
/** | ||
* Wrap the legend getAllItems method to add the color axis. This also removes the | ||
* axis' own series to prevent them from showing up individually. | ||
*/ | ||
wrap(Legend.prototype, 'getAllItems', function (proceed) { | ||
var allItems = [], | ||
colorAxis = this.chart.colorAxis[0]; | ||
color = point.options.color || | ||
(value === null ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color); | ||
if (colorAxis) { | ||
if (color) { | ||
point.color = color; | ||
} | ||
}); | ||
} | ||
}; | ||
/** | ||
* Extend the default options with map options | ||
*/ | ||
defaultOptions.plotOptions.heatmap = merge(defaultOptions.plotOptions.scatter, { | ||
animation: false, | ||
borderWidth: 0, | ||
nullColor: '#F8F8F8', | ||
dataLabels: { | ||
formatter: function () { // #2945 | ||
return this.point.value; | ||
}, | ||
inside: true, | ||
verticalAlign: 'middle', | ||
crop: false, | ||
overflow: false, | ||
padding: 0 // #3837 | ||
}, | ||
marker: null, | ||
pointRange: null, // dynamically set to colsize by default | ||
tooltip: { | ||
pointFormat: '{point.x}, {point.y}: {point.value}<br/>' | ||
}, | ||
states: { | ||
normal: { | ||
animation: true | ||
}, | ||
hover: { | ||
halo: false, // #3406, halo is not required on heatmaps | ||
brightness: 0.2 | ||
} | ||
} | ||
}); | ||
// Data classes | ||
if (colorAxis.options.dataClasses) { | ||
allItems = allItems.concat(colorAxis.getDataClassLegendSymbols()); | ||
// Gradient legend | ||
} else { | ||
// Add this axis on top | ||
allItems.push(colorAxis); | ||
} | ||
// The Heatmap series type | ||
seriesTypes.heatmap = extendClass(seriesTypes.scatter, merge(colorSeriesMixin, { | ||
type: 'heatmap', | ||
pointArrayMap: ['y', 'value'], | ||
hasPointSpecificOptions: true, | ||
pointClass: extendClass(Point, colorPointMixin), | ||
supportsDrilldown: true, | ||
getExtremesFromAll: true, | ||
directTouch: true, | ||
// Don't add the color axis' series | ||
each(colorAxis.series, function (series) { | ||
series.options.showInLegend = false; | ||
}); | ||
} | ||
/** | ||
* Override the init method to add point ranges on both axes. | ||
*/ | ||
init: function () { | ||
var options; | ||
seriesTypes.scatter.prototype.init.apply(this, arguments); | ||
return allItems.concat(proceed.call(this)); | ||
}); | ||
/** | ||
* Mixin for maps and heatmaps | ||
*/ | ||
var colorPointMixin = { | ||
/** | ||
* Set the visibility of a single point | ||
*/ | ||
setVisible: function (vis) { | ||
var point = this, | ||
method = vis ? 'show' : 'hide'; | ||
options = this.options; | ||
this.pointRange = options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData | ||
this.yAxis.axisPointRange = options.rowsize || 1; // general point range | ||
}, | ||
translate: function () { | ||
var series = this, | ||
options = series.options, | ||
xAxis = series.xAxis, | ||
yAxis = series.yAxis, | ||
between = function (x, a, b) { | ||
return Math.min(Math.max(a, x), b); | ||
}; | ||
// Show and hide associated elements | ||
each(['graphic', 'dataLabel'], function (key) { | ||
if (point[key]) { | ||
point[key][method](); | ||
} | ||
}); | ||
} | ||
}; | ||
var colorSeriesMixin = { | ||
series.generatePoints(); | ||
pointAttrToOptions: { // mapping between SVG attributes and the corresponding options | ||
stroke: 'borderColor', | ||
'stroke-width': 'borderWidth', | ||
fill: 'color', | ||
dashstyle: 'dashStyle' | ||
}, | ||
pointArrayMap: ['value'], | ||
axisTypes: ['xAxis', 'yAxis', 'colorAxis'], | ||
optionalAxis: 'colorAxis', | ||
trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'], | ||
getSymbol: noop, | ||
parallelArrays: ['x', 'y', 'value'], | ||
colorKey: 'value', | ||
each(series.points, function (point) { | ||
var xPad = (options.colsize || 1) / 2, | ||
yPad = (options.rowsize || 1) / 2, | ||
x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), 0, xAxis.len), | ||
x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), 0, xAxis.len), | ||
y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), 0, yAxis.len), | ||
y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), 0, yAxis.len); | ||
/** | ||
* In choropleth maps, the color is a result of the value, so this needs translation too | ||
*/ | ||
translateColors: function () { | ||
var series = this, | ||
nullColor = this.options.nullColor, | ||
colorAxis = this.colorAxis, | ||
colorKey = this.colorKey; | ||
// Set plotX and plotY for use in K-D-Tree and more | ||
point.plotX = point.clientX = (x1 + x2) / 2; | ||
point.plotY = (y1 + y2) / 2; | ||
each(this.data, function (point) { | ||
var value = point[colorKey], | ||
color; | ||
point.shapeType = 'rect'; | ||
point.shapeArgs = { | ||
x: Math.min(x1, x2), | ||
y: Math.min(y1, y2), | ||
width: Math.abs(x2 - x1), | ||
height: Math.abs(y2 - y1) | ||
}; | ||
}); | ||
series.translateColors(); | ||
color = point.options.color || | ||
(value === null ? nullColor : (colorAxis && value !== undefined) ? colorAxis.toColor(value, point) : point.color || series.color); | ||
// Make sure colors are updated on colorAxis update (#2893) | ||
if (this.chart.hasRendered) { | ||
each(series.points, function (point) { | ||
point.shapeArgs.fill = point.options.color || point.color; // #3311 | ||
}); | ||
} | ||
}, | ||
drawPoints: seriesTypes.column.prototype.drawPoints, | ||
animate: noop, | ||
getBox: noop, | ||
drawLegendSymbol: LegendSymbolMixin.drawRectangle, | ||
if (color) { | ||
point.color = color; | ||
} | ||
}); | ||
} | ||
}; | ||
getExtremes: function () { | ||
// Get the extremes from the value data | ||
Series.prototype.getExtremes.call(this, this.valueData); | ||
this.valueMin = this.dataMin; | ||
this.valueMax = this.dataMax; | ||
/** | ||
* Extend the default options with map options | ||
*/ | ||
defaultOptions.plotOptions.heatmap = merge(defaultOptions.plotOptions.scatter, { | ||
animation: false, | ||
borderWidth: 0, | ||
nullColor: '#F8F8F8', | ||
dataLabels: { | ||
formatter: function () { // #2945 | ||
return this.point.value; | ||
}, | ||
inside: true, | ||
verticalAlign: 'middle', | ||
crop: false, | ||
overflow: false, | ||
padding: 0 // #3837 | ||
}, | ||
marker: null, | ||
pointRange: null, // dynamically set to colsize by default | ||
tooltip: { | ||
pointFormat: '{point.x}, {point.y}: {point.value}<br/>' | ||
}, | ||
states: { | ||
normal: { | ||
animation: true | ||
}, | ||
hover: { | ||
halo: false, // #3406, halo is not required on heatmaps | ||
brightness: 0.2 | ||
} | ||
} | ||
}); | ||
// Get the extremes from the y data | ||
Series.prototype.getExtremes.call(this); | ||
} | ||
})); | ||
// The Heatmap series type | ||
seriesTypes.heatmap = extendClass(seriesTypes.scatter, merge(colorSeriesMixin, { | ||
type: 'heatmap', | ||
pointArrayMap: ['y', 'value'], | ||
hasPointSpecificOptions: true, | ||
pointClass: extendClass(Point, colorPointMixin), | ||
supportsDrilldown: true, | ||
getExtremesFromAll: true, | ||
directTouch: true, | ||
/** | ||
* Override the init method to add point ranges on both axes. | ||
*/ | ||
init: function () { | ||
var options; | ||
seriesTypes.scatter.prototype.init.apply(this, arguments); | ||
}(Highcharts)); | ||
options = this.options; | ||
options.pointRange = pick(options.pointRange, options.colsize || 1); // #3758, prevent resetting in setData | ||
this.yAxis.axisPointRange = options.rowsize || 1; // general point range | ||
}, | ||
translate: function () { | ||
var series = this, | ||
options = series.options, | ||
xAxis = series.xAxis, | ||
yAxis = series.yAxis, | ||
between = function (x, a, b) { | ||
return Math.min(Math.max(a, x), b); | ||
}; | ||
series.generatePoints(); | ||
each(series.points, function (point) { | ||
var xPad = (options.colsize || 1) / 2, | ||
yPad = (options.rowsize || 1) / 2, | ||
x1 = between(Math.round(xAxis.len - xAxis.translate(point.x - xPad, 0, 1, 0, 1)), 0, xAxis.len), | ||
x2 = between(Math.round(xAxis.len - xAxis.translate(point.x + xPad, 0, 1, 0, 1)), 0, xAxis.len), | ||
y1 = between(Math.round(yAxis.translate(point.y - yPad, 0, 1, 0, 1)), 0, yAxis.len), | ||
y2 = between(Math.round(yAxis.translate(point.y + yPad, 0, 1, 0, 1)), 0, yAxis.len); | ||
// Set plotX and plotY for use in K-D-Tree and more | ||
point.plotX = point.clientX = (x1 + x2) / 2; | ||
point.plotY = (y1 + y2) / 2; | ||
point.shapeType = 'rect'; | ||
point.shapeArgs = { | ||
x: Math.min(x1, x2), | ||
y: Math.min(y1, y2), | ||
width: Math.abs(x2 - x1), | ||
height: Math.abs(y2 - y1) | ||
}; | ||
}); | ||
series.translateColors(); | ||
// Make sure colors are updated on colorAxis update (#2893) | ||
if (this.chart.hasRendered) { | ||
each(series.points, function (point) { | ||
point.shapeArgs.fill = point.options.color || point.color; // #3311 | ||
}); | ||
} | ||
}, | ||
drawPoints: seriesTypes.column.prototype.drawPoints, | ||
animate: noop, | ||
getBox: noop, | ||
drawLegendSymbol: LegendSymbolMixin.drawRectangle, | ||
getExtremes: function () { | ||
// Get the extremes from the value data | ||
Series.prototype.getExtremes.call(this, this.valueData); | ||
this.valueMin = this.dataMin; | ||
this.valueMax = this.dataMax; | ||
// Get the extremes from the y data | ||
Series.prototype.getExtremes.call(this); | ||
} | ||
})); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
Plugin for displaying a message when there is no data visible in chart. | ||
@@ -10,4 +10,4 @@ | ||
*/ | ||
(function(c){function i(){return!!this.points.length}function e(){this.hasData()?this.hideNoData():this.showNoData()}var f=c.seriesTypes,d=c.Chart.prototype,g=c.getOptions(),h=c.extend,j=c.each;h(g.lang,{noData:"No data to display"});g.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};j(["pie","gauge","waterfall","bubble"],function(a){if(f[a])f[a].prototype.hasData=i});c.Series.prototype.hasData=function(){return this.visible&& | ||
this.dataMax!==void 0&&this.dataMin!==void 0};d.showNoData=function(a){var b=this.options,a=a||b.lang.noData,b=b.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(a,0,0,null,null,null,b.useHTML,null,"no-data").attr(b.attr).css(b.style).add(),this.noDataLabel.align(h(this.noDataLabel.getBBox(),b.position),!1,"plotBox")};d.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};d.hasData=function(){for(var a=this.series,b=a.length;b--;)if(a[b].hasData()&& | ||
!a[b].options.isInternal)return!0;return!1};d.callbacks.push(function(a){c.addEvent(a,"load",e);c.addEvent(a,"redraw",e)})})(Highcharts); | ||
(function(a){typeof module==="object"&&module.exports?module.exports=a:a(Highcharts)})(function(a){function h(){return!!this.points.length}function d(){this.hasData()?this.hideNoData():this.showNoData()}var e=a.seriesTypes,c=a.Chart.prototype,f=a.getOptions(),g=a.extend,i=a.each;g(f.lang,{noData:"No data to display"});f.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"},attr:{},style:{fontWeight:"bold",fontSize:"12px",color:"#60606a"}};i(["pie","gauge","waterfall","bubble"],function(b){if(e[b])e[b].prototype.hasData= | ||
h});a.Series.prototype.hasData=function(){return this.visible&&this.dataMax!==void 0&&this.dataMin!==void 0};c.showNoData=function(b){var a=this.options,b=b||a.lang.noData,a=a.noData;if(!this.noDataLabel)this.noDataLabel=this.renderer.label(b,0,0,null,null,null,a.useHTML,null,"no-data").attr(a.attr).css(a.style).add(),this.noDataLabel.align(g(this.noDataLabel.getBBox(),a.position),!1,"plotBox")};c.hideNoData=function(){if(this.noDataLabel)this.noDataLabel=this.noDataLabel.destroy()};c.hasData=function(){for(var a= | ||
this.series,c=a.length;c--;)if(a[c].hasData()&&!a[c].options.isInternal)return!0;return!1};c.callbacks.push(function(b){a.addEvent(b,"load",d);a.addEvent(b,"redraw",d)})}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* Plugin for displaying a message when there is no data visible in chart. | ||
@@ -11,3 +11,9 @@ * | ||
(function (H) { | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (H) { | ||
@@ -40,3 +46,3 @@ var seriesTypes = H.seriesTypes, | ||
} | ||
// useHTML: false // docs | ||
// useHTML: false | ||
}; | ||
@@ -139,2 +145,2 @@ | ||
}(Highcharts)); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
Client side exporting module | ||
@@ -9,7 +9,7 @@ | ||
*/ | ||
(function(d){d.CanVGRenderer={};d.Chart.prototype.exportChartLocal=function(x,y){var i=this,e=d.merge(i.options.exporting,x),q=navigator.userAgent.indexOf("WebKit")>-1&&navigator.userAgent.indexOf("Chrome")<0,l=e.scale||2,n,r=window.URL||window.webkitURL||window,f,s=0,o,m,t,g=function(){if(e.fallbackToExportServer===!1)throw"Fallback to export server disabled";i.exportChart(e)},u=function(a,b,c,g,k,d,e){var j=new Image;if(!q)j.crossOrigin="Anonymous";j.onload=function(){var h=document.createElement("canvas"), | ||
d=h.getContext&&h.getContext("2d"),i;if(d){h.height=j.height*l;h.width=j.width*l;d.drawImage(j,0,0,h.width,h.height);try{i=h.toDataURL(),c(i,b)}catch(f){if(f.name==="SecurityError"||f.name==="SECURITY_ERR"||f.message==="SecurityError")g(a,b);else throw f;}}else k(a,b);e&&e(a,b)};j.onerror=function(){d(a,b);e&&e(a,b)};j.src=a},v=function(a){try{if(!q&&navigator.userAgent.toLowerCase().indexOf("firefox")<0)return r.createObjectURL(new Blob([a],{type:"image/svg+xml;charset-utf-16"}))}catch(b){}return"data:image/svg+xml;charset=UTF-8,"+ | ||
encodeURIComponent(a)},p=function(a,b){var c=document.createElement("a"),d=(e.filename||"chart")+"."+b,k;if(navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(a,d);else if(typeof c.download!=="undefined")c.href=a,c.download=d,c.target="_blank",document.body.appendChild(c),c.click(),document.body.removeChild(c);else try{if(k=window.open(a,"chart"),typeof k==="undefined"||k===null)throw 1;}catch(g){window.location.href=a}},w=function(){var a,b,c=i.sanitizeSVG(n.innerHTML);if(e&&e.type==="image/svg+xml")try{navigator.msSaveOrOpenBlob? | ||
(b=new MSBlobBuilder,b.append(c),a=b.getBlob("image/svg+xml")):a=v(c),p(a,"svg")}catch(f){g()}else a=v(c),u(a,{},function(a){try{p(a,"png")}catch(c){g()}},function(){var a=document.createElement("canvas"),b=a.getContext("2d"),e=c.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*l,f=c.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*l,h=function(){b.drawSvg(c,0,0,e,f);try{p(navigator.msSaveOrOpenBlob?a.msToBlob():a.toDataURL("image/png"),"png")}catch(d){g()}};a.width=e;a.height=f;window.canvg? | ||
h():(i.showLoading(),HighchartsAdapter.getScript(d.getOptions().global.canvasToolsURL,function(){i.hideLoading();h()}))},g,g,function(){try{r.revokeObjectURL(a)}catch(b){}})};d.wrap(d.Chart.prototype,"getChartHTML",function(a){n=this.container.cloneNode(!0);return a.apply(this,Array.prototype.slice.call(arguments,1))});i.getSVGForExport(e,y);f=n.getElementsByTagName("image");try{f.length||w();var z=function(a,b){++s;b.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",a);s===f.length&& | ||
w()};for(m=0,t=f.length;m<t;++m)o=f[m],u(o.getAttributeNS("http://www.w3.org/1999/xlink","href"),{imageElement:o},z,g,g,g)}catch(A){g()}};d.getOptions().exporting.buttons.contextButton.menuItems=[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChartLocal()}},{textKey:"downloadSVG",onclick:function(){this.exportChartLocal({type:"image/svg+xml"})}}]})(Highcharts); | ||
(function(c){typeof module==="object"&&module.exports?module.exports=c:c(Highcharts)})(function(c){c.CanVGRenderer={};c.Chart.prototype.exportChartLocal=function(w,x){var i=this,e=c.merge(i.options.exporting,w),p=navigator.userAgent.indexOf("WebKit")>-1&&navigator.userAgent.indexOf("Chrome")<0,l=e.scale||2,m,q=window.URL||window.webkitURL||window,h,r=0,n,f,s,b=function(){if(e.fallbackToExportServer===!1)throw"Fallback to export server disabled";i.exportChart(e)},t=function(a,g,d,c,k,b,e){var j=new Image; | ||
if(!p)j.crossOrigin="Anonymous";j.onload=function(){var b=document.createElement("canvas"),i=b.getContext&&b.getContext("2d"),h;if(i){b.height=j.height*l;b.width=j.width*l;i.drawImage(j,0,0,b.width,b.height);try{h=b.toDataURL(),d(h,g)}catch(f){if(f.name==="SecurityError"||f.name==="SECURITY_ERR"||f.message==="SecurityError")c(a,g);else throw f;}}else k(a,g);e&&e(a,g)};j.onerror=function(){b(a,g);e&&e(a,g)};j.src=a},u=function(a){try{if(!p&&navigator.userAgent.toLowerCase().indexOf("firefox")<0)return q.createObjectURL(new Blob([a], | ||
{type:"image/svg+xml;charset-utf-16"}))}catch(b){}return"data:image/svg+xml;charset=UTF-8,"+encodeURIComponent(a)},o=function(a,b){var d=document.createElement("a"),c=(e.filename||"chart")+"."+b,k;if(navigator.msSaveOrOpenBlob)navigator.msSaveOrOpenBlob(a,c);else if(d.download!==void 0)d.href=a,d.download=c,d.target="_blank",document.body.appendChild(d),d.click(),document.body.removeChild(d);else try{if(k=window.open(a,"chart"),k===void 0||k===null)throw 1;}catch(i){window.location.href=a}},v=function(){var a, | ||
g,d=i.sanitizeSVG(m.innerHTML);if(e&&e.type==="image/svg+xml")try{navigator.msSaveOrOpenBlob?(g=new MSBlobBuilder,g.append(d),a=g.getBlob("image/svg+xml")):a=u(d),o(a,"svg")}catch(f){b()}else a=u(d),t(a,{},function(a){try{o(a,"png")}catch(c){b()}},function(){var a=document.createElement("canvas"),e=a.getContext("2d"),g=d.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*l,f=d.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1]*l,h=function(){e.drawSvg(d,0,0,g,f);try{o(navigator.msSaveOrOpenBlob? | ||
a.msToBlob():a.toDataURL("image/png"),"png")}catch(c){b()}};a.width=g;a.height=f;window.canvg?h():(i.showLoading(),c.getScript(c.getOptions().global.canvasToolsURL,function(){i.hideLoading();h()}))},b,b,function(){try{q.revokeObjectURL(a)}catch(b){}})},y=function(a,b){++r;b.imageElement.setAttributeNS("http://www.w3.org/1999/xlink","href",a);r===h.length&&v()};c.wrap(c.Chart.prototype,"getChartHTML",function(a){m=this.container.cloneNode(!0);return a.apply(this,Array.prototype.slice.call(arguments, | ||
1))});i.getSVGForExport(e,x);h=m.getElementsByTagName("image");try{h.length||v();for(f=0,s=h.length;f<s;++f)n=h[f],t(n.getAttributeNS("http://www.w3.org/1999/xlink","href"),{imageElement:n},y,b,b,b)}catch(z){b()}};c.getOptions().exporting.buttons.contextButton.menuItems=[{textKey:"printChart",onclick:function(){this.print()}},{separator:!0},{textKey:"downloadPNG",onclick:function(){this.exportChartLocal()}},{textKey:"downloadSVG",onclick:function(){this.exportChartLocal({type:"image/svg+xml"})}}]}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* Client side exporting module | ||
@@ -10,269 +10,272 @@ * | ||
// JSLint options: | ||
/*global Highcharts, HighchartsAdapter, document, window, Blob, MSBlobBuilder */ | ||
/*global MSBlobBuilder */ | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (Highcharts) { | ||
(function (Highcharts) { | ||
// Dummy object so we can reuse our canvas-tools.js without errors | ||
Highcharts.CanVGRenderer = {}; | ||
// Dummy object so we can reuse our canvas-tools.js without errors | ||
Highcharts.CanVGRenderer = {}; | ||
/** | ||
* Add a new method to the Chart object to perform a local download | ||
*/ | ||
Highcharts.Chart.prototype.exportChartLocal = function (exportingOptions, chartOptions) { | ||
var chart = this, | ||
options = Highcharts.merge(chart.options.exporting, exportingOptions), | ||
webKit = navigator.userAgent.indexOf('WebKit') > -1 && navigator.userAgent.indexOf('Chrome') < 0, // Webkit and not chrome | ||
scale = options.scale || 2, | ||
chartCopyContainer, | ||
domurl = window.URL || window.webkitURL || window, | ||
images, | ||
imagesEmbedded = 0, | ||
el, | ||
i, | ||
l, | ||
fallbackToExportServer = function () { | ||
if (options.fallbackToExportServer === false) { | ||
throw 'Fallback to export server disabled'; | ||
} | ||
chart.exportChart(options); | ||
}, | ||
// Get data:URL from image URL | ||
// Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional. | ||
// All callbacks receive two arguments: imageURL, and callbackArgs. callbackArgs is used only by callbacks and can contain whatever. | ||
imageToDataUrl = function (imageURL, callbackArgs, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) { | ||
var img = new Image(); | ||
if (!webKit) { | ||
img.crossOrigin = 'Anonymous'; // For some reason Safari chokes on this attribute | ||
} | ||
img.onload = function () { | ||
var canvas = document.createElement('canvas'), | ||
ctx = canvas.getContext && canvas.getContext('2d'), | ||
dataURL; | ||
/** | ||
* Add a new method to the Chart object to perform a local download | ||
*/ | ||
Highcharts.Chart.prototype.exportChartLocal = function (exportingOptions, chartOptions) { | ||
var chart = this, | ||
options = Highcharts.merge(chart.options.exporting, exportingOptions), | ||
webKit = navigator.userAgent.indexOf('WebKit') > -1 && navigator.userAgent.indexOf("Chrome") < 0, // Webkit and not chrome | ||
scale = options.scale || 2, | ||
chartCopyContainer, | ||
domurl = window.URL || window.webkitURL || window, | ||
images, | ||
imagesEmbedded = 0, | ||
el, | ||
i, | ||
l, | ||
fallbackToExportServer = function () { | ||
if (options.fallbackToExportServer === false) { | ||
throw 'Fallback to export server disabled'; | ||
} | ||
chart.exportChart(options); | ||
}, | ||
// Get data:URL from image URL | ||
// Pass in callbacks to handle results. finallyCallback is always called at the end of the process. Supplying this callback is optional. | ||
// All callbacks receive two arguments: imageURL, and callbackArgs. callbackArgs is used only by callbacks and can contain whatever. | ||
imageToDataUrl = function (imageURL, callbackArgs, successCallback, taintedCallback, noCanvasSupportCallback, failedLoadCallback, finallyCallback) { | ||
var img = new Image(); | ||
if (!webKit) { | ||
img.crossOrigin = 'Anonymous'; // For some reason Safari chokes on this attribute | ||
} | ||
img.onload = function () { | ||
var canvas = document.createElement('canvas'), | ||
ctx = canvas.getContext && canvas.getContext('2d'), | ||
dataURL; | ||
if (!ctx) { | ||
noCanvasSupportCallback(imageURL, callbackArgs); | ||
} else { | ||
canvas.height = img.height * scale; | ||
canvas.width = img.width * scale; | ||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height); | ||
if (!ctx) { | ||
noCanvasSupportCallback(imageURL, callbackArgs); | ||
} else { | ||
canvas.height = img.height * scale; | ||
canvas.width = img.width * scale; | ||
ctx.drawImage(img, 0, 0, canvas.width, canvas.height); | ||
// Now we try to get the contents of the canvas. | ||
try { | ||
dataURL = canvas.toDataURL(); | ||
successCallback(dataURL, callbackArgs); | ||
} catch (e) { | ||
// Failed - either tainted canvas or something else went horribly wrong | ||
if (e.name === 'SecurityError' || e.name === 'SECURITY_ERR' || e.message === 'SecurityError') { | ||
taintedCallback(imageURL, callbackArgs); | ||
} else { | ||
throw e; | ||
// Now we try to get the contents of the canvas. | ||
try { | ||
dataURL = canvas.toDataURL(); | ||
successCallback(dataURL, callbackArgs); | ||
} catch (e) { | ||
// Failed - either tainted canvas or something else went horribly wrong | ||
if (e.name === 'SecurityError' || e.name === 'SECURITY_ERR' || e.message === 'SecurityError') { | ||
taintedCallback(imageURL, callbackArgs); | ||
} else { | ||
throw e; | ||
} | ||
} | ||
} | ||
} | ||
if (finallyCallback) { | ||
finallyCallback(imageURL, callbackArgs); | ||
} | ||
}; | ||
img.onerror = function () { | ||
failedLoadCallback(imageURL, callbackArgs); | ||
if (finallyCallback) { | ||
finallyCallback(imageURL, callbackArgs); | ||
} | ||
}; | ||
img.src = imageURL; | ||
}, | ||
// Get blob URL from SVG code. Falls back to normal data URI. | ||
svgToDataUrl = function (svg) { | ||
try { | ||
// Safari requires data URI since it doesn't allow navigation to blob URLs | ||
// Firefox has an issue with Blobs and internal references, leading to gradients not working using Blobs (#4550) | ||
if (!webKit && navigator.userAgent.toLowerCase().indexOf('firefox') < 0) { | ||
return domurl.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset-utf-16'})); | ||
} | ||
} catch (e) { | ||
// Ignore | ||
} | ||
return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg); | ||
}, | ||
// Download contents by dataURL/blob | ||
download = function (dataURL, extension) { | ||
var a = document.createElement('a'), | ||
filename = (options.filename || 'chart') + '.' + extension, | ||
windowRef; | ||
// IE specific blob implementation | ||
if (navigator.msSaveOrOpenBlob) { | ||
navigator.msSaveOrOpenBlob(dataURL, filename); | ||
return; | ||
} | ||
// Try HTML5 download attr if supported | ||
if (typeof a.download !== 'undefined') { | ||
a.href = dataURL; | ||
a.download = filename; // HTML5 download attribute | ||
a.target = '_blank'; | ||
document.body.appendChild(a); | ||
a.click(); | ||
document.body.removeChild(a); | ||
} else { | ||
// No download attr, just opening data URI | ||
if (finallyCallback) { | ||
finallyCallback(imageURL, callbackArgs); | ||
} | ||
}; | ||
img.onerror = function () { | ||
failedLoadCallback(imageURL, callbackArgs); | ||
if (finallyCallback) { | ||
finallyCallback(imageURL, callbackArgs); | ||
} | ||
}; | ||
img.src = imageURL; | ||
}, | ||
// Get blob URL from SVG code. Falls back to normal data URI. | ||
svgToDataUrl = function (svg) { | ||
try { | ||
windowRef = window.open(dataURL, 'chart'); | ||
if (typeof windowRef === 'undefined' || windowRef === null) { | ||
throw 1; | ||
// Safari requires data URI since it doesn't allow navigation to blob URLs | ||
// Firefox has an issue with Blobs and internal references, leading to gradients not working using Blobs (#4550) | ||
if (!webKit && navigator.userAgent.toLowerCase().indexOf('firefox') < 0) { | ||
return domurl.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset-utf-16' })); | ||
} | ||
} catch (e) { | ||
// window.open failed, trying location.href | ||
window.location.href = dataURL; | ||
// Ignore | ||
} | ||
} | ||
}, | ||
// Get data URL to an image of the chart and call download on it | ||
initiateDownload = function () { | ||
var svgurl, | ||
blob, | ||
svg = chart.sanitizeSVG(chartCopyContainer.innerHTML); // SVG of chart copy | ||
return 'data:image/svg+xml;charset=UTF-8,' + encodeURIComponent(svg); | ||
}, | ||
// Download contents by dataURL/blob | ||
download = function (dataURL, extension) { | ||
var a = document.createElement('a'), | ||
filename = (options.filename || 'chart') + '.' + extension, | ||
windowRef; | ||
// Initiate download depending on file type | ||
if (options && options.type === 'image/svg+xml') { | ||
// SVG download. In this case, we want to use Microsoft specific Blob if available | ||
try { | ||
if (navigator.msSaveOrOpenBlob) { | ||
blob = new MSBlobBuilder(); | ||
blob.append(svg); | ||
svgurl = blob.getBlob('image/svg+xml'); | ||
} else { | ||
svgurl = svgToDataUrl(svg); | ||
} | ||
download(svgurl, 'svg'); | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
// IE specific blob implementation | ||
if (navigator.msSaveOrOpenBlob) { | ||
navigator.msSaveOrOpenBlob(dataURL, filename); | ||
return; | ||
} | ||
} else { | ||
// PNG download - create bitmap from SVG | ||
// First, try to get PNG by rendering on canvas | ||
svgurl = svgToDataUrl(svg); | ||
imageToDataUrl(svgurl, { /* args */ }, function (imageURL) { | ||
// Success | ||
// Try HTML5 download attr if supported | ||
if (a.download !== undefined) { | ||
a.href = dataURL; | ||
a.download = filename; // HTML5 download attribute | ||
a.target = '_blank'; | ||
document.body.appendChild(a); | ||
a.click(); | ||
document.body.removeChild(a); | ||
} else { | ||
// No download attr, just opening data URI | ||
try { | ||
download(imageURL, 'png'); | ||
windowRef = window.open(dataURL, 'chart'); | ||
if (windowRef === undefined || windowRef === null) { | ||
throw 1; | ||
} | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
// window.open failed, trying location.href | ||
window.location.href = dataURL; | ||
} | ||
}, function () { | ||
// Failed due to tainted canvas | ||
// Create new and untainted canvas | ||
var canvas = document.createElement('canvas'), | ||
ctx = canvas.getContext('2d'), | ||
imageWidth = svg.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, | ||
imageHeight = svg.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, | ||
downloadWithCanVG = function () { | ||
ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight); | ||
try { | ||
download(navigator.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL('image/png'), 'png'); | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
} | ||
}; | ||
} | ||
}, | ||
// Get data URL to an image of the chart and call download on it | ||
initiateDownload = function () { | ||
var svgurl, | ||
blob, | ||
svg = chart.sanitizeSVG(chartCopyContainer.innerHTML); // SVG of chart copy | ||
canvas.width = imageWidth; | ||
canvas.height = imageHeight; | ||
if (window.canvg) { | ||
// Use preloaded canvg | ||
downloadWithCanVG(); | ||
} else { | ||
// Must load canVG first | ||
chart.showLoading(); | ||
HighchartsAdapter.getScript(Highcharts.getOptions().global.canvasToolsURL, function () { | ||
chart.hideLoading(); | ||
downloadWithCanVG(); | ||
}); | ||
} | ||
}, | ||
// No canvas support | ||
fallbackToExportServer, | ||
// Failed to load image | ||
fallbackToExportServer, | ||
// Finally | ||
function () { | ||
// Initiate download depending on file type | ||
if (options && options.type === 'image/svg+xml') { | ||
// SVG download. In this case, we want to use Microsoft specific Blob if available | ||
try { | ||
domurl.revokeObjectURL(svgurl); | ||
if (navigator.msSaveOrOpenBlob) { | ||
blob = new MSBlobBuilder(); | ||
blob.append(svg); | ||
svgurl = blob.getBlob('image/svg+xml'); | ||
} else { | ||
svgurl = svgToDataUrl(svg); | ||
} | ||
download(svgurl, 'svg'); | ||
} catch (e) { | ||
// Ignore | ||
fallbackToExportServer(); | ||
} | ||
}); | ||
} | ||
}; | ||
} else { | ||
// PNG download - create bitmap from SVG | ||
// First, try to get PNG by rendering on canvas | ||
svgurl = svgToDataUrl(svg); | ||
imageToDataUrl(svgurl, { /* args */ }, function (imageURL) { | ||
// Success | ||
try { | ||
download(imageURL, 'png'); | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
} | ||
}, function () { | ||
// Failed due to tainted canvas | ||
// Create new and untainted canvas | ||
var canvas = document.createElement('canvas'), | ||
ctx = canvas.getContext('2d'), | ||
imageWidth = svg.match(/^<svg[^>]*width\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, | ||
imageHeight = svg.match(/^<svg[^>]*height\s*=\s*\"?(\d+)\"?[^>]*>/)[1] * scale, | ||
downloadWithCanVG = function () { | ||
ctx.drawSvg(svg, 0, 0, imageWidth, imageHeight); | ||
try { | ||
download(navigator.msSaveOrOpenBlob ? canvas.msToBlob() : canvas.toDataURL('image/png'), 'png'); | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
} | ||
}; | ||
// Hook into getSVG to get a copy of the chart copy's container | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'getChartHTML', function (proceed) { | ||
chartCopyContainer = this.container.cloneNode(true); | ||
return proceed.apply(this, Array.prototype.slice.call(arguments, 1)); | ||
}); | ||
canvas.width = imageWidth; | ||
canvas.height = imageHeight; | ||
if (window.canvg) { | ||
// Use preloaded canvg | ||
downloadWithCanVG(); | ||
} else { | ||
// Must load canVG first | ||
chart.showLoading(); | ||
Highcharts.getScript(Highcharts.getOptions().global.canvasToolsURL, function () { | ||
chart.hideLoading(); | ||
downloadWithCanVG(); | ||
}); | ||
} | ||
}, | ||
// No canvas support | ||
fallbackToExportServer, | ||
// Failed to load image | ||
fallbackToExportServer, | ||
// Finally | ||
function () { | ||
try { | ||
domurl.revokeObjectURL(svgurl); | ||
} catch (e) { | ||
// Ignore | ||
} | ||
}); | ||
} | ||
}, | ||
// Success handler, we converted image to base64! | ||
embeddedSuccess = function (imageURL, callbackArgs) { | ||
++imagesEmbedded; | ||
// Trigger hook to get chart copy | ||
chart.getSVGForExport(options, chartOptions); | ||
images = chartCopyContainer.getElementsByTagName('image'); | ||
// Change image href in chart copy | ||
callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL); | ||
try { | ||
// If there are no images to embed, just go ahead and start the download process | ||
if (!images.length) { | ||
initiateDownload(); | ||
} | ||
// Start download when done with the last image | ||
if (imagesEmbedded === images.length) { | ||
initiateDownload(); | ||
} | ||
}; | ||
// Success handler, we converted image to base64! | ||
function embeddedSuccess(imageURL, callbackArgs) { | ||
++imagesEmbedded; | ||
// Hook into getSVG to get a copy of the chart copy's container | ||
Highcharts.wrap(Highcharts.Chart.prototype, 'getChartHTML', function (proceed) { | ||
chartCopyContainer = this.container.cloneNode(true); | ||
return proceed.apply(this, Array.prototype.slice.call(arguments, 1)); | ||
}); | ||
// Change image href in chart copy | ||
callbackArgs.imageElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', imageURL); | ||
// Trigger hook to get chart copy | ||
chart.getSVGForExport(options, chartOptions); | ||
images = chartCopyContainer.getElementsByTagName('image'); | ||
// Start download when done with the last image | ||
if (imagesEmbedded === images.length) { | ||
try { | ||
// If there are no images to embed, just go ahead and start the download process | ||
if (!images.length) { | ||
initiateDownload(); | ||
} | ||
// Go through the images we want to embed | ||
for (i = 0, l = images.length; i < l; ++i) { | ||
el = images[i]; | ||
imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), { imageElement: el }, | ||
embeddedSuccess, | ||
// Tainted canvas | ||
fallbackToExportServer, | ||
// No canvas support | ||
fallbackToExportServer, | ||
// Failed to load source | ||
fallbackToExportServer | ||
); | ||
} | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
} | ||
}; | ||
// Go through the images we want to embed | ||
for (i = 0, l = images.length; i < l; ++i) { | ||
el = images[i]; | ||
imageToDataUrl(el.getAttributeNS('http://www.w3.org/1999/xlink', 'href'), { imageElement: el }, | ||
embeddedSuccess, | ||
// Tainted canvas | ||
fallbackToExportServer, | ||
// No canvas support | ||
fallbackToExportServer, | ||
// Failed to load source | ||
fallbackToExportServer | ||
); | ||
// Extend the default options to use the local exporter logic | ||
Highcharts.getOptions().exporting.buttons.contextButton.menuItems = [{ | ||
textKey: 'printChart', | ||
onclick: function () { | ||
this.print(); | ||
} | ||
} catch (e) { | ||
fallbackToExportServer(); | ||
} | ||
}; | ||
}, { | ||
separator: true | ||
}, { | ||
textKey: 'downloadPNG', | ||
onclick: function () { | ||
this.exportChartLocal(); | ||
} | ||
}, { | ||
textKey: 'downloadSVG', | ||
onclick: function () { | ||
this.exportChartLocal({ | ||
type: 'image/svg+xml' | ||
}); | ||
} | ||
}]; | ||
// Extend the default options to use the local exporter logic | ||
Highcharts.getOptions().exporting.buttons.contextButton.menuItems = [{ | ||
textKey: 'printChart', | ||
onclick: function () { | ||
this.print(); | ||
} | ||
}, { | ||
separator: true | ||
}, { | ||
textKey: 'downloadPNG', | ||
onclick: function () { | ||
this.exportChartLocal(); | ||
} | ||
}, { | ||
textKey: 'downloadSVG', | ||
onclick: function () { | ||
this.exportChartLocal({ | ||
type: 'image/svg+xml' | ||
}); | ||
} | ||
}]; | ||
}(Highcharts)); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
Solid angular gauge module | ||
@@ -9,7 +9,7 @@ | ||
*/ | ||
(function(a){var q=a.getOptions().plotOptions,r=a.pInt,s=a.pick,j=a.each,k;q.solidgauge=a.merge(q.gauge,{colorByPoint:!0});k={initDataClasses:function(b){var c=this,e=this.chart,d,o=0,f=this.options;this.dataClasses=d=[];j(b.dataClasses,function(g,h){var p,g=a.merge(g);d.push(g);if(!g.color)f.dataClassColor==="category"?(p=e.options.colors,g.color=p[o++],o===p.length&&(o=0)):g.color=c.tweenColors(a.Color(f.minColor),a.Color(f.maxColor),h/(b.dataClasses.length-1))})},initStops:function(b){this.stops= | ||
b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];j(this.stops,function(b){b.color=a.Color(b[1])})},toColor:function(b,c){var e,d=this.stops,a,f=this.dataClasses,g,h;if(f)for(h=f.length;h--;){if(g=f[h],a=g.from,d=g.to,(a===void 0||b>=a)&&(d===void 0||b<=d)){e=g.color;if(c)c.dataClass=h;break}}else{this.isLog&&(b=this.val2lin(b));e=1-(this.max-b)/(this.max-this.min);for(h=d.length;h--;)if(e>d[h][0])break;a=d[h]||d[h+1];d=d[h+1]||a;e=1-(d[0]-e)/(d[0]-a[0]||1);e=this.tweenColors(a.color, | ||
d.color,e)}return e},tweenColors:function(b,c,a){var d;!c.rgba.length||!b.rgba.length?b=c.raw||"none":(b=b.rgba,c=c.rgba,d=c[3]!==1||b[3]!==1,b=(d?"rgba(":"rgb(")+Math.round(c[0]+(b[0]-c[0])*(1-a))+","+Math.round(c[1]+(b[1]-c[1])*(1-a))+","+Math.round(c[2]+(b[2]-c[2])*(1-a))+(d?","+(c[3]+(b[3]-c[3])*(1-a)):"")+")");return b}};j(["fill","stroke"],function(b){HighchartsAdapter.addAnimSetter(b,function(c){c.elem.attr(b,k.tweenColors(a.Color(c.start),a.Color(c.end),c.pos))})});a.seriesTypes.solidgauge= | ||
a.extendClass(a.seriesTypes.gauge,{type:"solidgauge",pointAttrToOptions:{},bindAxes:function(){var b;a.seriesTypes.gauge.prototype.bindAxes.call(this);b=this.yAxis;a.extend(b,k);b.options.dataClasses&&b.initDataClasses(b.options);b.initStops(b.options)},drawPoints:function(){var b=this,c=b.yAxis,e=c.center,d=b.options,o=b.chart.renderer,f=d.overshoot,g=f&&typeof f==="number"?f/180*Math.PI:0;a.each(b.points,function(a){var f=a.graphic,i=c.startAngleRad+c.translate(a.y,null,null,null,!0),j=r(s(a.options.radius, | ||
d.radius,100))*e[2]/200,l=r(s(a.options.innerRadius,d.innerRadius,60))*e[2]/200,m=c.toColor(a.y,a),n=Math.min(c.startAngleRad,c.endAngleRad),k=Math.max(c.startAngleRad,c.endAngleRad);m==="none"&&(m=a.color||b.color||"none");if(m!=="none")a.color=m;i=Math.max(n-g,Math.min(k+g,i));d.wrap===!1&&(i=Math.max(n,Math.min(k,i)));n=Math.min(i,c.startAngleRad);i=Math.max(i,c.startAngleRad);i-n>2*Math.PI&&(i=n+2*Math.PI);a.shapeArgs=l={x:e[0],y:e[1],r:j,innerR:l,start:n,end:i,fill:m};a.startR=j;if(f){if(a=l.d, | ||
f.animate(l),a)l.d=a}else a.graphic=o.arc(l).attr({stroke:d.borderColor||"none","stroke-width":d.borderWidth||0,fill:m,"sweep-flag":0}).add(b.group)})},animate:function(b){if(!b)this.startAngleRad=this.yAxis.startAngleRad,a.seriesTypes.pie.prototype.animate.call(this,b)}})})(Highcharts); | ||
(function(a){typeof module==="object"&&module.exports?module.exports=a:a(Highcharts)})(function(a){var q=a.getOptions().plotOptions,r=a.pInt,s=a.pick,j=a.each,k;q.solidgauge=a.merge(q.gauge,{colorByPoint:!0});k={initDataClasses:function(b){var c=this,l=this.chart,d,g=0,e=this.options;this.dataClasses=d=[];j(b.dataClasses,function(f,h){var p,f=a.merge(f);d.push(f);if(!f.color)e.dataClassColor==="category"?(p=l.options.colors,f.color=p[g++],g===p.length&&(g=0)):f.color=c.tweenColors(a.Color(e.minColor), | ||
a.Color(e.maxColor),h/(b.dataClasses.length-1))})},initStops:function(b){this.stops=b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];j(this.stops,function(b){b.color=a.Color(b[1])})},toColor:function(b,c){var a,d=this.stops,g,e=this.dataClasses,f,h;if(e)for(h=e.length;h--;){if(f=e[h],g=f.from,d=f.to,(g===void 0||b>=g)&&(d===void 0||b<=d)){a=f.color;if(c)c.dataClass=h;break}}else{this.isLog&&(b=this.val2lin(b));a=1-(this.max-b)/(this.max-this.min);for(h=d.length;h--;)if(a>d[h][0])break; | ||
g=d[h]||d[h+1];d=d[h+1]||g;a=1-(d[0]-a)/(d[0]-g[0]||1);a=this.tweenColors(g.color,d.color,a)}return a},tweenColors:function(b,c,a){var d;!c.rgba.length||!b.rgba.length?b=c.input||"none":(b=b.rgba,c=c.rgba,d=c[3]!==1||b[3]!==1,b=(d?"rgba(":"rgb(")+Math.round(c[0]+(b[0]-c[0])*(1-a))+","+Math.round(c[1]+(b[1]-c[1])*(1-a))+","+Math.round(c[2]+(b[2]-c[2])*(1-a))+(d?","+(c[3]+(b[3]-c[3])*(1-a)):"")+")");return b}};j(["fill","stroke"],function(b){a.addAnimSetter(b,function(c){c.elem.attr(b,k.tweenColors(a.Color(c.start), | ||
a.Color(c.end),c.pos))})});a.seriesTypes.solidgauge=a.extendClass(a.seriesTypes.gauge,{type:"solidgauge",pointAttrToOptions:{},bindAxes:function(){var b;a.seriesTypes.gauge.prototype.bindAxes.call(this);b=this.yAxis;a.extend(b,k);b.options.dataClasses&&b.initDataClasses(b.options);b.initStops(b.options)},drawPoints:function(){var b=this,c=b.yAxis,l=c.center,d=b.options,g=b.chart.renderer,e=d.overshoot,f=e&&typeof e==="number"?e/180*Math.PI:0;a.each(b.points,function(a){var e=a.graphic,i=c.startAngleRad+ | ||
c.translate(a.y,null,null,null,!0),j=r(s(a.options.radius,d.radius,100))*l[2]/200,m=r(s(a.options.innerRadius,d.innerRadius,60))*l[2]/200,n=c.toColor(a.y,a),o=Math.min(c.startAngleRad,c.endAngleRad),k=Math.max(c.startAngleRad,c.endAngleRad);n==="none"&&(n=a.color||b.color||"none");if(n!=="none")a.color=n;i=Math.max(o-f,Math.min(k+f,i));d.wrap===!1&&(i=Math.max(o,Math.min(k,i)));o=Math.min(i,c.startAngleRad);i=Math.max(i,c.startAngleRad);i-o>2*Math.PI&&(i=o+2*Math.PI);a.shapeArgs=m={x:l[0],y:l[1], | ||
r:j,innerR:m,start:o,end:i,fill:n};a.startR=j;if(e){if(a=m.d,e.animate(m),a)m.d=a}else a.graphic=g.arc(m).attr({stroke:d.borderColor||"none","stroke-width":d.borderWidth||0,fill:n,"sweep-flag":0}).add(b.group)})},animate:function(b){if(!b)this.startAngleRad=this.yAxis.startAngleRad,a.seriesTypes.pie.prototype.animate.call(this,b)}})}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* Solid angular gauge module | ||
@@ -10,5 +10,10 @@ * | ||
/*global Highcharts, HighchartsAdapter*/ | ||
(function (H) { | ||
"use strict"; | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (H) { | ||
'use strict'; | ||
@@ -136,3 +141,3 @@ var defaultPlotOptions = H.getOptions().plotOptions, | ||
if (!to.rgba.length || !from.rgba.length) { | ||
ret = to.raw || 'none'; | ||
ret = to.input || 'none'; | ||
@@ -158,3 +163,3 @@ // Interpolate | ||
each(['fill', 'stroke'], function (prop) { | ||
HighchartsAdapter.addAnimSetter(prop, function (fx) { | ||
H.addAnimSetter(prop, function (fx) { | ||
fx.elem.attr(prop, colorAxisMethods.tweenColors(H.Color(fx.start), H.Color(fx.end), fx.pos)); | ||
@@ -202,3 +207,2 @@ }); | ||
toColor = yAxis.toColor(point.y, point), | ||
fromColor, | ||
axisMinAngle = Math.min(yAxis.startAngleRad, yAxis.endAngleRad), | ||
@@ -213,3 +217,2 @@ axisMaxAngle = Math.max(yAxis.startAngleRad, yAxis.endAngleRad), | ||
if (toColor !== 'none') { | ||
fromColor = point.color; | ||
point.color = toColor; | ||
@@ -275,2 +278,2 @@ } | ||
}(Highcharts)); | ||
})); |
/* | ||
Highstock JS v2.1.9 (2015-10-07) | ||
Highstock JS v2.1.10 (2015-12-07) | ||
@@ -9,23 +9,23 @@ (c) 2014 Highsoft AS | ||
*/ | ||
(function(h){var j=h.seriesTypes,A=h.map,o=h.merge,t=h.extend,u=h.extendClass,v=h.getOptions().plotOptions,w=function(){},k=h.each,r=HighchartsAdapter.grep,i=h.pick,m=h.Series,x=h.Color,B=function(a,b,c){var d,c=c||this;for(d in a)a.hasOwnProperty(d)&&b.call(c,a[d],d,a)},y=function(a,b,c,d){d=d||this;a=a||[];k(a,function(e,f){c=b.call(d,c,e,f,a)});return c},q=function(a,b,c){c=c||this;a=b.call(c,a);a!==!1&&q(a,b,c)};v.treemap=o(v.scatter,{showInLegend:!1,marker:!1,borderColor:"#E0E0E0",borderWidth:1, | ||
dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",formatter:function(){return this.point.name||this.point.id},inside:!0},tooltip:{headerFormat:"",pointFormat:"<b>{point.name}</b>: {point.node.val}</b><br/>"},layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,states:{hover:{borderColor:"#A0A0A0",brightness:j.heatmap?0:0.1,shadow:!1}},drillUpButton:{position:{align:"left",x:10,y:-50}}});j.treemap=u(j.scatter,o({pointAttrToOptions:{}, | ||
pointArrayMap:["value"],axisTypes:j.heatmap?["xAxis","yAxis","colorAxis"]:["xAxis","yAxis"],optionalAxis:"colorAxis",getSymbol:w,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",translateColors:j.heatmap&&j.heatmap.prototype.translateColors},{type:"treemap",trackerGroups:["group","dataLabelsGroup"],pointClass:u(h.Point,{setVisible:j.pie.prototype.pointClass.prototype.setVisible}),getListOfParents:function(a,b){var c=y(a,function(a,c,b){c=i(c.parent,"");a[c]===void 0&&(a[c]=[]); | ||
a[c].push(b);return a},{});B(c,function(a,c,f){c!==""&&HighchartsAdapter.inArray(c,b)===-1&&(k(a,function(a){f[""].push(a)}),delete f[c])});return c},getTree:function(){var a,b=this;a=A(this.data,function(a){return a.id});a=b.getListOfParents(this.data,a);b.nodeMap=[];a=b.buildNode("",-1,0,a,null);q(this.nodeMap[this.rootNode],function(a){var d=!1,e=a.parent;a.visible=!0;if(e||e==="")d=b.nodeMap[e];return d});q(this.nodeMap[this.rootNode].children,function(a){var b=!1;k(a,function(a){a.visible=!0; | ||
a.children.length&&(b=(b||[]).concat(a.children))});return b});this.setTreeValues(a);return a},init:function(a,b){m.prototype.init.call(this,a,b);this.options.allowDrillToNode&&this.drillTo()},buildNode:function(a,b,c,d,e){var f=this,g=[],n=f.points[b],z;k(d[a]||[],function(b){z=f.buildNode(f.points[b].id,b,c+1,d,a);g.push(z)});b={id:a,i:b,children:g,level:c,parent:e,visible:!1};f.nodeMap[b.id]=b;if(n)n.node=b;return b},setTreeValues:function(a){var b=this,c=b.options,d=0,e=[],f,g=b.points[a.i];k(a.children, | ||
function(a){a=b.setTreeValues(a);b.insertElementSorted(e,a,function(a,c){return a.val>c.val});a.ignore?q(a.children,function(a){var c=!1;k(a,function(a){t(a,{ignore:!0,isLeaf:!1,visible:!1});a.children.length&&(c=(c||[]).concat(a.children))});return c}):d+=a.val});f=i(g&&g.value,d);t(a,{children:e,childrenTotal:d,ignore:!(i(g&&g.visible,!0)&&f>0),isLeaf:a.visible&&!d,levelDynamic:c.levelIsConstant?a.level:a.level-b.nodeMap[b.rootNode].level,name:i(g&&g.name,""),val:f});return a},calculateChildrenAreas:function(a, | ||
b){var c=this,d=c.options,e=this.levelMap[a.levelDynamic+1],f=i(c[e&&e.layoutAlgorithm]&&e.layoutAlgorithm,d.layoutAlgorithm),g=d.alternateStartingDirection,n=[],d=r(a.children,function(a){return!a.ignore});if(e&&e.layoutStartingDirection)b.direction=e.layoutStartingDirection==="vertical"?0:1;n=c[f](b,d);k(d,function(a,d){var e=n[d];a.values=o(e,{val:a.childrenTotal,direction:g?1-b.direction:b.direction});a.pointValues=o(e,{x:e.x/c.axisRatio,width:e.width/c.axisRatio});a.children.length&&c.calculateChildrenAreas(a, | ||
a.values)})},setPointValues:function(){var a=this.xAxis,b=this.yAxis;k(this.points,function(c){var d=c.node.pointValues,e,f,g;d?(e=Math.round(a.translate(d.x,0,0,0,1)),f=Math.round(a.translate(d.x+d.width,0,0,0,1)),g=Math.round(b.translate(d.y,0,0,0,1)),d=Math.round(b.translate(d.y+d.height,0,0,0,1)),c.shapeType="rect",c.shapeArgs={x:Math.min(e,f),y:Math.min(g,d),width:Math.abs(f-e),height:Math.abs(d-g)},c.plotX=c.shapeArgs.x+c.shapeArgs.width/2,c.plotY=c.shapeArgs.y+c.shapeArgs.height/2):(delete c.plotX, | ||
delete c.plotY)})},setColorRecursive:function(a,b){var c=this,d,e;if(a){d=c.points[a.i];e=c.levelMap[a.levelDynamic];b=i(d&&d.options.color,e&&e.color,b);if(d)d.color=b;a.children.length&&k(a.children,function(a){c.setColorRecursive(a,b)})}},alg_func_group:function(a,b,c,d){this.height=a;this.width=b;this.plot=d;this.startDirection=this.direction=c;this.lH=this.nH=this.lW=this.nW=this.total=0;this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,c){return Math.max(a/ | ||
c,c/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;this.direction===0?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW,this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR= | ||
this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},alg_func_calcPoints:function(a,b,c,d){var e,f,g,n,h=c.lW,s=c.lH,l=c.plot,j,i=0,p=c.elArr.length-1;b?(h=c.nW,s=c.nH):j=c.elArr[c.elArr.length-1];k(c.elArr,function(a){if(b||i<p)c.direction===0?(e=l.x,f=l.y,g=h,n=a/g):(e=l.x,f=l.y,n=s,g=a/n),d.push({x:e,y:f,width:g,height:n}),c.direction===0?l.y+=n:l.x+=g;i+=1});c.reset();c.direction===0?c.width-=h:c.height-=s;l.y=l.parent.y+ | ||
(l.parent.height-c.height);l.x=l.parent.x+(l.parent.width-c.width);if(a)c.direction=1-c.direction;b||c.addElement(j)},alg_func_lowAspectRatio:function(a,b,c){var d=[],e=this,f,g={x:b.x,y:b.y,parent:b},h=0,j=c.length-1,i=new this.alg_func_group(b.height,b.width,b.direction,g);k(c,function(c){f=b.width*b.height*(c.val/b.val);i.addElement(f);i.lP.nR>i.lP.lR&&e.alg_func_calcPoints(a,!1,i,d,g);h===j&&e.alg_func_calcPoints(a,!0,i,d,g);h+=1});return d},alg_func_fill:function(a,b,c){var d=[],e,f=b.direction, | ||
g=b.x,h=b.y,i=b.width,j=b.height,l,o,m,p;k(c,function(c){e=b.width*b.height*(c.val/b.val);l=g;o=h;f===0?(p=j,m=e/p,i-=m,g+=m):(m=i,p=e/m,j-=p,h+=p);d.push({x:l,y:o,width:m,height:p});a&&(f=1-f)});return d},strip:function(a,b){return this.alg_func_lowAspectRatio(!1,a,b)},squarified:function(a,b){return this.alg_func_lowAspectRatio(!0,a,b)},sliceAndDice:function(a,b){return this.alg_func_fill(!0,a,b)},stripes:function(a,b){return this.alg_func_fill(!1,a,b)},translate:function(){var a,b;m.prototype.translate.call(this); | ||
if(this.points.length)this.rootNode=i(this.options.rootId,""),this.levelMap=y(this.options.levels,function(a,b){a[b.level]=b;return a},{}),b=this.tree=this.getTree(),this.axisRatio=this.xAxis.len/this.yAxis.len,this.nodeMap[""].pointValues=a={x:0,y:0,width:100,height:100},this.nodeMap[""].values=a=o(a,{width:a.width*this.axisRatio,direction:this.options.layoutStartingDirection==="vertical"?0:1,val:b.val}),this.calculateChildrenAreas(b,a);this.colorAxis?this.translateColors():this.options.colorByPoint|| | ||
this.setColorRecursive(this.tree,void 0);b=this.nodeMap[this.rootNode].pointValues;this.xAxis.setExtremes(b.x,b.x+b.width,!1);this.yAxis.setExtremes(b.y,b.y+b.height,!1);this.xAxis.setScale();this.yAxis.setScale();this.setPointValues()},drawDataLabels:function(){var a=this,b=r(a.points,function(a){return a.node.visible}),c,d;k(b,function(b){d=a.levelMap[b.node.levelDynamic];c={style:{}};if(!b.node.isLeaf)c.enabled=!1;if(d&&d.dataLabels)c=o(c,d.dataLabels),a._hasPointLabels=!0;if(b.shapeArgs)c.style.width= | ||
b.shapeArgs.width;b.dlOptions=o(c,b.options.dataLabels)});m.prototype.drawDataLabels.call(this)},alignDataLabel:j.column.prototype.alignDataLabel,pointAttribs:function(a,b){var c=this.levelMap[a.node.levelDynamic]||{},d=this.options,e=b&&d.states[b]||{},c={stroke:a.borderColor||c.borderColor||e.borderColor||d.borderColor,"stroke-width":i(a.borderWidth,c.borderWidth,e.borderWidth,d.borderWidth),dashstyle:a.borderDashStyle||c.borderDashStyle||e.borderDashStyle||d.borderDashStyle,fill:a.color||this.color}; | ||
if(b==="hover")c.zIndex=1;if(a.node.level<=this.nodeMap[this.rootNode].level)c.fill="none",c["stroke-width"]=0;else if(a.node.isLeaf){if(b)c.fill=x(c.fill).brighten(e.brightness).get()}else c.fill=i(d.interactByLeaf,!d.allowDrillToNode)?"none":x(c.fill).setOpacity(b==="hover"?0.75:0.15).get();return c},drawPoints:function(){var a=this,b=r(a.points,function(a){return a.node.visible});k(b,function(c){var b="levelGroup-"+c.node.levelDynamic;a[b]||(a[b]=a.chart.renderer.g(b).attr({zIndex:1E3-c.node.levelDynamic}).add(a.group)); | ||
c.group=a[b];c.pointAttr={"":a.pointAttribs(c),hover:a.pointAttribs(c,"hover"),select:{}}});j.column.prototype.drawPoints.call(this);a.options.allowDrillToNode&&k(b,function(b){var d;if(b.graphic)d=b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b),b.graphic.css({cursor:d?"pointer":"default"})})},insertElementSorted:function(a,b,c){var d=0,e=!1;a.length!==0&&k(a,function(f){c(b,f)&&!e&&(a.splice(d,0,b),e=!0);d+=1});e||a.push(b)},drillTo:function(){var a=this;h.addEvent(a,"click", | ||
function(b){var b=b.point,c=b.drillId,d;c&&(d=a.nodeMap[a.rootNode].name||a.rootNode,b.setState(""),a.drillToNode(c),a.showDrillUpButton(d))})},drillToByGroup:function(a){var b=!1;if(a.node.level-this.nodeMap[this.rootNode].level===1&&!a.node.isLeaf)b=a.id;return b},drillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!b;)if(a=this.nodeMap[a.parent],a.parent===this.rootNode)b=a.id;return b},drillUp:function(){var a=null;this.rootNode&&(a=this.nodeMap[this.rootNode], | ||
a=a.parent!==null?this.nodeMap[a.parent]:this.nodeMap[""]);if(a!==null)this.drillToNode(a.id),a.id===""?this.drillUpButton=this.drillUpButton.destroy():(a=this.nodeMap[a.parent],this.showDrillUpButton(a.name||a.id))},drillToNode:function(a){this.options.rootId=a;this.isDirty=!0;this.chart.redraw()},showDrillUpButton:function(a){var b=this,a=a||"< Back",c=b.options.drillUpButton,d,e;if(c.text)a=c.text;this.drillUpButton?this.drillUpButton.attr({text:a}).align():(e=(d=c.theme)&&d.states,this.drillUpButton= | ||
this.chart.renderer.button(a,null,null,function(){b.drillUp()},d,e&&e.hover,e&&e.select).attr({align:c.position.align,zIndex:9}).add().align(c.position,!1,c.relativeTo||"plotBox"))},buildKDTree:w,drawLegendSymbol:h.LegendSymbolMixin.drawRectangle,getExtremes:function(){m.prototype.getExtremes.call(this,this.colorValueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;m.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0, | ||
min:0,dataMin:0,minPadding:0,max:100,dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};m.prototype.bindAxes.call(this);h.extend(this.yAxis.options,a);h.extend(this.xAxis.options,a)}}))})(Highcharts); | ||
(function(f){typeof module==="object"&&module.exports?module.exports=f:f(Highcharts)})(function(f){var j=f.seriesTypes,A=f.map,o=f.merge,t=f.extend,u=f.extendClass,v=f.getOptions().plotOptions,w=function(){},k=f.each,s=f.grep,i=f.pick,m=f.Series,B=f.stableSort,x=f.Color,C=function(a,b,c){var d,c=c||this;for(d in a)a.hasOwnProperty(d)&&b.call(c,a[d],d,a)},y=function(a,b,c,d){d=d||this;a=a||[];k(a,function(e,g){c=b.call(d,c,e,g,a)});return c},r=function(a,b,c){c=c||this;a=b.call(c,a);a!==!1&&r(a,b, | ||
c)};v.treemap=o(v.scatter,{showInLegend:!1,marker:!1,borderColor:"#E0E0E0",borderWidth:1,dataLabels:{enabled:!0,defer:!1,verticalAlign:"middle",formatter:function(){return this.point.name||this.point.id},inside:!0},tooltip:{headerFormat:"",pointFormat:"<b>{point.name}</b>: {point.node.val}</b><br/>"},layoutAlgorithm:"sliceAndDice",layoutStartingDirection:"vertical",alternateStartingDirection:!1,levelIsConstant:!0,states:{hover:{borderColor:"#A0A0A0",brightness:j.heatmap?0:0.1,shadow:!1}},drillUpButton:{position:{align:"right", | ||
x:-10,y:10}}});j.treemap=u(j.scatter,o({pointAttrToOptions:{},pointArrayMap:["value"],axisTypes:j.heatmap?["xAxis","yAxis","colorAxis"]:["xAxis","yAxis"],optionalAxis:"colorAxis",getSymbol:w,parallelArrays:["x","y","value","colorValue"],colorKey:"colorValue",translateColors:j.heatmap&&j.heatmap.prototype.translateColors},{type:"treemap",trackerGroups:["group","dataLabelsGroup"],pointClass:u(f.Point,{setVisible:j.pie.prototype.pointClass.prototype.setVisible}),getListOfParents:function(a,b){var c= | ||
y(a,function(a,c,b){c=i(c.parent,"");a[c]===void 0&&(a[c]=[]);a[c].push(b);return a},{});C(c,function(a,c,g){c!==""&&f.inArray(c,b)===-1&&(k(a,function(a){g[""].push(a)}),delete g[c])});return c},getTree:function(){var a,b=this;a=A(this.data,function(a){return a.id});a=b.getListOfParents(this.data,a);b.nodeMap=[];a=b.buildNode("",-1,0,a,null);r(this.nodeMap[this.rootNode],function(a){var d=!1,e=a.parent;a.visible=!0;if(e||e==="")d=b.nodeMap[e];return d});r(this.nodeMap[this.rootNode].children,function(a){var b= | ||
!1;k(a,function(a){a.visible=!0;a.children.length&&(b=(b||[]).concat(a.children))});return b});this.setTreeValues(a);return a},init:function(a,b){m.prototype.init.call(this,a,b);this.options.allowDrillToNode&&this.drillTo()},buildNode:function(a,b,c,d,e){var g=this,h=[],z=g.points[b],q;k(d[a]||[],function(b){q=g.buildNode(g.points[b].id,b,c+1,d,a);h.push(q)});b={id:a,i:b,children:h,level:c,parent:e,visible:!1};g.nodeMap[b.id]=b;if(z)z.node=b;return b},setTreeValues:function(a){var b=this,c=b.options, | ||
d=0,e=[],g,h=b.points[a.i];k(a.children,function(a){a=b.setTreeValues(a);e.push(a);a.ignore?r(a.children,function(a){var c=!1;k(a,function(a){t(a,{ignore:!0,isLeaf:!1,visible:!1});a.children.length&&(c=(c||[]).concat(a.children))});return c}):d+=a.val});B(e,function(a,c){return a.sortIndex-c.sortIndex});g=i(h&&h.value,d);t(a,{children:e,childrenTotal:d,ignore:!(i(h&&h.visible,!0)&&g>0),isLeaf:a.visible&&!d,levelDynamic:c.levelIsConstant?a.level:a.level-b.nodeMap[b.rootNode].level,name:i(h&&h.name, | ||
""),sortIndex:i(h&&h.sortIndex,-g),val:g});return a},calculateChildrenAreas:function(a,b){var c=this,d=c.options,e=this.levelMap[a.levelDynamic+1],g=i(c[e&&e.layoutAlgorithm]&&e.layoutAlgorithm,d.layoutAlgorithm),h=d.alternateStartingDirection,f=[],d=s(a.children,function(a){return!a.ignore});if(e&&e.layoutStartingDirection)b.direction=e.layoutStartingDirection==="vertical"?0:1;f=c[g](b,d);k(d,function(a,d){var e=f[d];a.values=o(e,{val:a.childrenTotal,direction:h?1-b.direction:b.direction});a.pointValues= | ||
o(e,{x:e.x/c.axisRatio,width:e.width/c.axisRatio});a.children.length&&c.calculateChildrenAreas(a,a.values)})},setPointValues:function(){var a=this.xAxis,b=this.yAxis;k(this.points,function(c){var d=c.node.pointValues,e,g,h;d?(e=Math.round(a.translate(d.x,0,0,0,1)),g=Math.round(a.translate(d.x+d.width,0,0,0,1)),h=Math.round(b.translate(d.y,0,0,0,1)),d=Math.round(b.translate(d.y+d.height,0,0,0,1)),c.shapeType="rect",c.shapeArgs={x:Math.min(e,g),y:Math.min(h,d),width:Math.abs(g-e),height:Math.abs(d- | ||
h)},c.plotX=c.shapeArgs.x+c.shapeArgs.width/2,c.plotY=c.shapeArgs.y+c.shapeArgs.height/2):(delete c.plotX,delete c.plotY)})},setColorRecursive:function(a,b){var c=this,d,e;if(a){d=c.points[a.i];e=c.levelMap[a.levelDynamic];b=i(d&&d.options.color,e&&e.color,b);if(d)d.color=b;a.children.length&&k(a.children,function(a){c.setColorRecursive(a,b)})}},algorithmGroup:function(a,b,c,d){this.height=a;this.width=b;this.plot=d;this.startDirection=this.direction=c;this.lH=this.nH=this.lW=this.nW=this.total=0; | ||
this.elArr=[];this.lP={total:0,lH:0,nH:0,lW:0,nW:0,nR:0,lR:0,aspectRatio:function(a,c){return Math.max(a/c,c/a)}};this.addElement=function(a){this.lP.total=this.elArr[this.elArr.length-1];this.total+=a;this.direction===0?(this.lW=this.nW,this.lP.lH=this.lP.total/this.lW,this.lP.lR=this.lP.aspectRatio(this.lW,this.lP.lH),this.nW=this.total/this.height,this.lP.nH=this.lP.total/this.nW,this.lP.nR=this.lP.aspectRatio(this.nW,this.lP.nH)):(this.lH=this.nH,this.lP.lW=this.lP.total/this.lH,this.lP.lR=this.lP.aspectRatio(this.lP.lW, | ||
this.lH),this.nH=this.total/this.width,this.lP.nW=this.lP.total/this.nH,this.lP.nR=this.lP.aspectRatio(this.lP.nW,this.nH));this.elArr.push(a)};this.reset=function(){this.lW=this.nW=0;this.elArr=[];this.total=0}},algorithmCalcPoints:function(a,b,c,d){var e,g,h,f,q=c.lW,n=c.lH,l=c.plot,i,j=0,p=c.elArr.length-1;b?(q=c.nW,n=c.nH):i=c.elArr[c.elArr.length-1];k(c.elArr,function(a){if(b||j<p)c.direction===0?(e=l.x,g=l.y,h=q,f=a/h):(e=l.x,g=l.y,f=n,h=a/f),d.push({x:e,y:g,width:h,height:f}),c.direction=== | ||
0?l.y+=f:l.x+=h;j+=1});c.reset();c.direction===0?c.width-=q:c.height-=n;l.y=l.parent.y+(l.parent.height-c.height);l.x=l.parent.x+(l.parent.width-c.width);if(a)c.direction=1-c.direction;b||c.addElement(i)},algorithmLowAspectRatio:function(a,b,c){var d=[],e=this,g,f={x:b.x,y:b.y,parent:b},i=0,j=c.length-1,n=new this.algorithmGroup(b.height,b.width,b.direction,f);k(c,function(c){g=b.width*b.height*(c.val/b.val);n.addElement(g);n.lP.nR>n.lP.lR&&e.algorithmCalcPoints(a,!1,n,d,f);i===j&&e.algorithmCalcPoints(a, | ||
!0,n,d,f);i+=1});return d},algorithmFill:function(a,b,c){var d=[],e,f=b.direction,h=b.x,i=b.y,j=b.width,n=b.height,l,o,m,p;k(c,function(c){e=b.width*b.height*(c.val/b.val);l=h;o=i;f===0?(p=n,m=e/p,j-=m,h+=m):(m=j,p=e/m,n-=p,i+=p);d.push({x:l,y:o,width:m,height:p});a&&(f=1-f)});return d},strip:function(a,b){return this.algorithmLowAspectRatio(!1,a,b)},squarified:function(a,b){return this.algorithmLowAspectRatio(!0,a,b)},sliceAndDice:function(a,b){return this.algorithmFill(!0,a,b)},stripes:function(a, | ||
b){return this.algorithmFill(!1,a,b)},translate:function(){var a,b;m.prototype.translate.call(this);this.rootNode=i(this.options.rootId,"");this.levelMap=y(this.options.levels,function(a,b){a[b.level]=b;return a},{});b=this.tree=this.getTree();this.axisRatio=this.xAxis.len/this.yAxis.len;this.nodeMap[""].pointValues=a={x:0,y:0,width:100,height:100};this.nodeMap[""].values=a=o(a,{width:a.width*this.axisRatio,direction:this.options.layoutStartingDirection==="vertical"?0:1,val:b.val});this.calculateChildrenAreas(b, | ||
a);this.colorAxis?this.translateColors():this.options.colorByPoint||this.setColorRecursive(this.tree,void 0);b=this.nodeMap[this.rootNode].pointValues;this.xAxis.setExtremes(b.x,b.x+b.width,!1);this.yAxis.setExtremes(b.y,b.y+b.height,!1);this.xAxis.setScale();this.yAxis.setScale();this.setPointValues()},drawDataLabels:function(){var a=this,b=s(a.points,function(a){return a.node.visible}),c,d;k(b,function(b){d=a.levelMap[b.node.levelDynamic];c={style:{}};if(!b.node.isLeaf)c.enabled=!1;if(d&&d.dataLabels)c= | ||
o(c,d.dataLabels),a._hasPointLabels=!0;if(b.shapeArgs)c.style.width=b.shapeArgs.width;b.dlOptions=o(c,b.options.dataLabels)});m.prototype.drawDataLabels.call(this)},alignDataLabel:j.column.prototype.alignDataLabel,pointAttribs:function(a,b){var c=this.levelMap[a.node.levelDynamic]||{},d=this.options,e=b&&d.states[b]||{},c={stroke:a.borderColor||c.borderColor||e.borderColor||d.borderColor,"stroke-width":i(a.borderWidth,c.borderWidth,e.borderWidth,d.borderWidth),dashstyle:a.borderDashStyle||c.borderDashStyle|| | ||
e.borderDashStyle||d.borderDashStyle,fill:a.color||this.color,zIndex:b==="hover"?1:0};if(a.node.level<=this.nodeMap[this.rootNode].level)c.fill="none",c["stroke-width"]=0;else if(a.node.isLeaf){if(b)c.fill=x(c.fill).brighten(e.brightness).get()}else c.fill=i(d.interactByLeaf,!d.allowDrillToNode)?"none":x(c.fill).setOpacity(b==="hover"?0.75:0.15).get();return c},drawPoints:function(){var a=this,b=s(a.points,function(a){return a.node.visible});k(b,function(c){var b="levelGroup-"+c.node.levelDynamic; | ||
a[b]||(a[b]=a.chart.renderer.g(b).attr({zIndex:1E3-c.node.levelDynamic}).add(a.group));c.group=a[b];c.pointAttr={"":a.pointAttribs(c),hover:a.pointAttribs(c,"hover"),select:{}}});j.column.prototype.drawPoints.call(this);a.options.allowDrillToNode&&k(b,function(b){var d;if(b.graphic)d=b.drillId=a.options.interactByLeaf?a.drillToByLeaf(b):a.drillToByGroup(b),b.graphic.css({cursor:d?"pointer":"default"})})},drillTo:function(){var a=this;f.addEvent(a,"click",function(b){var b=b.point,c=b.drillId,d;c&& | ||
(d=a.nodeMap[a.rootNode].name||a.rootNode,b.setState(""),a.drillToNode(c),a.showDrillUpButton(d))})},drillToByGroup:function(a){var b=!1;if(a.node.level-this.nodeMap[this.rootNode].level===1&&!a.node.isLeaf)b=a.id;return b},drillToByLeaf:function(a){var b=!1;if(a.node.parent!==this.rootNode&&a.node.isLeaf)for(a=a.node;!b;)if(a=this.nodeMap[a.parent],a.parent===this.rootNode)b=a.id;return b},drillUp:function(){var a=null;this.rootNode&&(a=this.nodeMap[this.rootNode],a=a.parent!==null?this.nodeMap[a.parent]: | ||
this.nodeMap[""]);if(a!==null)this.drillToNode(a.id),a.id===""?this.drillUpButton=this.drillUpButton.destroy():(a=this.nodeMap[a.parent],this.showDrillUpButton(a.name||a.id))},drillToNode:function(a){this.options.rootId=a;this.isDirty=!0;this.chart.redraw()},showDrillUpButton:function(a){var b=this,a=a||"< Back",c=b.options.drillUpButton,d,e;if(c.text)a=c.text;this.drillUpButton?this.drillUpButton.attr({text:a}).align():(e=(d=c.theme)&&d.states,this.drillUpButton=this.chart.renderer.button(a,null, | ||
null,function(){b.drillUp()},d,e&&e.hover,e&&e.select).attr({align:c.position.align,zIndex:9}).add().align(c.position,!1,c.relativeTo||"plotBox"))},buildKDTree:w,drawLegendSymbol:f.LegendSymbolMixin.drawRectangle,getExtremes:function(){m.prototype.getExtremes.call(this,this.colorValueData);this.valueMin=this.dataMin;this.valueMax=this.dataMax;m.prototype.getExtremes.call(this)},getExtremesFromAll:!0,bindAxes:function(){var a={endOnTick:!1,gridLineWidth:0,lineWidth:0,min:0,dataMin:0,minPadding:0,max:100, | ||
dataMax:100,maxPadding:0,startOnTick:!1,title:null,tickPositions:[]};m.prototype.bindAxes.call(this);f.extend(this.yAxis.options,a);f.extend(this.xAxis.options,a)}}))}); |
/** | ||
* @license Highstock JS v2.1.9 (2015-10-07) | ||
* @license Highstock JS v2.1.10 (2015-12-07) | ||
* | ||
@@ -10,4 +10,9 @@ * (c) 2014 Highsoft AS | ||
/*global HighchartsAdapter */ | ||
(function (H) { | ||
(function (factory) { | ||
if (typeof module === 'object' && module.exports) { | ||
module.exports = factory; | ||
} else { | ||
factory(Highcharts); | ||
} | ||
}(function (H) { | ||
var seriesTypes = H.seriesTypes, | ||
@@ -20,7 +25,9 @@ map = H.map, | ||
plotOptions = defaultOptions.plotOptions, | ||
noop = function () { return; }, | ||
noop = function () { | ||
}, | ||
each = H.each, | ||
grep = HighchartsAdapter.grep, | ||
grep = H.grep, | ||
pick = H.pick, | ||
Series = H.Series, | ||
stableSort = H.stableSort, | ||
Color = H.Color, | ||
@@ -86,5 +93,5 @@ eachObject = function (list, func, context) { | ||
position: { | ||
align: 'left', | ||
x: 10, | ||
y: -50 | ||
align: 'right', | ||
x: -10, | ||
y: 10 | ||
} | ||
@@ -123,3 +130,3 @@ } | ||
var listOfParents = reduce(data, function (prev, curr, i) { | ||
var parent = pick(curr.parent, ""); | ||
var parent = pick(curr.parent, ''); | ||
if (prev[parent] === undefined) { | ||
@@ -134,5 +141,5 @@ prev[parent] = []; | ||
eachObject(listOfParents, function (children, parent, list) { | ||
if ((parent !== "") && (HighchartsAdapter.inArray(parent, ids) === -1)) { | ||
if ((parent !== '') && (H.inArray(parent, ids) === -1)) { | ||
each(children, function (child) { | ||
list[""].push(child); | ||
list[''].push(child); | ||
}); | ||
@@ -156,3 +163,3 @@ delete list[parent]; | ||
series.nodeMap = []; | ||
tree = series.buildNode("", -1, 0, parentList, null); | ||
tree = series.buildNode('', -1, 0, parentList, null); | ||
recursive(this.nodeMap[this.rootNode], function (node) { | ||
@@ -162,3 +169,3 @@ var next = false, | ||
node.visible = true; | ||
if (p || p === "") { | ||
if (p || p === '') { | ||
next = series.nodeMap[p]; | ||
@@ -218,3 +225,3 @@ } | ||
childrenTotal = 0, | ||
sorted = [], | ||
children = [], | ||
val, | ||
@@ -226,5 +233,3 @@ point = series.points[tree.i]; | ||
child = series.setTreeValues(child); | ||
series.insertElementSorted(sorted, child, function (el, el2) { | ||
return el.val > el2.val; | ||
}); | ||
children.push(child); | ||
@@ -251,7 +256,10 @@ if (!child.ignore) { | ||
}); | ||
// Sort the children | ||
stableSort(children, function (a, b) { | ||
return a.sortIndex - b.sortIndex; | ||
}); | ||
// Set the values | ||
val = pick(point && point.value, childrenTotal); | ||
extend(tree, { | ||
children: sorted, | ||
children: children, | ||
childrenTotal: childrenTotal, | ||
@@ -262,3 +270,4 @@ // Ignore this node if point is not visible | ||
levelDynamic: (options.levelIsConstant ? tree.level : (tree.level - series.nodeMap[series.rootNode].level)), | ||
name: pick(point && point.name, ""), | ||
name: pick(point && point.name, ''), | ||
sortIndex: pick(point && point.sortIndex, -val), | ||
val: val | ||
@@ -361,3 +370,3 @@ }); | ||
}, | ||
alg_func_group: function (h, w, d, p) { | ||
algorithmGroup: function (h, w, d, p) { | ||
this.height = h; | ||
@@ -417,3 +426,3 @@ this.width = w; | ||
}, | ||
alg_func_calcPoints: function (directionChange, last, group, childrenArea) { | ||
algorithmCalcPoints: function (directionChange, last, group, childrenArea) { | ||
var pX, | ||
@@ -479,3 +488,3 @@ pY, | ||
}, | ||
alg_func_lowAspectRatio: function (directionChange, parent, children) { | ||
algorithmLowAspectRatio: function (directionChange, parent, children) { | ||
var childrenArea = [], | ||
@@ -492,3 +501,3 @@ series = this, | ||
end = children.length - 1, | ||
group = new this.alg_func_group(parent.height, parent.width, direction, plot); | ||
group = new this.algorithmGroup(parent.height, parent.width, direction, plot); | ||
// Loop through and calculate all areas | ||
@@ -499,7 +508,7 @@ each(children, function (child) { | ||
if (group.lP.nR > group.lP.lR) { | ||
series.alg_func_calcPoints(directionChange, false, group, childrenArea, plot); | ||
series.algorithmCalcPoints(directionChange, false, group, childrenArea, plot); | ||
} | ||
// If last child, then calculate all remaining areas | ||
if (i === end) { | ||
series.alg_func_calcPoints(directionChange, true, group, childrenArea, plot); | ||
series.algorithmCalcPoints(directionChange, true, group, childrenArea, plot); | ||
} | ||
@@ -510,3 +519,3 @@ i = i + 1; | ||
}, | ||
alg_func_fill: function (directionChange, parent, children) { | ||
algorithmFill: function (directionChange, parent, children) { | ||
var childrenArea = [], | ||
@@ -551,12 +560,12 @@ pTot, | ||
strip: function (parent, children) { | ||
return this.alg_func_lowAspectRatio(false, parent, children); | ||
return this.algorithmLowAspectRatio(false, parent, children); | ||
}, | ||
squarified: function (parent, children) { | ||
return this.alg_func_lowAspectRatio(true, parent, children); | ||
return this.algorithmLowAspectRatio(true, parent, children); | ||
}, | ||
sliceAndDice: function (parent, children) { | ||
return this.alg_func_fill(true, parent, children); | ||
return this.algorithmFill(true, parent, children); | ||
}, | ||
stripes: function (parent, children) { | ||
return this.alg_func_fill(false, parent, children); | ||
return this.algorithmFill(false, parent, children); | ||
}, | ||
@@ -572,22 +581,20 @@ translate: function () { | ||
if (this.points.length) { | ||
// Assign variables | ||
this.rootNode = pick(this.options.rootId, ""); | ||
// Create a object map from level to options | ||
this.levelMap = reduce(this.options.levels, function (arr, item) { | ||
arr[item.level] = item; | ||
return arr; | ||
}, {}); | ||
tree = this.tree = this.getTree(); // @todo Only if series.isDirtyData is true | ||
// Assign variables | ||
this.rootNode = pick(this.options.rootId, ''); | ||
// Create a object map from level to options | ||
this.levelMap = reduce(this.options.levels, function (arr, item) { | ||
arr[item.level] = item; | ||
return arr; | ||
}, {}); | ||
tree = this.tree = this.getTree(); // @todo Only if series.isDirtyData is true | ||
// Calculate plotting values. | ||
this.axisRatio = (this.xAxis.len / this.yAxis.len); | ||
this.nodeMap[""].pointValues = pointValues = {x: 0, y: 0, width: 100, height: 100 }; | ||
this.nodeMap[""].values = seriesArea = merge(pointValues, { | ||
width: (pointValues.width * this.axisRatio), | ||
direction: (this.options.layoutStartingDirection === 'vertical' ? 0 : 1), | ||
val: tree.val | ||
}); | ||
this.calculateChildrenAreas(tree, seriesArea); | ||
} | ||
// Calculate plotting values. | ||
this.axisRatio = (this.xAxis.len / this.yAxis.len); | ||
this.nodeMap[''].pointValues = pointValues = { x: 0, y: 0, width: 100, height: 100 }; | ||
this.nodeMap[''].values = seriesArea = merge(pointValues, { | ||
width: (pointValues.width * this.axisRatio), | ||
direction: (this.options.layoutStartingDirection === 'vertical' ? 0 : 1), | ||
val: tree.val | ||
}); | ||
this.calculateChildrenAreas(tree, seriesArea); | ||
@@ -627,3 +634,3 @@ // Logic for point colors | ||
// Set options to new object to avoid problems with scope | ||
options = {style: {}}; | ||
options = { style: {} }; | ||
@@ -668,13 +675,10 @@ // If not a leaf, then label should be disabled as default | ||
'dashstyle': point.borderDashStyle || level.borderDashStyle || stateOptions.borderDashStyle || options.borderDashStyle, | ||
'fill': point.color || this.color | ||
'fill': point.color || this.color, | ||
'zIndex': state === 'hover' ? 1 : 0 | ||
}; | ||
if (state === 'hover') { | ||
attr.zIndex = 1; | ||
} | ||
if (point.node.level <= this.nodeMap[this.rootNode].level) { | ||
// Hide levels above the current view | ||
attr.fill = 'none'; | ||
attr["stroke-width"] = 0; | ||
attr['stroke-width'] = 0; | ||
} else if (!point.node.isLeaf) { | ||
@@ -702,3 +706,3 @@ // If not a leaf, then remove fill | ||
each(points, function (point) { | ||
var groupKey = "levelGroup-" + point.node.levelDynamic; | ||
var groupKey = 'levelGroup-' + point.node.levelDynamic; | ||
if (!series[groupKey]) { | ||
@@ -729,3 +733,3 @@ series[groupKey] = series.chart.renderer.g(groupKey) | ||
drillId = point.drillId = series.options.interactByLeaf ? series.drillToByLeaf(point) : series.drillToByGroup(point); | ||
cursor = drillId ? "pointer" : "default"; | ||
cursor = drillId ? 'pointer' : 'default'; | ||
point.graphic.css({ cursor: cursor }); | ||
@@ -737,25 +741,2 @@ } | ||
/** | ||
* Inserts an element into an array, sorted by a condition. | ||
* Modifies the referenced array | ||
* @param {*[]} arr The array which the element is inserted into. | ||
* @param {*} el The element to insert. | ||
* @param {function} cond The condition to sort on. First parameter is el, second parameter is array element | ||
*/ | ||
insertElementSorted: function (arr, el, cond) { | ||
var i = 0, | ||
inserted = false; | ||
if (arr.length !== 0) { | ||
each(arr, function (arrayElement) { | ||
if (cond(el, arrayElement) && !inserted) { | ||
arr.splice(i, 0, el); | ||
inserted = true; | ||
} | ||
i = i + 1; | ||
}); | ||
} | ||
if (!inserted) { | ||
arr.push(el); | ||
} | ||
}, | ||
/** | ||
* Add drilling on the suitable points | ||
@@ -822,3 +803,3 @@ */ | ||
} else { | ||
drillPoint = this.nodeMap[""]; | ||
drillPoint = this.nodeMap['']; | ||
} | ||
@@ -829,3 +810,3 @@ } | ||
this.drillToNode(drillPoint.id); | ||
if (drillPoint.id === "") { | ||
if (drillPoint.id === '') { | ||
this.drillUpButton = this.drillUpButton.destroy(); | ||
@@ -913,2 +894,2 @@ } else { | ||
})); | ||
}(Highcharts)); | ||
})); |
@@ -5,7 +5,8 @@ { | ||
"homepage": "http://www.highcharts.com", | ||
"version": "v2.1.9", | ||
"version": "v2.1.10", | ||
"main": "highstock.js", | ||
"repository": { | ||
"type": "git", | ||
"url": "https://github.com/highslide-software/highstock-release" | ||
"url": "https://github.com/highcharts/highstock-release" | ||
} | ||
} |
@@ -70,3 +70,3 @@ /** | ||
background2: '#F0F0EA' | ||
}; | ||
@@ -73,0 +73,0 @@ |
@@ -100,3 +100,3 @@ /** | ||
background2: '#E0E0E8' | ||
}; | ||
@@ -103,0 +103,0 @@ |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
2030957
36972