<!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/simpleRequire.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;

            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'
                    });
                }
            }, {
                text: 'Highlight all',
                onclick: function () {
                    chart.dispatchAction({
                        type: 'highlight',
                        seriesIndex: [0, 1],
                    });
                }
            });

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


    </body>
</html>

