<!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="main-no-dataZoom"></div>
        <div id="main-has-dataZoom-x"></div>
        <div id="main-has-dataZoom-y"></div>
        <div id="main-has-stack"></div>
        <div id="main-has-dataZoom-y-stack"></div>


        <script>
            var TOTAL_HEIGHT = 1200;

            /**
             * @param opt: {
             *     dataZoomX: boolean;
             *     dataZoomY: boolean;
             *     stack: boolean;
             * }
             */
            function makeMultiCartesian(echarts, opt) {
                var gridHeight = 100;
                var currTop = 40;
                var gap = 80;

                var option = {
                    grid: [],
                    xAxis: [],
                    yAxis: [],
                    series: [],
                    dataZoom: []
                };

                function makeCartesian(option, partialOption, label) {
                    option.grid.push({
                        top: currTop,
                        height: gridHeight
                    });

                    option.xAxis.push(echarts.util.defaults({
                        gridIndex: option.grid.length - 1
                    }, partialOption.xAxis));

                    option.yAxis.push(echarts.util.defaults({
                        name: label[
                            opt.dataZoomX ? 'dataZoomX' :
                            opt.dataZoomY ? 'dataZoomY' :
                            'noDataZoom'
                        ],
                        nameTextStyle: {
                            align: 'left'
                        },
                        gridIndex: option.grid.length - 1
                    }, partialOption.yAxis));

                    var xAxisIndex = option.xAxis.length - 1;
                    var yAxisIndex = option.yAxis.length - 1;

                    var seriesList = partialOption.seriesList[opt.stack ? 'stackHas' : 'stackNon'];
                    echarts.util.each(seriesList, function (series) {
                        // FIXME:
                        // currently (20200619) if series.stack is the same but series
                        // on different grid, that would get wrong result.
                        if (opt.stack) {
                            series.stack = series.stack + '__' + xAxisIndex + '_' + yAxisIndex;
                        }
                        option.series.push(echarts.util.defaults({
                            label: { show: true },
                            itemStyle: {
                                opacity: 0.8
                            },
                            xAxisIndex: xAxisIndex,
                            yAxisIndex: yAxisIndex
                        }, series));
                    });

                    if (opt.dataZoomX) {
                        option.dataZoom.push({
                            type: 'slider',
                            filterMode: 'none',
                            height: 15,
                            top: currTop + gridHeight + 20,
                            xAxisIndex: xAxisIndex
                        }, {
                            type: 'inside',
                            filterMode: 'none',
                            xAxisIndex: xAxisIndex
                        });
                    }
                    if (opt.dataZoomY) {
                        option.dataZoom.push({
                            type: 'slider',
                            filterMode: 'none',
                            yAxisIndex: yAxisIndex
                        }, {
                            type: 'inside',
                            filterMode: 'none',
                            yAxisIndex: yAxisIndex
                        });
                    }

                    currTop += gridHeight + gap;
                }

                // ---------------------------------------
                // Cases in a single chart instance BEGIN
                // ---------------------------------------

                makeCartesian(option, {
                    xAxis: {
                        type: 'category'
                    },
                    yAxis: {
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'bar',
                            data: [['a', 22], ['b', 52], ['c', 659]]
                        }],
                        stackHas: [{
                            type: 'bar',
                            stack: 's',
                            data: [['a', 12], ['b', 32], ['c', 200]]
                        }, {
                            type: 'bar',
                            stack: 's',
                            data: [['a', 10], ['b', 20], ['c', 459]]
                        }]
                    }
                }, {
                    noDataZoom: 'y-min: 0, y-max: niced from 659, x-min: "a", x-max: "c"',
                    dataZoomX: 'y-min: 0, y-max: niced from 659, x-min: "a", x-max: "c"',
                    dataZoomY: 'y-min: 0, y-max: niced from 659, x-min: "a", x-max: "c"',
                });

                makeCartesian(option, {
                    xAxis: {
                        type: 'category',
                        max: 1
                    },
                    yAxis: {
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'bar',
                            data: [['a', 22], ['b', 52], ['c', 959]]
                        }],
                        stackHas: [{
                            type: 'bar',
                            stack: 's',
                            data: [['a', 12], ['b', 32], ['c', 359]]
                        }, {
                            type: 'bar',
                            stack: 's',
                            data: [['a', 10], ['b', 20], ['c', 600]]
                        }]
                    }
                }, {
                    noDataZoom: 'y-min: 0, y-max: niced from 52, x-min: "a", x-max: "b"',
                    dataZoomX: 'y-min: 0, y-max: niced from 959, x-min: "a", x-max: "b"',
                    dataZoomY: 'y-min: 0, y-max: niced from 959, x-min: "a", x-max: "b"'
                });

                makeCartesian(option, {
                    xAxis: {
                        type: 'category',
                        max: 2,
                        min: 1
                    },
                    yAxis: {
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'bar',
                            data: [['a', 959], ['b', 22], ['c', 52], ['d', -959]]
                        }],
                        stackHas: [{
                            type: 'bar',
                            stack: 's',
                            data: [['a', 300], ['b', 12], ['c', 32], ['d', -259]]
                        }, {
                            type: 'bar',
                            stack: 's',
                            data: [['a', 659], ['b', 10], ['c', 20], ['d', -700]]
                        }],
                    }
                }, {
                    noDataZoom: 'y-min: 0, y-max: niced from 52, x-min: "b", x-max: "c"',
                    dataZoomX: 'y-min: niced from -959, y-max: niced from 959, x-min: "b", x-max: "c"',
                    dataZoomY: 'y-min: niced from -959, y-max: niced from 959, x-min: "b", x-max: "c"'
                });

                makeCartesian(option, {
                    xAxis: {
                        type: 'category',
                        max: 2,
                        min: 1
                    },
                    yAxis: {
                        max: 500
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'bar',
                            data: [['a', 959], ['b', 22], ['c', 52], ['d', -959]]
                        }],
                        stackHas: [{
                            type: 'bar',
                            stack: 's',
                            data: [['a', 159], ['b', 2], ['c', 7], ['d', -59]]
                        }, {
                            type: 'bar',
                            stack: 's',
                            data: [['a', 800], ['b', 20], ['c', 45], ['d', -900]]
                        }]
                    }
                }, {
                    noDataZoom: 'y-min: 0, y-max: 500, x-min: "b", x-max: "c"',
                    dataZoomX: 'y-min: niced from -959, y-max: 500, x-min: "b", x-max: "c"',
                    dataZoomY: 'y-min: niced from -959, y-max: 500, x-min: "b", x-max: "c"'
                });

                makeCartesian(option, {
                    xAxis: {
                        type: 'category',
                        min: 1
                    },
                    yAxis: {
                        scale: true
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'line',
                            areaStyle: {},
                            data: [['a', 359], ['b', 122], ['c', 152]]
                        }],
                        stackHas: [{
                            type: 'line',
                            stack: 's',
                            data: [['a', 159], ['b', 62], ['c', 100]]
                        }, {
                            type: 'line',
                            stack: 's',
                            areaStyle: {},
                            data: [['a', 200], ['b', 60], ['c', 52]]
                        }]
                    }
                }, {
                    noDataZoom: '(yAxis.scale: true) y-min: niced from (noStack ? 122 : 62), y-max: niced from 152, x-min: "b", x-max: "c"',
                    dataZoomX: '(yAxis.scale: true) y-min: niced from (noStack ? 122 : 62), y-max: niced from 359, x-min: "b", x-max: "c"',
                    dataZoomY: '(yAxis.scale: true) y-min: niced from (noStack ? 122 : 62), y-max: niced from 359, x-min: "b", x-max: "c"'
                });

                makeCartesian(option, {
                    xAxis: {
                        type: 'category',
                        min: 1,
                        max: 2
                    },
                    yAxis: {
                        boundaryGap: ['50%', '50%']
                    },
                    seriesList: {
                        stackNon: [{
                            type: 'bar',
                            data: [['a', 559], ['b', 82], ['c', 152], ['d', -559]]
                        }],
                        stackHas: [{
                            type: 'bar',
                            stack: 's',
                            data: [['a', 159], ['b', 22], ['c', 52], ['d', -159]]
                        }, {
                            type: 'bar',
                            stack: 's',
                            data: [['a', 400], ['b', 60], ['c', 100], ['d', -459]]
                        }]
                    }
                }, {
                    // 187 = 152 + .5 * (152 - 82)
                    // 217 = 152 + .5 * (152 - 22)
                    // -43 = 22-.5 * (152 - 22)
                    noDataZoom: '(boundaryGap: [.5, .5]) y-min: (noStack ? 0 : -43), y-max: niced from (noStack ? 187 : 217), x-min: "b", x-max: "c"',
                    dataZoomX: '(boundaryGap: [.5, .5]) y-min: -1118, y-max: niced from 1118, x-min: "b", x-max: "c"',
                    dataZoomY: '(boundaryGap: [.5, .5]) y-min: -1118, y-max: niced from 1118, x-min: "b", x-max: "c"'
                });

                // -------------------------------------
                // Cases in a single chart instance END
                // -------------------------------------

                return option;
            }
        </script>




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

            var chart = testHelper.create(echarts, 'main-no-dataZoom', {
                title: [
                    'Check xAxis, yAxis min/max'
                ],
                option: option,
                height: TOTAL_HEIGHT
            });
        });
        </script>



        <script>
        require(['echarts'], function (echarts) {
            var option = makeMultiCartesian(echarts, {
                dataZoomX: true
            });

            var chart = testHelper.create(echarts, 'main-has-dataZoom-x', {
                title: [
                    '[has **dataZoom on X** filterMode: "none"] Check xAxis, yAxis min/max'
                ],
                option: option,
                height: TOTAL_HEIGHT
            });
        });
        </script>



        <script>
        require(['echarts'], function (echarts) {
            var option = makeMultiCartesian(echarts, {
                dataZoomY: true
            });

            var chart = testHelper.create(echarts, 'main-has-dataZoom-y', {
                title: [
                    '[has **dataZoom on Y** filterMode: "none"] Check xAxis, yAxis min/max'
                ],
                option: option,
                height: TOTAL_HEIGHT
            });
        });
        </script>



        <script>
        require(['echarts'], function (echarts) {
            var option = makeMultiCartesian(echarts, {
                stack: true
            });

            var chart = testHelper.create(echarts, 'main-has-stack', {
                title: [
                    '[has **stack**] Check xAxis, yAxis min/max'
                ],
                option: option,
                height: TOTAL_HEIGHT
            });
        });
        </script>


        <script>
        require(['echarts'], function (echarts) {
            var option = makeMultiCartesian(echarts, {
                stack: true,
                dataZoomY: true
            });

            var chart = testHelper.create(echarts, 'main-has-dataZoom-y-stack', {
                title: [
                    '[has **dataZoom on Y** has **stack**] Check xAxis, yAxis min/max'
                ],
                option: option,
                height: TOTAL_HEIGHT
            });
        });
        </script>



    </body>
</html>

