
<!--
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="data/pie-texture.js"></script>
        <script src="lib/dat.gui.min.js"></script>
        <link rel="stylesheet" href="lib/reset.css" />
        <script src="lib/testHelper.js"></script>
    </head>
    <body>
        <style>
        </style>

        <div id="main"></div>
        <div id="main2"></div>


        <script>
            var chart;
            require([
                'echarts'
            ], function (echarts) {

                chart = echarts.init(document.getElementById('main'));

                // Pencil sketch texture
                var patternSrc = window.pieTexture;
                var itemStyle = {
                    normal: {
                        opacity: 0.7,
                        color: {
                            image: patternSrc,
                            repeat: 'repeat'
                        },
                        borderWidth: 3,
                        borderColor: '#235894'
                        // shadowBlur: 10,
                        // shadowOffsetX: 0,
                        // shadowOffsetY: 5,
                        // shadowColor: 'rgba(0, 0, 0, 0.4)'
                    }
                };
                chart.setOption({
                    legend: {
                        data: ['直接访问（初始就被选中）','邮件营销','联盟广告','视频广告','搜索引擎']
                        // data: []
                    },
                    toolbox: {
                        left: 'left',
                        feature: {
                            dataView: {},
                            saveAsImage: {}
                        }
                    },
                    tooltip: {},
                    series: [{
                        name: 'pie',
                        type: 'pie',
                        selectedMode: 'single',
                        selectedOffset: 30,
                        clockwise: true,
                        label: {
                            textStyle: {
                                fontSize: 18,
                                // color: '#333'
                            }
                        },
                        labelLine: {
                            lineStyle: {
                                color: '#333'
                            }
                        },
                        // emphasis: {
                        //     labelLine: {
                        //         lineStyle: {
                        //             color: 'red'
                        //         }
                        //     },
                        //     itemStyle: {
                        //     }
                        // },
                        data:[
                            {
                                value:235,
                                name:'直接访问（初始就被选中）',
                                cursor: 'move',
                                selected: true
                            },
                            {value: 163, name: '标签在内部',
                                label: {
                                    normal: {
                                        position: 'inside'
                                    }
                                }
                            },
                            {value:310, name:'邮件营销', label: {
                                normal: {
                                    textStyle: { // compat
                                        color: 'red'
                                    },
                                    formatter: '{abg|（居右）背景文字 }\n  {b|{b}}{c|}  ',
                                    backgroundColor: 'rgba(0,0,0,0.1)',
                                    borderColor: '#777',
                                    borderWidth: 2,
                                    borderRadius: 3,
                                    rich: {
                                        abg: {
                                            color: '#eee',
                                            fontSize: 14,
                                            backgroundColor: '#333',
                                            width: '100%',
                                            align: 'right',
                                            height: 22,
                                            borderRadius: [4, 4, 0, 0] // 四角的 borderRadius
                                        },
                                        b: {
                                            fontSize: 20,
                                            lineHeight: 46
                                        },
                                        c: {
                                            backgroundColor: {
                                                image: './data/hill-Kilimanjaro.png',
                                            },
                                            height: 30
                                        }
                                    }
                                },
                                emphasis: {
                                }
                            }},
                            {value:234, name:'联盟广告', label: {
                                normal: {
                                    textStyle: { // compat
                                        color: 'red'
                                    },
                                    formatter: '{a|（居中）背景文字顺序上有些 triky}{abg|}\n  {b|{b}}{c|}  ',
                                    backgroundColor: 'rgba(0,0,0,0.1)',
                                    borderColor: '#777',
                                    borderWidth: 2,
                                    borderRadius: 3,
                                    rich: {
                                        a: {
                                            color: '#eee',
                                            fontSize: 14,
                                            align: 'center'
                                        },
                                        abg: {
                                            backgroundColor: '#333',
                                            width: '100%',
                                            align: 'right',
                                            height: 22,
                                            borderRadius: [4, 4, 0, 0] // 四角的 borderRadius
                                        },
                                        b: {
                                            fontSize: 20,
                                            lineHeight: 46
                                        },
                                        c: {
                                            backgroundColor: {
                                                image: './data/hill-Kilimanjaro.png',
                                            },
                                            height: 30
                                        }
                                    }
                                },
                                emphasis: {
                                }
                            }},
                            {value:135, name:'视频广告', label: {
                                normal: {
                                    textStyle: { // compat
                                        color: 'red'
                                    },
                                    formatter: '{abg|（居左）背景文字}\n  {b|{b}}{c|}  ',
                                    backgroundColor: 'rgba(0,0,0,0.1)',
                                    borderColor: '#777',
                                    borderWidth: 2,
                                    borderRadius: 3,
                                    rich: {
                                        abg: {
                                            color: '#eee',
                                            fontSize: 14,
                                            backgroundColor: '#333',
                                            width: '100%',
                                            align: 'left',
                                            height: 22,
                                            borderRadius: [4, 4, 0, 0] // 四角的 borderRadius
                                        },
                                        b: {
                                            fontSize: 20,
                                            lineHeight: 46
                                        },
                                        c: {
                                            backgroundColor: {
                                                image: './data/hill-Kilimanjaro.png',
                                            },
                                            height: 30
                                        }
                                    }
                                },
                                emphasis: {
                                }
                            }},
                            {value:148, name:'搜索引擎', label: {
                                normal: {
                                    textStyle: { // compat
                                        color: 'red'
                                    },
                                    formatter: '{a|富文本：(emphasis 背景改变）}\n{hr|}\n{b|{b}}{c|}',
                                    backgroundColor: 'rgba(0,0,0,0.1)',
                                    borderColor: '#777',
                                    borderWidth: 2,
                                    padding: 5,
                                    borderRadius: 3,
                                    rich: {
                                        a: {
                                            color: '#334499',
                                            align: 'left'
                                        },
                                        b: {
                                            fontSize: 20
                                        },
                                        hr: {
                                            width: '100%',
                                            borderColor: '#999',
                                            borderWidth: 0.5,
                                            height: 0,
                                            lineHeight: 15
                                        },
                                        c: {
                                            backgroundColor: {
                                                image: './data/hill-Kilimanjaro.png',
                                            },
                                            height: 30
                                        }
                                    }
                                },
                                emphasis: {
                                    backgroundColor: 'rgba(0,0,0,0.5)',
                                    shadowOffsetX: 5,
                                    shadowOffsetY: 5,
                                    shadowBlur: 5,
                                    shadowColor: '#333'
                                }
                            }}
                        ],
                        itemStyle: itemStyle
                    }]
                });

                var config = {
                    labelPosition: 'outside',
                    clockwise: true,
                    labelLineLen: 20,
                    labelLineLen2: 5
                };

                function update() {
                    chart.setOption({
                        series: [{
                            name: 'pie',
                            clockwise: config.clockwise,
                            label: {
                                normal: {
                                    position: config.labelPosition
                                }
                            },
                            labelLine: {
                                normal: {
                                    length: config.labelLineLen,
                                    length2: config.labelLineLen2
                                }
                            }
                        }]
                    });
                }

                var gui = new dat.GUI();
                gui.add(config, 'clockwise')
                    .onChange(update);
                gui.add(config, 'labelPosition', ['inside', 'outside'])
                    .onChange(update);
                gui.add(config, 'labelLineLen', 0, 100)
                    .onChange(update);
                gui.add(config, 'labelLineLen2', 0, 100)
                    .onChange(update);
            })

        </script>







        <script>
            require([
                'echarts'
            ], function (echarts) {

                var option = {
                    legend: {},
                    dataset: {
                        source: [
                            {name: 'a', value: 123},
                            {name: 'b', value: 456},
                            {name: 'should be selected', value: 789, selected: true}
                        ]
                    },
                    series: {
                        type: 'pie',
                        selectedMode: 'multiply'
                    }
                };

                testHelper.create(echarts, 'main2', {
                    option: option,
                    info: option
                })

            });
        </script>





    </body>
</html>