
<!--
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">
        <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" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
        </style>

        <div id="main1"></div>
        <div id="main2"></div>
        <div id="main3"></div>
        <div id="main4"></div>


        <script>

        require([
            'echarts',
            'data/life-expectancy-table.json'
        ], function (echarts, data) {
            var updateFrequency = 5000;
            var dimension = 1;

            var years = [];
            for (var i = 0; i < data.length; ++i) {
                if (years.length === 0 || years[years.length - 1] !== data[i][4]) {
                    years.push(data[i][4]);
                }
            }

            var option = {
                grid: {
                    left: 150,
                    right: 150
                },
                xAxis: {
                    max: 'dataMax',
                    label: {
                        formatter: function (n) {
                            return Math.round(n);
                        }
                    },
                    splitLine: {
                        lineStyle: {
                            color: 'red'
                        }
                    }
                },
                dataset: {
                    source: data.slice(1).filter(d => {
                        return d[4] === 1800;
                    })
                },
                yAxis: {
                    type: 'category',
                    inverse: true,
                    max: 10,
                    axisLabel: {
                        show: true
                    },
                    animationDuration: 300,
                    animationDurationUpdate: 300
                },
                series: [{
                    realtimeSort: true,
                    seriesLayoutBy: 'column',
                    type: 'bar',
                    encode: {
                        x: dimension,
                        y: 3
                    },
                    label: {
                        show: true,
                        position: 'right',
                        formatter: function (param) {
                            return param.value[dimension];
                        },
                        valueAnimation: true,
                        fontFamily: 'monospace'
                    }
                }],
                animationDurationUpdate: updateFrequency,
                animationEasing: 'linear',
                animationEasingUpdate: 'linear',
                graphic: {
                    elements: [{
                        type: 'text',
                        right: 160,
                        bottom: 60,
                        style: {
                            text: '1960',
                            font: 'bolder 80px monospace',
                            fill: 'rgba(100, 100, 100, 0.25)'
                        },
                        z: 100
                    }]
                }
            };

            for (var i = 1; i < years.length; ++i) {
                (function (i) {
                    setTimeout(function () {
                        updateYear(years[i + 1]);
                    }, (i - 1) * updateFrequency);
                })(i);
            }

            function updateYear(year) {
                var source = data.slice(1).filter(d => {
                    return d[4] === year;
                });
                option.series[0].data = source;
                option.graphic.elements[0].style.text = year;
                chart.setOption(option);
            }

            var chart = testHelper.create(echarts, 'main1', {
                title: [
                    'Bar Racing'
                ],
                option: option
            });
        });
        </script>



        <script>

        require([
            'echarts'
        ],
            function (echarts) {
                var option = {
                    xAxis: {
                        max: 'dataMax'
                    },
                    yAxis: {
                        type: 'category',
                        data: ['A', 'B', 'C', 'D'],
                        inverse: true,
                        axisLabel: {
                            formatter: function (label, id) {
                                return label + 0 + id;
                            }
                        },
                        animationDuration: 300,
                        animationDurationUpdate: 300,
                        max: 2
                    },
                    series: [{
                        realtimeSort: true,
                        name: 'X',
                        type: 'bar',
                        data: [{
                            value: 120,
                            itemStyle: {
                                color: 'red'
                            }
                        }, {
                            value: 200,
                            itemStyle: {
                                color: 'orange'
                            }
                        }, {
                            value: 90,
                            itemStyle: {
                                color: 'yellow'
                            }
                        }, {
                            value: 240,
                            itemStyle: {
                                color: 'green'
                            }
                        }],
                        label: {
                            show: true,
                            position: 'right',
                            formatter: '{c}元',
                            valueAnimation: true
                        }
                    }],
                    legend: {
                        show: true
                    },
                    animationDurationUpdate: 5000,
                    animationEasing: 'linear',
                    animationEasingUpdate: 'linear'
                };

                setTimeout(() => {
                    var data = option.series[0].data;
                    data[1].value += 100;
                    chart.setOption(option);
                }, 1000);

                setTimeout(() => {
                    var data = option.series[0].data;
                    data[3].value += 100;
                    chart.setOption(option);
                }, 3400);

                const buttons = [];
                const texts = ['A++', 'B++', 'C++', 'D++'];
                for (var x = 0; x < 4; ++x) {
                    (function (x) {
                        buttons.push({
                            text: texts[x],
                            onclick() {
                                var data = option.series[0].data;
                                data[x].value += Math.round(100 * Math.random());
                                chart.setOption(option);
                            }
                        });
                    })(x);
                }

                var chart = testHelper.create(echarts, 'main2', {
                    title: [
                        'Update Data Dynamically'
                    ],
                    option: option,
                    buttons
                });
            }
        );
        </script>



        <script>

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

                var option = {
                    title: {
                        text: 'When yAxis max is larger than yAxis data length, it should not get error'
                    },
                    xAxis: {
                    },
                    yAxis: {
                        type: 'category',
                        data: ['A', 'B', 'C'],
                        max: 5
                    },
                    series: [{
                        realtimeSort: true,
                        type: 'bar',
                        data: [10, 8, 2]
                    }]
                };

                var chart = testHelper.create(echarts, 'main3', {
                    title: [
                        'When yAxis max is larger than yAxis data length, it should not get error'
                    ],
                    option: option
                });
            }

        );
        </script>

        <script>

            require(['echarts'],
                function (echarts) {
                    var data = [0, 1, 10, 100, 1000];
                    var option = {
                        xAxis: {
                            type: 'log'
                        },
                        yAxis: {
                            type: 'category',
                            data: ['a', 'b', 'c', 'd', 'e']
                        },
                        series: [{
                            type: 'bar',
                            data: data,
                            label: {
                                show: true,
                                position: 'right',
                                valueAnimation: true
                            }
                        }]
                    };

                    var chart = testHelper.create(echarts, 'main4', {
                        title: [
                            'click "all +10"',
                            'check the x extent should be correct',
                            'the 0 bar should be displayed with animation'
                        ],
                        option: option,
                        buttons: [{
                            text: 'all +10',
                            onclick: function () {
                                for (var i = 0; i < data.length; i++) {
                                    data[i] += 10;
                                }
                                chart.setOption({
                                    series: {
                                        data: data
                                    }
                                });
                            }
                        }]
                    });
                }
            );
        </script>

        <script>
        require(['echarts'],
            function (echarts) {
                var data = [4000, 3000, 2000];
                var option = {
                    xAxis: {
                    },
                    yAxis: {
                        type: 'category',
                        data: ['a', 'b', 'c'],
                        max: 1,
                        inverse: true,
                        animationDuration: 300,
                        animationDurationUpdate: 300
                    },
                    series: [{
                        realtimeSort: true,
                        type: 'bar',
                        data: data,
                        label: {
                            show: true,
                            position: 'right',
                            valueAnimation: true
                        },
                        animationDuration: 0,
                        animationDurationUpdate: 5000,
                        animationEasing: 'linear',
                        animationEasingUpdate: 'linear'
                    }]
                };

                var chart = testHelper.create(echarts, 'main4', {
                    title: [
                    ],
                    option: option,
                    buttons: [{
                        text: 'next',
                        onclick: function () {
                            data[0] += 300;
                            data[1] += 2000;
                            data[2] += 2800;
                            chart.setOption({
                                series: {
                                    data: data
                                }
                            });
                        }
                    }]
                });
            }
        );
        </script>
    </body>
</html>
