<!--
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/simpleRequire.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>