<!DOCTYPE html>
<!--
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" />
        <script src="lib/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <!-- <script src="ut/lib/canteen.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>



        <div id="main0"></div>
        <div id="main1"></div>
        <div id="main2"></div>





        <script>
            function makeToggleChartButtons(changeFocus) {
                return  [{
                    text: 'Set focus: series',
                    onclick: function () {
                        changeFocus({ focus: 'series' });
                    }
                }, {
                    text: 'Set focus: self',
                    onclick: function () {
                        changeFocus({ focus: 'self' });
                    }
                }, {
                    text: 'Set blurScope: series',
                    onclick: function () {
                        changeFocus({ blurScope: 'series' });
                    }
                }, {
                    text: 'Set blurScope: coordinateSystem',
                    onclick: function () {
                        changeFocus({ blurScope: 'coordinateSystem' });
                    }
                }, {
                    text: 'Set blurScope: global',
                    onclick: function () {
                        changeFocus({ blurScope: 'global' });
                    }
                }];
            }
        </script>

        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            var option;

            option = {
                grid: {
                    right: '20%'
                },
                legend: {
                    data: ['蒸发量', '降水量', '平均温度']
                },
                xAxis: [
                    {
                        type: 'category',
                        axisTick: {
                            alignWithLabel: true
                        },
                        data: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                    }
                ],
                yAxis: [
                    {
                        type: 'value',
                        name: '蒸发量',
                        min: 0,
                        max: 250,
                        position: 'right',
                        axisLabel: {
                            formatter: '{value} ml'
                        }
                    },
                    {
                        type: 'value',
                        name: '降水量',
                        min: 0,
                        max: 250,
                        position: 'right',
                        offset: 80,
                        axisLabel: {
                            formatter: '{value} ml'
                        }
                    },
                    {
                        type: 'value',
                        name: '温度',
                        min: 0,
                        max: 25,
                        position: 'left',
                        axisLabel: {
                            formatter: '{value} °C'
                        }
                    }
                ],
                series: [
                    {
                        name: '蒸发量',
                        type: 'bar',
                        data: [2.0, 4.9, 7.0, 23.2, 25.6, 76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3]
                    },
                    {
                        name: '降水量',
                        type: 'bar',
                        yAxisIndex: 1,
                        data: [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3]
                    },
                    {
                        name: '平均温度',
                        type: 'line',
                        yAxisIndex: 2,
                        data: [2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2]
                    }
                ]
            };


            var chart = testHelper.create(echarts, 'main0', {
                title: [
                    'Multiple series on same grid'
                ],
                buttons: makeToggleChartButtons(function (newOpt) {
                    option.series.forEach(function (seriesOpt) {
                        seriesOpt.emphasis = Object.assign(seriesOpt.emphasis || {}, newOpt)
                    });
                    chart.setOption(option);
                }),
                option: option
            });
        });
        </script>


        <script>
            require(['echarts'/*, 'map/js/china' */], function (echarts) {
                var dataAll = [
                    [
                        [10.0, 8.04],
                        [8.0, 6.95],
                        [13.0, 7.58],
                        [9.0, 8.81],
                        [11.0, 8.33],
                        [14.0, 9.96],
                        [6.0, 7.24],
                        [4.0, 4.26],
                        [12.0, 10.84],
                        [7.0, 4.82],
                        [5.0, 5.68]
                    ],
                    [
                        [10.0, 9.14],
                        [8.0, 8.14],
                        [13.0, 8.74],
                        [9.0, 8.77],
                        [11.0, 9.26],
                        [14.0, 8.10],
                        [6.0, 6.13],
                        [4.0, 3.10],
                        [12.0, 9.13],
                        [7.0, 7.26],
                        [5.0, 4.74]
                    ],
                    [
                        [10.0, 7.46],
                        [8.0, 6.77],
                        [13.0, 12.74],
                        [9.0, 7.11],
                        [11.0, 7.81],
                        [14.0, 8.84],
                        [6.0, 6.08],
                        [4.0, 5.39],
                        [12.0, 8.15],
                        [7.0, 6.42],
                        [5.0, 5.73]
                    ],
                    [
                        [8.0, 6.58],
                        [8.0, 5.76],
                        [8.0, 7.71],
                        [8.0, 8.84],
                        [8.0, 8.47],
                        [8.0, 7.04],
                        [8.0, 5.25],
                        [19.0, 12.50],
                        [8.0, 5.56],
                        [8.0, 7.91],
                        [8.0, 6.89]
                    ]
                ];

                var markLineOpt = {
                    animation: false,
                    label: {
                        formatter: 'y = 0.5 * x + 3',
                        align: 'right'
                    },
                    lineStyle: {
                        type: 'solid'
                    },
                    tooltip: {
                        formatter: 'y = 0.5 * x + 3'
                    },
                    data: [[{
                        coord: [0, 3],
                        symbol: 'none'
                    }, {
                        coord: [20, 13],
                        symbol: 'none'
                    }]]
                };

                option = {
                    title: {
                        text: 'Anscombe\'s quartet',
                        left: 'center',
                        top: 0
                    },
                    grid: [
                        {x: '7%', y: '7%', width: '38%', height: '38%'},
                        {x2: '7%', y: '7%', width: '38%', height: '38%'},
                        {x: '7%', y2: '7%', width: '38%', height: '38%'},
                        {x2: '7%', y2: '7%', width: '38%', height: '38%'}
                    ],
                    tooltip: {
                        formatter: 'Group {a}: ({c})'
                    },
                    xAxis: [
                        {gridIndex: 0, min: 0, max: 20},
                        {gridIndex: 1, min: 0, max: 20},
                        {gridIndex: 2, min: 0, max: 20},
                        {gridIndex: 3, min: 0, max: 20}
                    ],
                    yAxis: [
                        {gridIndex: 0, min: 0, max: 15},
                        {gridIndex: 1, min: 0, max: 15},
                        {gridIndex: 2, min: 0, max: 15},
                        {gridIndex: 3, min: 0, max: 15}
                    ],
                    series: [
                        {
                            name: 'I',
                            type: 'scatter',
                            xAxisIndex: 0,
                            yAxisIndex: 0,
                            data: dataAll[0],
                            symbolSize: 20,
                            markLine: markLineOpt
                        },
                        {
                            name: 'II',
                            type: 'scatter',
                            xAxisIndex: 1,
                            yAxisIndex: 1,
                            data: dataAll[1],
                            symbolSize: 20,
                            markLine: markLineOpt
                        },
                        {
                            name: 'III',
                            type: 'scatter',
                            xAxisIndex: 2,
                            yAxisIndex: 2,
                            data: dataAll[2],
                            symbolSize: 20,
                            markLine: markLineOpt
                        },
                        {
                            name: 'IV',
                            type: 'scatter',
                            xAxisIndex: 3,
                            yAxisIndex: 3,
                            data: dataAll[3],
                            symbolSize: 20,
                            markLine: markLineOpt
                        }
                    ]
                };
                var chart = testHelper.create(echarts, 'main1', {
                    title: [
                        'Multiple grid'
                    ],
                    buttons: makeToggleChartButtons(function (newOpt) {
                        option.series.forEach(function (seriesOpt) {
                            seriesOpt.emphasis = Object.assign(seriesOpt.emphasis || {}, newOpt)
                        });
                        chart.setOption(option);
                    }),
                    option: option
                });
            });
            </script>




        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            var option;
            // $.getJSON('./data/nutrients.json', function (data) {});

            option = {
                xAxis: {
                    data: ['a', 'b', 'c']
                },
                yAxis: {},
                series: [{
                    type: 'bar',
                    emphasis: {
                        focus: 'series'
                    },
                    data: [1212, 3232, 2525]
                }, {
                    type: 'bar',
                    emphasis: {
                        // itemStyle: {
                        //     color: 'red'
                        // },
                        focus: 'series'
                    },
                    data: [1212, 3232, 2525]
                }]
            };

            var buttons = makeToggleChartButtons(function (newOpt) {
                option.series.forEach(function (seriesOpt) {
                    seriesOpt.emphasis = Object.assign(seriesOpt.emphasis || {}, newOpt)
                });
                chart.setOption(option);
            });

            buttons.push({
                text: 'highlight seriesIndex: 0, dataIndex: 1',
                onclick: function () {
                    chart.dispatchAction({
                        type: 'highlight',
                        seriesIndex: 0,
                        dataIndex: 1
                    });
                }
            }, {
                text: 'highlight seriesIndex: 1, dataIndex: 1',
                onclick: function () {
                    chart.dispatchAction({
                        type: 'highlight',
                        seriesIndex: 1,
                        dataIndex: 1
                    });
                }
            }, {
                text: 'downplay seriesIndex: 1, dataIndex: 1',
                onclick: function () {
                    chart.dispatchAction({
                        type: 'downplay',
                        seriesIndex: 1,
                        dataIndex: 1
                    });
                }
            }, {
                text: 'downplay all',
                onclick: function () {
                    chart.dispatchAction({
                        type: 'downplay'
                    });
                }
            });

            var chart = testHelper.create(echarts, 'main2', {
                title: [
                    'API trigger highlight'
                ],
                option: option,
                // height: 300,
                buttons: buttons
                // recordCanvas: true,
            });
        });
        </script>


    </body>
</html>

