<!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="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>

