<!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>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>


        <div id="main-eventful"></div>
        <div id="main-clip-by-system"></div>
        <div id="main-clip-by-self"></div>
        <div id="main-SVG-Path"></div>


        <script>

            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {

                var option = {
                    xAxis: {},
                    yAxis: {},
                    dataZoom: [{}, {type: 'inside'}],
                    series: [{
                        type: 'custom',
                        renderItem: function (params, api) {
                            return {
                                type: 'group',
                                position: api.coord([api.value(0), api.value(1)]),
                                children: [{
                                    type: 'rect',
                                    shape: {
                                        x: -100,
                                        y: -100,
                                        width: 200,
                                        height: 200,
                                        r: 10
                                    },
                                    style: {
                                        fill: 'rgba(102,241,98,0.4)'
                                    },
                                    silent: true,
                                    styleEmphasis: false
                                }, {
                                    type: 'group',
                                    name: 'innerGroup',
                                    children: [{
                                        type: 'circle',
                                        shape: {
                                            r: 30,
                                            cx: 0,
                                            cy: 0
                                        },
                                        info: 0,
                                        style: {
                                            fill: 'red',
                                            text: 'dataIndex: ' + params.dataIndex,
                                            textFill: '#000',
                                            textStroke: '#fff',
                                            textStrokeWidth: 1
                                        }
                                    }, {
                                        type: 'rect',
                                        shape: {
                                            x: 50,
                                            y: 60,
                                            width: 80,
                                            height: 80
                                        },
                                        style: {
                                            fill: '#ff3391'
                                        }
                                    }]
                                }]
                            };
                        },
                        data: [[121, 333], [29, 212]]
                    }]
                };

                var chart = testHelper.create(echarts, 'main-eventful', {
                    title: [
                        'Eventful: ',
                        'Only this el trigger events: **red circle** and **red rect** of **dataIndex: 1**',
                        '   Others not (green rect not)',
                        'Events (click, mousedown, mousemove, mouseup) are printed in console log.',
                        'red circle: params.info = 0, red rect: params.info = undefined'
                    ],
                    option: option
                });

                chart && echarts.util.each(['click', 'mousedown', 'mousemove', 'mouseup'], function (eventName) {
                    chart.on(eventName, {dataIndex: 1, element: 'innerGroup'}, function (params) {
                        console.log(params.type, params);
                        console.log('params.info: ', params.info);
                    });
                });
            });
        </script>






        <script>

            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {

                var option = {
                    xAxis: {
                        min: 90,
                        max: 120,
                        scale: true
                    },
                    yAxis: {
                        min: 50,
                        max: 500,
                        scale: true
                    },
                    dataZoom: [
                        {type: 'inside', filterMode: 'none'},
                        {type: 'slider', filterMode: 'none'},
                        {type: 'slider', filterMode: 'none', orient: 'vertical'},
                    ],
                    series: [{
                        type: 'custom',
                        renderItem: function (params, api) {
                            return {
                                type: 'polygon',
                                position: api.coord([api.value(0), api.value(1)]),
                                shape: {
                                    points: [
                                        [0, 0],
                                        [50, -50],
                                        [90, -50],
                                        [140, 0],
                                        [90, 50]
                                    ]
                                },
                                style: {
                                    fill: 'green'
                                }
                            }
                        },
                        clip: true,
                        data: [[100, 300]]
                    }]
                };

                var chart = testHelper.create(echarts, 'main-clip-by-system', {
                    title: [
                        'The shape should be **clipped** by the grid (by series.clip).',
                    ],
                    option: option
                });

            });

        </script>






        <script>

            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {

                var option = {
                    xAxis: {
                        min: 90,
                        max: 120,
                        scale: true
                    },
                    yAxis: {
                        min: 50,
                        max: 500,
                        scale: true
                    },
                    dataZoom: [
                        {type: 'inside', filterMode: 'none'},
                        {type: 'slider', filterMode: 'none'},
                        {type: 'slider', filterMode: 'none', orient: 'vertical'},
                    ],
                    series: [{
                        type: 'custom',
                        renderItem: function (params, api) {
                            return {
                                type: 'group',
                                children: [{
                                    type: 'polygon',
                                    position: api.coord([api.value(0), api.value(1)]),
                                    shape: {
                                        points: [
                                            [0, 0],
                                            [50, -50],
                                            [90, -50],
                                            [140, 0],
                                            [90, 50]
                                        ]
                                    },
                                    style: {
                                        fill: 'blue'
                                    }
                                }],
                                clipPath: {
                                    type: 'rect',
                                    shape: {
                                        x: params.coordSys.x,
                                        y: params.coordSys.y,
                                        width: params.coordSys.width,
                                        height: params.coordSys.height
                                    }
                                }
                            }
                        },
                        data: [[100, 300]]
                    }]
                };

                var chart = testHelper.create(echarts, 'main-clip-by-self', {
                    title: [
                        'The shape should be **clipped** by the grid (by custom clipPath).',
                    ],
                    option: option
                });

            });

        </script>




        <script>

            require(['echarts'], function (echarts) {

                // deprecated: this case would be wrong.

                var data = [];
                var data0 = [];
                for (var i = 0; i < 100; i++) {
                    data.push(i);
                    data0.push([i, 10]);
                }

                var option = {
                    tooltip: {
                    },
                    dataZoom: [{
                        type: 'slider',
                        yAxisIndex: 0,
                        zoomLock: true,
                        width: 10,
                        right: 10,
                        top: 70,
                        bottom: 20,
                        start: 94,
                        end: 100,
                        handleSize: 0,
                        showDetail: false,
                    }, {
                        type: 'inside',
                        yAxisIndex: 0,
                        start: 94,
                        end: 100,
                        zoomOnMouseWheel: false,
                        moveOnMouseMove: true,
                        moveOnMouseWheel: true
                    }],
                    grid: {
                        show: true,
                        top: 70,
                        bottom: 20,
                        left: 100,
                        right: 20,
                        backgroundColor: '#fff',
                        borderWidth: 0
                    },
                    xAxis: {
                        type: 'time',
                        position: 'top',
                        splitLine: {
                            lineStyle: {
                                color: ['#E9EDFF']
                            }
                        },
                        axisLine: {
                            show: false
                        },
                        axisTick: {
                            lineStyle: {
                                color: '#929ABA'
                            }
                        },
                        axisLabel: {
                            color: '#929ABA',
                            inside: false,
                            align: 'center'
                        }
                    },
                    yAxis: {
                    },
                    series: [{
                        type: 'scatter',
                        data: data0,
                        encode: {x: 1, y: 0}
                    }, {
                        type: 'custom',
                        renderItem: renderAxisLabelItem,
                        encode: {
                            x: -1, // Then this series will not controlled by x.
                            y: 0
                        },
                        data: data
                    }]
                };

                function renderAxisLabelItem(params, api) {
                    // Get the heigth corresponds to length 1 on y axis.
                    var x0 = 0;
                    var x1 = 30;
                    var x3 = 90;
                    var blockHeight = api.size([0, 1])[1] - 26;

                    return {
                        type: 'group',
                        position: [
                            10,
                            api.coord([0, api.value(0)])[1]
                            // blockHeight
                        ],
                        children: [{
                            type: 'path',
                            shape: {
                                d: 'M0,0 L0,-20 L30,-20 C40,-20 40,-1 50,-1 L90,-1 L90,0 Z',
                                x: 0,
                                y: -blockHeight,
                                width: 90,
                                height: blockHeight,
                                layout: 'cover'
                            },
                            style: {
                                fill: '#03b292'
                            }
                        }, {
                            type: 'text',
                            style: {
                                x: (x0 + x1) / 2,
                                y: -blockHeight / 2,
                                text: api.value(1),
                                textFill: '#fff',
                                textAlign: 'center',
                                textVerticalAlign: 'middle'
                            }
                        }]
                    };
                }

                var chart = testHelper.create(echarts, 'main-SVG-Path', {
                    title: [
                        'Test SVG path data auto fit to rect: ',
                        'the y axis label (made by custom series) should be center',
                    ],
                    option: option
                });

            });

        </script>








    </body>
</html>