From 4af9ba953315e66c89dfb78d5db8c8c40f375f2d Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 3 Feb 2012 14:54:50 +0100 Subject: [PATCH] first Highcharts chart sample in WindPanel --- .../domain/tracking/impl/TrackedRaceImpl.java | 2 +- java/com.sap.sailing.gwt.ui/.classpath | 1 + java/com.sap.sailing.gwt.ui/AdminConsole.html | 10 +- .../META-INF/MANIFEST.MF | 3 +- .../WEB-INF/lib/Highcharts-2.1.9.zip | Bin 0 -> 234888 bytes .../org.moxieapps.gwt.highcharts-1.1.3.jar | Bin 0 -> 309619 bytes java/com.sap.sailing.gwt.ui/build.properties | 4 +- .../js/adapters/mootools-adapter.js | 12 + .../js/adapters/mootools-adapter.src.js | 264 + .../js/adapters/prototype-adapter.js | 15 + .../js/adapters/prototype-adapter.src.js | 331 + .../highcharts/js/highcharts.js | 176 + .../highcharts/js/highcharts.src.js | 11454 ++++++++++++++++ .../highcharts/js/modules/exporting.js | 24 + .../highcharts/js/modules/exporting.src.js | 758 + .../highcharts/js/themes/dark-blue.js | 263 + .../highcharts/js/themes/dark-green.js | 263 + .../highcharts/js/themes/gray.js | 262 + .../highcharts/js/themes/grid.js | 96 + java/com.sap.sailing.gwt.ui/pom.xml | 5 + .../gwt/ui/adminconsole/WindChart.java | 345 +- .../sap/sailing/gwt/ui/AdminConsole.gwt.xml | 1 + 22 files changed, 14104 insertions(+), 185 deletions(-) mode change 100755 => 100644 java/com.sap.sailing.gwt.ui/AdminConsole.html create mode 100755 java/com.sap.sailing.gwt.ui/WEB-INF/lib/Highcharts-2.1.9.zip create mode 100755 java/com.sap.sailing.gwt.ui/WEB-INF/lib/org.moxieapps.gwt.highcharts-1.1.3.jar create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.src.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.src.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.src.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.src.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-blue.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-green.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/themes/gray.js create mode 100644 java/com.sap.sailing.gwt.ui/highcharts/js/themes/grid.js diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java index 3f44b8f85d8..2731964678c 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/TrackedRaceImpl.java @@ -701,7 +701,7 @@ public abstract class TrackedRaceImpl implements TrackedRace, CourseListener { private Map> clusterBearingsForWindEstimation(TimePoint timePoint, DummyMarkPassingWithTimePointOnly dummyMarkPassingForNow, Weigher weigher) { - Weigher weigherForMarkPassingProximity = new LinearTimeDifferenceWeigher(getMillisecondsOverWhichToAverageSpeed()); + Weigher weigherForMarkPassingProximity = new LinearTimeDifferenceWeigher(getMillisecondsOverWhichToAverageSpeed()*5); Map> bearings = new HashMap>(); for (LegType legType : LegType.values()) { bearings.put(legType, new BearingWithConfidenceCluster(weigher)); diff --git a/java/com.sap.sailing.gwt.ui/.classpath b/java/com.sap.sailing.gwt.ui/.classpath index e200ef32b85..ce808c49c63 100755 --- a/java/com.sap.sailing.gwt.ui/.classpath +++ b/java/com.sap.sailing.gwt.ui/.classpath @@ -9,5 +9,6 @@ + diff --git a/java/com.sap.sailing.gwt.ui/AdminConsole.html b/java/com.sap.sailing.gwt.ui/AdminConsole.html old mode 100755 new mode 100644 index e6bc65a151a..5a67464c360 --- a/java/com.sap.sailing.gwt.ui/AdminConsole.html +++ b/java/com.sap.sailing.gwt.ui/AdminConsole.html @@ -18,11 +18,11 @@ SAP Sailing Analytics Administration Console - + + + + + diff --git a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF index 0d3aec7b0b9..fb63098df79 100755 --- a/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF +++ b/java/com.sap.sailing.gwt.ui/META-INF/MANIFEST.MF @@ -39,4 +39,5 @@ Web-ContextPath: /gwt Bundle-ClassPath: WEB-INF/classes/, WEB-INF/lib/gflot-1.0.1.jar, WEB-INF/lib/gwt-maps.jar, - WEB-INF/lib/gwt-servlet.jar + WEB-INF/lib/gwt-servlet.jar, + WEB-INF/lib/org.moxieapps.gwt.highcharts-1.1.3.jar diff --git a/java/com.sap.sailing.gwt.ui/WEB-INF/lib/Highcharts-2.1.9.zip b/java/com.sap.sailing.gwt.ui/WEB-INF/lib/Highcharts-2.1.9.zip new file mode 100755 index 0000000000000000000000000000000000000000..7a0c97888294bd75ad13cf4e52a139d17dac459b GIT binary patch literal 234888 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 literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/WEB-INF/lib/org.moxieapps.gwt.highcharts-1.1.3.jar b/java/com.sap.sailing.gwt.ui/WEB-INF/lib/org.moxieapps.gwt.highcharts-1.1.3.jar new file mode 100755 index 0000000000000000000000000000000000000000..cbf2faaf83df1f5b8724361623da6cc034202a97 GIT binary patch literal 309619 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

L(i8BO|X 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%0DsV*~yk5&_+u+xiAU8@r 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 literal 0 HcmV?d00001 diff --git a/java/com.sap.sailing.gwt.ui/build.properties b/java/com.sap.sailing.gwt.ui/build.properties index 3bedfb7183e..5ea57549b64 100755 --- a/java/com.sap.sailing.gwt.ui/build.properties +++ b/java/com.sap.sailing.gwt.ui/build.properties @@ -24,5 +24,7 @@ bin.includes = META-INF/,\ RaceBoard.html,\ Spectator.html,\ com.sap.sailing.gwt.ui.Spectator/,\ - com.sap.sailing.gwt.ui.RaceBoard/ + com.sap.sailing.gwt.ui.RaceBoard/,\ + WEB-INF/lib/org.moxieapps.gwt.highcharts-1.1.3.jar,\ + highcharts/ output.. = WEB-INF/classes/ diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.js b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.js new file mode 100644 index 00000000000..18cf75971d5 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.js @@ -0,0 +1,12 @@ +/* + Highcharts JS v2.1.9 (2011-11-11) + MooTools adapter + + (c) 2010-2011 Torstein H?nsi + + License: www.highcharts.com/license +*/ +(function(){var e=window,h=e.MooTools.version.substring(0,3),i=h==="1.2"||h==="1.1",m=i||h==="1.3",j=e.$extend||function(){return Object.append.apply(Object,arguments)};e.HighchartsAdapter={init:function(a){var b=Fx.prototype,c=b.start,d=Fx.Morph.prototype,g=d.compute;b.start=function(f){var k=this.element;if(f.d)this.paths=a.init(k,k.d,this.toD);c.apply(this,arguments);return this};d.compute=function(f,k,n){var l=this.paths;if(l)this.element.attr("d",a.step(l[0],l[1],n,this.toD));else return g.apply(this, +arguments)}},animate:function(a,b,c){var d=a.attr,g=c&&c.complete;if(d&&!a.setStyle){a.getStyle=a.attr;a.setStyle=function(){var f=arguments;a.attr.call(a,f[0],f[1][0])};a.$family=a.uid=true}e.HighchartsAdapter.stop(a);c=new Fx.Morph(d?a:$(a),j({transition:Fx.Transitions.Quad.easeInOut},c));if(b.d)c.toD=b.d;g&&c.addEvent("complete",g);c.start(b);a.fx=c},each:function(a,b){return i?$each(a,b):a.each(b)},map:function(a,b){return a.map(b)},grep:function(a,b){return a.filter(b)},merge:function(){var a= +arguments,b=[{}],c=a.length;if(i)a=$merge.apply(null,a);else{for(;c--;)if(typeof a[c]!=="boolean")b[c+1]=a[c];a=Object.merge.apply(Object,b)}return a},extendWithEvents:function(a){a.addEvent||(a.nodeName?$(a):j(a,new Events))},addEvent:function(a,b,c){if(typeof b==="string"){if(b==="unload")b="beforeunload";e.HighchartsAdapter.extendWithEvents(a);a.addEvent(b,c)}},removeEvent:function(a,b,c){if(typeof a!=="string"){e.HighchartsAdapter.extendWithEvents(a);if(b){if(b==="unload")b="beforeunload";c?a.removeEvent(b, +c):a.removeEvents(b)}else a.removeEvents()}},fireEvent:function(a,b,c,d){b={type:b,target:a};b=m?new Event(b):new DOMEvent(b);b=j(b,c);b.preventDefault=function(){d=null};a.fireEvent&&a.fireEvent(b.type,b);d&&d(b)},stop:function(a){a.fx&&a.fx.cancel()}}})(); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.src.js b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.src.js new file mode 100644 index 00000000000..ccd606e8811 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/mootools-adapter.src.js @@ -0,0 +1,264 @@ +/** + * @license Highcharts JS v2.1.9 (2011-11-11) + * MooTools adapter + * + * (c) 2010-2011 Torstein Hønsi + * + * License: www.highcharts.com/license + */ + +// JSLint options: +/*global Fx, $, $extend, $each, $merge, Events, Event, DOMEvent */ + +(function () { + +var win = window, + mooVersion = win.MooTools.version.substring(0, 3), // Get the first three characters of the version number + legacy = mooVersion === '1.2' || mooVersion === '1.1', // 1.1 && 1.2 considered legacy, 1.3 is not. + legacyEvent = legacy || mooVersion === '1.3', // In versions 1.1 - 1.3 the event class is named Event, in newer versions it is named DOMEvent. + $extend = win.$extend || function () { + return Object.append.apply(Object, arguments); + }; + +win.HighchartsAdapter = { + /** + * Initialize the adapter. This is run once as Highcharts is first run. + * @param {Object} pathAnim The helper object to do animations across adapters. + */ + init: function (pathAnim) { + var fxProto = Fx.prototype, + fxStart = fxProto.start, + morphProto = Fx.Morph.prototype, + morphCompute = morphProto.compute; + + // override Fx.start to allow animation of SVG element wrappers + /*jslint unparam: true*//* allow unused parameters in fx functions */ + fxProto.start = function (from, to) { + var fx = this, + elem = fx.element; + + // special for animating paths + if (from.d) { + //this.fromD = this.element.d.split(' '); + fx.paths = pathAnim.init( + elem, + elem.d, + fx.toD + ); + } + fxStart.apply(fx, arguments); + + return this; // chainable + }; + + // override Fx.step to allow animation of SVG element wrappers + morphProto.compute = function (from, to, delta) { + var fx = this, + paths = fx.paths; + + if (paths) { + fx.element.attr( + 'd', + pathAnim.step(paths[0], paths[1], delta, fx.toD) + ); + } else { + return morphCompute.apply(fx, arguments); + } + }; + /*jslint unparam: false*/ + }, + + /** + * Animate a HTML element or SVG element wrapper + * @param {Object} el + * @param {Object} params + * @param {Object} options jQuery-like animation options: duration, easing, callback + */ + animate: function (el, params, options) { + var isSVGElement = el.attr, + effect, + complete = options && options.complete; + + if (isSVGElement && !el.setStyle) { + // add setStyle and getStyle methods for internal use in Moo + el.getStyle = el.attr; + el.setStyle = function () { // property value is given as array in Moo - break it down + var args = arguments; + el.attr.call(el, args[0], args[1][0]); + }; + // dirty hack to trick Moo into handling el as an element wrapper + el.$family = el.uid = true; + } + + // stop running animations + win.HighchartsAdapter.stop(el); + + // define and run the effect + effect = new Fx.Morph( + isSVGElement ? el : $(el), + $extend({ + transition: Fx.Transitions.Quad.easeInOut + }, options) + ); + + // special treatment for paths + if (params.d) { + effect.toD = params.d; + } + + // jQuery-like events + if (complete) { + effect.addEvent('complete', complete); + } + + // run + effect.start(params); + + // record for use in stop method + el.fx = effect; + }, + + /** + * MooTool's each function + * + */ + each: function (arr, fn) { + return legacy ? + $each(arr, fn) : + arr.each(fn); + }, + + /** + * Map an array + * @param {Array} arr + * @param {Function} fn + */ + map: function (arr, fn) { + return arr.map(fn); + }, + + /** + * Grep or filter an array + * @param {Array} arr + * @param {Function} fn + */ + grep: function (arr, fn) { + return arr.filter(fn); + }, + + /** + * Deep merge two objects and return a third + */ + merge: function () { + var args = arguments, + args13 = [{}], // MooTools 1.3+ + i = args.length, + ret; + + if (legacy) { + ret = $merge.apply(null, args); + } else { + while (i--) { + // Boolean argumens should not be merged. + // JQuery explicitly skips this, so we do it here as well. + if (typeof args[i] !== 'boolean') { + args13[i + 1] = args[i]; + } + } + ret = Object.merge.apply(Object, args13); + } + + return ret; + }, + + /** + * Extends an object with Events, if its not done + */ + extendWithEvents: function (el) { + // if the addEvent method is not defined, el is a custom Highcharts object + // like series or point + if (!el.addEvent) { + if (el.nodeName) { + el = $(el); // a dynamically generated node + } else { + $extend(el, new Events()); // a custom object + } + } + }, + + /** + * Add an event listener + * @param {Object} el HTML element or custom object + * @param {String} type Event type + * @param {Function} fn Event handler + */ + addEvent: function (el, type, fn) { + if (typeof type === 'string') { // chart broke due to el being string, type function + + if (type === 'unload') { // Moo self destructs before custom unload events + type = 'beforeunload'; + } + + win.HighchartsAdapter.extendWithEvents(el); + + el.addEvent(type, fn); + } + }, + + removeEvent: function (el, type, fn) { + if (typeof el === 'string') { + // el.removeEvents below apperantly calls this method again. Do not quite understand why, so for now just bail out. + return; + } + win.HighchartsAdapter.extendWithEvents(el); + if (type) { + if (type === 'unload') { // Moo self destructs before custom unload events + type = 'beforeunload'; + } + + if (fn) { + el.removeEvent(type, fn); + } else { + el.removeEvents(type); + } + } else { + el.removeEvents(); + } + }, + + fireEvent: function (el, event, eventArguments, defaultFunction) { + var eventArgs = { + type: event, + target: el + }; + // create an event object that keeps all functions + event = legacyEvent ? new Event(eventArgs) : new DOMEvent(eventArgs); + event = $extend(event, eventArguments); + // override the preventDefault function to be able to use + // this for custom events + event.preventDefault = function () { + defaultFunction = null; + }; + // if fireEvent is not available on the object, there hasn't been added + // any events to it above + if (el.fireEvent) { + el.fireEvent(event.type, event); + } + + // fire the default if it is passed and it is not prevented above + if (defaultFunction) { + defaultFunction(event); + } + }, + + /** + * Stop running animations on the object + */ + stop: function (el) { + if (el.fx) { + el.fx.cancel(); + } + } +}; + +}()); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.js b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.js new file mode 100644 index 00000000000..735851e917c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/adapters/prototype-adapter.js @@ -0,0 +1,15 @@ +/* + Highcharts JS v2.1.9 (2011-11-11) + Prototype adapter + + @author Michael Nelson, Torstein H?nsi. + + Feel free to use and modify this script. + Highcharts license: www.highcharts.com/license. +*/ +var HighchartsAdapter=function(){var g=typeof Effect!=="undefined";return{init:function(c){if(g)Effect.HighchartsTransition=Class.create(Effect.Base,{initialize:function(a,b,d,e){var f;this.element=a;this.key=b;f=a.attr(b);if(b==="d"){this.paths=c.init(a,a.d,d);this.toD=d;f=0;d=1}this.start(Object.extend(e||{},{from:f,to:d,attribute:b}))},setup:function(){HighchartsAdapter._extend(this.element);if(!this.element._highchart_animation)this.element._highchart_animation={};this.element._highchart_animation[this.key]= +this},update:function(a){var b=this.paths;if(b)a=c.step(b[0],b[1],a,this.toD);this.element.attr(this.options.attribute,a)},finish:function(){delete this.element._highchart_animation[this.key]}})},addNS:function(c){var a=/^(?:click|mouse(?:down|up|over|move|out))$/;return/^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/.test(c)||a.test(c)?c:"h:"+c},addEvent:function(c,a,b){if(c.addEventListener||c.attachEvent)Event.observe($(c),HighchartsAdapter.addNS(a),b);else{HighchartsAdapter._extend(c); +c._highcharts_observe(a,b)}},animate:function(c,a,b){var d;b=b||{};b.delay=0;b.duration=(b.duration||500)/1E3;if(g)for(d in a)new Effect.HighchartsTransition($(c),d,a[d],b);else for(d in a)c.attr(d,a[d]);if(!c.attr)throw"Todo: implement animate DOM objects";},stop:function(c){var a;if(c._highcharts_extended&&c._highchart_animation)for(a in c._highchart_animation)c._highchart_animation[a].cancel()},each:function(c,a){$A(c).each(a)},fireEvent:function(c,a,b,d){if(c.fire)c.fire(HighchartsAdapter.addNS(a), +b);else if(c._highcharts_extended){b=b||{};c._highcharts_fire(a,b)}if(b&&b.defaultPrevented)d=null;d&&d(b)},removeEvent:function(c,a,b){if($(c).stopObserving){if(a)a=HighchartsAdapter.addNS(a);$(c).stopObserving(a,b)}if(window===c)Event.stopObserving(c,a,b);else{HighchartsAdapter._extend(c);c._highcharts_stop_observing(a,b)}},grep:function(c,a){return c.findAll(a)},map:function(c,a){return c.map(a)},merge:function(){function c(a,b){var d,e;for(e in b){d=b[e];a[e]=d&&typeof d==="object"&&d.constructor!== +Array&&typeof d.nodeType!=="number"?c(a[e]||{},d):b[e]}return a}return function(){var a=arguments,b,d={};for(b=0;b {a : 'a', b : {b1 : 'b1', b2 : 'b2_prime'}, c : 'c'} + /*merge: function(){ + function doCopy(copy, original) { + var value, + key, + undef, + nil, + same, + obj, + arr, + node; + + for (key in original) { + value = original[key]; + undef = typeof(value) === 'undefined'; + nil = value === null; + same = original === copy[key]; + + if (undef || nil || same) { + continue; + } + + obj = typeof(value) === 'object'; + arr = value && obj && value.constructor == Array; + node = !!value.nodeType; + + if (obj && !arr && !node) { + copy[key] = doCopy(typeof copy[key] == 'object' ? copy[key] : {}, value); + } + else { + copy[key] = original[key]; + } + } + return copy; + } + + var args = arguments, retVal = {}; + + for (var i = 0; i < args.length; i++) { + retVal = doCopy(retVal, args[i]); + } + + return retVal; + },*/ + merge: function () { // the built-in prototype merge function doesn't do deep copy + function doCopy(copy, original) { + var value, key; + + for (key in original) { + value = original[key]; + if (value && typeof value === 'object' && value.constructor !== Array && + typeof value.nodeType !== 'number') { + copy[key] = doCopy(copy[key] || {}, value); // copy + + } else { + copy[key] = original[key]; + } + } + return copy; + } + + function merge() { + var args = arguments, + i, + retVal = {}; + + for (i = 0; i < args.length; i++) { + retVal = doCopy(retVal, args[i]); + + } + return retVal; + } + + return merge.apply(this, arguments); + }, + + // extend an object to handle highchart events (highchart objects, not svg elements). + // this is a very simple way of handling events but whatever, it works (i think) + _extend: function (object) { + if (!object._highcharts_extended) { + Object.extend(object, { + _highchart_events: {}, + _highchart_animation: null, + _highcharts_extended: true, + _highcharts_observe: function (name, fn) { + this._highchart_events[name] = [this._highchart_events[name], fn].compact().flatten(); + }, + _highcharts_stop_observing: function (name, fn) { + if (name) { + if (fn) { + this._highchart_events[name] = [this._highchart_events[name]].compact().flatten().without(fn); + } else { + delete this._highchart_events[name]; + } + } else { + this._highchart_events = {}; + } + }, + _highcharts_fire: function (name, args) { + (this._highchart_events[name] || []).each(function (fn) { + // args is never null here + if (args.stopped) { + return; // "throw $break" wasn't working. i think because of the scope of 'this'. + } + + // Attach a simple preventDefault function to skip default handler if called + args.preventDefault = function () { + args.defaultPrevented = true; + }; + + // If the event handler return false, prevent the default handler from executing + if (fn.bind(this)(args) === false) { + args.preventDefault(); + } + } +.bind(this)); + } + }); + } + } +}; +}()); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.js b/java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.js new file mode 100644 index 00000000000..0900cd921e0 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/highcharts.js @@ -0,0 +1,176 @@ +/* + Highcharts JS v2.1.9 (2011-11-11) + + (c) 2009-2011 Torstein H?nsi + + License: www.highcharts.com/license +*/ +(function(){function sa(a,b){var c;a||(a={});for(c in b)a[c]=b[c];return a}function ja(a,b){return parseInt(a,b||10)}function Sb(a){return typeof a==="string"}function Nb(a){return typeof a==="object"}function lc(a){return typeof a==="number"}function mc(a){return Fa.log(a)/Fa.LN10}function nc(a,b){for(var c=a.length;c--;)if(a[c]===b){a.splice(c,1);break}}function K(a){return a!==Wa&&a!==null}function Ga(a,b,c){var d,e;if(Sb(b))if(K(c))a.setAttribute(b,c);else{if(a&&a.getAttribute)e=a.getAttribute(b)}else if(K(b)&& +Nb(b))for(d in b)a.setAttribute(d,b[d]);return e}function zc(a){return Object.prototype.toString.call(a)==="[object Array]"?a:[a]}function A(){var a=arguments,b,c,d=a.length;for(b=0;b3?c.length%3:0;return e+(g?c.substr(0,g)+d:"")+c.substr(g).replace(/(\d{3})(?=\d)/g,"$1"+d)+(f?b+bb(a-c).toFixed(f).slice(2):"")}function Fd(a){var b={left:a.offsetLeft,top:a.offsetTop};for(a=a.offsetParent;a;){b.left+=a.offsetLeft;b.top+=a.offsetTop; +if(a!==ua.body&&a!==ua.documentElement){b.left-=a.scrollLeft;b.top-=a.scrollTop}a=a.offsetParent}return b}function Gd(){this.symbol=this.color=0}function fe(a,b,c,d,e,f,g){var h=g.x;g=g.y;var i=h-a+c-25,j=g-b+d+10,m;if(i<7)i=c+h+15;if(i+a>c+e){i-=i+a-(c+e);j-=b;m=true}if(j<5){j=5;if(m&&g>=j&&g<=j+b)j=g+b-5}else if(j+b>d+f)j=d+f-b-5;return{x:i,y:j}}function Hd(a,b){var c=a.length,d;for(d=0;dwa)wa=O;else{if(Owa)wa=S;else if(F=0){pa=0;Od=true}else if(wa<0){wa=0;Pd=true}}}})}function N(k,n){var t,r;Fb=n?1:Fa.pow(10,lb(Fa.log(k)/Fa.LN10));t=k/Fb;if(!n){n=[1,2,2.5,5,10];if(o.allowDecimals===false||ca)if(Fb===1)n=[1,2,5,10];else if(Fb<=0.1)n=[1/Fb]}for(r=0;r0||!Pd))ra+=k*Rd}Ta=ia===ra?1:Ub&&!J&&E===t.options.tickPixelInterval? +t.tickInterval:A(J,Ya?1:(ra-ia)*E/ya);if(!D&&!K(o.tickInterval))Ta=N(Ta);I.tickInterval=Ta;Wc=o.minorTickInterval==="auto"&&Ta?Ta/5:o.minorTickInterval;if(D){Ba=[];J=Xa.global.useUTC;var Q=1E3/ub,fa=6E4/ub,ka=36E5/ub;E=864E5/ub;k=6048E5/ub;r=2592E6/ub;var $=31556952E3/ub,F=[["second",Q,[1,2,5,10,15,30]],["minute",fa,[1,2,5,10,15,30]],["hour",ka,[1,2,3,4,6,8,12]],["day",E,[1,2]],["week",k,[1,2]],["month",r,[1,2,3,4,6]],["year",$,null]],O=F[6],S=O[1],aa=O[2];for(t=0;t=Q)aa.setSeconds(S>=fa?0:F*lb(aa.getSeconds()/F));if(S>=fa)aa[Jd](S>=ka?0:F*lb(aa[id]()/F));if(S>=ka)aa[Kd](S>=E?0:F*lb(aa[jd]()/F));if(S>=E)aa[ld](S>=r?1:F*lb(aa[Cc]()/F));if(S>=r){aa[Ld](S>=$?0:F*lb(aa[Rc]()/F));n=aa[Sc]()}if(S>=$){n-=n%F;aa[Md](n)}S===k&&aa[ld](aa[Cc]()-aa[kd]()+o.startOfWeek);t=1;n=aa[Sc]();Q=aa.getTime()/ub;fa=aa[Rc]();for(ka=aa[Cc]();Q< +ra&&tn&&Ba.shift();if(o.endOnTick)ra=t;else raOb[qa])Ob[qa]=Ba.length}}function Ma(){var k,n;Dc=ia;Sd=ra;V();da();Hb=fb;fb=ya/(ra-ia||1);if(!xa)for(k in s)for(n in s[k])s[k][n].cum=s[k][n].total;if(!I.isDirty)I.isDirty=ia!==Dc||ra!==Sd}function za(k){k=(new w(k)).render();Pb.push(k);return k}function eb(){var k=o.title,n=o.stackLabels,t=o.alternateGridColor,r=o.lineWidth,J,E,Q=(J=l.hasRendered)&&K(Dc)&&!isNaN(Dc);E=zb.length&&K(ia)&&K(ra);ya=R?Da:Aa;fb=ya/(ra-ia||1);cc=R?X:vb;if(E||Ub){if(Wc&&!Ya)for(E=ia+ +(Ba[0]-ia)%Wc;E<=ra;E+=Wc){Wb[E]||(Wb[E]=new q(E,true));Q&&Wb[E].isNew&&Wb[E].render(null,true);Wb[E].isActive=true;Wb[E].render()}u(Ba,function($,F){if(!Ub||$>=ia&&$<=ra){Q&&mb[$].isNew&&mb[$].render(F,true);mb[$].isActive=true;mb[$].render(F)}});t&&u(Ba,function($,F){if(F%2===0&&$=1E3?Ed(k,0):k},$c=R&&o.labels.staggerLines,ec=o.reversed,fc=Ya&&o.tickmarkPlacement==="between"?0.5:0;q.prototype={addLabel:function(){var k=this.pos, +n=o.labels,t=!(k===ia&&!A(o.showFirstLabel,1)||k===ra&&!A(o.showLastLabel,0)),r=Ya&&R&&Ya.length&&!n.step&&!n.staggerLines&&!n.rotation&&Da/Ya.length||!R&&Da/2,J=Ya&&K(Ya[k])?Ya[k]:k,E=this.label;k=je.call({isFirst:k===Ba[0],isLast:k===Ba[Ba.length-1],dateTimeLabelFormat:Xc,value:ca?Fa.pow(10,J):J});r=r&&{width:Ia(1,W(r-2*(n.padding||10)))+Ua};r=sa(r,n.style);if(E===Wa)this.label=K(k)&&t&&n.enabled?ga.text(k,0,0,n.useHTML).attr({align:n.align,rotation:n.rotation}).css(r).add(na):null;else E&&E.attr({text:k}).css(r)}, +getLabelSize:function(){var k=this.label;return k?(this.labelBBox=k.getBBox())[R?"height":"width"]:0},render:function(k,n){var t=!this.minor,r=this.label,J=this.pos,E=o.labels,Q=this.gridLine,fa=t?o.gridLineWidth:o.minorGridLineWidth,ka=t?o.gridLineColor:o.minorGridLineColor,$=t?o.gridLineDashStyle:o.minorGridLineDashStyle,F=this.mark,O=t?o.tickLength:o.minorTickLength,S=t?o.tickWidth:o.minorTickWidth||0,aa=t?o.tickColor:o.minorTickColor,Eb=t?o.tickPosition:o.minorTickPosition,kb=E.step,nb=n&&ad|| +cb,Qb;Qb=R?G(J+fc,null,null,n)+cc:X+la+(Oa?(n&&qd||$a)-Ib-X:0);nb=R?nb-vb+la-(Oa?Aa:0):nb-G(J+fc,null,null,n)-cc;if(fa){J=ha(J+fc,fa,n);if(Q===Wa){Q={stroke:ka,"stroke-width":fa};if($)Q.dashstyle=$;if(t)Q.zIndex=1;this.gridLine=Q=fa?ga.path(J).attr(Q).add(Ra):null}!n&&Q&&J&&Q.animate({d:J})}if(S){if(Eb==="inside")O=-O;if(Oa)O=-O;t=ga.crispLine([Za,Qb,nb,Ka,Qb+(R?0:-O),nb+(R?O:0)],S);if(F)F.animate({d:t});else this.mark=ga.path(t).attr({stroke:aa,"stroke-width":S}).add(na)}if(r&&!isNaN(Qb)){Qb=Qb+ +E.x-(fc&&R?fc*fb*(ec?-1:1):0);nb=nb+E.y-(fc&&!R?fc*fb*(ec?1:-1):0);K(E.y)||(nb+=ja(r.styles.lineHeight)*0.9-r.getBBox().height/2);if($c)nb+=k/(kb||1)%$c*16;if(kb)r[k%kb?"hide":"show"]();r[this.isNew?"attr":"animate"]({x:Qb,y:nb})}this.isNew=false},destroy:function(){Ac(this)}};w.prototype={render:function(){var k=this,n=k.options,t=n.label,r=k.label,J=n.width,E=n.to,Q=n.from,fa=n.value,ka,$=n.dashStyle,F=k.svgElem,O=[],S,aa,Eb=n.color;aa=n.zIndex;var kb=n.events;if(ca){Q=mc(Q);E=mc(E);fa=mc(fa)}if(J){O= +ha(fa,J);n={stroke:Eb,"stroke-width":J};if($)n.dashstyle=$}else if(K(Q)&&K(E)){Q=Ia(Q,ia);E=tb(E,ra);ka=ha(E);if((O=ha(Q))&&ka)O.push(ka[4],ka[5],ka[1],ka[2]);else O=null;n={fill:Eb}}else return;if(K(aa))n.zIndex=aa;if(F)if(O)F.animate({d:O},null,F.onGetPath);else{F.hide();F.onGetPath=function(){F.show()}}else if(O&&O.length){k.svgElem=F=ga.path(O).attr(n).add();if(kb){$=function(nb){F.on(nb,function(Qb){kb[nb].apply(k,[Qb])})};for(S in kb)$(S)}}if(t&&K(t.text)&&O&&O.length&&Da>0&&Aa>0){t=Ca({align:R&& +ka&&"center",x:R?!ka&&4:10,verticalAlign:!R&&ka&&"middle",y:R?ka?16:10:ka?6:-4,rotation:R&&!ka&&90},t);if(!r)k.label=r=ga.text(t.text,0,0).attr({align:t.textAlign||t.align,rotation:t.rotation,zIndex:aa}).css(t.style).add();ka=[O[1],O[4],A(O[6],O[1])];O=[O[2],O[5],A(O[7],O[2])];S=tb.apply(Fa,ka);aa=tb.apply(Fa,O);r.align(t,false,{x:S,y:aa,width:Ia.apply(Fa,ka)-S,height:Ia.apply(Fa,O)-aa});r.show()}else r&&r.hide();return k},destroy:function(){Ac(this);nc(Pb,this)}};x.prototype={destroy:function(){Ac(this)}, +setTotal:function(k){this.cum=this.total=k},render:function(k){var n=this.options.formatter.call(this);if(this.label)this.label.attr({text:n,visibility:ob});else this.label=l.renderer.text(n,0,0).css(this.options.style).attr({align:this.textAlign,rotation:this.options.rotation,visibility:ob}).add(k)},setOffset:function(k,n){var t=this.isNegative,r=I.translate(this.total),J=I.translate(0);J=bb(r-J);var E=l.xAxis[0].translate(this.x)+k,Q=l.plotHeight;t={x:va?t?r:r-J:E,y:va?Q-E-n:t?Q-r-J:Q-r,width:va? +J:n,height:va?n:J};this.label&&this.label.align(this.alignOptions,null,t).attr({visibility:Ab})}};G=function(k,n,t,r,J){var E=1,Q=0,fa=r?Hb:fb;r=r?Dc:ia;fa||(fa=fb);if(t){E*=-1;Q=ya}if(ec){E*=-1;Q-=E*ya}if(n){if(ec)k=ya-k;k=k/fa+r;if(ca&&J)k=Fa.pow(10,k)}else{if(ca&&J)k=mc(k);k=E*(k-r)*fa+Q}return k};ha=function(k,n,t){var r,J,E;k=G(k,null,null,t);var Q=t&&ad||cb,fa=t&&qd||$a,ka;t=J=W(k+cc);r=E=W(Q-k-cc);if(isNaN(k))ka=true;else if(R){r=ea;E=Q-vb;if(tX+Da)ka=true}else{t=X;J=fa-Ib;if(r +ea+Aa)ka=true}return ka?null:ga.crispLine([Za,t,r,Ka,J,E],n||0)};if(va&&xa&&ec===Wa)ec=true;sa(I,{addPlotBand:za,addPlotLine:za,adjustTickAmount:function(){if(Ob&&!D&&!Ya&&!Ub){var k=qc,n=Ba.length;qc=Ob[qa];if(nk)k=ia;else if(ra< +k)k=ra;return G(k,0,1)},isXAxis:xa,options:o,plotLinesAndBands:Pb,getOffset:function(){var k=zb.length&&K(ia)&&K(ra),n=0,t=0,r=o.title,J=o.labels,E=[-1,1,1,-1][L],Q;if(!na){na=ga.g("axis").attr({zIndex:7}).add();Ra=ga.g("grid").attr({zIndex:1}).add()}rc=0;if(k||Ub){u(Ba,function(fa){if(mb[fa])mb[fa].addLabel();else mb[fa]=new q(fa);if(L===0||L===2||{1:"left",3:"right"}[L]===J.align)rc=Ia(mb[fa].getLabelSize(),rc)});if($c)rc+=($c-1)*16}else for(Q in mb){mb[Q].destroy();delete mb[Q]}if(r&&r.text){if(!ba){ba= +I.axisTitle=ga.text(r.text,0,0,r.useHTML).attr({zIndex:7,rotation:r.rotation||0,align:r.textAlign||{low:"left",middle:"center",high:"right"}[r.align]}).css(r.style).add();ba.isNew=true}n=ba.getBBox()[R?"height":"width"];t=A(r.margin,R?5:10)}la=E*(o.offset||Xb[L]);nd=rc+(L!==2&&rc&&E*o.labels[R?"y":"x"])+t;Xb[L]=Ia(Xb[L],nd+n+E*la)},render:eb,setCategories:function(k,n){I.categories=p.categories=Ya=k;u(zb,function(t){t.translate();t.setTooltipPoints(true)});I.isDirty=true;A(n,true)&&l.redraw()},setExtremes:function(k, +n,t,r){t=A(t,true);Pa(I,"setExtremes",{min:k,max:n},function(){Vb=k;Gb=n;t&&l.redraw(r)})},setScale:Ma,setTickPositions:da,translate:G,redraw:function(){Yb.resetTracker&&Yb.resetTracker();eb();u(Pb,function(k){k.render()});u(zb,function(k){k.isDirty=true})},removePlotBand:ab,removePlotLine:ab,reversed:ec,stacks:s,destroy:function(){var k;pb(I);for(k in s){Ac(s[k]);s[k]=null}if(I.stackTotalGroup)I.stackTotalGroup=I.stackTotalGroup.destroy();u([mb,Wb,dc,Pb],function(n){Ac(n)});u([La,na,Ra,ba],function(n){n&& +n.destroy()});La=na=Ra=ba=null}});for(pd in B)Qa(I,pd,B[pd]);Ma()}function d(){var p={};return{add:function(q,w,x,V){if(!p[q]){w=ga.text(w,0,0).css(a.toolbar.itemStyle).align({align:"right",x:-Ib-20,y:ea+30}).on("click",V).attr({align:"right",zIndex:20}).add();p[q]=w}},remove:function(q){pc(p[q].element);p[q]=null}}}function e(p){function q(){var B=this.points||zc(this),D=B[0].series.xAxis,ca=this.x;D=D&&D.options.type==="datetime";var la=Sb(ca)||D,qa;qa=la?[''+(D?Zc("%A, %b %e, %Y", +ca):ca)+""]:[];u(B,function(ya){qa.push(ya.point.tooltipFormatter(la))});return qa.join("
")}function w(B,D){L=xa?B:(2*L+B)/3;s=xa?D:(s+D)/2;o.translate(L,s);rd=bb(B-L)>1||bb(D-s)>1?function(){w(B,D)}:null}function x(){if(!xa){var B=l.hoverPoints;o.hide();u(da,function(D){D&&D.hide()});B&&u(B,function(D){D.setState()});l.hoverPoints=null;xa=true}}var V,N=p.borderWidth,ta=p.crosshairs,da=[],Ma=p.style,za=p.shared,eb=ja(Ma.padding),ab=N+eb,xa=true,Oa,R,L=0,s=0;Ma.padding=0;var o=ga.g("tooltip").attr({zIndex:8}).add(), +I=ga.rect(ab,ab,0,0,p.borderRadius,N).attr({fill:p.backgroundColor,"stroke-width":N}).add(o).shadow(p.shadow),ba=ga.text("",eb+ab,ja(Ma.fontSize)+eb+ab,p.useHTML).attr({zIndex:1}).css(Ma).add(o);o.hide();return{shared:za,refresh:function(B){var D,ca,la,qa=0,ya={},fb=[];la=B.tooltipPos;D=p.formatter||q;ya=l.hoverPoints;if(za){ya&&u(ya,function(Hb){Hb.setState()});l.hoverPoints=B;u(B,function(Hb){Hb.setState(Bb);qa+=Hb.plotY;fb.push(Hb.getLabelConfig())});ca=B[0].plotX;qa=W(qa)/B.length;ya={x:B[0].category}; +ya.points=fb;B=B[0]}else ya=B.getLabelConfig();ya=D.call(ya);V=B.series;ca=za?ca:B.plotX;qa=za?qa:B.plotY;D=W(la?la[0]:va?Da-qa:ca);ca=W(la?la[1]:va?Aa-ca:qa);la=za||!B.series.isCartesian||gc(D,ca);if(ya===false||!la)x();else{if(xa){o.show();xa=false}ba.attr({text:ya});la=ba.getBBox();Oa=la.width+2*eb;R=la.height+2*eb;I.attr({width:Oa,height:R,stroke:p.borderColor||B.color||V.color||"#606060"});D=fe(Oa,R,X,ea,Da,Aa,{x:D,y:ca});w(W(D.x-ab),W(D.y-ab))}if(ta){ta=zc(ta);for(D=ta.length;D--;){ca=B.series[D? +"yAxis":"xAxis"];if(ta[D]&&ca){ca=ca.getPlotLinePath(B[D?"y":"x"],1);if(da[D])da[D].attr({d:ca,visibility:Ab});else{la={"stroke-width":ta[D].width||1,stroke:ta[D].color||"#C0C0C0",zIndex:2};if(ta[D].dashStyle)la.dashstyle=ta[D].dashStyle;da[D]=ga.path(ca).attr(la).add()}}}}},hide:x,destroy:function(){u(da,function(B){B&&B.destroy()});u([I,ba,o],function(B){B&&B.destroy()});I=ba=o=null}}}function f(p){function q(L){var s,o=Ud&&ua.width/ua.body.scrollWidth-1,I,ba,B;L=L||db.event;if(!L.target)L.target= +L.srcElement;s=L.touches?L.touches.item(0):L;if(L.type!=="mousemove"||db.opera||o){Jb=Fd(oa);I=Jb.left;ba=Jb.top}if(Pc){B=L.x;s=L.y}else if(s.layerX===Wa){B=s.pageX-I;s=s.pageY-ba}else{B=L.layerX;s=L.layerY}if(o){B+=W((o+1)*I-I);s+=W((o+1)*ba-ba)}return sa(L,{chartX:B,chartY:s})}function w(L){var s={xAxis:[],yAxis:[]};u(Va,function(o){var I=o.translate,ba=o.isXAxis;s[ba?"xAxis":"yAxis"].push({axis:o,value:I((va?!ba:ba)?L.chartX-X:Aa-L.chartY+ea,true)})});return s}function x(){var L=l.hoverSeries, +s=l.hoverPoint;s&&s.onMouseOut();L&&L.onMouseOut();hc&&hc.hide();sd=null}function V(){if(za){var L={xAxis:[],yAxis:[]},s=za.getBBox(),o=s.x-X,I=s.y-ea;if(Ma){u(Va,function(ba){var B=ba.translate,D=ba.isXAxis,ca=va?!D:D,la=B(ca?o:Aa-I-s.height,true,0,0,1);B=B(ca?o+s.width:Aa-I,true,0,0,1);L[D?"xAxis":"yAxis"].push({axis:ba,min:tb(la,B),max:Ia(la,B)})});Pa(l,"selection",L,td)}za=za.destroy()}l.mouseIsDown=ud=Ma=false;pb(ua,Kb?"touchend":"mouseup",V)}function N(L){var s=K(L.pageX)?L.pageX:L.page.x;L= +K(L.pageX)?L.pageY:L.page.y;Jb&&!gc(s-Jb.left-X,L-Jb.top-ea)&&x()}var ta,da,Ma,za,eb=z.zoomType,ab=/x/.test(eb),xa=/y/.test(eb),Oa=ab&&!va||xa&&va,R=xa&&!va||ab&&va;bd=function(){if(Ec){Ec.translate(X,ea);va&&Ec.attr({width:l.plotWidth,height:l.plotHeight}).invert()}else l.trackerGroup=Ec=ga.g("tracker").attr({zIndex:9}).add()};bd();if(p.enabled)l.tooltip=hc=e(p);(function(){oa.onmousedown=function(s){s=q(s);!Kb&&s.preventDefault&&s.preventDefault();l.mouseIsDown=ud=true;ta=s.chartX;da=s.chartY;Qa(ua, +Kb?"touchend":"mouseup",V)};var L=function(s){if(!(s&&s.touches&&s.touches.length>1)){s=q(s);if(!Kb)s.returnValue=false;var o=s.chartX,I=s.chartY,ba=!gc(o-X,I-ea);Jb||(Jb=Fd(oa));if(Kb&&s.type==="touchstart")if(Ga(s.target,"isTracker"))l.runTrackerClick||s.preventDefault();else!ke&&!ba&&s.preventDefault();if(ba){if(oX+Da)o=X+Da;if(Iea+Aa)I=ea+Aa}if(ud&&s.type!=="touchstart"){Ma=Math.sqrt(Math.pow(ta-o,2)+Math.pow(da-I,2));if(Ma>10){if(sc&&(ab||xa)&&gc(ta-X,da-ea))za|| +(za=ga.rect(X,ea,Oa?1:Da,R?1:Aa,0).attr({fill:z.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add());if(za&&Oa){o=o-ta;za.attr({width:bb(o),x:(o>0?0:o)+ta})}if(za&&R){I=I-da;za.attr({height:bb(I),y:(I>0?0:I)+da})}}}else if(!ba){var B;I=l.hoverPoint;o=l.hoverSeries;var D,ca,la=$a,qa=va?s.chartY:s.chartX-X;if(hc&&p.shared){B=[];D=Ha.length;for(ca=0;cala&&B.splice(D,1);if(B.length&&B[0].plotX!==sd){hc.refresh(B);sd=B[0].plotX}}if(o&&o.tracker)(s=o.tooltipPoints[qa])&&s!==I&&s.onMouseOver()}return ba||!sc}};oa.onmousemove=L;Qa(oa,"mouseleave",x);Qa(ua,"mousemove",N);oa.ontouchstart=function(s){if(ab||xa)oa.onmousedown(s);L(s)};oa.ontouchmove=L;oa.ontouchend=function(){Ma&&x()};oa.onclick=function(s){var o=l.hoverPoint;s=q(s);s.cancelBubble=true;if(!Ma)if(o&&Ga(s.target,"isTracker")){var I=o.plotX,ba=o.plotY;sa(o,{pageX:Jb.left+ +X+(va?Da-ba:I),pageY:Jb.top+ea+(va?Aa-I:ba)});Pa(o.series,"click",sa(s,{point:o}));o.firePointEvent("click",s)}else{sa(s,w(s));gc(s.chartX-X,s.chartY-ea)&&Pa(l,"click",s)}Ma=false}})();Vd=setInterval(function(){rd&&rd()},32);sa(this,{zoomX:ab,zoomY:xa,resetTracker:x,destroy:function(){if(l.trackerGroup)l.trackerGroup=Ec=l.trackerGroup.destroy();pb(ua,"mousemove",N);oa.onclick=oa.onmousedown=oa.onmousemove=oa.ontouchstart=oa.ontouchend=oa.ontouchmove=null}})}function g(p){var q=p.type||z.type||z.defaultSeriesType, +w=wb[q],x=l.hasRendered;if(x)if(va&&q==="column")w=wb.bar;else if(!va&&q==="bar")w=wb.column;q=new w;q.init(l,p);if(!x&&q.inverted)va=true;if(q.isCartesian)sc=q.isCartesian;Ha.push(q);return q}function h(){z.alignTicks!==false&&u(Va,function(p){p.adjustTickAmount()});Ob=null}function i(p){var q=l.isDirtyLegend,w,x=l.isDirtyBox,V=Ha.length,N=V,ta=l.clipRect;for(oc(p,l);N--;){p=Ha[N];if(p.isDirty&&p.options.stacking){w=true;break}}if(w)for(N=V;N--;){p=Ha[N];if(p.options.stacking)p.isDirty=true}u(Ha, +function(da){if(da.isDirty){da.cleanData();da.getSegments();if(da.options.legendType==="point")q=true}});if(q&&Fc.renderLegend){Fc.renderLegend();l.isDirtyLegend=false}if(sc){if(!cd){Ob=null;u(Va,function(da){da.setScale()})}h();Gc();u(Va,function(da){if(da.isDirty||x){da.redraw();x=true}})}if(x){vd();bd();if(ta){Hc(ta);ta.animate({width:l.plotSizeX,height:l.plotSizeY})}}u(Ha,function(da){if(da.isDirty&&da.visible&&(!da.isCartesian||da.xAxis))da.redraw()});Yb&&Yb.resetTracker&&Yb.resetTracker();Pa(l, +"redraw")}function j(){var p=a.xAxis||{},q=a.yAxis||{},w;p=zc(p);u(p,function(x,V){x.index=V;x.isX=true});q=zc(q);u(q,function(x,V){x.index=V});Va=p.concat(q);l.xAxis=[];l.yAxis=[];Va=tc(Va,function(x){w=new c(x);l[w.isXAxis?"xAxis":"yAxis"].push(w);return w});h()}function m(p,q){uc=Ca(a.title,p);Ic=Ca(a.subtitle,q);u([["title",p,uc],["subtitle",q,Ic]],function(w){var x=w[0],V=l[x],N=w[1];w=w[2];if(V&&N)V=V.destroy();if(w&&w.text&&!V)l[x]=ga.text(w.text,0,0,w.useHTML).attr({align:w.align,"class":"highcharts-"+ +x,zIndex:1}).css(w.style).add().align(w,false,Rb)})}function v(){qb=z.renderTo;Wd=vc+wd++;if(Sb(qb))qb=ua.getElementById(qb);qb.innerHTML="";if(!qb.offsetWidth){Zb=qb.cloneNode(0);Ja(Zb,{position:ic,top:"-9999px",display:""});ua.body.appendChild(Zb)}dd=(Zb||qb).offsetWidth;Jc=(Zb||qb).offsetHeight;l.chartWidth=$a=z.width||dd||600;l.chartHeight=cb=z.height||(Jc>19?Jc:400);l.container=oa=hb(Tb,{className:"highcharts-container"+(z.className?" "+z.className:""),id:Wd},sa({position:Xd,overflow:ob,width:$a+ +Ua,height:cb+Ua,textAlign:"left"},z.style),Zb||qb);l.renderer=ga=z.forExport?new ed(oa,$a,cb,true):new fd(oa,$a,cb);var p,q;if(Yd&&oa.getBoundingClientRect){p=function(){Ja(oa,{left:0,top:0});q=oa.getBoundingClientRect();Ja(oa,{left:-(q.left-ja(q.left))+Ua,top:-(q.top-ja(q.top))+Ua})};p();Qa(db,"resize",p);Qa(l,"destroy",function(){pb(db,"resize",p)})}}function P(){function p(){var w=z.width||qb.offsetWidth,x=z.height||qb.offsetHeight;if(w&&x){if(w!==dd||x!==Jc){clearTimeout(q);q=setTimeout(function(){xd(w, +x,false)},100)}dd=w;Jc=x}}var q;Qa(db,"resize",p);Qa(l,"destroy",function(){pb(db,"resize",p)})}function T(){Pa(l,"endResize",null,function(){cd-=1})}function Y(){var p=a.labels,q=a.credits,w;m();Fc=l.legend=new le;Gc();u(Va,function(x){x.setTickPositions(true)});h();Gc();vd();sc&&u(Va,function(x){x.render()});if(!l.seriesGroup)l.seriesGroup=ga.g("series-group").attr({zIndex:3}).add();u(Ha,function(x){x.translate();x.setTooltipPoints();x.render()});p.items&&u(p.items,function(){var x=sa(p.style,this.style), +V=ja(x.left)+X,N=ja(x.top)+ea+12;delete x.left;delete x.top;ga.text(this.html,V,N).attr({zIndex:2}).css(x).add()});if(!l.toolbar)l.toolbar=d();if(q.enabled&&!l.credits){w=q.href;l.credits=ga.text(q.text,0,0).on("click",function(){if(w)location.href=w}).attr({align:q.position.align,zIndex:8}).css(q.style).add().align(q.position)}bd();l.hasRendered=true;if(Zb){qb.appendChild(oa);pc(Zb)}}function H(){var p,q=oa&&oa.parentNode;if(l!==null){Pa(l,"destroy");pb(db,"unload",H);pb(l);for(p=Va.length;p--;)Va[p]= +Va[p].destroy();for(p=Ha.length;p--;)Ha[p]=Ha[p].destroy();u(["title","subtitle","seriesGroup","clipRect","credits","tracker"],function(w){var x=l[w];if(x)l[w]=x.destroy()});u([wc,xc,Kc,Fc,hc,ga,Yb],function(w){w&&w.destroy&&w.destroy()});wc=xc=Kc=Fc=hc=ga=Yb=null;if(oa){oa.innerHTML="";pb(oa);q&&pc(oa);oa=null}clearInterval(Vd);for(p in l)delete l[p];l=null}}function U(){if(!Lc&&db==db.top&&ua.readyState!=="complete")ua.attachEvent("onreadystatechange",function(){ua.detachEvent("onreadystatechange", +U);ua.readyState==="complete"&&U()});else{v();yd();zd();u(a.series||[],function(p){g(p)});l.inverted=va=A(va,a.chart.inverted);j();l.render=Y;l.tracker=Yb=new f(a.tooltip);Y();Pa(l,"load");b&&b.apply(l,[l]);u(l.callbacks,function(p){p.apply(l,[l])})}}Yc=Ca(Yc,Xa.xAxis);od=Ca(od,Xa.yAxis);Xa.xAxis=Xa.yAxis=null;a=Ca(Xa,a);var z=a.chart,M=z.margin;M=Nb(M)?M:[M,M,M,M];var y=A(z.marginTop,M[0]),C=A(z.marginRight,M[1]),Z=A(z.marginBottom,M[2]),Sa=A(z.marginLeft,M[3]),Na=z.spacingTop,Ea=z.spacingRight, +gb=z.spacingBottom,Lb=z.spacingLeft,Rb,uc,Ic,ea,Ib,vb,X,Xb,qb,Zb,oa,Wd,dd,Jc,$a,cb,qd,ad,wc,Kc,Ad,xc,l=this,ke=(M=z.events)&&!!M.click,Bd,gc,hc,ud,jc,Zd,Cd,Aa,Da,Yb,Ec,bd,Fc,$b,ac,Jb,sc=z.showAxes,cd=0,Va=[],Ob,Ha=[],va,ga,rd,Vd,sd,vd,Gc,yd,zd,xd,td,$d,le=function(){function p(G,ha){var na=G.legendItem,Ra=G.legendLine,La=G.legendSymbol,pa=Oa.color,wa=ha?N.itemStyle.color:pa,zb=ha?G.color:pa;pa=ha?G.pointAttr[ib]:{stroke:pa,fill:pa};na&&na.css({fill:wa});Ra&&Ra.attr({stroke:zb});La&&La.attr(pa)}function q(G, +ha,na){var Ra=G.legendItem,La=G.legendLine,pa=G.legendSymbol;G=G.checkbox;Ra&&Ra.attr({x:ha,y:na});La&&La.translate(ha,na-4);pa&&pa.attr({x:ha+pa.xOff,y:na+pa.yOff});if(G){G.x=ha;G.y=na}}function w(){u(za,function(G){var ha=G.checkbox,na=qa.alignAttr;ha&&Ja(ha,{left:na.translateX+G.legendItemWidth+ha.x-40+Ua,top:na.translateY+ha.y-11+Ua})})}function x(G){var ha,na,Ra,La,pa=G.legendItem;La=G.series||G;var wa=La.options,zb=wa&&wa.borderWidth||0;if(!pa){La=/^(bar|pie|area|column)$/.test(La.type);G.legendItem= +pa=ga.text(N.labelFormatter.call(G),0,0).css(G.visible?ab:Oa).on("mouseover",function(){G.setState(Bb);pa.css(xa)}).on("mouseout",function(){pa.css(G.visible?ab:Oa);G.setState()}).on("click",function(){var Gb=function(){G.setVisible()};G.firePointEvent?G.firePointEvent("legendItemClick",null,Gb):Pa(G,"legendItemClick",null,Gb)}).attr({zIndex:2}).add(qa);if(!La&&wa&&wa.lineWidth){var Vb={"stroke-width":wa.lineWidth,zIndex:2};if(wa.dashStyle)Vb.dashstyle=wa.dashStyle;G.legendLine=ga.path([Za,-da-Ma, +0,Ka,-Ma,0]).attr(Vb).add(qa)}if(La)ha=ga.rect(na=-da-Ma,Ra=-11,da,12,2).attr({zIndex:3}).add(qa);else if(wa&&wa.marker&&wa.marker.enabled)ha=ga.symbol(G.symbol,na=-da/2-Ma,Ra=-4,wa.marker.radius).attr({zIndex:3}).add(qa);if(ha){ha.xOff=na+zb%2/2;ha.yOff=Ra+zb%2/2}G.legendSymbol=ha;p(G,G.visible);if(wa&&wa.showCheckbox){G.checkbox=hb("input",{type:"checkbox",checked:G.selected,defaultChecked:G.selected},N.itemCheckboxStyle,oa);Qa(G.checkbox,"click",function(Gb){Pa(G,"checkboxClick",{checked:Gb.target.checked}, +function(){G.select()})})}}ha=pa.getBBox();na=G.legendItemWidth=N.itemWidth||da+Ma+ha.width+R;B=ha.height;if(ta&&o-s+na>(fb||$a-2*R-s)){o=s;I+=B}ba=I;q(G,o,I);if(ta)o+=na;else I+=B;ya=fb||Ia(ta?o-s:na,ya)}function V(){o=s;I=L;ba=ya=0;qa||(qa=ga.g("legend").attr({zIndex:7}).add());za=[];u(Hb,function(Ra){var La=Ra.options;if(La.showInLegend)za=za.concat(La.legendType==="point"?Ra.data:Ra)});Hd(za,function(Ra,La){return(Ra.options.legendIndex||0)-(La.options.legendIndex||0)});cc&&za.reverse();u(za, +x);$b=fb||ya;ac=ba-L+B;if(ca||la){$b+=2*R;ac+=2*R;if(D){if($b>0&&ac>0){D[D.isNew?"attr":"animate"](D.crisp(null,null,null,$b,ac));D.isNew=false}}else{D=ga.rect(0,0,$b,ac,N.borderRadius,ca||0).attr({stroke:N.borderColor,"stroke-width":ca||0,fill:la||jb}).add(qa).shadow(N.shadow);D.isNew=true}D[za.length?"show":"hide"]()}for(var G=["left","right","top","bottom"],ha,na=4;na--;){ha=G[na];if(eb[ha]&&eb[ha]!=="auto"){N[na<2?"align":"verticalAlign"]=ha;N[na<2?"x":"y"]=ja(eb[ha])*(na%2?-1:1)}}za.length&& +qa.align(sa(N,{width:$b,height:ac}),true,Rb);cd||w()}var N=l.options.legend;if(N.enabled){var ta=N.layout==="horizontal",da=N.symbolWidth,Ma=N.symbolPadding,za,eb=N.style,ab=N.itemStyle,xa=N.itemHoverStyle,Oa=N.itemHiddenStyle,R=ja(eb.padding),L=18,s=4+R+da+Ma,o,I,ba,B=0,D,ca=N.borderWidth,la=N.backgroundColor,qa,ya,fb=N.width,Hb=l.series,cc=N.reversed;V();Qa(l,"endResize",w);return{colorizeItem:p,destroyItem:function(G){var ha=G.checkbox;u(["legendItem","legendLine","legendSymbol"],function(na){G[na]&& +G[na].destroy()});ha&&pc(G.checkbox)},renderLegend:V,destroy:function(){if(D)D=D.destroy();if(qa)qa=qa.destroy()}}}};gc=function(p,q){return p>=0&&p<=Da&&q>=0&&q<=Aa};$d=function(){Pa(l,"selection",{resetSelection:true},td);l.toolbar.remove("zoom")};td=function(p){var q=Xa.lang,w=l.pointCount<100;l.toolbar.add("zoom",q.resetZoom,q.resetZoomTitle,$d);!p||p.resetSelection?u(Va,function(x){x.setExtremes(null,null,false,w)}):u(p.xAxis.concat(p.yAxis),function(x){var V=x.axis;if(l.tracker[V.isXAxis?"zoomX": +"zoomY"])V.setExtremes(x.min,x.max,false,w)});i()};Gc=function(){var p=a.legend,q=A(p.margin,10),w=p.x,x=p.y,V=p.align,N=p.verticalAlign,ta;yd();if((l.title||l.subtitle)&&!K(y))if(ta=Ia(l.title&&!uc.floating&&!uc.verticalAlign&&uc.y||0,l.subtitle&&!Ic.floating&&!Ic.verticalAlign&&Ic.y||0))ea=Ia(ea,ta+A(uc.margin,15)+Na);if(p.enabled&&!p.floating)if(V==="right")K(C)||(Ib=Ia(Ib,$b-w+q+Ea));else if(V==="left")K(Sa)||(X=Ia(X,$b+w+q+Lb));else if(N==="top")K(y)||(ea=Ia(ea,ac+x+q+Na));else if(N==="bottom")K(Z)|| +(vb=Ia(vb,ac-x+q+gb));sc&&u(Va,function(da){da.getOffset()});K(Sa)||(X+=Xb[3]);K(y)||(ea+=Xb[0]);K(Z)||(vb+=Xb[2]);K(C)||(Ib+=Xb[1]);zd()};xd=function(p,q,w){var x=l.title,V=l.subtitle;cd+=1;oc(w,l);ad=cb;qd=$a;l.chartWidth=$a=W(p);l.chartHeight=cb=W(q);Ja(oa,{width:$a+Ua,height:cb+Ua});ga.setSize($a,cb,w);Da=$a-X-Ib;Aa=cb-ea-vb;Ob=null;u(Va,function(N){N.isDirty=true;N.setScale()});u(Ha,function(N){N.isDirty=true});l.isDirtyLegend=true;l.isDirtyBox=true;Gc();x&&x.align(null,null,Rb);V&&V.align(null, +null,Rb);i(w);ad=null;Pa(l,"resize");Bc===false?T():setTimeout(T,Bc&&Bc.duration||500)};zd=function(){l.plotLeft=X=W(X);l.plotTop=ea=W(ea);l.plotWidth=Da=W($a-X-Ib);l.plotHeight=Aa=W(cb-ea-vb);l.plotSizeX=va?Aa:Da;l.plotSizeY=va?Da:Aa;Rb={x:Lb,y:Na,width:$a-Lb-Ea,height:cb-Na-gb}};yd=function(){ea=A(y,Na);Ib=A(C,Ea);vb=A(Z,gb);X=A(Sa,Lb);Xb=[0,0,0,0]};vd=function(){var p=z.borderWidth||0,q=z.backgroundColor,w=z.plotBackgroundColor,x=z.plotBackgroundImage,V,N={x:X,y:ea,width:Da,height:Aa};V=p+(z.shadow? +8:0);if(p||q)if(wc)wc.animate(wc.crisp(null,null,null,$a-V,cb-V));else wc=ga.rect(V/2,V/2,$a-V,cb-V,z.borderRadius,p).attr({stroke:z.borderColor,"stroke-width":p,fill:q||jb}).add().shadow(z.shadow);if(w)if(Kc)Kc.animate(N);else Kc=ga.rect(X,ea,Da,Aa,0).attr({fill:w}).add().shadow(z.plotShadow);if(x)if(Ad)Ad.animate(N);else Ad=ga.image(x,X,ea,Da,Aa).add();if(z.plotBorderWidth)if(xc)xc.animate(xc.crisp(null,X,ea,Da,Aa));else xc=ga.rect(X,ea,Da,Aa,0,z.plotBorderWidth).attr({stroke:z.plotBorderColor, +"stroke-width":z.plotBorderWidth,zIndex:4}).add();l.isDirtyBox=false};Qa(db,"unload",H);z.reflow!==false&&Qa(l,"load",P);if(M)for(Bd in M)Qa(l,Bd,M[Bd]);l.options=a;l.series=Ha;l.addSeries=function(p,q,w){var x;if(p){oc(w,l);q=A(q,true);Pa(l,"addSeries",{options:p},function(){x=g(p);x.isDirty=true;l.isDirtyLegend=true;q&&l.redraw()})}return x};l.animation=A(z.animation,true);l.destroy=H;l.get=function(p){var q,w,x;for(q=0;q=a)this.color=0},wrapSymbol:function(a){if(this.symbol>=a)this.symbol=0}};Nc={init:function(a,b,c){b=b||"";var d=a.shift,e=b.indexOf("C")>-1,f=e?7:3,g;b=b.split(" ");c=[].concat(c);var h, +i,j=function(m){for(g=m.length;g--;)m[g]===Za&&m.splice(g+1,0,m[g+1],m[g+2],m[g+1],m[g+2])};if(e){j(b);j(c)}if(a.isArea){h=b.splice(b.length-6,6);i=c.splice(c.length-6,6)}if(d){c=[].concat(c).splice(0,f).concat(c);a.shift=false}if(b.length)for(a=c.length;b.length255)b[e]=255}}return this},setOpacity:function(d){b[3]=d;return this}}};Uc.prototype={init:function(a,b){this.element=ua.createElementNS("http://www.w3.org/2000/svg", +b);this.renderer=a},animate:function(a,b,c){if(b=A(b,Bc,true)){b=Ca(b);if(c)b.complete=c;gd(this,a,b)}else{this.attr(a);c&&c()}},attr:function(a,b){var c,d,e,f,g=this.element,h=g.nodeName,i=this.renderer,j,m=this.shadows,v=this.htmlNode,P,T=this;if(Sb(a)&&K(b)){c=a;a={};a[c]=b}if(Sb(a)){c=a;if(h==="circle")c={x:"cx",y:"cy"}[c]||c;else if(c==="strokeWidth")c="stroke-width";T=Ga(g,c)||this[c]||0;if(c!=="d"&&c!=="visibility")T=parseFloat(T)}else for(c in a){j=false;d=a[c];if(c==="d"){if(d&&d.join)d= +d.join(" ");if(/(NaN| {2}|^$)/.test(d))d="M 0 0";this.d=d}else if(c==="x"&&h==="text"){for(e=0;eg||!K(g)&&K(b))){d.insertBefore(f,a);return this}}d.appendChild(f);this.added=true;return this},safeRemoveChild:function(a){var b=a.parentNode;b&&b.removeChild(a)},destroy:function(){var a=this,b=a.element|| +{},c=a.shadows,d,e;b.onclick=b.onmouseout=b.onmouseover=b.onmousemove=null;Hc(a);if(a.clipPath)a.clipPath=a.clipPath.destroy();if(a.stops){for(e=0;e/g,'').replace(/<(i|em)>/g,'').replace(/
/g,"").split(//g),d=b.childNodes,e=/style="([^"]+)"/,f=/href="([^"]+)"/,g=Ga(b,"x"),h=a.styles,i=h&&a.useHTML&&!this.forExport,j=a.htmlNode,m=h&&ja(h.width),v=h&&h.lineHeight,P,T=d.length;T--;)b.removeChild(d[T]);m&&!a.added&& +this.box.appendChild(b);u(c,function(Y,H){var U,z=0,M;Y=Y.replace(//g,"|||");U=Y.split("|||");u(U,function(y){if(y!==""||U.length===1){var C={},Z=ua.createElementNS("http://www.w3.org/2000/svg","tspan");e.test(y)&&Ga(Z,"style",y.match(e)[1].replace(/(;| |^)color([ :])/,"$1fill$2"));if(f.test(y)){Ga(Z,"onclick",'location.href="'+y.match(f)[1]+'"');Ja(Z,{cursor:"pointer"})}y=(y.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");Z.appendChild(ua.createTextNode(y)); +if(z)C.dx=3;else C.x=g;if(!z){if(H){!Lc&&a.renderer.forExport&&Ja(Z,{display:"block"});M=db.getComputedStyle&&ja(db.getComputedStyle(P,null).getPropertyValue("line-height"));if(!M||isNaN(M))M=v||P.offsetHeight||18;Ga(Z,"dy",M)}P=Z}Ga(Z,C);b.appendChild(Z);z++;if(m){y=y.replace(/-/g,"- ").split(" ");for(var Sa,Na=[];y.length||Na.length;){Sa=b.getBBox().width;C=Sa>m;if(!C||y.length===1){y=Na;Na=[];if(y.length){Z=ua.createElementNS("http://www.w3.org/2000/svg","tspan");Ga(Z,{dy:v||16,x:g});b.appendChild(Z); +if(Sa>m)m=Sa}}else{Z.removeChild(Z.firstChild);Na.unshift(y.pop())}y.length&&Z.appendChild(ua.createTextNode(y.join(" ").replace(/- /g,"-")))}}}})});if(i){if(!j)j=a.htmlNode=hb("span",null,sa(h,{position:ic,top:0,left:0}),this.box.parentNode);j.innerHTML=a.textStr;for(T=d.length;T--;)d[T].style.visibility=ob}},crispLine:function(a,b){if(a[1]===a[4])a[1]=a[4]=W(a[1])+b%2/2;if(a[2]===a[5])a[2]=a[5]=W(a[2])+b%2/2;return a},path:function(a){return this.createElement("path").attr({d:a,fill:jb})},circle:function(a, +b,c){a=Nb(a)?a:{x:a,y:b,r:c};return this.createElement("circle").attr(a)},arc:function(a,b,c,d,e,f){if(Nb(a)){b=a.y;c=a.r;d=a.innerR;e=a.start;f=a.end;a=a.x}return this.symbol("arc",a||0,b||0,c||0,{innerR:d||0,start:e||0,end:f||0})},rect:function(a,b,c,d,e,f){if(Nb(a)){b=a.y;c=a.width;d=a.height;e=a.r;f=a.strokeWidth;a=a.x}e=this.createElement("rect").attr({rx:e,ry:e,fill:jb});return e.attr(e.crisp(f,a,b,Ia(c,0),Ia(d,0)))},setSize:function(a,b,c){var d=this.alignedObjects,e=d.length;this.width=a; +this.height=b;for(this.boxWrapper[A(c,true)?"animate":"attr"]({width:a,height:b});e--;)d[e].align()},g:function(a){var b=this.createElement("g");return K(a)?b.attr({"class":vc+a}):b},image:function(a,b,c,d,e){var f={preserveAspectRatio:jb};arguments.length>1&&sa(f,{x:b,y:c,width:d,height:e});f=this.createElement("image").attr(f);f.element.setAttributeNS?f.element.setAttributeNS("http://www.w3.org/1999/xlink","href",a):f.element.setAttribute("hc-svg-href",a);return f},symbol:function(a,b,c,d,e){var f, +g=this.symbols[a];g=g&&g(W(b),W(c),d,e);var h=/^url\((.*?)\)$/,i;if(g){f=this.path(g);sa(f,{symbolName:a,x:b,y:c,r:d});e&&sa(f,e)}else if(h.test(a)){var j=function(m,v){m.attr({width:v[0],height:v[1]}).translate(-W(v[0]/2),-W(v[1]/2))};i=a.match(h)[1];a=be[i];f=this.image(i).attr({x:b,y:c});if(a)j(f,a);else{f.attr({width:0,height:0});hb("img",{onload:function(){j(f,be[i]=[this.width,this.height])},src:i})}}else f=this.circle(b,c,d);return f},symbols:{square:function(a,b,c){c=0.707*c;return[Za,a-c, +b-c,Ka,a+c,b-c,a+c,b+c,a-c,b+c,"Z"]},triangle:function(a,b,c){return[Za,a,b-1.33*c,Ka,a+c,b+0.67*c,a-c,b+0.67*c,"Z"]},"triangle-down":function(a,b,c){return[Za,a,b+1.33*c,Ka,a-c,b-0.67*c,a+c,b-0.67*c,"Z"]},diamond:function(a,b,c){return[Za,a,b-c,Ka,a+c,b,a,b+c,a-c,b,"Z"]},arc:function(a,b,c,d){var e=d.start,f=d.end-1.0E-6,g=d.innerR,h=rb(e),i=Cb(e),j=rb(f);f=Cb(f);d=d.end-e');if(b){c=b===Tb||b==="span"||b==="img"?c.join(""):a.prepVML(c);this.element=hb(c)}this.renderer=a},add:function(a){var b=this.renderer,c=this.element,d=b.box;d=a?a.element||a:d;a&&a.inverted&&b.invertChild(c,d);Mc&&d.gVis===ob&&Ja(c,{visibility:ob});d.appendChild(c);this.added=true;this.alignOnAdd&& +this.updateTransform();return this},attr:function(a,b){var c,d,e,f=this.element||{},g=f.style,h=f.nodeName,i=this.renderer,j=this.symbolName,m,v,P=this.shadows,T=this;if(Sb(a)&&K(b)){c=a;a={};a[c]=b}if(Sb(a)){c=a;T=c==="strokeWidth"||c==="stroke-width"?this.strokeweight:this[c]}else for(c in a){d=a[c];m=false;if(j&&/^(x|y|r|start|end|width|height|innerR)/.test(c)){if(!v){this.symbolAttr(a);v=true}m=true}else if(c==="d"){d=d||[];this.d=d.join(" ");e=d.length;for(m=[];e--;)m[e]=lc(d[e])?W(d[e]*10)- +5:d[e]==="Z"?"x":d[e];d=m.join(" ")||"x";f.path=d;if(P)for(e=P.length;e--;)P[e].path=d;m=true}else if(c==="zIndex"||c==="visibility"){if(Mc&&c==="visibility"&&h==="DIV"){f.gVis=d;m=f.childNodes;for(e=m.length;e--;)Ja(m[e],{visibility:d});if(d===Ab)d=null}if(d)g[c]=d;m=true}else if(/^(width|height)$/.test(c)){this[c]=d;if(this.updateClipping){this[c]=d;this.updateClipping()}else g[c]=d;m=true}else if(/^(x|y)$/.test(c)){this[c]=d;if(f.tagName==="SPAN")this.updateTransform();else g[{x:"left",y:"top"}[c]]= +d}else if(c==="class")f.className=d;else if(c==="stroke"){d=i.color(d,f,c);c="strokecolor"}else if(c==="stroke-width"||c==="strokeWidth"){f.stroked=d?true:false;c="strokeweight";this[c]=d;if(lc(d))d+=Ua}else if(c==="dashstyle"){(f.getElementsByTagName("stroke")[0]||hb(i.prepVML([""]),null,null,f))[c]=d||"solid";this.dashstyle=d;m=true}else if(c==="fill")if(h==="SPAN")g.color=d;else{f.filled=d!==jb?true:false;d=i.color(d,f,c);c="fillcolor"}else if(c==="translateX"||c==="translateY"||c==="rotation"|| +c==="align"){if(c==="align")c="textAlign";this[c]=d;this.updateTransform();m=true}else if(c==="text"){this.bBox=null;f.innerHTML=d;m=true}if(P&&c==="visibility")for(e=P.length;e--;)P[e].style[c]=d;if(!m)if(Mc)f[c]=d;else Ga(f,c,d)}return T},clip:function(a){var b=this,c=a.members;c.push(b);b.destroyClip=function(){nc(c,b)};return b.css(a.getCSS(b.inverted))},css:function(a){var b=this.element;if(b=a&&b.tagName==="SPAN"&&a.width){delete a.width;this.textWidth=b;this.updateTransform()}this.styles=sa(this.styles, +a);Ja(this.element,a);return this},safeRemoveChild:function(a){a.parentNode&&pc(a)},destroy:function(){this.destroyClip&&this.destroyClip();return Uc.prototype.destroy.apply(this)},empty:function(){for(var a=this.element.childNodes,b=a.length,c;b--;){c=a[b];c.parentNode.removeChild(c)}},getBBox:function(){var a=this.element,b=this.bBox;if(!b){if(a.nodeName==="text")a.style.position=ic;b=this.bBox={x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}}return b},on:function(a,b){this.element["on"+ +a]=function(){var c=db.event;c.target=c.srcElement;b(c)};return this},updateTransform:function(){if(this.added){var a=this,b=a.element,c=a.translateX||0,d=a.translateY||0,e=a.x||0,f=a.y||0,g=a.textAlign||"left",h={left:0,center:0.5,right:1}[g],i=g&&g!=="left";if(c||d)a.css({marginLeft:c,marginTop:d});a.inverted&&u(b.childNodes,function(z){a.renderer.invertChild(z,b)});if(b.tagName==="SPAN"){var j,m;c=a.rotation;var v;j=0;d=1;var P=0,T;v=ja(a.textWidth);var Y=a.xCorr||0,H=a.yCorr||0,U=[c,g,b.innerHTML, +a.textWidth].join(",");if(U!==a.cTT){if(K(c)){j=c*ae;d=rb(j);P=Cb(j);Ja(b,{filter:c?["progid:DXImageTransform.Microsoft.Matrix(M11=",d,", M12=",-P,", M21=",P,", M22=",d,", sizingMethod='auto expand')"].join(""):jb})}j=b.offsetWidth;m=b.offsetHeight;if(j>v){Ja(b,{width:v+Ua,display:"block",whiteSpace:"normal"});j=v}v=W((ja(b.style.fontSize)||12)*1.2);Y=d<0&&-j;H=P<0&&-m;T=d*P<0;Y+=P*v*(T?1-h:h);H-=d*v*(c?T?h:1-h:1);if(i){Y-=j*h*(d<0?-1:1);if(c)H-=m*h*(P<0?-1:1);Ja(b,{textAlign:g})}a.xCorr=Y;a.yCorr= +H}Ja(b,{left:e+Y,top:f+H});a.cTT=U}}else this.alignOnAdd=true},shadow:function(a,b){var c=[],d,e=this.element,f=this.renderer,g,h=e.style,i,j=e.path;if(j&&typeof j.value!=="string")j="x";if(a){for(d=1;d<=3;d++){i=[''];g=hb(f.prepVML(i),null,{left:ja(h.left)+1,top:ja(h.top)+1});i=[''];hb(f.prepVML(i),null,null,g);b?b.element.appendChild(g): +e.parentNode.insertBefore(g,e);c.push(g)}this.shadows=c}return this}});ma=function(){this.init.apply(this,arguments)};ma.prototype=Ca(ed.prototype,{Element:Db,isIE8:yc.indexOf("MSIE 8.0")>-1,init:function(a,b,c){var d;this.alignedObjects=[];d=this.createElement(Tb);a.appendChild(d.element);this.box=d.element;this.boxWrapper=d;this.setSize(b,c,false);if(!ua.namespaces.hcv){ua.namespaces.add("hcv","urn:schemas-microsoft-com:vml");ua.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "}}, +clipRect:function(a,b,c,d){var e=this.createElement();return sa(e,{members:[],left:a,top:b,width:c,height:d,getCSS:function(f){var g=this.top,h=this.left,i=h+this.width,j=g+this.height;g={clip:"rect("+W(f?h:g)+"px,"+W(f?j:i)+"px,"+W(f?i:j)+"px,"+W(f?g:h)+"px)"};!f&&Mc&&sa(g,{width:i+Ua,height:j+Ua});return g},updateClipping:function(){u(e.members,function(f){f.css(e.getCSS(f.inverted))})}})},color:function(a,b,c){var d,e=/^rgba/;if(a&&a.linearGradient){var f,g,h=a.linearGradient,i,j,m,v;u(a.stops, +function(P,T){if(e.test(P[1])){d=bc(P[1]);f=d.get("rgb");g=d.get("a")}else{f=P[1];g=1}if(T){m=f;v=g}else{i=f;j=g}});a=90-Fa.atan((h[3]-h[1])/(h[2]-h[0]))*180/kc;a=["<",c,' colors="0% ',i,",100% ",m,'" angle="',a,'" opacity="',v,'" o:opacity2="',j,'" type="gradient" focus="100%" />'];hb(this.prepVML(a),null,null,b)}else if(e.test(a)&&b.tagName!=="IMG"){d=bc(a);a=["<",c,' opacity="',d.get("a"),'"/>'];hb(this.prepVML(a),null,null,b);return d.get("rgb")}else{b=b.getElementsByTagName(c);if(b.length)b[0].opacity= +1;return a}},prepVML:function(a){var b=this.isIE8;a=a.join("");if(b){a=a.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />');a=a.indexOf('style="')===-1?a.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):a.replace('style="','style="display:inline-block;behavior:url(#default#VML);')}else a=a.replace("<","1&&f.css({left:b,top:c,width:d,height:e});return f},rect:function(a,b,c,d,e,f){if(Nb(a)){b=a.y;c=a.width;d=a.height;e=a.r;f=a.strokeWidth; +a=a.x}var g=this.symbol("rect");g.r=e;return g.attr(g.crisp(f,a,b,Ia(c,0),Ia(d,0)))},invertChild:function(a,b){var c=b.style;Ja(a,{flip:"x",left:ja(c.width)-10,top:ja(c.height)-10,rotation:-90})},symbols:{arc:function(a,b,c,d){var e=d.start,f=d.end,g=rb(e),h=Cb(e),i=rb(f),j=Cb(f);d=d.innerR;var m=0.07/c,v=d&&0.1/d||0;if(f-e===0)return["x"];else if(2*kc-f+e',this.name||b.name,": ",!a?"x = "+(this.name||this.x)+", ":"","",!a?"y = ":"",this.y,""].join("")},update:function(a,b,c){var d=this,e=d.series,f=d.graphic,g=e.chart;b=A(b,true);d.firePointEvent("update",{options:a},function(){d.applyOptions(a);if(Nb(a)){e.getAttribs();f&&f.attr(d.pointAttr[e.state])}e.isDirty=true;b&&g.redraw(c)})},remove:function(a,b){var c= +this,d=c.series,e=d.chart,f=d.data;oc(b,e);a=A(a,true);c.firePointEvent("remove",null,function(){nc(f,c);c.destroy();d.isDirty=true;a&&e.redraw()})},firePointEvent:function(a,b,c){var d=this,e=this.series.options;if(e.point.events[a]||d.options&&d.options.events&&d.options.events[a])this.importEvents();if(a==="click"&&e.allowPointSelect)c=function(f){d.select(null,f.ctrlKey||f.metaKey||f.shiftKey)};Pa(this,a,b,c)},importEvents:function(){if(!this.hasImportedEvents){var a=Ca(this.series.options.point, +this.options).events,b;this.events=a;for(b in a)Qa(this,b,a[b]);this.hasImportedEvents=true}},setState:function(a){var b=this.series,c=b.options.states,d=xb[b.type].marker&&b.options.marker,e=d&&!d.enabled,f=(d=d&&d.states[a])&&d.enabled===false,g=b.stateMarkerGraphic,h=b.chart,i=this.pointAttr;a=a||ib;if(!(a===this.state||this.selected&&a!=="select"||c[a]&&c[a].enabled===false||a&&(f||e&&!d.enabled))){if(this.graphic)this.graphic.attr(i[a]);else{if(a){if(!g)b.stateMarkerGraphic=g=h.renderer.circle(0, +0,i[a].r).attr(i[a]).add(b.group);g.translate(this.plotX,this.plotY)}if(g)g[a?"show":"hide"]()}this.state=a}}};var sb=function(){};sb.prototype={isCartesian:true,type:"line",pointClass:Oc,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},init:function(a,b){var c,d;d=a.series.length;this.chart=a;b=this.setOptions(b);sa(this,{index:d,options:b,name:b.name||"Series "+(d+1),state:ib,pointAttr:{},visible:b.visible!==false,selected:b.selected===true});d=b.events; +for(c in d)Qa(this,c,d[c]);if(d&&d.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=true;this.getColor();this.getSymbol();this.setData(b.data,false)},autoIncrement:function(){var a=this.options,b=this.xIncrement;b=A(b,a.pointStart,0);this.pointInterval=A(this.pointInterval,a.pointInterval,1);this.xIncrement=b+this.pointInterval;return b},cleanData:function(){var a=this.chart,b=this.data,c,d,e=a.smallestInterval,f,g;Hd(b,function(h,i){return h.x-i.x});if(this.options.connectNulls)for(g= +b.length-1;g>=0;g--)b[g].y===null&&b[g-1]&&b[g+1]&&b.splice(g,1);for(g=b.length-1;g>=0;g--)if(b[g-1]){f=b[g].x-b[g-1].x;if(f>0&&(d===Wa||fa+1&&b.push(c.slice(a+1,e));a=e}else e===c.length-1&&b.push(c.slice(a+1,e+1))});this.segments=b},setOptions:function(a){var b=this.chart.options.plotOptions;return Ca(b[this.type],b.series,a)},getColor:function(){var a= +this.chart.options.colors,b=this.chart.counters;this.color=this.options.color||a[b.color++]||"#0000ff";b.wrapColor(a.length)},getSymbol:function(){var a=this.chart.options.symbols,b=this.chart.counters;this.symbol=this.options.marker.symbol||a[b.symbol++];b.wrapSymbol(a.length)},addPoint:function(a,b,c,d){var e=this.data,f=this.graph,g=this.area,h=this.chart;a=(new this.pointClass).init(this,a);oc(d,h);if(f&&c)f.shift=c;if(g){g.shift=c;g.isArea=true}b=A(b,true);e.push(a);c&&e[0].remove(false);this.getAttribs(); +this.isDirty=true;b&&h.redraw()},setData:function(a,b){var c=this,d=c.data,e=c.initialColor,f=c.chart,g=d&&d.length||0;c.xIncrement=null;if(K(e))f.counters.color=e;for(a=tc(zc(a||[]),function(h){return(new c.pointClass).init(c,h)});g--;)d[g].destroy();c.data=a;c.cleanData();c.getSegments();c.getAttribs();c.isDirty=true;f.isDirtyBox=true;A(b,true)&&f.redraw(false)},remove:function(a,b){var c=this,d=c.chart;a=A(a,true);if(!c.isRemoving){c.isRemoving=true;Pa(c,"remove",null,function(){c.destroy();d.isDirtyLegend= +d.isDirtyBox=true;a&&d.redraw(b)})}c.isRemoving=false},translate:function(){for(var a=this.chart,b=this.options.stacking,c=this.xAxis.categories,d=this.yAxis,e=this.data,f=e.length;f--;){var g=e[f],h=g.x,i=g.y,j=g.low,m=d.stacks[(i<0?"-":"")+this.stackKey];g.plotX=this.xAxis.translate(h);if(b&&this.visible&&m&&m[h]){j=m[h];h=j.total;j.cum=j=j.cum-i;i=j+i;if(b==="percent"){j=h?j*100/h:0;i=h?i*100/h:0}g.percentage=h?g.y*100/h:0;g.stackTotal=h}if(K(j))g.yBottom=d.translate(j,0,1,0,1);if(i!==null)g.plotY= +d.translate(i,0,1,0,1);g.clientX=a.inverted?a.plotHeight-g.plotX:g.plotX;g.category=c&&c[g.x]!==Wa?c[g.x]:g.x}},setTooltipPoints:function(a){var b=this.chart,c=b.inverted,d=[],e=W((c?b.plotTop:b.plotLeft)+b.plotSizeX),f,g,h=[];if(a)this.tooltipPoints=null;u(this.segments,function(i){d=d.concat(i)});if(this.xAxis&&this.xAxis.reversed)d=d.reverse();u(d,function(i,j){f=d[j-1]?d[j-1]._high+1:0;for(g=i._high=d[j+1]?lb((i.plotX+(d[j+1]?d[j+1].plotX:e))/2):e;f<=g;)h[c?e-f++:f++]=i});this.tooltipPoints=h}, +onMouseOver:function(){var a=this.chart,b=a.hoverSeries;if(!(!Kb&&a.mouseIsDown)){b&&b!==this&&b.onMouseOut();this.options.events.mouseOver&&Pa(this,"mouseOver");this.tracker&&this.tracker.toFront();this.setState(Bb);a.hoverSeries=this}},onMouseOut:function(){var a=this.options,b=this.chart,c=b.tooltip,d=b.hoverPoint;d&&d.onMouseOut();this&&a.events.mouseOut&&Pa(this,"mouseOut");c&&!a.stickyTracking&&c.hide();this.setState();b.hoverSeries=null},animate:function(a){var b=this.chart,c=this.clipRect, +d=this.options.animation;if(d&&!Nb(d))d={};if(a){if(!c.isAnimating){c.attr("width",0);c.isAnimating=true}}else{c.animate({width:b.plotSizeX},d);this.animate=null}},drawPoints:function(){var a,b=this.data,c=this.chart,d,e,f,g,h,i;if(this.options.marker.enabled)for(f=b.length;f--;){g=b[f];d=g.plotX;e=g.plotY;i=g.graphic;if(e!==Wa&&!isNaN(e)){a=g.pointAttr[g.selected?"select":ib];h=a.r;if(i)i.animate({x:d,y:e,r:h});else g.graphic=c.renderer.symbol(A(g.marker&&g.marker.symbol,this.symbol),d,e,h).attr(a).add(this.group)}}}, +convertAttribs:function(a,b,c,d){var e=this.pointAttrToOptions,f,g,h={};a=a||{};b=b||{};c=c||{};d=d||{};for(f in e){g=e[f];h[f]=A(a[g],b[f],c[f],d[f])}return h},getAttribs:function(){var a=this,b=xb[a.type].marker?a.options.marker:a.options,c=b.states,d=c[Bb],e,f=a.color,g={stroke:f,fill:f},h=a.data,i=[],j,m=a.pointAttrToOptions,v;if(a.options.marker){d.radius=d.radius||b.radius+2;d.lineWidth=d.lineWidth||b.lineWidth+1}else d.color=d.color||bc(d.color||f).brighten(d.brightness).get();i[ib]=a.convertAttribs(b, +g);u([Bb,"select"],function(P){i[P]=a.convertAttribs(c[P],i[ib])});a.pointAttr=i;for(f=h.length;f--;){g=h[f];if((b=g.options&&g.options.marker||g.options)&&b.enabled===false)b.radius=0;e=false;if(g.options)for(v in m)if(K(b[m[v]]))e=true;if(e){j=[];c=b.states||{};e=c[Bb]=c[Bb]||{};if(!a.options.marker)e.color=bc(e.color||g.options.color).brighten(e.brightness||d.brightness).get();j[ib]=a.convertAttribs(b,i[ib]);j[Bb]=a.convertAttribs(c[Bb],i[Bb],j[ib]);j.select=a.convertAttribs(c.select,i.select, +j[ib])}else j=i;g.pointAttr=j}},destroy:function(){var a=this,b=a.chart,c=a.clipRect,d=/\/5[0-9\.]+ (Safari|Mobile)\//.test(yc),e,f;Pa(a,"destroy");pb(a);a.legendItem&&a.chart.legend.destroyItem(a);u(a.data,function(g){g.destroy()});if(c&&c!==b.clipRect)a.clipRect=c.destroy();u(["area","graph","dataLabelsGroup","group","tracker"],function(g){if(a[g]){e=d&&g==="group"?"hide":"destroy";a[g][e]()}});if(b.hoverSeries===a)b.hoverSeries=null;nc(b.series,a);for(f in a)delete a[f]},drawDataLabels:function(){if(this.options.dataLabels.enabled){var a, +b,c=this.data,d=this.options,e=d.dataLabels,f,g=this.dataLabelsGroup,h=this.chart,i=h.renderer,j=h.inverted,m=this.type,v;v=d.stacking;var P=m==="column"||m==="bar",T=e.verticalAlign===null,Y=e.y===null;if(P)if(v){if(T)e=Ca(e,{verticalAlign:"middle"});if(Y)e=Ca(e,{y:{top:14,middle:4,bottom:-6}[e.verticalAlign]})}else if(T)e=Ca(e,{verticalAlign:"top"});if(g)g.translate(h.plotLeft,h.plotTop);else g=this.dataLabelsGroup=i.g("data-labels").attr({visibility:this.visible?Ab:ob,zIndex:6}).translate(h.plotLeft, +h.plotTop).add();v=e.color;if(v==="auto")v=null;e.style.color=A(v,this.color,"black");u(c,function(H){var U=H.barX,z=U&&U+H.barW/2||H.plotX||-999,M=A(H.plotY,-999),y=H.dataLabel,C=e.align,Z=Y?H.y>=0?-6:12:e.y;f=e.formatter.call(H.getLabelConfig());a=(j?h.plotWidth-M:z)+e.x;b=(j?h.plotHeight-z:M)+Z;if(m==="column")a+={left:-1,right:1}[C]*H.barW/2||0;if(j&&H.y<0){C="right";a-=10}if(y){if(j&&!e.y)b=b+ja(y.styles.lineHeight)*0.9-y.getBBox().height/2;y.attr({text:f}).animate({x:a,y:b})}else if(K(f)){y= +H.dataLabel=i.text(f,a,b).attr({align:C,rotation:e.rotation,zIndex:1}).css(e.style).add(g);j&&!e.y&&y.attr({y:b+ja(y.styles.lineHeight)*0.9-y.getBBox().height/2})}if(P&&d.stacking&&y){z=H.barY;M=H.barW;H=H.barH;y.align(e,null,{x:j?h.plotWidth-z-H:U,y:j?h.plotHeight-U-M:z,width:j?H:M,height:j?M:H})}})}},drawGraph:function(){var a=this,b=a.options,c=a.graph,d=[],e,f=a.area,g=a.group,h=b.lineColor||a.color,i=b.lineWidth,j=b.dashStyle,m,v=a.chart.renderer,P=a.yAxis.getThreshold(b.threshold||0),T=/^area/.test(a.type), +Y=[],H=[];u(a.segments,function(U){m=[];u(U,function(C,Z){if(a.getPointSpline)m.push.apply(m,a.getPointSpline(U,C,Z));else{m.push(Z?Ka:Za);Z&&b.step&&m.push(C.plotX,U[Z-1].plotY);m.push(C.plotX,C.plotY)}});if(U.length>1)d=d.concat(m);else Y.push(U[0]);if(T){var z=[],M,y=m.length;for(M=0;M=0;M--)z.push(U[M].plotX,U[M].yBottom);else z.push(Ka,U[U.length-1].plotX,P,Ka,U[0].plotX,P);H=H.concat(z)}}); +a.graphPath=d;a.singlePoints=Y;if(T){e=A(b.fillColor,bc(a.color).setOpacity(b.fillOpacity||0.75).get());if(f)f.animate({d:H});else a.area=a.chart.renderer.path(H).attr({fill:e}).add(g)}if(c){Hc(c);c.animate({d:d})}else if(i){c={stroke:h,"stroke-width":i};if(j)c.dashstyle=j;a.graph=v.path(d).attr(c).add(g).shadow(b.shadow)}},render:function(){var a=this,b=a.chart,c,d,e=a.options,f=e.animation,g=f&&a.animate;f=g?f&&f.duration||500:0;var h=a.clipRect,i=b.renderer;if(!h){h=a.clipRect=!b.hasRendered&& +b.clipRect?b.clipRect:i.clipRect(0,0,b.plotSizeX,b.plotSizeY);if(!b.clipRect)b.clipRect=h}if(!a.group){c=a.group=i.g("series");if(b.inverted){d=function(){c.attr({width:b.plotWidth,height:b.plotHeight}).invert()};d();Qa(b,"resize",d);Qa(a,"destroy",function(){pb(b,"resize",d)})}c.clip(a.clipRect).attr({visibility:a.visible?Ab:ob,zIndex:e.zIndex}).translate(b.plotLeft,b.plotTop).add(b.seriesGroup)}a.drawDataLabels();g&&a.animate(true);a.drawGraph&&a.drawGraph();a.drawPoints();a.options.enableMouseTracking!== +false&&a.drawTracker();g&&a.animate();setTimeout(function(){h.isAnimating=false;if((c=a.group)&&h!==b.clipRect&&h.renderer){c.clip(a.clipRect=b.clipRect);h.destroy()}},f);a.isDirty=false},redraw:function(){var a=this.chart,b=this.group;if(b){a.inverted&&b.attr({width:a.plotWidth,height:a.plotHeight});b.animate({translateX:a.plotLeft,translateY:a.plotTop})}this.translate();this.setTooltipPoints(true);this.render()},setState:function(a){var b=this.options,c=this.graph,d=b.states;b=b.lineWidth;a=a|| +ib;if(this.state!==a){this.state=a;if(!(d[a]&&d[a].enabled===false)){if(a)b=d[a].lineWidth||b+1;if(c&&!c.dashstyle)c.attr({"stroke-width":b},a?0:500)}}},setVisible:function(a,b){var c=this.chart,d=this.legendItem,e=this.group,f=this.tracker,g=this.dataLabelsGroup,h,i=this.data,j=c.options.chart.ignoreHiddenSeries;h=this.visible;h=(this.visible=a=a===Wa?!h:a)?"show":"hide";e&&e[h]();if(f)f[h]();else for(e=i.length;e--;){f=i[e];f.tracker&&f.tracker[h]()}g&&g[h]();d&&c.legend.colorizeItem(this,a);this.isDirty= +true;this.options.stacking&&u(c.series,function(m){if(m.options.stacking&&m.visible)m.isDirty=true});if(j)c.isDirtyBox=true;b!==false&&c.redraw();Pa(this,h)},show:function(){this.setVisible(true)},hide:function(){this.setVisible(false)},select:function(a){this.selected=a=a===Wa?!this.selected:a;if(this.checkbox)this.checkbox.checked=a;Pa(this,a?"select":"unselect")},drawTracker:function(){var a=this,b=a.options,c=[].concat(a.graphPath),d=c.length,e=a.chart,f=e.options.tooltip.snap,g=a.tracker,h=b.cursor; +h=h&&{cursor:h};var i=a.singlePoints,j;if(d)for(j=d+1;j--;){c[j]===Za&&c.splice(j+1,0,c[j+1]-f,c[j+2],Ka);if(j&&c[j]===Za||j===d)c.splice(j,0,Ka,c[j-2]+f,c[j-1])}for(j=0;ja&&i>e){i=Ia(a,e);m=2*e-i}else if(ig&&m>e){m=Ia(g,e);i=2*e-m}else if(m< +g&&my?Sa-y:M-(Z<=M?y:0)}Rb=Ea-3}sa(C,{barX:Na,barY:Ea,barW:U,barH:gb});C.shapeType="rect";Z=sa(b.renderer.Element.prototype.crisp.apply({}, +[e,Na,Ea,U,gb]),{r:c.borderRadius});if(e%2){Z.y-=1;Z.height+=1}C.shapeArgs=Z;C.trackerArgs=K(Rb)&&Ca(C.shapeArgs,{height:Ia(6,gb+3),y:Rb})})},getSymbol:function(){},drawGraph:function(){},drawPoints:function(){var a=this,b=a.options,c=a.chart.renderer,d,e;u(a.data,function(f){var g=f.plotY;if(g!==Wa&&!isNaN(g)&&f.y!==null){d=f.graphic;e=f.shapeArgs;if(d){Hc(d);d.animate(e)}else f.graphic=c[f.shapeType](e).attr(f.pointAttr[f.selected?"select":ib]).add(a.group).shadow(b.shadow)}})},drawTracker:function(){var a= +this,b=a.chart,c=b.renderer,d,e,f=+new Date,g=a.options,h=g.cursor,i=h&&{cursor:h},j;u(a.data,function(m){e=m.tracker;d=m.trackerArgs||m.shapeArgs;delete d.strokeWidth;if(m.y!==null)if(e)e.attr(d);else m.tracker=c[m.shapeType](d).attr({isTracker:f,fill:ce,visibility:a.visible?Ab:ob,zIndex:g.zIndex||1}).on(Kb?"touchstart":"mouseover",function(v){j=v.relatedTarget||v.fromElement;b.hoverSeries!==a&&Ga(j,"isTracker")!==f&&a.onMouseOver();m.onMouseOver()}).on("mouseout",function(v){if(!g.stickyTracking){j= +v.relatedTarget||v.toElement;Ga(j,"isTracker")!==f&&a.onMouseOut()}}).css(i).add(m.group||b.trackerGroup)})},animate:function(a){var b=this,c=b.data;if(!a){u(c,function(d){var e=d.graphic;d=d.shapeArgs;if(e){e.attr({height:0,y:b.yAxis.translate(0,0,1)});e.animate({height:d.height,y:d.y},b.options.animation)}});b.animate=null}},remove:function(){var a=this,b=a.chart;b.hasRendered&&u(b.series,function(c){if(c.type===a.type)c.isDirty=true});sb.prototype.remove.apply(a,arguments)}});wb.column=hd;ma=yb(hd, +{type:"bar",init:function(a){a.inverted=this.inverted=true;hd.prototype.init.apply(this,arguments)}});wb.bar=ma;ma=yb(sb,{type:"scatter",translate:function(){var a=this;sb.prototype.translate.apply(a);u(a.data,function(b){b.shapeType="circle";b.shapeArgs={x:b.plotX,y:b.plotY,r:a.chart.options.tooltip.snap}})},drawTracker:function(){var a=this,b=a.options.cursor,c=b&&{cursor:b},d;u(a.data,function(e){(d=e.graphic)&&d.attr({isTracker:true}).on("mouseover",function(){a.onMouseOver();e.onMouseOver()}).on("mouseout", +function(){a.options.stickyTracking||a.onMouseOut()}).css(c)})},cleanData:function(){}});wb.scatter=ma;ma=yb(Oc,{init:function(){Oc.prototype.init.apply(this,arguments);var a=this,b;sa(a,{visible:a.visible!==false,name:A(a.name,"Slice")});b=function(){a.slice()};Qa(a,"select",b);Qa(a,"unselect",b);return a},setVisible:function(a){var b=this.series.chart,c=this.tracker,d=this.dataLabel,e=this.connector,f=this.shadowGroup,g;g=(this.visible=a=a===Wa?!this.visible:a)?"show":"hide";this.group[g]();c&& +c[g]();d&&d[g]();e&&e[g]();f&&f[g]();this.legendItem&&b.legend.colorizeItem(this,a)},slice:function(a,b,c){var d=this.series.chart,e=this.slicedTranslation;oc(c,d);A(b,true);a=this.sliced=K(a)?a:!this.sliced;a={translateX:a?e[0]:d.plotLeft,translateY:a?e[1]:d.plotTop};this.group.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)}});ma=yb(sb,{type:"pie",isCartesian:false,pointClass:ma,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:function(){this.initialColor= +this.chart.counters.color},animate:function(){var a=this;u(a.data,function(b){var c=b.graphic;b=b.shapeArgs;var d=-kc/2;if(c){c.attr({r:0,start:d,end:d});c.animate({r:b.r,start:b.start,end:b.end},a.options.animation)}});a.animate=null},translate:function(){var a=0,b=-0.25,c=this.options,d=c.slicedOffset,e=d+c.borderWidth,f=c.center.concat([c.size,c.innerSize||0]),g=this.chart,h=g.plotWidth,i=g.plotHeight,j,m,v,P=this.data,T=2*kc,Y,H=tb(h,i),U,z,M,y=c.dataLabels.distance;f=tc(f,function(C,Z){return(U= +/%$/.test(C))?[h,i,H,H][Z]*ja(C)/100:C});this.getX=function(C,Z){v=Fa.asin((C-f[1])/(f[2]/2+y));return f[0]+(Z?-1:1)*rb(v)*(f[2]/2+y)};this.center=f;u(P,function(C){a+=C.y});u(P,function(C){Y=a?C.y/a:0;j=W(b*T*1E3)/1E3;b+=Y;m=W(b*T*1E3)/1E3;C.shapeType="arc";C.shapeArgs={x:f[0],y:f[1],r:f[2]/2,innerR:f[3]/2,start:j,end:m};v=(m+j)/2;C.slicedTranslation=tc([rb(v)*d+g.plotLeft,Cb(v)*d+g.plotTop],W);z=rb(v)*f[2]/2;M=Cb(v)*f[2]/2;C.tooltipPos=[f[0]+z*0.7,f[1]+M*0.7];C.labelPos=[f[0]+z+rb(v)*y,f[1]+M+Cb(v)* +y,f[0]+z+rb(v)*e,f[1]+M+Cb(v)*e,f[0]+z,f[1]+M,y<0?"center":v0,T=[[],[]],Y,H,U,z,M=2,y;if(d.enabled){sb.prototype.drawDataLabels.apply(this);u(a,function(gb){if(gb.dataLabel)T[gb.labelPos[7]U){h=[].concat(Sa);h.sort(z);for(y=Na;y--;)h[y].rank= +y;for(y=Na;y--;)Sa[y].rank>=U&&Sa.splice(y,1);Na=Sa.length}for(y=0;yH&&C[Ea+1]!==null||Y/g, '') + .split(//g), + childNodes = textNode.childNodes, + styleRegex = /style="([^"]+)"/, + hrefRegex = /href="([^"]+)"/, + parentX = attr(textNode, 'x'), + textStyles = wrapper.styles, + renderAsHtml = textStyles && wrapper.useHTML && !this.forExport, + htmlNode = wrapper.htmlNode, + //arr, issue #38 workaround + width = textStyles && pInt(textStyles.width), + textLineHeight = textStyles && textStyles.lineHeight, + lastLine, + GET_COMPUTED_STYLE = 'getComputedStyle', + i = childNodes.length; + + // remove old text + while (i--) { + textNode.removeChild(childNodes[i]); + } + + if (width && !wrapper.added) { + this.box.appendChild(textNode); // attach it to the DOM to read offset width + } + + each(lines, function (line, lineNo) { + var spans, spanNo = 0, lineHeight; + + line = line.replace(//g, '|||'); + spans = line.split('|||'); + + each(spans, function (span) { + if (span !== '' || spans.length === 1) { + var attributes = {}, + tspan = doc.createElementNS(SVG_NS, 'tspan'); + if (styleRegex.test(span)) { + attr( + tspan, + 'style', + span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2') + ); + } + if (hrefRegex.test(span)) { + attr(tspan, 'onclick', 'location.href=\"' + span.match(hrefRegex)[1] + '\"'); + css(tspan, { cursor: 'pointer' }); + } + + span = (span.replace(/<(.|\n)*?>/g, '') || ' ') + .replace(/</g, '<') + .replace(/>/g, '>'); + + // issue #38 workaround. + /*if (reverse) { + arr = []; + i = span.length; + while (i--) { + arr.push(span.charAt(i)); + } + span = arr.join(''); + }*/ + + // add the text node + tspan.appendChild(doc.createTextNode(span)); + + if (!spanNo) { // first span in a line, align it to the left + attributes.x = parentX; + } else { + // Firefox ignores spaces at the front or end of the tspan + attributes.dx = 3; // space + } + + // first span on subsequent line, add the line height + if (!spanNo) { + if (lineNo) { + + // allow getting the right offset height in exporting in IE + if (!hasSVG && wrapper.renderer.forExport) { + css(tspan, { display: 'block' }); + } + + // Webkit and opera sometimes return 'normal' as the line height. In that + // case, webkit uses offsetHeight, while Opera falls back to 18 + lineHeight = win[GET_COMPUTED_STYLE] && + pInt(win[GET_COMPUTED_STYLE](lastLine, null).getPropertyValue('line-height')); + + if (!lineHeight || isNaN(lineHeight)) { + lineHeight = textLineHeight || lastLine.offsetHeight || 18; + } + attr(tspan, 'dy', lineHeight); + } + lastLine = tspan; // record for use in next line + } + + // add attributes + attr(tspan, attributes); + + // append it + textNode.appendChild(tspan); + + spanNo++; + + // check width and apply soft breaks + if (width) { + var words = span.replace(/-/g, '- ').split(' '), + tooLong, + actualWidth, + rest = []; + + while (words.length || rest.length) { + actualWidth = textNode.getBBox().width; + tooLong = actualWidth > width; + if (!tooLong || words.length === 1) { // new line needed + words = rest; + rest = []; + if (words.length) { + tspan = doc.createElementNS(SVG_NS, 'tspan'); + attr(tspan, { + dy: textLineHeight || 16, + x: parentX + }); + textNode.appendChild(tspan); + + if (actualWidth > width) { // a single word is pressing it out + width = actualWidth; + } + } + } else { // append to existing line tspan + tspan.removeChild(tspan.firstChild); + rest.unshift(words.pop()); + } + if (words.length) { + tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-'))); + } + } + } + } + }); + }); + + // Fix issue #38 and allow HTML in tooltips and other labels + if (renderAsHtml) { + if (!htmlNode) { + htmlNode = wrapper.htmlNode = createElement('span', null, extend(textStyles, { + position: ABSOLUTE, + top: 0, + left: 0 + }), this.box.parentNode); + } + htmlNode.innerHTML = wrapper.textStr; + + i = childNodes.length; + while (i--) { + childNodes[i].style.visibility = HIDDEN; + } + } + }, + + /** + * Make a straight line crisper by not spilling out to neighbour pixels + * @param {Array} points + * @param {Number} width + */ + crispLine: function (points, width) { + // points format: [M, 0, 0, L, 100, 0] + // normalize to a crisp line + if (points[1] === points[4]) { + points[1] = points[4] = mathRound(points[1]) + (width % 2 / 2); + } + if (points[2] === points[5]) { + points[2] = points[5] = mathRound(points[2]) + (width % 2 / 2); + } + return points; + }, + + + /** + * Draw a path + * @param {Array} path An SVG path in array form + */ + path: function (path) { + return this.createElement('path').attr({ + d: path, + fill: NONE + }); + }, + + /** + * Draw and return an SVG circle + * @param {Number} x The x position + * @param {Number} y The y position + * @param {Number} r The radius + */ + circle: function (x, y, r) { + var attr = isObject(x) ? + x : + { + x: x, + y: y, + r: r + }; + + return this.createElement('circle').attr(attr); + }, + + /** + * Draw and return an arc + * @param {Number} x X position + * @param {Number} y Y position + * @param {Number} r Radius + * @param {Number} innerR Inner radius like used in donut charts + * @param {Number} start Starting angle + * @param {Number} end Ending angle + */ + arc: function (x, y, r, innerR, start, end) { + // arcs are defined as symbols for the ability to set + // attributes in attr and animate + + if (isObject(x)) { + y = x.y; + r = x.r; + innerR = x.innerR; + start = x.start; + end = x.end; + x = x.x; + } + + return this.symbol('arc', x || 0, y || 0, r || 0, { + innerR: innerR || 0, + start: start || 0, + end: end || 0 + }); + }, + + /** + * Draw and return a rectangle + * @param {Number} x Left position + * @param {Number} y Top position + * @param {Number} width + * @param {Number} height + * @param {Number} r Border corner radius + * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing + */ + rect: function (x, y, width, height, r, strokeWidth) { + if (isObject(x)) { + y = x.y; + width = x.width; + height = x.height; + r = x.r; + strokeWidth = x.strokeWidth; + x = x.x; + } + var wrapper = this.createElement('rect').attr({ + rx: r, + ry: r, + fill: NONE + }); + + return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); + }, + + /** + * Resize the box and re-align all aligned elements + * @param {Object} width + * @param {Object} height + * @param {Boolean} animate + * + */ + setSize: function (width, height, animate) { + var renderer = this, + alignedObjects = renderer.alignedObjects, + i = alignedObjects.length; + + renderer.width = width; + renderer.height = height; + + renderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({ + width: width, + height: height + }); + + while (i--) { + alignedObjects[i].align(); + } + }, + + /** + * Create a group + * @param {String} name The group will be given a class name of 'highcharts-{name}'. + * This can be used for styling and scripting. + */ + g: function (name) { + var elem = this.createElement('g'); + return defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem; + }, + + /** + * Display an image + * @param {String} src + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + image: function (src, x, y, width, height) { + var attribs = { + preserveAspectRatio: NONE + }, + elemWrapper; + + // optional properties + if (arguments.length > 1) { + extend(attribs, { + x: x, + y: y, + width: width, + height: height + }); + } + + elemWrapper = this.createElement('image').attr(attribs); + + // set the href in the xlink namespace + if (elemWrapper.element.setAttributeNS) { + elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink', + 'href', src); + } else { + // could be exporting in IE + // using href throws "not supported" in ie7 and under, requries regex shim to fix later + elemWrapper.element.setAttribute('hc-svg-href', src); + } + + return elemWrapper; + }, + + /** + * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object. + * + * @param {Object} symbol + * @param {Object} x + * @param {Object} y + * @param {Object} radius + * @param {Object} options + */ + symbol: function (symbol, x, y, radius, options) { + + var obj, + + // get the symbol definition function + symbolFn = this.symbols[symbol], + + // check if there's a path defined for this symbol + path = symbolFn && symbolFn( + mathRound(x), + mathRound(y), + radius, + options + ), + + imageRegex = /^url\((.*?)\)$/, + imageSrc, + imageSize; + + if (path) { + + obj = this.path(path); + // expando properties for use in animate and attr + extend(obj, { + symbolName: symbol, + x: x, + y: y, + r: radius + }); + if (options) { + extend(obj, options); + } + + + // image symbols + } else if (imageRegex.test(symbol)) { + + var centerImage = function (img, size) { + img.attr({ + width: size[0], + height: size[1] + }).translate( + -mathRound(size[0] / 2), + -mathRound(size[1] / 2) + ); + }; + + imageSrc = symbol.match(imageRegex)[1]; + imageSize = symbolSizes[imageSrc]; + + // create the image synchronously, add attribs async + obj = this.image(imageSrc) + .attr({ + x: x, + y: y + }); + + if (imageSize) { + centerImage(obj, imageSize); + } else { + // initialize image to be 0 size so export will still function if there's no cached sizes + obj.attr({ width: 0, height: 0 }); + + // create a dummy JavaScript image to get the width and height + createElement('img', { + onload: function () { + var img = this; + centerImage(obj, symbolSizes[imageSrc] = [img.width, img.height]); + }, + src: imageSrc + }); + } + + // default circles + } else { + obj = this.circle(x, y, radius); + } + + return obj; + }, + + /** + * An extendable collection of functions for defining symbol paths. + */ + symbols: { + 'square': function (x, y, radius) { + var len = 0.707 * radius; + return [ + M, x - len, y - len, + L, x + len, y - len, + x + len, y + len, + x - len, y + len, + 'Z' + ]; + }, + + 'triangle': function (x, y, radius) { + return [ + M, x, y - 1.33 * radius, + L, x + radius, y + 0.67 * radius, + x - radius, y + 0.67 * radius, + 'Z' + ]; + }, + + 'triangle-down': function (x, y, radius) { + return [ + M, x, y + 1.33 * radius, + L, x - radius, y - 0.67 * radius, + x + radius, y - 0.67 * radius, + 'Z' + ]; + }, + 'diamond': function (x, y, radius) { + return [ + M, x, y - radius, + L, x + radius, y, + x, y + radius, + x - radius, y, + 'Z' + ]; + }, + 'arc': function (x, y, radius, options) { + var start = options.start, + end = options.end - 0.000001, // to prevent cos and sin of start and end from becoming equal on 360 arcs + innerRadius = options.innerR, + cosStart = mathCos(start), + sinStart = mathSin(start), + cosEnd = mathCos(end), + sinEnd = mathSin(end), + longArc = options.end - start < mathPI ? 0 : 1; + + return [ + M, + x + radius * cosStart, + y + radius * sinStart, + 'A', // arcTo + radius, // x radius + radius, // y radius + 0, // slanting + longArc, // long or short arc + 1, // clockwise + x + radius * cosEnd, + y + radius * sinEnd, + L, + x + innerRadius * cosEnd, + y + innerRadius * sinEnd, + 'A', // arcTo + innerRadius, // x radius + innerRadius, // y radius + 0, // slanting + longArc, // long or short arc + 0, // clockwise + x + innerRadius * cosStart, + y + innerRadius * sinStart, + + 'Z' // close + ]; + } + }, + + /** + * Define a clipping rectangle + * @param {String} id + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + clipRect: function (x, y, width, height) { + var wrapper, + id = PREFIX + idCounter++, + + clipPath = this.createElement('clipPath').attr({ + id: id + }).add(this.defs); + + wrapper = this.rect(x, y, width, height, 0).add(clipPath); + wrapper.id = id; + wrapper.clipPath = clipPath; + + return wrapper; + }, + + + /** + * Take a color and return it if it's a string, make it a gradient if it's a + * gradient configuration object + * + * @param {Object} color The color or config object + */ + color: function (color, elem, prop) { + var colorObject, + regexRgba = /^rgba/; + if (color && color.linearGradient) { + var renderer = this, + strLinearGradient = 'linearGradient', + linearGradient = color[strLinearGradient], + id = PREFIX + idCounter++, + gradientObject, + stopColor, + stopOpacity; + gradientObject = renderer.createElement(strLinearGradient).attr({ + id: id, + gradientUnits: 'userSpaceOnUse', + x1: linearGradient[0], + y1: linearGradient[1], + x2: linearGradient[2], + y2: linearGradient[3] + }).add(renderer.defs); + + // Keep a reference to the gradient object so it is possible to destroy it later + renderer.gradients.push(gradientObject); + + // The gradient needs to keep a list of stops to be able to destroy them + gradientObject.stops = []; + each(color.stops, function (stop) { + var stopObject; + if (regexRgba.test(stop[1])) { + colorObject = Color(stop[1]); + stopColor = colorObject.get('rgb'); + stopOpacity = colorObject.get('a'); + } else { + stopColor = stop[1]; + stopOpacity = 1; + } + stopObject = renderer.createElement('stop').attr({ + offset: stop[0], + 'stop-color': stopColor, + 'stop-opacity': stopOpacity + }).add(gradientObject); + + // Add the stop element to the gradient + gradientObject.stops.push(stopObject); + }); + + return 'url(' + this.url + '#' + id + ')'; + + // Webkit and Batik can't show rgba. + } else if (regexRgba.test(color)) { + colorObject = Color(color); + attr(elem, prop + '-opacity', colorObject.get('a')); + + return colorObject.get('rgb'); + + + } else { + // Remove the opacity attribute added above. Does not throw if the attribute is not there. + elem.removeAttribute(prop + '-opacity'); + + return color; + } + + }, + + + /** + * Add text to the SVG object + * @param {String} str + * @param {Number} x Left position + * @param {Number} y Top position + * @param {Boolean} useHTML Use HTML to render the text + */ + text: function (str, x, y, useHTML) { + + // declare variables + var defaultChartStyle = defaultOptions.chart.style, + wrapper; + + x = mathRound(pick(x, 0)); + y = mathRound(pick(y, 0)); + + wrapper = this.createElement('text') + .attr({ + x: x, + y: y, + text: str + }) + .css({ + fontFamily: defaultChartStyle.fontFamily, + fontSize: defaultChartStyle.fontSize + }); + + wrapper.x = x; + wrapper.y = y; + wrapper.useHTML = useHTML; + return wrapper; + } +}; // end SVGRenderer + +// general renderer +Renderer = SVGRenderer; + + + +/* **************************************************************************** + * * + * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE * + * * + * For applications and websites that don't need IE support, like platform * + * targeted mobile apps and web apps, this code can be removed. * + * * + *****************************************************************************/ +var VMLRenderer; +if (!hasSVG) { + +/** + * The VML element wrapper. + */ +var VMLElement = extendClass(SVGElement, { + + /** + * Initialize a new VML element wrapper. It builds the markup as a string + * to minimize DOM traffic. + * @param {Object} renderer + * @param {Object} nodeName + */ + init: function (renderer, nodeName) { + var markup = ['<', nodeName, ' filled="f" stroked="f"'], + style = ['position: ', ABSOLUTE, ';']; + + // divs and shapes need size + if (nodeName === 'shape' || nodeName === DIV) { + style.push('left:0;top:0;width:10px;height:10px;'); + } + if (docMode8) { + style.push('visibility: ', nodeName === DIV ? HIDDEN : VISIBLE); + } + + markup.push(' style="', style.join(''), '"/>'); + + // create element with default attributes and style + if (nodeName) { + markup = nodeName === DIV || nodeName === 'span' || nodeName === 'img' ? + markup.join('') + : renderer.prepVML(markup); + this.element = createElement(markup); + } + + this.renderer = renderer; + }, + + /** + * Add the node to the given parent + * @param {Object} parent + */ + add: function (parent) { + var wrapper = this, + renderer = wrapper.renderer, + element = wrapper.element, + box = renderer.box, + inverted = parent && parent.inverted, + + // get the parent node + parentNode = parent ? + parent.element || parent : + box; + + + // if the parent group is inverted, apply inversion on all children + if (inverted) { // only on groups + renderer.invertChild(element, parentNode); + } + + // issue #140 workaround - related to #61 and #74 + if (docMode8 && parentNode.gVis === HIDDEN) { + css(element, { visibility: HIDDEN }); + } + + // append it + parentNode.appendChild(element); + + // align text after adding to be able to read offset + wrapper.added = true; + if (wrapper.alignOnAdd) { + wrapper.updateTransform(); + } + + return wrapper; + }, + + /** + * Get or set attributes + */ + attr: function (hash, val) { + var key, + value, + i, + element = this.element || {}, + elemStyle = element.style, + nodeName = element.nodeName, + renderer = this.renderer, + symbolName = this.symbolName, + childNodes, + hasSetSymbolSize, + shadows = this.shadows, + skipAttr, + ret = this; + + // single key-value pair + if (isString(hash) && defined(val)) { + key = hash; + hash = {}; + hash[key] = val; + } + + // used as a getter, val is undefined + if (isString(hash)) { + key = hash; + if (key === 'strokeWidth' || key === 'stroke-width') { + ret = this.strokeweight; + } else { + ret = this[key]; + } + + // setter + } else { + for (key in hash) { + value = hash[key]; + skipAttr = false; + + // prepare paths + // symbols + if (symbolName && /^(x|y|r|start|end|width|height|innerR)/.test(key)) { + // if one of the symbol size affecting parameters are changed, + // check all the others only once for each call to an element's + // .attr() method + if (!hasSetSymbolSize) { + this.symbolAttr(hash); + + hasSetSymbolSize = true; + } + + skipAttr = true; + + } else if (key === 'd') { + value = value || []; + this.d = value.join(' '); // used in getter for animation + + // convert paths + i = value.length; + var convertedPath = []; + while (i--) { + + // Multiply by 10 to allow subpixel precision. + // Substracting half a pixel seems to make the coordinates + // align with SVG, but this hasn't been tested thoroughly + if (isNumber(value[i])) { + convertedPath[i] = mathRound(value[i] * 10) - 5; + } else if (value[i] === 'Z') { // close the path + convertedPath[i] = 'x'; + } else { + convertedPath[i] = value[i]; + } + + } + value = convertedPath.join(' ') || 'x'; + element.path = value; + + // update shadows + if (shadows) { + i = shadows.length; + while (i--) { + shadows[i].path = value; + } + } + skipAttr = true; + + // directly mapped to css + } else if (key === 'zIndex' || key === 'visibility') { + + // issue 61 workaround + if (docMode8 && key === 'visibility' && nodeName === 'DIV') { + element.gVis = value; + childNodes = element.childNodes; + i = childNodes.length; + while (i--) { + css(childNodes[i], { visibility: value }); + } + if (value === VISIBLE) { // issue 74 + value = null; + } + } + + if (value) { + elemStyle[key] = value; + } + + + + skipAttr = true; + + // width and height + } else if (/^(width|height)$/.test(key)) { + + this[key] = value; // used in getter + + // clipping rectangle special + if (this.updateClipping) { + this[key] = value; + this.updateClipping(); + + } else { + // normal + elemStyle[key] = value; + } + + skipAttr = true; + + // x and y + } else if (/^(x|y)$/.test(key)) { + + this[key] = value; // used in getter + + if (element.tagName === 'SPAN') { + this.updateTransform(); + + } else { + elemStyle[{ x: 'left', y: 'top' }[key]] = value; + } + + // class name + } else if (key === 'class') { + // IE8 Standards mode has problems retrieving the className + element.className = value; + + // stroke + } else if (key === 'stroke') { + + value = renderer.color(value, element, key); + + key = 'strokecolor'; + + // stroke width + } else if (key === 'stroke-width' || key === 'strokeWidth') { + element.stroked = value ? true : false; + key = 'strokeweight'; + this[key] = value; // used in getter, issue #113 + if (isNumber(value)) { + value += PX; + } + + // dashStyle + } else if (key === 'dashstyle') { + var strokeElem = element.getElementsByTagName('stroke')[0] || + createElement(renderer.prepVML(['']), null, null, element); + strokeElem[key] = value || 'solid'; + this.dashstyle = value; /* because changing stroke-width will change the dash length + and cause an epileptic effect */ + skipAttr = true; + + // fill + } else if (key === 'fill') { + + if (nodeName === 'SPAN') { // text color + elemStyle.color = value; + } else { + element.filled = value !== NONE ? true : false; + + value = renderer.color(value, element, key); + + key = 'fillcolor'; + } + + // translation for animation + } else if (key === 'translateX' || key === 'translateY' || key === 'rotation' || key === 'align') { + if (key === 'align') { + key = 'textAlign'; + } + this[key] = value; + this.updateTransform(); + + skipAttr = true; + } else if (key === 'text') { // text for rotated and non-rotated elements + this.bBox = null; + element.innerHTML = value; + skipAttr = true; + } + + + // let the shadow follow the main element + if (shadows && key === 'visibility') { + i = shadows.length; + while (i--) { + shadows[i].style[key] = value; + } + } + + + + if (!skipAttr) { + if (docMode8) { // IE8 setAttribute bug + element[key] = value; + } else { + attr(element, key, value); + } + } + } + } + return ret; + }, + + /** + * Set the element's clipping to a predefined rectangle + * + * @param {String} id The id of the clip rectangle + */ + clip: function (clipRect) { + var wrapper = this, + clipMembers = clipRect.members; + + clipMembers.push(wrapper); + wrapper.destroyClip = function () { + erase(clipMembers, wrapper); + }; + return wrapper.css(clipRect.getCSS(wrapper.inverted)); + }, + + /** + * Set styles for the element + * @param {Object} styles + */ + css: function (styles) { + var wrapper = this, + element = wrapper.element, + textWidth = styles && element.tagName === 'SPAN' && styles.width; + + /*if (textWidth) { + extend(styles, { + display: 'block', + whiteSpace: 'normal' + }); + }*/ + if (textWidth) { + delete styles.width; + wrapper.textWidth = textWidth; + wrapper.updateTransform(); + } + + wrapper.styles = extend(wrapper.styles, styles); + css(wrapper.element, styles); + + return wrapper; + }, + + /** + * Removes a child either by removeChild or move to garbageBin. + * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not. + */ + safeRemoveChild: function (element) { + // discardElement will detach the node from its parent before attaching it + // to the garbage bin. Therefore it is important that the node is attached and have parent. + var parentNode = element.parentNode; + if (parentNode) { + discardElement(element); + } + }, + + /** + * Extend element.destroy by removing it from the clip members array + */ + destroy: function () { + var wrapper = this; + + if (wrapper.destroyClip) { + wrapper.destroyClip(); + } + + return SVGElement.prototype.destroy.apply(wrapper); + }, + + /** + * Remove all child nodes of a group, except the v:group element + */ + empty: function () { + var element = this.element, + childNodes = element.childNodes, + i = childNodes.length, + node; + + while (i--) { + node = childNodes[i]; + node.parentNode.removeChild(node); + } + }, + + /** + * VML override for calculating the bounding box based on offsets + * + * @return {Object} A hash containing values for x, y, width and height + */ + + getBBox: function () { + var wrapper = this, + element = wrapper.element, + bBox = wrapper.bBox; + + if (!bBox) { + // faking getBBox in exported SVG in legacy IE + if (element.nodeName === 'text') { + element.style.position = ABSOLUTE; + } + + bBox = wrapper.bBox = { + x: element.offsetLeft, + y: element.offsetTop, + width: element.offsetWidth, + height: element.offsetHeight + }; + } + return bBox; + + }, + + /** + * Add an event listener. VML override for normalizing event parameters. + * @param {String} eventType + * @param {Function} handler + */ + on: function (eventType, handler) { + // simplest possible event model for internal use + this.element['on' + eventType] = function () { + var evt = win.event; + evt.target = evt.srcElement; + handler(evt); + }; + return this; + }, + + + /** + * VML override private method to update elements based on internal + * properties based on SVG transform + */ + updateTransform: function () { + // aligning non added elements is expensive + if (!this.added) { + this.alignOnAdd = true; + return; + } + + var wrapper = this, + elem = wrapper.element, + translateX = wrapper.translateX || 0, + translateY = wrapper.translateY || 0, + x = wrapper.x || 0, + y = wrapper.y || 0, + align = wrapper.textAlign || 'left', + alignCorrection = { left: 0, center: 0.5, right: 1 }[align], + nonLeft = align && align !== 'left'; + + // apply translate + if (translateX || translateY) { + wrapper.css({ + marginLeft: translateX, + marginTop: translateY + }); + } + + // apply inversion + if (wrapper.inverted) { // wrapper is a group + each(elem.childNodes, function (child) { + wrapper.renderer.invertChild(child, elem); + }); + } + + if (elem.tagName === 'SPAN') { + + var width, height, + rotation = wrapper.rotation, + lineHeight, + radians = 0, + costheta = 1, + sintheta = 0, + quad, + textWidth = pInt(wrapper.textWidth), + xCorr = wrapper.xCorr || 0, + yCorr = wrapper.yCorr || 0, + currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(','); + + if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed + + if (defined(rotation)) { + radians = rotation * deg2rad; // deg to rad + costheta = mathCos(radians); + sintheta = mathSin(radians); + + // Adjust for alignment and rotation. + // Test case: http://highcharts.com/tests/?file=text-rotation + css(elem, { + filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta, + ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta, + ', sizingMethod=\'auto expand\')'].join('') : NONE + }); + } + + width = elem.offsetWidth; + height = elem.offsetHeight; + + // update textWidth + if (width > textWidth) { + css(elem, { + width: textWidth + PX, + display: 'block', + whiteSpace: 'normal' + }); + width = textWidth; + } + + // correct x and y + lineHeight = mathRound((pInt(elem.style.fontSize) || 12) * 1.2); + xCorr = costheta < 0 && -width; + yCorr = sintheta < 0 && -height; + + // correct for lineHeight and corners spilling out after rotation + quad = costheta * sintheta < 0; + xCorr += sintheta * lineHeight * (quad ? 1 - alignCorrection : alignCorrection); + yCorr -= costheta * lineHeight * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1); + + // correct for the length/height of the text + if (nonLeft) { + xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1); + if (rotation) { + yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1); + } + css(elem, { + textAlign: align + }); + } + + // record correction + wrapper.xCorr = xCorr; + wrapper.yCorr = yCorr; + } + + // apply position with correction + css(elem, { + left: x + xCorr, + top: y + yCorr + }); + + // record current text transform + wrapper.cTT = currentTextTransform; + } + }, + + /** + * Apply a drop shadow by copying elements and giving them different strokes + * @param {Boolean} apply + */ + shadow: function (apply, group) { + var shadows = [], + i, + element = this.element, + renderer = this.renderer, + shadow, + elemStyle = element.style, + markup, + path = element.path; + + // some times empty paths are not strings + if (path && typeof path.value !== 'string') { + path = 'x'; + } + + if (apply) { + for (i = 1; i <= 3; i++) { + markup = ['']; + shadow = createElement(renderer.prepVML(markup), + null, { + left: pInt(elemStyle.left) + 1, + top: pInt(elemStyle.top) + 1 + } + ); + + // apply the opacity + markup = ['']; + createElement(renderer.prepVML(markup), null, null, shadow); + + + // insert it + if (group) { + group.element.appendChild(shadow); + } else { + element.parentNode.insertBefore(shadow, element); + } + + // record it + shadows.push(shadow); + + } + + this.shadows = shadows; + } + return this; + + } +}); + +/** + * The VML renderer + */ +VMLRenderer = function () { + this.init.apply(this, arguments); +}; +VMLRenderer.prototype = merge(SVGRenderer.prototype, { // inherit SVGRenderer + + Element: VMLElement, + isIE8: userAgent.indexOf('MSIE 8.0') > -1, + + + /** + * Initialize the VMLRenderer + * @param {Object} container + * @param {Number} width + * @param {Number} height + */ + init: function (container, width, height) { + var renderer = this, + boxWrapper; + + renderer.alignedObjects = []; + + boxWrapper = renderer.createElement(DIV); + container.appendChild(boxWrapper.element); + + + // generate the containing box + renderer.box = boxWrapper.element; + renderer.boxWrapper = boxWrapper; + + + renderer.setSize(width, height, false); + + // The only way to make IE6 and IE7 print is to use a global namespace. However, + // with IE8 the only way to make the dynamic shapes visible in screen and print mode + // seems to be to add the xmlns attribute and the behaviour style inline. + if (!doc.namespaces.hcv) { + + doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml'); + + // setup default css + doc.createStyleSheet().cssText = + 'hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke' + + '{ behavior:url(#default#VML); display: inline-block; } '; + + } + }, + + /** + * Define a clipping rectangle. In VML it is accomplished by storing the values + * for setting the CSS style to all associated members. + * + * @param {Number} x + * @param {Number} y + * @param {Number} width + * @param {Number} height + */ + clipRect: function (x, y, width, height) { + + // create a dummy element + var clipRect = this.createElement(); + + // mimic a rectangle with its style object for automatic updating in attr + return extend(clipRect, { + members: [], + left: x, + top: y, + width: width, + height: height, + getCSS: function (inverted) { + var rect = this,//clipRect.element.style, + top = rect.top, + left = rect.left, + right = left + rect.width, + bottom = top + rect.height, + ret = { + clip: 'rect(' + + mathRound(inverted ? left : top) + 'px,' + + mathRound(inverted ? bottom : right) + 'px,' + + mathRound(inverted ? right : bottom) + 'px,' + + mathRound(inverted ? top : left) + 'px)' + }; + + // issue 74 workaround + if (!inverted && docMode8) { + extend(ret, { + width: right + PX, + height: bottom + PX + }); + } + return ret; + }, + + // used in attr and animation to update the clipping of all members + updateClipping: function () { + each(clipRect.members, function (member) { + member.css(clipRect.getCSS(member.inverted)); + }); + } + }); + + }, + + + /** + * Take a color and return it if it's a string, make it a gradient if it's a + * gradient configuration object, and apply opacity. + * + * @param {Object} color The color or config object + */ + color: function (color, elem, prop) { + var colorObject, + regexRgba = /^rgba/, + markup; + + if (color && color.linearGradient) { + + var stopColor, + stopOpacity, + linearGradient = color.linearGradient, + angle, + color1, + opacity1, + color2, + opacity2; + + each(color.stops, function (stop, i) { + if (regexRgba.test(stop[1])) { + colorObject = Color(stop[1]); + stopColor = colorObject.get('rgb'); + stopOpacity = colorObject.get('a'); + } else { + stopColor = stop[1]; + stopOpacity = 1; + } + + if (!i) { // first + color1 = stopColor; + opacity1 = stopOpacity; + } else { + color2 = stopColor; + opacity2 = stopOpacity; + } + }); + + + + // calculate the angle based on the linear vector + angle = 90 - math.atan( + (linearGradient[3] - linearGradient[1]) / // y vector + (linearGradient[2] - linearGradient[0]) // x vector + ) * 180 / mathPI; + + // when colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + markup = ['<', prop, ' colors="0% ', color1, ',100% ', color2, '" angle="', angle, + '" opacity="', opacity2, '" o:opacity2="', opacity1, + '" type="gradient" focus="100%" />']; + createElement(this.prepVML(markup), null, null, elem); + + + + // if the color is an rgba color, split it and add a fill node + // to hold the opacity component + } else if (regexRgba.test(color) && elem.tagName !== 'IMG') { + + colorObject = Color(color); + + markup = ['<', prop, ' opacity="', colorObject.get('a'), '"/>']; + createElement(this.prepVML(markup), null, null, elem); + + return colorObject.get('rgb'); + + + } else { + var strokeNodes = elem.getElementsByTagName(prop); + if (strokeNodes.length) { + strokeNodes[0].opacity = 1; + } + return color; + } + + }, + + /** + * Take a VML string and prepare it for either IE8 or IE6/IE7. + * @param {Array} markup A string array of the VML markup to prepare + */ + prepVML: function (markup) { + var vmlStyle = 'display:inline-block;behavior:url(#default#VML);', + isIE8 = this.isIE8; + + markup = markup.join(''); + + if (isIE8) { // add xmlns and style inline + markup = markup.replace('/>', ' xmlns="urn:schemas-microsoft-com:vml" />'); + if (markup.indexOf('style="') === -1) { + markup = markup.replace('/>', ' style="' + vmlStyle + '" />'); + } else { + markup = markup.replace('style="', 'style="' + vmlStyle); + } + + } else { // add namespace + markup = markup.replace('<', ' 1) { + obj.css({ + left: x, + top: y, + width: width, + height: height + }); + } + return obj; + }, + + /** + * VML uses a shape for rect to overcome bugs and rotation problems + */ + rect: function (x, y, width, height, r, strokeWidth) { + + if (isObject(x)) { + y = x.y; + width = x.width; + height = x.height; + r = x.r; + strokeWidth = x.strokeWidth; + x = x.x; + } + var wrapper = this.symbol('rect'); + wrapper.r = r; + + return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))); + }, + + /** + * In the VML renderer, each child of an inverted div (group) is inverted + * @param {Object} element + * @param {Object} parentNode + */ + invertChild: function (element, parentNode) { + var parentStyle = parentNode.style; + + css(element, { + flip: 'x', + left: pInt(parentStyle.width) - 10, + top: pInt(parentStyle.height) - 10, + rotation: -90 + }); + }, + + /** + * Symbol definitions that override the parent SVG renderer's symbols + * + */ + symbols: { + // VML specific arc function + arc: function (x, y, radius, options) { + var start = options.start, + end = options.end, + cosStart = mathCos(start), + sinStart = mathSin(start), + cosEnd = mathCos(end), + sinEnd = mathSin(end), + innerRadius = options.innerR, + circleCorrection = 0.07 / radius, + innerCorrection = (innerRadius && 0.1 / innerRadius) || 0; + + if (end - start === 0) { // no angle, don't show it. + return ['x']; + + //} else if (end - start == 2 * mathPI) { // full circle + } else if (2 * mathPI - end + start < circleCorrection) { // full circle + // empirical correction found by trying out the limits for different radii + cosEnd = -circleCorrection; + } else if (end - start < innerCorrection) { // issue #186, another mysterious VML arc problem + cosEnd = mathCos(start + innerCorrection); + } + + return [ + 'wa', // clockwise arc to + x - radius, // left + y - radius, // top + x + radius, // right + y + radius, // bottom + x + radius * cosStart, // start x + y + radius * sinStart, // start y + x + radius * cosEnd, // end x + y + radius * sinEnd, // end y + + + 'at', // anti clockwise arc to + x - innerRadius, // left + y - innerRadius, // top + x + innerRadius, // right + y + innerRadius, // bottom + x + innerRadius * cosEnd, // start x + y + innerRadius * sinEnd, // start y + x + innerRadius * cosStart, // end x + y + innerRadius * sinStart, // end y + + 'x', // finish path + 'e' // close + ]; + + }, + // Add circle symbol path. This performs significantly faster than v:oval. + circle: function (x, y, r) { + return [ + 'wa', // clockwisearcto + x - r, // left + y - r, // top + x + r, // right + y + r, // bottom + x + r, // start x + y, // start y + x + r, // end x + y, // end y + //'x', // finish path + 'e' // close + ]; + }, + /** + * Add rectangle symbol path which eases rotation and omits arcsize problems + * compared to the built-in VML roundrect shape + * + * @param {Number} left Left position + * @param {Number} top Top position + * @param {Number} r Border radius + * @param {Object} options Width and height + */ + + rect: function (left, top, r, options) { + if (!defined(options)) { + return []; + } + var width = options.width, + height = options.height, + right = left + width, + bottom = top + height; + + r = mathMin(r, width, height); + + return [ + M, + left + r, top, + + L, + right - r, top, + 'wa', + right - 2 * r, top, + right, top + 2 * r, + right - r, top, + right, top + r, + + L, + right, bottom - r, + 'wa', + right - 2 * r, bottom - 2 * r, + right, bottom, + right, bottom - r, + right - r, bottom, + + L, + left + r, bottom, + 'wa', + left, bottom - 2 * r, + left + 2 * r, bottom, + left + r, bottom, + left, bottom - r, + + L, + left, top + r, + 'wa', + left, top, + left + 2 * r, top + 2 * r, + left, top + r, + left + r, top, + + + 'x', + 'e' + ]; + + } + } +}); + +// general renderer +Renderer = VMLRenderer; +} +/* **************************************************************************** + * * + * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE * + * * + *****************************************************************************/ + + +/** + * The chart class + * @param {Object} options + * @param {Function} callback Function to run when the chart has loaded + */ +function Chart(options, callback) { + + defaultXAxisOptions = merge(defaultXAxisOptions, defaultOptions.xAxis); + defaultYAxisOptions = merge(defaultYAxisOptions, defaultOptions.yAxis); + defaultOptions.xAxis = defaultOptions.yAxis = null; + + // Handle regular options + options = merge(defaultOptions, options); + + // Define chart variables + var optionsChart = options.chart, + optionsMargin = optionsChart.margin, + margin = isObject(optionsMargin) ? + optionsMargin : + [optionsMargin, optionsMargin, optionsMargin, optionsMargin], + optionsMarginTop = pick(optionsChart.marginTop, margin[0]), + optionsMarginRight = pick(optionsChart.marginRight, margin[1]), + optionsMarginBottom = pick(optionsChart.marginBottom, margin[2]), + optionsMarginLeft = pick(optionsChart.marginLeft, margin[3]), + spacingTop = optionsChart.spacingTop, + spacingRight = optionsChart.spacingRight, + spacingBottom = optionsChart.spacingBottom, + spacingLeft = optionsChart.spacingLeft, + spacingBox, + chartTitleOptions, + chartSubtitleOptions, + plotTop, + marginRight, + marginBottom, + plotLeft, + axisOffset, + renderTo, + renderToClone, + container, + containerId, + containerWidth, + containerHeight, + chartWidth, + chartHeight, + oldChartWidth, + oldChartHeight, + chartBackground, + plotBackground, + plotBGImage, + plotBorder, + chart = this, + chartEvents = optionsChart.events, + runChartClick = chartEvents && !!chartEvents.click, + eventType, + isInsidePlot, // function + tooltip, + mouseIsDown, + loadingDiv, + loadingSpan, + loadingShown, + plotHeight, + plotWidth, + tracker, + trackerGroup, + placeTrackerGroup, + legend, + legendWidth, + legendHeight, + chartPosition,// = getPosition(container), + hasCartesianSeries = optionsChart.showAxes, + isResizing = 0, + axes = [], + maxTicks, // handle the greatest amount of ticks on grouped axes + series = [], + inverted, + renderer, + tooltipTick, + tooltipInterval, + hoverX, + drawChartBox, // function + getMargins, // function + resetMargins, // function + setChartSize, // function + resize, + zoom, // function + zoomOut; // function + + + /** + * Create a new axis object + * @param {Object} options + */ + function Axis(userOptions) { + + // Define variables + var isXAxis = userOptions.isX, + opposite = userOptions.opposite, // needed in setOptions + horiz = inverted ? !isXAxis : isXAxis, + side = horiz ? + (opposite ? 0 : 2) : // top : bottom + (opposite ? 1 : 3), // right : left + stacks = {}, + + options = merge( + isXAxis ? defaultXAxisOptions : defaultYAxisOptions, + [defaultTopAxisOptions, defaultRightAxisOptions, + defaultBottomAxisOptions, defaultLeftAxisOptions][side], + userOptions + ), + + axis = this, + axisTitle, + type = options.type, + isDatetimeAxis = type === 'datetime', + isLog = type === 'logarithmic', + offset = options.offset || 0, + xOrY = isXAxis ? 'x' : 'y', + axisLength, + transA, // translation factor + oldTransA, // used for prerendering + transB = horiz ? plotLeft : marginBottom, // translation addend + translate, // fn + getPlotLinePath, // fn + axisGroup, + gridGroup, + axisLine, + dataMin, + dataMax, + associatedSeries, + userMin, + userMax, + max = null, + min = null, + oldMin, + oldMax, + minPadding = options.minPadding, + maxPadding = options.maxPadding, + isLinked = defined(options.linkedTo), + ignoreMinPadding, // can be set to true by a column or bar series + ignoreMaxPadding, + usePercentage, + events = options.events, + eventType, + plotLinesAndBands = [], + tickInterval, + minorTickInterval, + magnitude, + tickPositions, // array containing predefined positions + ticks = {}, + minorTicks = {}, + alternateBands = {}, + tickAmount, + labelOffset, + axisTitleMargin,// = options.title.margin, + dateTimeLabelFormat, + categories = options.categories, + labelFormatter = options.labels.formatter || // can be overwritten by dynamic format + function () { + var value = this.value, + ret; + + if (dateTimeLabelFormat) { // datetime axis + ret = dateFormat(dateTimeLabelFormat, value); + + } else if (tickInterval % 1000000 === 0) { // use M abbreviation + ret = (value / 1000000) + 'M'; + + } else if (tickInterval % 1000 === 0) { // use k abbreviation + ret = (value / 1000) + 'k'; + + } else if (!categories && value >= 1000) { // add thousands separators + ret = numberFormat(value, 0); + + } else { // strings (categories) and small numbers + ret = value; + } + return ret; + }, + + staggerLines = horiz && options.labels.staggerLines, + reversed = options.reversed, + tickmarkOffset = (categories && options.tickmarkPlacement === 'between') ? 0.5 : 0; + + /** + * The Tick class + */ + function Tick(pos, minor) { + var tick = this; + tick.pos = pos; + tick.minor = minor; + tick.isNew = true; + + if (!minor) { + tick.addLabel(); + } + } + Tick.prototype = { + /** + * Write the tick label + */ + addLabel: function () { + var pos = this.pos, + labelOptions = options.labels, + str, + withLabel = !((pos === min && !pick(options.showFirstLabel, 1)) || + (pos === max && !pick(options.showLastLabel, 0))), + width = (categories && horiz && categories.length && + !labelOptions.step && !labelOptions.staggerLines && + !labelOptions.rotation && + plotWidth / categories.length) || + (!horiz && plotWidth / 2), + css, + value = categories && defined(categories[pos]) ? categories[pos] : pos, + label = this.label; + + + // get the string + str = labelFormatter.call({ + isFirst: pos === tickPositions[0], + isLast: pos === tickPositions[tickPositions.length - 1], + dateTimeLabelFormat: dateTimeLabelFormat, + value: isLog ? lin2log(value) : value + }); + + + // prepare CSS + css = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX }; + css = extend(css, labelOptions.style); + + // first call + if (label === UNDEFINED) { + this.label = + defined(str) && withLabel && labelOptions.enabled ? + renderer.text( + str, + 0, + 0, + labelOptions.useHTML + ) + .attr({ + align: labelOptions.align, + rotation: labelOptions.rotation + }) + // without position absolute, IE export sometimes is wrong + .css(css) + .add(axisGroup) : + null; + + // update + } else if (label) { + label.attr({ text: str }) + .css(css); + } + }, + /** + * Get the offset height or width of the label + */ + getLabelSize: function () { + var label = this.label; + return label ? + ((this.labelBBox = label.getBBox()))[horiz ? 'height' : 'width'] : + 0; + }, + /** + * Put everything in place + * + * @param index {Number} + * @param old {Boolean} Use old coordinates to prepare an animation into new position + */ + render: function (index, old) { + var tick = this, + major = !tick.minor, + label = tick.label, + pos = tick.pos, + labelOptions = options.labels, + gridLine = tick.gridLine, + gridLineWidth = major ? options.gridLineWidth : options.minorGridLineWidth, + gridLineColor = major ? options.gridLineColor : options.minorGridLineColor, + dashStyle = major ? + options.gridLineDashStyle : + options.minorGridLineDashStyle, + gridLinePath, + mark = tick.mark, + markPath, + tickLength = major ? options.tickLength : options.minorTickLength, + tickWidth = major ? options.tickWidth : (options.minorTickWidth || 0), + tickColor = major ? options.tickColor : options.minorTickColor, + tickPosition = major ? options.tickPosition : options.minorTickPosition, + step = labelOptions.step, + cHeight = (old && oldChartHeight) || chartHeight, + attribs, + x, + y; + + // get x and y position for ticks and labels + x = horiz ? + translate(pos + tickmarkOffset, null, null, old) + transB : + plotLeft + offset + (opposite ? ((old && oldChartWidth) || chartWidth) - marginRight - plotLeft : 0); + + y = horiz ? + cHeight - marginBottom + offset - (opposite ? plotHeight : 0) : + cHeight - translate(pos + tickmarkOffset, null, null, old) - transB; + + // create the grid line + if (gridLineWidth) { + gridLinePath = getPlotLinePath(pos + tickmarkOffset, gridLineWidth, old); + + if (gridLine === UNDEFINED) { + attribs = { + stroke: gridLineColor, + 'stroke-width': gridLineWidth + }; + if (dashStyle) { + attribs.dashstyle = dashStyle; + } + if (major) { + attribs.zIndex = 1; + } + tick.gridLine = gridLine = + gridLineWidth ? + renderer.path(gridLinePath) + .attr(attribs).add(gridGroup) : + null; + } + + // If the parameter 'old' is set, the current call will be followed + // by another call, therefore do not do any animations this time + if (!old && gridLine && gridLinePath) { + gridLine.animate({ + d: gridLinePath + }); + } + } + + // create the tick mark + if (tickWidth) { + + // negate the length + if (tickPosition === 'inside') { + tickLength = -tickLength; + } + if (opposite) { + tickLength = -tickLength; + } + + markPath = renderer.crispLine([ + M, + x, + y, + L, + x + (horiz ? 0 : -tickLength), + y + (horiz ? tickLength : 0) + ], tickWidth); + + if (mark) { // updating + mark.animate({ + d: markPath + }); + } else { // first time + tick.mark = renderer.path( + markPath + ).attr({ + stroke: tickColor, + 'stroke-width': tickWidth + }).add(axisGroup); + } + } + + // the label is created on init - now move it into place + if (label && !isNaN(x)) { + x = x + labelOptions.x - (tickmarkOffset && horiz ? + tickmarkOffset * transA * (reversed ? -1 : 1) : 0); + y = y + labelOptions.y - (tickmarkOffset && !horiz ? + tickmarkOffset * transA * (reversed ? 1 : -1) : 0); + + // vertically centered + if (!defined(labelOptions.y)) { + y += pInt(label.styles.lineHeight) * 0.9 - label.getBBox().height / 2; + } + + + // correct for staggered labels + if (staggerLines) { + y += (index / (step || 1) % staggerLines) * 16; + } + // apply step + if (step) { + // show those indices dividable by step + label[index % step ? 'hide' : 'show'](); + } + + label[tick.isNew ? 'attr' : 'animate']({ + x: x, + y: y + }); + } + + tick.isNew = false; + }, + /** + * Destructor for the tick prototype + */ + destroy: function () { + destroyObjectProperties(this); + } + }; + + /** + * The object wrapper for plot lines and plot bands + * @param {Object} options + */ + function PlotLineOrBand(options) { + var plotLine = this; + if (options) { + plotLine.options = options; + plotLine.id = options.id; + } + + //plotLine.render() + return plotLine; + } + + PlotLineOrBand.prototype = { + + /** + * Render the plot line or plot band. If it is already existing, + * move it. + */ + render: function () { + var plotLine = this, + options = plotLine.options, + optionsLabel = options.label, + label = plotLine.label, + width = options.width, + to = options.to, + from = options.from, + value = options.value, + toPath, // bands only + dashStyle = options.dashStyle, + svgElem = plotLine.svgElem, + path = [], + addEvent, + eventType, + xs, + ys, + x, + y, + color = options.color, + zIndex = options.zIndex, + events = options.events, + attribs; + + // logarithmic conversion + if (isLog) { + from = log2lin(from); + to = log2lin(to); + value = log2lin(value); + } + + // plot line + if (width) { + path = getPlotLinePath(value, width); + attribs = { + stroke: color, + 'stroke-width': width + }; + if (dashStyle) { + attribs.dashstyle = dashStyle; + } + } else if (defined(from) && defined(to)) { // plot band + // keep within plot area + from = mathMax(from, min); + to = mathMin(to, max); + + toPath = getPlotLinePath(to); + path = getPlotLinePath(from); + if (path && toPath) { + path.push( + toPath[4], + toPath[5], + toPath[1], + toPath[2] + ); + } else { // outside the axis area + path = null; + } + attribs = { + fill: color + }; + } else { + return; + } + // zIndex + if (defined(zIndex)) { + attribs.zIndex = zIndex; + } + + // common for lines and bands + if (svgElem) { + if (path) { + svgElem.animate({ + d: path + }, null, svgElem.onGetPath); + } else { + svgElem.hide(); + svgElem.onGetPath = function () { + svgElem.show(); + }; + } + } else if (path && path.length) { + plotLine.svgElem = svgElem = renderer.path(path) + .attr(attribs).add(); + + // events + if (events) { + addEvent = function (eventType) { + svgElem.on(eventType, function (e) { + events[eventType].apply(plotLine, [e]); + }); + }; + for (eventType in events) { + addEvent(eventType); + } + } + } + + // the plot band/line label + if (optionsLabel && defined(optionsLabel.text) && path && path.length && plotWidth > 0 && plotHeight > 0) { + // apply defaults + optionsLabel = merge({ + align: horiz && toPath && 'center', + x: horiz ? !toPath && 4 : 10, + verticalAlign : !horiz && toPath && 'middle', + y: horiz ? toPath ? 16 : 10 : toPath ? 6 : -4, + rotation: horiz && !toPath && 90 + }, optionsLabel); + + // add the SVG element + if (!label) { + plotLine.label = label = renderer.text( + optionsLabel.text, + 0, + 0 + ) + .attr({ + align: optionsLabel.textAlign || optionsLabel.align, + rotation: optionsLabel.rotation, + zIndex: zIndex + }) + .css(optionsLabel.style) + .add(); + } + + // get the bounding box and align the label + xs = [path[1], path[4], pick(path[6], path[1])]; + ys = [path[2], path[5], pick(path[7], path[2])]; + x = mathMin.apply(math, xs); + y = mathMin.apply(math, ys); + + label.align(optionsLabel, false, { + x: x, + y: y, + width: mathMax.apply(math, xs) - x, + height: mathMax.apply(math, ys) - y + }); + label.show(); + + } else if (label) { // move out of sight + label.hide(); + } + + // chainable + return plotLine; + }, + + /** + * Remove the plot line or band + */ + destroy: function () { + var obj = this; + + destroyObjectProperties(obj); + + // remove it from the lookup + erase(plotLinesAndBands, obj); + } + }; + + /** + * The class for stack items + */ + function StackItem(options, isNegative, x, stackOption) { + var stackItem = this; + + // Tells if the stack is negative + stackItem.isNegative = isNegative; + + // Save the options to be able to style the label + stackItem.options = options; + + // Save the x value to be able to position the label later + stackItem.x = x; + + // Save the stack option on the series configuration object + stackItem.stack = stackOption; + + // The align options and text align varies on whether the stack is negative and + // if the chart is inverted or not. + // First test the user supplied value, then use the dynamic. + stackItem.alignOptions = { + align: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'), + verticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')), + y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)), + x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0) + }; + + stackItem.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center'); + } + + StackItem.prototype = { + destroy: function () { + destroyObjectProperties(this); + }, + + /** + * Sets the total of this stack. Should be called when a serie is hidden or shown + * since that will affect the total of other stacks. + */ + setTotal: function (total) { + this.total = total; + this.cum = total; + }, + + /** + * Renders the stack total label and adds it to the stack label group. + */ + render: function (group) { + var stackItem = this, // aliased this + str = stackItem.options.formatter.call(stackItem); // format the text in the label + + // Change the text to reflect the new total and set visibility to hidden in case the serie is hidden + if (stackItem.label) { + stackItem.label.attr({text: str, visibility: HIDDEN}); + // Create new label + } else { + stackItem.label = + chart.renderer.text(str, 0, 0) // dummy positions, actual position updated with setOffset method in columnseries + .css(stackItem.options.style) // apply style + .attr({align: stackItem.textAlign, // fix the text-anchor + rotation: stackItem.options.rotation, // rotation + visibility: HIDDEN }) // hidden until setOffset is called + .add(group); // add to the labels-group + } + }, + + /** + * Sets the offset that the stack has from the x value and repositions the label. + */ + setOffset: function (xOffset, xWidth) { + var stackItem = this, // aliased this + neg = stackItem.isNegative, // special treatment is needed for negative stacks + y = axis.translate(stackItem.total), // stack value translated mapped to chart coordinates + yZero = axis.translate(0), // stack origin + h = mathAbs(y - yZero), // stack height + x = chart.xAxis[0].translate(stackItem.x) + xOffset, // stack x position + plotHeight = chart.plotHeight, + stackBox = { // this is the box for the complete stack + x: inverted ? (neg ? y : y - h) : x, + y: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y), + width: inverted ? h : xWidth, + height: inverted ? xWidth : h + }; + + if (stackItem.label) { + stackItem.label + .align(stackItem.alignOptions, null, stackBox) // align the label to the box + .attr({visibility: VISIBLE}); // set visibility + } + } + }; + + /** + * Get the minimum and maximum for the series of each axis + */ + function getSeriesExtremes() { + var posStack = [], + negStack = [], + run; + + // reset dataMin and dataMax in case we're redrawing + dataMin = dataMax = null; + + // get an overview of what series are associated with this axis + associatedSeries = []; + + each(series, function (serie) { + run = false; + + + // match this axis against the series' given or implicated axis + each(['xAxis', 'yAxis'], function (strAxis) { + if ( + // the series is a cartesian type, and... + serie.isCartesian && + // we're in the right x or y dimension, and... + ((strAxis === 'xAxis' && isXAxis) || (strAxis === 'yAxis' && !isXAxis)) && ( + // the axis number is given in the options and matches this axis index, or + (serie.options[strAxis] === options.index) || + // the axis index is not given + (serie.options[strAxis] === UNDEFINED && options.index === 0) + ) + ) { + serie[strAxis] = axis; + associatedSeries.push(serie); + + // the series is visible, run the min/max detection + run = true; + } + }); + // ignore hidden series if opted + if (!serie.visible && optionsChart.ignoreHiddenSeries) { + run = false; + } + + if (run) { + + var stacking, + posPointStack, + negPointStack, + stackKey, + stackOption, + negKey; + + if (!isXAxis) { + stacking = serie.options.stacking; + usePercentage = stacking === 'percent'; + + // create a stack for this particular series type + if (stacking) { + stackOption = serie.options.stack; + stackKey = serie.type + pick(stackOption, ''); + negKey = '-' + stackKey; + serie.stackKey = stackKey; // used in translate + + posPointStack = posStack[stackKey] || []; // contains the total values for each x + posStack[stackKey] = posPointStack; + + negPointStack = negStack[negKey] || []; + negStack[negKey] = negPointStack; + } + if (usePercentage) { + dataMin = 0; + dataMax = 99; + } + } + if (serie.isCartesian) { // line, column etc. need axes, pie doesn't + each(serie.data, function (point) { + var pointX = point.x, + pointY = point.y, + isNegative = pointY < 0, + pointStack = isNegative ? negPointStack : posPointStack, + key = isNegative ? negKey : stackKey, + totalPos, + pointLow; + + // initial values + if (dataMin === null) { + + // start out with the first point + dataMin = dataMax = point[xOrY]; + } + + // x axis + if (isXAxis) { + if (pointX > dataMax) { + dataMax = pointX; + } else if (pointX < dataMin) { + dataMin = pointX; + } + } else if (defined(pointY)) { // y axis + if (stacking) { + pointStack[pointX] = + defined(pointStack[pointX]) ? + pointStack[pointX] + pointY : pointY; + } + totalPos = pointStack ? pointStack[pointX] : pointY; + pointLow = pick(point.low, totalPos); + if (!usePercentage) { + if (totalPos > dataMax) { + dataMax = totalPos; + } else if (pointLow < dataMin) { + dataMin = pointLow; + } + } + if (stacking) { + // add the series + if (!stacks[key]) { + stacks[key] = {}; + } + + // If the StackItem is there, just update the values, + // if not, create one first + if (!stacks[key][pointX]) { + stacks[key][pointX] = new StackItem(options.stackLabels, isNegative, pointX, stackOption); + } + stacks[key][pointX].setTotal(totalPos); + } + } + }); + + + // For column, areas and bars, set the minimum automatically to zero + // and prevent that minPadding is added in setScale + if (/(area|column|bar)/.test(serie.type) && !isXAxis) { + var threshold = 0; // use series.options.threshold? + if (dataMin >= threshold) { + dataMin = threshold; + ignoreMinPadding = true; + } else if (dataMax < threshold) { + dataMax = threshold; + ignoreMaxPadding = true; + } + } + } + } + }); + + } + + /** + * Translate from axis value to pixel position on the chart, or back + * + */ + translate = function (val, backwards, cvsCoord, old, handleLog) { + var sign = 1, + cvsOffset = 0, + localA = old ? oldTransA : transA, + localMin = old ? oldMin : min, + returnValue; + + if (!localA) { + localA = transA; + } + + if (cvsCoord) { + sign *= -1; // canvas coordinates inverts the value + cvsOffset = axisLength; + } + if (reversed) { // reversed axis + sign *= -1; + cvsOffset -= sign * axisLength; + } + + if (backwards) { // reverse translation + if (reversed) { + val = axisLength - val; + } + returnValue = val / localA + localMin; // from chart pixel to value + if (isLog && handleLog) { + returnValue = lin2log(returnValue); + } + + } else { // normal translation + if (isLog && handleLog) { + val = log2lin(val); + } + returnValue = sign * (val - localMin) * localA + cvsOffset; // from value to chart pixel + } + + return returnValue; + }; + + /** + * Create the path for a plot line that goes from the given value on + * this axis, across the plot to the opposite side + * @param {Number} value + * @param {Number} lineWidth Used for calculation crisp line + * @param {Number] old Use old coordinates (for resizing and rescaling) + */ + getPlotLinePath = function (value, lineWidth, old) { + var x1, + y1, + x2, + y2, + translatedValue = translate(value, null, null, old), + cHeight = (old && oldChartHeight) || chartHeight, + cWidth = (old && oldChartWidth) || chartWidth, + skip; + + x1 = x2 = mathRound(translatedValue + transB); + y1 = y2 = mathRound(cHeight - translatedValue - transB); + + if (isNaN(translatedValue)) { // no min or max + skip = true; + + } else if (horiz) { + y1 = plotTop; + y2 = cHeight - marginBottom; + if (x1 < plotLeft || x1 > plotLeft + plotWidth) { + skip = true; + } + } else { + x1 = plotLeft; + x2 = cWidth - marginRight; + if (y1 < plotTop || y1 > plotTop + plotHeight) { + skip = true; + } + } + return skip ? + null : + renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0); + }; + + + /** + * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5 + * @param {Number} interval + */ + function normalizeTickInterval(interval, multiples) { + var normalized, i; + + // round to a tenfold of 1, 2, 2.5 or 5 + magnitude = multiples ? 1 : math.pow(10, mathFloor(math.log(interval) / math.LN10)); + normalized = interval / magnitude; + + // multiples for a linear scale + if (!multiples) { + multiples = [1, 2, 2.5, 5, 10]; + //multiples = [1, 2, 2.5, 4, 5, 7.5, 10]; + + // the allowDecimals option + if (options.allowDecimals === false || isLog) { + if (magnitude === 1) { + multiples = [1, 2, 5, 10]; + } else if (magnitude <= 0.1) { + multiples = [1 / magnitude]; + } + } + } + + // normalize the interval to the nearest multiple + for (i = 0; i < multiples.length; i++) { + interval = multiples[i]; + if (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) { + break; + } + } + + // multiply back to the correct magnitude + interval *= magnitude; + + return interval; + } + + /** + * Set the tick positions to a time unit that makes sense, for example + * on the first of each month or on every Monday. + */ + function setDateTimeTickPositions() { + tickPositions = []; + var i, + useUTC = defaultOptions.global.useUTC, + oneSecond = 1000 / timeFactor, + oneMinute = 60000 / timeFactor, + oneHour = 3600000 / timeFactor, + oneDay = 24 * 3600000 / timeFactor, + oneWeek = 7 * 24 * 3600000 / timeFactor, + oneMonth = 30 * 24 * 3600000 / timeFactor, + oneYear = 31556952000 / timeFactor, + + units = [[ + 'second', // unit name + oneSecond, // fixed incremental unit + [1, 2, 5, 10, 15, 30] // allowed multiples + ], [ + 'minute', // unit name + oneMinute, // fixed incremental unit + [1, 2, 5, 10, 15, 30] // allowed multiples + ], [ + 'hour', // unit name + oneHour, // fixed incremental unit + [1, 2, 3, 4, 6, 8, 12] // allowed multiples + ], [ + 'day', // unit name + oneDay, // fixed incremental unit + [1, 2] // allowed multiples + ], [ + 'week', // unit name + oneWeek, // fixed incremental unit + [1, 2] // allowed multiples + ], [ + 'month', + oneMonth, + [1, 2, 3, 4, 6] + ], [ + 'year', + oneYear, + null + ]], + + unit = units[6], // default unit is years + interval = unit[1], + multiples = unit[2]; + + // loop through the units to find the one that best fits the tickInterval + for (i = 0; i < units.length; i++) { + unit = units[i]; + interval = unit[1]; + multiples = unit[2]; + + + if (units[i + 1]) { + // lessThan is in the middle between the highest multiple and the next unit. + var lessThan = (interval * multiples[multiples.length - 1] + + units[i + 1][1]) / 2; + + // break and keep the current unit + if (tickInterval <= lessThan) { + break; + } + } + } + + // prevent 2.5 years intervals, though 25, 250 etc. are allowed + if (interval === oneYear && tickInterval < 5 * interval) { + multiples = [1, 2, 5]; + } + + // get the minimum value by flooring the date + var multitude = normalizeTickInterval(tickInterval / interval, multiples), + minYear, // used in months and years as a basis for Date.UTC() + minDate = new Date(min * timeFactor); + + minDate.setMilliseconds(0); + + if (interval >= oneSecond) { // second + minDate.setSeconds(interval >= oneMinute ? 0 : + multitude * mathFloor(minDate.getSeconds() / multitude)); + } + + if (interval >= oneMinute) { // minute + minDate[setMinutes](interval >= oneHour ? 0 : + multitude * mathFloor(minDate[getMinutes]() / multitude)); + } + + if (interval >= oneHour) { // hour + minDate[setHours](interval >= oneDay ? 0 : + multitude * mathFloor(minDate[getHours]() / multitude)); + } + + if (interval >= oneDay) { // day + minDate[setDate](interval >= oneMonth ? 1 : + multitude * mathFloor(minDate[getDate]() / multitude)); + } + + if (interval >= oneMonth) { // month + minDate[setMonth](interval >= oneYear ? 0 : + multitude * mathFloor(minDate[getMonth]() / multitude)); + minYear = minDate[getFullYear](); + } + + if (interval >= oneYear) { // year + minYear -= minYear % multitude; + minDate[setFullYear](minYear); + } + + // week is a special case that runs outside the hierarchy + if (interval === oneWeek) { + // get start of current week, independent of multitude + minDate[setDate](minDate[getDate]() - minDate[getDay]() + + options.startOfWeek); + } + + + // get tick positions + i = 1; // prevent crash just in case + minYear = minDate[getFullYear](); + var time = minDate.getTime() / timeFactor, + minMonth = minDate[getMonth](), + minDateDate = minDate[getDate](); + + // iterate and add tick positions at appropriate values + while (time < max && i < plotWidth) { + tickPositions.push(time); + + // if the interval is years, use Date.UTC to increase years + if (interval === oneYear) { + time = makeTime(minYear + i * multitude, 0) / timeFactor; + + // if the interval is months, use Date.UTC to increase months + } else if (interval === oneMonth) { + time = makeTime(minYear, minMonth + i * multitude) / timeFactor; + + // if we're using global time, the interval is not fixed as it jumps + // one hour at the DST crossover + } else if (!useUTC && (interval === oneDay || interval === oneWeek)) { + time = makeTime(minYear, minMonth, minDateDate + + i * multitude * (interval === oneDay ? 1 : 7)); + + // else, the interval is fixed and we use simple addition + } else { + time += interval * multitude; + } + + i++; + } + // push the last time + tickPositions.push(time); + + + // dynamic label formatter + dateTimeLabelFormat = options.dateTimeLabelFormats[unit[0]]; + } + + /** + * Fix JS round off float errors + * @param {Number} num + */ + function correctFloat(num) { + var invMag, ret = num; + magnitude = pick(magnitude, math.pow(10, mathFloor(math.log(tickInterval) / math.LN10))); + + if (magnitude < 1) { + invMag = mathRound(1 / magnitude) * 10; + ret = mathRound(num * invMag) / invMag; + } + return ret; + } + + /** + * Set the tick positions of a linear axis to round values like whole tens or every five. + */ + function setLinearTickPositions() { + + var i, + roundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval), + roundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval); + + tickPositions = []; + + // populate the intermediate values + i = correctFloat(roundedMin); + while (i <= roundedMax) { + tickPositions.push(i); + i = correctFloat(i + tickInterval); + } + + } + + /** + * Set the tick positions to round values and optionally extend the extremes + * to the nearest tick + */ + function setTickPositions() { + var length, + catPad, + linkedParent, + linkedParentExtremes, + tickIntervalOption = options.tickInterval, + tickPixelIntervalOption = options.tickPixelInterval, + maxZoom = options.maxZoom || ( + isXAxis && !defined(options.min) && !defined(options.max) ? + mathMin(chart.smallestInterval * 5, dataMax - dataMin) : + null + ), + zoomOffset; + + + axisLength = horiz ? plotWidth : plotHeight; + + // linked axis gets the extremes from the parent axis + if (isLinked) { + linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo]; + linkedParentExtremes = linkedParent.getExtremes(); + min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin); + max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax); + } else { // initial min and max from the extreme data values + min = pick(userMin, options.min, dataMin); + max = pick(userMax, options.max, dataMax); + } + + if (isLog) { + min = log2lin(min); + max = log2lin(max); + } + + // maxZoom exceeded, just center the selection + if (max - min < maxZoom) { + zoomOffset = (maxZoom - max + min) / 2; + // if min and max options have been set, don't go beyond it + min = mathMax(min - zoomOffset, pick(options.min, min - zoomOffset), dataMin); + max = mathMin(min + maxZoom, pick(options.max, min + maxZoom), dataMax); + } + + // pad the values to get clear of the chart's edges + if (!categories && !usePercentage && !isLinked && defined(min) && defined(max)) { + length = (max - min) || 1; + if (!defined(options.min) && !defined(userMin) && minPadding && (dataMin < 0 || !ignoreMinPadding)) { + min -= length * minPadding; + } + if (!defined(options.max) && !defined(userMax) && maxPadding && (dataMax > 0 || !ignoreMaxPadding)) { + max += length * maxPadding; + } + } + + // get tickInterval + if (min === max) { + tickInterval = 1; + } else if (isLinked && !tickIntervalOption && + tickPixelIntervalOption === linkedParent.options.tickPixelInterval) { + tickInterval = linkedParent.tickInterval; + } else { + tickInterval = pick( + tickIntervalOption, + categories ? // for categoried axis, 1 is default, for linear axis use tickPix + 1 : + (max - min) * tickPixelIntervalOption / axisLength + ); + } + + if (!isDatetimeAxis && !defined(options.tickInterval)) { // linear + tickInterval = normalizeTickInterval(tickInterval); + } + axis.tickInterval = tickInterval; // record for linked axis + + // get minorTickInterval + minorTickInterval = options.minorTickInterval === 'auto' && tickInterval ? + tickInterval / 5 : options.minorTickInterval; + + // find the tick positions + if (isDatetimeAxis) { + setDateTimeTickPositions(); + } else { + setLinearTickPositions(); + } + + if (!isLinked) { + // pad categorised axis to nearest half unit + if (categories || (isXAxis && chart.hasColumn)) { + catPad = (categories ? 1 : tickInterval) * 0.5; + if (categories || !defined(pick(options.min, userMin))) { + min -= catPad; + } + if (categories || !defined(pick(options.max, userMax))) { + max += catPad; + } + } + + // reset min/max or remove extremes based on start/end on tick + var roundedMin = tickPositions[0], + roundedMax = tickPositions[tickPositions.length - 1]; + + if (options.startOnTick) { + min = roundedMin; + } else if (min > roundedMin) { + tickPositions.shift(); + } + + if (options.endOnTick) { + max = roundedMax; + } else if (max < roundedMax) { + tickPositions.pop(); + } + + // record the greatest number of ticks for multi axis + if (!maxTicks) { // first call, or maxTicks have been reset after a zoom operation + maxTicks = { + x: 0, + y: 0 + }; + } + + if (!isDatetimeAxis && tickPositions.length > maxTicks[xOrY]) { + maxTicks[xOrY] = tickPositions.length; + } + } + + + } + + /** + * When using multiple axes, adjust the number of ticks to match the highest + * number of ticks in that group + */ + function adjustTickAmount() { + + if (maxTicks && !isDatetimeAxis && !categories && !isLinked) { // only apply to linear scale + var oldTickAmount = tickAmount, + calculatedTickAmount = tickPositions.length; + + // set the axis-level tickAmount to use below + tickAmount = maxTicks[xOrY]; + + if (calculatedTickAmount < tickAmount) { + while (tickPositions.length < tickAmount) { + tickPositions.push(correctFloat( + tickPositions[tickPositions.length - 1] + tickInterval + )); + } + transA *= (calculatedTickAmount - 1) / (tickAmount - 1); + max = tickPositions[tickPositions.length - 1]; + + } + if (defined(oldTickAmount) && tickAmount !== oldTickAmount) { + axis.isDirty = true; + } + } + + } + + /** + * Set the scale based on data min and max, user set min and max or options + * + */ + function setScale() { + var type, + i; + + oldMin = min; + oldMax = max; + + // get data extremes if needed + getSeriesExtremes(); + + // get fixed positions based on tickInterval + setTickPositions(); + + // the translation factor used in translate function + oldTransA = transA; + transA = axisLength / ((max - min) || 1); + + // reset stacks + if (!isXAxis) { + for (type in stacks) { + for (i in stacks[type]) { + stacks[type][i].cum = stacks[type][i].total; + } + } + } + + // mark as dirty if it is not already set to dirty and extremes have changed + if (!axis.isDirty) { + axis.isDirty = (min !== oldMin || max !== oldMax); + } + + } + + /** + * Set the extremes and optionally redraw + * @param {Number} newMin + * @param {Number} newMax + * @param {Boolean} redraw + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + * + */ + function setExtremes(newMin, newMax, redraw, animation) { + + redraw = pick(redraw, true); // defaults to true + + fireEvent(axis, 'setExtremes', { // fire an event to enable syncing of multiple charts + min: newMin, + max: newMax + }, function () { // the default event handler + + userMin = newMin; + userMax = newMax; + + + // redraw + if (redraw) { + chart.redraw(animation); + } + }); + + } + + /** + * Get the actual axis extremes + */ + function getExtremes() { + return { + min: min, + max: max, + dataMin: dataMin, + dataMax: dataMax, + userMin: userMin, + userMax: userMax + }; + } + + /** + * Get the zero plane either based on zero or on the min or max value. + * Used in bar and area plots + */ + function getThreshold(threshold) { + if (min > threshold) { + threshold = min; + } else if (max < threshold) { + threshold = max; + } + + return translate(threshold, 0, 1); + } + + /** + * Add a plot band or plot line after render time + * + * @param options {Object} The plotBand or plotLine configuration object + */ + function addPlotBandOrLine(options) { + var obj = new PlotLineOrBand(options).render(); + plotLinesAndBands.push(obj); + return obj; + } + + /** + * Render the tick labels to a preliminary position to get their sizes + */ + function getOffset() { + + var hasData = associatedSeries.length && defined(min) && defined(max), + titleOffset = 0, + titleMargin = 0, + axisTitleOptions = options.title, + labelOptions = options.labels, + directionFactor = [-1, 1, 1, -1][side], + n; + + if (!axisGroup) { + axisGroup = renderer.g('axis') + .attr({ zIndex: 7 }) + .add(); + gridGroup = renderer.g('grid') + .attr({ zIndex: 1 }) + .add(); + } + + labelOffset = 0; // reset + + if (hasData || isLinked) { + each(tickPositions, function (pos) { + if (!ticks[pos]) { + ticks[pos] = new Tick(pos); + } else { + ticks[pos].addLabel(); // update labels depending on tick interval + } + + // left side must be align: right and right side must have align: left for labels + if (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === labelOptions.align) { + + // get the highest offset + labelOffset = mathMax( + ticks[pos].getLabelSize(), + labelOffset + ); + } + + }); + + if (staggerLines) { + labelOffset += (staggerLines - 1) * 16; + } + + } else { // doesn't have data + for (n in ticks) { + ticks[n].destroy(); + delete ticks[n]; + } + } + + if (axisTitleOptions && axisTitleOptions.text) { + if (!axisTitle) { + axisTitle = axis.axisTitle = renderer.text( + axisTitleOptions.text, + 0, + 0, + axisTitleOptions.useHTML + ) + .attr({ + zIndex: 7, + rotation: axisTitleOptions.rotation || 0, + align: + axisTitleOptions.textAlign || + { low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align] + }) + .css(axisTitleOptions.style) + .add(); + axisTitle.isNew = true; + } + + titleOffset = axisTitle.getBBox()[horiz ? 'height' : 'width']; + titleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10); + + } + + // handle automatic or user set offset + offset = directionFactor * (options.offset || axisOffset[side]); + + axisTitleMargin = + labelOffset + + (side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x']) + + titleMargin; + + axisOffset[side] = mathMax( + axisOffset[side], + axisTitleMargin + titleOffset + directionFactor * offset + ); + + } + + /** + * Render the axis + */ + function render() { + var axisTitleOptions = options.title, + stackLabelOptions = options.stackLabels, + alternateGridColor = options.alternateGridColor, + lineWidth = options.lineWidth, + lineLeft, + lineTop, + linePath, + hasRendered = chart.hasRendered, + slideInTicks = hasRendered && defined(oldMin) && !isNaN(oldMin), + hasData = associatedSeries.length && defined(min) && defined(max); + + // update metrics + axisLength = horiz ? plotWidth : plotHeight; + transA = axisLength / ((max - min) || 1); + transB = horiz ? plotLeft : marginBottom; // translation addend + + // If the series has data draw the ticks. Else only the line and title + if (hasData || isLinked) { + + // minor ticks + if (minorTickInterval && !categories) { + var pos = min + (tickPositions[0] - min) % minorTickInterval; + for (; pos <= max; pos += minorTickInterval) { + if (!minorTicks[pos]) { + minorTicks[pos] = new Tick(pos, true); + } + + // render new ticks in old position + if (slideInTicks && minorTicks[pos].isNew) { + minorTicks[pos].render(null, true); + } + + + minorTicks[pos].isActive = true; + minorTicks[pos].render(); + } + } + + // major ticks + each(tickPositions, function (pos, i) { + // linked axes need an extra check to find out if + if (!isLinked || (pos >= min && pos <= max)) { + + // render new ticks in old position + if (slideInTicks && ticks[pos].isNew) { + ticks[pos].render(i, true); + } + + ticks[pos].isActive = true; + ticks[pos].render(i); + } + }); + + // alternate grid color + if (alternateGridColor) { + each(tickPositions, function (pos, i) { + if (i % 2 === 0 && pos < max) { + /*plotLinesAndBands.push(new PlotLineOrBand({ + from: pos, + to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, + color: alternateGridColor + }));*/ + + if (!alternateBands[pos]) { + alternateBands[pos] = new PlotLineOrBand(); + } + alternateBands[pos].options = { + from: pos, + to: tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] : max, + color: alternateGridColor + }; + alternateBands[pos].render(); + alternateBands[pos].isActive = true; + } + }); + } + + // custom plot bands (behind grid lines) + /*if (!hasRendered) { // only first time + each(options.plotBands || [], function(plotBandOptions) { + plotLinesAndBands.push(new PlotLineOrBand( + extend({ zIndex: 1 }, plotBandOptions) + ).render()); + }); + }*/ + + + + + // custom plot lines and bands + if (!hasRendered) { // only first time + each((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) { + plotLinesAndBands.push(new PlotLineOrBand(plotLineOptions).render()); + }); + } + + + + } // end if hasData + + // remove inactive ticks + each([ticks, minorTicks, alternateBands], function (coll) { + var pos; + for (pos in coll) { + if (!coll[pos].isActive) { + coll[pos].destroy(); + delete coll[pos]; + } else { + coll[pos].isActive = false; // reset + } + } + }); + + + + + // Static items. As the axis group is cleared on subsequent calls + // to render, these items are added outside the group. + // axis line + if (lineWidth) { + lineLeft = plotLeft + (opposite ? plotWidth : 0) + offset; + lineTop = chartHeight - marginBottom - (opposite ? plotHeight : 0) + offset; + + linePath = renderer.crispLine([ + M, + horiz ? + plotLeft : + lineLeft, + horiz ? + lineTop : + plotTop, + L, + horiz ? + chartWidth - marginRight : + lineLeft, + horiz ? + lineTop : + chartHeight - marginBottom + ], lineWidth); + if (!axisLine) { + axisLine = renderer.path(linePath) + .attr({ + stroke: options.lineColor, + 'stroke-width': lineWidth, + zIndex: 7 + }) + .add(); + } else { + axisLine.animate({ d: linePath }); + } + + } + + if (axisTitle) { + // compute anchor points for each of the title align options + var margin = horiz ? plotLeft : plotTop, + fontSize = pInt(axisTitleOptions.style.fontSize || 12), + // the position in the length direction of the axis + alongAxis = { + low: margin + (horiz ? 0 : axisLength), + middle: margin + axisLength / 2, + high: margin + (horiz ? axisLength : 0) + }[axisTitleOptions.align], + + // the position in the perpendicular direction of the axis + offAxis = (horiz ? plotTop + plotHeight : plotLeft) + + (horiz ? 1 : -1) * // horizontal axis reverses the margin + (opposite ? -1 : 1) * // so does opposite axes + axisTitleMargin + + //(isIE ? fontSize / 3 : 0)+ // preliminary fix for vml's centerline + (side === 2 ? fontSize : 0); + + axisTitle[axisTitle.isNew ? 'attr' : 'animate']({ + x: horiz ? + alongAxis : + offAxis + (opposite ? plotWidth : 0) + offset + + (axisTitleOptions.x || 0), // x + y: horiz ? + offAxis - (opposite ? plotHeight : 0) + offset : + alongAxis + (axisTitleOptions.y || 0) // y + }); + axisTitle.isNew = false; + } + + // Stacked totals: + if (stackLabelOptions && stackLabelOptions.enabled) { + var stackKey, oneStack, stackCategory, + stackTotalGroup = axis.stackTotalGroup; + + // Create a separate group for the stack total labels + if (!stackTotalGroup) { + axis.stackTotalGroup = stackTotalGroup = + renderer.g('stack-labels') + .attr({ + visibility: VISIBLE, + zIndex: 6 + }) + .translate(plotLeft, plotTop) + .add(); + } + + // Render each stack total + for (stackKey in stacks) { + oneStack = stacks[stackKey]; + for (stackCategory in oneStack) { + oneStack[stackCategory].render(stackTotalGroup); + } + } + } + // End stacked totals + + axis.isDirty = false; + } + + /** + * Remove a plot band or plot line from the chart by id + * @param {Object} id + */ + function removePlotBandOrLine(id) { + var i = plotLinesAndBands.length; + while (i--) { + if (plotLinesAndBands[i].id === id) { + plotLinesAndBands[i].destroy(); + } + } + } + + /** + * Redraw the axis to reflect changes in the data or axis extremes + */ + function redraw() { + + // hide tooltip and hover states + if (tracker.resetTracker) { + tracker.resetTracker(); + } + + // render the axis + render(); + + // move plot lines and bands + each(plotLinesAndBands, function (plotLine) { + plotLine.render(); + }); + + // mark associated series as dirty and ready for redraw + each(associatedSeries, function (series) { + series.isDirty = true; + }); + + } + + /** + * Set new axis categories and optionally redraw + * @param {Array} newCategories + * @param {Boolean} doRedraw + */ + function setCategories(newCategories, doRedraw) { + // set the categories + axis.categories = userOptions.categories = categories = newCategories; + + // force reindexing tooltips + each(associatedSeries, function (series) { + series.translate(); + series.setTooltipPoints(true); + }); + + + // optionally redraw + axis.isDirty = true; + + if (pick(doRedraw, true)) { + chart.redraw(); + } + } + + /** + * Destroys an Axis instance. + */ + function destroy() { + var stackKey; + + // Remove the events + removeEvent(axis); + + // Destroy each stack total + for (stackKey in stacks) { + destroyObjectProperties(stacks[stackKey]); + + stacks[stackKey] = null; + } + + // Destroy stack total group + if (axis.stackTotalGroup) { + axis.stackTotalGroup = axis.stackTotalGroup.destroy(); + } + + // Destroy collections + each([ticks, minorTicks, alternateBands, plotLinesAndBands], function (coll) { + destroyObjectProperties(coll); + }); + + // Destroy local variables + each([axisLine, axisGroup, gridGroup, axisTitle], function (obj) { + if (obj) { + obj.destroy(); + } + }); + axisLine = axisGroup = gridGroup = axisTitle = null; + } + + + // Run Axis + + // inverted charts have reversed xAxes as default + if (inverted && isXAxis && reversed === UNDEFINED) { + reversed = true; + } + + + // expose some variables + extend(axis, { + addPlotBand: addPlotBandOrLine, + addPlotLine: addPlotBandOrLine, + adjustTickAmount: adjustTickAmount, + categories: categories, + getExtremes: getExtremes, + getPlotLinePath: getPlotLinePath, + getThreshold: getThreshold, + isXAxis: isXAxis, + options: options, + plotLinesAndBands: plotLinesAndBands, + getOffset: getOffset, + render: render, + setCategories: setCategories, + setExtremes: setExtremes, + setScale: setScale, + setTickPositions: setTickPositions, + translate: translate, + redraw: redraw, + removePlotBand: removePlotBandOrLine, + removePlotLine: removePlotBandOrLine, + reversed: reversed, + stacks: stacks, + destroy: destroy + }); + + // register event listeners + for (eventType in events) { + addEvent(axis, eventType, events[eventType]); + } + + // set min and max + setScale(); + + } // end Axis + + + /** + * The toolbar object + */ + function Toolbar() { + var buttons = {}; + + /*jslint unparam: true*//* allow the unused param title until Toolbar rewrite*/ + function add(id, text, title, fn) { + if (!buttons[id]) { + var button = renderer.text( + text, + 0, + 0 + ) + .css(options.toolbar.itemStyle) + .align({ + align: 'right', + x: -marginRight - 20, + y: plotTop + 30 + }) + .on('click', fn) + /*.on('touchstart', function(e) { + e.stopPropagation(); // don't fire the container event + fn(); + })*/ + .attr({ + align: 'right', + zIndex: 20 + }) + .add(); + buttons[id] = button; + } + } + /*jslint unparam: false*/ + + function remove(id) { + discardElement(buttons[id].element); + buttons[id] = null; + } + + // public + return { + add: add, + remove: remove + }; + } + + /** + * The tooltip object + * @param {Object} options Tooltip options + */ + function Tooltip(options) { + var currentSeries, + borderWidth = options.borderWidth, + crosshairsOptions = options.crosshairs, + crosshairs = [], + style = options.style, + shared = options.shared, + padding = pInt(style.padding), + boxOffLeft = borderWidth + padding, // off left/top position as IE can't + //properly handle negative positioned shapes + tooltipIsHidden = true, + boxWidth, + boxHeight, + currentX = 0, + currentY = 0; + + // remove padding CSS and apply padding on box instead + style.padding = 0; + + // create the elements + var group = renderer.g('tooltip') + .attr({ zIndex: 8 }) + .add(), + + box = renderer.rect(boxOffLeft, boxOffLeft, 0, 0, options.borderRadius, borderWidth) + .attr({ + fill: options.backgroundColor, + 'stroke-width': borderWidth + }) + .add(group) + .shadow(options.shadow), + label = renderer.text('', padding + boxOffLeft, pInt(style.fontSize) + padding + boxOffLeft, options.useHTML) + .attr({ zIndex: 1 }) + .css(style) + .add(group); + + group.hide(); + + /** + * Destroy the tooltip and its elements. + */ + function destroy() { + each(crosshairs, function (crosshair) { + if (crosshair) { + crosshair.destroy(); + } + }); + + // Destroy and clear local variables + each([box, label, group], function (obj) { + if (obj) { + obj.destroy(); + } + }); + box = label = group = null; + } + + /** + * In case no user defined formatter is given, this will be used + */ + function defaultFormatter() { + var pThis = this, + items = pThis.points || splat(pThis), + xAxis = items[0].series.xAxis, + x = pThis.x, + isDateTime = xAxis && xAxis.options.type === 'datetime', + useHeader = isString(x) || isDateTime, + s; + + // build the header + s = useHeader ? + ['' + + (isDateTime ? dateFormat('%A, %b %e, %Y', x) : x) + + ''] : []; + + // build the values + each(items, function (item) { + s.push(item.point.tooltipFormatter(useHeader)); + }); + return s.join('
'); + } + + /** + * Provide a soft movement for the tooltip + * + * @param {Number} finalX + * @param {Number} finalY + */ + function move(finalX, finalY) { + + currentX = tooltipIsHidden ? finalX : (2 * currentX + finalX) / 3; + currentY = tooltipIsHidden ? finalY : (currentY + finalY) / 2; + + group.translate(currentX, currentY); + + + // run on next tick of the mouse tracker + if (mathAbs(finalX - currentX) > 1 || mathAbs(finalY - currentY) > 1) { + tooltipTick = function () { + move(finalX, finalY); + }; + } else { + tooltipTick = null; + } + } + + /** + * Hide the tooltip + */ + function hide() { + if (!tooltipIsHidden) { + var hoverPoints = chart.hoverPoints; + + group.hide(); + + each(crosshairs, function (crosshair) { + if (crosshair) { + crosshair.hide(); + } + }); + + // hide previous hoverPoints and set new + if (hoverPoints) { + each(hoverPoints, function (point) { + point.setState(); + }); + } + chart.hoverPoints = null; + + + tooltipIsHidden = true; + } + + } + + /** + * Refresh the tooltip's text and position. + * @param {Object} point + * + */ + function refresh(point) { + var x, + y, + show, + bBox, + plotX, + plotY = 0, + textConfig = {}, + text, + pointConfig = [], + tooltipPos = point.tooltipPos, + formatter = options.formatter || defaultFormatter, + hoverPoints = chart.hoverPoints, + placedTooltipPoint; + + // shared tooltip, array is sent over + if (shared) { + + // hide previous hoverPoints and set new + if (hoverPoints) { + each(hoverPoints, function (point) { + point.setState(); + }); + } + chart.hoverPoints = point; + + each(point, function (item) { + /*var series = item.series, + hoverPoint = series.hoverPoint; + if (hoverPoint) { + hoverPoint.setState(); + } + series.hoverPoint = item;*/ + item.setState(HOVER_STATE); + plotY += item.plotY; // for average + + pointConfig.push(item.getLabelConfig()); + }); + + plotX = point[0].plotX; + plotY = mathRound(plotY) / point.length; // mathRound because Opera 10 has problems here + + textConfig = { + x: point[0].category + }; + textConfig.points = pointConfig; + point = point[0]; + + // single point tooltip + } else { + textConfig = point.getLabelConfig(); + } + text = formatter.call(textConfig); + + // register the current series + currentSeries = point.series; + + // get the reference point coordinates (pie charts use tooltipPos) + plotX = shared ? plotX : point.plotX; + plotY = shared ? plotY : point.plotY; + x = mathRound(tooltipPos ? tooltipPos[0] : (inverted ? plotWidth - plotY : plotX)); + y = mathRound(tooltipPos ? tooltipPos[1] : (inverted ? plotHeight - plotX : plotY)); + + + // hide tooltip if the point falls outside the plot + show = shared || !point.series.isCartesian || isInsidePlot(x, y); + + // update the inner HTML + if (text === false || !show) { + hide(); + } else { + + // show it + if (tooltipIsHidden) { + group.show(); + tooltipIsHidden = false; + } + + // update text + label.attr({ + text: text + }); + + // get the bounding box + bBox = label.getBBox(); + boxWidth = bBox.width + 2 * padding; + boxHeight = bBox.height + 2 * padding; + + // set the size of the box + box.attr({ + width: boxWidth, + height: boxHeight, + stroke: options.borderColor || point.color || currentSeries.color || '#606060' + }); + + placedTooltipPoint = placeBox(boxWidth, boxHeight, plotLeft, plotTop, plotWidth, plotHeight, {x: x, y: y}); + + // do the move + move(mathRound(placedTooltipPoint.x - boxOffLeft), mathRound(placedTooltipPoint.y - boxOffLeft)); + } + + + // crosshairs + if (crosshairsOptions) { + crosshairsOptions = splat(crosshairsOptions); // [x, y] + + var path, + i = crosshairsOptions.length, + attribs, + axis; + + while (i--) { + axis = point.series[i ? 'yAxis' : 'xAxis']; + if (crosshairsOptions[i] && axis) { + path = axis + .getPlotLinePath(point[i ? 'y' : 'x'], 1); + if (crosshairs[i]) { + crosshairs[i].attr({ d: path, visibility: VISIBLE }); + + } else { + attribs = { + 'stroke-width': crosshairsOptions[i].width || 1, + stroke: crosshairsOptions[i].color || '#C0C0C0', + zIndex: 2 + }; + if (crosshairsOptions[i].dashStyle) { + attribs.dashstyle = crosshairsOptions[i].dashStyle; + } + crosshairs[i] = renderer.path(path) + .attr(attribs) + .add(); + } + } + } + } + } + + + + // public members + return { + shared: shared, + refresh: refresh, + hide: hide, + destroy: destroy + }; + } + + /** + * The mouse tracker object + * @param {Object} options + */ + function MouseTracker(options) { + + + var mouseDownX, + mouseDownY, + hasDragged, + selectionMarker, + zoomType = optionsChart.zoomType, + zoomX = /x/.test(zoomType), + zoomY = /y/.test(zoomType), + zoomHor = (zoomX && !inverted) || (zoomY && inverted), + zoomVert = (zoomY && !inverted) || (zoomX && inverted); + + /** + * Add crossbrowser support for chartX and chartY + * @param {Object} e The event object in standard browsers + */ + function normalizeMouseEvent(e) { + var ePos, + pageZoomFix = isWebKit && + doc.width / doc.body.scrollWidth - + 1, // #224, #348 + chartPosLeft, + chartPosTop, + chartX, + chartY; + + // common IE normalizing + e = e || win.event; + if (!e.target) { + e.target = e.srcElement; + } + + // iOS + ePos = e.touches ? e.touches.item(0) : e; + + // in certain cases, get mouse position + if (e.type !== 'mousemove' || win.opera || pageZoomFix) { // only Opera needs position on mouse move, see below + chartPosition = getPosition(container); + chartPosLeft = chartPosition.left; + chartPosTop = chartPosition.top; + } + + // chartX and chartY + if (isIE) { // IE including IE9 that has chartX but in a different meaning + chartX = e.x; + chartY = e.y; + } else { + if (ePos.layerX === UNDEFINED) { // Opera and iOS + chartX = ePos.pageX - chartPosLeft; + chartY = ePos.pageY - chartPosTop; + } else { + chartX = e.layerX; + chartY = e.layerY; + } + } + + // correct for page zoom bug in WebKit + if (pageZoomFix) { + chartX += mathRound((pageZoomFix + 1) * chartPosLeft - chartPosLeft); + chartY += mathRound((pageZoomFix + 1) * chartPosTop - chartPosTop); + } + + return extend(e, { + chartX: chartX, + chartY: chartY + }); + } + + /** + * Get the click position in terms of axis values. + * + * @param {Object} e A mouse event + */ + function getMouseCoordinates(e) { + var coordinates = { + xAxis: [], + yAxis: [] + }; + each(axes, function (axis) { + var translate = axis.translate, + isXAxis = axis.isXAxis, + isHorizontal = inverted ? !isXAxis : isXAxis; + + coordinates[isXAxis ? 'xAxis' : 'yAxis'].push({ + axis: axis, + value: translate( + isHorizontal ? + e.chartX - plotLeft : + plotHeight - e.chartY + plotTop, + true + ) + }); + }); + return coordinates; + } + + /** + * With line type charts with a single tracker, get the point closest to the mouse + */ + function onmousemove(e) { + var point, + points, + hoverPoint = chart.hoverPoint, + hoverSeries = chart.hoverSeries, + i, + j, + distance = chartWidth, + index = inverted ? e.chartY : e.chartX - plotLeft; // wtf? + + // shared tooltip + if (tooltip && options.shared) { + points = []; + + // loop over all series and find the ones with points closest to the mouse + i = series.length; + for (j = 0; j < i; j++) { + if (series[j].visible && series[j].tooltipPoints.length) { + point = series[j].tooltipPoints[index]; + point._dist = mathAbs(index - point.plotX); + distance = mathMin(distance, point._dist); + points.push(point); + } + } + // remove furthest points + i = points.length; + while (i--) { + if (points[i]._dist > distance) { + points.splice(i, 1); + } + } + // refresh the tooltip if necessary + if (points.length && (points[0].plotX !== hoverX)) { + tooltip.refresh(points); + hoverX = points[0].plotX; + } + } + + // separate tooltip and general mouse events + if (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker + + // get the point + point = hoverSeries.tooltipPoints[index]; + + // a new point is hovered, refresh the tooltip + if (point && point !== hoverPoint) { + + // trigger the events + point.onMouseOver(); + + } + } + } + + + + /** + * Reset the tracking by hiding the tooltip, the hover series state and the hover point + */ + function resetTracker() { + var hoverSeries = chart.hoverSeries, + hoverPoint = chart.hoverPoint; + + if (hoverPoint) { + hoverPoint.onMouseOut(); + } + + if (hoverSeries) { + hoverSeries.onMouseOut(); + } + + if (tooltip) { + tooltip.hide(); + } + + hoverX = null; + } + + /** + * Mouse up or outside the plot area + */ + function drop() { + if (selectionMarker) { + var selectionData = { + xAxis: [], + yAxis: [] + }, + selectionBox = selectionMarker.getBBox(), + selectionLeft = selectionBox.x - plotLeft, + selectionTop = selectionBox.y - plotTop; + + + // a selection has been made + if (hasDragged) { + + // record each axis' min and max + each(axes, function (axis) { + var translate = axis.translate, + isXAxis = axis.isXAxis, + isHorizontal = inverted ? !isXAxis : isXAxis, + selectionMin = translate( + isHorizontal ? + selectionLeft : + plotHeight - selectionTop - selectionBox.height, + true, + 0, + 0, + 1 + ), + selectionMax = translate( + isHorizontal ? + selectionLeft + selectionBox.width : + plotHeight - selectionTop, + true, + 0, + 0, + 1 + ); + + selectionData[isXAxis ? 'xAxis' : 'yAxis'].push({ + axis: axis, + min: mathMin(selectionMin, selectionMax), // for reversed axes, + max: mathMax(selectionMin, selectionMax) + }); + + }); + fireEvent(chart, 'selection', selectionData, zoom); + + } + selectionMarker = selectionMarker.destroy(); + } + + chart.mouseIsDown = mouseIsDown = hasDragged = false; + removeEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); + + } + + /** + * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea. + */ + function hideTooltipOnMouseMove(e) { + var pageX = defined(e.pageX) ? e.pageX : e.page.x, // In mootools the event is wrapped and the page x/y position is named e.page.x + pageY = defined(e.pageX) ? e.pageY : e.page.y; // Ref: http://mootools.net/docs/core/Types/DOMEvent + + if (chartPosition && + !isInsidePlot(pageX - chartPosition.left - plotLeft, + pageY - chartPosition.top - plotTop)) { + resetTracker(); + } + } + + /** + * Set the JS events on the container element + */ + function setDOMEvents() { + var lastWasOutsidePlot = true; + /* + * Record the starting position of a dragoperation + */ + container.onmousedown = function (e) { + e = normalizeMouseEvent(e); + + // issue #295, dragging not always working in Firefox + if (!hasTouch && e.preventDefault) { + e.preventDefault(); + } + + // record the start position + chart.mouseIsDown = mouseIsDown = true; + mouseDownX = e.chartX; + mouseDownY = e.chartY; + + addEvent(doc, hasTouch ? 'touchend' : 'mouseup', drop); + }; + + // The mousemove, touchmove and touchstart event handler + var mouseMove = function (e) { + + // let the system handle multitouch operations like two finger scroll + // and pinching + if (e && e.touches && e.touches.length > 1) { + return; + } + + // normalize + e = normalizeMouseEvent(e); + if (!hasTouch) { // not for touch devices + e.returnValue = false; + } + + var chartX = e.chartX, + chartY = e.chartY, + isOutsidePlot = !isInsidePlot(chartX - plotLeft, chartY - plotTop); + + // cache chart position for issue #149 fix + if (!chartPosition) { + chartPosition = getPosition(container); + } + + // on touch devices, only trigger click if a handler is defined + if (hasTouch && e.type === 'touchstart') { + if (attr(e.target, 'isTracker')) { + if (!chart.runTrackerClick) { + e.preventDefault(); + } + } else if (!runChartClick && !isOutsidePlot) { + e.preventDefault(); + } + } + + // cancel on mouse outside + if (isOutsidePlot) { + + /*if (!lastWasOutsidePlot) { + // reset the tracker + resetTracker(); + }*/ + + // drop the selection if any and reset mouseIsDown and hasDragged + //drop(); + if (chartX < plotLeft) { + chartX = plotLeft; + } else if (chartX > plotLeft + plotWidth) { + chartX = plotLeft + plotWidth; + } + + if (chartY < plotTop) { + chartY = plotTop; + } else if (chartY > plotTop + plotHeight) { + chartY = plotTop + plotHeight; + } + + } + + if (mouseIsDown && e.type !== 'touchstart') { // make selection + + // determine if the mouse has moved more than 10px + hasDragged = Math.sqrt( + Math.pow(mouseDownX - chartX, 2) + + Math.pow(mouseDownY - chartY, 2) + ); + if (hasDragged > 10) { + + // make a selection + if (hasCartesianSeries && (zoomX || zoomY) && + isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop)) { + if (!selectionMarker) { + selectionMarker = renderer.rect( + plotLeft, + plotTop, + zoomHor ? 1 : plotWidth, + zoomVert ? 1 : plotHeight, + 0 + ) + .attr({ + fill: optionsChart.selectionMarkerFill || 'rgba(69,114,167,0.25)', + zIndex: 7 + }) + .add(); + } + } + + // adjust the width of the selection marker + if (selectionMarker && zoomHor) { + var xSize = chartX - mouseDownX; + selectionMarker.attr({ + width: mathAbs(xSize), + x: (xSize > 0 ? 0 : xSize) + mouseDownX + }); + } + // adjust the height of the selection marker + if (selectionMarker && zoomVert) { + var ySize = chartY - mouseDownY; + selectionMarker.attr({ + height: mathAbs(ySize), + y: (ySize > 0 ? 0 : ySize) + mouseDownY + }); + } + } + + } else if (!isOutsidePlot) { + // show the tooltip + onmousemove(e); + } + + lastWasOutsidePlot = isOutsidePlot; + + // when outside plot, allow touch-drag by returning true + return isOutsidePlot || !hasCartesianSeries; + }; + + /* + * When the mouse enters the container, run mouseMove + */ + container.onmousemove = mouseMove; + + /* + * When the mouse leaves the container, hide the tracking (tooltip). + */ + addEvent(container, 'mouseleave', resetTracker); + + // issue #149 workaround + // The mouseleave event above does not always fire. Whenever the mouse is moving + // outside the plotarea, hide the tooltip + addEvent(doc, 'mousemove', hideTooltipOnMouseMove); + + container.ontouchstart = function (e) { + // For touch devices, use touchmove to zoom + if (zoomX || zoomY) { + container.onmousedown(e); + } + // Show tooltip and prevent the lower mouse pseudo event + mouseMove(e); + }; + + /* + * Allow dragging the finger over the chart to read the values on touch + * devices + */ + container.ontouchmove = mouseMove; + + /* + * Allow dragging the finger over the chart to read the values on touch + * devices + */ + container.ontouchend = function () { + if (hasDragged) { + resetTracker(); + } + }; + + + // MooTools 1.2.3 doesn't fire this in IE when using addEvent + container.onclick = function (e) { + var hoverPoint = chart.hoverPoint; + e = normalizeMouseEvent(e); + + e.cancelBubble = true; // IE specific + + + if (!hasDragged) { + if (hoverPoint && attr(e.target, 'isTracker')) { + var plotX = hoverPoint.plotX, + plotY = hoverPoint.plotY; + + // add page position info + extend(hoverPoint, { + pageX: chartPosition.left + plotLeft + + (inverted ? plotWidth - plotY : plotX), + pageY: chartPosition.top + plotTop + + (inverted ? plotHeight - plotX : plotY) + }); + + // the series click event + fireEvent(hoverPoint.series, 'click', extend(e, { + point: hoverPoint + })); + + // the point click event + hoverPoint.firePointEvent('click', e); + + } else { + extend(e, getMouseCoordinates(e)); + + // fire a click event in the chart + if (isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) { + fireEvent(chart, 'click', e); + } + } + + + } + // reset mouseIsDown and hasDragged + hasDragged = false; + }; + + } + + /** + * Destroys the MouseTracker object and disconnects DOM events. + */ + function destroy() { + // Destroy the tracker group element + if (chart.trackerGroup) { + chart.trackerGroup = trackerGroup = chart.trackerGroup.destroy(); + } + + removeEvent(doc, 'mousemove', hideTooltipOnMouseMove); + container.onclick = container.onmousedown = container.onmousemove = container.ontouchstart = container.ontouchend = container.ontouchmove = null; + } + + /** + * Create the image map that listens for mouseovers + */ + placeTrackerGroup = function () { + + // first create - plot positions is not final at this stage + if (!trackerGroup) { + chart.trackerGroup = trackerGroup = renderer.g('tracker') + .attr({ zIndex: 9 }) + .add(); + + // then position - this happens on load and after resizing and changing + // axis or box positions + } else { + trackerGroup.translate(plotLeft, plotTop); + if (inverted) { + trackerGroup.attr({ + width: chart.plotWidth, + height: chart.plotHeight + }).invert(); + } + } + }; + + + // Run MouseTracker + placeTrackerGroup(); + if (options.enabled) { + chart.tooltip = tooltip = Tooltip(options); + } + + setDOMEvents(); + + // set the fixed interval ticking for the smooth tooltip + tooltipInterval = setInterval(function () { + if (tooltipTick) { + tooltipTick(); + } + }, 32); + + // expose properties + extend(this, { + zoomX: zoomX, + zoomY: zoomY, + resetTracker: resetTracker, + destroy: destroy + }); + } + + + + /** + * The overview of the chart's series + */ + var Legend = function () { + + var options = chart.options.legend; + + if (!options.enabled) { + return; + } + + var horizontal = options.layout === 'horizontal', + symbolWidth = options.symbolWidth, + symbolPadding = options.symbolPadding, + allItems, + style = options.style, + itemStyle = options.itemStyle, + itemHoverStyle = options.itemHoverStyle, + itemHiddenStyle = options.itemHiddenStyle, + padding = pInt(style.padding), + y = 18, + initialItemX = 4 + padding + symbolWidth + symbolPadding, + itemX, + itemY, + lastItemY, + itemHeight = 0, + box, + legendBorderWidth = options.borderWidth, + legendBackgroundColor = options.backgroundColor, + legendGroup, + offsetWidth, + widthOption = options.width, + series = chart.series, + reversedLegend = options.reversed; + + + + /** + * Set the colors for the legend item + * @param {Object} item A Series or Point instance + * @param {Object} visible Dimmed or colored + */ + function colorizeItem(item, visible) { + var legendItem = item.legendItem, + legendLine = item.legendLine, + legendSymbol = item.legendSymbol, + hiddenColor = itemHiddenStyle.color, + textColor = visible ? options.itemStyle.color : hiddenColor, + lineColor = visible ? item.color : hiddenColor, + symbolAttr = visible ? item.pointAttr[NORMAL_STATE] : { + stroke: hiddenColor, + fill: hiddenColor + }; + + if (legendItem) { + legendItem.css({ fill: textColor }); + } + if (legendLine) { + legendLine.attr({ stroke: lineColor }); + } + if (legendSymbol) { + legendSymbol.attr(symbolAttr); + } + + } + + /** + * Position the legend item + * @param {Object} item A Series or Point instance + * @param {Object} visible Dimmed or colored + */ + function positionItem(item, itemX, itemY) { + var legendItem = item.legendItem, + legendLine = item.legendLine, + legendSymbol = item.legendSymbol, + checkbox = item.checkbox; + if (legendItem) { + legendItem.attr({ + x: itemX, + y: itemY + }); + } + if (legendLine) { + legendLine.translate(itemX, itemY - 4); + } + if (legendSymbol) { + legendSymbol.attr({ + x: itemX + legendSymbol.xOff, + y: itemY + legendSymbol.yOff + }); + } + if (checkbox) { + checkbox.x = itemX; + checkbox.y = itemY; + } + } + + /** + * Destroy a single legend item + * @param {Object} item The series or point + */ + function destroyItem(item) { + var checkbox = item.checkbox; + + // pull out from the array + //erase(allItems, item); + + // destroy SVG elements + each(['legendItem', 'legendLine', 'legendSymbol'], function (key) { + if (item[key]) { + item[key].destroy(); + } + }); + + if (checkbox) { + discardElement(item.checkbox); + } + + + } + + /** + * Destroys the legend. + */ + function destroy() { + if (box) { + box = box.destroy(); + } + + if (legendGroup) { + legendGroup = legendGroup.destroy(); + } + } + + /** + * Position the checkboxes after the width is determined + */ + function positionCheckboxes() { + each(allItems, function (item) { + var checkbox = item.checkbox, + alignAttr = legendGroup.alignAttr; + if (checkbox) { + css(checkbox, { + left: (alignAttr.translateX + item.legendItemWidth + checkbox.x - 40) + PX, + top: (alignAttr.translateY + checkbox.y - 11) + PX + }); + } + }); + } + + /** + * Render a single specific legend item + * @param {Object} item A series or point + */ + function renderItem(item) { + var bBox, + itemWidth, + legendSymbol, + symbolX, + symbolY, + simpleSymbol, + li = item.legendItem, + series = item.series || item, + itemOptions = series.options, + strokeWidth = (itemOptions && itemOptions.borderWidth) || 0; + + if (!li) { // generate it once, later move it + + // let these series types use a simple symbol + simpleSymbol = /^(bar|pie|area|column)$/.test(series.type); + + // generate the list item text + item.legendItem = li = renderer.text( + options.labelFormatter.call(item), + 0, + 0 + ) + .css(item.visible ? itemStyle : itemHiddenStyle) + .on('mouseover', function () { + item.setState(HOVER_STATE); + li.css(itemHoverStyle); + }) + .on('mouseout', function () { + li.css(item.visible ? itemStyle : itemHiddenStyle); + item.setState(); + }) + .on('click', function () { + var strLegendItemClick = 'legendItemClick', + fnLegendItemClick = function () { + item.setVisible(); + }; + + // click the name or symbol + if (item.firePointEvent) { // point + item.firePointEvent(strLegendItemClick, null, fnLegendItemClick); + } else { + fireEvent(item, strLegendItemClick, null, fnLegendItemClick); + } + }) + .attr({ zIndex: 2 }) + .add(legendGroup); + + // draw the line + if (!simpleSymbol && itemOptions && itemOptions.lineWidth) { + var attrs = { + 'stroke-width': itemOptions.lineWidth, + zIndex: 2 + }; + if (itemOptions.dashStyle) { + attrs.dashstyle = itemOptions.dashStyle; + } + item.legendLine = renderer.path([ + M, + -symbolWidth - symbolPadding, + 0, + L, + -symbolPadding, + 0 + ]) + .attr(attrs) + .add(legendGroup); + } + + // draw a simple symbol + if (simpleSymbol) { // bar|pie|area|column + + legendSymbol = renderer.rect( + (symbolX = -symbolWidth - symbolPadding), + (symbolY = -11), + symbolWidth, + 12, + 2 + ).attr({ + //'stroke-width': 0, + zIndex: 3 + }).add(legendGroup); + + // draw the marker + } else if (itemOptions && itemOptions.marker && itemOptions.marker.enabled) { + legendSymbol = renderer.symbol( + item.symbol, + (symbolX = -symbolWidth / 2 - symbolPadding), + (symbolY = -4), + itemOptions.marker.radius + ) + //.attr(item.pointAttr[NORMAL_STATE]) + .attr({ zIndex: 3 }) + .add(legendGroup); + + } + if (legendSymbol) { + legendSymbol.xOff = symbolX + (strokeWidth % 2 / 2); + legendSymbol.yOff = symbolY + (strokeWidth % 2 / 2); + } + + item.legendSymbol = legendSymbol; + + // colorize the items + colorizeItem(item, item.visible); + + + // add the HTML checkbox on top + if (itemOptions && itemOptions.showCheckbox) { + item.checkbox = createElement('input', { + type: 'checkbox', + checked: item.selected, + defaultChecked: item.selected // required by IE7 + }, options.itemCheckboxStyle, container); + + addEvent(item.checkbox, 'click', function (event) { + var target = event.target; + fireEvent(item, 'checkboxClick', { + checked: target.checked + }, + function () { + item.select(); + } + ); + }); + } + } + + + // calculate the positions for the next line + bBox = li.getBBox(); + + itemWidth = item.legendItemWidth = + options.itemWidth || symbolWidth + symbolPadding + bBox.width + padding; + itemHeight = bBox.height; + + // if the item exceeds the width, start a new line + if (horizontal && itemX - initialItemX + itemWidth > + (widthOption || (chartWidth - 2 * padding - initialItemX))) { + itemX = initialItemX; + itemY += itemHeight; + } + lastItemY = itemY; + + // position the newly generated or reordered items + positionItem(item, itemX, itemY); + + // advance + if (horizontal) { + itemX += itemWidth; + } else { + itemY += itemHeight; + } + + // the width of the widest item + offsetWidth = widthOption || mathMax( + horizontal ? itemX - initialItemX : itemWidth, + offsetWidth + ); + + + + // add it all to an array to use below + //allItems.push(item); + } + + /** + * Render the legend. This method can be called both before and after + * chart.render. If called after, it will only rearrange items instead + * of creating new ones. + */ + function renderLegend() { + itemX = initialItemX; + itemY = y; + offsetWidth = 0; + lastItemY = 0; + + if (!legendGroup) { + legendGroup = renderer.g('legend') + .attr({ zIndex: 7 }) + .add(); + } + + + // add each series or point + allItems = []; + each(series, function (serie) { + var seriesOptions = serie.options; + + if (!seriesOptions.showInLegend) { + return; + } + + // use points or series for the legend item depending on legendType + allItems = allItems.concat(seriesOptions.legendType === 'point' ? + serie.data : + serie + ); + + }); + + // sort by legendIndex + stableSort(allItems, function (a, b) { + return (a.options.legendIndex || 0) - (b.options.legendIndex || 0); + }); + + // reversed legend + if (reversedLegend) { + allItems.reverse(); + } + + // render the items + each(allItems, renderItem); + + + + // Draw the border + legendWidth = widthOption || offsetWidth; + legendHeight = lastItemY - y + itemHeight; + + if (legendBorderWidth || legendBackgroundColor) { + legendWidth += 2 * padding; + legendHeight += 2 * padding; + + if (!box) { + box = renderer.rect( + 0, + 0, + legendWidth, + legendHeight, + options.borderRadius, + legendBorderWidth || 0 + ).attr({ + stroke: options.borderColor, + 'stroke-width': legendBorderWidth || 0, + fill: legendBackgroundColor || NONE + }) + .add(legendGroup) + .shadow(options.shadow); + box.isNew = true; + + } else if (legendWidth > 0 && legendHeight > 0) { + box[box.isNew ? 'attr' : 'animate']( + box.crisp(null, null, null, legendWidth, legendHeight) + ); + box.isNew = false; + } + + // hide the border if no items + box[allItems.length ? 'show' : 'hide'](); + } + + // 1.x compatibility: positioning based on style + var props = ['left', 'right', 'top', 'bottom'], + prop, + i = 4; + while (i--) { + prop = props[i]; + if (style[prop] && style[prop] !== 'auto') { + options[i < 2 ? 'align' : 'verticalAlign'] = prop; + options[i < 2 ? 'x' : 'y'] = pInt(style[prop]) * (i % 2 ? -1 : 1); + } + } + + if (allItems.length) { + legendGroup.align(extend(options, { + width: legendWidth, + height: legendHeight + }), true, spacingBox); + } + + if (!isResizing) { + positionCheckboxes(); + } + } + + + // run legend + renderLegend(); + + // move checkboxes + addEvent(chart, 'endResize', positionCheckboxes); + + // expose + return { + colorizeItem: colorizeItem, + destroyItem: destroyItem, + renderLegend: renderLegend, + destroy: destroy + }; + }; + + + + + + + /** + * Initialize an individual series, called internally before render time + */ + function initSeries(options) { + var type = options.type || optionsChart.type || optionsChart.defaultSeriesType, + typeClass = seriesTypes[type], + serie, + hasRendered = chart.hasRendered; + + // an inverted chart can't take a column series and vice versa + if (hasRendered) { + if (inverted && type === 'column') { + typeClass = seriesTypes.bar; + } else if (!inverted && type === 'bar') { + typeClass = seriesTypes.column; + } + } + + serie = new typeClass(); + + serie.init(chart, options); + + // set internal chart properties + if (!hasRendered && serie.inverted) { + inverted = true; + } + if (serie.isCartesian) { + hasCartesianSeries = serie.isCartesian; + } + + series.push(serie); + + return serie; + } + + /** + * Add a series dynamically after time + * + * @param {Object} options The config options + * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true. + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + * + * @return {Object} series The newly created series object + */ + function addSeries(options, redraw, animation) { + var series; + + if (options) { + setAnimation(animation, chart); + redraw = pick(redraw, true); // defaults to true + + fireEvent(chart, 'addSeries', { options: options }, function () { + series = initSeries(options); + series.isDirty = true; + + chart.isDirtyLegend = true; // the series array is out of sync with the display + if (redraw) { + chart.redraw(); + } + }); + } + + return series; + } + + /** + * Check whether a given point is within the plot area + * + * @param {Number} x Pixel x relative to the coordinateSystem + * @param {Number} y Pixel y relative to the coordinateSystem + */ + isInsidePlot = function (x, y) { + return x >= 0 && + x <= plotWidth && + y >= 0 && + y <= plotHeight; + }; + + /** + * Adjust all axes tick amounts + */ + function adjustTickAmounts() { + if (optionsChart.alignTicks !== false) { + each(axes, function (axis) { + axis.adjustTickAmount(); + }); + } + maxTicks = null; + } + + /** + * Redraw legend, axes or series based on updated data + * + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + */ + function redraw(animation) { + var redrawLegend = chart.isDirtyLegend, + hasStackedSeries, + isDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed? + seriesLength = series.length, + i = seriesLength, + clipRect = chart.clipRect, + serie; + + setAnimation(animation, chart); + + // link stacked series + while (i--) { + serie = series[i]; + if (serie.isDirty && serie.options.stacking) { + hasStackedSeries = true; + break; + } + } + if (hasStackedSeries) { // mark others as dirty + i = seriesLength; + while (i--) { + serie = series[i]; + if (serie.options.stacking) { + serie.isDirty = true; + } + } + } + + // handle updated data in the series + each(series, function (serie) { + if (serie.isDirty) { // prepare the data so axis can read it + serie.cleanData(); + serie.getSegments(); + + if (serie.options.legendType === 'point') { + redrawLegend = true; + } + } + }); + + // handle added or removed series + if (redrawLegend && legend.renderLegend) { // series or pie points are added or removed + // draw legend graphics + legend.renderLegend(); + + chart.isDirtyLegend = false; + } + + if (hasCartesianSeries) { + if (!isResizing) { + + // reset maxTicks + maxTicks = null; + + // set axes scales + each(axes, function (axis) { + axis.setScale(); + }); + } + adjustTickAmounts(); + getMargins(); + + // redraw axes + each(axes, function (axis) { + if (axis.isDirty || isDirtyBox) { + axis.redraw(); + isDirtyBox = true; // always redraw box to reflect changes in the axis labels + } + }); + + + } + + // the plot areas size has changed + if (isDirtyBox) { + drawChartBox(); + placeTrackerGroup(); + + // move clip rect + if (clipRect) { + stop(clipRect); + clipRect.animate({ // for chart resize + width: chart.plotSizeX, + height: chart.plotSizeY + }); + } + + } + + + // redraw affected series + each(series, function (serie) { + if (serie.isDirty && serie.visible && + (!serie.isCartesian || serie.xAxis)) { // issue #153 + serie.redraw(); + } + }); + + + // hide tooltip and hover states + if (tracker && tracker.resetTracker) { + tracker.resetTracker(); + } + + // fire the event + fireEvent(chart, 'redraw'); + } + + + + /** + * Dim the chart and show a loading text or symbol + * @param {String} str An optional text to show in the loading label instead of the default one + */ + function showLoading(str) { + var loadingOptions = options.loading; + + // create the layer at the first call + if (!loadingDiv) { + loadingDiv = createElement(DIV, { + className: 'highcharts-loading' + }, extend(loadingOptions.style, { + left: plotLeft + PX, + top: plotTop + PX, + width: plotWidth + PX, + height: plotHeight + PX, + zIndex: 10, + display: NONE + }), container); + + loadingSpan = createElement( + 'span', + null, + loadingOptions.labelStyle, + loadingDiv + ); + + } + + // update text + loadingSpan.innerHTML = str || options.lang.loading; + + // show it + if (!loadingShown) { + css(loadingDiv, { opacity: 0, display: '' }); + animate(loadingDiv, { + opacity: loadingOptions.style.opacity + }, { + duration: loadingOptions.showDuration + }); + loadingShown = true; + } + } + /** + * Hide the loading layer + */ + function hideLoading() { + animate(loadingDiv, { + opacity: 0 + }, { + duration: options.loading.hideDuration, + complete: function () { + css(loadingDiv, { display: NONE }); + } + }); + loadingShown = false; + } + + /** + * Get an axis, series or point object by id. + * @param id {String} The id as given in the configuration options + */ + function get(id) { + var i, + j, + data; + + // search axes + for (i = 0; i < axes.length; i++) { + if (axes[i].options.id === id) { + return axes[i]; + } + } + + // search series + for (i = 0; i < series.length; i++) { + if (series[i].options.id === id) { + return series[i]; + } + } + + // search points + for (i = 0; i < series.length; i++) { + data = series[i].data; + for (j = 0; j < data.length; j++) { + if (data[j].id === id) { + return data[j]; + } + } + } + return null; + } + + /** + * Create the Axis instances based on the config options + */ + function getAxes() { + var xAxisOptions = options.xAxis || {}, + yAxisOptions = options.yAxis || {}, + axis; + + // make sure the options are arrays and add some members + xAxisOptions = splat(xAxisOptions); + each(xAxisOptions, function (axis, i) { + axis.index = i; + axis.isX = true; + }); + + yAxisOptions = splat(yAxisOptions); + each(yAxisOptions, function (axis, i) { + axis.index = i; + }); + + // concatenate all axis options into one array + axes = xAxisOptions.concat(yAxisOptions); + + // loop the options and construct axis objects + chart.xAxis = []; + chart.yAxis = []; + axes = map(axes, function (axisOptions) { + axis = new Axis(axisOptions); + chart[axis.isXAxis ? 'xAxis' : 'yAxis'].push(axis); + + return axis; + }); + + adjustTickAmounts(); + } + + + /** + * Get the currently selected points from all series + */ + function getSelectedPoints() { + var points = []; + each(series, function (serie) { + points = points.concat(grep(serie.data, function (point) { + return point.selected; + })); + }); + return points; + } + + /** + * Get the currently selected series + */ + function getSelectedSeries() { + return grep(series, function (serie) { + return serie.selected; + }); + } + + /** + * Zoom out to 1:1 + */ + zoomOut = function () { + fireEvent(chart, 'selection', { resetSelection: true }, zoom); + chart.toolbar.remove('zoom'); + + }; + /** + * Zoom into a given portion of the chart given by axis coordinates + * @param {Object} event + */ + zoom = function (event) { + + // add button to reset selection + var lang = defaultOptions.lang, + animate = chart.pointCount < 100; + chart.toolbar.add('zoom', lang.resetZoom, lang.resetZoomTitle, zoomOut); + + // if zoom is called with no arguments, reset the axes + if (!event || event.resetSelection) { + each(axes, function (axis) { + axis.setExtremes(null, null, false, animate); + }); + } else { // else, zoom in on all axes + each(event.xAxis.concat(event.yAxis), function (axisData) { + var axis = axisData.axis; + + // don't zoom more than maxZoom + if (chart.tracker[axis.isXAxis ? 'zoomX' : 'zoomY']) { + axis.setExtremes(axisData.min, axisData.max, false, animate); + } + }); + } + + // redraw chart + redraw(); + }; + + /** + * Show the title and subtitle of the chart + * + * @param titleOptions {Object} New title options + * @param subtitleOptions {Object} New subtitle options + * + */ + function setTitle(titleOptions, subtitleOptions) { + + chartTitleOptions = merge(options.title, titleOptions); + chartSubtitleOptions = merge(options.subtitle, subtitleOptions); + + // add title and subtitle + each([ + ['title', titleOptions, chartTitleOptions], + ['subtitle', subtitleOptions, chartSubtitleOptions] + ], function (arr) { + var name = arr[0], + title = chart[name], + titleOptions = arr[1], + chartTitleOptions = arr[2]; + + if (title && titleOptions) { + title = title.destroy(); // remove old + } + if (chartTitleOptions && chartTitleOptions.text && !title) { + chart[name] = renderer.text( + chartTitleOptions.text, + 0, + 0, + chartTitleOptions.useHTML + ) + .attr({ + align: chartTitleOptions.align, + 'class': 'highcharts-' + name, + zIndex: 1 + }) + .css(chartTitleOptions.style) + .add() + .align(chartTitleOptions, false, spacingBox); + } + }); + + } + + /** + * Get chart width and height according to options and container size + */ + function getChartSize() { + + containerWidth = (renderToClone || renderTo).offsetWidth; + containerHeight = (renderToClone || renderTo).offsetHeight; + chart.chartWidth = chartWidth = optionsChart.width || containerWidth || 600; + chart.chartHeight = chartHeight = optionsChart.height || + // the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7: + (containerHeight > 19 ? containerHeight : 400); + } + + + /** + * Get the containing element, determine the size and create the inner container + * div to hold the chart + */ + function getContainer() { + renderTo = optionsChart.renderTo; + containerId = PREFIX + idCounter++; + + if (isString(renderTo)) { + renderTo = doc.getElementById(renderTo); + } + + // remove previous chart + renderTo.innerHTML = ''; + + // If the container doesn't have an offsetWidth, it has or is a child of a node + // that has display:none. We need to temporarily move it out to a visible + // state to determine the size, else the legend and tooltips won't render + // properly + if (!renderTo.offsetWidth) { + renderToClone = renderTo.cloneNode(0); + css(renderToClone, { + position: ABSOLUTE, + top: '-9999px', + display: '' + }); + doc.body.appendChild(renderToClone); + } + + // get the width and height + getChartSize(); + + // create the inner container + chart.container = container = createElement(DIV, { + className: 'highcharts-container' + + (optionsChart.className ? ' ' + optionsChart.className : ''), + id: containerId + }, extend({ + position: RELATIVE, + overflow: HIDDEN, // needed for context menu (avoid scrollbars) and + // content overflow in IE + width: chartWidth + PX, + height: chartHeight + PX, + textAlign: 'left' + }, optionsChart.style), + renderToClone || renderTo + ); + + chart.renderer = renderer = + optionsChart.forExport ? // force SVG, used for SVG export + new SVGRenderer(container, chartWidth, chartHeight, true) : + new Renderer(container, chartWidth, chartHeight); + + // Issue 110 workaround: + // In Firefox, if a div is positioned by percentage, its pixel position may land + // between pixels. The container itself doesn't display this, but an SVG element + // inside this container will be drawn at subpixel precision. In order to draw + // sharp lines, this must be compensated for. This doesn't seem to work inside + // iframes though (like in jsFiddle). + var subPixelFix, rect; + if (isFirefox && container.getBoundingClientRect) { + subPixelFix = function () { + css(container, { left: 0, top: 0 }); + rect = container.getBoundingClientRect(); + css(container, { + left: (-(rect.left - pInt(rect.left))) + PX, + top: (-(rect.top - pInt(rect.top))) + PX + }); + }; + + // run the fix now + subPixelFix(); + + // run it on resize + addEvent(win, 'resize', subPixelFix); + + // remove it on chart destroy + addEvent(chart, 'destroy', function () { + removeEvent(win, 'resize', subPixelFix); + }); + } + } + + /** + * Calculate margins by rendering axis labels in a preliminary position. Title, + * subtitle and legend have already been rendered at this stage, but will be + * moved into their final positions + */ + getMargins = function () { + var legendOptions = options.legend, + legendMargin = pick(legendOptions.margin, 10), + legendX = legendOptions.x, + legendY = legendOptions.y, + align = legendOptions.align, + verticalAlign = legendOptions.verticalAlign, + titleOffset; + + resetMargins(); + + // adjust for title and subtitle + if ((chart.title || chart.subtitle) && !defined(optionsMarginTop)) { + titleOffset = mathMax( + (chart.title && !chartTitleOptions.floating && !chartTitleOptions.verticalAlign && chartTitleOptions.y) || 0, + (chart.subtitle && !chartSubtitleOptions.floating && !chartSubtitleOptions.verticalAlign && chartSubtitleOptions.y) || 0 + ); + if (titleOffset) { + plotTop = mathMax(plotTop, titleOffset + pick(chartTitleOptions.margin, 15) + spacingTop); + } + } + // adjust for legend + if (legendOptions.enabled && !legendOptions.floating) { + if (align === 'right') { // horizontal alignment handled first + if (!defined(optionsMarginRight)) { + marginRight = mathMax( + marginRight, + legendWidth - legendX + legendMargin + spacingRight + ); + } + } else if (align === 'left') { + if (!defined(optionsMarginLeft)) { + plotLeft = mathMax( + plotLeft, + legendWidth + legendX + legendMargin + spacingLeft + ); + } + + } else if (verticalAlign === 'top') { + if (!defined(optionsMarginTop)) { + plotTop = mathMax( + plotTop, + legendHeight + legendY + legendMargin + spacingTop + ); + } + + } else if (verticalAlign === 'bottom') { + if (!defined(optionsMarginBottom)) { + marginBottom = mathMax( + marginBottom, + legendHeight - legendY + legendMargin + spacingBottom + ); + } + } + } + + // pre-render axes to get labels offset width + if (hasCartesianSeries) { + each(axes, function (axis) { + axis.getOffset(); + }); + } + + if (!defined(optionsMarginLeft)) { + plotLeft += axisOffset[3]; + } + if (!defined(optionsMarginTop)) { + plotTop += axisOffset[0]; + } + if (!defined(optionsMarginBottom)) { + marginBottom += axisOffset[2]; + } + if (!defined(optionsMarginRight)) { + marginRight += axisOffset[1]; + } + + setChartSize(); + + }; + + /** + * Add the event handlers necessary for auto resizing + * + */ + function initReflow() { + var reflowTimeout; + function reflow() { + var width = optionsChart.width || renderTo.offsetWidth, + height = optionsChart.height || renderTo.offsetHeight; + + if (width && height) { // means container is display:none + if (width !== containerWidth || height !== containerHeight) { + clearTimeout(reflowTimeout); + reflowTimeout = setTimeout(function () { + resize(width, height, false); + }, 100); + } + containerWidth = width; + containerHeight = height; + } + } + addEvent(win, 'resize', reflow); + addEvent(chart, 'destroy', function () { + removeEvent(win, 'resize', reflow); + }); + } + + /** + * Fires endResize event on chart instance. + */ + function fireEndResize() { + fireEvent(chart, 'endResize', null, function () { + isResizing -= 1; + }); + } + + /** + * Resize the chart to a given width and height + * @param {Number} width + * @param {Number} height + * @param {Object|Boolean} animation + */ + resize = function (width, height, animation) { + var chartTitle = chart.title, + chartSubtitle = chart.subtitle; + + isResizing += 1; + + // set the animation for the current process + setAnimation(animation, chart); + + oldChartHeight = chartHeight; + oldChartWidth = chartWidth; + chart.chartWidth = chartWidth = mathRound(width); + chart.chartHeight = chartHeight = mathRound(height); + + css(container, { + width: chartWidth + PX, + height: chartHeight + PX + }); + renderer.setSize(chartWidth, chartHeight, animation); + + // update axis lengths for more correct tick intervals: + plotWidth = chartWidth - plotLeft - marginRight; + plotHeight = chartHeight - plotTop - marginBottom; + + // handle axes + maxTicks = null; + each(axes, function (axis) { + axis.isDirty = true; + axis.setScale(); + }); + + // make sure non-cartesian series are also handled + each(series, function (serie) { + serie.isDirty = true; + }); + + chart.isDirtyLegend = true; // force legend redraw + chart.isDirtyBox = true; // force redraw of plot and chart border + + getMargins(); + + // move titles + if (chartTitle) { + chartTitle.align(null, null, spacingBox); + } + if (chartSubtitle) { + chartSubtitle.align(null, null, spacingBox); + } + + redraw(animation); + + + oldChartHeight = null; + fireEvent(chart, 'resize'); + + // fire endResize and set isResizing back + // If animation is disabled, fire without delay + if (globalAnimation === false) { + fireEndResize(); + } else { // else set a timeout with the animation duration + setTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500); + } + }; + + /** + * Set the public chart properties. This is done before and after the pre-render + * to determine margin sizes + */ + setChartSize = function () { + + chart.plotLeft = plotLeft = mathRound(plotLeft); + chart.plotTop = plotTop = mathRound(plotTop); + chart.plotWidth = plotWidth = mathRound(chartWidth - plotLeft - marginRight); + chart.plotHeight = plotHeight = mathRound(chartHeight - plotTop - marginBottom); + + chart.plotSizeX = inverted ? plotHeight : plotWidth; + chart.plotSizeY = inverted ? plotWidth : plotHeight; + + spacingBox = { + x: spacingLeft, + y: spacingTop, + width: chartWidth - spacingLeft - spacingRight, + height: chartHeight - spacingTop - spacingBottom + }; + }; + + /** + * Initial margins before auto size margins are applied + */ + resetMargins = function () { + plotTop = pick(optionsMarginTop, spacingTop); + marginRight = pick(optionsMarginRight, spacingRight); + marginBottom = pick(optionsMarginBottom, spacingBottom); + plotLeft = pick(optionsMarginLeft, spacingLeft); + axisOffset = [0, 0, 0, 0]; // top, right, bottom, left + }; + + /** + * Draw the borders and backgrounds for chart and plot area + */ + drawChartBox = function () { + var chartBorderWidth = optionsChart.borderWidth || 0, + chartBackgroundColor = optionsChart.backgroundColor, + plotBackgroundColor = optionsChart.plotBackgroundColor, + plotBackgroundImage = optionsChart.plotBackgroundImage, + mgn, + plotSize = { + x: plotLeft, + y: plotTop, + width: plotWidth, + height: plotHeight + }; + + // Chart area + mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0); + + if (chartBorderWidth || chartBackgroundColor) { + if (!chartBackground) { + chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn, + optionsChart.borderRadius, chartBorderWidth) + .attr({ + stroke: optionsChart.borderColor, + 'stroke-width': chartBorderWidth, + fill: chartBackgroundColor || NONE + }) + .add() + .shadow(optionsChart.shadow); + } else { // resize + chartBackground.animate( + chartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn) + ); + } + } + + + // Plot background + if (plotBackgroundColor) { + if (!plotBackground) { + plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0) + .attr({ + fill: plotBackgroundColor + }) + .add() + .shadow(optionsChart.plotShadow); + } else { + plotBackground.animate(plotSize); + } + } + if (plotBackgroundImage) { + if (!plotBGImage) { + plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight) + .add(); + } else { + plotBGImage.animate(plotSize); + } + } + + // Plot area border + if (optionsChart.plotBorderWidth) { + if (!plotBorder) { + plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, optionsChart.plotBorderWidth) + .attr({ + stroke: optionsChart.plotBorderColor, + 'stroke-width': optionsChart.plotBorderWidth, + zIndex: 4 + }) + .add(); + } else { + plotBorder.animate( + plotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight) + ); + } + } + + // reset + chart.isDirtyBox = false; + }; + + /** + * Render all graphics for the chart + */ + function render() { + var labels = options.labels, + credits = options.credits, + creditsHref; + + // Title + setTitle(); + + + // Legend + legend = chart.legend = new Legend(); + + // Get margins by pre-rendering axes + getMargins(); + each(axes, function (axis) { + axis.setTickPositions(true); // update to reflect the new margins + }); + adjustTickAmounts(); + getMargins(); // second pass to check for new labels + + + // Draw the borders and backgrounds + drawChartBox(); + + // Axes + if (hasCartesianSeries) { + each(axes, function (axis) { + axis.render(); + }); + } + + + // The series + if (!chart.seriesGroup) { + chart.seriesGroup = renderer.g('series-group') + .attr({ zIndex: 3 }) + .add(); + } + each(series, function (serie) { + serie.translate(); + serie.setTooltipPoints(); + serie.render(); + }); + + + // Labels + if (labels.items) { + each(labels.items, function () { + var style = extend(labels.style, this.style), + x = pInt(style.left) + plotLeft, + y = pInt(style.top) + plotTop + 12; + + // delete to prevent rewriting in IE + delete style.left; + delete style.top; + + renderer.text( + this.html, + x, + y + ) + .attr({ zIndex: 2 }) + .css(style) + .add(); + + }); + } + + // Toolbar (don't redraw) + if (!chart.toolbar) { + chart.toolbar = Toolbar(); + } + + // Credits + if (credits.enabled && !chart.credits) { + creditsHref = credits.href; + chart.credits = renderer.text( + credits.text, + 0, + 0 + ) + .on('click', function () { + if (creditsHref) { + location.href = creditsHref; + } + }) + .attr({ + align: credits.position.align, + zIndex: 8 + }) + .css(credits.style) + .add() + .align(credits.position); + } + + placeTrackerGroup(); + + // Set flag + chart.hasRendered = true; + + // If the chart was rendered outside the top container, put it back in + if (renderToClone) { + renderTo.appendChild(container); + discardElement(renderToClone); + //updatePosition(container); + } + } + + /** + * Clean up memory usage + */ + function destroy() { + var i, + parentNode = container && container.parentNode; + + // If the chart is destroyed already, do nothing. + // This will happen if if a script invokes chart.destroy and + // then it will be called again on win.unload + if (chart === null) { + return; + } + + // fire the chart.destoy event + fireEvent(chart, 'destroy'); + + // remove events + removeEvent(win, 'unload', destroy); + removeEvent(chart); + + // ==== Destroy collections: + // Destroy axes + i = axes.length; + while (i--) { + axes[i] = axes[i].destroy(); + } + + // Destroy each series + i = series.length; + while (i--) { + series[i] = series[i].destroy(); + } + + // ==== Destroy chart properties: + each(['title', 'subtitle', 'seriesGroup', 'clipRect', 'credits', 'tracker'], function (name) { + var prop = chart[name]; + + if (prop) { + chart[name] = prop.destroy(); + } + }); + + // ==== Destroy local variables: + each([chartBackground, plotBorder, plotBackground, legend, tooltip, renderer, tracker], function (obj) { + if (obj && obj.destroy) { + obj.destroy(); + } + }); + chartBackground = plotBorder = plotBackground = legend = tooltip = renderer = tracker = null; + + // remove container and all SVG + if (container) { // can break in IE when destroyed before finished loading + container.innerHTML = ''; + removeEvent(container); + if (parentNode) { + discardElement(container); + } + + // IE6 leak + container = null; + } + + // memory and CPU leak + clearInterval(tooltipInterval); + + // clean it all up + for (i in chart) { + delete chart[i]; + } + + chart = null; + } + /** + * Prepare for first rendering after all data are loaded + */ + function firstRender() { + + // VML namespaces can't be added until after complete. Listening + // for Perini's doScroll hack is not enough. + var ONREADYSTATECHANGE = 'onreadystatechange', + COMPLETE = 'complete'; + // Note: in spite of JSLint's complaints, win == win.top is required + /*jslint eqeq: true*/ + if (!hasSVG && win == win.top && doc.readyState !== COMPLETE) { + /*jslint eqeq: false*/ + doc.attachEvent(ONREADYSTATECHANGE, function () { + doc.detachEvent(ONREADYSTATECHANGE, firstRender); + if (doc.readyState === COMPLETE) { + firstRender(); + } + }); + return; + } + + // create the container + getContainer(); + + resetMargins(); + setChartSize(); + + // Initialize the series + each(options.series || [], function (serieOptions) { + initSeries(serieOptions); + }); + + // Set the common inversion and transformation for inverted series after initSeries + chart.inverted = inverted = pick(inverted, options.chart.inverted); + + + getAxes(); + + + chart.render = render; + + // depends on inverted and on margins being set + chart.tracker = tracker = new MouseTracker(options.tooltip); + + //globalAnimation = false; + render(); + + fireEvent(chart, 'load'); + + //globalAnimation = true; + + // run callbacks + if (callback) { + callback.apply(chart, [chart]); + } + each(chart.callbacks, function (fn) { + fn.apply(chart, [chart]); + }); + } + + // Run chart + + + // Destroy the chart and free up memory. + addEvent(win, 'unload', destroy); + + // Set up auto resize + if (optionsChart.reflow !== false) { + addEvent(chart, 'load', initReflow); + } + + // Chart event handlers + if (chartEvents) { + for (eventType in chartEvents) { + addEvent(chart, eventType, chartEvents[eventType]); + } + } + + + chart.options = options; + chart.series = series; + + + + + + // Expose methods and variables + chart.addSeries = addSeries; + chart.animation = pick(optionsChart.animation, true); + chart.destroy = destroy; + chart.get = get; + chart.getSelectedPoints = getSelectedPoints; + chart.getSelectedSeries = getSelectedSeries; + chart.hideLoading = hideLoading; + chart.isInsidePlot = isInsidePlot; + chart.redraw = redraw; + chart.setSize = resize; + chart.setTitle = setTitle; + chart.showLoading = showLoading; + chart.pointCount = 0; + chart.counters = new ChartCounters(); + /* + if ($) $(function() { + $container = $('#container'); + var origChartWidth, + origChartHeight; + if ($container) { + $('') + .insertBefore($container) + .click(function() { + if (origChartWidth === UNDEFINED) { + origChartWidth = chartWidth; + origChartHeight = chartHeight; + } + chart.resize(chartWidth *= 1.1, chartHeight *= 1.1); + }); + $('') + .insertBefore($container) + .click(function() { + if (origChartWidth === UNDEFINED) { + origChartWidth = chartWidth; + origChartHeight = chartHeight; + } + chart.resize(chartWidth *= 0.9, chartHeight *= 0.9); + }); + $('') + .insertBefore($container) + .click(function() { + if (origChartWidth === UNDEFINED) { + origChartWidth = chartWidth; + origChartHeight = chartHeight; + } + chart.resize(origChartWidth, origChartHeight); + }); + } + }) + */ + + + + + firstRender(); + + +} // end Chart + +// Hook for exporting module +Chart.prototype.callbacks = []; +/** + * The Point object and prototype. Inheritable and used as base for PiePoint + */ +var Point = function () {}; +Point.prototype = { + + /** + * Initialize the point + * @param {Object} series The series object containing this point + * @param {Object} options The data in either number, array or object format + */ + init: function (series, options) { + var point = this, + counters = series.chart.counters, + defaultColors; + point.series = series; + point.applyOptions(options); + point.pointAttr = {}; + + if (series.options.colorByPoint) { + defaultColors = series.chart.options.colors; + if (!point.options) { + point.options = {}; + } + point.color = point.options.color = point.color || defaultColors[counters.color++]; + + // loop back to zero + counters.wrapColor(defaultColors.length); + } + + series.chart.pointCount++; + return point; + }, + /** + * Apply the options containing the x and y data and possible some extra properties. + * This is called on point init or from point.update. + * + * @param {Object} options + */ + applyOptions: function (options) { + var point = this, + series = point.series; + + point.config = options; + + // onedimensional array input + if (isNumber(options) || options === null) { + point.y = options; + } else if (isObject(options) && !isNumber(options.length)) { // object input + // copy options directly to point + extend(point, options); + point.options = options; + } else if (isString(options[0])) { // categorized data with name in first position + point.name = options[0]; + point.y = options[1]; + } else if (isNumber(options[0])) { // two-dimentional array + point.x = options[0]; + point.y = options[1]; + } + + /* + * If no x is set by now, get auto incremented value. All points must have an + * x value, however the y value can be null to create a gap in the series + */ + if (point.x === UNDEFINED) { + point.x = series.autoIncrement(); + } + + }, + + /** + * Destroy a point to clear memory. Its reference still stays in series.data. + */ + destroy: function () { + var point = this, + series = point.series, + hoverPoints = series.chart.hoverPoints, + prop; + + series.chart.pointCount--; + + if (hoverPoints) { + point.setState(); + erase(hoverPoints, point); + } + if (point === series.chart.hoverPoint) { + point.onMouseOut(); + } + + + // remove all events + removeEvent(point); + + each(['graphic', 'tracker', 'group', 'dataLabel', 'connector', 'shadowGroup'], function (prop) { + if (point[prop]) { + point[prop].destroy(); + } + }); + + if (point.legendItem) { // pies have legend items + point.series.chart.legend.destroyItem(point); + } + + for (prop in point) { + point[prop] = null; + } + + + }, + + /** + * Return the configuration hash needed for the data label and tooltip formatters + */ + getLabelConfig: function () { + var point = this; + return { + x: point.category, + y: point.y, + series: point.series, + point: point, + percentage: point.percentage, + total: point.total || point.stackTotal + }; + }, + + /** + * Toggle the selection status of a point + * @param {Boolean} selected Whether to select or unselect the point. + * @param {Boolean} accumulate Whether to add to the previous selection. By default, + * this happens if the control key (Cmd on Mac) was pressed during clicking. + */ + select: function (selected, accumulate) { + var point = this, + series = point.series, + chart = series.chart; + + selected = pick(selected, !point.selected); + + // fire the event with the defalut handler + point.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () { + point.selected = selected; + point.setState(selected && SELECT_STATE); + + // unselect all other points unless Ctrl or Cmd + click + if (!accumulate) { + each(chart.getSelectedPoints(), function (loopPoint) { + if (loopPoint.selected && loopPoint !== point) { + loopPoint.selected = false; + loopPoint.setState(NORMAL_STATE); + loopPoint.firePointEvent('unselect'); + } + }); + } + }); + }, + + onMouseOver: function () { + var point = this, + chart = point.series.chart, + tooltip = chart.tooltip, + hoverPoint = chart.hoverPoint; + + // set normal state to previous series + if (hoverPoint && hoverPoint !== point) { + hoverPoint.onMouseOut(); + } + + // trigger the event + point.firePointEvent('mouseOver'); + + // update the tooltip + if (tooltip && !tooltip.shared) { + tooltip.refresh(point); + } + + // hover this + point.setState(HOVER_STATE); + chart.hoverPoint = point; + }, + + onMouseOut: function () { + var point = this; + point.firePointEvent('mouseOut'); + + point.setState(); + point.series.chart.hoverPoint = null; + }, + + /** + * Extendable method for formatting each point's tooltip line + * + * @param {Boolean} useHeader Whether a common header is used for multiple series in the tooltip + * + * @return {String} A string to be concatenated in to the common tooltip text + */ + tooltipFormatter: function (useHeader) { + var point = this, + series = point.series; + + return ['', (point.name || series.name), ': ', + (!useHeader ? ('x = ' + (point.name || point.x) + ', ') : ''), + '', (!useHeader ? 'y = ' : ''), point.y, ''].join(''); + + }, + + /** + * Update the point with new options (typically x/y data) and optionally redraw the series. + * + * @param {Object} options Point options as defined in the series.data array + * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + * + */ + update: function (options, redraw, animation) { + var point = this, + series = point.series, + graphic = point.graphic, + chart = series.chart; + + redraw = pick(redraw, true); + + // fire the event with a default handler of doing the update + point.firePointEvent('update', { options: options }, function () { + + point.applyOptions(options); + + // update visuals + if (isObject(options)) { + series.getAttribs(); + if (graphic) { + graphic.attr(point.pointAttr[series.state]); + } + } + + // redraw + series.isDirty = true; + if (redraw) { + chart.redraw(animation); + } + }); + }, + + /** + * Remove a point and optionally redraw the series and if necessary the axes + * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + */ + remove: function (redraw, animation) { + var point = this, + series = point.series, + chart = series.chart, + data = series.data; + + setAnimation(animation, chart); + redraw = pick(redraw, true); + + // fire the event with a default handler of removing the point + point.firePointEvent('remove', null, function () { + + erase(data, point); + + point.destroy(); + + + // redraw + series.isDirty = true; + if (redraw) { + chart.redraw(); + } + }); + + + }, + + /** + * Fire an event on the Point object. Must not be renamed to fireEvent, as this + * causes a name clash in MooTools + * @param {String} eventType + * @param {Object} eventArgs Additional event arguments + * @param {Function} defaultFunction Default event handler + */ + firePointEvent: function (eventType, eventArgs, defaultFunction) { + var point = this, + series = this.series, + seriesOptions = series.options; + + // load event handlers on demand to save time on mouseover/out + if (seriesOptions.point.events[eventType] || + (point.options && point.options.events && point.options.events[eventType])) { + this.importEvents(); + } + + // add default handler if in selection mode + if (eventType === 'click' && seriesOptions.allowPointSelect) { + defaultFunction = function (event) { + // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera + point.select(null, event.ctrlKey || event.metaKey || event.shiftKey); + }; + } + + fireEvent(this, eventType, eventArgs, defaultFunction); + }, + /** + * Import events from the series' and point's options. Only do it on + * demand, to save processing time on hovering. + */ + importEvents: function () { + if (!this.hasImportedEvents) { + var point = this, + options = merge(point.series.options.point, point.options), + events = options.events, + eventType; + + point.events = events; + + for (eventType in events) { + addEvent(point, eventType, events[eventType]); + } + this.hasImportedEvents = true; + + } + }, + + /** + * Set the point's state + * @param {String} state + */ + setState: function (state) { + var point = this, + series = point.series, + stateOptions = series.options.states, + markerOptions = defaultPlotOptions[series.type].marker && series.options.marker, + normalDisabled = markerOptions && !markerOptions.enabled, + markerStateOptions = markerOptions && markerOptions.states[state], + stateDisabled = markerStateOptions && markerStateOptions.enabled === false, + stateMarkerGraphic = series.stateMarkerGraphic, + chart = series.chart, + pointAttr = point.pointAttr; + + state = state || NORMAL_STATE; // empty string + + if ( + // already has this state + state === point.state || + // selected points don't respond to hover + (point.selected && state !== SELECT_STATE) || + // series' state options is disabled + (stateOptions[state] && stateOptions[state].enabled === false) || + // point marker's state options is disabled + (state && (stateDisabled || (normalDisabled && !markerStateOptions.enabled))) + + ) { + return; + } + + // apply hover styles to the existing point + if (point.graphic) { + point.graphic.attr(pointAttr[state]); + } else { + // if a graphic is not applied to each point in the normal state, create a shared + // graphic for the hover state + if (state) { + if (!stateMarkerGraphic) { + series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.circle( + 0, + 0, + pointAttr[state].r + ) + .attr(pointAttr[state]) + .add(series.group); + } + + stateMarkerGraphic.translate( + point.plotX, + point.plotY + ); + } + + if (stateMarkerGraphic) { + stateMarkerGraphic[state ? 'show' : 'hide'](); + } + } + + point.state = state; + } +}; + +/** + * The base function which all other series types inherit from + * @param {Object} chart + * @param {Object} options + */ +var Series = function () {}; + +Series.prototype = { + + isCartesian: true, + type: 'line', + pointClass: Point, + pointAttrToOptions: { // mapping between SVG attributes and the corresponding options + stroke: 'lineColor', + 'stroke-width': 'lineWidth', + fill: 'fillColor', + r: 'radius' + }, + init: function (chart, options) { + var series = this, + eventType, + events, + //pointEvent, + index = chart.series.length; + + series.chart = chart; + options = series.setOptions(options); // merge with plotOptions + + // set some variables + extend(series, { + index: index, + options: options, + name: options.name || 'Series ' + (index + 1), + state: NORMAL_STATE, + pointAttr: {}, + visible: options.visible !== false, // true by default + selected: options.selected === true // false by default + }); + + // register event listeners + events = options.events; + for (eventType in events) { + addEvent(series, eventType, events[eventType]); + } + if ( + (events && events.click) || + (options.point && options.point.events && options.point.events.click) || + options.allowPointSelect + ) { + chart.runTrackerClick = true; + } + + series.getColor(); + series.getSymbol(); + + + // set the data + series.setData(options.data, false); + + }, + + + /** + * Return an auto incremented x value based on the pointStart and pointInterval options. + * This is only used if an x value is not given for the point that calls autoIncrement. + */ + autoIncrement: function () { + var series = this, + options = series.options, + xIncrement = series.xIncrement; + + xIncrement = pick(xIncrement, options.pointStart, 0); + + series.pointInterval = pick(series.pointInterval, options.pointInterval, 1); + + series.xIncrement = xIncrement + series.pointInterval; + return xIncrement; + }, + + /** + * Sort the data and remove duplicates + */ + cleanData: function () { + var series = this, + chart = series.chart, + data = series.data, + closestPoints, + smallestInterval, + chartSmallestInterval = chart.smallestInterval, + interval, + i; + + // sort the data points + stableSort(data, function (a, b) { + return (a.x - b.x); + }); + + // remove points with equal x values + // record the closest distance for calculation of column widths + /*for (i = data.length - 1; i >= 0; i--) { + if (data[i - 1]) { + if (data[i - 1].x == data[i].x) { + data[i - 1].destroy(); + data.splice(i - 1, 1); // remove the duplicate + } + } + }*/ + + // connect nulls + if (series.options.connectNulls) { + for (i = data.length - 1; i >= 0; i--) { + if (data[i].y === null && data[i - 1] && data[i + 1]) { + data.splice(i, 1); + } + } + } + + // find the closes pair of points + for (i = data.length - 1; i >= 0; i--) { + if (data[i - 1]) { + interval = data[i].x - data[i - 1].x; + if (interval > 0 && (smallestInterval === UNDEFINED || interval < smallestInterval)) { + smallestInterval = interval; + closestPoints = i; + } + } + } + + if (chartSmallestInterval === UNDEFINED || smallestInterval < chartSmallestInterval) { + chart.smallestInterval = smallestInterval; + } + series.closestPoints = closestPoints; + }, + + /** + * Divide the series data into segments divided by null values. Also sort + * the data points and delete duplicate values. + */ + getSegments: function () { + var lastNull = -1, + segments = [], + data = this.data; + + // create the segments + each(data, function (point, i) { + if (point.y === null) { + if (i > lastNull + 1) { + segments.push(data.slice(lastNull + 1, i)); + } + lastNull = i; + } else if (i === data.length - 1) { // last value + segments.push(data.slice(lastNull + 1, i + 1)); + } + }); + this.segments = segments; + + + }, + /** + * Set the series options by merging from the options tree + * @param {Object} itemOptions + */ + setOptions: function (itemOptions) { + var plotOptions = this.chart.options.plotOptions, + options = merge( + plotOptions[this.type], + plotOptions.series, + itemOptions + ); + + return options; + + }, + /** + * Get the series' color + */ + getColor: function () { + var defaultColors = this.chart.options.colors, + counters = this.chart.counters; + this.color = this.options.color || defaultColors[counters.color++] || '#0000ff'; + counters.wrapColor(defaultColors.length); + }, + /** + * Get the series' symbol + */ + getSymbol: function () { + var defaultSymbols = this.chart.options.symbols, + counters = this.chart.counters; + this.symbol = this.options.marker.symbol || defaultSymbols[counters.symbol++]; + counters.wrapSymbol(defaultSymbols.length); + }, + + /** + * Add a point dynamically after chart load time + * @param {Object} options Point options as given in series.data + * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call + * @param {Boolean} shift If shift is true, a point is shifted off the start + * of the series as one is appended to the end. + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + */ + addPoint: function (options, redraw, shift, animation) { + var series = this, + data = series.data, + graph = series.graph, + area = series.area, + chart = series.chart, + point = (new series.pointClass()).init(series, options); + + setAnimation(animation, chart); + + if (graph && shift) { // make graph animate sideways + graph.shift = shift; + } + if (area) { + area.shift = shift; + area.isArea = true; + } + + redraw = pick(redraw, true); + + data.push(point); + if (shift) { + data[0].remove(false); + } + series.getAttribs(); + + + // redraw + series.isDirty = true; + if (redraw) { + chart.redraw(); + } + }, + + /** + * Replace the series data with a new set of data + * @param {Object} data + * @param {Object} redraw + */ + setData: function (data, redraw) { + var series = this, + oldData = series.data, + initialColor = series.initialColor, + chart = series.chart, + i = (oldData && oldData.length) || 0; + + series.xIncrement = null; // reset for new data + if (defined(initialColor)) { // reset colors for pie + chart.counters.color = initialColor; + } + + data = map(splat(data || []), function (pointOptions) { + return (new series.pointClass()).init(series, pointOptions); + }); + + // destroy old points + while (i--) { + oldData[i].destroy(); + } + + // set the data + series.data = data; + + series.cleanData(); + series.getSegments(); + + + // cache attributes for shapes + series.getAttribs(); + + // redraw + series.isDirty = true; + chart.isDirtyBox = true; + if (pick(redraw, true)) { + chart.redraw(false); + } + }, + + /** + * Remove a series and optionally redraw the chart + * + * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call + * @param {Boolean|Object} animation Whether to apply animation, and optionally animation + * configuration + */ + + remove: function (redraw, animation) { + var series = this, + chart = series.chart; + redraw = pick(redraw, true); + + if (!series.isRemoving) { /* prevent triggering native event in jQuery + (calling the remove function from the remove event) */ + series.isRemoving = true; + + // fire the event with a default handler of removing the point + fireEvent(series, 'remove', null, function () { + + + // destroy elements + series.destroy(); + + + // redraw + chart.isDirtyLegend = chart.isDirtyBox = true; + if (redraw) { + chart.redraw(animation); + } + }); + + } + series.isRemoving = false; + }, + + /** + * Translate data points from raw data values to chart specific positioning data + * needed later in drawPoints, drawGraph and drawTracker. + */ + translate: function () { + var series = this, + chart = series.chart, + stacking = series.options.stacking, + categories = series.xAxis.categories, + yAxis = series.yAxis, + data = series.data, + i = data.length; + + // do the translation + while (i--) { + var point = data[i], + xValue = point.x, + yValue = point.y, + yBottom = point.low, + stack = yAxis.stacks[(yValue < 0 ? '-' : '') + series.stackKey], + pointStack, + pointStackTotal; + point.plotX = series.xAxis.translate(xValue); + + // calculate the bottom y value for stacked series + if (stacking && series.visible && stack && stack[xValue]) { + pointStack = stack[xValue]; + pointStackTotal = pointStack.total; + pointStack.cum = yBottom = pointStack.cum - yValue; // start from top + yValue = yBottom + yValue; + + if (stacking === 'percent') { + yBottom = pointStackTotal ? yBottom * 100 / pointStackTotal : 0; + yValue = pointStackTotal ? yValue * 100 / pointStackTotal : 0; + } + + point.percentage = pointStackTotal ? point.y * 100 / pointStackTotal : 0; + point.stackTotal = pointStackTotal; + } + + if (defined(yBottom)) { + point.yBottom = yAxis.translate(yBottom, 0, 1, 0, 1); + } + + // set the y value + if (yValue !== null) { + point.plotY = yAxis.translate(yValue, 0, 1, 0, 1); + } + + // set client related positions for mouse tracking + point.clientX = chart.inverted ? + chart.plotHeight - point.plotX : + point.plotX; // for mouse tracking + + // some API data + point.category = categories && categories[point.x] !== UNDEFINED ? + categories[point.x] : point.x; + + } + }, + /** + * Memoize tooltip texts and positions + */ + setTooltipPoints: function (renew) { + var series = this, + chart = series.chart, + inverted = chart.inverted, + data = [], + plotSize = mathRound((inverted ? chart.plotTop : chart.plotLeft) + chart.plotSizeX), + low, + high, + tooltipPoints = []; // a lookup array for each pixel in the x dimension + + // renew + if (renew) { + series.tooltipPoints = null; + } + + // concat segments to overcome null values + each(series.segments, function (segment) { + data = data.concat(segment); + }); + + // loop the concatenated data and apply each point to all the closest + // pixel positions + if (series.xAxis && series.xAxis.reversed) { + data = data.reverse();//reverseArray(data); + } + + each(data, function (point, i) { + + low = data[i - 1] ? data[i - 1]._high + 1 : 0; + high = point._high = data[i + 1] ? + (mathFloor((point.plotX + (data[i + 1] ? data[i + 1].plotX : plotSize)) / 2)) : + plotSize; + + while (low <= high) { + tooltipPoints[inverted ? plotSize - low++ : low++] = point; + } + }); + series.tooltipPoints = tooltipPoints; + }, + + + + + /** + * Series mouse over handler + */ + onMouseOver: function () { + var series = this, + chart = series.chart, + hoverSeries = chart.hoverSeries; + + if (!hasTouch && chart.mouseIsDown) { + return; + } + + // set normal state to previous series + if (hoverSeries && hoverSeries !== series) { + hoverSeries.onMouseOut(); + } + + // trigger the event, but to save processing time, + // only if defined + if (series.options.events.mouseOver) { + fireEvent(series, 'mouseOver'); + } + + + // bring to front + // Todo: optimize. This is one of two operations slowing down the tooltip in Firefox. + // Can the tracking be done otherwise? + if (series.tracker) { + series.tracker.toFront(); + } + + // hover this + series.setState(HOVER_STATE); + chart.hoverSeries = series; + }, + + /** + * Series mouse out handler + */ + onMouseOut: function () { + // trigger the event only if listeners exist + var series = this, + options = series.options, + chart = series.chart, + tooltip = chart.tooltip, + hoverPoint = chart.hoverPoint; + + // trigger mouse out on the point, which must be in this series + if (hoverPoint) { + hoverPoint.onMouseOut(); + } + + // fire the mouse out event + if (series && options.events.mouseOut) { + fireEvent(series, 'mouseOut'); + } + + + // hide the tooltip + if (tooltip && !options.stickyTracking) { + tooltip.hide(); + } + + // set normal state + series.setState(); + chart.hoverSeries = null; + }, + + /** + * Animate in the series + */ + animate: function (init) { + var series = this, + chart = series.chart, + clipRect = series.clipRect, + animation = series.options.animation; + + if (animation && !isObject(animation)) { + animation = {}; + } + + if (init) { // initialize the animation + if (!clipRect.isAnimating) { // apply it only for one of the series + clipRect.attr('width', 0); + clipRect.isAnimating = true; + } + + } else { // run the animation + clipRect.animate({ + width: chart.plotSizeX + }, animation); + + // delete this function to allow it only once + this.animate = null; + } + }, + + + /** + * Draw the markers + */ + drawPoints: function () { + var series = this, + pointAttr, + data = series.data, + chart = series.chart, + plotX, + plotY, + i, + point, + radius, + graphic; + + if (series.options.marker.enabled) { + i = data.length; + while (i--) { + point = data[i]; + plotX = point.plotX; + plotY = point.plotY; + graphic = point.graphic; + + // only draw the point if y is defined + if (plotY !== UNDEFINED && !isNaN(plotY)) { + + /* && removed this code because points stayed after zoom + point.plotX >= 0 && point.plotX <= chart.plotSizeX && + point.plotY >= 0 && point.plotY <= chart.plotSizeY*/ + + // shortcuts + pointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]; + radius = pointAttr.r; + + if (graphic) { // update + graphic.animate({ + x: plotX, + y: plotY, + r: radius + }); + } else { + point.graphic = chart.renderer.symbol( + pick(point.marker && point.marker.symbol, series.symbol), + plotX, + plotY, + radius + ) + .attr(pointAttr) + .add(series.group); + } + } + } + } + + }, + + /** + * Convert state properties from API naming conventions to SVG attributes + * + * @param {Object} options API options object + * @param {Object} base1 SVG attribute object to inherit from + * @param {Object} base2 Second level SVG attribute object to inherit from + */ + convertAttribs: function (options, base1, base2, base3) { + var conversion = this.pointAttrToOptions, + attr, + option, + obj = {}; + + options = options || {}; + base1 = base1 || {}; + base2 = base2 || {}; + base3 = base3 || {}; + + for (attr in conversion) { + option = conversion[attr]; + obj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]); + } + return obj; + }, + + /** + * Get the state attributes. Each series type has its own set of attributes + * that are allowed to change on a point's state change. Series wide attributes are stored for + * all series, and additionally point specific attributes are stored for all + * points with individual marker options. If such options are not defined for the point, + * a reference to the series wide attributes is stored in point.pointAttr. + */ + getAttribs: function () { + var series = this, + normalOptions = defaultPlotOptions[series.type].marker ? series.options.marker : series.options, + stateOptions = normalOptions.states, + stateOptionsHover = stateOptions[HOVER_STATE], + pointStateOptionsHover, + seriesColor = series.color, + normalDefaults = { + stroke: seriesColor, + fill: seriesColor + }, + data = series.data, + i, + point, + seriesPointAttr = [], + pointAttr, + pointAttrToOptions = series.pointAttrToOptions, + hasPointSpecificOptions, + key; + + // series type specific modifications + if (series.options.marker) { // line, spline, area, areaspline, scatter + + // if no hover radius is given, default to normal radius + 2 + stateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2; + stateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1; + + } else { // column, bar, pie + + // if no hover color is given, brighten the normal color + stateOptionsHover.color = stateOptionsHover.color || + Color(stateOptionsHover.color || seriesColor) + .brighten(stateOptionsHover.brightness).get(); + } + + // general point attributes for the series normal state + seriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults); + + // HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius + each([HOVER_STATE, SELECT_STATE], function (state) { + seriesPointAttr[state] = + series.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]); + }); + + // set it + series.pointAttr = seriesPointAttr; + + + // Generate the point-specific attribute collections if specific point + // options are given. If not, create a referance to the series wide point + // attributes + i = data.length; + while (i--) { + point = data[i]; + normalOptions = (point.options && point.options.marker) || point.options; + if (normalOptions && normalOptions.enabled === false) { + normalOptions.radius = 0; + } + hasPointSpecificOptions = false; + + // check if the point has specific visual options + if (point.options) { + for (key in pointAttrToOptions) { + if (defined(normalOptions[pointAttrToOptions[key]])) { + hasPointSpecificOptions = true; + } + } + } + + + + // a specific marker config object is defined for the individual point: + // create it's own attribute collection + if (hasPointSpecificOptions) { + + pointAttr = []; + stateOptions = normalOptions.states || {}; // reassign for individual point + pointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {}; + + // if no hover color is given, brighten the normal color + if (!series.options.marker) { // column, bar, point + pointStateOptionsHover.color = + Color(pointStateOptionsHover.color || point.options.color) + .brighten(pointStateOptionsHover.brightness || + stateOptionsHover.brightness).get(); + + } + + // normal point state inherits series wide normal state + pointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, seriesPointAttr[NORMAL_STATE]); + + // inherit from point normal and series hover + pointAttr[HOVER_STATE] = series.convertAttribs( + stateOptions[HOVER_STATE], + seriesPointAttr[HOVER_STATE], + pointAttr[NORMAL_STATE] + ); + // inherit from point normal and series hover + pointAttr[SELECT_STATE] = series.convertAttribs( + stateOptions[SELECT_STATE], + seriesPointAttr[SELECT_STATE], + pointAttr[NORMAL_STATE] + ); + + + + // no marker config object is created: copy a reference to the series-wide + // attribute collection + } else { + pointAttr = seriesPointAttr; + } + + point.pointAttr = pointAttr; + + } + + }, + + + /** + * Clear DOM objects and free up memory + */ + destroy: function () { + var series = this, + chart = series.chart, + seriesClipRect = series.clipRect, + //chartSeries = series.chart.series, + issue134 = /\/5[0-9\.]+ (Safari|Mobile)\//.test(userAgent), // todo: update when Safari bug is fixed + destroy, + prop; + + // add event hook + fireEvent(series, 'destroy'); + + // remove all events + removeEvent(series); + + // remove legend items + if (series.legendItem) { + series.chart.legend.destroyItem(series); + } + + // destroy all points with their elements + each(series.data, function (point) { + point.destroy(); + }); + + // If this series clipRect is not the global one (which is removed on chart.destroy) we + // destroy it here. + if (seriesClipRect && seriesClipRect !== chart.clipRect) { + series.clipRect = seriesClipRect.destroy(); + } + + // destroy all SVGElements associated to the series + each(['area', 'graph', 'dataLabelsGroup', 'group', 'tracker'], function (prop) { + if (series[prop]) { + + // issue 134 workaround + destroy = issue134 && prop === 'group' ? + 'hide' : + 'destroy'; + + series[prop][destroy](); + } + }); + + // remove from hoverSeries + if (chart.hoverSeries === series) { + chart.hoverSeries = null; + } + erase(chart.series, series); + + // clear all members + for (prop in series) { + delete series[prop]; + } + }, + + /** + * Draw the data labels + */ + drawDataLabels: function () { + if (this.options.dataLabels.enabled) { + var series = this, + x, + y, + data = series.data, + seriesOptions = series.options, + options = seriesOptions.dataLabels, + str, + dataLabelsGroup = series.dataLabelsGroup, + chart = series.chart, + renderer = chart.renderer, + inverted = chart.inverted, + seriesType = series.type, + color, + stacking = seriesOptions.stacking, + isBarLike = seriesType === 'column' || seriesType === 'bar', + vAlignIsNull = options.verticalAlign === null, + yIsNull = options.y === null; + + if (isBarLike) { + if (stacking) { + // In stacked series the default label placement is inside the bars + if (vAlignIsNull) { + options = merge(options, {verticalAlign: 'middle'}); + } + + // If no y delta is specified, try to create a good default + if (yIsNull) { + options = merge(options, {y: {top: 14, middle: 4, bottom: -6}[options.verticalAlign]}); + } + } else { + // In non stacked series the default label placement is on top of the bars + if (vAlignIsNull) { + options = merge(options, {verticalAlign: 'top'}); + } + } + } + + // create a separate group for the data labels to avoid rotation + if (!dataLabelsGroup) { + dataLabelsGroup = series.dataLabelsGroup = + renderer.g('data-labels') + .attr({ + visibility: series.visible ? VISIBLE : HIDDEN, + zIndex: 6 + }) + .translate(chart.plotLeft, chart.plotTop) + .add(); + } else { + dataLabelsGroup.translate(chart.plotLeft, chart.plotTop); + } + + // determine the color + color = options.color; + if (color === 'auto') { // 1.0 backwards compatibility + color = null; + } + options.style.color = pick(color, series.color, 'black'); + + // make the labels for each point + each(data, function (point) { + var barX = point.barX, + plotX = (barX && barX + point.barW / 2) || point.plotX || -999, + plotY = pick(point.plotY, -999), + dataLabel = point.dataLabel, + align = options.align, + individualYDelta = yIsNull ? (point.y >= 0 ? -6 : 12) : options.y; + + // get the string + str = options.formatter.call(point.getLabelConfig()); + x = (inverted ? chart.plotWidth - plotY : plotX) + options.x; + y = (inverted ? chart.plotHeight - plotX : plotY) + individualYDelta; + + // in columns, align the string to the column + if (seriesType === 'column') { + x += { left: -1, right: 1 }[align] * point.barW / 2 || 0; + } + + if (inverted && point.y < 0) { + align = 'right'; + x -= 10; + } + + // update existing label + if (dataLabel) { + // vertically centered + if (inverted && !options.y) { + y = y + pInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2; + } + dataLabel + .attr({ + text: str + }).animate({ + x: x, + y: y + }); + // create new label + } else if (defined(str)) { + dataLabel = point.dataLabel = renderer.text( + str, + x, + y + ) + .attr({ + align: align, + rotation: options.rotation, + zIndex: 1 + }) + .css(options.style) + .add(dataLabelsGroup); + // vertically centered + if (inverted && !options.y) { + dataLabel.attr({ + y: y + pInt(dataLabel.styles.lineHeight) * 0.9 - dataLabel.getBBox().height / 2 + }); + } + } + + + /*if (series.isCartesian) { + dataLabel[chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide'](); + }*/ + + if (isBarLike && seriesOptions.stacking && dataLabel) { + var barY = point.barY, + barW = point.barW, + barH = point.barH; + + dataLabel.align(options, null, + { + x: inverted ? chart.plotWidth - barY - barH : barX, + y: inverted ? chart.plotHeight - barX - barW : barY, + width: inverted ? barH : barW, + height: inverted ? barW : barH + }); + } + }); + } + }, + + /** + * Draw the actual graph + */ + drawGraph: function () { + var series = this, + options = series.options, + chart = series.chart, + graph = series.graph, + graphPath = [], + fillColor, + area = series.area, + group = series.group, + color = options.lineColor || series.color, + lineWidth = options.lineWidth, + dashStyle = options.dashStyle, + segmentPath, + renderer = chart.renderer, + translatedThreshold = series.yAxis.getThreshold(options.threshold || 0), + useArea = /^area/.test(series.type), + singlePoints = [], // used in drawTracker + areaPath = [], + attribs; + + + // divide into segments and build graph and area paths + each(series.segments, function (segment) { + segmentPath = []; + + // build the segment line + each(segment, function (point, i) { + + if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object + segmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i)); + + } else { + + // moveTo or lineTo + segmentPath.push(i ? L : M); + + // step line? + if (i && options.step) { + var lastPoint = segment[i - 1]; + segmentPath.push( + point.plotX, + lastPoint.plotY + ); + } + + // normal line to next point + segmentPath.push( + point.plotX, + point.plotY + ); + } + }); + + // add the segment to the graph, or a single point for tracking + if (segment.length > 1) { + graphPath = graphPath.concat(segmentPath); + } else { + singlePoints.push(segment[0]); + } + + // build the area + if (useArea) { + var areaSegmentPath = [], + i, + segLength = segmentPath.length; + for (i = 0; i < segLength; i++) { + areaSegmentPath.push(segmentPath[i]); + } + if (segLength === 3) { // for animation from 1 to two points + areaSegmentPath.push(L, segmentPath[1], segmentPath[2]); + } + if (options.stacking && series.type !== 'areaspline') { + // follow stack back. Todo: implement areaspline + for (i = segment.length - 1; i >= 0; i--) { + areaSegmentPath.push(segment[i].plotX, segment[i].yBottom); + } + + } else { // follow zero line back + areaSegmentPath.push( + L, + segment[segment.length - 1].plotX, + translatedThreshold, + L, + segment[0].plotX, + translatedThreshold + ); + } + areaPath = areaPath.concat(areaSegmentPath); + } + }); + + // used in drawTracker: + series.graphPath = graphPath; + series.singlePoints = singlePoints; + + // draw the area if area series or areaspline + if (useArea) { + fillColor = pick( + options.fillColor, + Color(series.color).setOpacity(options.fillOpacity || 0.75).get() + ); + if (area) { + area.animate({ d: areaPath }); + + } else { + // draw the area + series.area = series.chart.renderer.path(areaPath) + .attr({ + fill: fillColor + }).add(group); + } + } + + // draw the graph + if (graph) { + stop(graph); // cancel running animations, #459 + graph.animate({ d: graphPath }); + + } else { + if (lineWidth) { + attribs = { + 'stroke': color, + 'stroke-width': lineWidth + }; + if (dashStyle) { + attribs.dashstyle = dashStyle; + } + + series.graph = renderer.path(graphPath) + .attr(attribs).add(group).shadow(options.shadow); + } + } + }, + + + /** + * Render the graph and markers + */ + render: function () { + var series = this, + chart = series.chart, + group, + setInvert, + options = series.options, + animation = options.animation, + doAnimation = animation && series.animate, + duration = doAnimation ? (animation && animation.duration) || 500 : 0, + clipRect = series.clipRect, + renderer = chart.renderer; + + + // Add plot area clipping rectangle. If this is before chart.hasRendered, + // create one shared clipRect. + if (!clipRect) { + clipRect = series.clipRect = !chart.hasRendered && chart.clipRect ? + chart.clipRect : + renderer.clipRect(0, 0, chart.plotSizeX, chart.plotSizeY); + if (!chart.clipRect) { + chart.clipRect = clipRect; + } + } + + + // the group + if (!series.group) { + group = series.group = renderer.g('series'); + + if (chart.inverted) { + setInvert = function () { + group.attr({ + width: chart.plotWidth, + height: chart.plotHeight + }).invert(); + }; + + setInvert(); // do it now + addEvent(chart, 'resize', setInvert); // do it on resize + addEvent(series, 'destroy', function () { + removeEvent(chart, 'resize', setInvert); + }); + } + group.clip(series.clipRect) + .attr({ + visibility: series.visible ? VISIBLE : HIDDEN, + zIndex: options.zIndex + }) + .translate(chart.plotLeft, chart.plotTop) + .add(chart.seriesGroup); + } + + series.drawDataLabels(); + + // initiate the animation + if (doAnimation) { + series.animate(true); + } + + // cache attributes for shapes + //series.getAttribs(); + + // draw the graph if any + if (series.drawGraph) { + series.drawGraph(); + } + + // draw the points + series.drawPoints(); + + // draw the mouse tracking area + if (series.options.enableMouseTracking !== false) { + series.drawTracker(); + } + + // run the animation + if (doAnimation) { + series.animate(); + } + + // finish the individual clipRect + setTimeout(function () { + clipRect.isAnimating = false; + group = series.group; // can be destroyed during the timeout + if (group && clipRect !== chart.clipRect && clipRect.renderer) { + group.clip((series.clipRect = chart.clipRect)); + clipRect.destroy(); + } + }, duration); + + + series.isDirty = false; // means data is in accordance with what you see + + }, + + /** + * Redraw the series after an update in the axes. + */ + redraw: function () { + var series = this, + chart = series.chart, + group = series.group; + + /*if (clipRect) { + stop(clipRect); + clipRect.animate({ // for chart resize + width: chart.plotSizeX, + height: chart.plotSizeY + }); + }*/ + + // reposition on resize + if (group) { + if (chart.inverted) { + group.attr({ + width: chart.plotWidth, + height: chart.plotHeight + }); + } + + group.animate({ + translateX: chart.plotLeft, + translateY: chart.plotTop + }); + } + + series.translate(); + series.setTooltipPoints(true); + series.render(); + }, + + /** + * Set the state of the graph + */ + setState: function (state) { + var series = this, + options = series.options, + graph = series.graph, + stateOptions = options.states, + lineWidth = options.lineWidth; + + state = state || NORMAL_STATE; + + if (series.state !== state) { + series.state = state; + + if (stateOptions[state] && stateOptions[state].enabled === false) { + return; + } + + if (state) { + lineWidth = stateOptions[state].lineWidth || lineWidth + 1; + } + + if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML + graph.attr({ // use attr because animate will cause any other animation on the graph to stop + 'stroke-width': lineWidth + }, state ? 0 : 500); + } + } + }, + + /** + * Set the visibility of the graph + * + * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED, + * the visibility is toggled. + */ + setVisible: function (vis, redraw) { + var series = this, + chart = series.chart, + legendItem = series.legendItem, + seriesGroup = series.group, + seriesTracker = series.tracker, + dataLabelsGroup = series.dataLabelsGroup, + showOrHide, + i, + data = series.data, + point, + ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries, + oldVisibility = series.visible; + + // if called without an argument, toggle visibility + series.visible = vis = vis === UNDEFINED ? !oldVisibility : vis; + showOrHide = vis ? 'show' : 'hide'; + + // show or hide series + if (seriesGroup) { // pies don't have one + seriesGroup[showOrHide](); + } + + // show or hide trackers + if (seriesTracker) { + seriesTracker[showOrHide](); + } else { + i = data.length; + while (i--) { + point = data[i]; + if (point.tracker) { + point.tracker[showOrHide](); + } + } + } + + + if (dataLabelsGroup) { + dataLabelsGroup[showOrHide](); + } + + if (legendItem) { + chart.legend.colorizeItem(series, vis); + } + + + // rescale or adapt to resized chart + series.isDirty = true; + // in a stack, all other series are affected + if (series.options.stacking) { + each(chart.series, function (otherSeries) { + if (otherSeries.options.stacking && otherSeries.visible) { + otherSeries.isDirty = true; + } + }); + } + + if (ignoreHiddenSeries) { + chart.isDirtyBox = true; + } + if (redraw !== false) { + chart.redraw(); + } + + fireEvent(series, showOrHide); + }, + + /** + * Show the graph + */ + show: function () { + this.setVisible(true); + }, + + /** + * Hide the graph + */ + hide: function () { + this.setVisible(false); + }, + + + /** + * Set the selected state of the graph + * + * @param selected {Boolean} True to select the series, false to unselect. If + * UNDEFINED, the selection state is toggled. + */ + select: function (selected) { + var series = this; + // if called without an argument, toggle + series.selected = selected = (selected === UNDEFINED) ? !series.selected : selected; + + if (series.checkbox) { + series.checkbox.checked = selected; + } + + fireEvent(series, selected ? 'select' : 'unselect'); + }, + + + /** + * Draw the tracker object that sits above all data labels and markers to + * track mouse events on the graph or points. For the line type charts + * the tracker uses the same graphPath, but with a greater stroke width + * for better control. + */ + drawTracker: function () { + var series = this, + options = series.options, + trackerPath = [].concat(series.graphPath), + trackerPathLength = trackerPath.length, + chart = series.chart, + snap = chart.options.tooltip.snap, + tracker = series.tracker, + cursor = options.cursor, + css = cursor && { cursor: cursor }, + singlePoints = series.singlePoints, + singlePoint, + i; + + // Extend end points. A better way would be to use round linecaps, + // but those are not clickable in VML. + if (trackerPathLength) { + i = trackerPathLength + 1; + while (i--) { + if (trackerPath[i] === M) { // extend left side + trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L); + } + if ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side + trackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]); + } + } + } + + // handle single points + for (i = 0; i < singlePoints.length; i++) { + singlePoint = singlePoints[i]; + trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY, + L, singlePoint.plotX + snap, singlePoint.plotY); + } + + // draw the tracker + if (tracker) { + tracker.attr({ d: trackerPath }); + + } else { // create + series.tracker = chart.renderer.path(trackerPath) + .attr({ + isTracker: true, + stroke: TRACKER_FILL, + fill: NONE, + 'stroke-width' : options.lineWidth + 2 * snap, + visibility: series.visible ? VISIBLE : HIDDEN, + zIndex: options.zIndex || 1 + }) + .on(hasTouch ? 'touchstart' : 'mouseover', function () { + if (chart.hoverSeries !== series) { + series.onMouseOver(); + } + }) + .on('mouseout', function () { + if (!options.stickyTracking) { + series.onMouseOut(); + } + }) + .css(css) + .add(chart.trackerGroup); + } + + } + +}; // end Series prototype + + +/** + * LineSeries object + */ +var LineSeries = extendClass(Series); +seriesTypes.line = LineSeries; + +/** + * AreaSeries object + */ +var AreaSeries = extendClass(Series, { + type: 'area' +}); +seriesTypes.area = AreaSeries; + + + + +/** + * SplineSeries object + */ +var SplineSeries = extendClass(Series, { + type: 'spline', + + /** + * Draw the actual graph + */ + getPointSpline: function (segment, point, i) { + var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc + denom = smoothing + 1, + plotX = point.plotX, + plotY = point.plotY, + lastPoint = segment[i - 1], + nextPoint = segment[i + 1], + leftContX, + leftContY, + rightContX, + rightContY, + ret; + + // find control points + if (i && i < segment.length - 1) { + var lastX = lastPoint.plotX, + lastY = lastPoint.plotY, + nextX = nextPoint.plotX, + nextY = nextPoint.plotY, + correction; + + leftContX = (smoothing * plotX + lastX) / denom; + leftContY = (smoothing * plotY + lastY) / denom; + rightContX = (smoothing * plotX + nextX) / denom; + rightContY = (smoothing * plotY + nextY) / denom; + + // have the two control points make a straight line through main point + correction = ((rightContY - leftContY) * (rightContX - plotX)) / + (rightContX - leftContX) + plotY - rightContY; + + leftContY += correction; + rightContY += correction; + + // to prevent false extremes, check that control points are between + // neighbouring points' y values + if (leftContY > lastY && leftContY > plotY) { + leftContY = mathMax(lastY, plotY); + rightContY = 2 * plotY - leftContY; // mirror of left control point + } else if (leftContY < lastY && leftContY < plotY) { + leftContY = mathMin(lastY, plotY); + rightContY = 2 * plotY - leftContY; + } + if (rightContY > nextY && rightContY > plotY) { + rightContY = mathMax(nextY, plotY); + leftContY = 2 * plotY - rightContY; + } else if (rightContY < nextY && rightContY < plotY) { + rightContY = mathMin(nextY, plotY); + leftContY = 2 * plotY - rightContY; + } + + // record for drawing in next point + point.rightContX = rightContX; + point.rightContY = rightContY; + + } + + // moveTo or lineTo + if (!i) { + ret = [M, plotX, plotY]; + } else { // curve from last point to this + ret = [ + 'C', + lastPoint.rightContX || lastPoint.plotX, + lastPoint.rightContY || lastPoint.plotY, + leftContX || plotX, + leftContY || plotY, + plotX, + plotY + ]; + lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later + } + return ret; + } +}); +seriesTypes.spline = SplineSeries; + + + +/** + * AreaSplineSeries object + */ +var AreaSplineSeries = extendClass(SplineSeries, { + type: 'areaspline' +}); +seriesTypes.areaspline = AreaSplineSeries; + +/** + * ColumnSeries object + */ +var ColumnSeries = extendClass(Series, { + type: 'column', + pointAttrToOptions: { // mapping between SVG attributes and the corresponding options + stroke: 'borderColor', + 'stroke-width': 'borderWidth', + fill: 'color', + r: 'borderRadius' + }, + init: function () { + Series.prototype.init.apply(this, arguments); + + var series = this, + chart = series.chart; + + // flag the chart in order to pad the x axis + chart.hasColumn = true; + + // if the series is added dynamically, force redraw of other + // series affected by a new column + if (chart.hasRendered) { + each(chart.series, function (otherSeries) { + if (otherSeries.type === series.type) { + otherSeries.isDirty = true; + } + }); + } + }, + + /** + * Translate each point to the plot area coordinate system and find shape positions + */ + translate: function () { + var series = this, + chart = series.chart, + options = series.options, + stacking = options.stacking, + borderWidth = options.borderWidth, + columnCount = 0, + reversedXAxis = series.xAxis.reversed, + categories = series.xAxis.categories, + stackGroups = {}, + stackKey, + columnIndex; + + Series.prototype.translate.apply(series); + + // Get the total number of column type series. + // This is called on every series. Consider moving this logic to a + // chart.orderStacks() function and call it on init, addSeries and removeSeries + each(chart.series, function (otherSeries) { + if (otherSeries.type === series.type && otherSeries.visible) { + if (otherSeries.options.stacking) { + stackKey = otherSeries.stackKey; + if (stackGroups[stackKey] === UNDEFINED) { + stackGroups[stackKey] = columnCount++; + } + columnIndex = stackGroups[stackKey]; + } else { + columnIndex = columnCount++; + } + otherSeries.columnIndex = columnIndex; + } + }); + + // calculate the width and position of each column based on + // the number of column series in the plot, the groupPadding + // and the pointPadding options + var data = series.data, + closestPoints = series.closestPoints, + categoryWidth = mathAbs( + data[1] ? data[closestPoints].plotX - data[closestPoints - 1].plotX : + chart.plotSizeX / ((categories && categories.length) || 1) + ), + groupPadding = categoryWidth * options.groupPadding, + groupWidth = categoryWidth - 2 * groupPadding, + pointOffsetWidth = groupWidth / columnCount, + optionPointWidth = options.pointWidth, + pointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 : + pointOffsetWidth * options.pointPadding, + pointWidth = mathMax(pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), 1), + colIndex = (reversedXAxis ? columnCount - + series.columnIndex : series.columnIndex) || 0, + pointXOffset = pointPadding + (groupPadding + colIndex * + pointOffsetWidth - (categoryWidth / 2)) * + (reversedXAxis ? -1 : 1), + threshold = options.threshold || 0, + translatedThreshold = series.yAxis.getThreshold(threshold), + minPointLength = pick(options.minPointLength, 5); + + // record the new values + each(data, function (point) { + var plotY = point.plotY, + yBottom = point.yBottom || translatedThreshold, + barX = point.plotX + pointXOffset, + barY = mathCeil(mathMin(plotY, yBottom)), + barH = mathCeil(mathMax(plotY, yBottom) - barY), + stack = series.yAxis.stacks[(point.y < 0 ? '-' : '') + series.stackKey], + trackerY, + shapeArgs; + + // Record the offset'ed position and width of the bar to be able to align the stacking total correctly + if (stacking && series.visible && stack && stack[point.x]) { + stack[point.x].setOffset(pointXOffset, pointWidth); + } + + // handle options.minPointLength and tracker for small points + if (mathAbs(barH) < minPointLength) { + if (minPointLength) { + barH = minPointLength; + barY = + mathAbs(barY - translatedThreshold) > minPointLength ? // stacked + yBottom - minPointLength : // keep position + translatedThreshold - (plotY <= translatedThreshold ? minPointLength : 0); + } + trackerY = barY - 3; + } + + extend(point, { + barX: barX, + barY: barY, + barW: pointWidth, + barH: barH + }); + + // create shape type and shape args that are reused in drawPoints and drawTracker + point.shapeType = 'rect'; + shapeArgs = extend(chart.renderer.Element.prototype.crisp.apply({}, [ + borderWidth, + barX, + barY, + pointWidth, + barH + ]), { + r: options.borderRadius + }); + if (borderWidth % 2) { // correct for shorting in crisp method, visible in stacked columns with 1px border + shapeArgs.y -= 1; + shapeArgs.height += 1; + } + point.shapeArgs = shapeArgs; + + // make small columns responsive to mouse + point.trackerArgs = defined(trackerY) && merge(point.shapeArgs, { + height: mathMax(6, barH + 3), + y: trackerY + }); + }); + + }, + + getSymbol: function () { + }, + + /** + * Columns have no graph + */ + drawGraph: function () {}, + + /** + * Draw the columns. For bars, the series.group is rotated, so the same coordinates + * apply for columns and bars. This method is inherited by scatter series. + * + */ + drawPoints: function () { + var series = this, + options = series.options, + renderer = series.chart.renderer, + graphic, + shapeArgs; + + + // draw the columns + each(series.data, function (point) { + var plotY = point.plotY; + if (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) { + graphic = point.graphic; + shapeArgs = point.shapeArgs; + if (graphic) { // update + stop(graphic); + graphic.animate(shapeArgs); + + } else { + point.graphic = renderer[point.shapeType](shapeArgs) + .attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]) + .add(series.group) + .shadow(options.shadow); + } + + } + }); + }, + /** + * Draw the individual tracker elements. + * This method is inherited by scatter and pie charts too. + */ + drawTracker: function () { + var series = this, + chart = series.chart, + renderer = chart.renderer, + shapeArgs, + tracker, + trackerLabel = +new Date(), + options = series.options, + cursor = options.cursor, + css = cursor && { cursor: cursor }, + rel; + + each(series.data, function (point) { + tracker = point.tracker; + shapeArgs = point.trackerArgs || point.shapeArgs; + delete shapeArgs.strokeWidth; + if (point.y !== null) { + if (tracker) {// update + tracker.attr(shapeArgs); + + } else { + point.tracker = + renderer[point.shapeType](shapeArgs) + .attr({ + isTracker: trackerLabel, + fill: TRACKER_FILL, + visibility: series.visible ? VISIBLE : HIDDEN, + zIndex: options.zIndex || 1 + }) + .on(hasTouch ? 'touchstart' : 'mouseover', function (event) { + rel = event.relatedTarget || event.fromElement; + if (chart.hoverSeries !== series && attr(rel, 'isTracker') !== trackerLabel) { + series.onMouseOver(); + } + point.onMouseOver(); + + }) + .on('mouseout', function (event) { + if (!options.stickyTracking) { + rel = event.relatedTarget || event.toElement; + if (attr(rel, 'isTracker') !== trackerLabel) { + series.onMouseOut(); + } + } + }) + .css(css) + .add(point.group || chart.trackerGroup); // pies have point group - see issue #118 + } + } + }); + }, + + + /** + * Animate the column heights one by one from zero + * @param {Boolean} init Whether to initialize the animation or run it + */ + animate: function (init) { + var series = this, + data = series.data; + + if (!init) { // run the animation + /* + * Note: Ideally the animation should be initialized by calling + * series.group.hide(), and then calling series.group.show() + * after the animation was started. But this rendered the shadows + * invisible in IE8 standards mode. If the columns flicker on large + * datasets, this is the cause. + */ + + each(data, function (point) { + var graphic = point.graphic, + shapeArgs = point.shapeArgs; + + if (graphic) { + // start values + graphic.attr({ + height: 0, + y: series.yAxis.translate(0, 0, 1) + }); + + // animate + graphic.animate({ + height: shapeArgs.height, + y: shapeArgs.y + }, series.options.animation); + } + }); + + + // delete this function to allow it only once + series.animate = null; + } + + }, + /** + * Remove this series from the chart + */ + remove: function () { + var series = this, + chart = series.chart; + + // column and bar series affects other series of the same type + // as they are either stacked or grouped + if (chart.hasRendered) { + each(chart.series, function (otherSeries) { + if (otherSeries.type === series.type) { + otherSeries.isDirty = true; + } + }); + } + + Series.prototype.remove.apply(series, arguments); + } +}); +seriesTypes.column = ColumnSeries; + +var BarSeries = extendClass(ColumnSeries, { + type: 'bar', + init: function (chart) { + chart.inverted = this.inverted = true; + ColumnSeries.prototype.init.apply(this, arguments); + } +}); +seriesTypes.bar = BarSeries; + +/** + * The scatter series class + */ +var ScatterSeries = extendClass(Series, { + type: 'scatter', + + /** + * Extend the base Series' translate method by adding shape type and + * arguments for the point trackers + */ + translate: function () { + var series = this; + + Series.prototype.translate.apply(series); + + each(series.data, function (point) { + point.shapeType = 'circle'; + point.shapeArgs = { + x: point.plotX, + y: point.plotY, + r: series.chart.options.tooltip.snap + }; + }); + }, + + + /** + * Create individual tracker elements for each point + */ + //drawTracker: ColumnSeries.prototype.drawTracker, + drawTracker: function () { + var series = this, + cursor = series.options.cursor, + css = cursor && { cursor: cursor }, + graphic; + + each(series.data, function (point) { + graphic = point.graphic; + if (graphic) { // doesn't exist for null points + graphic + .attr({ isTracker: true }) + .on('mouseover', function () { + series.onMouseOver(); + point.onMouseOver(); + }) + .on('mouseout', function () { + if (!series.options.stickyTracking) { + series.onMouseOut(); + } + }) + .css(css); + } + }); + + }, + + /** + * Cleaning the data is not necessary in a scatter plot + */ + cleanData: function () {} +}); +seriesTypes.scatter = ScatterSeries; + +/** + * Extended point object for pies + */ +var PiePoint = extendClass(Point, { + /** + * Initiate the pie slice + */ + init: function () { + + Point.prototype.init.apply(this, arguments); + + var point = this, + toggleSlice; + + //visible: options.visible !== false, + extend(point, { + visible: point.visible !== false, + name: pick(point.name, 'Slice') + }); + + // add event listener for select + toggleSlice = function () { + point.slice(); + }; + addEvent(point, 'select', toggleSlice); + addEvent(point, 'unselect', toggleSlice); + + return point; + }, + + /** + * Toggle the visibility of the pie slice + * @param {Boolean} vis Whether to show the slice or not. If undefined, the + * visibility is toggled + */ + setVisible: function (vis) { + var point = this, + chart = point.series.chart, + tracker = point.tracker, + dataLabel = point.dataLabel, + connector = point.connector, + shadowGroup = point.shadowGroup, + method; + + // if called without an argument, toggle visibility + point.visible = vis = vis === UNDEFINED ? !point.visible : vis; + + method = vis ? 'show' : 'hide'; + + point.group[method](); + if (tracker) { + tracker[method](); + } + if (dataLabel) { + dataLabel[method](); + } + if (connector) { + connector[method](); + } + if (shadowGroup) { + shadowGroup[method](); + } + if (point.legendItem) { + chart.legend.colorizeItem(point, vis); + } + }, + + /** + * Set or toggle whether the slice is cut out from the pie + * @param {Boolean} sliced When undefined, the slice state is toggled + * @param {Boolean} redraw Whether to redraw the chart. True by default. + */ + slice: function (sliced, redraw, animation) { + var point = this, + series = point.series, + chart = series.chart, + slicedTranslation = point.slicedTranslation, + translation; + + setAnimation(animation, chart); + + // redraw is true by default + redraw = pick(redraw, true); + + // if called without an argument, toggle + sliced = point.sliced = defined(sliced) ? sliced : !point.sliced; + + translation = { + translateX: (sliced ? slicedTranslation[0] : chart.plotLeft), + translateY: (sliced ? slicedTranslation[1] : chart.plotTop) + }; + point.group.animate(translation); + if (point.shadowGroup) { + point.shadowGroup.animate(translation); + } + + } +}); + +/** + * The Pie series class + */ +var PieSeries = extendClass(Series, { + type: 'pie', + isCartesian: false, + pointClass: PiePoint, + pointAttrToOptions: { // mapping between SVG attributes and the corresponding options + stroke: 'borderColor', + 'stroke-width': 'borderWidth', + fill: 'color' + }, + + /** + * Pies have one color each point + */ + getColor: function () { + // record first color for use in setData + this.initialColor = this.chart.counters.color; + }, + + /** + * Animate the column heights one by one from zero + */ + animate: function () { + var series = this, + data = series.data; + + each(data, function (point) { + var graphic = point.graphic, + args = point.shapeArgs, + up = -mathPI / 2; + + if (graphic) { + // start values + graphic.attr({ + r: 0, + start: up, + end: up + }); + + // animate + graphic.animate({ + r: args.r, + start: args.start, + end: args.end + }, series.options.animation); + } + }); + + // delete this function to allow it only once + series.animate = null; + + }, + /** + * Do translation for pie slices + */ + translate: function () { + var total = 0, + series = this, + cumulative = -0.25, // start at top + precision = 1000, // issue #172 + options = series.options, + slicedOffset = options.slicedOffset, + connectorOffset = slicedOffset + options.borderWidth, + positions = options.center.concat([options.size, options.innerSize || 0]), + chart = series.chart, + plotWidth = chart.plotWidth, + plotHeight = chart.plotHeight, + start, + end, + angle, + data = series.data, + circ = 2 * mathPI, + fraction, + smallestSize = mathMin(plotWidth, plotHeight), + isPercent, + radiusX, // the x component of the radius vector for a given point + radiusY, + labelDistance = options.dataLabels.distance; + + // get positions - either an integer or a percentage string must be given + positions = map(positions, function (length, i) { + + isPercent = /%$/.test(length); + return isPercent ? + // i == 0: centerX, relative to width + // i == 1: centerY, relative to height + // i == 2: size, relative to smallestSize + // i == 4: innerSize, relative to smallestSize + [plotWidth, plotHeight, smallestSize, smallestSize][i] * + pInt(length) / 100 : + length; + }); + + // utility for getting the x value from a given y, used for anticollision logic in data labels + series.getX = function (y, left) { + + angle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance)); + + return positions[0] + + (left ? -1 : 1) * + (mathCos(angle) * (positions[2] / 2 + labelDistance)); + }; + + // set center for later use + series.center = positions; + + // get the total sum + each(data, function (point) { + total += point.y; + }); + + each(data, function (point) { + // set start and end angle + fraction = total ? point.y / total : 0; + start = mathRound(cumulative * circ * precision) / precision; + cumulative += fraction; + end = mathRound(cumulative * circ * precision) / precision; + + // set the shape + point.shapeType = 'arc'; + point.shapeArgs = { + x: positions[0], + y: positions[1], + r: positions[2] / 2, + innerR: positions[3] / 2, + start: start, + end: end + }; + + // center for the sliced out slice + angle = (end + start) / 2; + point.slicedTranslation = map([ + mathCos(angle) * slicedOffset + chart.plotLeft, + mathSin(angle) * slicedOffset + chart.plotTop + ], mathRound); + + // set the anchor point for tooltips + radiusX = mathCos(angle) * positions[2] / 2; + radiusY = mathSin(angle) * positions[2] / 2; + point.tooltipPos = [ + positions[0] + radiusX * 0.7, + positions[1] + radiusY * 0.7 + ]; + + // set the anchor point for data labels + point.labelPos = [ + positions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector + positions[1] + radiusY + mathSin(angle) * labelDistance, // a/a + positions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie + positions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a + positions[0] + radiusX, // landing point for connector + positions[1] + radiusY, // a/a + labelDistance < 0 ? // alignment + 'center' : + angle < circ / 4 ? 'left' : 'right', // alignment + angle // center angle + ]; + + // API properties + point.percentage = fraction * 100; + point.total = total; + + }); + + + this.setTooltipPoints(); + }, + + /** + * Render the slices + */ + render: function () { + var series = this; + + // cache attributes for shapes + //series.getAttribs(); + + this.drawPoints(); + + // draw the mouse tracking area + if (series.options.enableMouseTracking !== false) { + series.drawTracker(); + } + + this.drawDataLabels(); + + if (series.options.animation && series.animate) { + series.animate(); + } + + series.isDirty = false; // means data is in accordance with what you see + }, + + /** + * Draw the data points + */ + drawPoints: function () { + var series = this, + chart = series.chart, + renderer = chart.renderer, + groupTranslation, + //center, + graphic, + group, + shadow = series.options.shadow, + shadowGroup, + shapeArgs; + + + // draw the slices + each(series.data, function (point) { + graphic = point.graphic; + shapeArgs = point.shapeArgs; + group = point.group; + shadowGroup = point.shadowGroup; + + // put the shadow behind all points + if (shadow && !shadowGroup) { + shadowGroup = point.shadowGroup = renderer.g('shadow') + .attr({ zIndex: 4 }) + .add(); + } + + // create the group the first time + if (!group) { + group = point.group = renderer.g('point') + .attr({ zIndex: 5 }) + .add(); + } + + // if the point is sliced, use special translation, else use plot area traslation + groupTranslation = point.sliced ? point.slicedTranslation : [chart.plotLeft, chart.plotTop]; + group.translate(groupTranslation[0], groupTranslation[1]); + if (shadowGroup) { + shadowGroup.translate(groupTranslation[0], groupTranslation[1]); + } + + + // draw the slice + if (graphic) { + graphic.animate(shapeArgs); + } else { + point.graphic = + renderer.arc(shapeArgs) + .attr(extend( + point.pointAttr[NORMAL_STATE], + { 'stroke-linejoin': 'round' } + )) + .add(point.group) + .shadow(shadow, shadowGroup); + } + + // detect point specific visibility + if (point.visible === false) { + point.setVisible(false); + } + + }); + + }, + + /** + * Override the base drawDataLabels method by pie specific functionality + */ + drawDataLabels: function () { + var series = this, + data = series.data, + point, + chart = series.chart, + options = series.options.dataLabels, + connectorPadding = pick(options.connectorPadding, 10), + connectorWidth = pick(options.connectorWidth, 1), + connector, + connectorPath, + softConnector = pick(options.softConnector, true), + distanceOption = options.distance, + seriesCenter = series.center, + radius = seriesCenter[2] / 2, + centerY = seriesCenter[1], + outside = distanceOption > 0, + dataLabel, + labelPos, + labelHeight, + halves = [// divide the points into right and left halves for anti collision + [], // right + [] // left + ], + x, + y, + visibility, + rankArr, + sort, + i = 2, + j; + + // get out if not enabled + if (!options.enabled) { + return; + } + + // run parent method + Series.prototype.drawDataLabels.apply(series); + + // arrange points for detection collision + each(data, function (point) { + if (point.dataLabel) { // it may have been cancelled in the base method (#407) + halves[ + point.labelPos[7] < mathPI / 2 ? 0 : 1 + ].push(point); + } + }); + halves[1].reverse(); + + // define the sorting algorithm + sort = function (a, b) { + return b.y - a.y; + }; + + // assume equal label heights + labelHeight = halves[0][0] && halves[0][0].dataLabel && pInt(halves[0][0].dataLabel.styles.lineHeight); + + /* Loop over the points in each quartile, starting from the top and bottom + * of the pie to detect overlapping labels. + */ + while (i--) { + + var slots = [], + slotsLength, + usedSlots = [], + points = halves[i], + pos, + length = points.length, + slotIndex; + + + // build the slots + for (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) { + slots.push(pos); + // visualize the slot + /* + var slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0), + slotY = pos + chart.plotTop; + if (!isNaN(slotX)) { + chart.renderer.rect(slotX, slotY - 7, 100, labelHeight) + .attr({ + 'stroke-width': 1, + stroke: 'silver' + }) + .add(); + chart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4) + .attr({ + fill: 'silver' + }).add(); + } + // */ + } + slotsLength = slots.length; + + // if there are more values than available slots, remove lowest values + if (length > slotsLength) { + // create an array for sorting and ranking the points within each quarter + rankArr = [].concat(points); + rankArr.sort(sort); + j = length; + while (j--) { + rankArr[j].rank = j; + } + j = length; + while (j--) { + if (points[j].rank >= slotsLength) { + points.splice(j, 1); + } + } + length = points.length; + } + + // The label goes to the nearest open slot, but not closer to the edge than + // the label's index. + for (j = 0; j < length; j++) { + + point = points[j]; + labelPos = point.labelPos; + + var closest = 9999, + distance, + slotI; + + // find the closest slot index + for (slotI = 0; slotI < slotsLength; slotI++) { + distance = mathAbs(slots[slotI] - labelPos[1]); + if (distance < closest) { + closest = distance; + slotIndex = slotI; + } + } + + // if that slot index is closer to the edges of the slots, move it + // to the closest appropriate slot + if (slotIndex < j && slots[j] !== null) { // cluster at the top + slotIndex = j; + } else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom + slotIndex = slotsLength - length + j; + while (slots[slotIndex] === null) { // make sure it is not taken + slotIndex++; + } + } else { + // Slot is taken, find next free slot below. In the next run, the next slice will find the + // slot above these, because it is the closest one + while (slots[slotIndex] === null) { // make sure it is not taken + slotIndex++; + } + } + + usedSlots.push({ i: slotIndex, y: slots[slotIndex] }); + slots[slotIndex] = null; // mark as taken + } + // sort them in order to fill in from the top + usedSlots.sort(sort); + + + // now the used slots are sorted, fill them up sequentially + for (j = 0; j < length; j++) { + + point = points[j]; + labelPos = point.labelPos; + dataLabel = point.dataLabel; + var slot = usedSlots.pop(), + naturalY = labelPos[1]; + + visibility = point.visible === false ? HIDDEN : VISIBLE; + slotIndex = slot.i; + + // if the slot next to currrent slot is free, the y value is allowed + // to fall back to the natural position + y = slot.y; + if ((naturalY > y && slots[slotIndex + 1] !== null) || + (naturalY < y && slots[slotIndex - 1] !== null)) { + y = naturalY; + } + + // get the x - use the natural x position for first and last slot, to prevent the top + // and botton slice connectors from touching each other on either side + x = series.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i); + + // move or place the data label + dataLabel + .attr({ + visibility: visibility, + align: labelPos[6] + })[dataLabel.moved ? 'animate' : 'attr']({ + x: x + options.x + + ({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0), + y: y + options.y + }); + dataLabel.moved = true; + + // draw the connector + if (outside && connectorWidth) { + connector = point.connector; + + connectorPath = softConnector ? [ + M, + x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label + 'C', + x, y, // first break, next to the label + 2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5], + labelPos[2], labelPos[3], // second break + L, + labelPos[4], labelPos[5] // base + ] : [ + M, + x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label + L, + labelPos[2], labelPos[3], // second break + L, + labelPos[4], labelPos[5] // base + ]; + + if (connector) { + connector.animate({ d: connectorPath }); + connector.attr('visibility', visibility); + + } else { + point.connector = connector = series.chart.renderer.path(connectorPath).attr({ + 'stroke-width': connectorWidth, + stroke: options.connectorColor || point.color || '#606060', + visibility: visibility, + zIndex: 3 + }) + .translate(chart.plotLeft, chart.plotTop) + .add(); + } + } + } + } + }, + + /** + * Draw point specific tracker objects. Inherit directly from column series. + */ + drawTracker: ColumnSeries.prototype.drawTracker, + + /** + * Pies don't have point marker symbols + */ + getSymbol: function () {} + +}); +seriesTypes.pie = PieSeries; + + +// global variables +win.Highcharts = { + Chart: Chart, + dateFormat: dateFormat, + pathAnim: pathAnim, + getOptions: getOptions, + hasRtlBug: hasRtlBug, + numberFormat: numberFormat, + Point: Point, + Color: Color, + Renderer: Renderer, + seriesTypes: seriesTypes, + setOptions: setOptions, + Series: Series, + + // Expose utility funcitons for modules + addEvent: addEvent, + removeEvent: removeEvent, + createElement: createElement, + discardElement: discardElement, + css: css, + each: each, + extend: extend, + map: map, + merge: merge, + pick: pick, + extendClass: extendClass, + product: 'Highcharts', + version: '2.1.9' +}; +}()); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.js b/java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.js new file mode 100644 index 00000000000..76d3efb5d87 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/modules/exporting.js @@ -0,0 +1,24 @@ +/* + Highcharts JS v2.1.9 (2011-11-11) + Exporting module + + (c) 2010-2011 Torstein H?nsi + + License: www.highcharts.com/license +*/ +(function(){var n=Highcharts,A=n.Chart,B=n.addEvent,E=n.removeEvent,t=n.createElement,w=n.discardElement,u=n.css,x=n.merge,q=n.each,r=n.extend,F=Math.max,s=document,G=window,C=s.documentElement.ontouchstart!==undefined,y=n.getOptions();r(y.lang,{downloadPNG:"Download PNG image",downloadJPEG:"Download JPEG image",downloadPDF:"Download PDF document",downloadSVG:"Download SVG vector image",exportButtonTitle:"Export to raster or vector image",printButtonTitle:"Print the chart"});y.navigation={menuStyle:{border:"1px solid #A0A0A0", +background:"#FFFFFF"},menuItemStyle:{padding:"0 5px",background:"none",color:"#303030",fontSize:C?"14px":"11px"},menuItemHoverStyle:{background:"#4572A5",color:"#FFFFFF"},buttonOptions:{align:"right",backgroundColor:{linearGradient:[0,0,0,20],stops:[[0.4,"#F7F7F7"],[0.6,"#E3E3E3"]]},borderColor:"#B0B0B0",borderRadius:3,borderWidth:1,height:20,hoverBorderColor:"#909090",hoverSymbolFill:"#81A7CF",hoverSymbolStroke:"#4572A5",symbolFill:"#E0E0E0",symbolStroke:"#A0A0A0",symbolX:11.5,symbolY:10.5,verticalAlign:"top", +width:24,y:10}};y.exporting={type:"image/png",url:"http://export.highcharts.com/",width:800,enableImages:false,buttons:{exportButton:{symbol:"exportIcon",x:-10,symbolFill:"#A8BF77",hoverSymbolFill:"#768F3E",_id:"exportButton",_titleKey:"exportButtonTitle",menuItems:[{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"})}}]},printButton:{symbol:"printIcon",x:-36,symbolFill:"#B5C9DF",hoverSymbolFill:"#779ABF",_id:"printButton",_titleKey:"printButtonTitle",onclick:function(){this.print()}}}};r(A.prototype,{getSVG:function(b){var c=this,a,f,d,k,e,j,h=x(c.options,b);if(!s.createElementNS)s.createElementNS=function(i,g){var o=s.createElement(g);o.getBBox=function(){return n.Renderer.prototype.Element.prototype.getBBox.apply({element:o})};return o};b=t("div",null, +{position:"absolute",top:"-9999em",width:c.chartWidth+"px",height:c.chartHeight+"px"},s.body);r(h.chart,{renderTo:b,forExport:true});h.exporting.enabled=false;if(!h.exporting.enableImages)h.chart.plotBackgroundImage=null;h.series=[];q(c.series,function(i){d=i.options;d.animation=false;d.showCheckbox=false;d.visible=i.visible;if(!h.exporting.enableImages)if(d&&d.marker&&/^url\(/.test(d.marker.symbol))d.marker.symbol="circle";d.data=[];q(i.data,function(g){k=g.config;e={x:g.x,y:g.y,name:g.name};typeof k=== +"object"&&g.config&&k.constructor!==Array&&r(e,k);e.visible=g.visible;d.data.push(e);if(!h.exporting.enableImages)(j=g.config&&g.config.marker)&&/^url\(/.test(j.symbol)&&delete j.symbol});h.series.push(d)});a=new Highcharts.Chart(h);q(["xAxis","yAxis"],function(i){q(c[i],function(g,o){var l=a[i][o],m=g.getExtremes(),p=m.userMin;m=m.userMax;if(p!==void 0||m!==void 0)l.setExtremes(p,m,true,false)})});f=a.container.innerHTML;h=null;a.destroy();w(b);f=f.replace(/zIndex="[^"]+"/g,"").replace(/isShadow="[^"]+"/g, +"").replace(/symbolName="[^"]+"/g,"").replace(/jQuery[0-9]+="[^"]+"/g,"").replace(/isTracker="[^"]+"/g,"").replace(/url\([^#]+#/g,"url(#").replace(/]+)/g,'id="$1"').replace(/class=([^" ]+)/g,'class="$1"').replace(/ transform /g," ").replace(/:(path|rect)/g,"$1").replace(/]*)>/gi,"").replace(/<\/image>/g,"").replace(/]*)([^\/])>/gi, +"").replace(/width=(\d+)/g,'width="$1"').replace(/height=(\d+)/g,'height="$1"').replace(/hc-svg-href="/g,'xlink:href="').replace(/style="([^"]+)"/g,function(i){return i.toLowerCase()});f=f.replace(/(url\(#highcharts-[0-9]+)"/g,"$1").replace(/"/g,"'");if(f.match(/ xmlns="/g).length===2)f=f.replace(/xmlns="[^"]+"/,"");return f},exportChart:function(b,c){var a,f=this.getSVG(c);b=x(this.options.exporting,b);a=t("form",{method:"post",action:b.url},{display:"none"},s.body);q(["filename", +"type","width","svg"],function(d){t("input",{type:"hidden",name:d,value:{filename:b.filename||"chart",type:b.type,width:b.width,svg:f}[d]},null,a)});a.submit();w(a)},print:function(){var b=this,c=b.container,a=[],f=c.parentNode,d=s.body,k=d.childNodes;if(!b.isPrinting){b.isPrinting=true;q(k,function(e,j){if(e.nodeType===1){a[j]=e.style.display;e.style.display="none"}});d.appendChild(c);G.print();setTimeout(function(){f.appendChild(c);q(k,function(e,j){if(e.nodeType===1)e.style.display=a[j]});b.isPrinting= +false},1E3)}},contextMenu:function(b,c,a,f,d,k){var e=this,j=e.options.navigation,h=j.menuItemStyle,i=e.chartWidth,g=e.chartHeight,o="cache-"+b,l=e[o],m=F(d,k),p,z;if(!l){e[o]=l=t("div",{className:"highcharts-"+b},{position:"absolute",zIndex:1E3,padding:m+"px"},e.container);p=t("div",null,r({MozBoxShadow:"3px 3px 10px #888",WebkitBoxShadow:"3px 3px 10px #888",boxShadow:"3px 3px 10px #888"},j.menuStyle),l);z=function(){u(l,{display:"none"})};B(l,"mouseleave",z);q(c,function(v){if(v){var D=t("div", +{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,h)},innerHTML:v.text||e.options.lang[v.textKey]},r({cursor:"pointer"},h),p);D[C?"ontouchstart":"onclick"]=function(){z();v.onclick.apply(e,arguments)};e.exportDivElements.push(D)}});e.exportDivElements.push(p,l);e.exportMenuWidth=l.offsetWidth;e.exportMenuHeight=l.offsetHeight}b={display:"block"};if(a+e.exportMenuWidth>i)b.right=i-a-d-m+"px";else b.left=a-m+"px";if(f+k+e.exportMenuHeight>g)b.bottom=g-f-m+"px";else b.top= +f+k-m+"px";u(l,b)},addButton:function(b){function c(){g.attr(m);i.attr(l)}var a=this,f=a.renderer,d=x(a.options.navigation.buttonOptions,b),k=d.onclick,e=d.menuItems,j=d.width,h=d.height,i,g,o;b=d.borderWidth;var l={stroke:d.borderColor},m={stroke:d.symbolStroke,fill:d.symbolFill};if(!a.exportDivElements){a.exportDivElements=[];a.exportSVGElements=[]}if(d.enabled!==false){i=f.rect(0,0,j,h,d.borderRadius,b).align(d,true).attr(r({fill:d.backgroundColor,"stroke-width":b,zIndex:19},l)).add();o=f.rect(0, +0,j,h,0).align(d).attr({id:d._id,fill:"rgba(255, 255, 255, 0.001)",title:a.options.lang[d._titleKey],zIndex:21}).css({cursor:"pointer"}).on("mouseover",function(){g.attr({stroke:d.hoverSymbolStroke,fill:d.hoverSymbolFill});i.attr({stroke:d.hoverBorderColor})}).on("mouseout",c).on("click",c).add();if(e)k=function(){c();var p=o.getBBox();a.contextMenu("export-menu",e,p.x,p.y,j,h)};o.on("click",function(){k.apply(a,arguments)});g=f.symbol(d.symbol,d.symbolX,d.symbolY,(d.symbolSize||12)/2).align(d,true).attr(r(m, +{"stroke-width":d.symbolStrokeWidth||1,zIndex:20})).add();a.exportSVGElements.push(i,o,g)}},destroyExport:function(){var b,c;for(b=0;b

'+ svg +'
'; + } + }*/] + + }, + printButton: { + //enabled: true, + symbol: 'printIcon', + x: -36, + symbolFill: '#B5C9DF', + hoverSymbolFill: '#779ABF', + _id: 'printButton', + _titleKey: 'printButtonTitle', + onclick: function () { + this.print(); + } + } + } +}; + + + +extend(Chart.prototype, { + /** + * Return an SVG representation of the chart + * + * @param additionalOptions {Object} Additional chart options for the generated SVG representation + */ + getSVG: function (additionalOptions) { + var chart = this, + chartCopy, + sandbox, + svg, + seriesOptions, + config, + pointOptions, + pointMarker, + options = merge(chart.options, additionalOptions); // copy the options and add extra options + + // IE compatibility hack for generating SVG content that it doesn't really understand + if (!doc.createElementNS) { + /*jslint unparam: true*//* allow unused parameter ns in function below */ + doc.createElementNS = function (ns, tagName) { + var elem = doc.createElement(tagName); + elem.getBBox = function () { + return HC.Renderer.prototype.Element.prototype.getBBox.apply({ element: elem }); + }; + return elem; + }; + /*jslint unparam: false*/ + } + + // create a sandbox where a new chart will be generated + sandbox = createElement(DIV, null, { + position: ABSOLUTE, + top: '-9999em', + width: chart.chartWidth + PX, + height: chart.chartHeight + PX + }, doc.body); + + // override some options + extend(options.chart, { + renderTo: sandbox, + forExport: true + }); + options.exporting.enabled = false; // hide buttons in print + + if (!options.exporting.enableImages) { + options.chart.plotBackgroundImage = null; // the converter doesn't handle images + } + + // prepare for replicating the chart + options.series = []; + each(chart.series, function (serie) { + seriesOptions = serie.options; + + seriesOptions.animation = false; // turn off animation + seriesOptions.showCheckbox = false; + seriesOptions.visible = serie.visible; + + if (!options.exporting.enableImages) { + // remove image markers + if (seriesOptions && seriesOptions.marker && /^url\(/.test(seriesOptions.marker.symbol)) { + seriesOptions.marker.symbol = 'circle'; + } + } + + seriesOptions.data = []; + + each(serie.data, function (point) { + + // extend the options by those values that can be expressed in a number or array config + config = point.config; + pointOptions = { + x: point.x, + y: point.y, + name: point.name + }; + + if (typeof config === 'object' && point.config && config.constructor !== Array) { + extend(pointOptions, config); + } + + pointOptions.visible = point.visible; + seriesOptions.data.push(pointOptions); // copy fresh updated data + + if (!options.exporting.enableImages) { + // remove image markers + pointMarker = point.config && point.config.marker; + if (pointMarker && /^url\(/.test(pointMarker.symbol)) { + delete pointMarker.symbol; + } + } + }); + + options.series.push(seriesOptions); + }); + + // generate the chart copy + chartCopy = new Highcharts.Chart(options); + + // reflect axis extremes in the export + each(['xAxis', 'yAxis'], function (axisType) { + each(chart[axisType], function (axis, i) { + var axisCopy = chartCopy[axisType][i], + extremes = axis.getExtremes(), + userMin = extremes.userMin, + userMax = extremes.userMax; + + if (userMin !== UNDEFINED || userMax !== UNDEFINED) { + axisCopy.setExtremes(userMin, userMax, true, false); + } + }); + }); + + // get the SVG from the container's innerHTML + svg = chartCopy.container.innerHTML; + + // free up memory + options = null; + chartCopy.destroy(); + discardElement(sandbox); + + // sanitize + svg = svg + .replace(/zIndex="[^"]+"/g, '') + .replace(/isShadow="[^"]+"/g, '') + .replace(/symbolName="[^"]+"/g, '') + .replace(/jQuery[0-9]+="[^"]+"/g, '') + .replace(/isTracker="[^"]+"/g, '') + .replace(/url\([^#]+#/g, 'url(#') + .replace(/')*/ + /* This fails in IE < 8 + .replace(/([0-9]+)\.([0-9]+)/g, function(s1, s2, s3) { // round off to save weight + return s2 +'.'+ s3[0]; + })*/ + + // Replace HTML entities, issue #347 + .replace(/ /g, '\u00A0') // no-break space + .replace(/­/g, '\u00AD') // soft hyphen + + // IE specific + .replace(/id=([^" >]+)/g, 'id="$1"') + .replace(/class=([^" ]+)/g, 'class="$1"') + .replace(/ transform /g, ' ') + .replace(/:(path|rect)/g, '$1') + .replace(/]*)>/gi, '') + .replace(/<\/image>/g, '') // remove closing tags for images as they'll never have any content + .replace(/]*)([^\/])>/gi, '') // closes image tags for firefox + .replace(/width=(\d+)/g, 'width="$1"') + .replace(/height=(\d+)/g, 'height="$1"') + .replace(/hc-svg-href="/g, 'xlink:href="') + .replace(/style="([^"]+)"/g, function (s) { + return s.toLowerCase(); + }); + + // IE9 beta bugs with innerHTML. Test again with final IE9. + svg = svg.replace(/(url\(#highcharts-[0-9]+)"/g, '$1') + .replace(/"/g, "'"); + if (svg.match(/ xmlns="/g).length === 2) { + svg = svg.replace(/xmlns="[^"]+"/, ''); + } + + return svg; + }, + + /** + * Submit the SVG representation of the chart to the server + * @param {Object} options Exporting options. Possible members are url, type and width. + * @param {Object} chartOptions Additional chart options for the SVG representation of the chart + */ + exportChart: function (options, chartOptions) { + var form, + chart = this, + svg = chart.getSVG(chartOptions); + + // merge the options + options = merge(chart.options.exporting, options); + + // create the form + form = createElement('form', { + method: 'post', + action: options.url + }, { + display: NONE + }, doc.body); + + // add the values + each(['filename', 'type', 'width', 'svg'], function (name) { + createElement('input', { + type: HIDDEN, + name: name, + value: { + filename: options.filename || 'chart', + type: options.type, + width: options.width, + svg: svg + }[name] + }, null, form); + }); + + // submit + form.submit(); + + // clean up + discardElement(form); + }, + + /** + * Print the chart + */ + print: function () { + + var chart = this, + container = chart.container, + origDisplay = [], + origParent = container.parentNode, + body = doc.body, + childNodes = body.childNodes; + + if (chart.isPrinting) { // block the button while in printing mode + return; + } + + chart.isPrinting = true; + + // hide all body content + each(childNodes, function (node, i) { + if (node.nodeType === 1) { + origDisplay[i] = node.style.display; + node.style.display = NONE; + } + }); + + // pull out the chart + body.appendChild(container); + + // print + win.print(); + + // allow the browser to prepare before reverting + setTimeout(function () { + + // put the chart back in + origParent.appendChild(container); + + // restore all body content + each(childNodes, function (node, i) { + if (node.nodeType === 1) { + node.style.display = origDisplay[i]; + } + }); + + chart.isPrinting = false; + + }, 1000); + + }, + + /** + * Display a popup menu for choosing the export type + * + * @param {String} name An identifier for the menu + * @param {Array} items A collection with text and onclicks for the items + * @param {Number} x The x position of the opener button + * @param {Number} y The y position of the opener button + * @param {Number} width The width of the opener button + * @param {Number} height The height of the opener button + */ + contextMenu: function (name, items, x, y, width, height) { + var chart = this, + navOptions = chart.options.navigation, + menuItemStyle = navOptions.menuItemStyle, + chartWidth = chart.chartWidth, + chartHeight = chart.chartHeight, + cacheName = 'cache-' + name, + menu = chart[cacheName], + menuPadding = mathMax(width, height), // for mouse leave detection + boxShadow = '3px 3px 10px #888', + innerMenu, + hide, + menuStyle; + + // create the menu only the first time + if (!menu) { + + // create a HTML element above the SVG + chart[cacheName] = menu = createElement(DIV, { + className: PREFIX + name + }, { + position: ABSOLUTE, + zIndex: 1000, + padding: menuPadding + PX + }, chart.container); + + innerMenu = createElement(DIV, null, + extend({ + MozBoxShadow: boxShadow, + WebkitBoxShadow: boxShadow, + boxShadow: boxShadow + }, navOptions.menuStyle), menu); + + // hide on mouse out + hide = function () { + css(menu, { display: NONE }); + }; + + addEvent(menu, 'mouseleave', hide); + + + // create the items + each(items, function (item) { + if (item) { + var div = createElement(DIV, { + onmouseover: function () { + css(this, navOptions.menuItemHoverStyle); + }, + onmouseout: function () { + css(this, menuItemStyle); + }, + innerHTML: item.text || chart.options.lang[item.textKey] + }, extend({ + cursor: 'pointer' + }, menuItemStyle), innerMenu); + + div[hasTouch ? 'ontouchstart' : 'onclick'] = function () { + hide(); + item.onclick.apply(chart, arguments); + }; + + // Keep references to menu divs to be able to destroy them + chart.exportDivElements.push(div); + } + }); + + // Keep references to menu and innerMenu div to be able to destroy them + chart.exportDivElements.push(innerMenu, menu); + + chart.exportMenuWidth = menu.offsetWidth; + chart.exportMenuHeight = menu.offsetHeight; + } + + menuStyle = { display: 'block' }; + + // if outside right, right align it + if (x + chart.exportMenuWidth > chartWidth) { + menuStyle.right = (chartWidth - x - width - menuPadding) + PX; + } else { + menuStyle.left = (x - menuPadding) + PX; + } + // if outside bottom, bottom align it + if (y + height + chart.exportMenuHeight > chartHeight) { + menuStyle.bottom = (chartHeight - y - menuPadding) + PX; + } else { + menuStyle.top = (y + height - menuPadding) + PX; + } + + css(menu, menuStyle); + }, + + /** + * Add the export button to the chart + */ + addButton: function (options) { + var chart = this, + renderer = chart.renderer, + btnOptions = merge(chart.options.navigation.buttonOptions, options), + onclick = btnOptions.onclick, + menuItems = btnOptions.menuItems, + /*position = chart.getAlignment(btnOptions), + buttonLeft = position.x, + buttonTop = position.y,*/ + buttonWidth = btnOptions.width, + buttonHeight = btnOptions.height, + box, + symbol, + button, + borderWidth = btnOptions.borderWidth, + boxAttr = { + stroke: btnOptions.borderColor + + }, + symbolAttr = { + stroke: btnOptions.symbolStroke, + fill: btnOptions.symbolFill + }; + + // Keeps references to the button elements + if (!chart.exportDivElements) { + chart.exportDivElements = []; + chart.exportSVGElements = []; + } + + if (btnOptions.enabled === false) { + return; + } + + // element to capture the click + function revert() { + symbol.attr(symbolAttr); + box.attr(boxAttr); + } + + // the box border + box = renderer.rect( + 0, + 0, + buttonWidth, + buttonHeight, + btnOptions.borderRadius, + borderWidth + ) + //.translate(buttonLeft, buttonTop) // to allow gradients + .align(btnOptions, true) + .attr(extend({ + fill: btnOptions.backgroundColor, + 'stroke-width': borderWidth, + zIndex: 19 + }, boxAttr)).add(); + + // the invisible element to track the clicks + button = renderer.rect( + 0, + 0, + buttonWidth, + buttonHeight, + 0 + ) + .align(btnOptions) + .attr({ + id: btnOptions._id, + fill: 'rgba(255, 255, 255, 0.001)', + title: chart.options.lang[btnOptions._titleKey], + zIndex: 21 + }).css({ + cursor: 'pointer' + }) + .on('mouseover', function () { + symbol.attr({ + stroke: btnOptions.hoverSymbolStroke, + fill: btnOptions.hoverSymbolFill + }); + box.attr({ + stroke: btnOptions.hoverBorderColor + }); + }) + .on('mouseout', revert) + .on('click', revert) + .add(); + + //addEvent(button.element, 'click', revert); + + // add the click event + if (menuItems) { + onclick = function () { + revert(); + var bBox = button.getBBox(); + chart.contextMenu('export-menu', menuItems, bBox.x, bBox.y, buttonWidth, buttonHeight); + }; + } + /*addEvent(button.element, 'click', function() { + onclick.apply(chart, arguments); + });*/ + button.on('click', function () { + onclick.apply(chart, arguments); + }); + + // the icon + symbol = renderer.symbol( + btnOptions.symbol, + btnOptions.symbolX, + btnOptions.symbolY, + (btnOptions.symbolSize || 12) / 2 + ) + .align(btnOptions, true) + .attr(extend(symbolAttr, { + 'stroke-width': btnOptions.symbolStrokeWidth || 1, + zIndex: 20 + })).add(); + + // Keep references to the renderer element so to be able to destroy them later. + chart.exportSVGElements.push(box, button, symbol); + }, + + /** + * Destroy the buttons. + */ + destroyExport: function () { + var i, + chart = this, + elem; + + // Destroy the extra buttons added + for (i = 0; i < chart.exportSVGElements.length; i++) { + elem = chart.exportSVGElements[i]; + // Destroy and null the svg/vml elements + elem.onclick = elem.ontouchstart = null; + chart.exportSVGElements[i] = elem.destroy(); + } + + // Destroy the divs for the menu + for (i = 0; i < chart.exportDivElements.length; i++) { + elem = chart.exportDivElements[i]; + + // Remove the event handler + removeEvent(elem, 'mouseleave'); + + // Remove inline events + chart.exportDivElements[i] = elem.onmouseout = elem.onmouseover = elem.ontouchstart = elem.onclick = null; + + // Destroy the div by moving to garbage bin + discardElement(elem); + } + } +}); + +// Create the export icon +HC.Renderer.prototype.symbols.exportIcon = function (x, y, radius) { + return [ + M, // the disk + x - radius, y + radius, + L, + x + radius, y + radius, + x + radius, y + radius * 0.5, + x - radius, y + radius * 0.5, + 'Z', + M, // the arrow + x, y + radius * 0.5, + L, + x - radius * 0.5, y - radius / 3, + x - radius / 6, y - radius / 3, + x - radius / 6, y - radius, + x + radius / 6, y - radius, + x + radius / 6, y - radius / 3, + x + radius * 0.5, y - radius / 3, + 'Z' + ]; +}; +// Create the print icon +HC.Renderer.prototype.symbols.printIcon = function (x, y, radius) { + return [ + M, // the printer + x - radius, y + radius * 0.5, + L, + x + radius, y + radius * 0.5, + x + radius, y - radius / 3, + x - radius, y - radius / 3, + 'Z', + M, // the upper sheet + x - radius * 0.5, y - radius / 3, + L, + x - radius * 0.5, y - radius, + x + radius * 0.5, y - radius, + x + radius * 0.5, y - radius / 3, + 'Z', + M, // the lower sheet + x - radius * 0.5, y + radius * 0.5, + L, + x - radius * 0.75, y + radius, + x + radius * 0.75, y + radius, + x + radius * 0.5, y + radius * 0.5, + 'Z' + ]; +}; + + +// Add the buttons on chart load +Chart.prototype.callbacks.push(function (chart) { + var n, + exportingOptions = chart.options.exporting, + buttons = exportingOptions.buttons; + + if (exportingOptions.enabled !== false) { + + for (n in buttons) { + chart.addButton(buttons[n]); + } + + // Destroy the export elements at chart destroy + addEvent(chart, 'destroy', chart.destroyExport); + } + +}); + + +}()); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-blue.js b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-blue.js new file mode 100644 index 00000000000..188f3d97a03 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-blue.js @@ -0,0 +1,263 @@ +/** + * Dark blue theme for Highcharts JS + * @author Torstein Hønsi + */ + +Highcharts.theme = { + colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", + "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], + chart: { + backgroundColor: { + linearGradient: [0, 0, 250, 500], + stops: [ + [0, 'rgb(48, 48, 96)'], + [1, 'rgb(0, 0, 0)'] + ] + }, + borderColor: '#000000', + borderWidth: 2, + className: 'dark-container', + plotBackgroundColor: 'rgba(255, 255, 255, .1)', + plotBorderColor: '#CCCCCC', + plotBorderWidth: 1 + }, + title: { + style: { + color: '#C0C0C0', + font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' + } + }, + subtitle: { + style: { + color: '#666666', + font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' + } + }, + xAxis: { + gridLineColor: '#333333', + gridLineWidth: 1, + labels: { + style: { + color: '#A0A0A0' + } + }, + lineColor: '#A0A0A0', + tickColor: '#A0A0A0', + title: { + style: { + color: '#CCC', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + + } + } + }, + yAxis: { + gridLineColor: '#333333', + labels: { + style: { + color: '#A0A0A0' + } + }, + lineColor: '#A0A0A0', + minorTickInterval: null, + tickColor: '#A0A0A0', + tickWidth: 1, + title: { + style: { + color: '#CCC', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + } + } + }, + tooltip: { + backgroundColor: 'rgba(0, 0, 0, 0.75)', + style: { + color: '#F0F0F0' + } + }, + toolbar: { + itemStyle: { + color: 'silver' + } + }, + plotOptions: { + line: { + dataLabels: { + color: '#CCC' + }, + marker: { + lineColor: '#333' + } + }, + spline: { + marker: { + lineColor: '#333' + } + }, + scatter: { + marker: { + lineColor: '#333' + } + }, + candlestick: { + lineColor: 'white' + } + }, + legend: { + itemStyle: { + font: '9pt Trebuchet MS, Verdana, sans-serif', + color: '#A0A0A0' + }, + itemHoverStyle: { + color: '#FFF' + }, + itemHiddenStyle: { + color: '#444' + } + }, + credits: { + style: { + color: '#666' + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + navigation: { + buttonOptions: { + backgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#606060'], + [0.6, '#333333'] + ] + }, + borderColor: '#000000', + symbolStroke: '#C0C0C0', + hoverSymbolStroke: '#FFFFFF' + } + }, + + exporting: { + buttons: { + exportButton: { + symbolFill: '#55BE3B' + }, + printButton: { + symbolFill: '#7797BE' + } + } + }, + + // scroll charts + rangeSelector: { + buttonTheme: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + stroke: '#000000', + style: { + color: '#CCC', + fontWeight: 'bold' + }, + states: { + hover: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#BBB'], + [0.6, '#888'] + ] + }, + stroke: '#000000', + style: { + color: 'white' + } + }, + select: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.1, '#000'], + [0.3, '#333'] + ] + }, + stroke: '#000000', + style: { + color: 'yellow' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: 'silver' + } + }, + + navigator: { + handles: { + backgroundColor: '#666', + borderColor: '#AAA' + }, + outlineColor: '#CCC', + maskFill: 'rgba(16, 16, 16, 0.5)', + series: { + color: '#7798BF', + lineColor: '#A6C7ED' + } + }, + + scrollbar: { + barBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + barBorderColor: '#CCC', + buttonArrowColor: '#CCC', + buttonBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + buttonBorderColor: '#CCC', + rifleColor: '#FFF', + trackBackgroundColor: { + linearGradient: [0, 0, 0, 10], + stops: [ + [0, '#000'], + [1, '#333'] + ] + }, + trackBorderColor: '#666' + }, + + // special colors for some of the + legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', + legendBackgroundColorSolid: 'rgb(35, 35, 70)', + dataLabelsColor: '#444', + textColor: '#C0C0C0', + maskColor: 'rgba(255,255,255,0.3)' +}; + +// Apply the theme +var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-green.js b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-green.js new file mode 100644 index 00000000000..af67f4bd48c --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/dark-green.js @@ -0,0 +1,263 @@ +/** + * Dark blue theme for Highcharts JS + * @author Torstein Hønsi + */ + +Highcharts.theme = { + colors: ["#DDDF0D", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", + "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], + chart: { + backgroundColor: { + linearGradient: [0, 0, 250, 500], + stops: [ + [0, 'rgb(48, 96, 48)'], + [1, 'rgb(0, 0, 0)'] + ] + }, + borderColor: '#000000', + borderWidth: 2, + className: 'dark-container', + plotBackgroundColor: 'rgba(255, 255, 255, .1)', + plotBorderColor: '#CCCCCC', + plotBorderWidth: 1 + }, + title: { + style: { + color: '#C0C0C0', + font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' + } + }, + subtitle: { + style: { + color: '#666666', + font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' + } + }, + xAxis: { + gridLineColor: '#333333', + gridLineWidth: 1, + labels: { + style: { + color: '#A0A0A0' + } + }, + lineColor: '#A0A0A0', + tickColor: '#A0A0A0', + title: { + style: { + color: '#CCC', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + + } + } + }, + yAxis: { + gridLineColor: '#333333', + labels: { + style: { + color: '#A0A0A0' + } + }, + lineColor: '#A0A0A0', + minorTickInterval: null, + tickColor: '#A0A0A0', + tickWidth: 1, + title: { + style: { + color: '#CCC', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + } + } + }, + tooltip: { + backgroundColor: 'rgba(0, 0, 0, 0.75)', + style: { + color: '#F0F0F0' + } + }, + toolbar: { + itemStyle: { + color: 'silver' + } + }, + plotOptions: { + line: { + dataLabels: { + color: '#CCC' + }, + marker: { + lineColor: '#333' + } + }, + spline: { + marker: { + lineColor: '#333' + } + }, + scatter: { + marker: { + lineColor: '#333' + } + }, + candlestick: { + lineColor: 'white' + } + }, + legend: { + itemStyle: { + font: '9pt Trebuchet MS, Verdana, sans-serif', + color: '#A0A0A0' + }, + itemHoverStyle: { + color: '#FFF' + }, + itemHiddenStyle: { + color: '#444' + } + }, + credits: { + style: { + color: '#666' + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + navigation: { + buttonOptions: { + backgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#606060'], + [0.6, '#333333'] + ] + }, + borderColor: '#000000', + symbolStroke: '#C0C0C0', + hoverSymbolStroke: '#FFFFFF' + } + }, + + exporting: { + buttons: { + exportButton: { + symbolFill: '#55BE3B' + }, + printButton: { + symbolFill: '#7797BE' + } + } + }, + + // scroll charts + rangeSelector: { + buttonTheme: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + stroke: '#000000', + style: { + color: '#CCC', + fontWeight: 'bold' + }, + states: { + hover: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#BBB'], + [0.6, '#888'] + ] + }, + stroke: '#000000', + style: { + color: 'white' + } + }, + select: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.1, '#000'], + [0.3, '#333'] + ] + }, + stroke: '#000000', + style: { + color: 'yellow' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: 'silver' + } + }, + + navigator: { + handles: { + backgroundColor: '#666', + borderColor: '#AAA' + }, + outlineColor: '#CCC', + maskFill: 'rgba(16, 16, 16, 0.5)', + series: { + color: '#7798BF', + lineColor: '#A6C7ED' + } + }, + + scrollbar: { + barBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + barBorderColor: '#CCC', + buttonArrowColor: '#CCC', + buttonBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + buttonBorderColor: '#CCC', + rifleColor: '#FFF', + trackBackgroundColor: { + linearGradient: [0, 0, 0, 10], + stops: [ + [0, '#000'], + [1, '#333'] + ] + }, + trackBorderColor: '#666' + }, + + // special colors for some of the + legendBackgroundColor: 'rgba(0, 0, 0, 0.5)', + legendBackgroundColorSolid: 'rgb(35, 35, 70)', + dataLabelsColor: '#444', + textColor: '#C0C0C0', + maskColor: 'rgba(255,255,255,0.3)' +}; + +// Apply the theme +var highchartsOptions = Highcharts.setOptions(Highcharts.theme); \ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/themes/gray.js b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/gray.js new file mode 100644 index 00000000000..339829877c6 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/gray.js @@ -0,0 +1,262 @@ +/** + * Gray theme for Highcharts JS + * @author Torstein Hønsi + */ + +Highcharts.theme = { + colors: ["#DDDF0D", "#7798BF", "#55BF3B", "#DF5353", "#aaeeee", "#ff0066", "#eeaaee", + "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"], + chart: { + backgroundColor: { + linearGradient: [0, 0, 0, 400], + stops: [ + [0, 'rgb(96, 96, 96)'], + [1, 'rgb(16, 16, 16)'] + ] + }, + borderWidth: 0, + borderRadius: 15, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + title: { + style: { + color: '#FFF', + font: '16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + }, + subtitle: { + style: { + color: '#DDD', + font: '12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#999', + tickColor: '#999', + labels: { + style: { + color: '#999', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#AAA', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: 'rgba(255, 255, 255, .1)', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#999', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#AAA', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + legend: { + itemStyle: { + color: '#CCC' + }, + itemHoverStyle: { + color: '#FFF' + }, + itemHiddenStyle: { + color: '#333' + } + }, + labels: { + style: { + color: '#CCC' + } + }, + tooltip: { + backgroundColor: { + linearGradient: [0, 0, 0, 50], + stops: [ + [0, 'rgba(96, 96, 96, .8)'], + [1, 'rgba(16, 16, 16, .8)'] + ] + }, + borderWidth: 0, + style: { + color: '#FFF' + } + }, + + + plotOptions: { + line: { + dataLabels: { + color: '#CCC' + }, + marker: { + lineColor: '#333' + } + }, + spline: { + marker: { + lineColor: '#333' + } + }, + scatter: { + marker: { + lineColor: '#333' + } + }, + candlestick: { + lineColor: 'white' + } + }, + + toolbar: { + itemStyle: { + color: '#CCC' + } + }, + + navigation: { + buttonOptions: { + backgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#606060'], + [0.6, '#333333'] + ] + }, + borderColor: '#000000', + symbolStroke: '#C0C0C0', + hoverSymbolStroke: '#FFFFFF' + } + }, + + exporting: { + buttons: { + exportButton: { + symbolFill: '#55BE3B' + }, + printButton: { + symbolFill: '#7797BE' + } + } + }, + + // scroll charts + rangeSelector: { + buttonTheme: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + stroke: '#000000', + style: { + color: '#CCC', + fontWeight: 'bold' + }, + states: { + hover: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#BBB'], + [0.6, '#888'] + ] + }, + stroke: '#000000', + style: { + color: 'white' + } + }, + select: { + fill: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.1, '#000'], + [0.3, '#333'] + ] + }, + stroke: '#000000', + style: { + color: 'yellow' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: 'silver' + } + }, + + navigator: { + handles: { + backgroundColor: '#666', + borderColor: '#AAA' + }, + outlineColor: '#CCC', + maskFill: 'rgba(16, 16, 16, 0.5)', + series: { + color: '#7798BF', + lineColor: '#A6C7ED' + } + }, + + scrollbar: { + barBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + barBorderColor: '#CCC', + buttonArrowColor: '#CCC', + buttonBackgroundColor: { + linearGradient: [0, 0, 0, 20], + stops: [ + [0.4, '#888'], + [0.6, '#555'] + ] + }, + buttonBorderColor: '#CCC', + rifleColor: '#FFF', + trackBackgroundColor: { + linearGradient: [0, 0, 0, 10], + stops: [ + [0, '#000'], + [1, '#333'] + ] + }, + trackBorderColor: '#666' + }, + + // special colors for some of the demo examples + legendBackgroundColor: 'rgba(48, 48, 48, 0.8)', + legendBackgroundColorSolid: 'rgb(70, 70, 70)', + dataLabelsColor: '#444', + textColor: '#E0E0E0', + maskColor: 'rgba(255,255,255,0.3)' +}; + +// Apply the theme +var highchartsOptions = Highcharts.setOptions(Highcharts.theme); diff --git a/java/com.sap.sailing.gwt.ui/highcharts/js/themes/grid.js b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/grid.js new file mode 100644 index 00000000000..4dbe28b05c4 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/highcharts/js/themes/grid.js @@ -0,0 +1,96 @@ +/** + * Grid theme for Highcharts JS + * @author Torstein Hønsi + */ + +Highcharts.theme = { + colors: ['#058DC7', '#50B432', '#ED561B', '#DDDF00', '#24CBE5', '#64E572', '#FF9655', '#FFF263', '#6AF9C4'], + chart: { + backgroundColor: { + linearGradient: [0, 0, 500, 500], + stops: [ + [0, 'rgb(255, 255, 255)'], + [1, 'rgb(240, 240, 255)'] + ] + }, + borderWidth: 2, + plotBackgroundColor: 'rgba(255, 255, 255, .9)', + plotShadow: true, + plotBorderWidth: 1 + }, + title: { + style: { + color: '#000', + font: 'bold 16px "Trebuchet MS", Verdana, sans-serif' + } + }, + subtitle: { + style: { + color: '#666666', + font: 'bold 12px "Trebuchet MS", Verdana, sans-serif' + } + }, + xAxis: { + gridLineWidth: 1, + lineColor: '#000', + tickColor: '#000', + labels: { + style: { + color: '#000', + font: '11px Trebuchet MS, Verdana, sans-serif' + } + }, + title: { + style: { + color: '#333', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + + } + } + }, + yAxis: { + minorTickInterval: 'auto', + lineColor: '#000', + lineWidth: 1, + tickWidth: 1, + tickColor: '#000', + labels: { + style: { + color: '#000', + font: '11px Trebuchet MS, Verdana, sans-serif' + } + }, + title: { + style: { + color: '#333', + fontWeight: 'bold', + fontSize: '12px', + fontFamily: 'Trebuchet MS, Verdana, sans-serif' + } + } + }, + legend: { + itemStyle: { + font: '9pt Trebuchet MS, Verdana, sans-serif', + color: 'black' + + }, + itemHoverStyle: { + color: '#039' + }, + itemHiddenStyle: { + color: 'gray' + } + }, + labels: { + style: { + color: '#99b' + } + } +}; + +// Apply the theme +var highchartsOptions = Highcharts.setOptions(Highcharts.theme); + diff --git a/java/com.sap.sailing.gwt.ui/pom.xml b/java/com.sap.sailing.gwt.ui/pom.xml index dd88e559fd0..3182e6436c3 100644 --- a/java/com.sap.sailing.gwt.ui/pom.xml +++ b/java/com.sap.sailing.gwt.ui/pom.xml @@ -23,6 +23,11 @@ gflot 1.0.1 + + org.moxieapps.gwt + org.moxieapps.gwt.highcharts + 1.1.3 + com.sap.sailing com.sap.sailing.domain.common diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java index b63ae301cc0..3d556c7872a 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/WindChart.java @@ -1,39 +1,24 @@ package com.sap.sailing.gwt.ui.adminconsole; -import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; -import ca.nanometrics.gflot.client.Axis; -import ca.nanometrics.gflot.client.DataPoint; -import ca.nanometrics.gflot.client.PlotItem; -import ca.nanometrics.gflot.client.PlotModelStrategy; -import ca.nanometrics.gflot.client.PlotPosition; -import ca.nanometrics.gflot.client.PlotWithOverview; -import ca.nanometrics.gflot.client.PlotWithOverviewModel; -import ca.nanometrics.gflot.client.SeriesHandler; -import ca.nanometrics.gflot.client.SeriesType; -import ca.nanometrics.gflot.client.event.PlotHoverListener; -import ca.nanometrics.gflot.client.event.SelectionListener; -import ca.nanometrics.gflot.client.jsni.Plot; -import ca.nanometrics.gflot.client.options.AxisOptions; -import ca.nanometrics.gflot.client.options.GridOptions; -import ca.nanometrics.gflot.client.options.LegendOptions; -import ca.nanometrics.gflot.client.options.LineSeriesOptions; -import ca.nanometrics.gflot.client.options.PlotOptions; -import ca.nanometrics.gflot.client.options.PointsSeriesOptions; -import ca.nanometrics.gflot.client.options.SelectionOptions; -import ca.nanometrics.gflot.client.options.SeriesOptions; -import ca.nanometrics.gflot.client.options.TickFormatter; +import org.moxieapps.gwt.highcharts.client.Axis; +import org.moxieapps.gwt.highcharts.client.Chart; +import org.moxieapps.gwt.highcharts.client.ChartSubtitle; +import org.moxieapps.gwt.highcharts.client.ChartTitle; +import org.moxieapps.gwt.highcharts.client.Color; +import org.moxieapps.gwt.highcharts.client.Legend; +import org.moxieapps.gwt.highcharts.client.Series; +import org.moxieapps.gwt.highcharts.client.ToolTip; +import org.moxieapps.gwt.highcharts.client.plotOptions.AreaPlotOptions; +import org.moxieapps.gwt.highcharts.client.plotOptions.Marker; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.user.client.rpc.AsyncCallback; -import com.google.gwt.user.client.ui.HorizontalPanel; -import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.sap.sailing.domain.common.RaceIdentifier; @@ -44,29 +29,27 @@ import com.sap.sailing.gwt.ui.client.RaceSelectionChangeListener; import com.sap.sailing.gwt.ui.client.RaceSelectionProvider; import com.sap.sailing.gwt.ui.client.SailingServiceAsync; import com.sap.sailing.gwt.ui.client.StringMessages; -import com.sap.sailing.gwt.ui.shared.WindDTO; +import com.sap.sailing.gwt.ui.client.TimeListener; import com.sap.sailing.gwt.ui.shared.WindInfoForRaceDTO; import com.sap.sailing.gwt.ui.shared.WindTrackInfoDTO; import com.sap.sailing.gwt.ui.shared.components.Component; import com.sap.sailing.gwt.ui.shared.components.SettingsDialogComponent; -public class WindChart implements Component, RaceSelectionChangeListener { +public class WindChart implements Component, RaceSelectionChangeListener, TimeListener { private final StringMessages stringMessages; - private final DateTimeFormat dateFormat; - private PlotWithOverviewModel model; private final Set windSourcesToDisplay; private final ColorMap colorMap; - private final Map stripChartSeries; - private final List seriesHandlersInOrder; - private final Label selectedPointLabel; private final ErrorReporter errorReporter; private final SailingServiceAsync sailingService; - private PlotWithOverview plot; + private final Chart chart; + + private static final DateTimeFormat dateTimeFormat = DateTimeFormat.getFormat("yyyy-MM-dd"); /** - * @param raceSelectionProvider if null, this chart won't update its contents automatically upon race - * selection change; otherwise, whenever the selection changes, the wind data of the race selected now is loaded - * from the server and displayed in this chart. If no race is selected, the chart is cleared. + * @param raceSelectionProvider + * if null, this chart won't update its contents automatically upon race selection change; + * otherwise, whenever the selection changes, the wind data of the race selected now is loaded from the + * server and displayed in this chart. If no race is selected, the chart is cleared. */ public WindChart(SailingServiceAsync sailingService, RaceSelectionProvider raceSelectionProvider, WindChartSettings settings, StringMessages stringMessages, ErrorReporter errorReporter) { @@ -75,18 +58,151 @@ public class WindChart implements Component, RaceSelectionCha this.stringMessages = stringMessages; this.errorReporter = errorReporter; this.windSourcesToDisplay = new HashSet(); - dateFormat = DateTimeFormat.getFormat("HH:mm:ss"); this.colorMap = new ColorMap(); - this.stripChartSeries = new HashMap(); - this.seriesHandlersInOrder = new ArrayList(); - this.selectedPointLabel = new Label(); + chart = new Chart() + .setZoomType(Chart.ZoomType.X) + .setSpacingRight(20) + .setChartTitle(new ChartTitle().setText("USD to EUR exchange rate from 2006 through 2008")) + .setChartSubtitle(new ChartSubtitle().setText("Click and drag in the plot area to zoom in")) + .setToolTip(new ToolTip().setShared(true)) + .setLegend(new Legend().setEnabled(false)) + .setAreaPlotOptions( + new AreaPlotOptions() + .setFillColor( + new Color().setLinearGradient(0.0, 0.0, 0.0, 1.0).addColorStop(0, 69, 114, 167) + .addColorStop(1, 2, 0, 0, 0)) + .setLineWidth(1) + .setMarker( + new Marker().setEnabled(false).setHoverState( + new Marker().setEnabled(true).setRadius(5))).setShadow(false) + .setHoverStateLineWidth(1)); + + chart.getXAxis().setType(Axis.Type.DATE_TIME).setMaxZoom(14 * 24 * 3600000) // fourteen days + .setAxisTitleText(null); + + chart.getYAxis().setAxisTitleText("Exchange rate").setMin(0.6).setStartOnTick(false).setShowFirstLabel(false); + + chart.addSeries(chart + .createSeries() + .setType(Series.Type.AREA) + .setName("USD to EUR") + .setPlotOptions( + new AreaPlotOptions().setPointInterval(24 * 3600 * 1000).setPointStart(getTime("2006-01-01"))) + .setPoints( + new Number[] { 0.8446, 0.8445, 0.8444, 0.8451, 0.8418, 0.8264, 0.8258, 0.8232, 0.8233, 0.8258, + 0.8283, 0.8278, 0.8256, 0.8292, 0.8239, 0.8239, 0.8245, 0.8265, 0.8261, 0.8269, 0.8273, + 0.8244, 0.8244, 0.8172, 0.8139, 0.8146, 0.8164, 0.82, 0.8269, 0.8269, 0.8269, 0.8258, + 0.8247, 0.8286, 0.8289, 0.8316, 0.832, 0.8333, 0.8352, 0.8357, 0.8355, 0.8354, 0.8403, + 0.8403, 0.8406, 0.8403, 0.8396, 0.8418, 0.8409, 0.8384, 0.8386, 0.8372, 0.839, 0.84, + 0.8389, 0.84, 0.8423, 0.8423, 0.8435, 0.8422, 0.838, 0.8373, 0.8316, 0.8303, 0.8303, + 0.8302, 0.8369, 0.84, 0.8385, 0.84, 0.8401, 0.8402, 0.8381, 0.8351, 0.8314, 0.8273, + 0.8213, 0.8207, 0.8207, 0.8215, 0.8242, 0.8273, 0.8301, 0.8346, 0.8312, 0.8312, 0.8312, + 0.8306, 0.8327, 0.8282, 0.824, 0.8255, 0.8256, 0.8273, 0.8209, 0.8151, 0.8149, 0.8213, + 0.8273, 0.8273, 0.8261, 0.8252, 0.824, 0.8262, 0.8258, 0.8261, 0.826, 0.8199, 0.8153, + 0.8097, 0.8101, 0.8119, 0.8107, 0.8105, 0.8084, 0.8069, 0.8047, 0.8023, 0.7965, 0.7919, + 0.7921, 0.7922, 0.7934, 0.7918, 0.7915, 0.787, 0.7861, 0.7861, 0.7853, 0.7867, 0.7827, + 0.7834, 0.7766, 0.7751, 0.7739, 0.7767, 0.7802, 0.7788, 0.7828, 0.7816, 0.7829, 0.783, + 0.7829, 0.7781, 0.7811, 0.7831, 0.7826, 0.7855, 0.7855, 0.7845, 0.7798, 0.7777, 0.7822, + 0.7785, 0.7744, 0.7743, 0.7726, 0.7766, 0.7806, 0.785, 0.7907, 0.7912, 0.7913, 0.7931, + 0.7952, 0.7951, 0.7928, 0.791, 0.7913, 0.7912, 0.7941, 0.7953, 0.7921, 0.7919, 0.7968, + 0.7999, 0.7999, 0.7974, 0.7942, 0.796, 0.7969, 0.7862, 0.7821, 0.7821, 0.7821, 0.7811, + 0.7833, 0.7849, 0.7819, 0.7809, 0.7809, 0.7827, 0.7848, 0.785, 0.7873, 0.7894, 0.7907, + 0.7909, 0.7947, 0.7987, 0.799, 0.7927, 0.79, 0.7878, 0.7878, 0.7907, 0.7922, 0.7937, + 0.786, 0.787, 0.7838, 0.7838, 0.7837, 0.7836, 0.7806, 0.7825, 0.7798, 0.777, 0.777, + 0.7772, 0.7793, 0.7788, 0.7785, 0.7832, 0.7865, 0.7865, 0.7853, 0.7847, 0.7809, 0.778, + 0.7799, 0.78, 0.7801, 0.7765, 0.7785, 0.7811, 0.782, 0.7835, 0.7845, 0.7844, 0.782, + 0.7811, 0.7795, 0.7794, 0.7806, 0.7794, 0.7794, 0.7778, 0.7793, 0.7808, 0.7824, 0.787, + 0.7894, 0.7893, 0.7882, 0.7871, 0.7882, 0.7871, 0.7878, 0.79, 0.7901, 0.7898, 0.7879, + 0.7886, 0.7858, 0.7814, 0.7825, 0.7826, 0.7826, 0.786, 0.7878, 0.7868, 0.7883, 0.7893, + 0.7892, 0.7876, 0.785, 0.787, 0.7873, 0.7901, 0.7936, 0.7939, 0.7938, 0.7956, 0.7975, + 0.7978, 0.7972, 0.7995, 0.7995, 0.7994, 0.7976, 0.7977, 0.796, 0.7922, 0.7928, 0.7929, + 0.7948, 0.797, 0.7953, 0.7907, 0.7872, 0.7852, 0.7852, 0.786, 0.7862, 0.7836, 0.7837, + 0.784, 0.7867, 0.7867, 0.7869, 0.7837, 0.7827, 0.7825, 0.7779, 0.7791, 0.779, 0.7787, + 0.78, 0.7807, 0.7803, 0.7817, 0.7799, 0.7799, 0.7795, 0.7801, 0.7765, 0.7725, 0.7683, + 0.7641, 0.7639, 0.7616, 0.7608, 0.759, 0.7582, 0.7539, 0.75, 0.75, 0.7507, 0.7505, + 0.7516, 0.7522, 0.7531, 0.7577, 0.7577, 0.7582, 0.755, 0.7542, 0.7576, 0.7616, 0.7648, + 0.7648, 0.7641, 0.7614, 0.757, 0.7587, 0.7588, 0.762, 0.762, 0.7617, 0.7618, 0.7615, + 0.7612, 0.7596, 0.758, 0.758, 0.758, 0.7547, 0.7549, 0.7613, 0.7655, 0.7693, 0.7694, + 0.7688, 0.7678, 0.7708, 0.7727, 0.7749, 0.7741, 0.7741, 0.7732, 0.7727, 0.7737, 0.7724, + 0.7712, 0.772, 0.7721, 0.7717, 0.7704, 0.769, 0.7711, 0.774, 0.7745, 0.7745, 0.774, + 0.7716, 0.7713, 0.7678, 0.7688, 0.7718, 0.7718, 0.7728, 0.7729, 0.7698, 0.7685, 0.7681, + 0.769, 0.769, 0.7698, 0.7699, 0.7651, 0.7613, 0.7616, 0.7614, 0.7614, 0.7607, 0.7602, + 0.7611, 0.7622, 0.7615, 0.7598, 0.7598, 0.7592, 0.7573, 0.7566, 0.7567, 0.7591, 0.7582, + 0.7585, 0.7613, 0.7631, 0.7615, 0.76, 0.7613, 0.7627, 0.7627, 0.7608, 0.7583, 0.7575, + 0.7562, 0.752, 0.7512, 0.7512, 0.7517, 0.752, 0.7511, 0.748, 0.7509, 0.7531, 0.7531, + 0.7527, 0.7498, 0.7493, 0.7504, 0.75, 0.7491, 0.7491, 0.7485, 0.7484, 0.7492, 0.7471, + 0.7459, 0.7477, 0.7477, 0.7483, 0.7458, 0.7448, 0.743, 0.7399, 0.7395, 0.7395, 0.7378, + 0.7382, 0.7362, 0.7355, 0.7348, 0.7361, 0.7361, 0.7365, 0.7362, 0.7331, 0.7339, 0.7344, + 0.7327, 0.7327, 0.7336, 0.7333, 0.7359, 0.7359, 0.7372, 0.736, 0.736, 0.735, 0.7365, + 0.7384, 0.7395, 0.7413, 0.7397, 0.7396, 0.7385, 0.7378, 0.7366, 0.74, 0.7411, 0.7406, + 0.7405, 0.7414, 0.7431, 0.7431, 0.7438, 0.7443, 0.7443, 0.7443, 0.7434, 0.7429, 0.7442, + 0.744, 0.7439, 0.7437, 0.7437, 0.7429, 0.7403, 0.7399, 0.7418, 0.7468, 0.748, 0.748, + 0.749, 0.7494, 0.7522, 0.7515, 0.7502, 0.7472, 0.7472, 0.7462, 0.7455, 0.7449, 0.7467, + 0.7458, 0.7427, 0.7427, 0.743, 0.7429, 0.744, 0.743, 0.7422, 0.7388, 0.7388, 0.7369, + 0.7345, 0.7345, 0.7345, 0.7352, 0.7341, 0.7341, 0.734, 0.7324, 0.7272, 0.7264, 0.7255, + 0.7258, 0.7258, 0.7256, 0.7257, 0.7247, 0.7243, 0.7244, 0.7235, 0.7235, 0.7235, 0.7235, + 0.7262, 0.7288, 0.7301, 0.7337, 0.7337, 0.7324, 0.7297, 0.7317, 0.7315, 0.7288, 0.7263, + 0.7263, 0.7242, 0.7253, 0.7264, 0.727, 0.7312, 0.7305, 0.7305, 0.7318, 0.7358, 0.7409, + 0.7454, 0.7437, 0.7424, 0.7424, 0.7415, 0.7419, 0.7414, 0.7377, 0.7355, 0.7315, 0.7315, + 0.732, 0.7332, 0.7346, 0.7328, 0.7323, 0.734, 0.734, 0.7336, 0.7351, 0.7346, 0.7321, + 0.7294, 0.7266, 0.7266, 0.7254, 0.7242, 0.7213, 0.7197, 0.7209, 0.721, 0.721, 0.721, + 0.7209, 0.7159, 0.7133, 0.7105, 0.7099, 0.7099, 0.7093, 0.7093, 0.7076, 0.707, 0.7049, + 0.7012, 0.7011, 0.7019, 0.7046, 0.7063, 0.7089, 0.7077, 0.7077, 0.7077, 0.7091, 0.7118, + 0.7079, 0.7053, 0.705, 0.7055, 0.7055, 0.7045, 0.7051, 0.7051, 0.7017, 0.7, 0.6995, + 0.6994, 0.7014, 0.7036, 0.7021, 0.7002, 0.6967, 0.695, 0.695, 0.6939, 0.694, 0.6922, + 0.6919, 0.6914, 0.6894, 0.6891, 0.6904, 0.689, 0.6834, 0.6823, 0.6807, 0.6815, 0.6815, + 0.6847, 0.6859, 0.6822, 0.6827, 0.6837, 0.6823, 0.6822, 0.6822, 0.6792, 0.6746, 0.6735, + 0.6731, 0.6742, 0.6744, 0.6739, 0.6731, 0.6761, 0.6761, 0.6785, 0.6818, 0.6836, 0.6823, + 0.6805, 0.6793, 0.6849, 0.6833, 0.6825, 0.6825, 0.6816, 0.6799, 0.6813, 0.6809, 0.6868, + 0.6933, 0.6933, 0.6945, 0.6944, 0.6946, 0.6964, 0.6965, 0.6956, 0.6956, 0.695, 0.6948, + 0.6928, 0.6887, 0.6824, 0.6794, 0.6794, 0.6803, 0.6855, 0.6824, 0.6791, 0.6783, 0.6785, + 0.6785, 0.6797, 0.68, 0.6803, 0.6805, 0.676, 0.677, 0.677, 0.6736, 0.6726, 0.6764, + 0.6821, 0.6831, 0.6842, 0.6842, 0.6887, 0.6903, 0.6848, 0.6824, 0.6788, 0.6814, 0.6814, + 0.6797, 0.6769, 0.6765, 0.6733, 0.6729, 0.6758, 0.6758, 0.675, 0.678, 0.6833, 0.6856, + 0.6903, 0.6896, 0.6896, 0.6882, 0.6879, 0.6862, 0.6852, 0.6823, 0.6813, 0.6813, 0.6822, + 0.6802, 0.6802, 0.6784, 0.6748, 0.6747, 0.6747, 0.6748, 0.6733, 0.665, 0.6611, 0.6583, + 0.659, 0.659, 0.6581, 0.6578, 0.6574, 0.6532, 0.6502, 0.6514, 0.6514, 0.6507, 0.651, + 0.6489, 0.6424, 0.6406, 0.6382, 0.6382, 0.6341, 0.6344, 0.6378, 0.6439, 0.6478, 0.6481, + 0.6481, 0.6494, 0.6438, 0.6377, 0.6329, 0.6336, 0.6333, 0.6333, 0.633, 0.6371, 0.6403, + 0.6396, 0.6364, 0.6356, 0.6356, 0.6368, 0.6357, 0.6354, 0.632, 0.6332, 0.6328, 0.6331, + 0.6342, 0.6321, 0.6302, 0.6278, 0.6308, 0.6324, 0.6324, 0.6307, 0.6277, 0.6269, 0.6335, + 0.6392, 0.64, 0.6401, 0.6396, 0.6407, 0.6423, 0.6429, 0.6472, 0.6485, 0.6486, 0.6467, + 0.6444, 0.6467, 0.6509, 0.6478, 0.6461, 0.6461, 0.6468, 0.6449, 0.647, 0.6461, 0.6452, + 0.6422, 0.6422, 0.6425, 0.6414, 0.6366, 0.6346, 0.635, 0.6346, 0.6346, 0.6343, 0.6346, + 0.6379, 0.6416, 0.6442, 0.6431, 0.6431, 0.6435, 0.644, 0.6473, 0.6469, 0.6386, 0.6356, + 0.634, 0.6346, 0.643, 0.6452, 0.6467, 0.6506, 0.6504, 0.6503, 0.6481, 0.6451, 0.645, + 0.6441, 0.6414, 0.6409, 0.6409, 0.6428, 0.6431, 0.6418, 0.6371, 0.6349, 0.6333, 0.6334, + 0.6338, 0.6342, 0.632, 0.6318, 0.637, 0.6368, 0.6368, 0.6383, 0.6371, 0.6371, 0.6355, + 0.632, 0.6277, 0.6276, 0.6291, 0.6274, 0.6293, 0.6311, 0.631, 0.6312, 0.6312, 0.6304, + 0.6294, 0.6348, 0.6378, 0.6368, 0.6368, 0.6368, 0.636, 0.637, 0.6418, 0.6411, 0.6435, + 0.6427, 0.6427, 0.6419, 0.6446, 0.6468, 0.6487, 0.6594, 0.6666, 0.6666, 0.6678, 0.6712, + 0.6705, 0.6718, 0.6784, 0.6811, 0.6811, 0.6794, 0.6804, 0.6781, 0.6756, 0.6735, 0.6763, + 0.6762, 0.6777, 0.6815, 0.6802, 0.678, 0.6796, 0.6817, 0.6817, 0.6832, 0.6877, 0.6912, + 0.6914, 0.7009, 0.7012, 0.701, 0.7005, 0.7076, 0.7087, 0.717, 0.7105, 0.7031, 0.7029, + 0.7006, 0.7035, 0.7045, 0.6956, 0.6988, 0.6915, 0.6914, 0.6859, 0.6778, 0.6815, 0.6815, + 0.6843, 0.6846, 0.6846, 0.6923, 0.6997, 0.7098, 0.7188, 0.7232, 0.7262, 0.7266, 0.7359, + 0.7368, 0.7337, 0.7317, 0.7387, 0.7467, 0.7461, 0.7366, 0.7319, 0.7361, 0.7437, 0.7432, + 0.7461, 0.7461, 0.7454, 0.7549, 0.7742, 0.7801, 0.7903, 0.7876, 0.7928, 0.7991, 0.8007, + 0.7823, 0.7661, 0.785, 0.7863, 0.7862, 0.7821, 0.7858, 0.7731, 0.7779, 0.7844, 0.7866, + 0.7864, 0.7788, 0.7875, 0.7971, 0.8004, 0.7857, 0.7932, 0.7938, 0.7927, 0.7918, 0.7919, + 0.7989, 0.7988, 0.7949, 0.7948, 0.7882, 0.7745, 0.771, 0.775, 0.7791, 0.7882, 0.7882, + 0.7899, 0.7905, 0.7889, 0.7879, 0.7855, 0.7866, 0.7865, 0.7795, 0.7758, 0.7717, 0.761, + 0.7497, 0.7471, 0.7473, 0.7407, 0.7288, 0.7074, 0.6927, 0.7083, 0.7191, 0.719, 0.7153, + 0.7156, 0.7158, 0.714, 0.7119, 0.7129, 0.7129, 0.7049, 0.7095 })); + updateSettings(settings); + /* if (raceSelectionProvider != null) { raceSelectionProvider.addRaceSelectionChangeListener(this); onRaceSelectionChange(raceSelectionProvider.getSelectedRaces()); } + */ } + private long getTime(String date) { + return dateTimeFormat.parse(date).getTime(); + } + @Override public String getLocalizedShortName() { return stringMessages.wind(); @@ -95,103 +211,15 @@ public class WindChart implements Component, RaceSelectionCha @Override public Widget getEntryWidget() { VerticalPanel vp = new VerticalPanel(); - HorizontalPanel hp = new HorizontalPanel(); - hp.add(selectedPointLabel); - hp.setHeight("2em"); - vp.add(hp); - model = new PlotWithOverviewModel(PlotModelStrategy.defaultStrategy()); - PlotOptions plotOptions = new PlotOptions(); - plotOptions.setDefaultLineSeriesOptions(new LineSeriesOptions().setLineWidth(1).setShow(true)); - plotOptions.setDefaultPointsOptions(new PointsSeriesOptions().setShow(false)); - plotOptions.setDefaultShadowSize(2); - AxisOptions hAxisOptions = new AxisOptions(); - hAxisOptions.setTickFormatter(new TickFormatter() { - @Override - public String formatTickValue(double tickValue, Axis axis) { - return dateFormat.format(new Date((long) tickValue)); - } - }); - plotOptions.setXAxisOptions(hAxisOptions); - plotOptions.setLegendOptions(new LegendOptions().setShow(false)); - plotOptions.setGridOptions(new GridOptions().setHoverable(true).setMouseActiveRadius(5).setAutoHighlight(true)); - plotOptions.setSelectionOptions(new SelectionOptions().setDragging(true).setMode("x")); // select along x-axis only for (WindSource windSource : windSourcesToDisplay) { - SeriesHandler series = addSeries(windSource); - series.setOptions(SeriesType.LINES, getLinesOptions(/* visible */ windSourcesToDisplay.contains(windSource))); - series.setOptions(SeriesType.POINTS, getPointsOptions(/* visible */ false)); - series.setVisible(false); + addSeries(windSource); } - this.plot = new PlotWithOverview(model, plotOptions) { - @Override - protected void onLoad() { - super.onLoad(); - // onLoad is called immediately after a widget becomes attached to the browser's document. - // Use this time point to ask the chart to redraw - redraw(); - } - }; - // add hover listener - plot.addHoverListener(new PlotHoverListener() { - public void onPlotHover(Plot plot, PlotPosition position, PlotItem item) { - if (item != null) { - if (item.getSeriesIndex() < seriesHandlersInOrder.size()) { - SeriesHandler seriesHandler = seriesHandlersInOrder.get(item.getSeriesIndex()); - WindSource windSource = getWindSource(seriesHandler); - selectedPointLabel.setText(windSource.name() + ": " + position.getY().intValue()); - selectedPointLabel.setVisible(true); - } - } else { - selectedPointLabel.setVisible(false); - } - } - }, /* only on data point */ false); - plot.addSelectionListener(new SelectionListener() { - public void selected(double x1, double y1, double x2, double y2) { - /* TODO Remove not visible buoys from the series when user is zooming in or add them if he is zooming out. - for (CompetitorDTO competitor : competitorsAndTimePointsDTO.getCompetitor()){ - long[] markPassingTimes = competitorsAndTimePointsDTO.getMarkPassings(competitor); - Double[] markPassingValues = chartData.getMarkPassings(competitor); - SeriesHandler markSeries = getCompetitorMarkPassingSeries(competitor); - markSeries.clear(); - int visibleMarkPassings = 0; - for (int j = 0; j < markPassingTimes.length; j++){ - if (markPassingValues[j] != null && markPassingTimes[j] > x1 && markPassingTimes[j] < x2) { - markSeries.add(new DataPoint(markPassingTimes[j],markPassingValues[j])); - visibleMarkPassings++; - } - } - if (visibleMarkPassings == 0){ - markSeries.setVisible(false); - } - }*/ - plot.setLinearSelection(x1, x2); - } - }); - plot.setOverviewHeight(60); - vp.add(plot); + vp.add(chart); return vp; } - private WindSource getWindSource(SeriesHandler seriesHandler) { - for (Map.Entry e : stripChartSeries.entrySet()) { - if (e.getValue() == seriesHandler) { - return e.getKey(); - } - } - return null; - } - - private SeriesHandler addSeries(WindSource windSource) { - SeriesHandler seriesHandler = model.addSeries(windSource.name(), colorMap.getColorByID(windSource)); - seriesHandlersInOrder.add(seriesHandler); - stripChartSeries.put(windSource, seriesHandler); - return seriesHandler; - } - - private void removeSeries(WindSource windSource, SeriesHandler seriesHandler) { - model.removeSeries(seriesHandler); - seriesHandlersInOrder.remove(seriesHandler); - stripChartSeries.remove(windSource); + private void addSeries(WindSource windSource) { + // TODO implement addSeries } public void updateStripChartSeries(WindInfoForRaceDTO result) { @@ -199,43 +227,8 @@ public class WindChart implements Component, RaceSelectionCha long max = Long.MIN_VALUE; for (Map.Entry e : result.windTrackInfoByWindSource.entrySet()) { WindSource windSource = e.getKey(); - SeriesHandler seriesHandler = stripChartSeries.get(windSource); - if (e.getValue().windFixes.isEmpty()) { - if (seriesHandler != null) { - removeSeries(windSource, seriesHandler); - } - } else { - if (seriesHandler == null) { - seriesHandler = addSeries(windSource); - seriesHandler.setOptions(SeriesType.LINES, getLinesOptions(/* visible */ windSourcesToDisplay.contains(windSource))); - seriesHandler.setOptions(SeriesType.POINTS, getPointsOptions(/* visible */ false)); - } else { - seriesHandler.clear(); - } - for (WindDTO windFix : e.getValue().windFixes) { - seriesHandler.add(new DataPoint(windFix.timepoint, windFix.dampenedTrueWindFromDeg)); - min = Math.min(min, windFix.timepoint); - max = Math.max(max, windFix.timepoint); - } - seriesHandler.setVisible(true); - } + // TODO } - if (plot != null && plot.isAttached()) { - try { - plot.setLinearSelection(min, max); // TODO maintain previous selection - plot.redraw(); - } catch (Exception ex) { - errorReporter.reportError("Error trying to update strip chart: " + ex.getMessage()); - } - } - } - - private SeriesOptions getPointsOptions(boolean visible) { - return new PointsSeriesOptions().setLineWidth(0).setShow(visible); - } - - private SeriesOptions getLinesOptions(boolean visible) { - return new LineSeriesOptions().setLineWidth(2.5).setShow(visible); } @Override @@ -256,12 +249,7 @@ public class WindChart implements Component, RaceSelectionCha public void updateSettings(WindChartSettings newSettings) { windSourcesToDisplay.clear(); windSourcesToDisplay.addAll(newSettings.getWindSourcesToDisplay()); - for (Map.Entry e : stripChartSeries.entrySet()) { - e.getValue().setVisible(windSourcesToDisplay.contains(e.getKey())); - } - if (plot != null) { - plot.redraw(); - } + // TODO update visibility of the series showing the respective wind source } private void loadData(final RaceIdentifier raceIdentifier) { @@ -288,9 +276,7 @@ public class WindChart implements Component, RaceSelectionCha } private void clearChart() { - for (SeriesHandler seriesHandler : seriesHandlersInOrder) { - seriesHandler.clear(); - } + chart.removeAllSeries(); } @Override @@ -303,4 +289,9 @@ public class WindChart implements Component, RaceSelectionCha clearChart(); } } + + @Override + public void timeChanged(Date date) { + // TODO implement timeChanged by + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml index ee108a2926f..3bb43182118 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/ui/AdminConsole.gwt.xml @@ -18,6 +18,7 @@ +