
<!--
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, #main {
                width: 100%;
                height: 100%;
                margin: 0;
            }
            #main {
                background: #fff;
            }
            #btn-dispose {
                position: absolute;
                left: 10px;
                top: 10px;
                z-index: 1;
            }
        </style>
        <button type="button" id="btn-dispose">Dispose chart</button>
        <div id="main"></div>
        <script>

            require([
                'echarts'
                // 'echarts/chart/bar',
                // 'echarts/chart/line',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/toolbox',
                // 'echarts/component/title',
                // 'zrender/vml/vml'
            ], function (echarts) {

                var chart = echarts.init(document.getElementById('main'));

                chart.setOption({
                    backgroundColor: '#eee',
                    tooltip: {
                        show: true,
                        renderMode: 'richText',
                        enterable: true,
                        // position: [100, 100],
                        trigger: 'axis',
                        z: 100
                    },
                    yAxis: {
                        type: 'value'
                    },
                    xAxis: {
                        type: 'category',
                        data: ['A', 'B', 'C']
                    },
                    series: [{
                        name: 'bar0',
                        type: 'bar',
                        data: [2, 3, 6]
                    }, {
                        name: 'bar1',
                        type: 'bar',
                        data: [1, 0, 9]
                    }, {
                        name: 'bar2',
                        type: 'bar',
                        data: ['-', 2, 1]
                    }]
                });

                window.onresize = chart.resize;

                // fix #12607: to dispose the rich tooltip
                document.getElementById('btn-dispose').addEventListener('click', function () {
                    chart.dispose();
                });
            });
        </script>
    </body>
</html>
