<!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/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>
            .test-title {
                background: #146402;
                color: #fff;
            }
            #main0 {
                height: 500px;
            }
        </style>


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


        <script>

            var chart;
            var myChart;
            var option;

            require([
                'echarts',
                'data/life-expectancy.json'
            ], function (echarts, data) {

                var myChart = echarts.init(document.getElementById('main0'));


                var itemStyle = {
                    normal: {
                        opacity: 0.8,
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowOffsetY: 0,
                        shadowColor: 'rgba(0, 0, 0, 0.5)'
                    }
                };

                var sizeFunction = function (x) {
                    var y = Math.sqrt(x / 5e8) + 0.1;
                    return y * 80;
                };
                // Schema:
                var schema = [
                    {name: 'Income', index: 0, text: '人均收入', unit: '美元'},
                    {name: 'LifeExpectancy', index: 1, text: '人均寿命', unit: '岁'},
                    {name: 'Population', index: 2, text: '总人口', unit: ''},
                    {name: 'Country', index: 3, text: '国家', unit: ''}
                ];

                option = {
                    baseOption: {
                        timeline: {
                            axisType: 'category',
                            orient: 'vertical',
                            autoPlay: false,
                            inverse: true,
                            playInterval: 1000,
                            left: null,
                            right: 0,
                            top: 20,
                            bottom: 20,
                            width: 55,
                            height: null,
                            label: {
                                normal: {
                                    textStyle: {
                                        color: '#999'
                                    }
                                },
                                emphasis: {
                                    textStyle: {
                                        color: '#fff'
                                    }
                                }
                            },
                            symbol: 'none',
                            lineStyle: {
                                color: '#555'
                            },
                            checkpointStyle: {
                                color: '#bbb',
                                borderColor: '#777',
                                borderWidth: 2
                            },
                            controlStyle: {
                                showNextBtn: false,
                                showPrevBtn: false,
                                normal: {
                                    color: '#666',
                                    borderColor: '#666'
                                },
                                emphasis: {
                                    color: '#aaa',
                                    borderColor: '#aaa'
                                }
                            },
                            data: []
                        },
                        backgroundColor: '#404a59',
                        title: [{
                            text: data.timeline[0],
                            textAlign: 'center',
                            left: '63%',
                            top: '55%',
                            textStyle: {
                                fontSize: 100,
                                color: 'rgba(255, 255, 255, 0.7)'
                            }
                        }, {
                            text: '各国人均寿命与GDP关系演变',
                            left: 'center',
                            top: 10,
                            textStyle: {
                                color: '#aaa',
                                fontWeight: 'normal',
                                fontSize: 20
                            }
                        }],
                        tooltip: {
                            padding: 5,
                            backgroundColor: '#222',
                            borderColor: '#777',
                            borderWidth: 1,
                            formatter: function (obj) {
                                var value = obj.value;
                                return schema[3].text + '：' + value[3] + '<br>'
                                        + schema[1].text + '：' + value[1] + schema[1].unit + '<br>'
                                        + schema[0].text + '：' + value[0] + schema[0].unit + '<br>'
                                        + schema[2].text + '：' + value[2] + '<br>';
                            }
                        },
                        grid: {
                            top: 100,
                            containLabel: true,
                            left: 30,
                            right: '110'
                        },
                        xAxis: {
                            type: 'log',
                            name: '人均收入',
                            max: 100000,
                            min: 300,
                            nameGap: 25,
                            nameLocation: 'middle',
                            nameTextStyle: {
                                fontSize: 18
                            },
                            splitLine: {
                                show: false
                            },
                            axisLine: {
                                lineStyle: {
                                    color: '#ccc'
                                }
                            },
                            axisLabel: {
                                formatter: '{value} $'
                            }
                        },
                        yAxis: {
                            type: 'value',
                            name: '平均寿命',
                            max: 100,
                            nameTextStyle: {
                                color: '#ccc',
                                fontSize: 18
                            },
                            axisLine: {
                                lineStyle: {
                                    color: '#ccc'
                                }
                            },
                            splitLine: {
                                show: false
                            },
                            axisLabel: {
                                formatter: '{value} 岁'
                            }
                        },
                        visualMap: [
                            {
                                show: false,
                                type: 'piecewise',
                                dimension: 3,
                                categories: echarts.util.map(data.countries, function (item) {
                                    return item[2];
                                }),
                                calculable: true,
                                precision: 0.1,
                                textGap: 30,
                                textStyle: {
                                    color: '#ccc'
                                },
                                inRange: {
                                    color: (function () {
                                        var colors = ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'];
                                        return colors.concat(colors);
                                    })()
                                }
                            }
                        ],
                        series: [
                            {
                                type: 'scatter',
                                itemStyle: itemStyle,
                                // progressive: false,
                                data: data.series[0],
                                symbolSize: function(val) {
                                    return sizeFunction(val[2]);
                                }
                            }
                        ],
                        animationDurationUpdate: 1000,
                        animationEasingUpdate: 'quinticInOut'
                    },
                    options: []
                };

                for (var n = 0; n < data.timeline.length; n++) {
                    option.baseOption.timeline.data.push(data.timeline[n]);
                    option.options.push({
                        title: {
                            show: true,
                            'text': data.timeline[n] + ''
                        },
                        series: {
                            name: data.timeline[n],
                            type: 'scatter',
                            itemStyle: itemStyle,
                            data: data.series[n],
                            symbolSize: function(val) {
                                return sizeFunction(val[2]);
                            }
                        }
                    });
                }

                myChart.setOption(option);

            });

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