
<!--
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">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <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" />
    </head>
    <body>
        <style>
        </style>

        <div id="main0"></div>

        <script>

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

            var option = {
                baseOption: {
                    timeline: {
                        // y: 0,
                        axisType: 'category',
                        // realtime: false,
                        // loop: false,
                        autoPlay: false,
                        // currentIndex: 2,
                        playInterval: 1000,
                        controlStyle: {
                            //position: 'left'
                            stopIcon: 'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAGpJREFUWAntlkEKwDAIBKP+/znt82xrD6FIpSSHXDpCQBeXDXOyNQoCBQEz21T1eL7QivUuj/qkO1MTwUm6R3cvPbEw6tO3kJUaH4AABCAAAQhAAAIQgEBJQET2fJxe2udZPuvLWcz/IXACuUMWMJDzUAgAAAAASUVORK5CYII=',
                            playIcon: 'path://M41.365908,29.4271388 L41.3664843,29.4265626 L26.3794329,19.1497136 L26.3747509,19.1541315 C26.0642269,18.8592621 25.6429678,18.677793 25.1786824,18.677793 C24.2236284,18.677793 23.4494433,19.4443188 23.4494433,20.3905371 C23.4494433,20.910214 23.4270417,21.9276946 23.4494433,21.9056292 L23.4494433,30.6673861 L23.4494433,39.8901629 C23.4494433,39.8977982 23.4494433,40.4825908 23.4494433,40.9444991 C23.4494433,41.8901412 24.2236284,42.656691 25.1786824,42.656691 C25.6447205,42.656691 26.0677564,42.4740454 26.3782564,42.1764869 L26.3794329,42.1770872 L41.3664843,31.9005503 L41.3659081,31.8996379 C41.6917266,31.5882735 41.894997,31.1514078 41.894997,30.6670739 C41.894997,30.6658974 41.894997,30.6650091 41.894997,30.6635444 C41.894997,30.6623679 41.894997,30.6609273 41.894997,30.6600389 C41.894997,30.175657 41.6917265,29.7384792 41.365908,29.4271388 Z'
                        },
                        replaceMerge: 'series',
                        data: [
                            '2 series', '3 series', '1 series'
                        ],
                    },
                    tooltip: {
                        trigger:'axis',
                        axisPointer: {
                            type: 'shadow'
                        }
                    },
                    legend: {},
                    calculable: true,
                    grid: {
                        top:80, bottom: 100
                    },
                    toolbox: {
                        left: 'center',
                        top: 30,
                        feature: {
                            dataZoom: {}
                        }
                    },
                    xAxis: {
                        type: 'category',
                        data: ['CityB', 'CityT', 'CityH', 'CityS'],
                        splitLine: {show: false}
                    },
                    yAxis: [
                        {
                            type: 'value',
                            name: 'GDP'
                        }
                    ],
                    series: [
                    ]
                },
                options: [
                    {
                        series: [
                            {name: 'a', type: 'bar', data: [12, 33, 44, 55]},
                            {name: 'b', type: 'bar', data: [55, 66, 77, 88]},
                        ]
                    },
                    {
                        series : [
                            {name: 'a', type: 'bar', data: [22, 33, 44, 55]},
                            {name: 'b', type: 'bar', data: [55, 66, 77, 88]},
                            {name: 'c', type: 'bar', data: [55, 66, 77, 88]}
                        ]
                    },
                    {
                        series : [
                            {name: 'b', type: 'bar', data: [55, 66, 77, 88]}
                        ]
                    }
                ]
            };


            var chart = testHelper.create(echarts, 'main0', {
                title: [
                    'Click "right arrow" of the timeline',
                    'check it should be **2 bar** => **3 bar** => **1 bar**',
                    'use toolbox "区域缩放"',
                    'timeline change',
                    'use toolbox "区域缩放还原"',
                    'Should be able to return correctly.'
                ],
                option: option,
            });
        });
        </script>
    </body>
</html>
