
<!--
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="lib/jquery.min.js"></script>
        <script src="lib/facePrint.js"></script>
        <script src="lib/testHelper.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #146402;
                text-align: center;
                font-weight: bold;
                color: #eee;
                font-size: 14px;
            }
            .chart {
                height: 600px;
            }
        </style>

        <div id="main" class="chart"></div>
        <script>

        require(
            ['echarts'],
            function (echarts) {

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

                var xAxisData = [];
                var data1 = [];
                var data2 = [];
                var data3 = [];
                var data4 = [];

                for (var i = 0; i < 5; i++) {
                    xAxisData.push('类目' + i);
                    data1.push((Math.random() * 5).toFixed(2));
                    data2.push(-Math.random().toFixed(2));
                    data3.push((Math.random() + 0.5).toFixed(2));
                    data4.push((Math.random() + 0.3).toFixed(2));
                }

                var itemStyle = {
                    normal: {
                        barBorderRadius: 5,
                        label: {
                            show: true,
                            position: 'outside'
                        }
                    },
                    emphasis: {
                        label: {
                            position: 'outside'
                        },
                        barBorderColor: '#fff',
                        barBorderWidth: 1,
                        shadowBlur: 10,
                        shadowOffsetX: 0,
                        shadowOffsetY: 0,
                        shadowColor: 'rgba(0,0,0,0.5)'
                    }
                };

                chart.setOption({
                    backgroundColor: '#eee',
                    animationDurationUpdate: 1000,
                    legend: {
                        left: 0,
                        inactiveColor: '#abc',
                        borderWidth: 1,
                        itemWidth: 35,
                        itemHeight: 30,
                        data: [{
                            name: 'bar'
                        }, 'bar2', 'bar3', 'bar4'],
                        selected: {
                            // 'bar': false
                        },
                        // orient: 'vertical',
                        // x: 'right',
                        // y: 'bottom',
                        align: 'left',

                        tooltip: {
                            show: true
                        }
                    },
                    // brush: {
                    //     xAxisIndex: 0
                    // },
                    // // toolbox: {
                    // //     top: 25,
                    // //     // right: 20,
                    // //     feature: {
                    // //         magicType: {
                    // //             type: ['line', 'bar', 'stack', 'tiled']
                    // //         },
                    // //         dataView: {},
                    // //         saveAsImage: {
                    // //             pixelRatio: 2
                    // //         },
                    // //         brush: {
                    // //             type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear']
                    // //         },
                    // //         restore: {},
                    // //         dataZoom: {},
                    // //         myTool1: {
                    // //             show: true,
                    // //             title: '自定义扩展方法1',
                    // //             icon: 'path://M432.45,595.444c0,2.177-4.661,6.82-11.305,6.82c-6.475,0-11.306-4.567-11.306-6.82s4.852-6.812,11.306-6.812C427.841,588.632,432.452,593.191,432.45,595.444L432.45,595.444z M421.155,589.876c-3.009,0-5.448,2.495-5.448,5.572s2.439,5.572,5.448,5.572c3.01,0,5.449-2.495,5.449-5.572C426.604,592.371,424.165,589.876,421.155,589.876L421.155,589.876z M421.146,591.891c-1.916,0-3.47,1.589-3.47,3.549c0,1.959,1.554,3.548,3.47,3.548s3.469-1.589,3.469-3.548C424.614,593.479,423.062,591.891,421.146,591.891L421.146,591.891zM421.146,591.891',
                    // //             onclick: function (){
                    // //                 alert('myToolHandler1')
                    // //             }
                    // //         },
                    // //         myTool2: {
                    // //             show: true,
                    // //             title: '自定义扩展方法2',
                    // //             icon: 'image://asset/echarts-logo.png',
                    // //             onclick: function (){
                    // //                 alert('myToolHandler2')
                    // //             }
                    // //         }
                    // //     },

                    //     iconStyle: {
                    //         emphasis: {
                    //             textPosition: 'top'
                    //             // textAlign: 'right'
                    //         }
                    //     }
                    // },
                    tooltip: {},
                    grid: {
                        top: 50
                    },
                    xAxis: {
                        data: xAxisData,
                        name: '横轴',
                        silent: false,
                        axisTick: {
                            alignWithLabel: true
                        },
                        // axisLabel: {
                        //     show: false
                        // },
                        // axisTick: {
                        //     show: false
                        // },
                        axisLine: {
                            onZero: true
                        },
                        splitLine: {
                            show: true
                        },
                        splitArea: {
                            show: true
                        }
                    },
                    yAxis: {
                        inverse: true,
                        // axisLabel: {
                        //     show: false
                        // },
                        axisTick: {
                            show: false
                        },
                        // splitLine: {
                        //     show: false
                        // },
                        splitArea: {
                            show: false
                        }
                    },
                    series: [{
                        name: 'bar',
                        type: 'bar',
                        stack: 'one',
                        itemStyle: itemStyle,
                        cursor: 'move',
                        data: data1
                    }, {
                        name: 'bar2',
                        type: 'bar',
                        stack: 'one',
                        itemStyle: itemStyle,
                        cursor: 'default',
                        data: data2
                    // }, {
                    //     name: 'bar3',
                    //     type: 'bar',
                    //     stack: 'two',
                    //     itemStyle: itemStyle,
                    //     data: data3
                    // }, {
                    //     name: 'bar4',
                    //     type: 'bar',
                    //     stack: 'two',
                    //     itemStyle: itemStyle,
                    //     data: data4
                    }]
                });

                chart.on('click', function (params) {
                    console.log(params);
                });

                // chart.on('legendselectchanged', function (params) {
                //     chart.setOption({
                //         // title: {
                //         // },
                //         graphic: [{
                //             type: 'circle',
                //             shape: {
                //                 cx: 100,
                //                 cy: 100,
                //                 r: 20,
                //             }
                //         }]
                //     });
                // });

                window.onresize = chart.resize;
            }
        );
        </script>
    </body>
</html>