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