<!--
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/config.js"></script>
    <meta name="viewport" content="width=device-width", initial-scale="1" />
</head>

<body>
    <style>
        html,
        body {
            width: 80%;
            height: 100%;
            margin: 0;
        }

        .chart {
            background: #fff;
            margin-bottom: 20px;
            width: 80%;
            height: 200px;
        }
    </style>

    <p>SVG charts should export svg images without extra setting.</p>

    <div id="chart0" class="chart"></div>

    <p>The background of the exported svg using toolbox should be yellow.</p>

    <div id="chart1" class="chart"></div>
    <div id="chart2" class="chart"></div>

    <script>
        require([
            'echarts'
        ], function (echarts) {
            var chart0 = echarts.init(document.getElementById('chart0'), null, {
                renderer: 'svg'
            });
            option = {
                backgroundColor: '#aff',
                toolbox: {
                    feature: {
                        saveAsImage: {
                            show: true,
                            title: 'Save as image'
                        }
                    },
                    show: true,
                    itemGap: 1,
                    top: 20,
                    right: 35
                },
                xAxis: {
                    type: 'category',
                    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
                },
                yAxis: {
                    type: 'value'
                },
                series: [{
                    data: [820, 932, 901, 934, 1290, 1330, 1320],
                    type: 'line'
                }]
            };
            chart0.setOption(option);
        });

        require([
            'echarts'
        ], function (echarts) {
            var chart1 = echarts.init(document.getElementById('chart1'), null, {
                renderer: 'svg'
            });
            var chart2 = echarts.init(document.getElementById('chart2'), null, {
                renderer: 'svg'
            });

            var data1 = [];

            var symbolCount = 6;

            for (var i = 0; i < 100; i++) {
                data1.push([
                    Math.random() * 5,
                    Math.random() * 4,
                    Math.random() * 20,
                    Math.round(Math.random() * (symbolCount - 1))
                ]);
            }

            chart1.setOption({
                backgroundColor: 'red',
                toolbox: {
                    feature: {
                        saveAsImage: {
                            show: true,
                            title: 'Save as image',
                            type: 'png',
                            connectedBackgroundColor: 'yellow'
                        },
                        dataZoom: {
                            yAxisIndex: 'none',
                            show: true,
                            title: {
                                zoom: 'Zoom in',
                                back: 'Zoom out'
                            },
                        }
                    },
                    show: true,
                    itemGap: 1,
                    top: 20,
                    right: 35
                },
                legend: {
                    top: 50,
                    data: ['scatter']
                },
                tooltip: {
                    formatter: '{c}'
                },
                grid: {
                    top: '26%',
                    bottom: '26%'
                },
                xAxis: {
                    type: 'value',
                    splitLine: {
                        show: false
                    }
                },
                yAxis: {
                    type: 'value',
                    splitLine: {
                        show: false
                    }
                },
                series: [{
                    name: 'scatter',
                    type: 'scatter',
                    symbolSize: 30,
                    data: data1
                }]
            });

            chart2.setOption({
                backgroundColor: 'green',
                legend: {
                    top: 50,
                    data: ['scatter']
                },
                tooltip: {
                    formatter: '{c}'
                },
                grid: {
                    top: '26%',
                    bottom: '26%'
                },
                xAxis: {
                    type: 'value',
                    splitLine: {
                        show: false
                    }
                },
                yAxis: {
                    type: 'value',
                    splitLine: {
                        show: false
                    }
                },
                series: [{
                    name: 'scatter',
                    type: 'scatter',
                    symbolSize: 30,
                    data: data1
                }]
            });

            echarts.connect([chart1, chart2]);

        });
    </script>
</body>

</html>