<!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">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <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>
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            .test-title {
                background: #146402;
                color: #fff;
            }
        </style>


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


        <script>

            require([
                'echarts', 'map/js/china'
            ], function (echarts) {

                var locations = [{
                    name: '上海',
                    coord: [121.472644, 31.231706]
                }, {
                    name: '北京',
                    coord: [116.405285, 39.904989]
                }, {
                    name: '广东',
                    coord: [113.280637, 23.839463714285714]
                }];
                var option = {
                    tooltip: {
                        trigger: 'item',
                        formatter: '{b}'
                    },
                    series: [
                        {
                            name: '中国',
                            type: 'map',
                            mapType: 'china',
                            selectedMode : 'multiple',
                            label: {
                                normal: {
                                    show: true
                                },
                                emphasis: {
                                    show: true
                                }
                            }
                        }
                    ]
                };

                var myChart = testHelper.create(echarts, 'main0', {
                    title: 'Original series data is empty and no dataset',
                    option: option
                });

                var currentLoc = 0;
                setInterval(function () {
                    myChart.setOption({
                        series: [{
                            center: locations[currentLoc].coord,
                            zoom: 4,
                            data:[
                                {name: locations[currentLoc].name, selected: true}
                            ],
                            animationDurationUpdate: 1000,
                            animationEasingUpdate: 'cubicInOut'
                        }]
                    });
                    currentLoc = (currentLoc + 1) % locations.length;
                }, 2000);

            });

        </script>
    </body>
</html>