
<!--
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>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
                /* background-image: url(old_mathematics.png); */
                /* background-repeat: repeat; */
            }
        </style>
        <div id="main"></div>
        <script>
            var chart;
            require([
                'echarts'
            ], function (echarts) {

                chart = echarts.init(document.getElementById('main'), null, {
                    // renderer: 'svg'
                });

                var item1 = {
                    color: '#F54F4A'
                };
                var item2 = {
                    color: '#FF8C75'
                };
                var item3 = {
                    color: '#FFB499'
                };

                var data = [{
                    children: [{
                        value: 5,
                        children: [{
                            value: 1,
                            itemStyle: item1
                        }, {
                            value: 2,
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }, {
                            children: [{
                                value: 1
                            }]
                        }],
                        itemStyle: item1
                    }, {
                        value: 10,
                        children: [{
                            value: 6,
                            children: [{
                                value: 1,
                                itemStyle: item1
                            }, {
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item2
                            }, {
                                value: 1
                            }],
                            itemStyle: item3
                        }, {
                            value: 2,
                            children: [{
                                value: 1
                            }],
                            itemStyle: item3
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }],
                        itemStyle: item1
                    }],
                    itemStyle: item1
                }, {
                    value: 9,
                    children: [{
                        value: 4,
                        children: [{
                            value: 2,
                            itemStyle: item2
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item1
                            }]
                        }],
                        itemStyle: item1
                    }, {
                        children: [{
                            value: 3,
                            children: [{
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item2
                            }]
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item2
                }, {
                    value: 7,
                    children: [{
                        children: [{
                            value: 1,
                            itemStyle: item3
                        }, {
                            value: 3,
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }, {
                                value: 1
                            }],
                            itemStyle: item2
                        }, {
                            value: 2,
                            children: [{
                                value: 1
                            }, {
                                value: 1,
                                itemStyle: item1
                            }],
                            itemStyle: item1
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item1
                }, {
                    children: [{
                        value: 6,
                        children: [{
                            value: 1,
                            itemStyle: item2
                        }, {
                            value: 2,
                            children: [{
                                value: 2,
                                itemStyle: item2
                            }],
                            itemStyle: item1
                        }, {
                            value: 1,
                            itemStyle: item3
                        }],
                        itemStyle: item3
                    }, {
                        value: 3,
                        children: [{
                            value: 1,
                        }, {
                            children: [{
                                value: 1,
                                itemStyle: item2
                            }]
                        }, {
                            value: 1
                        }],
                        itemStyle: item3
                    }],
                    itemStyle: item1
                }];

                chart.setOption({
                    series: {
                        radius: ['15%', '80%'],
                        type: 'sunburst',
                        sort: null,
                        highlightPolicy: 'ancestor',
                        data: data,
                        label: {
                            normal: {
                                rotate: 'radial'
                            }
                        },
                        levels: [],
                        itemStyle: {
                            normal: {
                                color: '#ddd',
                                borderWidth: 2
                            }
                        }
                    }
                });
            });

        </script>
    </body>
</html>
