<!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/testHelper.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #ddd;
                text-align: center;
                font-weight: bold;
                font-size: 14px;
            }
            .chart {
                height: 350px;
            }
        </style>

        <h1>Shift</h1>
          <div class="chart" id="shift"></div>
        <h1>Range stick to value</h1>
         <div class="chart" id="value"></div>


        <script>

            var echarts;
            var chart;
            var myChart;

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/toolbox',
                // 'echarts/component/dataZoom',
                // 'echarts/component/markLine'
            ], function (ec) {

                echarts = ec;

                var app = {};

                var option = {
                    title : {
                        text: '动态数据',
                        subtext: '纯属虚构'
                    },
                    tooltip : {
                        trigger: 'axis'
                    },
                    legend: {
                        data:['最新成交价']
                    },
                    toolbox: {
                        show : true,
                        feature : {
                            dataZoom : {
                                yAxisIndex: false
                            },
                        }
                    },
                    dataZoom : [{
                        type: 'inside',
                        start : 0,
                        end : 100
                    },
                    {
                        type: 'slider',
                        start : 0,
                        end : 100
                    }
                    ],
                    xAxis : [
                        {
                            type : 'value',
                            scale: true
                        }
                    ],
                    yAxis : [
                        {
                            type : 'value',
                            scale: true,
                            name : '预购量',
                            max: 1200,
                            min: 0,
                            boundaryGap: [0.2, 0.2]
                        }
                    ],
                    series : [
                        {
                            name:'最新成交价',
                            type:'line',
                            data:(function (){
                                var res = [];
                                var len = 0;
                                while (len < 10) {
                                    var n = [
                                        len,
                                        (Math.random()*10 + 5).toFixed(1)
                                    ];
                                    res.push({name: n[0], value: n});
                                    len++;
                                }
                                return res;
                            })(),
                            animation: true,
                            animationDurationUpdate: 500,
                            animationEasing: 'linear',
                            animationEasingUpdate: 'linear'
                        }
                    ]
                };

                var myChart = testHelper.createChart(echarts, 'shift', option);

                if (!myChart) {
                    return;
                }

                clearInterval(app.timeTicket);
                app.count = 11;
                app.timeTicket = setInterval(function (){
                    var data0 = option.series[0].data;
                    data0.shift();
                    var lastData = data0[data0.length - 1].value;
                    var x = [lastData[0] + 1, Math.round(Math.random() * 1000)];

                    data0.push({name: x[0], value: x});

                    myChart.setOption({series: option.series});
                }, 2100);
            });

        </script>














        <script>

            var echarts;
            var chart;
            var myChart;

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/chart/bar',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/dataZoom',
                // 'echarts/component/markLine'
            ], function (ec) {

                echarts = ec;

                var app = {};

                var option = {
                    title : {
                        text: '动态数据',
                        subtext: '纯属虚构'
                    },
                    tooltip : {
                        trigger: 'axis'
                    },
                    legend: {
                        data:['最新成交价']
                    },
                    toolbox: {
                        show : true,
                        feature : {
                            dataZoom : {
                                yAxisIndex: false
                            },
                        }
                    },
                    dataZoom : [{
                        type: 'inside',
                        start : 0,
                        endValue : 8,
                        rangeMode: ['value', 'value']
                    },
                    {
                        type: 'slider',
                        start : 0,
                        endValue : 8,
                        rangeMode: ['value', 'value']
                    }
                    ],
                    xAxis : [
                        {
                            type : 'value',
                            scale: true
                        }
                    ],
                    yAxis : [
                        {
                            type : 'value',
                            scale: true,
                            name : '预购量',
                            max: 1200,
                            min: 0,
                            boundaryGap: [0.2, 0.2]
                        }
                    ],
                    series : [
                        {
                            name:'最新成交价',
                            type:'line',
                            data:(function (){
                                var res = [];
                                var len = 0;
                                while (len < 10) {
                                    var n = [
                                        len,
                                        (Math.random()*10 + 5).toFixed(1)
                                    ];
                                    res.push({name: n[0], value: n});
                                    len++;
                                }
                                return res;
                            })(),
                            animation: true,
                            animationDurationUpdate: 500,
                            animationEasing: 'linear',
                            animationEasingUpdate: 'linear'
                        }
                    ]
                };

                var myChart = testHelper.createChart(echarts, 'value', option);

                if (!myChart) {
                    return;
                }

                clearInterval(app.timeTicket);
                app.count = 11;
                app.timeTicket = setInterval(function (){
                    var data0 = option.series[0].data;
                    var lastData = data0[data0.length - 1].value;
                    var x = [lastData[0] + 1, Math.round(Math.random() * 1000)];

                    data0.push({name: x[0], value: x});

                    myChart.setOption({series: option.series});
                    app.count++;

                    if (app.count > 300) {
                        clearInterval(app.timeTicket);
                    }
                }, 2100);
            });

        </script>









    </body>
</html>