<!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">
        <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>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <!-- <link rel="stylesheet" href="lib/reset.css"> -->
    </head>
    <body>
        <style>
            * {
                /* Test tooltip trigger */
                pointer-events: auto !important;
            }
            html {
                position: static;

            }
            body {
                position: static;
                background: #ffe;
            }
            .chart {
                position: relative;
                width: 500px;
                height: 300px;
                border: 10px solid rgba(0,0,0,0.5);
                margin: 30px auto 30px auto;
            }
            .try-box {
                position: relative;
                background: green;
                padding: 0;
                border-width: 0;
                line-height: 1;
                text-align: center;
                font-size: 12px;
                color: yellow;
                /* box-sizing: content-box; */
            }
            .try-box-check {
                position: absolute;
                background: grey;
                padding: 0;
                border-width: 0;
                line-height: 1;
                text-align: center;
                font-size: 12px;
            }
            .try-coord-marker {
                position: absolute;
                background: red;
                width: 0; height: 0;
                /* width: 5px; height: 5px; */
            }
            .pointer-marker {
                position: absolute;
                width: 6px;
                height: 6px;
                margin: -3px 0 0 -3px;
                padding: 0;
                background: orange;
            }
        </style>

        <div
            style="
                position: fixed; left: 10px; bottom: 10px; color: red; padding: 2px;
                font-size: 20px; border: 1px solid red; background: #fff; z-index: 999">
            Also need test pinch
        </div>




        <div id="allCharts" style="margin: 30px;">

            <div data-ec-title="css transform 2d" class="chart" id="main0"
                style="
                    transform: scale(0.5, 0.5) rotate(15deg);
                ">
            </div>

            <div data-ec-title="css transform 3d" style="perspective: 171px;">
                <div class="chart" id="main1"
                    style="
                        transform: translate(100px) rotateY(18deg) rotateX(12deg);
                        transform-style: preserve-3d;
                    ">
                </div>
            </div>

            <div style="height: 300px;width: 10px;"></div>

            <div style="
                transform: scale(0.7, 0.7) rotate(75deg);
            ">
                <div style="perspective: 271px;">
                    <div data-ec-title="nested transform" class="chart" id="main2"
                        style="
                            transform: scale3d(1, -1.5, 1) rotateY(-28deg) rotateZ(-32deg);
                            transform-style: preserve-3d;
                        ">
                    </div>
                </div>
            </div>

            <div style="height: 400px;width: 10px;"></div>

            <div style="
                perspective: 231px;
            ">
                <canvas data-ec-title="Not support iOS (pre-create a canvas)" class="chart" id="main3"
                    style="
                        transform: translateX(140px) rotateX(28deg) rotateZ(12deg);
                        transform-style: preserve-3d;
                    ">
                </canvas>
            </div>

        </idv>






        <script>
            function $createOption(title) {
                var xAxisData = [];
                var data1 = [];
                var data2 = [];
                var data3 = [];
                var bigTooltipBound = 10;

                for (var i = 0; i < 50; i++) {
                    xAxisData.push('类目' + i);
                    data1.push(+(Math.random() + 0.5).toFixed(3));
                    data2.push(+(Math.random() + 0.5).toFixed(3));
                    data3.push(+(Math.random() + 0.5).toFixed(3));
                }

                function getSymbolSize(value, param) {
                    if (param.dataIndex <= bigTooltipBound) {
                        return 30;
                    }
                    return 10;
                }

                var itemStyle = {
                    normal: {
                        borderColor: 'white',
                        borderWidth: 3,
                        lineStyle: {
                            width: 1
                        }
                    }
                };

                return {
                    backgroundColor: '#eee',
                    title: {
                        text: title || ''
                    },
                    legend: {
                        data: ['line', 'line2', 'line3'],
                        itemWidth: 50,
                        itemHeight: 40,
                        right: 50,
                        bottom: 0
                    },
                    visualMap: null, // 用于测试 option 中含有null的情况。
                    tooltip: {
                        trigger: 'axis',
                        // set enterable as false to check coord of event triggered by tooltip.
                        enterable: false,
                        axisPointer: {
                            type: 'cross'
                        },
                        formatter: function () {
                            return [
                                '<div>',
                                    'Move inside the tooltip<br>',
                                    'The original interactions of<br>',
                                    'the chart under the tooltip <br>',
                                    'should be normally triggered.<br>',
                                    'That means the coord of <br>',
                                    'the event <br>',
                                    'triggered by tooltip<br>',
                                    'is correct<br>',
                                    '----<br>',
                                    '----<br>',
                                '</div>'
                            ].join('');
                        },
                        position: function (point, params, dom, rect, size) {
                            var viewSize = size.viewSize;
                            var contentSize = size.contentSize;
                            return [
                                viewSize[0] - contentSize[0],
                                viewSize[1] - contentSize[1],
                            ];
                        }
                    },
                    xAxis: {
                        data: xAxisData,
                        boundaryGap: false,
                        splitArea: {
                            show: false
                        },
                        splitLine: {
                            show: false
                        }
                    },
                    grid: {
                        left: '10%',
                        right: 2,
                        bottom: 100
                    },
                    yAxis: {
                        splitArea: {
                            show: true
                        }
                    },
                    dataZoom: [{
                        type: 'inside',
                        start: 10,
                        end: 30
                    }, {
                        type: 'slider',
                        bottom: 40
                    }],
                    series: [{
                        name: 'line',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        symbolSize: getSymbolSize,
                        data: data1,
                        itemStyle: itemStyle,
                        step: 'end'
                    }, {
                        name: 'line2',
                        type: 'line',
                        stack: 'all',
                        symbol: 'circle',
                        symbolSize: getSymbolSize,
                        data: data2,
                        itemStyle: itemStyle,
                        step: 'end'
                    }, {
                        name: 'line3',
                        type: 'line',
                        stack: 'all',
                        symbol: 'triangle',
                        symbolSize: getSymbolSize,
                        data: data3,
                        itemStyle: itemStyle,
                        step: 'end'
                    }]
                };
            }
        </script>




        <script>

            initCharts();

            function initCharts() {
                var allCharts = document.getElementById('allCharts');
                allCharts.style.display = 'block';

                function addEventListener(chart) {
                    chart.getZr().on('click', function (e) {
                        console.log('zr e.offsetX e.offsetY', e.offsetX, e.offsetY);
                        facePrint({'zr-e-offsetX': e.offsetX, 'zr-e-offsetY': e.offsetY});
                    });
                }

                require([
                    'echarts'
                ], function (echarts) {
                    var el = document.getElementById('main0');
                    if (!el) {
                        return;
                    }
                    var chart = echarts.init(el);
                    addEventListener(chart);
                    chart.setOption($createOption(el.getAttribute('data-ec-title')));
                });

                require([
                    'echarts'
                ], function (echarts) {
                    var el = document.getElementById('main1');
                    if (!el) {
                        return;
                    }
                    var chart = echarts.init(el, null, {
                    });
                    addEventListener(chart);
                    chart.setOption($createOption(el.getAttribute('data-ec-title')));
                });

                require([
                    'echarts'
                ], function (echarts) {
                    var el = document.getElementById('main2');
                    if (!el) {
                        return;
                    }
                    var chart = echarts.init(el, null, {
                    });
                    addEventListener(chart);
                    chart.setOption($createOption(el.getAttribute('data-ec-title')));
                });

                require([
                    'echarts'
                ], function (echarts) {
                    var canvasEl = document.getElementById('main3');
                    if (!canvasEl) {
                        return;
                    }
                    var chart = echarts.init(canvasEl, null, {
                        devicePixelRatio: 2,
                        // FIXME: weird
                        width: canvasEl.offsetWidth,
                        height: canvasEl.offsetHeight
                    });
                    addEventListener(chart);
                    chart.setOption($createOption(canvasEl.getAttribute('data-ec-title')));
                });
            }

        </script>




    </body>
</html>