<!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="data/pie-texture.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            .test-title {
                background: #146402;
                color: #fff;
            }
        </style>


        <div id="main0"></div>
        <div id="main1"></div>
        <div id="main2"></div>
        <div id="main3"></div>
        <div id="main4"></div>
        <div id="main5"></div>
        <div id="main6"></div>
        <div id="main7"></div>
        <div id="main8"></div>


        <script>

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

                var value2 = 400;
                var total = 1000;

                function getData() {
                    return [{
                        name: '',
                        value: total - value2,
                        itemStyle: { color: 'rgb(8,90,150)' },
                        label: { show: false }
                    }, {
                        name: '50%',
                        value: value2,
                        itemStyle: { color: 'rgb(23,235,255)'},
                        label: { position: 'center', color: '#999', fontSize: '100' }
                    }]
                }

                var option = {
                    animation: false,
                    series: [{
                        type: 'pie',
                        radius: ['60%','80%'],
                        labelLine: { show: false },
                        hoverAnimation: false,
                        data: getData()
                    }]
                };

                var chart = testHelper.create(echarts, 'main0', {
                    title: 'Label should be always at center of the pie',
                    option: option,
                    info: {
                        data: [{
                            label: {position: 'center'}
                        }]
                    }
                });

                setInterval(function () {
                    value2 += 3;
                    if (value2 > total) {
                        value2 = 0;
                    }
                    chart.setOption({
                        series: [{
                            data: getData()
                        }]
                    });
                }, 20);
            });

        </script>



        <script>

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

                var count = 80;
                var data = [];
                for (var i = 0; i < count; i++) {
                    // var label = i === 30
                    //     ? {
                    //         position: 'center',
                    //         fontSize: 30,
                    //         color: '#fff'
                    //     }
                    //     : null;
                    data.push({
                        name: i + 'Something really Random',
                        value: Math.random(),
                        // label: label
                    });
                }

                var option = {
                    series: [{
                        type: 'pie',
                        radius: '50%',
                        labelLine: {
                            minTurnAngle: 110,
                            length2: 10,
                            smooth: true
                        },
                        data: data
                    }]
                };

                var chart = testHelper.create(echarts, 'main1', {
                    title: 'Too many',
                    option: option
                });
            });


        </script>




        <script>

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

                var count = 60;

                function makeData(sign) {
                    var data = [];
                    for (var i = 0; i < count; i++) {
                        var value = Math.random() * 50 * sign;
                        value = +value.toFixed(2);

                        if (i >= 2
                            && i <= count - 2
                            && i % 10 !== 0
                            // Test the case that the bottom label is normal to display.
                            && Math.abs(i - Math.round(count / 2)) > 2
                        ) {
                            value = sign > 0
                                ? value - Math.floor(value)
                                : value - Math.ceil(value);
                            value = +value.toFixed(2);
                        }

                        data.push({
                            name: value,
                            value: value
                        });
                    }
                    return data;
                }

                var pos = ['25%', '75%'];

                var option = {
                    title: [{
                        text: 'Positive value\nminShowLabelAngle: 10',
                        textAlign: 'center',
                        left: pos[0]
                    }, {
                        text: 'Negative value\nminShowLabelAngle: 2',
                        textAlign: 'center',
                        left: pos[1]
                    }],
                    series: [{
                        type: 'pie',
                        center: [pos[0], '50%'],
                        minShowLabelAngle: 10,
                        label: {show: true},
                        radius: '30%',
                        data: makeData(1)
                    }, {
                        type: 'pie',
                        center: [pos[1], '50%'],
                        minShowLabelAngle: 2,
                        label: {show: true},
                        radius: '30%',
                        data: makeData(-1)
                    }]
                };

                var chart = testHelper.create(echarts, 'main2', {
                    title: [
                        'minShowLabelAngle: label of small sector should **not be displayed**.',
                        'other label should **be displayed** in appropriate place.'
                    ],
                    option: option
                });
            });

        </script>








        <script>

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

                var count = 5;

                function makeData(sign) {
                    var data = [];
                    for (var i = 0; i < count; i++) {
                        var value = Math.random() * 50 * sign;
                        value = +value.toFixed(2);

                        if (i >= 2
                            && i <= count - 2
                            && i % 10 !== 0
                            // Test the case that the bottom label is normal to display.
                            && Math.abs(i - Math.round(count / 2)) > 2
                        ) {
                            value = sign > 0
                                ? value - Math.floor(value)
                                : value - Math.ceil(value);
                            value = +value.toFixed(2);
                        }

                        data.push({
                            name: value,
                            value: value
                        });
                    }
                    return data;
                }

                var pos = ['25%', '75%'];

                var option = {
                    title: [{
                        text: 'label.rotate: true, label should be in redical direction.',
                        textAlign: 'center',
                        left: pos[0]
                    }, {
                        text: 'label.rotate: 20',
                        textAlign: 'center',
                        left: pos[1]
                    }],
                    series: [{
                        type: 'pie',
                        center: [pos[0], '50%'],
                        minShowLabelAngle: 10,
                        label: {
                            show: true,
                            rotate: true
                        },
                        labelLine: {
                            length2: 0
                        },
                        radius: '30%',
                        data: makeData(1)
                    }, {
                        type: 'pie',
                        center: [pos[1], '50%'],
                        minShowLabelAngle: 2,
                        label: {
                            show: true,
                            rotate: 20
                        },
                        radius: '30%',
                        data: makeData(-1)
                    }]
                };

                var chart = testHelper.create(echarts, 'main3', {
                    title: [
                        'label should be rotated'
                    ],
                    option: option
                });
            });

        </script>





        <script>
        require(['echarts'/*, 'map/js/china' */], function (echarts) {
            var option;

            // Pencil sketch texture
            var patternSrc = window.pieTexture;
            var img = new Image();
            img.src = patternSrc;

            option = {
                title: [{
                    left: '25%',
                    top: 10,
                    text: 'Lable text should be white\n and bordered with each sector color',
                    textAlign: 'center'
                }, {
                    left: '75%',
                    top: 10,
                    text: 'Lable text should be white\n and bordered with black',
                    textAlign: 'center'
                }],
                series: [{
                    type: 'pie',
                    label: {
                        position: 'inside'
                    },
                    center: ['25%', 150],
                    radius: [30, 60],
                    data: [{
                        name: 'xxxxxxxxxxxx',
                        value: 100
                    }, {
                        name: 'yyyyyyyy',
                        value: 120
                    }, {
                        name: 'zzzzzzzz',
                        value: 110
                    }]
                }, {
                    type: 'funnel',
                    label: {
                        position: 'inside'
                    },
                    top: null,
                    bottom: 30,
                    height: 100,
                    width: 50,
                    left: '25%',
                    data: [{
                        name: 'xxxxxxxxxxxx',
                        value: 100
                    }, {
                        name: 'yyyyyyyyyyy',
                        value: 120
                    }, {
                        name: 'zzzzzzzzzzz',
                        value: 110
                    }]
                }, {
                    type: 'pie',
                    label: {
                        position: 'inside'
                    },
                    center: ['75%', 150],
                    radius: [30, 60],
                    itemStyle: {
                        color: {
                            image: img,
                            repeat: 'repeat'
                        },
                        borderWidth: 3,
                        borderColor: '#111'
                    },
                    data: [{
                        name: 'xxxxxxxxxxxx',
                        value: 100
                    }, {
                        name: 'yyyyyyyyyyy',
                        value: 120
                    }, {
                        name: 'zzzzzzzzzzz',
                        value: 110
                    }]
                }, {
                    type: 'funnel',
                    label: {
                        position: 'inside'
                    },
                    top: null,
                    bottom: 30,
                    height: 100,
                    width: 50,
                    left: null,
                    right: '25%',
                    itemStyle: {
                        color: {
                            image: img,
                            repeat: 'repeat'
                        },
                        borderWidth: 3,
                        borderColor: '#111'
                    },
                    data: [{
                        name: 'xxxxxxxxxxxx',
                        value: 100
                    }, {
                        name: 'yyyyyyyyyyyyy',
                        value: 120
                    }, {
                        name: 'zzzzzzzzzzzz',
                        value: 110
                    }]
                }]
            };

            var chart = testHelper.create(echarts, 'main4', {
                title: [
                    'label.position: "inside". And half inside half outside.'
                ],
                option: option,
                height: 400,
                // buttons: [{text: 'btn-txt', onclick: function () {}}],
                // recordCanvas: true,
            });
        });
        </script>



        <script>

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

                const data = [{
                    name: 'Something really Random(1)',
                    value: 1
                }, {
                    name: 'Something really Random(2)',
                    value: 2
                }, {
                    name: 'Something really Random(3)',
                    value: 3
                }, {
                    name: 'Something really Random(4)',
                    value: 2
                }, {
                    name: 'Something really Random(5)',
                    value: 3
                }];

                for (let i = 0; i < 5 ; i++) {
                    data.push({
                        name: 'Something really Random(' + i + ')',
                        value: Math.random() * 0.1 + 0.1
                    });
                }

                data.push({
                    name: 'Something really Random',
                    value: 2
                });
                for (let i = 0; i < 5 ; i++) {
                    data.push({
                        name: 'Something really Random(' + i + ')',
                        value: Math.random() * 0.1 + 0.1
                    });
                }

                var option = {
                    series: [{
                        type: 'pie',
                        radius: '50%',
                        data: data
                    }]
                };

                var chart = testHelper.create(echarts, 'main5', {
                    title: 'Layout Case 1',
                    option: option
                });
            });

        </script>

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

                const data = [{
                    "name": "United States",
                    "value": [213242, 22.86439111423725, "United States"]
                }, {
                    "name": "Italy",
                    "value": [110574, 11.856047040759652, "Italy"]
                }, {
                    "name": "Spain",
                    "value": [104118, 11.163817043697554, "Spain"]
                }, {
                    "name": "China",
                    "value": [82361, 8.830971931231625, "China"]
                }, {
                    "name": "Germany",
                    "value": [77872, 8.349649059978255, "Germany"]
                }, {
                    "name": "France",
                    "value": [57749, 6.192005901539504, "France"]
                }, {
                    "name": "Iran",
                    "value": [47593, 5.103051773571311, "Iran"]
                }, {
                    "name": "United Kingdom",
                    "value": [29865, 3.202207072840695, "United Kingdom"]
                }, {
                    "name": "Switzerland",
                    "value": [17768, 1.905133610253925, "Switzerland"]
                }, {
                    "name": "Turkey",
                    "value": [15679, 1.6811453103991045, "Turkey"]
                }, {
                    "name": "Belgium",
                    "value": [13964, 1.4972583145872247, "Belgium"]
                }, {
                    "name": "Netherlands",
                    "value": [13696, 1.4685226207810533, "Netherlands"]
                }, {
                    "name": "Austria",
                    "value": [10711, 1.1484627476041078, "Austria"]
                }, {
                    "name": "Korea, South",
                    "value": [9887, 1.0601112114239395, "Korea, South"]
                }, {
                    "name": "Canada",
                    "value": [9560, 1.0250493760708872, "Canada"]
                }, {
                    "name": "Portugal",
                    "value": [8251, 0.8846948119205952, "Portugal"]
                }, {
                    "name": "Brazil",
                    "value": [6836, 0.7329746375335339, "Brazil"]
                }, {
                    "name": "Israel",
                    "value": [6092, 0.6532009203999837, "Israel"]
                }, {
                    "name": "Sweden",
                    "value": [4947, 0.5304308852952593, "Sweden"]
                }, {
                    "name": "Norway",
                    "value": [4863, 0.52142417529631, "Norway"]
                }, {
                    "name": "Australia",
                    "value": [4862, 0.5213169525582273, "Australia"]
                }, {
                    "name": "Czechia",
                    "value": [3508, 0.37613736519421254, "Czechia"]
                }, {
                    "name": "Ireland",
                    "value": [3447, 0.3695967781711661, "Ireland"]
                }, {
                    "name": "Denmark",
                    "value": [3290, 0.35276280829217765, "Denmark"]
                }, {
                    "name": "Chile",
                    "value": [3031, 0.3249921191287509, "Chile"]
                }, {
                    "name": "Malaysia",
                    "value": [2908, 0.31180372234457526, "Malaysia"]
                }, {
                    "name": "Russia",
                    "value": [2777, 0.2977575436557378, "Russia"]
                }, {
                    "name": "Ecuador",
                    "value": [2748, 0.29464808425133865, "Ecuador"]
                }, {
                    "name": "Poland",
                    "value": [2554, 0.2738468730632893, "Poland"]
                }, {
                    "name": "Romania",
                    "value": [2460, 0.2637679356835128, "Romania"]
                }];

                var option = {
                    backgroundColor: '#333',
                    visualMap: {
                        dimension: 0,
                        left: 10,
                        itemWidth: 12,
                        min: data[29].value[0],
                        max: data[0].value[0],
                        text: ['High', 'Low'],
                        textStyle: {
                            color: '#ddd'
                        },
                        inRange: {
                            color: ['lightskyblue', 'yellow', 'orangered', 'red']
                        }
                    },
                    series: [{
                        type: 'pie',
                        data: data,
                        roseType: 'radius',
                        radius: ['30%', '70%']
                    }]
                };

                var chart = testHelper.create(echarts, 'main6', {
                    title: 'Case from https://gallery.echartsjs.com/editor.html?c=xpm1ZhhOCG',
                    height: 300,
                    option: option
                });
            });

        </script>

        <script>
            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {
                const option = {
                    backgroundColor: '#2c343c',
                    visualMap: {
                        show: false,
                        min: 80,
                        max: 600,
                        inRange: {
                            colorLightness: [0, 1]
                        }
                    },
                    series : [
                        {
                            name: '访问来源',
                            type: 'pie',
                            radius: '55%',
                            data:[
                                {value:235, name:'视频广告'},
                                {value:274, name:'联盟广告'},
                                {value:310, name:'邮件营销'},
                                {value:335, name:'直接访问'},
                                {value:400, name:'搜索引擎'}
                            ],
                            roseType: 'angle',
                            label: {
                                textStyle: {
                                    color: 'rgba(255, 255, 255, 0.3)'
                                }
                            },
                            labelLine: {
                                smooth: true,
                                minTurnAngle: 120,
                                lineStyle: {
                                    color: 'rgba(255, 255, 255, 0.3)'
                                }
                            },
                            itemStyle: {
                                color: '#c23531',
                                shadowBlur: 200,
                                shadowColor: 'rgba(0, 0, 0, 0.5)'
                            }
                        }
                    ]
                };
                var chart = testHelper.create(echarts, 'main7', {
                    title: 'Case from https://echarts.apache.org/examples/zh/editor.html?c=doc-example/tutorial-styling-step5',
                    height: 300,
                    option: option
                });
            });

        </script>

        <script>
            require([
                'echarts'/*, 'map/js/china' */
            ], function (echarts) {
                const option = {
                    series: [
                        {
                            name: '访问来源',
                            type: 'pie',
                            radius: '50%',
                            center: ['25%', '50%'],
                            data: [
                                { value: 1, name: '搜索引擎' },
                            ],
                            emphasis: {
                                itemStyle: {
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            label: {
                                position: 'inside'
                            }
                        },
                        {
                            name: '访问来源1',
                            type: 'pie',
                            radius: '50%',
                            center: ['75%', '50%'],
                            data: [
                                { value: 1, name: '搜索引擎' },
                            ],
                            emphasis: {
                                itemStyle: {
                                    shadowBlur: 10,
                                    shadowOffsetX: 0,
                                    shadowColor: 'rgba(0, 0, 0, 0.5)'
                                }
                            },
                            label: {
                                position: 'outside'
                            }
                        },
                    ]
                };

                setTimeout(() => {
                    option.series[0].label.position = 'outside';
                    option.series[1].label.position = 'inside';
                    chart.setOption(option);
                }, 2000);
                setTimeout(() => {
                    option.series[0].label.position = 'inside';
                    option.series[1].label.position = 'outside';
                    chart.setOption(option);
                }, 4000);
                setTimeout(() => {
                    option.series[0].label.position = 'outside';
                    option.series[1].label.position = 'inside';
                    chart.setOption(option);
                }, 6000);

                var chart = testHelper.create(echarts, 'main8', {
                    title: 'labelLine should be hidden when position is not \'outside\'',
                    height: 300,
                    option: option
                });

            });
        </script>
    </body>
</html>
