<!DOCTYPE html>
<!--
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">
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <script src="lib/simpleRequire.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <script src="lib/dat.gui.min.js"></script>
        <link rel="stylesheet" href="lib/reset.css">
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
            .chart {
                height: 500px;
            }
        </style>


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




        <script>

            var echarts;
            var chart;
            var myChart;
            var groupCategories = [];
            var groupColors = [];

            require([
                'echarts'
            ], function (ec) {
                echarts = ec;


                var posList = [
                    'left', 'right', 'top', 'bottom',
                    'inside',
                    'insideTop', 'insideLeft', 'insideRight', 'insideBottom',
                    'insideTopLeft', 'insideTopRight', 'insideBottomLeft', 'insideBottomRight'
                ];

                var config = {
                    position: 'top',
                    distance: 20
                };

                function update() {
                    chart.setOption({
                        series: {
                            type: 'scatter',
                            label: {
                                normal: {
                                    position: config.position,
                                    distance: config.distance
                                }
                            }
                        }
                    });
                }

                var gui = new dat.GUI();
                gui.add(config, 'position', posList)
                    .onChange(update);
                gui.add(config, 'distance', 0, 100)
                    .onChange(update);


                option = {
                    series: [
                        {
                            type: 'scatter',
                            symbolSize: 160,
                            symbol: 'roundRect',
                            data: [[1, 1]],
                            label: {
                                normal: {

                                    position: config.position,
                                    distance: config.distance,

                                    show: true,
                                    formatter: [
                                        'Label Text',
                                    ].join('\n'),
                                    backgroundColor: '#eee',
                                    borderColor: '#555',
                                    borderWidth: 2,
                                    borderRadius: 5,
                                    padding: 10,
                                    fontSize: 18,
                                    shadowBlur: 3,
                                    shadowColor: '#888',
                                    shadowOffsetX: 0,
                                    shadowOffsetY: 3,
                                    textBorderColor: '#000',
                                    textBorderWidth: 3,
                                    color: '#fff'
                                }
                            }
                        }
                    ],
                    xAxis: {
                        max: 2
                    },
                    yAxis: {
                        max: 2
                    }
                };


                var chart = testHelper.createChart(echarts, 'main', option);
            });

        </script>
    </body>
</html>