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


        <div id="main1"></div>

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

        <div id="main3"></div>

        <div id="main4"></div>

        <div id="main5"></div>



        <script>
        require(['echarts'], function (echarts) {
            var option = {
                angleAxis: {
                    max: 3,
                    startAngle: 30,
                    splitLine: {
                        show: false
                    }
                },
                radiusAxis: {
                    type: 'category',
                    data: ['v', 'w', 'x', 'y', 'z'],
                    show: false
                },
                polar: {
                    radius: [10, '80%']
                },
                series: [{
                    type: 'bar',
                    data: [4, 3, 2, 1, 0],
                    coordinateSystem: 'polar',
                    name: 'Without Round Cap',
                    color: 'rgba(200, 0, 0, 0.5)',
                    itemStyle: {
                        borderColor: 'red',
                        borderWidth: 1
                    }
                }, {
                    type: 'bar',
                    data: [4, 3, 2, 1, 0],
                    coordinateSystem: 'polar',
                    name: 'With Round Cap',
                    roundCap: true,
                    color: 'rgba(0, 200, 0, 0.5)',
                    itemStyle: {
                        borderColor: 'green',
                        borderWidth: 1
                    }
                }],
                legend: {
                    show: true,
                    data: ['Without Round Cap', 'With Round Cap']
                }
            };

            var chart = testHelper.create(echarts, 'main1', {
                title: [
                    'Polar bar with and without round cap on rotated axis',
                    'Check the split position without round cap, which should always point to 0 when data larger than 100%'
                ],
                option: option
            });
        });
        </script>


        <script>
        require(['echarts'], function (echarts) {
            var data1 = [];
            var data2 = [];
            for (var i = 1; i <= 6; ++i) {
                data1.push(i);
                data2.push(6 - i);
            }

            var option = {
                angleAxis: {
                    max: 5,
                    show: false
                },
                radiusAxis: {
                    type: 'category',
                    data: data1,
                    z: 10,
                    show: false
                },
                polar: {
                    show: false,
                    radius: '80%'
                },
                series: [{
                    type: 'bar',
                    data: data1,
                    coordinateSystem: 'polar',
                    name: 'A',
                    roundCap: true,
                    color: 'rgba(200, 0, 0, 0.5)',
                    itemStyle: {
                        borderColor: 'red',
                        borderWidth: 1
                    }
                }, {
                    type: 'bar',
                    data: data2,
                    coordinateSystem: 'polar',
                    name: 'B',
                    roundCap: true,
                    color: 'rgba(0, 200, 0, 0.5)',
                    itemStyle: {
                        borderColor: 'green',
                        borderWidth: 1
                    }
                }],
                legend: {
                    show: true,
                    data: ['A', 'B']
                },
                tooltip: {
                    show: true
                }
            };

            var chart = testHelper.create(echarts, 'main2', {
                title: [
                    'Polar bar with round cap'
                ],
                option: option
            });
        });
        </script>


        <script>
        require(['echarts'], function (echarts) {
            var option = {
                angleAxis: {
                    max: 5
                },
                radiusAxis: {
                    type: 'category',
                    data: ['a'],
                    z: 10
                },
                polar: {
                    radius: ['25%', '60%']
                },
                series: [{
                    type: 'bar',
                    data: [0],
                    coordinateSystem: 'polar',
                    name: 'A',
                    roundCap: true,
                    color: 'rgba(200, 0, 0, 0.5)',
                    itemStyle: {
                        borderColor: 'red',
                        borderWidth: 1
                    },emphasis:{
                        itemStyle:{
                            color:'red',
                            borderColor:'blue'
                        }
                    }
                }],
                legend: {
                    show: true,
                    data: ['A']
                },
                tooltip: {
                    show: true
                }
            };

            var chart = testHelper.create(echarts, 'main3', {
                title: [
                    'Polar radius and animation test',
                    'Click button to check animation',
                    'Data add 3 by each click; data change to 1 when bigger than 10'
                ],
                option: option,
                buttons: [{
                    text: 'Change data',
                    onclick: function () {
                        if (option.series[0].data[0] > 10) {
                            option.series[0].data[0] = 1;
                        }
                        else {
                            option.series[0].data[0] += 3;
                        }
                        chart.setOption(option);
                    }
                }]
            });
        });
        </script>


        <script>
        require(['echarts'], function (echarts) {
            var option = {
                angleAxis: [{
                    type: 'value'
                }, {
                    type: 'value',
                    polarIndex: 1
                }],
                radiusAxis: [{
                    type: 'category',
                    data: ['a', 'b', 'c'],
                    z: 10
                }, {
                    type: 'category',
                    data: ['a', 'b', 'c'],
                    z: 10,
                    polarIndex: 1,
                    inverse: true
                }],
                polar: [{
                    radius: ['10%', '50%'],
                    center: ['25%', '50%']
                }, {
                    radius: ['10%', '50%'],
                    center: ['75%', '50%']
                }],
                series: [{
                    type: 'bar',
                    data: [1, 3, 2],
                    coordinateSystem: 'polar',
                    name: 'A',
                    roundCap: true,
                    polarIndex: 0
                }, {
                    type: 'bar',
                    data: [1, 3, 2],
                    coordinateSystem: 'polar',
                    name: 'A',
                    roundCap: true,
                    polarIndex: 1
                }]
            };

            var chart = testHelper.create(echarts, 'main4', {
                title: [
                    'Polar radius axis inverse tests'
                ],
                option: option
            });
        });
        </script>


        <script>
        require(['echarts'], function (echarts) {
            let hoverColors = [
                '255,0,0',
                '0,128,0',
                '0,0,255',
            ];
            let hoverIndex = 0;

            let getOptions = function(hoverIndex){
                return  {
                    angleAxis: {
                        max: 5
                    },
                    radiusAxis: {
                        type: 'category',
                        data: ['a'],
                        z: 10
                    },
                    polar: {
                        radius: ['20%', '60%']
                    },
                    series: [{
                        type: 'bar',
                        data: [4],
                        coordinateSystem: 'polar',
                        name: 'A',
                        roundCap: true,
                        animationDuration:500,
                        color: `rgba(${hoverColors[hoverIndex]},0.5)`,
                        itemStyle: {
                            borderColor: `rgb(${hoverColors[hoverIndex]})`,
                            borderWidth: 0
                        },
                        emphasis: {
                            itemStyle: {
                                color: `rgb(${hoverColors[hoverIndex]})`,
                                borderColor: `rgb(${hoverColors[hoverIndex]})`
                            }
                        }
                    }],
                    legend: {
                        show: true,
                        data: ['A']
                    },
                    tooltip: {
                        show: true
                    }
                };
            }

            var chart = testHelper.create(echarts, 'main5', {
                title: [
                    'Polar radius and value [0,\'-\',\'rational num\'] test',
                    'Click button to change hoverStyle and data value',
                ],
                option: getOptions(hoverIndex),
                buttons: [{
                    text: 'Change data',
                    onclick: function () {
                        ++hoverIndex > 2 && (hoverIndex=0)
                        let option = chart.getOption();

                        if (option.series[0].data[0] == 0) {
                            option.series[0].data[0] = 4;
                        } else if (option.series[0].data[0] == 4) {
                            option.series[0].data[0] = '-';
                        } else if (option.series[0].data[0] = '-') {
                            option.series[0].data[0] = 0;
                        }

                        option.series[0].color = `rgba(${hoverColors[hoverIndex]},0.5)`;
                        option.series[0].emphasis.itemStyle = {
                            color:`rgb(${hoverColors[hoverIndex]})`,
                            borderColor:`rgb(${hoverColors[hoverIndex]})`
                        };
                        chart.setOption(option);
                    }
                }]
            });
        });
        </script>

    </body>
</html>
