export default `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Apache ECharts Bar Racing</title>

    <style>
        #chart {
            width: 100%;
            height: 500px;
            border: 1px solid #ddd;
        }
    </style>

    <script src="https://cdn.jsdelivr.net/npm/echarts@5.1.2/dist/echarts.js"></script>
</head>
<body>
    <div id="chart"></div>

    <script>
        var colorAll = [
            '#5470c6',
            '#91cc75',
            '#fac858',
            '#ee6666',
            '#73c0de',
            '#3ba272',
            '#fc8452',
            '#9a60b4',
            '#ea7ccc'
        ];
        var headerLength = 2;

        var animationDuration = {{animationDuration}};
        var maxDataCnt = {{maxDataCnt}};
        var title = {{title}};
        var data = {{data}};

        var chart;
        var timeoutHandlers = [];

        run();

        function run() {
            clearTimeoutHandlers();
            if (chart) {
                chart.dispose();
            }

            chart = echarts.init(document.getElementById('chart'));
            var option = {
                xAxis: {
                    type: 'value',
                    max: 'dataMax'
                },
                yAxis: {
                    type: 'category',
                    data: data[0].slice(1),
                    inverse: true,
                    animationDuration: 300,
                    animationDurationUpdate: 300,
                    max: maxDataCnt ? maxDataCnt - 1 : null
                },
                series: [{
                    id: 'bar',
                    type: 'bar',
                    data: getDataLine(0),
                    seriesLayoutBy: 'row',
                    realtimeSort: true,
                    label: {
                        show: true,
                        position: 'right'
                    },
                    itemStyle: {
                        color: function (param) {
                            return data[1][param.dataIndex + 1] || colorAll[param.dataIndex % colorAll.length];
                        }
                    }
                }],
                grid: {
                    right: 60,
                    bottom: 30
                },
                title: [{
                    text: 'aaa',
                    right: 20,
                    bottom: 15,
                    textStyle: {
                        color: '#ccc',
                        opacity: 0.3,
                        fontSize: 70
                    }
                }, {
                    text: title,
                    left: 10,
                    top: 10
                }],
                animationDuration: 0,
                animationDurationUpdate: animationDuration,
                animationEasing: 'linear',
                animationEasingUpdate: 'linear'
            };
            chart.setOption(option, true);

            var dataCnt = data.length - headerLength - 1;
            for (var i = 0; i < dataCnt; ++i) {
                (function (i) {
                    var timeout;
                    var timeoutCb = function () {
                        chart.setOption({
                            series: [{
                                type: 'bar',
                                id: 'bar',
                                data: getDataLine(i + 1),
                                label: {
                                    valueAnimation: true
                                }
                            }]
                        });
                        removeTimeoutHandlers(timeout);
                    };
                    timeout = window.setTimeout(timeoutCb, i * animationDuration);
                    timeoutHandlers.push(timeout);
                })(i);
            }
        }

        function getDataLine(n) {
            return data[headerLength + n].slice(1).map(function (n) {
                return parseInt(n, 10);
            });
        }

        function clearTimeoutHandlers() {
            for (let i = 0; i < timeoutHandlers.length; ++i) {
                clearTimeout(timeoutHandlers[i]);
            }
            timeoutHandlers = [];
        }

        function removeTimeoutHandlers(handler) {
            for (let i = 0; i < timeoutHandlers.length; ++i) {
                if (timeoutHandlers[i] === handler) {
                    timeoutHandlers.splice(i, 1);
                }
            }
        }
    </script>
</body>
</html>
`;
