├── 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 | --------------------------------------------------------------------------------