<!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">
        <script src="lib/esl.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>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            h2 {
                line-height: 60px;
                height: 60px;
                background: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
            .chart {
                height: 600px;
            }
            button {
                font-size: 16px;
            }
        </style>

        <button onclick="change()">CHANGE</button>
        <div class="chart" id="main2"></div>

        <h2>Default Label Animation</h2>
        <div class="chart" id="main0"></div>


        <h2>Label Animation with animationDelay callback</h2>
        <div class="chart" id="main1"></div>





        <script>

            require([
                'echarts'
            ], function (echarts) {
                var groupCategories = [];
                var groupColors = [];
                var chart = echarts.init(document.getElementById('main2'));

                var base = +new Date(1968, 9, 3);
                var oneDay = 24 * 3600 * 1000;
                var date = [];
                var data = [];

                for (var i = 0; i < 10; i++) {
                    var now = new Date(base += oneDay);
                    date.push([now.getFullYear(), now.getMonth() + 1, now.getDate()].join('/'));
                    // data.push(Math.round((Math.random() - 0.5) * 20 + data[i - 1]));
                    data.push(i * i - 15);
                }

                option = {
                    tooltip: {
                        trigger: 'axis',
                        position: function (pt) {
                            return [pt[0], '10%'];
                        }
                    },
                    legend: {
                        data: ['large area']
                    },
                    toolbox: {
                        feature: {
                            dataZoom: {
                                yAxisIndex: 'none'
                            },
                            restore: {},
                            saveAsImage: {}
                        }
                    },
                    grid: {
                        containLabel: true
                    },
                    xAxis: {
                        type: 'category',
                        boundaryGap: false,
                        data: date,
                        axisTick: {
                            interval: 0
                        },
                        axisLabel: {
                            interval: 0
                        }
                    },
                    yAxis: {
                        type: 'value',
                        boundaryGap: [0, '100%']
                    },
                    dataZoom: [{
                        type: 'inside',
                        // start: 0,
                        // end: 10
                    }, {
                        start: 0,
                        end: 10,
                        handleIcon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4v1.3h1.3v-1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7V23h6.6V24.4z M13.3,19.6H6.7v-1.4h6.6V19.6z',
                        handleSize: '80%',
                        handleStyle: {
                            color: '#fff',
                            shadowBlur: 3,
                            shadowColor: 'rgba(0, 0, 0, 0.6)',
                            shadowOffsetX: 2,
                            shadowOffsetY: 2
                        }
                    }],
                    series: [
                        {
                            name:'large area',
                            type:'line',
                            symbol: 'none',
                            // type:'scatter',
                            // smooth:true,
                            // symbol: 'none',
                            sampling: 'average',
                            itemStyle: {
                                normal: {
                                    color: 'rgb(255, 70, 131)'
                                }
                            },
                            lineStyle: {
                                normal: {
                                    shadowBlur: 6,
                                    shadowColor: '#999',
                                    shadowOffsetX: 10,
                                    shadowOffsetY: 10
                                }
                            },
                            areaStyle: {
                                // origin: 'end',
                                color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
                                    offset: 0,
                                    color: 'rgb(255, 158, 68)'
                                }, {
                                    offset: 1,
                                    color: 'rgb(255, 70, 131)'
                                }])
                            },
                            data: data
                        }
                    ],
                    animationDurationUpdate: 2000
                };


                chart.setOption(option);

                window.change = function () {
                    chart.dispatchAction({
                        type: 'dataZoom',
                        end: 20
                    });
                }

            });


        </script>

        <script>

            require([
                'echarts'
            ], function (echarts) {
                var chart = echarts.init(document.getElementById('main0'));

                var xData = [];
                var data = [];
                var value = 200;
                var positive = 1;
                for (let i = 0; i < 100; ++i) {
                    xData.push(i + '');
                    value = positive * Math.round(Math.random() * 50) + value;
                    data.push(value);

                    if (Math.random() > 0.7) {
                        positive = -1 * positive;
                    }
                }

                option = {
                    title: [{
                        text: 'Default Line Animation, all should be left-to-right, bottom-to top',
                        subtext: 'Symbol and text should sync with line clipPath\n\naxis not inversed',
                        textAlign: 'center',
                        left: '50%',
                        top: 0
                    }, {
                        subtext: 'axis inversed',
                        textAlign: 'center',
                        left: '50%',
                        top: '52%'
                    }, {
                        text: 'left-to-right',
                        left: '25%',
                        textAlign: 'center',
                        top: 70
                    }, {
                        text: 'bottom-to-top',
                        left: '75%',
                        textAlign: 'center',
                        top: 70
                    }, {
                        text: 'right-to-left',
                        left: '25%',
                        textAlign: 'center',
                        top: '55%'
                    }, {
                        text: 'top-to-bottom',
                        left: '75%',
                        textAlign: 'center',
                        top: '55%'
                    }],
                    xAxis: [{
                        data: xData
                    }, {
                        gridIndex: 1
                    }, {
                        data: xData,
                        inverse: true,
                        gridIndex: 2
                    }, {
                        gridIndex: 3,
                        inverse: true
                    }],
                    yAxis: [{
                    }, {
                        data: xData,
                        gridIndex: 1
                    }, {
                        inverse: true,
                        gridIndex: 2
                    }, {
                        data: xData,
                        gridIndex: 3,
                        inverse: true
                    }],
                    grid: [{
                        left: 80,
                        top: 100,
                        right: '52%',
                        bottom: '55%'
                    }, {
                        left: '52%',
                        top: 100,
                        right: 50,
                        bottom: '55%'
                    }, {
                        left: 80,
                        right: '52%',
                        top: '60%',
                        bottom: 30
                    }, {
                        left: '52%',
                        right: 50,
                        top: '60%',
                        bottom: 30
                    }],
                    series: [{
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        labelLayout: {
                            hideOverlap: true
                        }
                    }, {
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        labelLayout: {
                            hideOverlap: true
                        },
                        xAxisIndex: 1,
                        yAxisIndex: 1
                    }, {
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        labelLayout: {
                            hideOverlap: true
                        },
                        xAxisIndex: 2,
                        yAxisIndex: 2
                    }, {
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        labelLayout: {
                            hideOverlap: true
                        },
                        xAxisIndex: 3,
                        yAxisIndex: 3
                    }],
                    animationDuration: 10000,
                    animationDurationUpdate: 1000
                };
                chart.setOption(option);

            });

        </script>


        <script>
            require([
                'echarts'
            ], function (echarts) {
                var chart = echarts.init(document.getElementById('main1'));

                var xData = [];
                var data = [];
                var value = 200;
                var positive = 1;
                for (let i = 0; i < 100; ++i) {
                    xData.push(i + '');
                    value = positive * Math.round(Math.random() * 50) + value;
                    data.push(value);

                    if (Math.random() > 0.7) {
                        positive = -1 * positive;
                    }
                }

                var duration = 10000;
                option = {
                    title: {
                        text: 'Label Animation with animationDelay callback',
                        subtext: 'Symbol and text should sync with line clipPath'
                    },
                    xAxis: {
                        data: xData
                    },
                    yAxis: {},
                    series: [{
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        animationEasing: 'cubicIn',
                        animationDelay: function (i) {
                            if (i == null) {
                                return null;
                            }
                            else {
                                // cubicIn is x=t^3 so t=x^(1/3)
                                return (Math.pow((i + 0.5) / data.length, 1 / 3)) * duration;
                            }
                        }
                    }],
                    animationDuration: duration,
                    animationDurationUpdate: 1000
                };
                chart.setOption(option);

            });

        </script>



    </body>
</html>