<!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/jquery.min.js"></script>
        <script src="lib/config.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
        </style>
        <div id="main"></div>
        <script>

            var echarts;
            var chart;
            var myChart;

            require([
                'jquery',
                'echarts'
                // 'echarts/chart/scatter',
                // 'echarts/chart/parallel',
                // 'echarts/component/geo',
                // 'echarts/component/title',
                // 'echarts/component/legend',
                // 'echarts/component/brush',
                // 'echarts/component/tooltip',
                // 'echarts/component/toolbox',
                // 'echarts/component/visualMap',
                // 'echarts/component/timeline'
            ], function ($, ec) {

                echarts = ec;

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

                chart = myChart = echarts.init(document.getElementById('main'), null, {

                });

// -------------------------------------------------------------------
// -------------------------------------------------------------------
// -------------------------------------------------------------------


myChart.showLoading();

$.getJSON('data/life-expectancy.json', function (data) {
    myChart.hideLoading();

    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 * 40;
    };
    // 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: true,
                inverse: true,
                playInterval: 1000,
                left: null,
                right: 10,
                top: 20,
                bottom: 20,
                width: 55,
                height: null,
                label: {
                    normal: {
                        textStyle: {
                            color: '#ddd'
                        }
                    },
                    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: '#333',
            title: {
                'text': data.timeline[0],
                textAlign: 'center',
                right: '3%',
                top: '73%',
                textStyle: {
                    fontSize: 100,
                    color: 'rgba(255, 255, 255, 0.9)'
                }
            },
            tooltip: {
                padding: 5,
                backgroundColor: '#222',
                borderColor: '#777',
                borderWidth: 1
            },
            xAxis: {
                type: 'log',
                name: '人均收入',
                max: 100000,
                min: 300,
                nameGap: 25,
                nameLocation: 'middle',
                nameTextStyle: {
                    fontSize: 18
                },
                splitLine: {
                    show: false
                },
                axisTick: {
                    lineStyle: {
                        color: '#ddd'
                    }
                },
                axisLine: {
                    lineStyle: {
                        color: '#ddd'
                    }
                },
                axisLabel: {
                    formatter: '{value} $',
                    textStyle: {
                        color: '#ddd'
                    }
                }
            },
            yAxis: {
                type: 'value',
                name: '平均寿命',
                nameGap: 25,
                max: 100,
                nameTextStyle: {
                    color: '#ccc',
                    fontSize: 18
                },
                axisLine: {
                    lineStyle: {
                        color: '#ddd'
                    }
                },
                axisTick: {
                    lineStyle: {
                        color: '#ddd'
                    }
                },
                splitLine: {
                    show: false
                },
                axisLabel: {
                    formatter: '{value} 岁',
                    textStyle: {
                        color: '#ddd'
                    }
                }
            },
            grid: {
                top: '40%',
                left: 200,
                right: 110
            },
            geo: {
                top: 20,
                left: 170,
                right: 120,
                height: '38%',
                name: 'World Population (2010)',
                type: 'map',
                map: 'world',
                roam: false,
                label: {
                    emphasis: {
                        show: false
                    }
                },
                itemStyle: {
                    normal: {
                        borderColor: '#aaa',
                        areaColor: '#555'
                    },
                    emphasis: {
                        areaColor: '#555'
                    }
                }
            },
            toolbox: {
                // orient: 'vertical',
                top: 25,
                left: 10,
                itemSize: 20,
                // itemGap: 17,
                iconStyle: {
                    normal: {
                        borderColor: '#eee'
                    },
                    emphasis: {
                        borderColor: '#fffb60'
                    }
                }
            },
            brush: {
                toolbox: ['polygon', 'keep', 'clear'],
                brushLink: 'all',
                xAxisIndex: 0,
                geoIndex: 0,
                outOfBrush: {
                    opacity: .1,
                    color: '#aaa'
                }
            },
            visualMap: [
                {
                    type: 'piecewise',
                    dimension: 3,
                    categories: data.countries.map(function (item) {
                        return item[2];
                    }),
                    left: 10,
                    bottom: 35,
                    calculable: true,
                    precision: 0.1,
                    textGap: 10,
                    itemGap: 12,
                    textStyle: {
                        color: '#ccc'
                    },
                    inRange: {
                        color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a', '#376956', '#c3bed4', '#495a80', '#9966cc', '#bdb76a', '#eee8ab', '#a35015', '#04dd98', '#d9b3e6']
                    },
                    outOfRange: {
                        color: '#555'
                    }
                }
            ],
            series: [
                {
                    type: 'scatter',
                    id: 'gridScatter',
                    itemStyle: itemStyle,
                    data: data.series[0],
                    symbolSize: function(val) {
                        return sizeFunction(val[2]);
                    },
                    tooltip: {
                        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>';
                        }
                    }
                },
                {
                    type: 'scatter',
                    id: 'geoScatter',
                    coordinateSystem: 'geo',
                    itemStyle: {
                        normal: {
                            opacity: 1,
                            shadowBlur: 5,
                            shadowColor: 'rgba(0, 0, 0, 0.5)'
                        },
                    },
                    data: data.countries.map(function (item) {
                        return [item[0], item[1], 0, item[2]];
                    }),
                    symbolSize: 15,
                    tooltip: {
                        formatter: function (obj) {
                            var value = obj.value;
                            return schema[3].text + '：' + value[3];
                        }
                    }
                }
            ],
            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: {
                id: 'gridScatter',
                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>