<!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="refer_by_id"></div>
        <div id="auto_axis_second_setOption_only_toolbox_dz"></div>
        <div id="auto_axis_second_setOption_normal_dz"></div>
        <div id="specified_axis_second_setOption_normal_dz"></div>
        <div id="remove_dz"></div>
        <div id="duplicated_dataZoom_ref"></div>









        <script>
        require(['echarts'], function (echarts) {
            var option;

            option = {
                grid: [{
                    bottom: '55%'
                }, {
                    id: 'g1',
                    top: '55%'
                }],
                xAxis: [{

                }, {
                    id: 'x1',
                    gridId: 'g1'
                }],
                yAxis: [{

                }, {
                    id: 'y1',
                    gridId: 'g1'
                }],
                dataZoom: [{
                    xAxisId: 'x1',
                    type: 'slider'
                }, {
                    xAxisId: 'x1',
                    type: 'inside'
                }],
                series: [{
                    type: 'line',
                    data: [[11, 22], [33, 44]]
                }, {
                    type: 'line',
                    xAxisId: 'x1',
                    yAxisId: 'y1',
                    data: [[233, 432], [154, 552]]
                }]
            };

            var chart = testHelper.create(echarts, 'refer_by_id', {
                title: [
                    'refer axis by id',
                    'Two grids, dataZoom should **only refer to bottom grid**',
                ],
                option: option,
                height: 300,
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            function makeFirstGridOption() {
                return {
                    grid: [{
                        bottom: '60%'
                    }],
                    xAxis: [{
                    }, {
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        data: [[333, 22], [666, 44]]
                    }, {
                        type: 'line',
                        xAxisIndex: 1,
                        data: [[88888, 52], [99999, 74]]
                    }]
                };
            }

            var option = makeFirstGridOption();

            option.toolbox = {
                left: 'center',
                feature: {
                    dataZoom: {}
                }
            };
            option.grid.push(
                {
                    id: 'gb',
                    top: '60%'
                }
            );
            option.xAxis.push(
                {
                    id: 'xb0',
                    type: 'category',
                    gridIndex: 1
                }, {
                    id: 'xb1',
                    type: 'category',
                    gridIndex: 1
                }
            );
            option.yAxis.push(
                {
                    id: 'yb',
                    gridIndex: 1
                }
            );
            option.series.push(
                {
                    id: 'sb0',
                    type: 'line',
                    xAxisIndex: 2,
                    yAxisIndex: 1,
                    data: [[63, 432], [98, 552]]
                }, {
                    id: 'sb1',
                    type: 'line',
                    xAxisIndex: 3,
                    yAxisIndex: 1,
                    data: [[87654, 1432], [56789, 1552]]
                }
            );

            var chart = testHelper.create(echarts, 'auto_axis_second_setOption_only_toolbox_dz', {
                title: [
                    '[Only toolbox dataZoom] two grids, each has two xAxis.',
                    'toolbox zoom should work on **all grids**.',
                    'Click btn "remove top grid".',
                    'toolbox zoom should work only on **bottom grids**.',
                    'Click btn "addback top grid".',
                    'toolbox zoom should work on **all grids**.',
                    'Click btn "remove all grids".',
                    'Should **no error**.',
                    'Check toolbox zoom should **not work on the original area**.',
                    'Click btn "addback top grid".',
                    'toolbox zoom should work only on **top grids**.',
                ],
                option: option,
                height: 350,
                buttons: [{
                    text: 'remove top grid',
                    onclick: function () {
                        chart.setOption({
                            grid: [{
                                id: 'gb',
                            }],
                            xAxis: [{
                                id: 'xb0',
                            }, {
                                id: 'xb1',
                            }],
                            yAxis: [{
                                id: 'yb'
                            }],
                            series: [{
                                id: 'sb0',
                            }, {
                                id: 'sb1',
                            }]
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }, {
                    text: 'addback top grid',
                    onclick: function () {
                        chart.setOption(makeFirstGridOption());
                    }
                }, {
                    text: 'remove all grids',
                    onclick: function () {
                        chart.setOption({
                            grid: [],
                            xAxis: [],
                            yAxis: [],
                            series: []
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }]
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {

            function makeFirstGridOption() {
                return {
                    grid: [{
                        bottom: '60%'
                    }],
                    xAxis: [{
                    }, {
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        symbolSize: 20,
                        data: [[11, 22], [33, 44]]
                    }, {
                        type: 'line',
                        xAxisIndex: 1,
                        symbolSize: 20,
                        data: [[11111, 52], [21133, 74]]
                    }]
                };
            }

            var option = makeFirstGridOption();

            option.toolbox = {
                left: 'center',
                feature: {
                    dataZoom: {}
                }
            };
            option.grid.push(
                {
                    id: 'gb',
                    top: '60%'
                }
            );
            option.xAxis.push(
                {
                    id: 'xb0',
                    type: 'category',
                    gridIndex: 1
                }, {
                    id: 'xb1',
                    type: 'category',
                    gridIndex: 1
                }
            );
            option.yAxis.push(
                {
                    id: 'yb',
                    gridIndex: 1
                }
            );
            option.dataZoom = [
                {
                    type: 'slider'
                }, {
                    type: 'inside'
                }
            ];
            option.series.push(
                {
                    id: 'sb0',
                    type: 'line',
                    symbolSize: 20,
                    xAxisIndex: 2,
                    yAxisIndex: 1,
                    data: [[23, 432], [54, 552]]
                }, {
                    id: 'sb1',
                    type: 'line',
                    symbolSize: 20,
                    xAxisIndex: 3,
                    yAxisIndex: 1,
                    data: [[222233, 1432], [111154, 1552]]
                }
            );

            var chart = testHelper.create(echarts, 'auto_axis_second_setOption_normal_dz', {
                title: [
                    'Test: **Auto axis** remove coord sys (dataZoom not remove)',
                    'two grids, each has two xAxis.',
                    'dataZoom should **only control all 2 xAxis of top** grid.',
                    'Click btn "remove top grid".',
                    'dataZoom should **only control all 2 xAxis of bottom** grid.',
                    '**inside dataZoom** on top grid area **should be removed**.',
                    '**toolbox zoom** should only control bottom grid.',
                    'Click btn "addback top grid".',
                    'dataZoom should **only control all 2 xAxis of top** grid.',
                    '**inside dataZoom** on bottom grid area **should be removed**.',
                    'Click btn "remove all grids".',
                    'Should no error.',
                    'Click btn "addback top grid".',
                    'Functionalities should be OK.'
                ],
                option: option,
                height: 350,
                buttons: [{
                    text: 'remove top grid',
                    onclick: function () {
                        chart.setOption({
                            grid: [{
                                id: 'gb',
                            }],
                            xAxis: [{
                                id: 'xb0',
                            }, {
                                id: 'xb1',
                            }],
                            yAxis: [{
                                id: 'yb'
                            }],
                            series: [{
                                id: 'sb0',
                            }, {
                                id: 'sb1',
                            }]
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }, {
                    text: 'addback top grid',
                    onclick: function () {
                        chart.setOption(makeFirstGridOption());
                    }
                }, {
                    text: 'remove all grids',
                    onclick: function () {
                        chart.setOption({
                            grid: [],
                            xAxis: [],
                            yAxis: [],
                            series: []
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }]
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {

            function makeFirstGridOption() {
                return {
                    grid: [{
                        bottom: '60%'
                    }],
                    xAxis: [{
                    }, {
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        symbol: 'emptyTriangle',
                        symbolSize: 20,
                        data: [[11, 22], [33, 44]]
                    }, {
                        type: 'line',
                        symbol: 'emptyTriangle',
                        symbolSize: 20,
                        xAxisIndex: 1,
                        data: [[11111, 52], [21133, 74]]
                    }]
                };
            }

            var option = makeFirstGridOption();

            option.toolbox = {
                left: 'center',
                feature: {
                    dataZoom: {}
                }
            };
            option.grid.push(
                {
                    id: 'gb',
                    top: '60%'
                }
            );
            option.xAxis.push(
                {
                    id: 'xb0',
                    type: 'category',
                    gridIndex: 1
                }, {
                    id: 'xb1',
                    type: 'category',
                    gridIndex: 1
                }
            );
            option.yAxis.push(
                {
                    id: 'yb',
                    gridIndex: 1
                }
            );
            option.dataZoom = [
                {
                    type: 'slider',
                    xAxisIndex: 'all'
                }, {
                    type: 'inside',
                    xAxisIndex: 'all'
                }
            ];
            option.series.push(
                {
                    id: 'sb0',
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    xAxisIndex: 2,
                    yAxisIndex: 1,
                    data: [[23, 432], [54, 552], [124, 324], [341, 134], [888, 213]]
                }, {
                    id: 'sb1',
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    xAxisIndex: 3,
                    yAxisIndex: 1,
                    data: [[222233, 1432], [111154, 1552], [222223, 1231], [131313, 3322], [717171, 5512]]
                }
            );

            var chart = testHelper.create(echarts, 'specified_axis_second_setOption_normal_dz', {
                title: [
                    'Test: **xAxisIndex: "all"** remove coord sys (dataZoom not remove)',
                    'two grids, each has two xAxis.',
                    'dataZoom should **only control all 4 xAxis**.',
                    'Click btn "remove top grid".',
                    'dataZoom should **only control all 2 xAxis of bottom** grid.',
                    '**inside dataZoom** on top grid area **should be removed**.',
                    '**toolbox zoom** should only control bottom grid.',
                    'Click btn "addback top grid".',
                    'dataZoom should **only control all 4 xAxis**.',
                    '**inside dataZoom** on bottom grid area **should be removed**.',
                    'Click btn "remove all grids".',
                    'Should no error.',
                    'Click btn "addback top grid".',
                    'Functionalities should be OK.'
                ],
                option: option,
                height: 350,
                buttons: [{
                    text: 'remove top grid',
                    onclick: function () {
                        chart.setOption({
                            grid: [{
                                id: 'gb',
                            }],
                            xAxis: [{
                                id: 'xb0',
                            }, {
                                id: 'xb1',
                            }],
                            yAxis: [{
                                id: 'yb'
                            }],
                            series: [{
                                id: 'sb0',
                            }, {
                                id: 'sb1',
                            }]
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }, {
                    text: 'addback top grid',
                    onclick: function () {
                        chart.setOption(makeFirstGridOption());
                    }
                }, {
                    text: 'remove all grids',
                    onclick: function () {
                        chart.setOption({
                            grid: [],
                            xAxis: [],
                            yAxis: [],
                            series: []
                        }, { replaceMerge: ['grid', 'xAxis', 'yAxis', 'series'] });
                    }
                }]
            });
        });
        </script>









        <script>
        require(['echarts'], function (echarts) {

            function makeFirstGridOption() {
                return {
                    grid: [{
                        bottom: '60%'
                    }],
                    xAxis: [{
                    }, {
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        symbol: 'emptyTriangle',
                        symbolSize: 20,
                        data: [[11, 22], [33, 44]]
                    }, {
                        type: 'line',
                        symbol: 'emptyTriangle',
                        symbolSize: 20,
                        xAxisIndex: 1,
                        data: [[11111, 52], [21133, 74]]
                    }]
                };
            }

            var option = makeFirstGridOption();

            var option = {
                toolbox: {
                    left: 'center',
                    feature: {
                        dataZoom: {}
                    }
                },
                grid: [{
                    right: '60%'
                }, {
                    id: 'gb',
                    left: '60%'
                }],
                xAxis: [{
                }, {
                    id: 'xb',
                    gridIndex: 1
                }],
                yAxis: [{
                }, {
                }, {
                    id: 'yb0',
                    type: 'category',
                    gridIndex: 1
                }, {
                    id: 'yb1',
                    type: 'category',
                    gridIndex: 1
                }],
                dataZoom: [{
                    type: 'slider',
                    left: 10,
                    yAxisIndex: [0, 1]
                }, {
                    type: 'inside',
                    yAxisIndex: [0, 1]
                }],
                series: [{
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    data: [[22, 11], [44, 33]]
                }, {
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    yAxisIndex: 1,
                    data: [[52, 11111], [74, 21133]]
                }, {
                    id: 'sb0',
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    xAxisIndex: 1,
                    yAxisIndex: 2,
                    data: [[432, 23], [552, 54], [324, 124], [134, 341], [213, 888]]
                }, {
                    id: 'sb1',
                    type: 'line',
                    symbol: 'emptyTriangle',
                    symbolSize: 20,
                    xAxisIndex: 1,
                    yAxisIndex: 3,
                    data: [[1432, 222233], [1552, 111154], [1231, 222223], [3322, 131313], [5512, 717171]]
                }]
            };

            var chart = testHelper.create(echarts, 'remove_dz', {
                title: [
                    'Test: remove dataZoom',
                    'two grids, each has two yAxis.',
                    'dataZoom should **only control all 2 yAxis of left** grid.',
                    'Click btn "remove left dataZoom".',
                    'dz disappear and insideZoom should **no longer work**.',
                    '**toolbox zoom** should still work.',
                    'Click btn "add right dataZoom".',
                    'dataZoom should **only control all 2 yAxis of right** grid.',
                    'Click btn "dataZoom control x".',
                    'dataZoom should lay full of bottom and **only control all xAxis**.',
                ],
                option: option,
                height: 350,
                buttons: [{
                    text: 'remove left dataZoom',
                    onclick: function () {
                        chart.setOption({
                        }, { replaceMerge: ['dataZoom'] });
                    }
                }, {
                    text: 'add right dataZoom',
                    onclick: function () {
                        chart.setOption({
                            dataZoom: [{
                                type: 'slider',
                                right: 10,
                                yAxisIndex: [2, 3]
                            }, {
                                type: 'inside',
                                yAxisIndex: [2, 3]
                            }]
                        });
                    }
                }, {
                    text: 'dataZoom control x',
                    onclick: function () {
                        chart.setOption({
                            dataZoom: [{
                                bottom: 10,
                                left: 20,
                                right: 20,
                                width: null,
                                xAxisIndex: 'all',
                                yAxisIndex: 'none'
                            }, {
                                xAxisIndex: 'all',
                                yAxisIndex: 'none'
                            }]
                        });
                    }
                }]
            });
        });
        </script>







        <script>
        require(['echarts'], function (echarts) {

            var option = {
                toolbox: {
                    left: 'center',
                    feature: {
                        dataZoom: {}
                    }
                },
                xAxis: [{
                }],
                yAxis: [{
                }],
                dataZoom: [{
                    type: 'slider',
                    // Duplicated declaration
                    yAxisIndex: [0, 0]
                }, {
                    type: 'inside',
                    // Duplicated declaration
                    yAxisIndex: [0, 0]
                }],
                series: [{
                    type: 'line',
                    data: [[22, 11], [44, 33]]
                }]
            };

            var chart = testHelper.create(echarts, 'duplicated_dataZoom_ref', {
                title: [
                    'Use dataZoom, should no error thrown.',
                ],
                option: option,
                height: 350
            });
        });
        </script>





    </body>
</html>

