
<!--
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);
                        }
                    }
                },
                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>
    </body>
</html>
