
<!--
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="../dist/echarts.js"></script>
        <script src="lib/jquery.min.js"></script>
        <script src="lib/testHelper.js"></script>
        <script src="lib/facePrint.js"></script>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 600;
                margin: 0;
            }

            #main {
                /* margin-left: 200px; */
                /* width: 300px; */
                width: 90%;
                margin: 0 auto;
            }

            #snapshot {
                position: fixed;
                right: 10;
                top: 10;
                width: 50;
                height: 50;
                background: #fff;
                border: 2px solid rgba(0,0,0,0.5);
            }


        </style>

        <button id="show_layers">Show Layers</button>

        <script>
            var btn = document.getElementById('show_layers');
            btn.onclick = function () {
                var container = document.getElementById('container');
                container.className = 'container-show-layers';
                var canvasList = document.getElementsByTagName('canvas');
                canvasList[0].parentNode.style.cssText = [
                    // 'perspective:971px;'
                ].join(';');
                for (var i = 0; i < canvasList.length; i++) {
                    var canvasDom = canvasList[i];
                    canvasDom.style.cssText = [
                        'transform: translateY(' + (-200 - i * 1350) + 'px) rotateX(82deg) rotateZ(345deg) scaleX(0.3) translateX(-1600px)',
                        'border: 10px solid #999',
                        'background: rgba(255,255,255,0.5)'
                    ].join(';') + ';';
                }
            };
        </script>


        <div id="container" data-ec-title="css transform 3d" style="
        ">
            <div id="main" style=""></div>
        </div>

        <script>

            var dataCount = 1e5;
            // var dataCount = 1e6;
            var chunkMax = 4;
            var chunkCount = 0;
            // var progressive = 2;
            // var progressive = 5000;
            // var progressive = 10000;
            var progressive = 'auto';
            // var progressive = 100;
            // var largeThreshold = 500;
            var largeThreshold = 500;
            // var largeThreshold = Infinity;
            var ticker = 'frame';
            // var ticker = 'messageChannel';

            function genData1(len, offset) {
                var lngRange = [-10.781327, 131.48];
                var latRange = [18.252847, 52.33];

                var arr = new Float32Array(len * 2);
                var off = 0;

                for (var i = 0; i < len; i++) {
                    var x = +Math.random() * 10;
                    var y = +Math.sin(x) - x * (len % 2 ? 0.1 : -0.1) * Math.random() + (offset || 0) / 10;
                    arr[off++] = x;
                    arr[off++] = y;
                }
                return arr;
            }

            function genData2(count) {
                var lngRange = [-10.781327, 31.48];
                var latRange = [-18.252847, 30.33];
                return genData(count, lngRange, latRange);
            }

            function genData(count, lngRange, latRange) {
                lngRange[1] += 5;
                lngRange[0] -= 10;
                latRange[1] += 4;
                var lngExtent = lngRange[1] - lngRange[0];
                var latExtent = latRange[1] - latRange[0];
                var data = [];
                for (var i = 0; i < count; i++) {
                    data.push([
                        Math.random() * lngExtent + lngRange[0],
                        Math.random() * latExtent + latRange[0],
                        Math.random() * 1000
                    ]);
                }
                return data;
            }

            var series0Data = genData1(dataCount);

                var chart = echarts.init(document.getElementById('main'), null, {
                    schedule: {
                        ticker: ticker
                    }
                });

                chart.setOption({
                    tooltip: {
                        // trigger: 'axis',
                        // renderMode: 'richText'
                    },
                    toolbox: {
                        left: 'center',
                        feature: {
                            dataZoom: {}
                        }
                    },
                    legend: {
                        orient: 'vertical',
                        left: 'left',
                        data: ['pm2.5' /* ,'pm10' */]
                    },
                    // ???
                    // visualMap: {
                    //     min: 0,
                    //     max: 1500,
                    //     left: 'left',
                    //     top: 'bottom',
                    //     text: ['High','Low'],
                    //     seriesIndex: [1, 2, 3],
                    //     inRange: {
                    //         color: ['#006edd', '#e0ffff']
                    //     },
                    //     calculable : true
                    // },
                    xAxis: [{
                    }],
                    yAxis: [{
                    }],
                    dataZoom: [{
                        type: 'inside',
                        // filterMode: 'none',
                    }, {
                        type: 'slider',
                        // filterMode: 'none',
                        showDataShadow: false
                    }],
                    animation: false,
                    series : [{
                        name: 'pm2.5',
                        type: 'scatter',
                        progressive: progressive,
                        data: series0Data,
                        dimensions: ['x', 'y'],
                        // symbol: 'rect',
                        symbolSize: 3,
                        // symbol: 'rect',
                        itemStyle: {
                            // color: '#128de3',
                            color: '#5470c6',
                            opacity: 0.2
                        },
                        z: 100,
                        large: true,
                        // large: {
                        //     symbolSize: 2
                        // },
                        // large: function (params) {
                        //     if (params.dataCount > 30000) {
                        //         return {symbolSize: 1};
                        //     }
                        //     else if (params.dataCount > 3000) {
                        //         return {symbolSize: 5};
                        //     }
                        // },
                        largeThreshold: largeThreshold
                    }, {
                        type: 'pie',
                        center: ['50%', '50%'],
                        radius: '30%',
                        data: [{
                            value: 123, name: 'a'
                        }, {
                            value: 123, name: 'b'
                        }, {
                            value: 123, name: 'c'
                        }, {
                            value: 123, name: 'd'
                        }, {
                            value: 123, name: 'e'
                        }, {
                            value: 23, name: 'f'
                        }],
                        z: 121212
                    }]
                });

                chart.on('click', function (param) {
                    alert('asdf');
                });

                // chart.on('finished', function () {
                //     console.log('finished');
                //     var url = chart.getDataURL();
                //     var snapshotEl = document.getElementById('snapshot');
                //     snapshotEl.src = url;
                // });

                window.onresize = chart.resize;

                // next();

                function next() {
                    if (chunkCount++ < chunkMax) {
                        var newData = genData1(100000, chunkCount);
                        chart.appendData({seriesIndex: 0, data: newData});
                        // console.log('Data loaded');
                        setTimeout(next, 3000);
                    }
                }


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