
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css"/>
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/facePrint.js"></script>
    </head>
    <body>
        <style>
            #main {
                width: 900px;
                height: 650px;
                border: 9px solid #eee;
            }
        </style>
        <div id="info"></div>
        <div id="main"></div>
        <script>

            /**
             * @see <https://en.wikipedia.org/wiki/Michelson%E2%80%93Morley_experiment>
             * @see <http://bl.ocks.org/mbostock/4061502>
             */
            var chart;
            var data;
            var mean;

            require([
                'echarts',
                'data/Michelson-Morley.json'
            ], function (echarts, rawData) {
                var env = echarts.env;

                chart = echarts.init(document.getElementById('main'));

                update('horizontal');

                initControlPanel(env);

                function update(layout) {

                    // mean = calculateMean(rawData);

                    var categoryAxis = {
                        type: 'category',
                        boundaryGap: true,
                        nameGap: 30,
                        splitArea: {
                            show: false
                        },
                        splitLine: {
                            show: false
                        }
                    };
                    var valueAxis = {
                        type: 'value',
                        name: 'km/s minus 299,000',
                        splitArea: {
                            show: true
                        }
                    };

                    chart.setOption({
                        aria: {
                            show: true
                        },
                        dataset: [{
                            source: rawData
                        }, {
                            transform: {
                                type: 'boxplot',
                                config: { itemNameFormatter: 'expr {value}' }
                            }
                        }, {
                            fromDatasetIndex: 1,
                            fromTransformResult: 1
                        }],
                        title: [
                            {
                                text: 'Michelson-Morley Experiment',
                                left: 'center'
                            },
                            {
                                text: 'upper: Q3 + 1.5 * IRQ \nlower: Q1 - 1.5 * IRQ',
                                borderColor: '#999',
                                borderWidth: 1,
                                textStyle: {
                                    fontSize: 14
                                },
                                left: '10%',
                                top: '90%'
                            }
                        ],
                        legend: {
                            left: 'right'
                        },
                        tooltip: {
                            trigger: 'item',
                            axisPointer: {
                                type: 'shadow'
                            }
                        },
                        grid: {
                            left: '10%',
                            right: '10%',
                            bottom: '15%'
                        },
                        xAxis: layout === 'horizontal' ? categoryAxis : valueAxis,
                        yAxis: layout === 'vertical' ? categoryAxis : valueAxis,
                        series: [
                            {
                                name: 'boxplot',
                                type: 'boxplot',
                                datasetIndex: 1,

                                markPoint: {
                                    data: [
                                        {
                                            name: '某个坐标',
                                            coord: [2, 300]
                                        },
                                        {
                                            name: '某个屏幕坐标',
                                            x: 100,
                                            y: 200,
                                            label: {
                                                normal: {
                                                    show: false,
                                                    formatter: 'asdf'
                                                },
                                                emphasis: {
                                                    show: true,
                                                    position: 'top',
                                                    formatter: 'zxcv'
                                                }
                                            }
                                        },
                                        {
                                            name: 'max value (default)',
                                            type: 'max'
                                        },
                                        {
                                            name: 'min value (default)',
                                            type: 'min'
                                        },
                                        {
                                            name: 'max value (dim:Q1)',
                                            type: 'max',
                                            valueDim: 'Q1'
                                        },
                                        {
                                            name: 'average value (dim:Q1)',
                                            type: 'average',
                                            valueDim: 'Q1'
                                        }
                                    ]
                                },

                                markLine: {
                                    data: [
                                        [
                                            {name: '两个坐标之间的标线', coord: [1, 240]},
                                            {coord: [2, 260]}
                                        ],
                                        [
                                            {name: '两个屏幕坐标之间的标线', x: 50, y: 60},
                                            {x: 70, y: 90}
                                        ],
                                        [
                                            {name: 'max - min', type: 'max'},
                                            {type: 'min'}
                                        ],
                                        {
                                            name: 'min line',
                                            type: 'min'
                                        },
                                        {
                                            name: 'max line on dim:Q3',
                                            type: 'max',
                                            valueDim: 'Q3'
                                        }
                                    ]
                                }

                            },
                            {
                                name: 'outlier',
                                type: 'scatter',
                                datasetIndex: 2
                            }
                        ]
                    });
                }

                // function calculateMean(rawData) {
                //     var sum = 0;
                //     var count = 0;
                //     for (var i = 0, len = rawData.length; i < len; i++) {
                //         for (var j = 0, lenj = rawData[i].length; j < lenj; j++) {
                //             var value = rawData[i][j];
                //             count++;
                //             if (!isNaN(value) && value != null && value !== '') {
                //                 sum += value;
                //             }
                //         }
                //     }
                //     return sum / count;
                // };


                function initControlPanel(env) {
                    if (!env.browser.ie || env.browser.ie.version > 8) {

                        var scr = document.createElement('script');
                        scr.src = 'lib/dat.gui.min.js';
                        scr.onload = function () {
                            var gui = new dat.GUI();
                            var config = {
                                layout: 'horizontal'
                            };
                            gui
                                .add(config, 'layout', ['horizontal', 'vertical'])
                                .onChange(update);
                        };
                        document.head.appendChild(scr);
                    }
                }
            });

        </script>
    </body>
</html>