<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/jquery@2.2.4/dist/jquery.min.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/lodash@3.10.1/index.min.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/dat.gui@0.6.5/build/dat.gui.min.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/echarts.js"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/map/js/china.js?_v_=1510583857922"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/map/js/world.js?_v_=1510583857922"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/extension/dataTool.js?_v_=1510583857922"></script>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&amp;ak=KOmVjPVUAey1G2E8zNhPiuQ6QiEmAwZu"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5.0.0-beta.2/dist/extension/bmap.js?_v_=1510583857922"></script>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
    <script type="text/javascript" src="../tool/seedrandom.js"></script>
    <style>
        html, body {
            margin: 0;
            overflow: hidden;
        }
        #viewport {
            position: absolute;
            left: 0px;
            top: 0px;
            right: 0px;
            bottom: 0px;
        }
    </style>
</head>
<body>
<div id="viewport"></div>
<script>
    // Params parser
    var params = {};
    (location.search || '').substr(1).split('&').forEach(function (item) {
        var kv = item.split('=');
        params[kv[0]] = kv[1];
    });

    var myChart = echarts.init(document.getElementById('viewport'), params.t || null);
    var app = {};
</script>
<script>
    var myrng = new Math.seedrandom('echarts');
    Math.random = function () {
        return myrng();
    };

    $.getJSON = function (url, cb) {
        const deferred = $.Deferred();
        readLocalFile(url).then(data => {
            data = JSON.parse(data);
            cb && cb(data);

            deferred.resolve([data]);
        });
        return deferred;
    }

    $.get = function (url, cb) {
        const deferred = $.Deferred();
        readLocalFile(url).then(data => {
            try {
                data = JSON.parse(data);
            }
            catch(e) {}

            cb(data);
            deferred.resolve([data]);
        });
        return deferred;
    }

    function addComponentPadding(componentOpt) {
        if (!componentOpt) {
            return;
        }
        if (!(componentOpt instanceof Array)) {
            componentOpt = [componentOpt];
        }
        componentOpt.forEach(function (opt) {
            if (!opt.padding) {
                opt.padding = 15;
            }
        });
    }

    echarts.registerPreprocessor(function (option) {
        option.animation = false;
        // option.textStyle = {
        //     fontSize: 14
        // };
        if (option.series) {
            if (!(option.series instanceof Array)) {
                option.series = [option.series];
            }
            option.series.forEach(function (seriesOpt) {
                if (seriesOpt.type === 'graph') {
                    seriesOpt.force = seriesOpt.force || {};
                    seriesOpt.force.layoutAnimation = false;
                }
                seriesOpt.progressive = 1e5;
                seriesOpt.animation = false;
            });
        }
        addComponentPadding(option.title);
        addComponentPadding(option.legend);
        addComponentPadding(option.toolbox);
    });

    if (params.c) {
        if (!window.ROOT_PATH) {
            // When visiting `screenshot.html` In browser.
            console.error('No ROOT_PATH specified. Use default ROOT_PATH "."');
            window.ROOT_PATH = '.';
        }
        var sourceFolder = params.s || 'data';
        var scriptTag = document.createElement('script');
        scriptTag.async = false;
        scriptTag.src = `./${sourceFolder}/${params.c}.js`
        document.body.appendChild(scriptTag);

        scriptTag.onload = function () {
            if (typeof option !== 'undefined' && option) {
                myChart.setOption(option);
            }
        }
    }
</script>
</body>
</html>