<!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/esl.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="ut/lib/canteen.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            body {
                background: #000 !important;
            }
            .test-chart {
                margin: 80px auto 80px auto !important;
                background: #fff !important;
            }
            #live-info-panel {
                position: fixed;
                right: 5px;
                top: 5px;
                width: 140px;
                height: 120px;
                box-shadow: 0 0 5px #fff;
                border: 2px solid green;
                z-index: 999999;
                color: #fff;
                font-size: 10px;
                background: #000;
            }
            #live-info-panel .title {
                font-size: 10px;
                color: yellow;
                text-align: center;
            }
            #live-info-panel #live-info-content {
                padding: 2px 3px;
            }
            #parent-of-main0 {
                overflow: hidden;
            }
        </style>


        <div id="live-info-panel">
            <div class="title">Live Info Panel</div>
            <div id="live-info-content"></div>
        </div>

<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
<div>
        <div id="parent-of-main0">
            <div id="main0"></div>
        </div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

        <div id="main1"></div>
        <div id="main2"></div>




        <script>
            var _liveInfoPanel = document.getElementById('live-info-panel');
            var _liveInfoContent = document.getElementById('live-info-content');;
            var _liveMsg = [];
            function _printLiveInfo(msg) {
                _liveMsg.push(testHelper.encodeHTML(msg));
                _liveMsg = _liveMsg.slice(Math.max(0, _liveMsg.length - 9));
                _liveInfoContent.innerHTML = _liveMsg.join('<br>');
            }
            function _printEvent(event) {
                var x = event.offsetX;
                var y = event.offsetY;
                x = x != null ? x.toFixed(1) : '-';
                y = y != null ? y.toFixed(1) : '-';
                _printLiveInfo(
                    event.type + ' [' + x + ',' + x + ']'
                );
            }
        </script>





        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            var option;
            // $.getJSON('./data/nutrients.json', function (data) {});

            option = {
                xAxis: {},
                yAxis: {},
                brush: {},
                tooltip: {
                    enterable: true,
                    alwaysShowContent: true,
                    position: [10, 10]
                },
                series: {
                    type: 'line',
                    data: [[11, 22]]
                }
            };

            var chart = testHelper.create(echarts, 'main0', {
                title: [
                    '[ Test this case in **PC** / **Touch device** / **WeApp(no document)** ]',
                    '(1) Before anything clicked, **mousemove** / **click** on both inside and outside echarts.',
                    '**Live Info Panel** should have mouse events.',
                    '(2) **mousemove** / **click** on both inside and outside echarts.',
                    '**Live Info Panel** should display mouse **xy** correctly.',
                    'drag outside and release, "globalout" event should be displayed fianly (only PC)',
                    '(3) Click "add stopPropagation on parent"',
                    'drag outside should be as usual.',
                    'Move inside and outside echarts, **Live Info Panel** should have mouse event.'
                ],
                option: option,
                width: 300,
                height: 200,
                buttons: [{
                    text: 'add stopPropagation on parent',
                    onclick: function () {
                        var parent = document.getElementById('parent-of-main0');
                        parent.addEventListener('mousemove', function (event) {
                            event.stopPropagation();
                        });
                    }
                }]
            });

            var zr;
            var mounted;
            if (chart) {
                zr = chart.getZr();
                zr.on('mousemove', function (event) {
                    _printEvent(event)
                });
                zr.on('mouseup', function (event) {
                    _printEvent(event)
                });
                zr.on('globalout', function (event) {
                    _printEvent(event)
                });
            }
        });
        </script>






        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            var option;
            // $.getJSON('./data/nutrients.json', function (data) {});

            option = {
                xAxis: {},
                yAxis: {},
                toolbox: {
                    feature: {
                        dataZoom: {}
                    }
                },
                grid: {
                    left: 100
                },
                brush: {},
                dataZoom: [{
                    type: 'slider'
                }, {
                    type: 'inside'
                }],
                visualMap: {
                    type: 'continuous',
                    calculable: true,
                    left: 0,
                    top: 20,
                    min: 0,
                    max: 50,
                    itemHeight: 80
                },
                series: {
                    type: 'line',
                    data: [[11, 22], [33, 44], [42, 11], [52, 33]]
                }
            };

            var chart = testHelper.create(echarts, 'main1', {
                title: [
                    'Drag **toolbox.dataZoom** / **dataZoom-slider** / **brush**',
                    'to the **top** / **right** / **bottom** / **left** of the **black area** (out of echarts)',
                    'and then mouseup or go back.',
                    'Should act like listening to document `mousemove` and `mouseup`'
                ],
                option: option,
                width: 350,
                height: 260,
                // buttons: [{text: 'btn-txt', onclick: function () {}}],
                // recordCanvas: true,
            });
        });
        </script>










        <script>

            require(['echarts', 'map/js/china'], function (echarts) {
                var testGeoJson1 = {
                    'type': 'FeatureCollection',
                    'features': [
                        {
                            'geometry': {
                                'type': 'Polygon',
                                'coordinates': [
                                    [
                                        [
                                            2000,
                                            3000
                                        ],
                                        [
                                            5000,
                                            3000
                                        ],
                                        [
                                            5000,
                                            8000
                                        ],
                                        [
                                            2000,
                                            8000
                                        ]
                                    ]
                                ]
                            },
                            'properties': {
                                'name': 'Some Area',
                                'childNum': 1
                            }
                        }
                    ]
                };
                echarts.registerMap('test1', testGeoJson1);

                var data = [];
                var step = 200;
                var lngStart = 2000;
                var latStart = 4000;
                for (var i = 0; i < 10; i++) {
                    for (var j = 0; j < 20; j++) {
                        data.push({
                            value: [lngStart + j * step, latStart + i * step],
                            symbolSize: 5 + j * 2
                        });
                    }
                }

                var option = {
                    geo: [{
                        map: 'test1',
                        zoom: 8,
                        roam: true
                    }],
                    brush: {
                        geoIndex: 0
                    },
                    series: [{
                        type: 'scatter',
                        coordinateSystem: 'geo',
                        symbol: 'roundRect',
                        symbolSize: 30,
                        data: data
                    }, {
                        type: 'bar',
                        data: []
                    }],
                    xAxis: {},
                    yAxis: {},
                };

                var chart = testHelper.create(echarts, 'main2', {
                    title: [
                        'brush out of the area, the points that out of the chart area should be selected.',
                    ],
                    option: option,
                    width: 350,
                    height: 260
                });

                if (!chart) {
                    return;
                }

                chart.on('brushselected', function (params) {
                    var selectedDataIndices = fetchSelected(params);
                    txtEl.style.text = 'selected data indices: ' + selectedDataIndices.join(', ');
                    txtEl.dirty();
                });

                function fetchSelected(params) {
                    var selectedDataIndices = [];
                    for (var i = 0; i < params.batch.length; i++) {
                        var item = params.batch[i];
                        var selected = item.selected;
                        for (var j = 0; j < selected.length; j++) {
                            selectedDataIndices = selectedDataIndices.concat(selected[j].dataIndex);
                        }
                    }
                    return selectedDataIndices;
                }

                var txtEl = new echarts.graphic.Text({
                    style: {
                        x: 10,
                        y: 10,
                        color: 'blue',
                        fontSize: 9
                    },
                    z: 9999
                });
                var zr = chart.getZr();
                zr.add(txtEl);

            });

        </script>











    </body>
</html>

