<!--
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: 100%;
            height: 100%;
            margin: 0;
        }

        #main {
            width: 90%;
            height: 45%;
            margin: 0;
            background: #fff;
        }
        #nodata {
            width: 90%;
            height: 45%;
            margin: 0;
            background: #fff;
        }
    </style>
    <div id="main"></div>
    <div id="nodata"></div>
    <script>

        require(['echarts'], function (echarts) {

            var chart = echarts.init(document.getElementById('main'), null, {
                // renderer: 'svg'
            });
            option = {
                color: ['#3398DB', '#CA2121'],
                legend: {
                    show: true,
                    data: ['Bar', 'Bar2'],
                },
                tooltip: {
                    show: true
                },
                toolbox: {
                    show: true,
                    right: '5%',
                    feature: {
                        saveAsImage: {
                            show: true,
                            title: 'Save As Image'
                        },
                        dataView: {
                            show: true,
                            title: 'Data View'
                        },
                        magicType: {
                            show: true,
                            type: ['line', 'bar', 'stack', 'tiled'],
                            title: {
                                line: 'line view',
                                bar: 'bar view',
                                stack: 'stack view',
                                tiled: 'tiled view',
                            },
                        },
                    },
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis : [
                    {
                        type : 'category',
                        data : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                        axisTick: {
                            alignWithLabel: true
                        }
                    }
                ],
                yAxis : [
                    {
                        type : 'value'
                    }
                ],
                series : [
                    {
                        name:'Bar',
                        type:'bar',
                        data:[10, 52, 200, 334, 390, 330, 220]
                    },
                    {
                        name:'Bar2',
                        type:'bar',
                        stack: 'stackTest',
                        data:[120, 132, 101, 134, 90, 230, 210]
                    }
                ]
            };

            chart.setOption(option, true);

            chart.on('magictypechanged', function (e) {
                console.log('currentType is', e.currentType);
            });
        });
    </script>
    <script>

        require(['echarts'], function (echarts) {

            var chart = echarts.init(document.getElementById('nodata'), null, {
                // renderer: 'svg'
            });
            option = {
                color: ['#3398DB', '#CA2121'],
                legend: {
                    show: true,
                    data: [],
                },
                tooltip: {
                    show: true
                },
                toolbox: {
                    show: true,
                    right: '5%',
                    feature: {
                        saveAsImage: {
                            show: true,
                            title: 'Save As Image'
                        },
                        dataView: {
                            show: true,
                            title: 'Data View'
                        },
                        magicType: {
                            show: true,
                            type: ['line', 'bar', 'stack', 'tiled'],
                            title: {
                                line: 'line view',
                                bar: 'bar view',
                                stack: 'stack view',
                                tiled: 'tiled view',
                            },
                        },
                    },
                },
                grid: {
                    left: '3%',
                    right: '4%',
                    bottom: '3%',
                    containLabel: true
                },
                xAxis : [
                    {
                        type : 'category',
                        data : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
                        axisTick: {
                            alignWithLabel: true
                        }
                    }
                ],
                yAxis : [
                    {
                        type : 'value'
                    }
                ],
                series : [
                ]
            };

            chart.setOption(option, true);

        });
    </script>
</body>

</html>
