├── app
├── .gitkeep
├── templates
│ └── components
│ │ └── high-charts.hbs
├── components
│ └── high-charts.js
└── initializers
│ └── highcharts.js
├── addon
├── .gitkeep
├── utils
│ └── option-loader.js
└── components
│ └── high-charts.js
├── vendor
├── .gitkeep
├── modules
│ └── solid-gauge.js
└── highcharts-3d-release
│ └── highcharts-3d.src.js
├── tests
├── unit
│ ├── .gitkeep
│ └── components
│ │ └── high-charts-test.js
├── dummy
│ ├── public
│ │ ├── .gitkeep
│ │ ├── robots.txt
│ │ └── crossdomain.xml
│ ├── app
│ │ ├── helpers
│ │ │ └── .gitkeep
│ │ ├── models
│ │ │ └── .gitkeep
│ │ ├── routes
│ │ │ └── .gitkeep
│ │ ├── styles
│ │ │ ├── .gitkeep
│ │ │ └── app.css
│ │ ├── views
│ │ │ └── .gitkeep
│ │ ├── components
│ │ │ └── .gitkeep
│ │ ├── controllers
│ │ │ ├── .gitkeep
│ │ │ └── application.js
│ │ ├── templates
│ │ │ ├── .gitkeep
│ │ │ ├── components
│ │ │ │ └── .gitkeep
│ │ │ └── application.hbs
│ │ ├── router.js
│ │ ├── highcharts-configs
│ │ │ └── application.js
│ │ ├── app.js
│ │ ├── index.html
│ │ ├── themes
│ │ │ └── default-theme.js
│ │ └── data
│ │ │ └── stock.js
│ ├── .jshintrc
│ └── config
│ │ └── environment.js
├── test-helper.js
├── helpers
│ ├── resolver.js
│ └── start-app.js
├── .jshintrc
└── index.html
├── .bowerrc
├── blueprints
├── .jshintrc
├── chart
│ ├── index.js
│ └── files
│ │ └── __path__
│ │ └── __name__.js
└── chart-test
│ ├── index.js
│ └── files
│ └── tests
│ └── units
│ └── __path__
│ └── __test__.js
├── config
└── environment.js
├── testem.json
├── .npmignore
├── .ember-cli
├── gh-pages.sh
├── .gitignore
├── .travis.yml
├── CONTRIBUTING.md
├── bower.json
├── .editorconfig
├── .jshintrc
├── Brocfile.js
├── LICENSE.md
├── CHANGELOG.md
├── package.json
├── index.js
└── README.md
/app/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/addon/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/vendor/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/unit/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/public/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/helpers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/models/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/routes/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/styles/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/views/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/components/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/controllers/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/templates/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/tests/dummy/app/templates/components/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/app/templates/components/high-charts.hbs:
--------------------------------------------------------------------------------
1 | {{yield}}
2 |
--------------------------------------------------------------------------------
/tests/dummy/app/styles/app.css:
--------------------------------------------------------------------------------
1 | html, body {
2 | margin: 20px;
3 | }
4 |
--------------------------------------------------------------------------------
/tests/dummy/public/robots.txt:
--------------------------------------------------------------------------------
1 | # http://www.robotstxt.org
2 | User-agent: *
3 |
--------------------------------------------------------------------------------
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "bower_components",
3 | "analytics": false
4 | }
5 |
--------------------------------------------------------------------------------
/blueprints/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "predef": [
3 | "console"
4 | ],
5 | "strict": false
6 | }
7 |
--------------------------------------------------------------------------------
/blueprints/chart/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | description: 'Sub-classes the default high-charts component'
3 | };
4 |
--------------------------------------------------------------------------------
/config/environment.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports = function(/* environment, appConfig */) {
4 | return { };
5 | };
6 |
--------------------------------------------------------------------------------
/blueprints/chart-test/index.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | description: 'Tests the component generated by the chart blueprint'
3 | };
4 |
--------------------------------------------------------------------------------
/app/components/high-charts.js:
--------------------------------------------------------------------------------
1 | import HighCharts from 'ember-highcharts-extra/components/high-charts';
2 |
3 | export default HighCharts;
4 |
--------------------------------------------------------------------------------
/tests/test-helper.js:
--------------------------------------------------------------------------------
1 | import resolver from './helpers/resolver';
2 | import {
3 | setResolver
4 | } from 'ember-qunit';
5 |
6 | setResolver(resolver);
7 |
--------------------------------------------------------------------------------
/testem.json:
--------------------------------------------------------------------------------
1 | {
2 | "framework": "qunit",
3 | "test_page": "tests/index.html?hidepassed",
4 | "launch_in_ci": [
5 | "PhantomJS"
6 | ],
7 | "launch_in_dev": [
8 | "PhantomJS",
9 | "Chrome"
10 | ]
11 | }
12 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | bower_components/
2 | tests/
3 | tmp/
4 |
5 | .bowerrc
6 | .editorconfig
7 | .ember-cli
8 | .travis.yml
9 | .npmignore
10 | **/.gitkeep
11 | bower.json
12 | Brocfile.js
13 | testem.json
14 | gh-pages/
15 | gh-pages.sh
16 |
--------------------------------------------------------------------------------
/app/initializers/highcharts.js:
--------------------------------------------------------------------------------
1 | export function initialize(container) {
2 | container.optionsForType('highcharts-config', { instantiate: false });
3 | }
4 |
5 | export default {
6 | name: 'highcharts',
7 | initialize: initialize
8 | };
9 |
--------------------------------------------------------------------------------
/tests/dummy/app/templates/application.hbs:
--------------------------------------------------------------------------------
1 |
Welcome to Ember.js
2 |
3 | {{high-charts content=chartData chartOptions=chartOptions theme=theme}}
4 | {{high-charts mode='StockChart' content=stockChartData chartOptions=stockChartOptions}}
5 |
--------------------------------------------------------------------------------
/tests/dummy/app/router.js:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 | import config from './config/environment';
3 |
4 | var Router = Ember.Router.extend({
5 | location: config.locationType
6 | });
7 |
8 | Router.map(function() {
9 | });
10 |
11 | export default Router;
12 |
--------------------------------------------------------------------------------
/blueprints/chart/files/__path__/__name__.js:
--------------------------------------------------------------------------------
1 | import Highcharts from 'ember-highcharts/addon/components/high-charts';
2 |
3 | export default Highcharts.extend({
4 | // chartMode: '', // empty, 'StockChart', or 'Map'
5 | // chartOptions: {},
6 | // chartData: [],
7 | // theme: {}
8 | });
9 |
--------------------------------------------------------------------------------
/tests/dummy/app/highcharts-configs/application.js:
--------------------------------------------------------------------------------
1 | export default function(defaultOptions) {
2 | defaultOptions.credits.href = 'http://www.example.com';
3 | defaultOptions.credits.text = 'ember-highcharts-configured-title';
4 | defaultOptions.credits.enabled = true;
5 |
6 | return defaultOptions;
7 | }
8 |
--------------------------------------------------------------------------------
/.ember-cli:
--------------------------------------------------------------------------------
1 | {
2 | /**
3 | Ember CLI sends analytics information by default. The data is completely
4 | anonymous, but there are times when you might want to disable this behavior.
5 |
6 | Setting `disableAnalytics` to true will prevent any data from being sent.
7 | */
8 | "disableAnalytics": false
9 | }
10 |
--------------------------------------------------------------------------------
/tests/helpers/resolver.js:
--------------------------------------------------------------------------------
1 | import Resolver from 'ember/resolver';
2 | import config from '../../config/environment';
3 |
4 | var resolver = Resolver.create();
5 |
6 | resolver.namespace = {
7 | modulePrefix: config.modulePrefix,
8 | podModulePrefix: config.podModulePrefix
9 | };
10 |
11 | export default resolver;
12 |
--------------------------------------------------------------------------------
/gh-pages.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd $(dirname $0)
4 | GH_PAGES_DIR=./gh-pages
5 | ember build --environment=production && \
6 | rm -rf ${GH_PAGES_DIR}/* && \
7 | cp -R dist/* ${GH_PAGES_DIR}/ && \
8 | cd ${GH_PAGES_DIR} && \
9 | git add -A && \
10 | git commit -m 'Update GitHub pages' && \
11 | git push origin gh-pages:gh-pages
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See http://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # compiled output
4 | /dist
5 | /tmp
6 |
7 | # dependencies
8 | /node_modules
9 | /bower_components
10 |
11 | # misc
12 | /.sass-cache
13 | /connect.lock
14 | /coverage/*
15 | /libpeerconnection.log
16 | npm-debug.log
17 | testem.log
18 | gh-pages
19 |
20 | .DS_Store
21 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | ---
2 | language: node_js
3 | node_js:
4 | - "0.12"
5 |
6 | sudo: false
7 |
8 | cache:
9 | directories:
10 | - node_modules
11 |
12 | before_install:
13 | - "npm config set spin false"
14 | - "npm install -g npm@^2"
15 |
16 | install:
17 | - npm install -g bower
18 | - npm install
19 | - bower install
20 |
21 | script:
22 | - npm test
23 |
--------------------------------------------------------------------------------
/tests/dummy/app/app.js:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 | import Resolver from 'ember/resolver';
3 | import loadInitializers from 'ember/load-initializers';
4 | import config from './config/environment';
5 |
6 | Ember.MODEL_FACTORY_INJECTIONS = true;
7 |
8 | var App = Ember.Application.extend({
9 | modulePrefix: config.modulePrefix,
10 | podModulePrefix: config.podModulePrefix,
11 | Resolver: Resolver
12 | });
13 |
14 | loadInitializers(App, config.modulePrefix);
15 |
16 | export default App;
17 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to ember-highcharts
2 |
3 | ## Found an Issue?
4 |
5 | If you've found a bug in this addon or want to suggest a new feature, you can submit them via issue tracker on this repo.
6 |
7 | ## Submitting a Pull Request
8 |
9 | Before you submit your pull request, check out the [Ember.js JavaScript Style Guide](https://github.com/emberjs/ember.js/blob/master/STYLEGUIDE.md) and make sure that your code follow those rules. Also, don't forget to add a test for your change.
10 |
11 | *Want to improve this page? Feel free to submit a pull request.*
12 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ember-highcharts",
3 | "dependencies": {
4 | "jquery": "^1.11.1",
5 | "ember": "1.12.0",
6 | "ember-data": "1.0.0-beta.17",
7 | "ember-resolver": "~0.1.15",
8 | "loader.js": "ember-cli/loader.js#3.2.0",
9 | "ember-cli-shims": "ember-cli/ember-cli-shims#0.0.3",
10 | "ember-cli-test-loader": "ember-cli-test-loader#0.1.3",
11 | "ember-load-initializers": "ember-cli/ember-load-initializers#0.1.4",
12 | "ember-qunit": "0.3.3",
13 | "ember-qunit-notifications": "0.0.7",
14 | "qunit": "~1.17.1"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/blueprints/chart-test/files/tests/units/__path__/__test__.js:
--------------------------------------------------------------------------------
1 | import {
2 | moduleForComponent,
3 | test
4 | } from 'ember-qunit';
5 |
6 | moduleForComponent('<%= dasherizedModuleName %>', '<%= camelizedModuleName %>', {
7 | needs: [ 'component:high-charts' ]
8 | });
9 |
10 | test('it renders', function(assert) {
11 | assert.expect(2);
12 |
13 | // creates the component instance
14 | let component = this.subject();
15 | assert.equal(component._state, 'preRender');
16 |
17 | // appends the component to the page
18 | this.render(assert);
19 | assert.equal(component._state, 'inDOM');
20 | });
21 |
--------------------------------------------------------------------------------
/tests/helpers/start-app.js:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 | import Application from '../../app';
3 | import Router from '../../router';
4 | import config from '../../config/environment';
5 |
6 | export default function startApp(attrs) {
7 | var application;
8 |
9 | var attributes = Ember.merge({}, config.APP);
10 | attributes = Ember.merge(attributes, attrs); // use defaults, but you can override;
11 |
12 | Ember.run(function() {
13 | application = Application.create(attributes);
14 | application.setupForTesting();
15 | application.injectTestHelpers();
16 | });
17 |
18 | return application;
19 | }
20 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # editorconfig.org
4 |
5 | root = true
6 |
7 |
8 | [*]
9 | end_of_line = lf
10 | charset = utf-8
11 | trim_trailing_whitespace = true
12 | insert_final_newline = true
13 | indent_style = space
14 | indent_size = 2
15 |
16 | [*.js]
17 | indent_style = space
18 | indent_size = 2
19 |
20 | [*.hbs]
21 | indent_style = space
22 | indent_size = 2
23 |
24 | [*.css]
25 | indent_style = space
26 | indent_size = 2
27 |
28 | [*.html]
29 | indent_style = space
30 | indent_size = 2
31 |
32 | [*.{diff,md}]
33 | trim_trailing_whitespace = false
34 |
--------------------------------------------------------------------------------
/tests/dummy/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "predef": [
3 | "document",
4 | "window",
5 | "-Promise"
6 | ],
7 | "browser" : true,
8 | "boss" : true,
9 | "curly": true,
10 | "debug": false,
11 | "devel": true,
12 | "eqeqeq": true,
13 | "evil": true,
14 | "forin": false,
15 | "immed": false,
16 | "laxbreak": false,
17 | "newcap": true,
18 | "noarg": true,
19 | "noempty": false,
20 | "nonew": false,
21 | "nomen": false,
22 | "onevar": false,
23 | "plusplus": false,
24 | "regexp": false,
25 | "undef": true,
26 | "sub": true,
27 | "strict": false,
28 | "white": false,
29 | "eqnull": true,
30 | "esnext": true,
31 | "unused": true
32 | }
33 |
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "predef": [
3 | "document",
4 | "window",
5 | "-Promise",
6 | "Highcharts"
7 | ],
8 | "browser": true,
9 | "boss": true,
10 | "curly": true,
11 | "debug": false,
12 | "devel": true,
13 | "eqeqeq": true,
14 | "evil": true,
15 | "forin": false,
16 | "immed": false,
17 | "laxbreak": false,
18 | "newcap": true,
19 | "noarg": true,
20 | "noempty": false,
21 | "nonew": false,
22 | "nomen": false,
23 | "onevar": false,
24 | "plusplus": false,
25 | "regexp": false,
26 | "undef": true,
27 | "sub": true,
28 | "strict": false,
29 | "white": false,
30 | "eqnull": true,
31 | "esnext": true,
32 | "unused": true
33 | }
34 |
--------------------------------------------------------------------------------
/tests/dummy/public/crossdomain.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
15 |
16 |
--------------------------------------------------------------------------------
/tests/dummy/app/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Dummy
7 |
8 |
9 |
10 | {{content-for 'head'}}
11 |
12 |
13 |
14 |
15 | {{content-for 'head-footer'}}
16 |
17 |
18 | {{content-for 'body'}}
19 |
20 |
21 |
22 |
23 | {{content-for 'body-footer'}}
24 |
25 |
26 |
--------------------------------------------------------------------------------
/addon/utils/option-loader.js:
--------------------------------------------------------------------------------
1 | var localConfig = null;
2 |
3 | export function setDefaultHighChartOptions(container) {
4 | if (!localConfig) {
5 | // use options defined in highcharts-config if they exist in the container
6 | var localConfigBuilder = container.lookup('highcharts-config:application');
7 | if (localConfigBuilder) {
8 | localConfig = localConfigBuilder(defaultOptions);
9 | } else {
10 | localConfig = defaultOptions;
11 | }
12 | }
13 |
14 | Highcharts.setOptions(localConfig);
15 | }
16 |
17 | var defaultOptions = {
18 | plotOptions: {
19 | series: {
20 | shadow: false
21 | }
22 | },
23 |
24 | global: {
25 | timezoneOffset: new Date().getTimezoneOffset()
26 | },
27 |
28 | credits: {
29 | enabled: false
30 | }
31 | };
32 |
--------------------------------------------------------------------------------
/Brocfile.js:
--------------------------------------------------------------------------------
1 | /* jshint node: true */
2 | /* global require, module */
3 |
4 | var EmberAddon = require('ember-cli/lib/broccoli/ember-addon');
5 |
6 | var app = new EmberAddon({
7 | emberHighCharts: {
8 | includeHighCharts: false,
9 | includeHighStock: true
10 | }
11 | });
12 |
13 | // Use `app.import` to add additional libraries to the generated
14 | // output files.
15 | //
16 | // If you need to use different assets in different
17 | // environments, specify an object as the first parameter. That
18 | // object's keys should be the environment name and the values
19 | // should be the asset to use in that environment.
20 | //
21 | // If the library that you are including contains AMD or ES6
22 | // modules that you would like to import into your application
23 | // please specify an object with the list of modules as keys
24 | // along with the exports of each module as its value.
25 |
26 | module.exports = app.toTree();
27 |
--------------------------------------------------------------------------------
/tests/dummy/app/controllers/application.js:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 | import stockData from '../data/stock';
3 | import defaultTheme from '../themes/default-theme';
4 |
5 | export default Ember.Controller.extend({
6 | chartOptions: {
7 | chart: {
8 | type: 'bar'
9 | },
10 | title: {
11 | text: 'Fruit Consumption'
12 | },
13 | xAxis: {
14 | categories: ['Apples', 'Bananas', 'Oranges']
15 | },
16 | yAxis: {
17 | title: {
18 | text: 'Fruit eaten'
19 | }
20 | }
21 | },
22 | chartData: [{
23 | name: 'Jane',
24 | data: [1, 0, 4]
25 | }, {
26 | name: 'John',
27 | data: [5, 7, 3]
28 | }],
29 |
30 | stockChartOptions: {
31 | rangeSelector: {
32 | selected: 1
33 | },
34 | title: {
35 | text: 'Highstock: AAPL Stock Price'
36 | }
37 | },
38 |
39 | stockChartData: [{
40 | name: 'AAPL',
41 | data: stockData
42 | }],
43 |
44 | theme: defaultTheme
45 | });
46 |
--------------------------------------------------------------------------------
/tests/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "predef": [
3 | "document",
4 | "window",
5 | "location",
6 | "setTimeout",
7 | "$",
8 | "-Promise",
9 | "define",
10 | "console",
11 | "visit",
12 | "exists",
13 | "fillIn",
14 | "click",
15 | "keyEvent",
16 | "triggerEvent",
17 | "find",
18 | "findWithAssert",
19 | "wait",
20 | "DS",
21 | "andThen",
22 | "currentURL",
23 | "currentPath",
24 | "currentRouteName"
25 | ],
26 | "node": false,
27 | "browser": false,
28 | "boss": true,
29 | "curly": false,
30 | "debug": false,
31 | "devel": false,
32 | "eqeqeq": true,
33 | "evil": true,
34 | "forin": false,
35 | "immed": false,
36 | "laxbreak": false,
37 | "newcap": true,
38 | "noarg": true,
39 | "noempty": false,
40 | "nonew": false,
41 | "nomen": false,
42 | "onevar": false,
43 | "plusplus": false,
44 | "regexp": false,
45 | "undef": true,
46 | "sub": true,
47 | "strict": false,
48 | "white": false,
49 | "eqnull": true,
50 | "esnext": true
51 | }
52 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
10 |
--------------------------------------------------------------------------------
/tests/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Dummy Tests
7 |
8 |
9 |
10 | {{content-for 'head'}}
11 | {{content-for 'test-head'}}
12 |
13 |
14 |
15 |
16 |
17 | {{content-for 'head-footer'}}
18 | {{content-for 'test-head-footer'}}
19 |
20 |
21 |
22 | {{content-for 'body'}}
23 | {{content-for 'test-body'}}
24 |
25 |
26 |
27 |
28 |
29 |
30 | {{content-for 'body-footer'}}
31 | {{content-for 'test-body-footer'}}
32 |
33 |
34 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | ## 0.1.4
4 |
5 | - [Doc] How to add solid gauge chart
6 | - Add solid gauge chart module
7 |
8 | ## 0.1.3
9 |
10 | - [DOC] How to override chart redrawing
11 | - Added Highcharts-more
12 |
13 | ## 0.1.2
14 |
15 | - Added chart blueprint
16 | - Added contributing guidelines
17 | - Added Highchart initializer to accept secondary argument
18 |
19 | ## 0.1.1
20 |
21 | - Fix ENOENT error on bower_components
22 | - Include Highcharts source to addon
23 |
24 | ## 0.1.0
25 |
26 | - Update Ember CLI to 0.2.0
27 | - es6ified component
28 | - Remove default chart styles
29 | - Add option to import chart theme
30 | - Make installation process more simple
31 | - Update project description
32 |
33 | ## 0.0.8
34 |
35 | - Fixed broken npm package.
36 |
37 | ## 0.0.7
38 |
39 | - Updated Ember CLI to `0.1.15`.
40 |
41 | ## 0.0.6
42 |
43 | - Updated tests.
44 | - Added Highstock demo to the dummy app.
45 |
46 | ## 0.0.5
47 |
48 | - Added an ability to use Highstock and Highmaps.
49 | - The addon no longer automatically imports the Highcharts Bower package, letting user import desired package manually.
50 |
--------------------------------------------------------------------------------
/tests/dummy/config/environment.js:
--------------------------------------------------------------------------------
1 | /* jshint node: true */
2 |
3 | module.exports = function(environment) {
4 | var ENV = {
5 | modulePrefix: 'dummy',
6 | environment: environment,
7 | baseURL: '/',
8 | locationType: 'auto',
9 | EmberENV: {
10 | FEATURES: {
11 | // Here you can enable experimental features on an ember canary build
12 | // e.g. 'with-controller': true
13 | }
14 | },
15 |
16 | APP: {
17 | // Here you can pass flags/options to your application instance
18 | // when it is created
19 | }
20 | };
21 |
22 | if (environment === 'development') {
23 | // ENV.APP.LOG_RESOLVER = true;
24 | // ENV.APP.LOG_ACTIVE_GENERATION = true;
25 | // ENV.APP.LOG_TRANSITIONS = true;
26 | // ENV.APP.LOG_TRANSITIONS_INTERNAL = true;
27 | // ENV.APP.LOG_VIEW_LOOKUPS = true;
28 | }
29 |
30 | if (environment === 'test') {
31 | // Testem prefers this...
32 | ENV.baseURL = '/';
33 | ENV.locationType = 'none';
34 |
35 | // keep test console output quieter
36 | ENV.APP.LOG_ACTIVE_GENERATION = false;
37 | ENV.APP.LOG_VIEW_LOOKUPS = false;
38 |
39 | ENV.APP.rootElement = '#ember-testing';
40 | }
41 |
42 | if (environment === 'production') {
43 | ENV.baseURL = '/ember-highcharts/';
44 | }
45 |
46 | return ENV;
47 | };
48 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ember-highcharts-extra",
3 | "version": "0.1.41",
4 | "description": "A Highcharts, HighStock and HighMaps component for ember cli extended with a solid gauge",
5 | "directories": {
6 | "doc": "doc",
7 | "test": "tests"
8 | },
9 | "scripts": {
10 | "start": "ember server",
11 | "build": "ember build",
12 | "test": "ember test"
13 | },
14 | "repository": "https://github.com/poetic/ember-highcharts-gauge",
15 | "engines": {
16 | "node": ">= 0.10.0"
17 | },
18 | "author": "",
19 | "license": "MIT",
20 | "dependencies": {
21 | "broccoli-babel-transpiler": "^4.0.1"
22 | },
23 | "devDependencies": {
24 | "broccoli-asset-rev": "^2.0.2",
25 | "ember-cli": "0.2.7",
26 | "ember-cli-app-version": "0.3.3",
27 | "ember-cli-babel": "^5.0.0",
28 | "ember-cli-content-security-policy": "^0.4.0",
29 | "ember-cli-dependency-checker": "^1.0.0",
30 | "ember-cli-htmlbars": "0.7.6",
31 | "ember-cli-ic-ajax": "~0.1.1",
32 | "ember-cli-inject-live-reload": "^1.3.0",
33 | "ember-cli-qunit": "0.3.13",
34 | "ember-cli-uglify": "^1.0.1",
35 | "ember-data": "1.0.0-beta.17",
36 | "ember-export-application-global": "^1.0.2",
37 | "express": "^4.12.4",
38 | "glob": "^4.5.3"
39 | },
40 | "keywords": [
41 | "ember-addon",
42 | "highcharts",
43 | "ember-highcharts",
44 | "charts"
45 | ],
46 | "ember-addon": {
47 | "configPath": "tests/dummy/config"
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/tests/unit/components/high-charts-test.js:
--------------------------------------------------------------------------------
1 | import {
2 | moduleForComponent,
3 | test
4 | } from 'ember-qunit';
5 | import { initialize } from '../../../initializers/highcharts';
6 |
7 | moduleForComponent('high-charts', 'HighChartsComponent', {
8 | // specify the other units that are required for this test
9 | needs: [ 'highcharts-config:application' ],
10 | beforeEach: function() {
11 | let container = this.container;
12 | initialize(container);
13 | }
14 | });
15 |
16 | test('it renders', function(assert) {
17 | assert.expect(2);
18 |
19 | // creates the component instance
20 | let component = this.subject();
21 | assert.equal(component._state, 'preRender');
22 |
23 | // appends the component to the page
24 | this.render(assert);
25 | assert.equal(component._state, 'inDOM');
26 | });
27 |
28 | test('has default options', function(assert) {
29 | assert.expect(1);
30 |
31 | this.render();
32 | let credit = this.$().find(':contains(Highcharts.com)');
33 |
34 | assert.equal(credit.length, 0, 'Highcharts default credits not present');
35 | });
36 |
37 | test('has local options', function(assert) {
38 | assert.expect(1);
39 |
40 | this.render();
41 | let credit = this.$().find(':contains(ember-highcharts-configured-title)');
42 |
43 | assert.notEqual(credit.length, 0, 'ember-highcharts-configured-title credits present');
44 | });
45 |
46 |
47 | test('Highstock has navigator', function(assert) {
48 | this.subject({
49 | mode: 'StockChart',
50 | chartOptions: {
51 | rangeSelector: {
52 | selected: 1
53 | },
54 | title: {
55 | text: 'AAPL Stock Price'
56 | }
57 | },
58 | content: [{
59 | name: 'AAPL',
60 | data: [
61 | [1147651200000, 67.79],
62 | [1147737600000, 64.98],
63 | [1147824000000, 65.26]
64 | ]
65 | }]
66 | });
67 | var element = this.render();
68 | var navigator = this.$().find('.highcharts-navigator');
69 | assert.notEqual(navigator.length, 0, '.highcharts-navigator present');
70 | });
71 |
--------------------------------------------------------------------------------
/tests/dummy/app/themes/default-theme.js:
--------------------------------------------------------------------------------
1 | export default {
2 | colors: [
3 | '#258be2',
4 | '#666666',
5 | '#f45b5b',
6 | '#8085e9',
7 | '#8d4654',
8 | '#7798bf',
9 | '#aaeeee',
10 | '#ff0066',
11 | '#eeaaee',
12 | '#55bf3b',
13 | '#df5353',
14 | '#7798bf',
15 | '#aaeeee'
16 | ],
17 | chart: {
18 | backgroundColor: null,
19 | style: {
20 | fontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"
21 | }
22 | },
23 | title: {
24 | style: {
25 | color: 'black',
26 | //fontSize: '18px',
27 | fontWeight: 'bold'
28 | }
29 | },
30 | subtitle: {
31 | style: {
32 | color: 'black'
33 | }
34 | },
35 | tooltip: {
36 | borderWidth: 0,
37 | style: {
38 | fontSize: '16px'
39 | }
40 | },
41 | legend: {
42 | itemStyle: {
43 | fontWeight: 'bold',
44 | fontSize: '14px'
45 | }
46 | },
47 | xAxis: {
48 | labels: {
49 | style: {
50 | color: '#6e6e70',
51 | fontSize: '16px'
52 | }
53 | },
54 | title: {
55 | style: {
56 | fontSize: '14px'
57 | }
58 | }
59 | },
60 | yAxis: {
61 | labels: {
62 | style: {
63 | color: '#6e6e70',
64 | fontSize: '16px'
65 | }
66 | },
67 | title: {
68 | style: {
69 | fontSize: '14px'
70 | }
71 | }
72 | },
73 | plotOptions: {
74 | series: {
75 | shadow: true
76 | },
77 | candlestick: {
78 | lineColor: '#404048'
79 | }
80 | },
81 | navigator: {
82 | xAxis: {
83 | gridLineColor: '#D0D0D8'
84 | }
85 | },
86 | rangeSelector: {
87 | buttonTheme: {
88 | fill: 'white',
89 | stroke: '#C0C0C8',
90 | 'stroke-width': 1,
91 | states: {
92 | select: {
93 | fill: '#D0D0D8'
94 | }
95 | }
96 | }
97 | },
98 | scrollbar: {
99 | trackBorderColor: '#C0C0C8'
100 | },
101 | background2: '#E0E0E8',
102 | global: {
103 | timezoneOffset: new Date().getTimezoneOffset()
104 | },
105 | credits: {
106 | enabled: false
107 | }
108 | };
109 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | /* jshint node: true */
2 | 'use strict';
3 |
4 | module.exports = {
5 | name: 'ember-highcharts-extra',
6 |
7 | setupPreprocessorRegistry: function(type, registry) {
8 | var options = getOptions(this.parent && this.parent.options && this.parent.options['babel']);
9 |
10 | var plugin = {
11 | name : 'ember-cli-babel',
12 | ext : 'js',
13 | toTree : function(tree) {
14 | return require('broccoli-babel-transpiler')(tree, options);
15 | }
16 | };
17 |
18 | registry.add('js', plugin);
19 | },
20 |
21 | included: function(app) {
22 | this._super.included(app);
23 |
24 | var options = app.options.emberHighCharts || {includeHighCharts: true};
25 |
26 | if (options.includeHighCharts || options.includeHighCharts3D) {
27 | app.import('vendor/highcharts-release/highcharts.src.js');
28 | }
29 |
30 | if (options.includeHighStock) {
31 | app.import('vendor/highstock-release/highstock.src.js');
32 | }
33 |
34 | if (options.includeHighMaps) {
35 | app.import('vendor/highmaps-release/highmaps.src.js');
36 | }
37 |
38 | if (options.includeHighChartsMore) {
39 | app.import('vendor/highcharts-more-release/highcharts-more.src.js');
40 | }
41 |
42 | if (options.includeHighCharts3D){
43 | app.import('vendor/highcharts-3d-release/highcharts-3d.src.js');
44 | }
45 |
46 | if (options.includeSolidGauge) {
47 | app.import('vendor/modules/solid-gauge.js');
48 | }
49 |
50 | }
51 | };
52 |
53 | function getOptions(options) {
54 | options = options || {};
55 |
56 | // Ensure modules aren't compiled unless explicitly set to compile
57 | options.blacklist = options.blacklist || ['es6.modules'];
58 |
59 | if (options.compileModules === true) {
60 | if (options.blacklist.indexOf('es6.modules') >= 0) {
61 | options.blacklist.splice(options.blacklist.indexOf('es6.modules'), 1);
62 | }
63 |
64 | delete options.compileModules;
65 | } else {
66 | if (options.blacklist.indexOf('es6.modules') < 0) {
67 | options.blacklist.push('es6.modules');
68 | }
69 | }
70 |
71 | // Ember-CLI inserts its own 'use strict' directive
72 | options.blacklist.push('useStrict');
73 |
74 | return options;
75 | }
76 |
--------------------------------------------------------------------------------
/addon/components/high-charts.js:
--------------------------------------------------------------------------------
1 | import Ember from 'ember';
2 | import { setDefaultHighChartOptions } from '../utils/option-loader';
3 |
4 | const {
5 | computed,
6 | get,
7 | set,
8 | merge,
9 | on,
10 | observer,
11 | run
12 | } = Ember;
13 |
14 | export default Ember.Component.extend({
15 | classNames: ['highcharts-wrapper'],
16 | content: undefined,
17 | mode: undefined,
18 | chartOptions: undefined,
19 | chart: null,
20 | theme: undefined,
21 | callback: undefined,
22 |
23 | buildOptions: computed('chartOptions', 'content.@each.isLoaded', function() {
24 | let chartOptions = Ember.$.extend(true, {}, get(this, 'theme'), get(this, 'chartOptions'));
25 | let chartContent = get(this, 'content.length') ? get(this, 'content') : [{
26 | id : 'noData',
27 | data : 0,
28 | color : '#aaaaaa'
29 | }];
30 |
31 | let defaults = { series: chartContent };
32 |
33 | return merge(defaults, chartOptions);
34 | }),
35 |
36 | contentDidChange: observer('content.@each.isLoaded', function() {
37 | if (!(get(this, 'content') && get(this, 'chart'))) {
38 | return;
39 | }
40 |
41 | let chart = get(this, 'chart');
42 | let noData = chart.get('noData');
43 |
44 | if (noData != null) {
45 | noData.remove();
46 | }
47 |
48 | return get(this, 'content').forEach((series, idx) => {
49 | if (chart.series[idx]) {
50 | return chart.series[idx].setData(series.data);
51 | } else {
52 | return chart.addSeries(series);
53 | }
54 | });
55 | }),
56 |
57 | drawAfterRender() {
58 | run.scheduleOnce('afterRender', this, 'draw');
59 | },
60 |
61 | draw() {
62 | let completeChartOptions = [ get(this, 'buildOptions'), get(this, 'callback') ];
63 | let mode = get(this, 'mode');
64 |
65 | if (typeof mode === 'string' && !!mode) {
66 | completeChartOptions.unshift(mode);
67 | }
68 |
69 | let $element = this.$();
70 | let chart = $element.highcharts.apply($element, completeChartOptions).highcharts();
71 |
72 | set(this, 'chart', chart);
73 | },
74 |
75 | _renderChart: on('didInsertElement', function() {
76 | this.drawAfterRender();
77 | setDefaultHighChartOptions(this.container);
78 | }),
79 |
80 | _destroyChart: on('willDestroyElement', function() {
81 | this._super();
82 |
83 | let chart = get(this, 'chart');
84 |
85 | if(chart !== null){
86 | chart.destroy();
87 | }
88 | })
89 | });
90 |
--------------------------------------------------------------------------------
/vendor/modules/solid-gauge.js:
--------------------------------------------------------------------------------
1 | /*
2 | Highcharts JS v4.1.7 (2015-06-26)
3 | Solid angular gauge module
4 |
5 | (c) 2010-2014 Torstein Honsi
6 |
7 | License: www.highcharts.com/license
8 | */
9 | (function(a){var q=a.getOptions().plotOptions,r=a.pInt,s=a.pick,j=a.each,k;q.solidgauge=a.merge(q.gauge,{colorByPoint:!0});k={initDataClasses:function(b){var c=this,e=this.chart,d,o=0,f=this.options;this.dataClasses=d=[];j(b.dataClasses,function(g,h){var p,g=a.merge(g);d.push(g);if(!g.color)f.dataClassColor==="category"?(p=e.options.colors,g.color=p[o++],o===p.length&&(o=0)):g.color=c.tweenColors(a.Color(f.minColor),a.Color(f.maxColor),h/(b.dataClasses.length-1))})},initStops:function(b){this.stops=
10 | b.stops||[[0,this.options.minColor],[1,this.options.maxColor]];j(this.stops,function(b){b.color=a.Color(b[1])})},toColor:function(b,c){var e,d=this.stops,a,f=this.dataClasses,g,h;if(f)for(h=f.length;h--;){if(g=f[h],a=g.from,d=g.to,(a===void 0||b>=a)&&(d===void 0||b<=d)){e=g.color;if(c)c.dataClass=h;break}}else{this.isLog&&(b=this.val2lin(b));e=1-(this.max-b)/(this.max-this.min);for(h=d.length;h--;)if(e>d[h][0])break;a=d[h]||d[h+1];d=d[h+1]||a;e=1-(d[0]-e)/(d[0]-a[0]||1);e=this.tweenColors(a.color,
11 | d.color,e)}return e},tweenColors:function(b,c,a){var d;!c.rgba.length||!b.rgba.length?b=c.raw||"none":(b=b.rgba,c=c.rgba,d=c[3]!==1||b[3]!==1,b=(d?"rgba(":"rgb(")+Math.round(c[0]+(b[0]-c[0])*(1-a))+","+Math.round(c[1]+(b[1]-c[1])*(1-a))+","+Math.round(c[2]+(b[2]-c[2])*(1-a))+(d?","+(c[3]+(b[3]-c[3])*(1-a)):"")+")");return b}};j(["fill","stroke"],function(b){HighchartsAdapter.addAnimSetter(b,function(c){c.elem.attr(b,k.tweenColors(a.Color(c.start),a.Color(c.end),c.pos))})});a.seriesTypes.solidgauge=
12 | a.extendClass(a.seriesTypes.gauge,{type:"solidgauge",pointAttrToOptions:{},bindAxes:function(){var b;a.seriesTypes.gauge.prototype.bindAxes.call(this);b=this.yAxis;a.extend(b,k);b.options.dataClasses&&b.initDataClasses(b.options);b.initStops(b.options)},drawPoints:function(){var b=this,c=b.yAxis,e=c.center,d=b.options,o=b.chart.renderer,f=d.overshoot,g=f&&typeof f==="number"?f/180*Math.PI:0;a.each(b.points,function(a){var f=a.graphic,i=c.startAngleRad+c.translate(a.y,null,null,null,!0),j=r(s(a.options.radius,
13 | d.radius,100))*e[2]/200,l=r(s(a.options.innerRadius,d.innerRadius,60))*e[2]/200,m=c.toColor(a.y,a);m==="none"&&(m=a.color||b.color||"none");if(m!=="none")a.color=m;i=Math.max(c.startAngleRad-g,Math.min(c.endAngleRad+g,i));d.wrap===!1&&(i=Math.max(c.startAngleRad,Math.min(c.endAngleRad,i)));var i=i*180/Math.PI,n=i/(180/Math.PI),k=c.startAngleRad,i=Math.min(n,k),n=Math.max(n,k);n-i>2*Math.PI&&(n=i+2*Math.PI);a.shapeArgs=l={x:e[0],y:e[1],r:j,innerR:l,start:i,end:n,fill:m};a.startR=j;if(f){if(a=l.d,f.animate(l),
14 | a)l.d=a}else a.graphic=o.arc(l).attr({stroke:d.borderColor||"none","stroke-width":d.borderWidth||0,fill:m,"sweep-flag":0}).add(b.group)})},animate:function(b){if(!b)this.startAngleRad=this.yAxis.startAngleRad,a.seriesTypes.pie.prototype.animate.call(this,b)}})})(Highcharts);
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Ember-highcharts-gauge
2 |
3 | A [Highcharts](http://www.highcharts.com/products/highcharts), [Highstock](http://www.highcharts.com/products/highstock) and [Highmaps](http://www.highcharts.com/products/highmaps) component for [Ember CLI](http://www.ember-cli.com/).
4 |
5 | ## Installation
6 |
7 | ```
8 | ember install:addon ember-highcharts-extra
9 | ```
10 |
11 | This addon will use Highcharts by default, if you want to use Highstocks, Highmaps, Highcharts-more and/or Highcharts-3D, add this options to your `Brocfile.js`:
12 |
13 | ```javascript
14 | var app = new EmberApp({
15 | ---
16 | emberHighCharts: {
17 | includeHighCharts: false,
18 | includeHighStock: true,
19 | includeHighMaps: true,
20 | includeHighChartsMore: true,
21 | includeHighCharts3D: true,
22 | includeSolidGauge: true,
23 | }
24 | ---
25 | });
26 | ```
27 |
28 | ## Usage
29 |
30 | In your template:
31 |
32 | ```handlebars
33 | {{high-charts mode=chartMode content=chartData chartOptions=chartOptions theme=theme}}
34 | ```
35 |
36 | Then in a controller you can set the `chartMode`, `chartData`, `chartOptions` and `theme` values:
37 |
38 | ```javascript
39 | import Ember from 'ember';
40 | import defaultTheme from '../themes/default-theme';
41 |
42 | export default Ember.Controller.extend({
43 | chartMode: 'StockChart', // Available options: a falsy value, 'StockChart', 'Map'.
44 | // If `mode` is not provided or is a falsy value, the chart is initialized in Charts mode.
45 | // If `mode` is a string, it is passed to Highcharts as the first argument.
46 | // When Highcharts introduces a new mode, you will be able to use it here right away.
47 |
48 | chartOptions: {
49 | chart: {
50 | type: 'bar'
51 | },
52 | title: {
53 | text: 'Fruit Consumption'
54 | },
55 | xAxis: {
56 | categories: ['Apples', 'Bananas', 'Oranges']
57 | },
58 | yAxis: {
59 | title: {
60 | text: 'Fruit eaten'
61 | }
62 | }
63 | },
64 |
65 | chartData: [
66 | {
67 | name: 'Jane',
68 | data: [1, 0, 4]
69 | }, {
70 | name: 'John',
71 | data: [5, 7, 3]
72 | }
73 | ],
74 |
75 | theme: defaultTheme
76 | });
77 | ```
78 |
79 | ### Configuring Default Styles
80 |
81 | Ember-highcharts provides its own set of default configurations in
82 | `addon/utils/option-loader.js`. At runtime you can optionally configure custom
83 | styles by providing a `app/highcharts-configs/application.js` file. This
84 | file should provide a hook that returns the final configuration.
85 |
86 | ```javascript
87 | // app/highcharts-configs/application.js
88 |
89 | export default function(defaultOptions) {
90 | defaultOptions.credits.href = 'http://www.my-great-chart.com';
91 | defaultOptions.credits.text = 'great charts made cheap';
92 | defaultOptions.credits.enabled = true;
93 |
94 | return defaultOptions;
95 | }
96 | ```
97 |
98 | ### Generating Chart Components
99 |
100 | Ember-highcharts also provides blueprints to easily create sub-classes of the default high-charts component.
101 |
102 | ```bash
103 | ember generate chart
104 | ```
105 |
106 | ### Overriding Chart Redrawing
107 |
108 | This addon observes changes to chartData and redraws the chart using the highcharts
109 | [Series.setData](http://api.highcharts.com/highcharts#Series.setData) method. You can extend this
110 | component to handle advanced redrawing use cases like dynamically updating labels and titles
111 | (ex: [Chart.setTitle()](http://api.highcharts.com/highcharts#Chart.setTitle)).
112 |
113 | ```javascript
114 | // components/dynamic-high-charts.js
115 | import Ember from 'ember';
116 | import EmberHighChartsComponent from 'ember-highcharts/components/high-charts';
117 |
118 | export default EmberHighChartsComponent.extend({
119 |
120 | contentDidChange: Ember.observer('content.@each.isLoaded', function() {
121 | // add redraw logic here. ex:
122 | var chart = this.get('chart');
123 | var seriesName = this.get('content')[0].name;
124 | chart.series[0].update({ name: seriesName, data: this.get('content')[0].data }, false);
125 | chart.setTitle(null, { text: seriesName }, false);
126 | chart.redraw();
127 | })
128 |
129 | });
130 | ```
131 |
132 | ```handlebars
133 | {{dynamic-high-charts mode=chartMode content=chartData chartOptions=chartOptions theme=theme}}
134 | ```
135 |
136 | ## Contributing
137 |
138 | see [contributing guidelines](contributing.md).
139 |
140 | ## Changelog
141 |
142 | see [CHANGELOG.md](CHANGELOG.md).
143 |
144 | ## Credit
145 |
146 | This add-on is built based on the [gist](https://gist.github.com/poteto/cd2bb47e77bf87c94d33) and [medium](https://medium.com/delightful-ui-for-ember-apps/using-highcharts-js-in-an-ember-app-18a65d611644) by [@poteto](https://github.com/poteto)
147 |
--------------------------------------------------------------------------------
/vendor/highcharts-3d-release/highcharts-3d.src.js:
--------------------------------------------------------------------------------
1 | // ==ClosureCompiler==
2 | // @compilation_level SIMPLE_OPTIMIZATIONS
3 |
4 | /**
5 | * @license Highcharts JS v4.1.7 (2015-06-26)
6 | *
7 | * (c) 2009-2013 Torstein Hønsi
8 | *
9 | * License: www.highcharts.com/license
10 | */
11 |
12 | // JSLint options:
13 | /*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console */
14 |
15 | (function (Highcharts) {
16 | /**
17 | Shorthands for often used function
18 | */
19 | /**
20 | * Mathematical Functionility
21 | */
22 | var PI = Math.PI,
23 | deg2rad = (PI / 180), // degrees to radians
24 | sin = Math.sin,
25 | cos = Math.cos,
26 | pick = Highcharts.pick,
27 | round = Math.round;
28 |
29 | /**
30 | * Transforms a given array of points according to the angles in chart.options.
31 | * Parameters:
32 | * - points: the array of points
33 | * - chart: the chart
34 | * - insidePlotArea: wether to verifiy the points are inside the plotArea
35 | * Returns:
36 | * - an array of transformed points
37 | */
38 | function perspective(points, chart, insidePlotArea) {
39 | var options3d = chart.options.chart.options3d,
40 | inverted = false,
41 | origin;
42 |
43 | if (insidePlotArea) {
44 | inverted = chart.inverted;
45 | origin = {
46 | x: chart.plotWidth / 2,
47 | y: chart.plotHeight / 2,
48 | z: options3d.depth / 2,
49 | vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)
50 | };
51 | } else {
52 | origin = {
53 | x: chart.plotLeft + (chart.plotWidth / 2),
54 | y: chart.plotTop + (chart.plotHeight / 2),
55 | z: options3d.depth / 2,
56 | vd: pick(options3d.depth, 1) * pick(options3d.viewDistance, 0)
57 | };
58 | }
59 |
60 | var result = [],
61 | xe = origin.x,
62 | ye = origin.y,
63 | ze = origin.z,
64 | vd = origin.vd,
65 | angle1 = deg2rad * (inverted ? options3d.beta : -options3d.beta),
66 | angle2 = deg2rad * (inverted ? -options3d.alpha : options3d.alpha),
67 | s1 = sin(angle1),
68 | c1 = cos(angle1),
69 | s2 = sin(angle2),
70 | c2 = cos(angle2);
71 |
72 | var x, y, z, px, py, pz;
73 |
74 | // Transform each point
75 | Highcharts.each(points, function (point) {
76 | x = (inverted ? point.y : point.x) - xe;
77 | y = (inverted ? point.x : point.y) - ye;
78 | z = (point.z || 0) - ze;
79 |
80 | //Apply 3-D rotation
81 | px = c1 * x - s1 * z;
82 | py = -s1 * s2 * x - c1 * s2 * z + c2 * y;
83 | pz = s1 * c2 * x + c1 * c2 * z + s2 * y;
84 |
85 | //Apply perspective
86 | if ((vd > 0) && (vd < Number.POSITIVE_INFINITY)) {
87 | px = px * (vd / (pz + ze + vd));
88 | py = py * (vd / (pz + ze + vd));
89 | }
90 |
91 | //Apply translation
92 | px = px + xe;
93 | py = py + ye;
94 | pz = pz + ze;
95 |
96 | result.push({
97 | x: (inverted ? py : px),
98 | y: (inverted ? px : py),
99 | z: pz
100 | });
101 | });
102 | return result;
103 | }
104 | // Make function acessible to plugins
105 | Highcharts.perspective = perspective;
106 | /***
107 | EXTENSION TO THE SVG-RENDERER TO ENABLE 3D SHAPES
108 | ***/
109 | ////// HELPER METHODS //////
110 | var dFactor = (4 * (Math.sqrt(2) - 1) / 3) / (PI / 2);
111 |
112 | function defined(obj) {
113 | return obj !== undefined && obj !== null;
114 | }
115 |
116 | //Shoelace algorithm -- http://en.wikipedia.org/wiki/Shoelace_formula
117 | function shapeArea(vertexes) {
118 | var area = 0,
119 | i,
120 | j;
121 | for (i = 0; i < vertexes.length; i++) {
122 | j = (i + 1) % vertexes.length;
123 | area += vertexes[i].x * vertexes[j].y - vertexes[j].x * vertexes[i].y;
124 | }
125 | return area / 2;
126 | }
127 |
128 | function averageZ(vertexes) {
129 | var z = 0,
130 | i;
131 | for (i = 0; i < vertexes.length; i++) {
132 | z += vertexes[i].z;
133 | }
134 | return vertexes.length ? z / vertexes.length : 0;
135 | }
136 |
137 | /** Method to construct a curved path
138 | * Can 'wrap' around more then 180 degrees
139 | */
140 | function curveTo(cx, cy, rx, ry, start, end, dx, dy) {
141 | var result = [];
142 | if ((end > start) && (end - start > PI / 2 + 0.0001)) {
143 | result = result.concat(curveTo(cx, cy, rx, ry, start, start + (PI / 2), dx, dy));
144 | result = result.concat(curveTo(cx, cy, rx, ry, start + (PI / 2), end, dx, dy));
145 | return result;
146 | } else if ((end < start) && (start - end > PI / 2 + 0.0001)) {
147 | result = result.concat(curveTo(cx, cy, rx, ry, start, start - (PI / 2), dx, dy));
148 | result = result.concat(curveTo(cx, cy, rx, ry, start - (PI / 2), end, dx, dy));
149 | return result;
150 | } else {
151 | var arcAngle = end - start;
152 | return [
153 | 'C',
154 | cx + (rx * cos(start)) - ((rx * dFactor * arcAngle) * sin(start)) + dx,
155 | cy + (ry * sin(start)) + ((ry * dFactor * arcAngle) * cos(start)) + dy,
156 | cx + (rx * cos(end)) + ((rx * dFactor * arcAngle) * sin(end)) + dx,
157 | cy + (ry * sin(end)) - ((ry * dFactor * arcAngle) * cos(end)) + dy,
158 |
159 | cx + (rx * cos(end)) + dx,
160 | cy + (ry * sin(end)) + dy
161 | ];
162 | }
163 | }
164 |
165 | Highcharts.SVGRenderer.prototype.toLinePath = function (points, closed) {
166 | var result = [];
167 |
168 | // Put "L x y" for each point
169 | Highcharts.each(points, function (point) {
170 | result.push('L', point.x, point.y);
171 | });
172 |
173 | if (points.length) {
174 | // Set the first element to M
175 | result[0] = 'M';
176 |
177 | // If it is a closed line, add Z
178 | if (closed) {
179 | result.push('Z');
180 | }
181 | }
182 |
183 | return result;
184 | };
185 |
186 | ////// CUBOIDS //////
187 | Highcharts.SVGRenderer.prototype.cuboid = function (shapeArgs) {
188 |
189 | var result = this.g(),
190 | paths = this.cuboidPath(shapeArgs);
191 |
192 | // create the 3 sides
193 | result.front = this.path(paths[0]).attr({zIndex: paths[3], 'stroke-linejoin': 'round'}).add(result);
194 | result.top = this.path(paths[1]).attr({zIndex: paths[4], 'stroke-linejoin': 'round'}).add(result);
195 | result.side = this.path(paths[2]).attr({zIndex: paths[5], 'stroke-linejoin': 'round'}).add(result);
196 |
197 | // apply the fill everywhere, the top a bit brighter, the side a bit darker
198 | result.fillSetter = function (color) {
199 | var c0 = color,
200 | c1 = Highcharts.Color(color).brighten(0.1).get(),
201 | c2 = Highcharts.Color(color).brighten(-0.1).get();
202 |
203 | this.front.attr({fill: c0});
204 | this.top.attr({fill: c1});
205 | this.side.attr({fill: c2});
206 |
207 | this.color = color;
208 | return this;
209 | };
210 |
211 | // apply opacaity everywhere
212 | result.opacitySetter = function (opacity) {
213 | this.front.attr({opacity: opacity});
214 | this.top.attr({opacity: opacity});
215 | this.side.attr({opacity: opacity});
216 | return this;
217 | };
218 |
219 | result.attr = function (args) {
220 | if (args.shapeArgs || defined(args.x)) {
221 | var shapeArgs = args.shapeArgs || args;
222 | var paths = this.renderer.cuboidPath(shapeArgs);
223 | this.front.attr({d: paths[0], zIndex: paths[3]});
224 | this.top.attr({d: paths[1], zIndex: paths[4]});
225 | this.side.attr({d: paths[2], zIndex: paths[5]});
226 | } else {
227 | Highcharts.SVGElement.prototype.attr.call(this, args);
228 | }
229 |
230 | return this;
231 | };
232 |
233 | result.animate = function (args, duration, complete) {
234 | if (defined(args.x) && defined(args.y)) {
235 | var paths = this.renderer.cuboidPath(args);
236 | this.front.attr({zIndex: paths[3]}).animate({d: paths[0]}, duration, complete);
237 | this.top.attr({zIndex: paths[4]}).animate({d: paths[1]}, duration, complete);
238 | this.side.attr({zIndex: paths[5]}).animate({d: paths[2]}, duration, complete);
239 | } else if (args.opacity) {
240 | this.front.animate(args, duration, complete);
241 | this.top.animate(args, duration, complete);
242 | this.side.animate(args, duration, complete);
243 | } else {
244 | Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete);
245 | }
246 | return this;
247 | };
248 |
249 | // destroy all children
250 | result.destroy = function () {
251 | this.front.destroy();
252 | this.top.destroy();
253 | this.side.destroy();
254 |
255 | return null;
256 | };
257 |
258 | // Apply the Z index to the cuboid group
259 | result.attr({ zIndex: -paths[3] });
260 |
261 | return result;
262 | };
263 |
264 | /**
265 | * Generates a cuboid
266 | */
267 | Highcharts.SVGRenderer.prototype.cuboidPath = function (shapeArgs) {
268 | var x = shapeArgs.x,
269 | y = shapeArgs.y,
270 | z = shapeArgs.z,
271 | h = shapeArgs.height,
272 | w = shapeArgs.width,
273 | d = shapeArgs.depth,
274 | chart = Highcharts.charts[this.chartIndex],
275 | map = Highcharts.map;
276 |
277 | // The 8 corners of the cube
278 | var pArr = [
279 | {x: x, y: y, z: z},
280 | {x: x + w, y: y, z: z},
281 | {x: x + w, y: y + h, z: z},
282 | {x: x, y: y + h, z: z},
283 | {x: x, y: y + h, z: z + d},
284 | {x: x + w, y: y + h, z: z + d},
285 | {x: x + w, y: y, z: z + d},
286 | {x: x, y: y, z: z + d}
287 | ];
288 |
289 | // apply perspective
290 | pArr = perspective(pArr, chart, shapeArgs.insidePlotArea);
291 |
292 | // helper method to decide which side is visible
293 | var pickShape = function (path1, path2) {
294 | path1 = map(path1, function (i) { return pArr[i]; });
295 | path2 = map(path2, function (i) { return pArr[i]; });
296 | if (shapeArea(path1) < 0) {
297 | return path1;
298 | } else if (shapeArea(path2) < 0) {
299 | return path2;
300 | } else {
301 | return [];
302 | }
303 | };
304 |
305 | // front or back
306 | var front = [3, 2, 1, 0];
307 | var back = [7, 6, 5, 4];
308 | var path1 = pickShape(front, back);
309 |
310 | // top or bottom
311 | var top = [1, 6, 7, 0];
312 | var bottom = [4, 5, 2, 3];
313 | var path2 = pickShape(top, bottom);
314 |
315 | // side
316 | var right = [1, 2, 5, 6];
317 | var left = [0, 7, 4, 3];
318 | var path3 = pickShape(right, left);
319 |
320 | return [this.toLinePath(path1, true), this.toLinePath(path2, true), this.toLinePath(path3, true), averageZ(path1), averageZ(path2), averageZ(path3)];
321 | };
322 |
323 | ////// SECTORS //////
324 | Highcharts.SVGRenderer.prototype.arc3d = function (shapeArgs) {
325 |
326 | shapeArgs.alpha *= deg2rad;
327 | shapeArgs.beta *= deg2rad;
328 | var result = this.g(),
329 | paths = this.arc3dPath(shapeArgs),
330 | renderer = result.renderer;
331 |
332 | var zIndex = paths.zTop * 100;
333 |
334 | result.shapeArgs = shapeArgs; // Store for later use
335 |
336 | // create the different sub sections of the shape
337 | result.top = renderer.path(paths.top).setRadialReference(shapeArgs.center).attr({zIndex: paths.zTop}).add(result);
338 | result.side1 = renderer.path(paths.side2).attr({zIndex: paths.zSide1});
339 | result.side2 = renderer.path(paths.side1).attr({zIndex: paths.zSide2});
340 | result.inn = renderer.path(paths.inn).attr({zIndex: paths.zInn});
341 | result.out = renderer.path(paths.out).attr({zIndex: paths.zOut});
342 |
343 | // apply the fill to the top and a darker shade to the sides
344 | result.fillSetter = function (color) {
345 | this.color = color;
346 |
347 | var c0 = color,
348 | c2 = Highcharts.Color(color).brighten(-0.1).get();
349 |
350 | this.side1.attr({fill: c2});
351 | this.side2.attr({fill: c2});
352 | this.inn.attr({fill: c2});
353 | this.out.attr({fill: c2});
354 | this.top.attr({fill: c0});
355 | return this;
356 | };
357 |
358 | // apply the translation to all
359 | result.translateXSetter = function (value) {
360 | this.out.attr({translateX: value});
361 | this.inn.attr({translateX: value});
362 | this.side1.attr({translateX: value});
363 | this.side2.attr({translateX: value});
364 | this.top.attr({translateX: value});
365 | };
366 |
367 | result.translateYSetter = function (value) {
368 | this.out.attr({translateY: value});
369 | this.inn.attr({translateY: value});
370 | this.side1.attr({translateY: value});
371 | this.side2.attr({translateY: value});
372 | this.top.attr({translateY: value});
373 | };
374 |
375 | result.animate = function (args, duration, complete) {
376 | if (defined(args.end) || defined(args.start)) {
377 | this._shapeArgs = this.shapeArgs;
378 |
379 | Highcharts.SVGElement.prototype.animate.call(this, {
380 | _args: args
381 | }, {
382 | duration: duration,
383 | step: function () {
384 | var args = arguments,
385 | fx = args[1],
386 | result = fx.elem,
387 | start = result._shapeArgs,
388 | end = fx.end,
389 | pos = fx.pos,
390 | sA = Highcharts.merge(start, {
391 | x: start.x + ((end.x - start.x) * pos),
392 | y: start.y + ((end.y - start.y) * pos),
393 | r: start.r + ((end.r - start.r) * pos),
394 | innerR: start.innerR + ((end.innerR - start.innerR) * pos),
395 | start: start.start + ((end.start - start.start) * pos),
396 | end: start.end + ((end.end - start.end) * pos)
397 | });
398 |
399 | var paths = result.renderer.arc3dPath(sA);
400 |
401 | result.shapeArgs = sA;
402 |
403 | result.top.attr({d: paths.top, zIndex: paths.zTop});
404 | result.inn.attr({d: paths.inn, zIndex: paths.zInn});
405 | result.out.attr({d: paths.out, zIndex: paths.zOut});
406 | result.side1.attr({d: paths.side1, zIndex: paths.zSide1});
407 | result.side2.attr({d: paths.side2, zIndex: paths.zSide2});
408 |
409 | }
410 | }, complete);
411 | } else {
412 | Highcharts.SVGElement.prototype.animate.call(this, args, duration, complete);
413 | }
414 | return this;
415 | };
416 |
417 | // destroy all children
418 | result.destroy = function () {
419 | this.top.destroy();
420 | this.out.destroy();
421 | this.inn.destroy();
422 | this.side1.destroy();
423 | this.side2.destroy();
424 |
425 | Highcharts.SVGElement.prototype.destroy.call(this);
426 | };
427 | // hide all children
428 | result.hide = function () {
429 | this.top.hide();
430 | this.out.hide();
431 | this.inn.hide();
432 | this.side1.hide();
433 | this.side2.hide();
434 | };
435 | result.show = function () {
436 | this.top.show();
437 | this.out.show();
438 | this.inn.show();
439 | this.side1.show();
440 | this.side2.show();
441 | };
442 | // show all children
443 | result.zIndex = zIndex;
444 | result.attr({zIndex: zIndex});
445 | return result;
446 | };
447 |
448 | /**
449 | * Generate the paths required to draw a 3D arc
450 | */
451 | Highcharts.SVGRenderer.prototype.arc3dPath = function (shapeArgs) {
452 | var cx = shapeArgs.x, // x coordinate of the center
453 | cy = shapeArgs.y, // y coordinate of the center
454 | start = shapeArgs.start, // start angle
455 | end = shapeArgs.end - 0.00001, // end angle
456 | r = shapeArgs.r, // radius
457 | ir = shapeArgs.innerR, // inner radius
458 | d = shapeArgs.depth, // depth
459 | alpha = shapeArgs.alpha, // alpha rotation of the chart
460 | beta = shapeArgs.beta; // beta rotation of the chart
461 |
462 | // Derived Variables
463 | var cs = cos(start), // cosinus of the start angle
464 | ss = sin(start), // sinus of the start angle
465 | ce = cos(end), // cosinus of the end angle
466 | se = sin(end), // sinus of the end angle
467 | rx = r * cos(beta), // x-radius
468 | ry = r * cos(alpha), // y-radius
469 | irx = ir * cos(beta), // x-radius (inner)
470 | iry = ir * cos(alpha), // y-radius (inner)
471 | dx = d * sin(beta), // distance between top and bottom in x
472 | dy = d * sin(alpha); // distance between top and bottom in y
473 |
474 | // TOP
475 | var top = ['M', cx + (rx * cs), cy + (ry * ss)];
476 | top = top.concat(curveTo(cx, cy, rx, ry, start, end, 0, 0));
477 | top = top.concat([
478 | 'L', cx + (irx * ce), cy + (iry * se)
479 | ]);
480 | top = top.concat(curveTo(cx, cy, irx, iry, end, start, 0, 0));
481 | top = top.concat(['Z']);
482 |
483 | // OUTSIDE
484 | var b = (beta > 0 ? PI / 2 : 0),
485 | a = (alpha > 0 ? 0 : PI / 2);
486 |
487 | var start2 = start > -b ? start : (end > -b ? -b : start),
488 | end2 = end < PI - a ? end : (start < PI - a ? PI - a : end);
489 |
490 | var out = ['M', cx + (rx * cos(start2)), cy + (ry * sin(start2))];
491 | out = out.concat(curveTo(cx, cy, rx, ry, start2, end2, 0, 0));
492 | out = out.concat([
493 | 'L', cx + (rx * cos(end2)) + dx, cy + (ry * sin(end2)) + dy
494 | ]);
495 | out = out.concat(curveTo(cx, cy, rx, ry, end2, start2, dx, dy));
496 | out = out.concat(['Z']);
497 |
498 | // INSIDE
499 | var inn = ['M', cx + (irx * cs), cy + (iry * ss)];
500 | inn = inn.concat(curveTo(cx, cy, irx, iry, start, end, 0, 0));
501 | inn = inn.concat([
502 | 'L', cx + (irx * cos(end)) + dx, cy + (iry * sin(end)) + dy
503 | ]);
504 | inn = inn.concat(curveTo(cx, cy, irx, iry, end, start, dx, dy));
505 | inn = inn.concat(['Z']);
506 |
507 | // SIDES
508 | var side1 = [
509 | 'M', cx + (rx * cs), cy + (ry * ss),
510 | 'L', cx + (rx * cs) + dx, cy + (ry * ss) + dy,
511 | 'L', cx + (irx * cs) + dx, cy + (iry * ss) + dy,
512 | 'L', cx + (irx * cs), cy + (iry * ss),
513 | 'Z'
514 | ];
515 | var side2 = [
516 | 'M', cx + (rx * ce), cy + (ry * se),
517 | 'L', cx + (rx * ce) + dx, cy + (ry * se) + dy,
518 | 'L', cx + (irx * ce) + dx, cy + (iry * se) + dy,
519 | 'L', cx + (irx * ce), cy + (iry * se),
520 | 'Z'
521 | ];
522 |
523 | var a1 = sin((start + end) / 2),
524 | a2 = sin(start),
525 | a3 = sin(end);
526 |
527 | return {
528 | top: top,
529 | zTop: r,
530 | out: out,
531 | zOut: Math.max(a1, a2, a3) * r,
532 | inn: inn,
533 | zInn: Math.max(a1, a2, a3) * r,
534 | side1: side1,
535 | zSide1: a2 * (r * 0.99),
536 | side2: side2,
537 | zSide2: a3 * (r * 0.99)
538 | };
539 | };
540 | /***
541 | EXTENSION FOR 3D CHARTS
542 | ***/
543 | // Shorthand to check the is3d flag
544 | Highcharts.Chart.prototype.is3d = function () {
545 | return this.options.chart.options3d && this.options.chart.options3d.enabled; // #4280
546 | };
547 |
548 | Highcharts.wrap(Highcharts.Chart.prototype, 'isInsidePlot', function (proceed) {
549 | if (this.is3d()) {
550 | return true;
551 | } else {
552 | return proceed.apply(this, [].slice.call(arguments, 1));
553 | }
554 | });
555 |
556 | var defaultChartOptions = Highcharts.getOptions();
557 | defaultChartOptions.chart.options3d = {
558 | enabled: false,
559 | alpha: 0,
560 | beta: 0,
561 | depth: 100,
562 | viewDistance: 25,
563 | frame: {
564 | bottom: { size: 1, color: 'rgba(255,255,255,0)' },
565 | side: { size: 1, color: 'rgba(255,255,255,0)' },
566 | back: { size: 1, color: 'rgba(255,255,255,0)' }
567 | }
568 | };
569 |
570 | Highcharts.wrap(Highcharts.Chart.prototype, 'init', function (proceed) {
571 | var args = [].slice.call(arguments, 1),
572 | plotOptions,
573 | pieOptions;
574 |
575 | if (args[0].chart.options3d && args[0].chart.options3d.enabled) {
576 | plotOptions = args[0].plotOptions || {};
577 | pieOptions = plotOptions.pie || {};
578 |
579 | pieOptions.borderColor = Highcharts.pick(pieOptions.borderColor, undefined);
580 | }
581 | proceed.apply(this, args);
582 | });
583 |
584 | Highcharts.wrap(Highcharts.Chart.prototype, 'setChartSize', function (proceed) {
585 | proceed.apply(this, [].slice.call(arguments, 1));
586 |
587 | if (this.is3d()) {
588 | var inverted = this.inverted,
589 | clipBox = this.clipBox,
590 | margin = this.margin,
591 | x = inverted ? 'y' : 'x',
592 | y = inverted ? 'x' : 'y',
593 | w = inverted ? 'height' : 'width',
594 | h = inverted ? 'width' : 'height';
595 |
596 | clipBox[x] = -(margin[3] || 0);
597 | clipBox[y] = -(margin[0] || 0);
598 | clipBox[w] = this.chartWidth + (margin[3] || 0) + (margin[1] || 0);
599 | clipBox[h] = this.chartHeight + (margin[0] || 0) + (margin[2] || 0);
600 | }
601 | });
602 |
603 | Highcharts.wrap(Highcharts.Chart.prototype, 'redraw', function (proceed) {
604 | if (this.is3d()) {
605 | // Set to force a redraw of all elements
606 | this.isDirtyBox = true;
607 | }
608 | proceed.apply(this, [].slice.call(arguments, 1));
609 | });
610 |
611 | // Draw the series in the reverse order (#3803, #3917)
612 | Highcharts.wrap(Highcharts.Chart.prototype, 'renderSeries', function (proceed) {
613 | var series,
614 | i = this.series.length;
615 |
616 | if (this.is3d()) {
617 | while (i--) {
618 | series = this.series[i];
619 | series.translate();
620 | series.render();
621 | }
622 | } else {
623 | proceed.call(this);
624 | }
625 | });
626 |
627 | Highcharts.Chart.prototype.retrieveStacks = function (stacking) {
628 | var series = this.series,
629 | stacks = {},
630 | stackNumber,
631 | i = 1;
632 |
633 | Highcharts.each(this.series, function (S) {
634 | stackNumber = stacking ? (S.options.stack || 0) : series.length - 1 - S.index; // #3841
635 | if (!stacks[stackNumber]) {
636 | stacks[stackNumber] = { series: [S], position: i};
637 | i++;
638 | } else {
639 | stacks[stackNumber].series.push(S);
640 | }
641 | });
642 |
643 | stacks.totalStacks = i + 1;
644 | return stacks;
645 | };
646 |
647 | /***
648 | EXTENSION TO THE AXIS
649 | ***/
650 | Highcharts.wrap(Highcharts.Axis.prototype, 'init', function (proceed) {
651 | var args = arguments;
652 | if (args[1].is3d()) {
653 | args[2].tickWidth = Highcharts.pick(args[2].tickWidth, 0);
654 | args[2].gridLineWidth = Highcharts.pick(args[2].gridLineWidth, 1);
655 | }
656 |
657 | proceed.apply(this, [].slice.call(arguments, 1));
658 | });
659 | Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
660 | proceed.apply(this, [].slice.call(arguments, 1));
661 |
662 | // Do not do this if the chart is not 3D
663 | if (!this.chart.is3d()) {
664 | return;
665 | }
666 |
667 | var chart = this.chart,
668 | renderer = chart.renderer,
669 | options3d = chart.options.chart.options3d,
670 | frame = options3d.frame,
671 | fbottom = frame.bottom,
672 | fback = frame.back,
673 | fside = frame.side,
674 | depth = options3d.depth,
675 | height = this.height,
676 | width = this.width,
677 | left = this.left,
678 | top = this.top;
679 |
680 | if (this.isZAxis) {
681 | return;
682 | } else if (this.horiz) {
683 | var bottomShape = {
684 | x: left,
685 | y: top + (chart.xAxis[0].opposite ? -fbottom.size : height),
686 | z: 0,
687 | width: width,
688 | height: fbottom.size,
689 | depth: depth,
690 | insidePlotArea: false
691 | };
692 | if (!this.bottomFrame) {
693 | this.bottomFrame = renderer.cuboid(bottomShape).attr({
694 | fill: fbottom.color,
695 | zIndex: (chart.yAxis[0].reversed && options3d.alpha > 0 ? 4 : -1)
696 | })
697 | .css({
698 | stroke: fbottom.color
699 | }).add();
700 | } else {
701 | this.bottomFrame.animate(bottomShape);
702 | }
703 | } else {
704 | // BACK
705 | var backShape = {
706 | x: left + (chart.yAxis[0].opposite ? 0 : -fside.size),
707 | y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0),
708 | z: depth,
709 | width: width + fside.size,
710 | height: height + fbottom.size,
711 | depth: fback.size,
712 | insidePlotArea: false
713 | };
714 | if (!this.backFrame) {
715 | this.backFrame = renderer.cuboid(backShape).attr({
716 | fill: fback.color,
717 | zIndex: -3
718 | }).css({
719 | stroke: fback.color
720 | }).add();
721 | } else {
722 | this.backFrame.animate(backShape);
723 | }
724 | var sideShape = {
725 | x: left + (chart.yAxis[0].opposite ? width : -fside.size),
726 | y: top + (chart.xAxis[0].opposite ? -fbottom.size : 0),
727 | z: 0,
728 | width: fside.size,
729 | height: height + fbottom.size,
730 | depth: depth,
731 | insidePlotArea: false
732 | };
733 | if (!this.sideFrame) {
734 | this.sideFrame = renderer.cuboid(sideShape).attr({
735 | fill: fside.color,
736 | zIndex: -2
737 | }).css({
738 | stroke: fside.color
739 | }).add();
740 | } else {
741 | this.sideFrame.animate(sideShape);
742 | }
743 | }
744 | });
745 |
746 | Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotLinePath', function (proceed) {
747 | var path = proceed.apply(this, [].slice.call(arguments, 1));
748 |
749 | // Do not do this if the chart is not 3D
750 | if (!this.chart.is3d()) {
751 | return path;
752 | }
753 |
754 | if (path === null) { return path; }
755 |
756 | var chart = this.chart,
757 | options3d = chart.options.chart.options3d;
758 |
759 | var d = this.isZAxis ? this.chart.plotWidth : options3d.depth,
760 | opposite = this.opposite;
761 | if (this.horiz) {
762 | opposite = !opposite;
763 | }
764 | var pArr = [
765 | this.swapZ({ x: path[1], y: path[2], z: (opposite ? d : 0)}),
766 | this.swapZ({ x: path[1], y: path[2], z: d }),
767 | this.swapZ({ x: path[4], y: path[5], z: d }),
768 | this.swapZ({ x: path[4], y: path[5], z: (opposite ? 0 : d)})
769 | ];
770 |
771 | pArr = perspective(pArr, this.chart, false);
772 | path = this.chart.renderer.toLinePath(pArr, false);
773 |
774 | return path;
775 | });
776 |
777 | Highcharts.wrap(Highcharts.Axis.prototype, 'getLinePath', function () {
778 | // do not draw axislines in 3D ?
779 | return [];
780 | });
781 |
782 | Highcharts.wrap(Highcharts.Axis.prototype, 'getPlotBandPath', function (proceed) {
783 | // Do not do this if the chart is not 3D
784 | if (!this.chart.is3d()) {
785 | return proceed.apply(this, [].slice.call(arguments, 1));
786 | } else {
787 | var args = arguments,
788 | from = args[1],
789 | to = args[2];
790 |
791 | var toPath = this.getPlotLinePath(to),
792 | path = this.getPlotLinePath(from);
793 |
794 | if (path && toPath) {
795 | path.push(
796 | 'L',
797 | toPath[10], // These two do not exist in the regular getPlotLine
798 | toPath[11], // ---- # 3005
799 | 'L',
800 | toPath[7],
801 | toPath[8],
802 | 'L',
803 | toPath[4],
804 | toPath[5],
805 | 'L',
806 | toPath[1],
807 | toPath[2]
808 | );
809 | } else { // outside the axis area
810 | path = null;
811 | }
812 |
813 | return path;
814 | }
815 | });
816 |
817 | /***
818 | EXTENSION TO THE TICKS
819 | ***/
820 |
821 | Highcharts.wrap(Highcharts.Tick.prototype, 'getMarkPath', function (proceed) {
822 | var path = proceed.apply(this, [].slice.call(arguments, 1));
823 |
824 | // Do not do this if the chart is not 3D
825 | if (!this.axis.chart.is3d()) {
826 | return path;
827 | }
828 |
829 | var pArr = [
830 | this.axis.swapZ({x: path[1], y: path[2], z: 0}),
831 | this.axis.swapZ({x: path[4], y: path[5], z: 0})
832 | ];
833 |
834 | pArr = perspective(pArr, this.axis.chart, false);
835 | path = [
836 | 'M', pArr[0].x, pArr[0].y,
837 | 'L', pArr[1].x, pArr[1].y
838 | ];
839 | return path;
840 | });
841 |
842 | Highcharts.wrap(Highcharts.Tick.prototype, 'getLabelPosition', function (proceed) {
843 | var pos = proceed.apply(this, [].slice.call(arguments, 1));
844 |
845 | // Do not do this if the chart is not 3D
846 | if (!this.axis.chart.is3d()) {
847 | return pos;
848 | }
849 |
850 | var new_pos = perspective([this.axis.swapZ({x: pos.x, y: pos.y, z: 0})], this.axis.chart, false)[0];
851 | new_pos.x = new_pos.x - (!this.axis.horiz && this.axis.opposite ? this.axis.transA : 0); //#3788
852 | new_pos.old = pos;
853 | return new_pos;
854 | });
855 |
856 | Highcharts.wrap(Highcharts.Tick.prototype, 'handleOverflow', function (proceed, xy) {
857 | if (this.axis.chart.is3d()) {
858 | xy = xy.old;
859 | }
860 | return proceed.call(this, xy);
861 | });
862 |
863 | Highcharts.wrap(Highcharts.Axis.prototype, 'getTitlePosition', function (proceed) {
864 | var pos = proceed.apply(this, [].slice.call(arguments, 1));
865 |
866 | // Do not do this if the chart is not 3D
867 | if (!this.chart.is3d()) {
868 | return pos;
869 | }
870 |
871 | pos = perspective([this.swapZ({x: pos.x, y: pos.y, z: 0})], this.chart, false)[0];
872 | return pos;
873 | });
874 |
875 | Highcharts.wrap(Highcharts.Axis.prototype, 'drawCrosshair', function (proceed) {
876 | var args = arguments;
877 | if (this.chart.is3d()) {
878 | if (args[2]) {
879 | args[2] = {
880 | plotX: args[2].plotXold || args[2].plotX,
881 | plotY: args[2].plotYold || args[2].plotY
882 | };
883 | }
884 | }
885 | proceed.apply(this, [].slice.call(args, 1));
886 | });
887 |
888 | /***
889 | Z-AXIS
890 | ***/
891 |
892 | Highcharts.Axis.prototype.swapZ = function (p, insidePlotArea) {
893 | if (this.isZAxis) {
894 | var plotLeft = insidePlotArea ? 0 : this.chart.plotLeft;
895 | var chart = this.chart;
896 | return {
897 | x: plotLeft + (chart.yAxis[0].opposite ? p.z : chart.xAxis[0].width - p.z),
898 | y: p.y,
899 | z: p.x - plotLeft
900 | };
901 | } else {
902 | return p;
903 | }
904 | };
905 |
906 | var ZAxis = Highcharts.ZAxis = function () {
907 | this.isZAxis = true;
908 | this.init.apply(this, arguments);
909 | };
910 | Highcharts.extend(ZAxis.prototype, Highcharts.Axis.prototype);
911 | Highcharts.extend(ZAxis.prototype, {
912 | setOptions: function (userOptions) {
913 | userOptions = Highcharts.merge({
914 | offset: 0,
915 | lineWidth: 0
916 | }, userOptions);
917 | Highcharts.Axis.prototype.setOptions.call(this, userOptions);
918 | this.coll = 'zAxis';
919 | },
920 | setAxisSize: function () {
921 | Highcharts.Axis.prototype.setAxisSize.call(this);
922 | this.width = this.len = this.chart.options.chart.options3d.depth;
923 | this.right = this.chart.chartWidth - this.width - this.left;
924 | },
925 | getSeriesExtremes: function () {
926 | var axis = this,
927 | chart = axis.chart;
928 |
929 | axis.hasVisibleSeries = false;
930 |
931 | // Reset properties in case we're redrawing (#3353)
932 | axis.dataMin = axis.dataMax = axis.ignoreMinPadding = axis.ignoreMaxPadding = null;
933 |
934 | if (axis.buildStacks) {
935 | axis.buildStacks();
936 | }
937 |
938 | // loop through this axis' series
939 | Highcharts.each(axis.series, function (series) {
940 |
941 | if (series.visible || !chart.options.chart.ignoreHiddenSeries) {
942 |
943 | var seriesOptions = series.options,
944 | zData,
945 | threshold = seriesOptions.threshold;
946 |
947 | axis.hasVisibleSeries = true;
948 |
949 | // Validate threshold in logarithmic axes
950 | if (axis.isLog && threshold <= 0) {
951 | threshold = null;
952 | }
953 |
954 | zData = series.zData;
955 | if (zData.length) {
956 | axis.dataMin = Math.min(pick(axis.dataMin, zData[0]), Math.min.apply(null, zData));
957 | axis.dataMax = Math.max(pick(axis.dataMax, zData[0]), Math.max.apply(null, zData));
958 | }
959 | }
960 | });
961 | }
962 | });
963 |
964 |
965 | /**
966 | * Extend the chart getAxes method to also get the color axis
967 | */
968 | Highcharts.wrap(Highcharts.Chart.prototype, 'getAxes', function (proceed) {
969 | var chart = this,
970 | options = this.options,
971 | zAxisOptions = options.zAxis = Highcharts.splat(options.zAxis || {});
972 |
973 | proceed.call(this);
974 |
975 | if (!chart.is3d()) {
976 | return;
977 | }
978 | this.zAxis = [];
979 | Highcharts.each(zAxisOptions, function (axisOptions, i) {
980 | axisOptions.index = i;
981 | axisOptions.isX = true; //Z-Axis is shown horizontally, so it's kind of a X-Axis
982 | var zAxis = new ZAxis(chart, axisOptions);
983 | zAxis.setScale();
984 | });
985 | });
986 | /***
987 | EXTENSION FOR 3D COLUMNS
988 | ***/
989 | Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'translate', function (proceed) {
990 | proceed.apply(this, [].slice.call(arguments, 1));
991 |
992 | // Do not do this if the chart is not 3D
993 | if (!this.chart.is3d()) {
994 | return;
995 | }
996 |
997 | var series = this,
998 | chart = series.chart,
999 | seriesOptions = series.options,
1000 | depth = seriesOptions.depth || 25;
1001 |
1002 | var stack = seriesOptions.stacking ? (seriesOptions.stack || 0) : series._i;
1003 | var z = stack * (depth + (seriesOptions.groupZPadding || 1));
1004 |
1005 | if (seriesOptions.grouping !== false) { z = 0; }
1006 |
1007 | z += (seriesOptions.groupZPadding || 1);
1008 |
1009 | Highcharts.each(series.data, function (point) {
1010 | if (point.y !== null) {
1011 | var shapeArgs = point.shapeArgs,
1012 | tooltipPos = point.tooltipPos;
1013 |
1014 | point.shapeType = 'cuboid';
1015 | shapeArgs.z = z;
1016 | shapeArgs.depth = depth;
1017 | shapeArgs.insidePlotArea = true;
1018 |
1019 | // Translate the tooltip position in 3d space
1020 | tooltipPos = perspective([{ x: tooltipPos[0], y: tooltipPos[1], z: z }], chart, false)[0];
1021 | point.tooltipPos = [tooltipPos.x, tooltipPos.y];
1022 | }
1023 | });
1024 | // store for later use #4067
1025 | series.z = z;
1026 | });
1027 |
1028 | Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'animate', function (proceed) {
1029 | if (!this.chart.is3d()) {
1030 | proceed.apply(this, [].slice.call(arguments, 1));
1031 | } else {
1032 | var args = arguments,
1033 | init = args[1],
1034 | yAxis = this.yAxis,
1035 | series = this,
1036 | reversed = this.yAxis.reversed;
1037 |
1038 | if (Highcharts.svg) { // VML is too slow anyway
1039 | if (init) {
1040 | Highcharts.each(series.data, function (point) {
1041 | if (point.y !== null) {
1042 | point.height = point.shapeArgs.height;
1043 | point.shapey = point.shapeArgs.y; //#2968
1044 | point.shapeArgs.height = 1;
1045 | if (!reversed) {
1046 | if (point.stackY) {
1047 | point.shapeArgs.y = point.plotY + yAxis.translate(point.stackY);
1048 | } else {
1049 | point.shapeArgs.y = point.plotY + (point.negative ? -point.height : point.height);
1050 | }
1051 | }
1052 | }
1053 | });
1054 |
1055 | } else { // run the animation
1056 | Highcharts.each(series.data, function (point) {
1057 | if (point.y !== null) {
1058 | point.shapeArgs.height = point.height;
1059 | point.shapeArgs.y = point.shapey; //#2968
1060 | // null value do not have a graphic
1061 | if (point.graphic) {
1062 | point.graphic.animate(point.shapeArgs, series.options.animation);
1063 | }
1064 | }
1065 | });
1066 |
1067 | // redraw datalabels to the correct position
1068 | this.drawDataLabels();
1069 |
1070 | // delete this function to allow it only once
1071 | series.animate = null;
1072 | }
1073 | }
1074 | }
1075 | });
1076 |
1077 | Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'init', function (proceed) {
1078 | proceed.apply(this, [].slice.call(arguments, 1));
1079 |
1080 | if (this.chart.is3d()) {
1081 | var seriesOptions = this.options,
1082 | grouping = seriesOptions.grouping,
1083 | stacking = seriesOptions.stacking,
1084 | z = 0;
1085 |
1086 | if (!(grouping !== undefined && !grouping)) {
1087 | var stacks = this.chart.retrieveStacks(stacking),
1088 | stack = seriesOptions.stack || 0,
1089 | i; // position within the stack
1090 | for (i = 0; i < stacks[stack].series.length; i++) {
1091 | if (stacks[stack].series[i] === this) {
1092 | break;
1093 | }
1094 | }
1095 | z = (stacks.totalStacks * 10) - (10 * (stacks.totalStacks - stacks[stack].position)) - i;
1096 | }
1097 |
1098 | seriesOptions.zIndex = z;
1099 | }
1100 | });
1101 | function draw3DPoints(proceed) {
1102 | // Do not do this if the chart is not 3D
1103 | if (this.chart.is3d()) {
1104 | var grouping = this.chart.options.plotOptions.column.grouping;
1105 | if (grouping !== undefined && !grouping && this.group.zIndex !== undefined && !this.zIndexSet) {
1106 | this.group.attr({zIndex : (this.group.zIndex * 10)});
1107 | this.zIndexSet = true; // #4062 set zindex only once
1108 | }
1109 |
1110 | var options = this.options,
1111 | states = this.options.states;
1112 |
1113 | this.borderWidth = options.borderWidth = defined(options.edgeWidth) ? options.edgeWidth : 1; //#4055
1114 |
1115 | Highcharts.each(this.data, function (point) {
1116 | if (point.y !== null) {
1117 | var pointAttr = point.pointAttr;
1118 |
1119 | // Set the border color to the fill color to provide a smooth edge
1120 | this.borderColor = Highcharts.pick(options.edgeColor, pointAttr[''].fill);
1121 |
1122 | pointAttr[''].stroke = this.borderColor;
1123 | pointAttr.hover.stroke = Highcharts.pick(states.hover.edgeColor, this.borderColor);
1124 | pointAttr.select.stroke = Highcharts.pick(states.select.edgeColor, this.borderColor);
1125 | }
1126 | });
1127 | }
1128 |
1129 | proceed.apply(this, [].slice.call(arguments, 1));
1130 | }
1131 |
1132 | Highcharts.wrap(Highcharts.Series.prototype, 'alignDataLabel', function (proceed) {
1133 |
1134 | // Only do this for 3D columns and columnranges
1135 | if (this.chart.is3d() && (this.type === 'column' || this.type === 'columnrange')) {
1136 | var series = this,
1137 | chart = series.chart;
1138 |
1139 | var args = arguments,
1140 | alignTo = args[4];
1141 |
1142 | var pos = ({x: alignTo.x, y: alignTo.y, z: series.z});
1143 | pos = perspective([pos], chart, true)[0];
1144 | alignTo.x = pos.x;
1145 | alignTo.y = pos.y;
1146 | }
1147 |
1148 | proceed.apply(this, [].slice.call(arguments, 1));
1149 | });
1150 |
1151 | if (Highcharts.seriesTypes.columnrange) {
1152 | Highcharts.wrap(Highcharts.seriesTypes.columnrange.prototype, 'drawPoints', draw3DPoints);
1153 | }
1154 |
1155 | Highcharts.wrap(Highcharts.seriesTypes.column.prototype, 'drawPoints', draw3DPoints);
1156 |
1157 | /***
1158 | EXTENSION FOR 3D CYLINDRICAL COLUMNS
1159 | Not supported
1160 | ***/
1161 | /*
1162 | var defaultOptions = Highcharts.getOptions();
1163 | defaultOptions.plotOptions.cylinder = Highcharts.merge(defaultOptions.plotOptions.column);
1164 | var CylinderSeries = Highcharts.extendClass(Highcharts.seriesTypes.column, {
1165 | type: 'cylinder'
1166 | });
1167 | Highcharts.seriesTypes.cylinder = CylinderSeries;
1168 |
1169 | Highcharts.wrap(Highcharts.seriesTypes.cylinder.prototype, 'translate', function (proceed) {
1170 | proceed.apply(this, [].slice.call(arguments, 1));
1171 |
1172 | // Do not do this if the chart is not 3D
1173 | if (!this.chart.is3d()) {
1174 | return;
1175 | }
1176 |
1177 | var series = this,
1178 | chart = series.chart,
1179 | options = chart.options,
1180 | cylOptions = options.plotOptions.cylinder,
1181 | options3d = options.chart.options3d,
1182 | depth = cylOptions.depth || 0,
1183 | origin = {
1184 | x: chart.inverted ? chart.plotHeight / 2 : chart.plotWidth / 2,
1185 | y: chart.inverted ? chart.plotWidth / 2 : chart.plotHeight / 2,
1186 | z: options3d.depth,
1187 | vd: options3d.viewDistance
1188 | },
1189 | alpha = options3d.alpha;
1190 |
1191 | var z = cylOptions.stacking ? (this.options.stack || 0) * depth : series._i * depth;
1192 | z += depth / 2;
1193 |
1194 | if (cylOptions.grouping !== false) { z = 0; }
1195 |
1196 | Highcharts.each(series.data, function (point) {
1197 | var shapeArgs = point.shapeArgs;
1198 | point.shapeType = 'arc3d';
1199 | shapeArgs.x += depth / 2;
1200 | shapeArgs.z = z;
1201 | shapeArgs.start = 0;
1202 | shapeArgs.end = 2 * PI;
1203 | shapeArgs.r = depth * 0.95;
1204 | shapeArgs.innerR = 0;
1205 | shapeArgs.depth = shapeArgs.height * (1 / sin((90 - alpha) * deg2rad)) - z;
1206 | shapeArgs.alpha = 90 - alpha;
1207 | shapeArgs.beta = 0;
1208 | shapeArgs.origin = origin;
1209 | });
1210 | });
1211 | *//***
1212 | EXTENSION FOR 3D PIES
1213 | ***/
1214 |
1215 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'translate', function (proceed) {
1216 | proceed.apply(this, [].slice.call(arguments, 1));
1217 |
1218 | // Do not do this if the chart is not 3D
1219 | if (!this.chart.is3d()) {
1220 | return;
1221 | }
1222 |
1223 | var series = this,
1224 | chart = series.chart,
1225 | options = chart.options,
1226 | seriesOptions = series.options,
1227 | depth = seriesOptions.depth || 0,
1228 | options3d = options.chart.options3d,
1229 | origin = {
1230 | x: chart.plotWidth / 2,
1231 | y: chart.plotHeight / 2,
1232 | z: options3d.depth
1233 | },
1234 | alpha = options3d.alpha,
1235 | beta = options3d.beta,
1236 | z = seriesOptions.stacking ? (seriesOptions.stack || 0) * depth : series._i * depth;
1237 |
1238 | z += depth / 2;
1239 |
1240 | if (seriesOptions.grouping !== false) { z = 0; }
1241 |
1242 | Highcharts.each(series.data, function (point) {
1243 |
1244 | var shapeArgs = point.shapeArgs,
1245 | angle;
1246 |
1247 | point.shapeType = 'arc3d';
1248 |
1249 | shapeArgs.z = z;
1250 | shapeArgs.depth = depth * 0.75;
1251 | shapeArgs.origin = origin;
1252 | shapeArgs.alpha = alpha;
1253 | shapeArgs.beta = beta;
1254 | shapeArgs.center = series.center;
1255 |
1256 | angle = (shapeArgs.end + shapeArgs.start) / 2;
1257 |
1258 | point.slicedTranslation = {
1259 | translateX : round(cos(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad)),
1260 | translateY : round(sin(angle) * seriesOptions.slicedOffset * cos(alpha * deg2rad))
1261 | };
1262 | });
1263 | });
1264 |
1265 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype.pointClass.prototype, 'haloPath', function (proceed) {
1266 | var args = arguments;
1267 | return this.series.chart.is3d() ? [] : proceed.call(this, args[1]);
1268 | });
1269 |
1270 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawPoints', function (proceed) {
1271 |
1272 | var seriesGroup = this.group,
1273 | options = this.options,
1274 | states = options.states;
1275 |
1276 | // Do not do this if the chart is not 3D
1277 | if (this.chart.is3d()) {
1278 | // Set the border color to the fill color to provide a smooth edge
1279 | this.borderWidth = options.borderWidth = options.edgeWidth || 1;
1280 | this.borderColor = options.edgeColor = Highcharts.pick(options.edgeColor, options.borderColor, undefined);
1281 |
1282 | states.hover.borderColor = Highcharts.pick(states.hover.edgeColor, this.borderColor);
1283 | states.hover.borderWidth = Highcharts.pick(states.hover.edgeWidth, this.borderWidth);
1284 | states.select.borderColor = Highcharts.pick(states.select.edgeColor, this.borderColor);
1285 | states.select.borderWidth = Highcharts.pick(states.select.edgeWidth, this.borderWidth);
1286 |
1287 | Highcharts.each(this.data, function (point) {
1288 | var pointAttr = point.pointAttr;
1289 | pointAttr[''].stroke = point.series.borderColor || point.color;
1290 | pointAttr['']['stroke-width'] = point.series.borderWidth;
1291 | pointAttr.hover.stroke = states.hover.borderColor;
1292 | pointAttr.hover['stroke-width'] = states.hover.borderWidth;
1293 | pointAttr.select.stroke = states.select.borderColor;
1294 | pointAttr.select['stroke-width'] = states.select.borderWidth;
1295 | });
1296 | }
1297 |
1298 | proceed.apply(this, [].slice.call(arguments, 1));
1299 |
1300 | if (this.chart.is3d()) {
1301 | Highcharts.each(this.points, function (point) {
1302 | var graphic = point.graphic;
1303 |
1304 | graphic.out.add(seriesGroup);
1305 | graphic.inn.add(seriesGroup);
1306 | graphic.side1.add(seriesGroup);
1307 | graphic.side2.add(seriesGroup);
1308 |
1309 | // Hide null or 0 points (#3006, 3650)
1310 | graphic[point.y ? 'show' : 'hide']();
1311 | });
1312 | }
1313 | });
1314 |
1315 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'drawDataLabels', function (proceed) {
1316 | if (this.chart.is3d()) {
1317 | var series = this;
1318 | Highcharts.each(series.data, function (point) {
1319 | var shapeArgs = point.shapeArgs,
1320 | r = shapeArgs.r,
1321 | d = shapeArgs.depth,
1322 | a1 = (shapeArgs.alpha || series.chart.options.chart.options3d.alpha) * deg2rad, //#3240 issue with datalabels for 0 and null values
1323 | a2 = (shapeArgs.start + shapeArgs.end) / 2,
1324 | labelPos = point.labelPos;
1325 |
1326 | labelPos[1] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1327 | labelPos[3] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1328 | labelPos[5] += (-r * (1 - cos(a1)) * sin(a2)) + (sin(a2) > 0 ? sin(a1) * d : 0);
1329 |
1330 | });
1331 | }
1332 |
1333 | proceed.apply(this, [].slice.call(arguments, 1));
1334 | });
1335 |
1336 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'addPoint', function (proceed) {
1337 | proceed.apply(this, [].slice.call(arguments, 1));
1338 | if (this.chart.is3d()) {
1339 | // destroy (and rebuild) everything!!!
1340 | this.update(this.userOptions, true); // #3845 pass the old options
1341 | }
1342 | });
1343 |
1344 | Highcharts.wrap(Highcharts.seriesTypes.pie.prototype, 'animate', function (proceed) {
1345 | if (!this.chart.is3d()) {
1346 | proceed.apply(this, [].slice.call(arguments, 1));
1347 | } else {
1348 | var args = arguments,
1349 | init = args[1],
1350 | animation = this.options.animation,
1351 | attribs,
1352 | center = this.center,
1353 | group = this.group,
1354 | markerGroup = this.markerGroup;
1355 |
1356 | if (Highcharts.svg) { // VML is too slow anyway
1357 |
1358 | if (animation === true) {
1359 | animation = {};
1360 | }
1361 | // Initialize the animation
1362 | if (init) {
1363 |
1364 | // Scale down the group and place it in the center
1365 | group.oldtranslateX = group.translateX;
1366 | group.oldtranslateY = group.translateY;
1367 | attribs = {
1368 | translateX: center[0],
1369 | translateY: center[1],
1370 | scaleX: 0.001, // #1499
1371 | scaleY: 0.001
1372 | };
1373 |
1374 | group.attr(attribs);
1375 | if (markerGroup) {
1376 | markerGroup.attrSetters = group.attrSetters;
1377 | markerGroup.attr(attribs);
1378 | }
1379 |
1380 | // Run the animation
1381 | } else {
1382 | attribs = {
1383 | translateX: group.oldtranslateX,
1384 | translateY: group.oldtranslateY,
1385 | scaleX: 1,
1386 | scaleY: 1
1387 | };
1388 | group.animate(attribs, animation);
1389 |
1390 | if (markerGroup) {
1391 | markerGroup.animate(attribs, animation);
1392 | }
1393 |
1394 | // Delete this function to allow it only once
1395 | this.animate = null;
1396 | }
1397 |
1398 | }
1399 | }
1400 | });/***
1401 | EXTENSION FOR 3D SCATTER CHART
1402 | ***/
1403 |
1404 | Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'translate', function (proceed) {
1405 | //function translate3d(proceed) {
1406 | proceed.apply(this, [].slice.call(arguments, 1));
1407 |
1408 | if (!this.chart.is3d()) {
1409 | return;
1410 | }
1411 |
1412 | var series = this,
1413 | chart = series.chart,
1414 | zAxis = Highcharts.pick(series.zAxis, chart.options.zAxis[0]);
1415 |
1416 | var raw_points = [],
1417 | raw_point,
1418 | projected_points,
1419 | projected_point,
1420 | i;
1421 |
1422 | for (i = 0; i < series.data.length; i++) {
1423 | raw_point = series.data[i];
1424 |
1425 | raw_point.isInside = raw_point.isInside ? (raw_point.z >= zAxis.min && raw_point.z <= zAxis.max) : false;
1426 |
1427 | raw_points.push({
1428 | x: raw_point.plotX,
1429 | y: raw_point.plotY,
1430 | z: zAxis.translate(raw_point.z)
1431 | });
1432 | }
1433 |
1434 | projected_points = perspective(raw_points, chart, true);
1435 |
1436 | for (i = 0; i < series.data.length; i++) {
1437 | raw_point = series.data[i];
1438 | projected_point = projected_points[i];
1439 |
1440 | raw_point.plotXold = raw_point.plotX;
1441 | raw_point.plotYold = raw_point.plotY;
1442 |
1443 | raw_point.plotX = projected_point.x;
1444 | raw_point.plotY = projected_point.y;
1445 | raw_point.plotZ = projected_point.z;
1446 |
1447 |
1448 | }
1449 |
1450 | });
1451 |
1452 | Highcharts.wrap(Highcharts.seriesTypes.scatter.prototype, 'init', function (proceed, chart, options) {
1453 | if (chart.is3d()) {
1454 | // add a third coordinate
1455 | this.axisTypes = ['xAxis', 'yAxis', 'zAxis'];
1456 | this.pointArrayMap = ['x', 'y', 'z'];
1457 | this.parallelArrays = ['x', 'y', 'z'];
1458 | }
1459 |
1460 | var result = proceed.apply(this, [chart, options]);
1461 |
1462 | if (this.chart.is3d()) {
1463 | // Set a new default tooltip formatter
1464 | var default3dScatterTooltip = 'x: {point.x}
y: {point.y}
z: {point.z}
';
1465 | if (this.userOptions.tooltip) {
1466 | this.tooltipOptions.pointFormat = this.userOptions.tooltip.pointFormat || default3dScatterTooltip;
1467 | } else {
1468 | this.tooltipOptions.pointFormat = default3dScatterTooltip;
1469 | }
1470 | }
1471 | return result;
1472 | });
1473 | /**
1474 | * Extension to the VML Renderer
1475 | */
1476 | if (Highcharts.VMLRenderer) {
1477 |
1478 | Highcharts.setOptions({animate: false});
1479 |
1480 | Highcharts.VMLRenderer.prototype.cuboid = Highcharts.SVGRenderer.prototype.cuboid;
1481 | Highcharts.VMLRenderer.prototype.cuboidPath = Highcharts.SVGRenderer.prototype.cuboidPath;
1482 |
1483 | Highcharts.VMLRenderer.prototype.toLinePath = Highcharts.SVGRenderer.prototype.toLinePath;
1484 |
1485 | Highcharts.VMLRenderer.prototype.createElement3D = Highcharts.SVGRenderer.prototype.createElement3D;
1486 |
1487 | Highcharts.VMLRenderer.prototype.arc3d = function (shapeArgs) {
1488 | var result = Highcharts.SVGRenderer.prototype.arc3d.call(this, shapeArgs);
1489 | result.css({zIndex: result.zIndex});
1490 | return result;
1491 | };
1492 |
1493 | Highcharts.VMLRenderer.prototype.arc3dPath = Highcharts.SVGRenderer.prototype.arc3dPath;
1494 |
1495 | Highcharts.wrap(Highcharts.Axis.prototype, 'render', function (proceed) {
1496 | proceed.apply(this, [].slice.call(arguments, 1));
1497 | // VML doesn't support a negative z-index
1498 | if (this.sideFrame) {
1499 | this.sideFrame.css({zIndex: 0});
1500 | this.sideFrame.front.attr({fill: this.sideFrame.color});
1501 | }
1502 | if (this.bottomFrame) {
1503 | this.bottomFrame.css({zIndex: 1});
1504 | this.bottomFrame.front.attr({fill: this.bottomFrame.color});
1505 | }
1506 | if (this.backFrame) {
1507 | this.backFrame.css({zIndex: 0});
1508 | this.backFrame.front.attr({fill: this.backFrame.color});
1509 | }
1510 | });
1511 |
1512 | }
1513 |
1514 | }(Highcharts));
1515 |
--------------------------------------------------------------------------------
/tests/dummy/app/data/stock.js:
--------------------------------------------------------------------------------
1 | export default [
2 | /* May 2006 */
3 | [1147651200000,67.79],
4 | [1147737600000,64.98],
5 | [1147824000000,65.26],
6 | [1147910400000,63.18],
7 | [1147996800000,64.51],
8 | [1148256000000,63.38],
9 | [1148342400000,63.15],
10 | [1148428800000,63.34],
11 | [1148515200000,64.33],
12 | [1148601600000,63.55],
13 | [1148947200000,61.22],
14 | [1149033600000,59.77],
15 | /* Jun 2006 */
16 | [1149120000000,62.17],
17 | [1149206400000,61.66],
18 | [1149465600000,60.00],
19 | [1149552000000,59.72],
20 | [1149638400000,58.56],
21 | [1149724800000,60.76],
22 | [1149811200000,59.24],
23 | [1150070400000,57.00],
24 | [1150156800000,58.33],
25 | [1150243200000,57.61],
26 | [1150329600000,59.38],
27 | [1150416000000,57.56],
28 | [1150675200000,57.20],
29 | [1150761600000,57.47],
30 | [1150848000000,57.86],
31 | [1150934400000,59.58],
32 | [1151020800000,58.83],
33 | [1151280000000,58.99],
34 | [1151366400000,57.43],
35 | [1151452800000,56.02],
36 | [1151539200000,58.97],
37 | [1151625600000,57.27],
38 | /* Jul 2006 */
39 | [1151884800000,57.95],
40 | [1152057600000,57.00],
41 | [1152144000000,55.77],
42 | [1152230400000,55.40],
43 | [1152489600000,55.00],
44 | [1152576000000,55.65],
45 | [1152662400000,52.96],
46 | [1152748800000,52.25],
47 | [1152835200000,50.67],
48 | [1153094400000,52.37],
49 | [1153180800000,52.90],
50 | [1153267200000,54.10],
51 | [1153353600000,60.50],
52 | [1153440000000,60.72],
53 | [1153699200000,61.42],
54 | [1153785600000,61.93],
55 | [1153872000000,63.87],
56 | [1153958400000,63.40],
57 | [1154044800000,65.59],
58 | [1154304000000,67.96],
59 | /* Aug 2006 */
60 | [1154390400000,67.18],
61 | [1154476800000,68.16],
62 | [1154563200000,69.59],
63 | [1154649600000,68.30],
64 | [1154908800000,67.21],
65 | [1154995200000,64.78],
66 | [1155081600000,63.59],
67 | [1155168000000,64.07],
68 | [1155254400000,63.65],
69 | [1155513600000,63.94],
70 | [1155600000000,66.45],
71 | [1155686400000,67.98],
72 | [1155772800000,67.59],
73 | [1155859200000,67.91],
74 | [1156118400000,66.56],
75 | [1156204800000,67.62],
76 | [1156291200000,67.31],
77 | [1156377600000,67.81],
78 | [1156464000000,68.75],
79 | [1156723200000,66.98],
80 | [1156809600000,66.48],
81 | [1156896000000,66.96],
82 | [1156982400000,67.85],
83 | /* Sep 2006 */
84 | [1157068800000,68.38],
85 | [1157414400000,71.48],
86 | [1157500800000,70.03],
87 | [1157587200000,72.80],
88 | [1157673600000,72.52],
89 | [1157932800000,72.50],
90 | [1158019200000,72.63],
91 | [1158105600000,74.20],
92 | [1158192000000,74.17],
93 | [1158278400000,74.10],
94 | [1158537600000,73.89],
95 | [1158624000000,73.77],
96 | [1158710400000,75.26],
97 | [1158796800000,74.65],
98 | [1158883200000,73.00],
99 | [1159142400000,75.75],
100 | [1159228800000,77.61],
101 | [1159315200000,76.41],
102 | [1159401600000,77.01],
103 | [1159488000000,76.98],
104 | /* Oct 2006 */
105 | [1159747200000,74.86],
106 | [1159833600000,74.08],
107 | [1159920000000,75.38],
108 | [1160006400000,74.83],
109 | [1160092800000,74.22],
110 | [1160352000000,74.63],
111 | [1160438400000,73.81],
112 | [1160524800000,73.23],
113 | [1160611200000,75.26],
114 | [1160697600000,75.02],
115 | [1160956800000,75.40],
116 | [1161043200000,74.29],
117 | [1161129600000,74.53],
118 | [1161216000000,78.99],
119 | [1161302400000,79.95],
120 | [1161561600000,81.46],
121 | [1161648000000,81.05],
122 | [1161734400000,81.68],
123 | [1161820800000,82.19],
124 | [1161907200000,80.41],
125 | [1162166400000,80.42],
126 | [1162252800000,81.08],
127 | /* Nov 2006 */
128 | [1162339200000,79.16],
129 | [1162425600000,78.98],
130 | [1162512000000,78.29],
131 | [1162771200000,79.71],
132 | [1162857600000,80.51],
133 | [1162944000000,82.45],
134 | [1163030400000,83.34],
135 | [1163116800000,83.12],
136 | [1163376000000,84.35],
137 | [1163462400000,85.00],
138 | [1163548800000,84.05],
139 | [1163635200000,85.61],
140 | [1163721600000,85.85],
141 | [1163980800000,86.47],
142 | [1164067200000,88.60],
143 | [1164153600000,90.31],
144 | [1164326400000,91.63],
145 | [1164585600000,89.54],
146 | [1164672000000,91.81],
147 | [1164758400000,91.80],
148 | [1164844800000,91.66],
149 | /* Dec 2006 */
150 | [1164931200000,91.32],
151 | [1165190400000,91.12],
152 | [1165276800000,91.27],
153 | [1165363200000,89.83],
154 | [1165449600000,87.04],
155 | [1165536000000,88.26],
156 | [1165795200000,88.75],
157 | [1165881600000,86.14],
158 | [1165968000000,89.05],
159 | [1166054400000,88.55],
160 | [1166140800000,87.72],
161 | [1166400000000,85.47],
162 | [1166486400000,86.31],
163 | [1166572800000,84.76],
164 | [1166659200000,82.90],
165 | [1166745600000,82.20],
166 | [1167091200000,81.51],
167 | [1167177600000,81.52],
168 | [1167264000000,80.87],
169 | [1167350400000,84.84],
170 | /* Jan 2007 */
171 | [1167782400000,83.80],
172 | [1167868800000,85.66],
173 | [1167955200000,85.05],
174 | [1168214400000,85.47],
175 | [1168300800000,92.57],
176 | [1168387200000,97.00],
177 | [1168473600000,95.80],
178 | [1168560000000,94.62],
179 | [1168905600000,97.10],
180 | [1168992000000,94.95],
181 | [1169078400000,89.07],
182 | [1169164800000,88.50],
183 | [1169424000000,86.79],
184 | [1169510400000,85.70],
185 | [1169596800000,86.70],
186 | [1169683200000,86.25],
187 | [1169769600000,85.38],
188 | [1170028800000,85.94],
189 | [1170115200000,85.55],
190 | [1170201600000,85.73],
191 | /* Feb 2007 */
192 | [1170288000000,84.74],
193 | [1170374400000,84.75],
194 | [1170633600000,83.94],
195 | [1170720000000,84.15],
196 | [1170806400000,86.15],
197 | [1170892800000,86.18],
198 | [1170979200000,83.27],
199 | [1171238400000,84.88],
200 | [1171324800000,84.63],
201 | [1171411200000,85.30],
202 | [1171497600000,85.21],
203 | [1171584000000,84.83],
204 | [1171929600000,85.90],
205 | [1172016000000,89.20],
206 | [1172102400000,89.51],
207 | [1172188800000,89.07],
208 | [1172448000000,88.65],
209 | [1172534400000,83.93],
210 | [1172620800000,84.61],
211 | /* Mar 2007 */
212 | [1172707200000,87.06],
213 | [1172793600000,85.41],
214 | [1173052800000,86.32],
215 | [1173139200000,88.19],
216 | [1173225600000,87.72],
217 | [1173312000000,88.00],
218 | [1173398400000,87.97],
219 | [1173657600000,89.87],
220 | [1173744000000,88.40],
221 | [1173830400000,90.00],
222 | [1173916800000,89.57],
223 | [1174003200000,89.59],
224 | [1174262400000,91.13],
225 | [1174348800000,91.48],
226 | [1174435200000,93.87],
227 | [1174521600000,93.96],
228 | [1174608000000,93.52],
229 | [1174867200000,95.85],
230 | [1174953600000,95.46],
231 | [1175040000000,93.24],
232 | [1175126400000,93.75],
233 | [1175212800000,92.91],
234 | /* Apr 2007 */
235 | [1175472000000,93.65],
236 | [1175558400000,94.50],
237 | [1175644800000,94.27],
238 | [1175731200000,94.68],
239 | [1176076800000,93.65],
240 | [1176163200000,94.25],
241 | [1176249600000,92.59],
242 | [1176336000000,92.19],
243 | [1176422400000,90.24],
244 | [1176681600000,91.43],
245 | [1176768000000,90.35],
246 | [1176854400000,90.40],
247 | [1176940800000,90.27],
248 | [1177027200000,90.97],
249 | [1177286400000,93.51],
250 | [1177372800000,93.24],
251 | [1177459200000,95.35],
252 | [1177545600000,98.84],
253 | [1177632000000,99.92],
254 | [1177891200000,99.80],
255 | /* May 2007 */
256 | [1177977600000,99.47],
257 | [1178064000000,100.39],
258 | [1178150400000,100.40],
259 | [1178236800000,100.81],
260 | [1178496000000,103.92],
261 | [1178582400000,105.06],
262 | [1178668800000,106.88],
263 | [1178755200000,107.34],
264 | [1178841600000,108.74],
265 | [1179100800000,109.36],
266 | [1179187200000,107.52],
267 | [1179273600000,107.34],
268 | [1179360000000,109.44],
269 | [1179446400000,110.02],
270 | [1179705600000,111.98],
271 | [1179792000000,113.54],
272 | [1179878400000,112.89],
273 | [1179964800000,110.69],
274 | [1180051200000,113.62],
275 | [1180396800000,114.35],
276 | [1180483200000,118.77],
277 | [1180569600000,121.19],
278 | /* Jun 2007 */
279 | [1180656000000,118.40],
280 | [1180915200000,121.33],
281 | [1181001600000,122.67],
282 | [1181088000000,123.64],
283 | [1181174400000,124.07],
284 | [1181260800000,124.49],
285 | [1181520000000,120.19],
286 | [1181606400000,120.38],
287 | [1181692800000,117.50],
288 | [1181779200000,118.75],
289 | [1181865600000,120.50],
290 | [1182124800000,125.09],
291 | [1182211200000,123.66],
292 | [1182297600000,121.55],
293 | [1182384000000,123.90],
294 | [1182470400000,123.00],
295 | [1182729600000,122.34],
296 | [1182816000000,119.65],
297 | [1182902400000,121.89],
298 | [1182988800000,120.56],
299 | [1183075200000,122.04],
300 | /* Jul 2007 */
301 | [1183334400000,121.26],
302 | [1183420800000,127.17],
303 | [1183593600000,132.75],
304 | [1183680000000,132.30],
305 | [1183939200000,130.33],
306 | [1184025600000,132.35],
307 | [1184112000000,132.39],
308 | [1184198400000,134.07],
309 | [1184284800000,137.73],
310 | [1184544000000,138.10],
311 | [1184630400000,138.91],
312 | [1184716800000,138.12],
313 | [1184803200000,140.00],
314 | [1184889600000,143.75],
315 | [1185148800000,143.70],
316 | [1185235200000,134.89],
317 | [1185321600000,137.26],
318 | [1185408000000,146.00],
319 | [1185494400000,143.85],
320 | [1185753600000,141.43],
321 | [1185840000000,131.76],
322 | /* Aug 2007 */
323 | [1185926400000,135.00],
324 | [1186012800000,136.49],
325 | [1186099200000,131.85],
326 | [1186358400000,135.25],
327 | [1186444800000,135.03],
328 | [1186531200000,134.01],
329 | [1186617600000,126.39],
330 | [1186704000000,125.00],
331 | [1186963200000,127.79],
332 | [1187049600000,124.03],
333 | [1187136000000,119.90],
334 | [1187222400000,117.05],
335 | [1187308800000,122.06],
336 | [1187568000000,122.22],
337 | [1187654400000,127.57],
338 | [1187740800000,132.51],
339 | [1187827200000,131.07],
340 | [1187913600000,135.30],
341 | [1188172800000,132.25],
342 | [1188259200000,126.82],
343 | [1188345600000,134.08],
344 | [1188432000000,136.25],
345 | [1188518400000,138.48],
346 | /* Sep 2007 */
347 | [1188864000000,144.16],
348 | [1188950400000,136.76],
349 | [1189036800000,135.01],
350 | [1189123200000,131.77],
351 | [1189382400000,136.71],
352 | [1189468800000,135.49],
353 | [1189555200000,136.85],
354 | [1189641600000,137.20],
355 | [1189728000000,138.81],
356 | [1189987200000,138.41],
357 | [1190073600000,140.92],
358 | [1190160000000,140.77],
359 | [1190246400000,140.31],
360 | [1190332800000,144.15],
361 | [1190592000000,148.28],
362 | [1190678400000,153.18],
363 | [1190764800000,152.77],
364 | [1190851200000,154.50],
365 | [1190937600000,153.47],
366 | /* Oct 2007 */
367 | [1191196800000,156.34],
368 | [1191283200000,158.45],
369 | [1191369600000,157.92],
370 | [1191456000000,156.24],
371 | [1191542400000,161.45],
372 | [1191801600000,167.91],
373 | [1191888000000,167.86],
374 | [1191974400000,166.79],
375 | [1192060800000,162.23],
376 | [1192147200000,167.25],
377 | [1192406400000,166.98],
378 | [1192492800000,169.58],
379 | [1192579200000,172.75],
380 | [1192665600000,173.50],
381 | [1192752000000,170.42],
382 | [1193011200000,174.36],
383 | [1193097600000,186.16],
384 | [1193184000000,185.93],
385 | [1193270400000,182.78],
386 | [1193356800000,184.70],
387 | [1193616000000,185.09],
388 | [1193702400000,187.00],
389 | [1193788800000,189.95],
390 | /* Nov 2007 */
391 | [1193875200000,187.44],
392 | [1193961600000,187.87],
393 | [1194220800000,186.18],
394 | [1194307200000,191.79],
395 | [1194393600000,186.30],
396 | [1194480000000,175.47],
397 | [1194566400000,165.37],
398 | [1194825600000,153.76],
399 | [1194912000000,169.96],
400 | [1194998400000,166.11],
401 | [1195084800000,164.30],
402 | [1195171200000,166.39],
403 | [1195430400000,163.95],
404 | [1195516800000,168.85],
405 | [1195603200000,168.46],
406 | [1195776000000,171.54],
407 | [1196035200000,172.54],
408 | [1196121600000,174.81],
409 | [1196208000000,180.22],
410 | [1196294400000,184.29],
411 | [1196380800000,182.22],
412 | /* Dec 2007 */
413 | [1196640000000,178.86],
414 | [1196726400000,179.81],
415 | [1196812800000,185.50],
416 | [1196899200000,189.95],
417 | [1196985600000,194.30],
418 | [1197244800000,194.21],
419 | [1197331200000,188.54],
420 | [1197417600000,190.86],
421 | [1197504000000,191.83],
422 | [1197590400000,190.39],
423 | [1197849600000,184.40],
424 | [1197936000000,182.98],
425 | [1198022400000,183.12],
426 | [1198108800000,187.21],
427 | [1198195200000,193.91],
428 | [1198454400000,198.80],
429 | [1198627200000,198.95],
430 | [1198713600000,198.57],
431 | [1198800000000,199.83],
432 | [1199059200000,198.08],
433 | /* Jan 2008 */
434 | [1199232000000,194.84],
435 | [1199318400000,194.93],
436 | [1199404800000,180.05],
437 | [1199664000000,177.64],
438 | [1199750400000,171.25],
439 | [1199836800000,179.40],
440 | [1199923200000,178.02],
441 | [1200009600000,172.69],
442 | [1200268800000,178.78],
443 | [1200355200000,169.04],
444 | [1200441600000,159.64],
445 | [1200528000000,160.89],
446 | [1200614400000,161.36],
447 | [1200960000000,155.64],
448 | [1201046400000,139.07],
449 | [1201132800000,135.60],
450 | [1201219200000,130.01],
451 | [1201478400000,130.01],
452 | [1201564800000,131.54],
453 | [1201651200000,132.18],
454 | [1201737600000,135.36],
455 | /* Feb 2008 */
456 | [1201824000000,133.75],
457 | [1202083200000,131.65],
458 | [1202169600000,129.36],
459 | [1202256000000,122.00],
460 | [1202342400000,121.24],
461 | [1202428800000,125.48],
462 | [1202688000000,129.45],
463 | [1202774400000,124.86],
464 | [1202860800000,129.40],
465 | [1202947200000,127.46],
466 | [1203033600000,124.63],
467 | [1203379200000,122.18],
468 | [1203465600000,123.82],
469 | [1203552000000,121.54],
470 | [1203638400000,119.46],
471 | [1203897600000,119.74],
472 | [1203984000000,119.15],
473 | [1204070400000,122.96],
474 | [1204156800000,129.91],
475 | [1204243200000,125.02],
476 | /* Mar 2008 */
477 | [1204502400000,121.73],
478 | [1204588800000,124.62],
479 | [1204675200000,124.49],
480 | [1204761600000,120.93],
481 | [1204848000000,122.25],
482 | [1205107200000,119.69],
483 | [1205193600000,127.35],
484 | [1205280000000,126.03],
485 | [1205366400000,127.94],
486 | [1205452800000,126.61],
487 | [1205712000000,126.73],
488 | [1205798400000,132.82],
489 | [1205884800000,129.67],
490 | [1205971200000,133.27],
491 | [1206316800000,139.53],
492 | [1206403200000,140.98],
493 | [1206489600000,145.06],
494 | [1206576000000,140.25],
495 | [1206662400000,143.01],
496 | [1206921600000,143.50],
497 | /* Apr 2008 */
498 | [1207008000000,149.53],
499 | [1207094400000,147.49],
500 | [1207180800000,151.61],
501 | [1207267200000,153.08],
502 | [1207526400000,155.89],
503 | [1207612800000,152.84],
504 | [1207699200000,151.44],
505 | [1207785600000,154.55],
506 | [1207872000000,147.14],
507 | [1208131200000,147.78],
508 | [1208217600000,148.38],
509 | [1208304000000,153.70],
510 | [1208390400000,154.49],
511 | [1208476800000,161.04],
512 | [1208736000000,168.16],
513 | [1208822400000,160.20],
514 | [1208908800000,162.89],
515 | [1208995200000,168.94],
516 | [1209081600000,169.73],
517 | [1209340800000,172.24],
518 | [1209427200000,175.05],
519 | [1209513600000,173.95],
520 | /* May 2008 */
521 | [1209600000000,180.00],
522 | [1209686400000,180.94],
523 | [1209945600000,184.73],
524 | [1210032000000,186.66],
525 | [1210118400000,182.59],
526 | [1210204800000,185.06],
527 | [1210291200000,183.45],
528 | [1210550400000,188.16],
529 | [1210636800000,189.96],
530 | [1210723200000,186.26],
531 | [1210809600000,189.73],
532 | [1210896000000,187.62],
533 | [1211155200000,183.60],
534 | [1211241600000,185.90],
535 | [1211328000000,178.19],
536 | [1211414400000,177.05],
537 | [1211500800000,181.17],
538 | [1211846400000,186.43],
539 | [1211932800000,187.01],
540 | [1212019200000,186.69],
541 | [1212105600000,188.75],
542 | /* Jun 2008 */
543 | [1212364800000,186.10],
544 | [1212451200000,185.37],
545 | [1212537600000,185.19],
546 | [1212624000000,189.43],
547 | [1212710400000,185.64],
548 | [1212969600000,181.61],
549 | [1213056000000,185.64],
550 | [1213142400000,180.81],
551 | [1213228800000,173.26],
552 | [1213315200000,172.37],
553 | [1213574400000,176.84],
554 | [1213660800000,181.43],
555 | [1213747200000,178.75],
556 | [1213833600000,180.90],
557 | [1213920000000,175.27],
558 | [1214179200000,173.16],
559 | [1214265600000,173.25],
560 | [1214352000000,177.39],
561 | [1214438400000,168.26],
562 | [1214524800000,170.09],
563 | [1214784000000,167.44],
564 | /* Jul 2008 */
565 | [1214870400000,174.68],
566 | [1214956800000,168.18],
567 | [1215043200000,170.12],
568 | [1215388800000,175.16],
569 | [1215475200000,179.55],
570 | [1215561600000,174.25],
571 | [1215648000000,176.63],
572 | [1215734400000,172.58],
573 | [1215993600000,173.88],
574 | [1216080000000,169.64],
575 | [1216166400000,172.81],
576 | [1216252800000,171.81],
577 | [1216339200000,165.15],
578 | [1216598400000,166.29],
579 | [1216684800000,162.02],
580 | [1216771200000,166.26],
581 | [1216857600000,159.03],
582 | [1216944000000,162.12],
583 | [1217203200000,154.40],
584 | [1217289600000,157.08],
585 | [1217376000000,159.88],
586 | [1217462400000,158.95],
587 | /* Aug 2008 */
588 | [1217548800000,156.66],
589 | [1217808000000,153.23],
590 | [1217894400000,160.64],
591 | [1217980800000,164.19],
592 | [1218067200000,163.57],
593 | [1218153600000,169.55],
594 | [1218412800000,173.56],
595 | [1218499200000,176.73],
596 | [1218585600000,179.30],
597 | [1218672000000,179.32],
598 | [1218758400000,175.74],
599 | [1219017600000,175.39],
600 | [1219104000000,173.53],
601 | [1219190400000,175.84],
602 | [1219276800000,174.29],
603 | [1219363200000,176.79],
604 | [1219622400000,172.55],
605 | [1219708800000,173.64],
606 | [1219795200000,174.67],
607 | [1219881600000,173.74],
608 | [1219968000000,169.53],
609 | /* Sep 2008 */
610 | [1220313600000,166.19],
611 | [1220400000000,166.96],
612 | [1220486400000,161.22],
613 | [1220572800000,160.18],
614 | [1220832000000,157.92],
615 | [1220918400000,151.68],
616 | [1221004800000,151.61],
617 | [1221091200000,152.65],
618 | [1221177600000,148.94],
619 | [1221436800000,140.36],
620 | [1221523200000,139.88],
621 | [1221609600000,127.83],
622 | [1221696000000,134.09],
623 | [1221782400000,140.91],
624 | [1222041600000,131.05],
625 | [1222128000000,126.84],
626 | [1222214400000,128.71],
627 | [1222300800000,131.93],
628 | [1222387200000,128.24],
629 | [1222646400000,105.26],
630 | [1222732800000,113.66],
631 | /* Oct 2008 */
632 | [1222819200000,109.12],
633 | [1222905600000,100.10],
634 | [1222992000000,97.07],
635 | [1223251200000,98.14],
636 | [1223337600000,89.16],
637 | [1223424000000,89.79],
638 | [1223510400000,88.74],
639 | [1223596800000,96.80],
640 | [1223856000000,110.26],
641 | [1223942400000,104.08],
642 | [1224028800000,97.95],
643 | [1224115200000,101.89],
644 | [1224201600000,97.40],
645 | [1224460800000,98.44],
646 | [1224547200000,91.49],
647 | [1224633600000,96.87],
648 | [1224720000000,98.23],
649 | [1224806400000,96.38],
650 | [1225065600000,92.09],
651 | [1225152000000,99.91],
652 | [1225238400000,104.55],
653 | [1225324800000,111.04],
654 | [1225411200000,107.59],
655 | /* Nov 2008 */
656 | [1225670400000,106.96],
657 | [1225756800000,110.99],
658 | [1225843200000,103.30],
659 | [1225929600000,99.10],
660 | [1226016000000,98.24],
661 | [1226275200000,95.88],
662 | [1226361600000,94.77],
663 | [1226448000000,90.12],
664 | [1226534400000,96.44],
665 | [1226620800000,90.24],
666 | [1226880000000,88.14],
667 | [1226966400000,89.91],
668 | [1227052800000,86.29],
669 | [1227139200000,80.49],
670 | [1227225600000,82.58],
671 | [1227484800000,92.95],
672 | [1227571200000,90.80],
673 | [1227657600000,95.00],
674 | [1227744000000,95.00],
675 | [1227830400000,92.67],
676 | /* Dec 2008 */
677 | [1228089600000,88.93],
678 | [1228176000000,92.47],
679 | [1228262400000,95.90],
680 | [1228348800000,91.41],
681 | [1228435200000,94.00],
682 | [1228694400000,99.72],
683 | [1228780800000,100.06],
684 | [1228867200000,98.21],
685 | [1228953600000,95.00],
686 | [1229040000000,98.27],
687 | [1229299200000,94.75],
688 | [1229385600000,95.43],
689 | [1229472000000,89.16],
690 | [1229558400000,89.43],
691 | [1229644800000,90.00],
692 | [1229904000000,85.74],
693 | [1229990400000,86.38],
694 | [1230076800000,85.04],
695 | [1230163200000,85.04],
696 | [1230249600000,85.81],
697 | [1230508800000,86.61],
698 | [1230595200000,86.29],
699 | [1230681600000,85.35],
700 | /* Jan 2009 */
701 | [1230768000000,85.35],
702 | [1230854400000,90.75],
703 | [1231113600000,94.58],
704 | [1231200000000,93.02],
705 | [1231286400000,91.01],
706 | [1231372800000,92.70],
707 | [1231459200000,90.58],
708 | [1231718400000,88.66],
709 | [1231804800000,87.71],
710 | [1231891200000,85.33],
711 | [1231977600000,83.38],
712 | [1232064000000,82.33],
713 | [1232409600000,78.20],
714 | [1232496000000,82.83],
715 | [1232582400000,88.36],
716 | [1232668800000,88.36],
717 | [1232928000000,89.64],
718 | [1233014400000,90.73],
719 | [1233100800000,94.20],
720 | [1233187200000,93.00],
721 | [1233273600000,90.13],
722 | /* Feb 2009 */
723 | [1233532800000,91.51],
724 | [1233619200000,92.98],
725 | [1233705600000,93.55],
726 | [1233792000000,96.46],
727 | [1233878400000,99.72],
728 | [1234137600000,102.51],
729 | [1234224000000,97.83],
730 | [1234310400000,96.82],
731 | [1234396800000,99.27],
732 | [1234483200000,99.16],
733 | [1234828800000,94.53],
734 | [1234915200000,94.37],
735 | [1235001600000,90.64],
736 | [1235088000000,91.20],
737 | [1235347200000,86.95],
738 | [1235433600000,90.25],
739 | [1235520000000,91.16],
740 | [1235606400000,89.19],
741 | [1235692800000,89.31],
742 | /* Mar 2009 */
743 | [1235952000000,87.94],
744 | [1236038400000,88.37],
745 | [1236124800000,91.17],
746 | [1236211200000,88.84],
747 | [1236297600000,85.30],
748 | [1236556800000,83.11],
749 | [1236643200000,88.63],
750 | [1236729600000,92.68],
751 | [1236816000000,96.35],
752 | [1236902400000,95.93],
753 | [1237161600000,95.42],
754 | [1237248000000,99.66],
755 | [1237334400000,101.52],
756 | [1237420800000,101.62],
757 | [1237507200000,101.59],
758 | [1237766400000,107.66],
759 | [1237852800000,106.50],
760 | [1237939200000,106.49],
761 | [1238025600000,109.87],
762 | [1238112000000,106.85],
763 | [1238371200000,104.49],
764 | [1238457600000,105.12],
765 | /* Apr 2009 */
766 | [1238544000000,108.69],
767 | [1238630400000,112.71],
768 | [1238716800000,115.99],
769 | [1238976000000,118.45],
770 | [1239062400000,115.00],
771 | [1239148800000,116.32],
772 | [1239235200000,119.57],
773 | [1239321600000,119.57],
774 | [1239580800000,120.22],
775 | [1239667200000,118.31],
776 | [1239753600000,117.64],
777 | [1239840000000,121.45],
778 | [1239926400000,123.42],
779 | [1240185600000,120.50],
780 | [1240272000000,121.76],
781 | [1240358400000,121.51],
782 | [1240444800000,125.40],
783 | [1240531200000,123.90],
784 | [1240790400000,124.73],
785 | [1240876800000,123.90],
786 | [1240963200000,125.14],
787 | [1241049600000,125.83],
788 | /* May 2009 */
789 | [1241136000000,127.24],
790 | [1241395200000,132.07],
791 | [1241481600000,132.71],
792 | [1241568000000,132.50],
793 | [1241654400000,129.06],
794 | [1241740800000,129.19],
795 | [1242000000000,129.57],
796 | [1242086400000,124.42],
797 | [1242172800000,119.49],
798 | [1242259200000,122.95],
799 | [1242345600000,122.42],
800 | [1242604800000,126.65],
801 | [1242691200000,127.45],
802 | [1242777600000,125.87],
803 | [1242864000000,124.18],
804 | [1242950400000,122.50],
805 | [1243296000000,130.78],
806 | [1243382400000,133.05],
807 | [1243468800000,135.07],
808 | [1243555200000,135.81],
809 | /* Jun 2009 */
810 | [1243814400000,139.35],
811 | [1243900800000,139.49],
812 | [1243987200000,140.95],
813 | [1244073600000,143.74],
814 | [1244160000000,144.67],
815 | [1244419200000,143.85],
816 | [1244505600000,142.72],
817 | [1244592000000,140.25],
818 | [1244678400000,139.95],
819 | [1244764800000,136.97],
820 | [1245024000000,136.09],
821 | [1245110400000,136.35],
822 | [1245196800000,135.58],
823 | [1245283200000,135.88],
824 | [1245369600000,139.48],
825 | [1245628800000,137.37],
826 | [1245715200000,134.01],
827 | [1245801600000,136.22],
828 | [1245888000000,139.86],
829 | [1245974400000,142.44],
830 | [1246233600000,141.97],
831 | [1246320000000,142.43],
832 | /* Jul 2009 */
833 | [1246406400000,142.83],
834 | [1246492800000,140.02],
835 | [1246579200000,140.02],
836 | [1246838400000,138.61],
837 | [1246924800000,135.40],
838 | [1247011200000,137.22],
839 | [1247097600000,136.36],
840 | [1247184000000,138.52],
841 | [1247443200000,142.34],
842 | [1247529600000,142.27],
843 | [1247616000000,146.88],
844 | [1247702400000,147.52],
845 | [1247788800000,151.75],
846 | [1248048000000,152.91],
847 | [1248134400000,151.51],
848 | [1248220800000,156.74],
849 | [1248307200000,157.82],
850 | [1248393600000,159.99],
851 | [1248652800000,160.10],
852 | [1248739200000,160.00],
853 | [1248825600000,160.03],
854 | [1248912000000,162.79],
855 | [1248998400000,163.39],
856 | /* Aug 2009 */
857 | [1249257600000,166.43],
858 | [1249344000000,165.55],
859 | [1249430400000,165.11],
860 | [1249516800000,163.91],
861 | [1249603200000,165.51],
862 | [1249862400000,164.72],
863 | [1249948800000,162.83],
864 | [1250035200000,165.31],
865 | [1250121600000,168.42],
866 | [1250208000000,166.78],
867 | [1250467200000,159.59],
868 | [1250553600000,164.00],
869 | [1250640000000,164.60],
870 | [1250726400000,166.33],
871 | [1250812800000,169.22],
872 | [1251072000000,169.06],
873 | [1251158400000,169.40],
874 | [1251244800000,167.41],
875 | [1251331200000,169.45],
876 | [1251417600000,170.05],
877 | [1251676800000,168.21],
878 | /* Sep 2009 */
879 | [1251763200000,165.30],
880 | [1251849600000,165.18],
881 | [1251936000000,166.55],
882 | [1252022400000,170.31],
883 | [1252368000000,172.93],
884 | [1252454400000,171.14],
885 | [1252540800000,172.56],
886 | [1252627200000,172.16],
887 | [1252886400000,173.72],
888 | [1252972800000,175.16],
889 | [1253059200000,181.87],
890 | [1253145600000,184.55],
891 | [1253232000000,185.02],
892 | [1253491200000,184.02],
893 | [1253577600000,184.48],
894 | [1253664000000,185.50],
895 | [1253750400000,183.82],
896 | [1253836800000,182.37],
897 | [1254096000000,186.15],
898 | [1254182400000,185.38],
899 | [1254268800000,185.35],
900 | /* Oct 2009 */
901 | [1254355200000,180.86],
902 | [1254441600000,184.90],
903 | [1254700800000,186.02],
904 | [1254787200000,190.01],
905 | [1254873600000,190.25],
906 | [1254960000000,189.27],
907 | [1255046400000,190.47],
908 | [1255305600000,190.81],
909 | [1255392000000,190.02],
910 | [1255478400000,191.29],
911 | [1255564800000,190.56],
912 | [1255651200000,188.05],
913 | [1255910400000,189.86],
914 | [1255996800000,198.76],
915 | [1256083200000,204.92],
916 | [1256169600000,205.20],
917 | [1256256000000,203.94],
918 | [1256515200000,202.48],
919 | [1256601600000,197.37],
920 | [1256688000000,192.40],
921 | [1256774400000,196.35],
922 | [1256860800000,188.50],
923 | /* Nov 2009 */
924 | [1257120000000,189.31],
925 | [1257206400000,188.75],
926 | [1257292800000,190.81],
927 | [1257379200000,194.03],
928 | [1257465600000,194.34],
929 | [1257724800000,201.46],
930 | [1257811200000,202.98],
931 | [1257897600000,203.25],
932 | [1257984000000,201.99],
933 | [1258070400000,204.45],
934 | [1258329600000,206.63],
935 | [1258416000000,207.00],
936 | [1258502400000,205.96],
937 | [1258588800000,200.51],
938 | [1258675200000,199.92],
939 | [1258934400000,205.88],
940 | [1259020800000,204.44],
941 | [1259107200000,204.19],
942 | [1259193600000,204.19],
943 | [1259280000000,200.59],
944 | [1259539200000,199.91],
945 | /* Dec 2009 */
946 | [1259625600000,196.97],
947 | [1259712000000,196.23],
948 | [1259798400000,196.48],
949 | [1259884800000,193.32],
950 | [1260144000000,188.95],
951 | [1260230400000,189.87],
952 | [1260316800000,197.80],
953 | [1260403200000,196.43],
954 | [1260489600000,194.67],
955 | [1260748800000,196.98],
956 | [1260835200000,194.17],
957 | [1260921600000,195.03],
958 | [1261008000000,191.86],
959 | [1261094400000,195.43],
960 | [1261353600000,198.23],
961 | [1261440000000,200.36],
962 | [1261526400000,202.10],
963 | [1261612800000,209.04],
964 | [1261699200000,209.04],
965 | [1261958400000,211.61],
966 | [1262044800000,209.10],
967 | [1262131200000,211.64],
968 | [1262217600000,210.73],
969 | /* Jan 2010 */
970 | [1262304000000,210.73],
971 | [1262563200000,214.01],
972 | [1262649600000,214.38],
973 | [1262736000000,210.97],
974 | [1262822400000,210.58],
975 | [1262908800000,211.98],
976 | [1263168000000,210.11],
977 | [1263254400000,207.72],
978 | [1263340800000,210.65],
979 | [1263427200000,209.43],
980 | [1263513600000,205.93],
981 | [1263772800000,205.93],
982 | [1263859200000,215.04],
983 | [1263945600000,211.72],
984 | [1264032000000,208.07],
985 | [1264118400000,197.75],
986 | [1264377600000,203.08],
987 | [1264464000000,205.94],
988 | [1264550400000,207.88],
989 | [1264636800000,199.29],
990 | [1264723200000,192.06],
991 | /* Feb 2010 */
992 | [1264982400000,194.73],
993 | [1265068800000,195.86],
994 | [1265155200000,199.23],
995 | [1265241600000,192.05],
996 | [1265328000000,195.46],
997 | [1265587200000,194.12],
998 | [1265673600000,196.19],
999 | [1265760000000,195.12],
1000 | [1265846400000,198.67],
1001 | [1265932800000,200.38],
1002 | [1266192000000,200.38],
1003 | [1266278400000,203.40],
1004 | [1266364800000,202.55],
1005 | [1266451200000,202.93],
1006 | [1266537600000,201.67],
1007 | [1266796800000,200.42],
1008 | [1266883200000,197.06],
1009 | [1266969600000,200.66],
1010 | [1267056000000,202.00],
1011 | [1267142400000,204.62],
1012 | /* Mar 2010 */
1013 | [1267401600000,208.99],
1014 | [1267488000000,208.85],
1015 | [1267574400000,209.33],
1016 | [1267660800000,210.71],
1017 | [1267747200000,218.95],
1018 | [1268006400000,219.08],
1019 | [1268092800000,223.02],
1020 | [1268179200000,224.84],
1021 | [1268265600000,225.50],
1022 | [1268352000000,226.60],
1023 | [1268611200000,223.84],
1024 | [1268697600000,224.45],
1025 | [1268784000000,224.12],
1026 | [1268870400000,224.65],
1027 | [1268956800000,222.25],
1028 | [1269216000000,224.75],
1029 | [1269302400000,228.36],
1030 | [1269388800000,229.37],
1031 | [1269475200000,226.65],
1032 | [1269561600000,230.90],
1033 | [1269820800000,232.39],
1034 | [1269907200000,235.84],
1035 | [1269993600000,235.00],
1036 | /* Apr 2010 */
1037 | [1270080000000,235.97],
1038 | [1270166400000,235.97],
1039 | [1270425600000,238.49],
1040 | [1270512000000,239.54],
1041 | [1270598400000,240.60],
1042 | [1270684800000,239.95],
1043 | [1270771200000,241.79],
1044 | [1271030400000,242.29],
1045 | [1271116800000,242.43],
1046 | [1271203200000,245.69],
1047 | [1271289600000,248.92],
1048 | [1271376000000,247.40],
1049 | [1271635200000,247.07],
1050 | [1271721600000,244.59],
1051 | [1271808000000,259.22],
1052 | [1271894400000,266.47],
1053 | [1271980800000,270.83],
1054 | [1272240000000,269.50],
1055 | [1272326400000,262.04],
1056 | [1272412800000,261.60],
1057 | [1272499200000,268.64],
1058 | [1272585600000,261.09],
1059 | /* May 2010 */
1060 | [1272844800000,266.35],
1061 | [1272931200000,258.68],
1062 | [1273017600000,255.98],
1063 | [1273104000000,246.25],
1064 | [1273190400000,235.86],
1065 | [1273449600000,253.99],
1066 | [1273536000000,256.52],
1067 | [1273622400000,262.09],
1068 | [1273708800000,258.36],
1069 | [1273795200000,253.82],
1070 | [1274054400000,254.22],
1071 | [1274140800000,252.36],
1072 | [1274227200000,248.34],
1073 | [1274313600000,237.76],
1074 | [1274400000000,242.32],
1075 | [1274659200000,246.76],
1076 | [1274745600000,245.22],
1077 | [1274832000000,244.11],
1078 | [1274918400000,253.35],
1079 | [1275004800000,256.88],
1080 | [1275264000000,256.88],
1081 | /* Jun 2010 */
1082 | [1275350400000,260.83],
1083 | [1275436800000,263.95],
1084 | [1275523200000,263.12],
1085 | [1275609600000,255.96],
1086 | [1275868800000,250.94],
1087 | [1275955200000,249.33],
1088 | [1276041600000,243.20],
1089 | [1276128000000,250.51],
1090 | [1276214400000,253.51],
1091 | [1276473600000,254.28],
1092 | [1276560000000,259.69],
1093 | [1276646400000,267.25],
1094 | [1276732800000,271.87],
1095 | [1276819200000,274.07],
1096 | [1277078400000,270.17],
1097 | [1277164800000,273.85],
1098 | [1277251200000,270.97],
1099 | [1277337600000,269.00],
1100 | [1277424000000,266.70],
1101 | [1277683200000,268.30],
1102 | [1277769600000,256.17],
1103 | [1277856000000,251.53],
1104 | /* Jul 2010 */
1105 | [1277942400000,248.48],
1106 | [1278028800000,246.94],
1107 | [1278288000000,246.94],
1108 | [1278374400000,248.63],
1109 | [1278460800000,258.66],
1110 | [1278547200000,258.09],
1111 | [1278633600000,259.62],
1112 | [1278892800000,257.28],
1113 | [1278979200000,251.80],
1114 | [1279065600000,252.73],
1115 | [1279152000000,251.45],
1116 | [1279238400000,249.90],
1117 | [1279497600000,245.58],
1118 | [1279584000000,251.89],
1119 | [1279670400000,254.24],
1120 | [1279756800000,259.02],
1121 | [1279843200000,259.94],
1122 | [1280102400000,259.28],
1123 | [1280188800000,264.08],
1124 | [1280275200000,260.96],
1125 | [1280361600000,258.11],
1126 | [1280448000000,257.25],
1127 | /* Aug 2010 */
1128 | [1280707200000,261.85],
1129 | [1280793600000,261.93],
1130 | [1280880000000,262.98],
1131 | [1280966400000,261.70],
1132 | [1281052800000,260.09],
1133 | [1281312000000,261.75],
1134 | [1281398400000,259.41],
1135 | [1281484800000,250.19],
1136 | [1281571200000,251.79],
1137 | [1281657600000,249.10],
1138 | [1281916800000,247.64],
1139 | [1282003200000,251.97],
1140 | [1282089600000,253.07],
1141 | [1282176000000,249.88],
1142 | [1282262400000,249.64],
1143 | [1282521600000,245.80],
1144 | [1282608000000,239.93],
1145 | [1282694400000,242.89],
1146 | [1282780800000,240.28],
1147 | [1282867200000,241.62],
1148 | [1283126400000,242.50],
1149 | [1283212800000,243.10],
1150 | /* Sep 2010 */
1151 | [1283299200000,250.33],
1152 | [1283385600000,252.17],
1153 | [1283472000000,258.77],
1154 | [1283731200000,258.77],
1155 | [1283817600000,257.81],
1156 | [1283904000000,262.92],
1157 | [1283990400000,263.07],
1158 | [1284076800000,263.41],
1159 | [1284336000000,267.04],
1160 | [1284422400000,268.06],
1161 | [1284508800000,270.22],
1162 | [1284595200000,276.57],
1163 | [1284681600000,275.37],
1164 | [1284940800000,283.23],
1165 | [1285027200000,283.77],
1166 | [1285113600000,287.75],
1167 | [1285200000000,288.92],
1168 | [1285286400000,292.32],
1169 | [1285545600000,291.16],
1170 | [1285632000000,286.86],
1171 | [1285718400000,287.37],
1172 | [1285804800000,283.75],
1173 | /* Oct 2010 */
1174 | [1285891200000,282.52],
1175 | [1286150400000,278.64],
1176 | [1286236800000,288.94],
1177 | [1286323200000,289.19],
1178 | [1286409600000,289.22],
1179 | [1286496000000,294.07],
1180 | [1286755200000,295.36],
1181 | [1286841600000,298.54],
1182 | [1286928000000,300.14],
1183 | [1287014400000,302.31],
1184 | [1287100800000,314.74],
1185 | [1287360000000,318.00],
1186 | [1287446400000,309.49],
1187 | [1287532800000,310.53],
1188 | [1287619200000,309.52],
1189 | [1287705600000,307.47],
1190 | [1287964800000,308.84],
1191 | [1288051200000,308.05],
1192 | [1288137600000,307.83],
1193 | [1288224000000,305.24],
1194 | [1288310400000,300.98],
1195 | /* Nov 2010 */
1196 | [1288569600000,304.18],
1197 | [1288656000000,309.36],
1198 | [1288742400000,312.80],
1199 | [1288828800000,318.27],
1200 | [1288915200000,317.13],
1201 | [1289174400000,318.62],
1202 | [1289260800000,316.08],
1203 | [1289347200000,318.03],
1204 | [1289433600000,316.66],
1205 | [1289520000000,308.03],
1206 | [1289779200000,307.04],
1207 | [1289865600000,301.59],
1208 | [1289952000000,300.50],
1209 | [1290038400000,308.43],
1210 | [1290124800000,306.73],
1211 | [1290384000000,313.36],
1212 | [1290470400000,308.73],
1213 | [1290556800000,314.80],
1214 | [1290729600000,315.00],
1215 | [1290988800000,316.87],
1216 | [1291075200000,311.15],
1217 | /* Dec 2010 */
1218 | [1291161600000,316.40],
1219 | [1291248000000,318.15],
1220 | [1291334400000,317.44],
1221 | [1291593600000,320.15],
1222 | [1291680000000,318.21],
1223 | [1291766400000,321.01],
1224 | [1291852800000,319.76],
1225 | [1291939200000,320.56],
1226 | [1292198400000,321.67],
1227 | [1292284800000,320.29],
1228 | [1292371200000,320.36],
1229 | [1292457600000,321.25],
1230 | [1292544000000,320.61],
1231 | [1292803200000,322.21],
1232 | [1292889600000,324.20],
1233 | [1292976000000,325.16],
1234 | [1293062400000,323.60],
1235 | [1293408000000,324.68],
1236 | [1293494400000,325.47],
1237 | [1293580800000,325.29],
1238 | [1293667200000,323.66],
1239 | [1293753600000,322.56],
1240 | /* Jan 2011 */
1241 | [1294012800000,329.57],
1242 | [1294099200000,331.29],
1243 | [1294185600000,334.00],
1244 | [1294272000000,333.73],
1245 | [1294358400000,336.12],
1246 | [1294617600000,342.46],
1247 | [1294704000000,341.64],
1248 | [1294790400000,344.42],
1249 | [1294876800000,345.68],
1250 | [1294963200000,348.48],
1251 | [1295308800000,340.65],
1252 | [1295395200000,338.84],
1253 | [1295481600000,332.68],
1254 | [1295568000000,326.72],
1255 | [1295827200000,337.45],
1256 | [1295913600000,341.40],
1257 | [1296000000000,343.85],
1258 | [1296086400000,343.21],
1259 | [1296172800000,336.10],
1260 | [1296432000000,339.32],
1261 | /* Feb 2011 */
1262 | [1296518400000,345.03],
1263 | [1296604800000,344.32],
1264 | [1296691200000,343.44],
1265 | [1296777600000,346.50],
1266 | [1297036800000,351.88],
1267 | [1297123200000,355.20],
1268 | [1297209600000,358.16],
1269 | [1297296000000,354.54],
1270 | [1297382400000,356.85],
1271 | [1297641600000,359.18],
1272 | [1297728000000,359.90],
1273 | [1297814400000,363.13],
1274 | [1297900800000,358.30],
1275 | [1297987200000,350.56],
1276 | [1298332800000,338.61],
1277 | [1298419200000,342.62],
1278 | [1298505600000,342.88],
1279 | [1298592000000,348.16],
1280 | [1298851200000,353.21],
1281 | /* Mar 2011 */
1282 | [1298937600000,349.31],
1283 | [1299024000000,352.12],
1284 | [1299110400000,359.56],
1285 | [1299196800000,360.00],
1286 | [1299456000000,355.36],
1287 | [1299542400000,355.76],
1288 | [1299628800000,352.47],
1289 | [1299715200000,346.67],
1290 | [1299801600000,351.99],
1291 | [1300060800000,353.56],
1292 | [1300147200000,345.43],
1293 | [1300233600000,330.01],
1294 | [1300320000000,334.64],
1295 | [1300406400000,330.67],
1296 | [1300665600000,339.30],
1297 | [1300752000000,341.20],
1298 | [1300838400000,339.19],
1299 | [1300924800000,344.97],
1300 | [1301011200000,351.54],
1301 | [1301270400000,350.44],
1302 | [1301356800000,350.96],
1303 | [1301443200000,348.63],
1304 | [1301529600000,348.51],
1305 | /* Apr 2011 */
1306 | [1301616000000,344.56],
1307 | [1301875200000,341.19],
1308 | [1301961600000,338.89],
1309 | [1302048000000,338.04],
1310 | [1302134400000,338.08],
1311 | [1302220800000,335.06],
1312 | [1302480000000,330.80],
1313 | [1302566400000,332.40],
1314 | [1302652800000,336.13],
1315 | [1302739200000,332.42],
1316 | [1302825600000,327.46],
1317 | [1303084800000,331.85],
1318 | [1303171200000,337.86],
1319 | [1303257600000,342.41],
1320 | [1303344000000,350.70],
1321 | [1303689600000,353.01],
1322 | [1303776000000,350.42],
1323 | [1303862400000,350.15],
1324 | [1303948800000,346.75],
1325 | [1304035200000,350.13],
1326 | /* May 2011 */
1327 | [1304294400000,346.28],
1328 | [1304380800000,348.20],
1329 | [1304467200000,349.57],
1330 | [1304553600000,346.75],
1331 | [1304640000000,346.66],
1332 | [1304899200000,347.60],
1333 | [1304985600000,349.45],
1334 | [1305072000000,347.23],
1335 | [1305158400000,346.57],
1336 | [1305244800000,340.50],
1337 | [1305504000000,333.30],
1338 | [1305590400000,336.14],
1339 | [1305676800000,339.87],
1340 | [1305763200000,340.53],
1341 | [1305849600000,335.22],
1342 | [1306108800000,334.40],
1343 | [1306195200000,332.19],
1344 | [1306281600000,336.78],
1345 | [1306368000000,335.00],
1346 | [1306454400000,337.41],
1347 | [1306800000000,347.83],
1348 | /* Jun 2011 */
1349 | [1306886400000,345.51],
1350 | [1306972800000,346.10],
1351 | [1307059200000,343.44],
1352 | [1307318400000,338.04],
1353 | [1307404800000,332.04],
1354 | [1307491200000,332.24],
1355 | [1307577600000,331.49],
1356 | [1307664000000,325.90],
1357 | [1307923200000,326.60],
1358 | [1308009600000,332.44],
1359 | [1308096000000,326.75],
1360 | [1308182400000,325.16],
1361 | [1308268800000,320.26],
1362 | [1308528000000,315.32],
1363 | [1308614400000,325.30],
1364 | [1308700800000,322.61],
1365 | [1308787200000,331.23],
1366 | [1308873600000,326.35],
1367 | [1309132800000,332.04],
1368 | [1309219200000,335.26],
1369 | [1309305600000,334.04],
1370 | [1309392000000,335.67],
1371 | /* Jul 2011 */
1372 | [1309478400000,343.26],
1373 | [1309824000000,349.43],
1374 | [1309910400000,351.76],
1375 | [1309996800000,357.20],
1376 | [1310083200000,359.71],
1377 | [1310342400000,354.00],
1378 | [1310428800000,353.75],
1379 | [1310515200000,358.02],
1380 | [1310601600000,357.77],
1381 | [1310688000000,364.92],
1382 | [1310947200000,373.80],
1383 | [1311033600000,376.85],
1384 | [1311120000000,386.90],
1385 | [1311206400000,387.29],
1386 | [1311292800000,393.30],
1387 | [1311552000000,398.50],
1388 | [1311638400000,403.41],
1389 | [1311724800000,392.59],
1390 | [1311811200000,391.82],
1391 | [1311897600000,390.48],
1392 | /* Aug 2011 */
1393 | [1312156800000,396.75],
1394 | [1312243200000,388.21],
1395 | [1312329600000,392.57],
1396 | [1312416000000,377.37],
1397 | [1312502400000,373.62],
1398 | [1312761600000,353.21],
1399 | [1312848000000,374.01],
1400 | [1312934400000,363.69],
1401 | [1313020800000,373.70],
1402 | [1313107200000,376.99],
1403 | [1313366400000,383.41],
1404 | [1313452800000,380.48],
1405 | [1313539200000,380.44],
1406 | [1313625600000,366.05],
1407 | [1313712000000,356.03],
1408 | [1313971200000,356.44],
1409 | [1314057600000,373.60],
1410 | [1314144000000,376.18],
1411 | [1314230400000,373.72],
1412 | [1314316800000,383.58],
1413 | [1314576000000,389.97],
1414 | [1314662400000,389.99],
1415 | [1314748800000,384.83],
1416 | /* Sep 2011 */
1417 | [1314835200000,381.03],
1418 | [1314921600000,374.05],
1419 | [1315267200000,379.74],
1420 | [1315353600000,383.93],
1421 | [1315440000000,384.14],
1422 | [1315526400000,377.48],
1423 | [1315785600000,379.94],
1424 | [1315872000000,384.62],
1425 | [1315958400000,389.30],
1426 | [1316044800000,392.96],
1427 | [1316131200000,400.50],
1428 | [1316390400000,411.63],
1429 | [1316476800000,413.45],
1430 | [1316563200000,412.14],
1431 | [1316649600000,401.82],
1432 | [1316736000000,404.30],
1433 | [1316995200000,403.17],
1434 | [1317081600000,399.26],
1435 | [1317168000000,397.01],
1436 | [1317254400000,390.57],
1437 | [1317340800000,381.32],
1438 | /* Oct 2011 */
1439 | [1317600000000,374.60],
1440 | [1317686400000,372.50],
1441 | [1317772800000,378.25],
1442 | [1317859200000,377.37],
1443 | [1317945600000,369.80],
1444 | [1318204800000,388.81],
1445 | [1318291200000,400.29],
1446 | [1318377600000,402.19],
1447 | [1318464000000,408.43],
1448 | [1318550400000,422.00],
1449 | [1318809600000,419.99],
1450 | [1318896000000,422.24],
1451 | [1318982400000,398.62],
1452 | [1319068800000,395.31],
1453 | [1319155200000,392.87],
1454 | [1319414400000,405.77],
1455 | [1319500800000,397.77],
1456 | [1319587200000,400.60],
1457 | [1319673600000,404.69],
1458 | [1319760000000,404.95],
1459 | [1320019200000,404.78],
1460 | /* Nov 2011 */
1461 | [1320105600000,396.51],
1462 | [1320192000000,397.41],
1463 | [1320278400000,403.07],
1464 | [1320364800000,400.24],
1465 | [1320624000000,399.73],
1466 | [1320710400000,406.23],
1467 | [1320796800000,395.28],
1468 | [1320883200000,385.22],
1469 | [1320969600000,384.62],
1470 | [1321228800000,379.26],
1471 | [1321315200000,388.83],
1472 | [1321401600000,384.77],
1473 | [1321488000000,377.41],
1474 | [1321574400000,374.94],
1475 | [1321833600000,369.01],
1476 | [1321920000000,376.51],
1477 | [1322006400000,366.99],
1478 | [1322179200000,363.57],
1479 | [1322438400000,376.12],
1480 | [1322524800000,373.20],
1481 | [1322611200000,382.20],
1482 | /* Dec 2011 */
1483 | [1322697600000,387.93],
1484 | [1322784000000,389.70],
1485 | [1323043200000,393.01],
1486 | [1323129600000,390.95],
1487 | [1323216000000,389.09],
1488 | [1323302400000,390.66],
1489 | [1323388800000,393.62],
1490 | [1323648000000,391.84],
1491 | [1323734400000,388.81],
1492 | [1323820800000,380.19],
1493 | [1323907200000,378.94],
1494 | [1323993600000,381.02],
1495 | [1324252800000,382.21],
1496 | [1324339200000,395.95],
1497 | [1324425600000,396.44],
1498 | [1324512000000,398.55],
1499 | [1324598400000,403.33],
1500 | [1324944000000,406.53],
1501 | [1325030400000,402.64],
1502 | [1325116800000,405.12],
1503 | [1325203200000,405.00],
1504 | /* Jan 2012 */
1505 | [1325548800000,411.23],
1506 | [1325635200000,413.44],
1507 | [1325721600000,418.03],
1508 | [1325808000000,422.40],
1509 | [1326067200000,421.73],
1510 | [1326153600000,423.24],
1511 | [1326240000000,422.55],
1512 | [1326326400000,421.39],
1513 | [1326412800000,419.81],
1514 | [1326758400000,424.70],
1515 | [1326844800000,429.11],
1516 | [1326931200000,427.75],
1517 | [1327017600000,420.30],
1518 | [1327276800000,427.41],
1519 | [1327363200000,420.41],
1520 | [1327449600000,446.66],
1521 | [1327536000000,444.63],
1522 | [1327622400000,447.28],
1523 | [1327881600000,453.01],
1524 | [1327968000000,456.48],
1525 | /* Feb 2012 */
1526 | [1328054400000,456.19],
1527 | [1328140800000,455.12],
1528 | [1328227200000,459.68],
1529 | [1328486400000,463.97],
1530 | [1328572800000,468.83],
1531 | [1328659200000,476.68],
1532 | [1328745600000,493.17],
1533 | [1328832000000,493.42],
1534 | [1329091200000,502.60],
1535 | [1329177600000,509.46],
1536 | [1329264000000,497.67],
1537 | [1329350400000,502.21],
1538 | [1329436800000,502.12],
1539 | [1329782400000,514.85],
1540 | [1329868800000,513.04],
1541 | [1329955200000,516.39],
1542 | [1330041600000,522.41],
1543 | [1330300800000,525.76],
1544 | [1330387200000,535.41],
1545 | [1330473600000,542.44],
1546 | /* Mar 2012 */
1547 | [1330560000000,544.47],
1548 | [1330646400000,545.18],
1549 | [1330905600000,533.16],
1550 | [1330992000000,530.26],
1551 | [1331078400000,530.69],
1552 | [1331164800000,541.99],
1553 | [1331251200000,545.17],
1554 | [1331510400000,552.00],
1555 | [1331596800000,568.10],
1556 | [1331683200000,589.58],
1557 | [1331769600000,585.56],
1558 | [1331856000000,585.57],
1559 | [1332115200000,601.10],
1560 | [1332201600000,605.96],
1561 | [1332288000000,602.50],
1562 | [1332374400000,599.34],
1563 | [1332460800000,596.05],
1564 | [1332720000000,606.98],
1565 | [1332806400000,614.48],
1566 | [1332892800000,617.62],
1567 | [1332979200000,609.86],
1568 | [1333065600000,599.55],
1569 | /* Apr 2012 */
1570 | [1333324800000,618.63],
1571 | [1333411200000,629.32],
1572 | [1333497600000,624.31],
1573 | [1333584000000,633.68],
1574 | [1333929600000,636.23],
1575 | [1334016000000,628.44],
1576 | [1334102400000,626.20],
1577 | [1334188800000,622.77],
1578 | [1334275200000,605.23],
1579 | [1334534400000,580.13],
1580 | [1334620800000,609.70],
1581 | [1334707200000,608.34],
1582 | [1334793600000,587.44],
1583 | [1334880000000,572.98],
1584 | [1335139200000,571.70],
1585 | [1335225600000,560.28],
1586 | [1335312000000,610.00],
1587 | [1335398400000,607.70],
1588 | [1335484800000,603.00],
1589 | [1335744000000,583.98],
1590 | /* May 2012 */
1591 | [1335830400000,582.13],
1592 | [1335916800000,585.98],
1593 | [1336003200000,581.82],
1594 | [1336089600000,565.25],
1595 | [1336348800000,569.48],
1596 | [1336435200000,568.18],
1597 | [1336521600000,569.18],
1598 | [1336608000000,570.52],
1599 | [1336694400000,566.71],
1600 | [1336953600000,558.22],
1601 | [1337040000000,553.17],
1602 | [1337126400000,546.08],
1603 | [1337212800000,530.12],
1604 | [1337299200000,530.38],
1605 | [1337558400000,561.28],
1606 | [1337644800000,556.97],
1607 | [1337731200000,570.56],
1608 | [1337817600000,565.32],
1609 | [1337904000000,562.29],
1610 | [1338249600000,572.27],
1611 | [1338336000000,579.17],
1612 | [1338422400000,577.73],
1613 | /* Jun 2012 */
1614 | [1338508800000,560.99],
1615 | [1338768000000,564.29],
1616 | [1338854400000,562.83],
1617 | [1338940800000,571.46],
1618 | [1339027200000,571.72],
1619 | [1339113600000,580.32],
1620 | [1339372800000,571.17],
1621 | [1339459200000,576.16],
1622 | [1339545600000,572.16],
1623 | [1339632000000,571.53],
1624 | [1339718400000,574.13],
1625 | [1339977600000,585.78],
1626 | [1340064000000,587.41],
1627 | [1340150400000,585.74],
1628 | [1340236800000,577.67],
1629 | [1340323200000,582.10],
1630 | [1340582400000,570.76],
1631 | [1340668800000,572.02],
1632 | [1340755200000,574.50],
1633 | [1340841600000,569.05],
1634 | [1340928000000,584.00],
1635 | /* Jul 2012 */
1636 | [1341187200000,592.52],
1637 | [1341273600000,599.41],
1638 | [1341446400000,609.94],
1639 | [1341532800000,605.88],
1640 | [1341792000000,613.89],
1641 | [1341878400000,608.21],
1642 | [1341964800000,604.43],
1643 | [1342051200000,598.90],
1644 | [1342137600000,604.97],
1645 | [1342396800000,606.91],
1646 | [1342483200000,606.94],
1647 | [1342569600000,606.26],
1648 | [1342656000000,614.32],
1649 | [1342742400000,604.30],
1650 | [1343001600000,603.83],
1651 | [1343088000000,600.92],
1652 | [1343174400000,574.97],
1653 | [1343260800000,574.88],
1654 | [1343347200000,585.16],
1655 | [1343606400000,595.03],
1656 | [1343692800000,610.76],
1657 | /* Aug 2012 */
1658 | [1343779200000,606.81],
1659 | [1343865600000,607.79],
1660 | [1343952000000,615.70],
1661 | [1344211200000,622.55],
1662 | [1344297600000,620.91],
1663 | [1344384000000,619.86],
1664 | [1344470400000,620.73],
1665 | [1344556800000,621.70],
1666 | [1344816000000,630.00],
1667 | [1344902400000,631.69],
1668 | [1344988800000,630.83],
1669 | [1345075200000,636.34],
1670 | [1345161600000,648.11],
1671 | [1345420800000,665.15],
1672 | [1345507200000,656.06],
1673 | [1345593600000,668.87],
1674 | [1345680000000,662.63],
1675 | [1345766400000,663.22],
1676 | [1346025600000,675.68],
1677 | [1346112000000,674.80],
1678 | [1346198400000,673.47],
1679 | [1346284800000,663.87],
1680 | [1346371200000,665.24],
1681 | /* Sep 2012 */
1682 | [1346716800000,674.97],
1683 | [1346803200000,670.23],
1684 | [1346889600000,676.27],
1685 | [1346976000000,680.44],
1686 | [1347235200000,662.74],
1687 | [1347321600000,660.59],
1688 | [1347408000000,669.79],
1689 | [1347494400000,682.98],
1690 | [1347580800000,691.28],
1691 | [1347840000000,699.78],
1692 | [1347926400000,701.91],
1693 | [1348012800000,702.10],
1694 | [1348099200000,698.70],
1695 | [1348185600000,700.10],
1696 | [1348444800000,690.79],
1697 | [1348531200000,673.54],
1698 | [1348617600000,665.18],
1699 | [1348704000000,681.32],
1700 | [1348790400000,667.10],
1701 | /* Oct 2012 */
1702 | [1349049600000,659.39],
1703 | [1349136000000,661.31],
1704 | [1349222400000,671.45],
1705 | [1349308800000,666.80],
1706 | [1349395200000,652.59],
1707 | [1349654400000,638.17],
1708 | [1349740800000,635.85],
1709 | [1349827200000,640.91],
1710 | [1349913600000,628.10],
1711 | [1350000000000,629.71],
1712 | [1350259200000,634.76],
1713 | [1350345600000,649.79],
1714 | [1350432000000,644.61],
1715 | [1350518400000,632.64],
1716 | [1350604800000,609.84],
1717 | [1350864000000,634.03],
1718 | [1350950400000,613.36],
1719 | [1351036800000,616.83],
1720 | [1351123200000,609.54],
1721 | [1351209600000,604.00],
1722 | [1351641600000,595.32],
1723 | /* Nov 2012 */
1724 | [1351728000000,596.54],
1725 | [1351814400000,576.80],
1726 | [1352073600000,584.62],
1727 | [1352160000000,582.85],
1728 | [1352246400000,558.00],
1729 | [1352332800000,537.75],
1730 | [1352419200000,547.06],
1731 | [1352678400000,542.83],
1732 | [1352764800000,542.90],
1733 | [1352851200000,536.88],
1734 | [1352937600000,525.62],
1735 | [1353024000000,527.68],
1736 | [1353283200000,565.73],
1737 | [1353369600000,560.91],
1738 | [1353456000000,561.70],
1739 | [1353628800000,571.50],
1740 | [1353888000000,589.53],
1741 | [1353974400000,584.78],
1742 | [1354060800000,582.94],
1743 | [1354147200000,589.36],
1744 | [1354233600000,585.28],
1745 | /* Dec 2012 */
1746 | [1354492800000,586.19],
1747 | [1354579200000,575.85],
1748 | [1354665600000,538.79],
1749 | [1354752000000,547.24],
1750 | [1354838400000,533.25],
1751 | [1355097600000,529.82],
1752 | [1355184000000,541.39],
1753 | [1355270400000,539.00],
1754 | [1355356800000,529.69],
1755 | [1355443200000,509.79],
1756 | [1355702400000,518.83],
1757 | [1355788800000,533.90],
1758 | [1355875200000,526.31],
1759 | [1355961600000,521.73],
1760 | [1356048000000,519.33],
1761 | [1356307200000,520.17],
1762 | [1356480000000,513.00],
1763 | [1356566400000,515.06],
1764 | [1356652800000,509.59],
1765 | [1356912000000,532.17],
1766 | /* Jan 2013 */
1767 | [1357084800000,549.03],
1768 | [1357171200000,542.10],
1769 | [1357257600000,527.00],
1770 | [1357516800000,523.90],
1771 | [1357603200000,525.31],
1772 | [1357689600000,517.10],
1773 | [1357776000000,523.51],
1774 | [1357862400000,520.30],
1775 | [1358121600000,501.75],
1776 | [1358208000000,485.92],
1777 | [1358294400000,506.09],
1778 | [1358380800000,502.68],
1779 | [1358467200000,500.00],
1780 | [1358812800000,504.77],
1781 | [1358899200000,514.00],
1782 | [1358985600000,450.50],
1783 | [1359072000000,439.88],
1784 | [1359331200000,449.83],
1785 | [1359417600000,458.27],
1786 | [1359504000000,456.83],
1787 | [1359590400000,455.49],
1788 | /* Feb 2013 */
1789 | [1359676800000,453.62],
1790 | [1359936000000,442.32],
1791 | [1360022400000,457.84],
1792 | [1360108800000,457.35],
1793 | [1360195200000,468.22],
1794 | [1360281600000,474.98],
1795 | [1360540800000,479.93],
1796 | [1360627200000,467.90],
1797 | [1360713600000,467.01],
1798 | [1360800000000,466.59],
1799 | [1360886400000,460.16],
1800 | [1361232000000,459.99],
1801 | [1361318400000,448.85],
1802 | [1361404800000,446.06],
1803 | [1361491200000,450.81],
1804 | [1361750400000,442.80],
1805 | [1361836800000,448.97],
1806 | [1361923200000,444.57],
1807 | [1362009600000,441.40],
1808 | /* Mar 2013 */
1809 | [1362096000000,430.47],
1810 | [1362355200000,420.05],
1811 | [1362441600000,431.14],
1812 | [1362528000000,425.66],
1813 | [1362614400000,430.58],
1814 | [1362700800000,431.72],
1815 | [1362960000000,437.87],
1816 | [1363046400000,428.43],
1817 | [1363132800000,428.35],
1818 | [1363219200000,432.50],
1819 | [1363305600000,443.66],
1820 | [1363564800000,455.72],
1821 | [1363651200000,454.49],
1822 | [1363737600000,452.08],
1823 | [1363824000000,452.73],
1824 | [1363910400000,461.91],
1825 | [1364169600000,463.58],
1826 | [1364256000000,461.14],
1827 | [1364342400000,452.08],
1828 | [1364428800000,442.66],
1829 | /* Apr 2013 */
1830 | [1364774400000,428.91],
1831 | [1364860800000,429.79],
1832 | [1364947200000,431.99],
1833 | [1365033600000,427.72],
1834 | [1365120000000,423.20],
1835 | [1365379200000,426.21],
1836 | [1365465600000,426.98],
1837 | [1365552000000,435.69],
1838 | [1365638400000,434.33],
1839 | [1365724800000,429.80],
1840 | [1365984000000,419.85],
1841 | [1366070400000,426.24],
1842 | [1366156800000,402.80],
1843 | [1366243200000,392.05],
1844 | [1366329600000,390.53],
1845 | [1366588800000,398.67],
1846 | [1366675200000,406.13],
1847 | [1366761600000,405.46],
1848 | [1366848000000,408.38],
1849 | [1366934400000,417.20],
1850 | [1367193600000,430.12],
1851 | [1367280000000,442.78],
1852 | /* May 2013 */
1853 | [1367366400000,439.29],
1854 | [1367452800000,445.52],
1855 | [1367539200000,449.98],
1856 | [1367798400000,460.71],
1857 | [1367884800000,458.66],
1858 | [1367971200000,463.84],
1859 | [1368057600000,456.77],
1860 | [1368144000000,452.97]
1861 | ];
1862 |
--------------------------------------------------------------------------------