
<!--
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>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
                margin: 0;
            }
            #main {
                background: #fff;
            }
        </style>

        <div id="main0"></div>
        <div id="main1"></div>
        <div id="main2"></div>
        <div id="main3"></div>
        <div id="main4"></div>
        <div id="main5"></div>
        <div id="main6"></div>
        <div id="main7"></div>

        <script>

            require([
                'echarts'
            ], function (echarts) {

                var xAxisData = [];
                var data1 = [];
                var data2 = [];
                var data3 = [];
                var data4 = [];

                for (var i = 0; i < 100; i++) {
                    xAxisData.push('类目' + i);
                    data1.push((Math.random() * 5).toFixed(2));
                    data2.push(Math.random().toFixed(2));
                    data3.push((Math.random() + 0.5).toFixed(2));
                    data4.push((Math.random() + 0.3).toFixed(2));
                }

                var data = [["4.70","4.69","2.48","0.77","3.08","4.57","2.68","3.35","0.37","1.86","2.68","0.64","1.82","1.88","0.31","0.45","4.48","3.08","1.58","2.98","1.87","0.96","3.43","2.58","0.41","2.69","0.59","3.47","4.33","1.75","0.51","1.01","1.60","3.62","2.29","2.40","1.52","2.30","0.18","3.99","0.26","2.92","2.94","0.54","2.98","3.71","2.24","0.32","1.98","2.56","1.81","4.67","2.49","1.73","1.79","2.79","3.39","1.83","3.24","3.76","1.23","1.69","3.55","2.66","1.83","3.69","2.70","0.75","0.71","1.44","3.23","1.49","1.50","3.61","4.41","1.26","2.93","2.84","4.11","0.80","2.67","2.59","2.71","4.85","1.28","1.21","4.32","4.04","1.15","4.38","4.41","4.94","4.13","0.86","1.97","3.58","3.02","1.29","1.47","3.75"],["0.78","0.90","0.54","0.75","0.68","0.68","0.84","0.87","0.78","0.79","0.77","0.34","0.81","0.80","0.28","0.87","0.98","0.92","0.66","0.87","0.88","0.56","0.34","0.67","0.60","0.00","0.22","0.87","0.81","0.69","0.41","0.02","0.18","0.55","0.48","0.90","0.62","0.17","0.37","0.35","0.31","0.78","0.34","0.56","0.22","0.87","0.55","0.94","0.58","0.66","0.33","0.73","0.78","0.44","0.79","0.12","0.81","0.77","0.33","0.30","0.86","0.87","0.09","0.91","0.90","0.34","0.76","0.93","0.55","0.41","0.63","0.96","0.80","0.41","0.53","0.53","0.66","0.24","0.24","0.99","0.92","0.85","0.44","0.92","0.28","0.61","0.20","0.74","0.52","0.91","0.42","0.08","0.00","0.57","0.81","0.39","0.41","0.72","0.02","0.20"],["1.17","0.65","0.98","1.08","1.02","1.41","1.01","1.17","0.63","0.94","0.78","1.43","0.67","1.09","1.29","0.60","0.50","1.38","0.76","0.94","0.79","1.44","0.55","1.48","1.13","0.63","1.07","0.57","1.43","0.81","0.87","0.70","1.04","1.43","1.00","0.50","0.54","0.57","0.97","0.58","1.19","0.73","0.76","0.75","1.39","0.93","0.60","1.28","1.14","1.18","0.60","0.59","1.46","0.64","1.44","0.59","1.49","0.84","0.71","1.44","1.11","1.18","1.40","0.64","1.15","1.07","1.35","0.86","1.13","1.41","1.03","0.57","1.44","0.93","1.47","1.16","1.40","1.14","0.97","0.78","1.49","0.59","0.99","1.35","0.88","1.02","1.16","1.07","0.81","0.87","1.34","0.98","1.17","1.46","0.71","1.13","0.80","1.24","0.76","0.68"],["1.04","0.54","0.55","1.05","1.20","1.13","0.53","0.63","0.82","0.52","0.86","0.33","0.64","1.14","0.47","0.72","0.97","1.18","1.02","0.53","1.14","1.24","1.13","0.60","0.47","0.94","0.64","0.43","0.71","0.33","0.46","0.82","0.80","0.97","0.43","1.29","0.65","0.92","0.63","0.58","0.31","1.09","0.35","0.43","1.19","0.47","0.59","0.52","0.79","0.69","0.54","0.39","0.33","1.26","0.40","0.76","0.80","0.96","0.82","1.26","0.70","0.50","0.67","1.27","1.24","0.49","0.94","0.97","0.90","1.03","1.28","0.46","0.57","1.23","0.40","0.71","1.08","0.51","1.03","0.38","0.81","0.44","1.02","0.79","1.08","1.01","0.66","0.80","0.65","0.97","0.56","0.33","0.61","0.92","0.40","0.77","1.05","1.21","0.34","0.84"]];

                var option = {
                    legend: {
                        data: ['bar', 'bar2', 'bar3', 'bar4'],
                        align: 'left'
                    },
                    toolbox: {
                        // y: 'bottom',
                        feature: {
                            magicType: {
                                type: ['line', 'bar', 'stack', 'tiled']
                            },
                            dataZoom: {
                                yAxisIndex: false
                            },
                            dataView: {},
                            saveAsImage: {
                                pixelRatio: 2
                            }
                        }
                    },
                    tooltip: {},
                    dataZoom: [{
                        startValue: 48,
                        endValue: 99,
                        type: 'inside'
                    }, {
                        startValue: 48,
                        endValue: 99,
                        type: 'slider'
                    }],
                    xAxis: {
                        data: xAxisData,
                        silent: false,
                        splitLine: {
                            show: false
                        },
                        splitArea: {
                            show: false
                        }
                    },
                    yAxis: {
                        splitArea: {
                            show: false
                        }
                    },
                    series: [{
                        name: 'bar',
                        type: 'bar',
                        stack: 'one',
                        data: data[0],
                        showBackground: true
                    }, {
                        show: false,
                        name: 'bar2',
                        type: 'bar',
                        stack: 'one',
                        data: data[1]
                    }, {
                        name: 'bar3',
                        type: 'bar',
                        stack: 'two',
                        data: data[2]
                    }, {
                        name: 'bar4',
                        type: 'bar',
                        stack: 'two',
                        data: data[3],
                        silent: true
                    }],
                    animationDelay: function (idx) {
                        return idx * 5;
                    },
                    animationDelayUpdate: function (idx) {
                        return idx * 5;
                    }
                }

                var chart = testHelper.create(echarts, 'main0', {
                    option: option,
                });

                chart.on('click', function (params) {
                    console.log(params);
                });
            });
        </script>


        <script>

            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {

                var option = {
                    xAxis: [{
                        type: 'category'
                    }, {
                        gridIndex: 1
                    }],
                    yAxis: [{
                    }, {
                        type: 'category',
                        gridIndex: 1
                    }],
                    grid: [{
                        containLabel: true,
                        left: 10,
                        right: '55%'
                    }, {
                        containLabel: true,
                        left: '55%',
                        right: 10
                    }],
                    tooltip: {},
                    series: [{
                        type: 'bar',
                        large: true,
                        largeThreshold: 2,
                        data: [
                            ['mm', 33],
                            ['yy', -44],
                            ['tt', 55],
                            ['rr', 66]
                        ],
                        showBackground: true,
                        backgroundStyle: {
                            color: 'rgba(0, 0, 255, 0.2)'
                        }
                    }, {
                        type: 'bar',
                        large: true,
                        largeThreshold: 2,
                        xAxisIndex: 1,
                        yAxisIndex: 1,
                        encode: {
                            x: 1,
                            y: 0
                        },
                        data: [
                            ['mm', 33],
                            ['yy', -44],
                            ['tt', 55],
                            ['rr', 66]
                        ],
                        showBackground: true,
                        backgroundStyle: {
                            color: 'rgba(0, 0, 255, 0.2)'
                        }
                    }]
                };

                var chart = testHelper.create(echarts, 'main1', {
                    option: option,
                    title: [
                        'Background with large render mode.'
                    ]
                });
            });

        </script>



        <script>

            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {

                var option = {
                    xAxis: [{
                        type: 'category'
                    }, {
                        gridIndex: 1
                    }],
                    yAxis: [{
                    }, {
                        type: 'category',
                        gridIndex: 1
                    }],
                    grid: [{
                        containLabel: true,
                        left: 10,
                        right: '55%'
                    }, {
                        containLabel: true,
                        left: '55%',
                        right: 10
                    }],
                    tooltip: {},
                    series: [{
                        type: 'bar',
                        data: [
                            ['mm', 33],
                            ['yy', -44],
                            ['tt', 55],
                            ['rr', 66]
                        ],
                        showBackground: true,
                        backgroundStyle: {
                            color: 'rgba(0, 0, 255, 0.2)'
                        }
                    }, {
                        type: 'bar',
                        xAxisIndex: 1,
                        yAxisIndex: 1,
                        encode: {
                            x: 1,
                            y: 0
                        },
                        data: [
                            ['mm', 33],
                            ['yy', -44],
                            ['tt', 55],
                            ['rr', 66]
                        ],
                        showBackground: true,
                        backgroundStyle: {
                            color: 'rgba(0, 0, 255, 0.2)'
                        }
                    }]
                };

                var chart = testHelper.create(echarts, 'main2', {
                    option: option,
                    title: [
                        'Background with normal render mode.'
                    ]
                });
            });

        </script>



        <script>

            require(['echarts'], function (echarts) {

                var chart = echarts.init(document.getElementById('main3'));

                var option = {
                    angleAxis: {
                        type: 'category',
                        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
                        z: 10
                    },
                    tooltip: {
                    },
                    radiusAxis: {
                    },
                    polar: {
                        center: ['50%', '50%']
                    },
                    series: [{
                        type: 'bar',
                        data: [1, 2, '-', 3, 0, 5, 7],
                        coordinateSystem: 'polar',
                        barMaxWidth: '50%',
                        barMinHeight: 10,
                        showBackground: true
                    }]
                };

                var chart = testHelper.create(echarts, 'main3', {
                    option: option,
                    title: [
                        'Bar background on radial polar'
                    ]
                });
            });
        </script>

        <script>

            require(['echarts'], function (echarts) {

                var chart = echarts.init(document.getElementById('main4'));

                var option = {
                    angleAxis: {
                        triggerEvent: true
                    },
                    radiusAxis: {
                        type: 'category',
                        data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
                        z: 10,
                        triggerEvent: true
                    },
                    polar: {
                    },
                    tooltip: {},
                    series: [{
                        type: 'bar',
                        data: [1, '-', 4, 3, '-', 5, 7],
                        coordinateSystem: 'polar',
                        itemStyle: {
                            normal: {
                                color: '#00f'
                            }
                        },
                        barWidth: '50%',
                        showBackground: true
                    }]
                };

                var chart = testHelper.create(echarts, 'main4', {
                    option: option,
                    title: [
                        'Bar background on tangential polar'
                    ]
                });
            });
        </script>

        <script>

            require(['echarts'], function (echarts) {

                var chart = echarts.init(document.getElementById('main5'));

                var option = {
                    angleAxis: {
                        type: 'category',
                        data: ['周一', '周二', '周三', '周四'],
                        z: 10
                    },
                    radiusAxis: {
                    },
                    polar: {
                    },
                    series: [{
                        type: 'bar',
                        data: [1, 2, 3, 4],
                        coordinateSystem: 'polar',
                        name: 'A',
                        showBackground: true
                    }, {
                        type: 'bar',
                        data: [2, 4, 6, 8],
                        coordinateSystem: 'polar',
                        name: 'B'
                    }, {
                        type: 'bar',
                        data: [1, 2, 3, 4],
                        coordinateSystem: 'polar',
                        name: 'C'
                    }],
                    legend: {
                        show: true,
                        data: ['A', 'B', 'C']
                    }
                };

                var chart = testHelper.create(echarts, 'main5', {
                    option: option,
                    title: [
                        'Multiple bar series with background on radial polar'
                    ]
                });
            });
        </script>


        <script>

            require(['echarts'], function (echarts) {

                var chart = echarts.init(document.getElementById('main6'));

                var option = {
                    angleAxis: {
                        // clockwise: false
                    },
                    radiusAxis: {
                        type: 'category',
                        data: ['周一', '周二', '周三', '周四'],
                        z: 10
                    },
                    polar: {
                    },
                    series: [{
                        type: 'bar',
                        data: [1, 2, 3, 4],
                        coordinateSystem: 'polar',
                        name: 'A',
                        showBackground: true
                    }, {
                        type: 'bar',
                        data: [2, 4, 6, 8],
                        coordinateSystem: 'polar',
                        name: 'B'
                    }, {
                        type: 'bar',
                        data: [1, 2, 3, 4],
                        coordinateSystem: 'polar',
                        name: 'C'
                    }],
                    legend: {
                        show: true,
                        data: ['A', 'B', 'C']
                    }
                };

                var chart = testHelper.create(echarts, 'main6', {
                    option: option,
                    title: [
                        'polar bars'
                    ]
                });
            });
        </script>

        <script>

            require(['echarts'], function (echarts) {

                var chart = echarts.init(document.getElementById('main7'));

                var option = {
                    xAxis: {
                        type: 'category',
                        data: ['Mon', '1', '3', '4', '5', '6', '7', '8']
                    },
                    yAxis: {
                        type: 'value'
                    },
                    series: [{
                        data: [110, 120, 150, 250, 350, 400, 500, 600],
                        type: 'bar',
                        itemStyle: {
                            barBorderWidth: 20,
                            barBorderColor: 'rgba(50,50,50,0.3)'
                        },
                        showBackground: true,
                        backgroundStyle: {
                            color: 'green',
                            barBorderRadius: [20, 20, 20, 20],
                        }
                    }]
                };

                var chart = testHelper.create(echarts, 'main7', {
                    option: option,
                    title: [
                        'background borderRadius'
                    ],
                    buttons: [{
                        text: 'update borderRadius to [30, 40, 0, 60]',
                        onclick: function () {
                            chart.setOption({
                                series: {
                                    backgroundStyle: {
                                        borderRadius: [30, 40, 0, 60]
                                    }
                                }
                            });
                        }
                    }]
                });
            });
        </script>
    </body>
</html>