<!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/simpleRequire.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>