
<!--
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/esl.js"></script>
        <script src="lib/config.js"></script>
        <script src="lib/testHelper.js"></script>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
            h1 {
                line-height: 60px;
                height: 60px;
                background: #ddd;
                text-align: center;
                font-weight: bold;
                font-size: 14px;
            }
            .chart {
                height: 350px;
            }
        </style>


        <h1>define dim name in tooltip</h1>
        <div class="chart" id="dim"></div>
        <h1>change tooltip order (Tooltip of the first series should be: median, 1分位, Q3)</h1>
        <div class="chart" id="order"></div>
        <h1>define which dim on x or y. encode: {x: 2, y: 1, label: 4}</h1>
        <div class="chart" id="dimXY"></div>

        <div class="chart" id="ignoreX"></div>





        <script>

            require([
                'echarts',
                'data/security-sh-2013.json'
                // 'echarts/chart/line',
                // 'echarts/chart/candlestick',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'zrender/vml/vml'
            ], function (echarts, rawData) {

                var dom = document.getElementById('dim');
                if (!dom) {
                    return;
                }
                var chart = echarts.init(dom);

                function splitData(rawData) {
                    var categoryData = [];
                    var values = []
                    for (var i = 0; i < rawData.length; i++) {
                        categoryData.push(rawData[i].splice(0, 1)[0]);
                        values.push(rawData[i])
                    }
                    return {
                        categoryData: categoryData,
                        values: values
                    };
                }

                var data = splitData(rawData);

                chart.setOption({
                    legend: {
                        data: ['上证指数', '开盘']
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'line'
                        }
                    },
                    grid: {
                        left: '10%',
                        right: '10%',
                        bottom: '15%'
                    },
                    xAxis: {
                        type: 'category',
                        data: data.categoryData,
                        scale: true,
                        boundaryGap : false,
                        axisLine: {onZero: false},
                        splitLine: {show: false},
                        splitNumber: 20,
                        min: 'dataMin',
                        max: 'dataMax'
                    },
                    yAxis: {
                        scale: true,
                        splitArea: {
                            show: true
                        }
                    },
                    dataZoom: [
                        {
                            type: 'inside',
                            start: 50,
                            end: 100
                        },
                        {
                            show: true,
                            type: 'slider',
                            y: '90%',
                            start: 50,
                            end: 100
                        }
                    ],
                    series: [
                        {
                            name: 'line',
                            type: 'line',
                            data: (function () {
                                opens = [];
                                for (var i = 0, len = data.values.length; i < len; i++) {
                                    opens.push(data.values[i][0]);
                                }
                                return opens;
                            })(),
                            smooth: true,
                            lineStyle: {
                                normal: {color: '#aaa'}
                            }
                        },
                        {
                            name: '上证指数',
                            type: 'candlestick',
                            dimensions: ['base', '开盘', '收盘', '最高', '最低'],
                            data: data.values
                        }
                    ]
                });
            })

        </script>








        <script>

            var chart;
            var data;

            require([
                'echarts',
                // 'echarts/chart/boxplot',
                // 'echarts/chart/scatter',
                // 'echarts/component/title',
                // 'echarts/component/legend',
                // 'echarts/component/grid',
                // 'echarts/component/tooltip',
                // 'echarts/component/dataZoom'
            ], function (echarts) {

                data = [];
                for (var seriesIndex = 0; seriesIndex < 5; seriesIndex++) {
                    var seriesData = [];
                    for (var i = 0; i < 18; i++) {
                        var cate = [];
                        for (var j = 0; j < 100; j++) {
                            cate.push(Math.random() * 200);
                        }
                        seriesData.push(cate);
                    }
                    data.push(seriesData);
                }

                var option = {
                    title: [
                        {
                            text: 'Multiple Categories',
                            left: 'center',
                        }
                    ],
                    legend: {
                        top: '10%',
                        data: ['category0', 'category1', 'category2', 'category3']
                    },
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'shadow'
                        }
                    },
                    grid: {
                        left: '10%',
                        top: '20%',
                        right: '10%',
                        bottom: '15%'
                    },
                    xAxis: {
                        type: 'category',
                        data: data[0].axisData,
                        boundaryGap: true,
                        nameGap: 30,
                        splitArea: {
                            show: true
                        },
                        axisLabel: {
                            formatter: 'expr {value}'
                        },
                        splitLine: {
                            show: false
                        }
                    },
                    yAxis: {
                        type: 'value',
                        name: 'Value',
                        splitArea: {
                            show: false
                        }
                    },
                    dataZoom: [
                        {
                            type: 'inside',
                            start: 0,
                            end: 20
                        },
                        {
                            show: true,
                            height: 20,
                            type: 'slider',
                            bottom: 50,
                            xAxisIndex: [0],
                            yAxisIndex: [],
                            start: 0,
                            end: 20
                        }
                    ],
                    dataset: [{
                        source: data[0]
                    }, {
                        source: data[1]
                    }, {
                        transform: {
                            type: 'boxplot'
                        }
                    }, {
                        transform: {
                            type: 'boxplot'
                        }
                    }],
                    series: [
                        {
                            name: 'category0',
                            type: 'boxplot',
                            dimensions: [null, '最小', '1分位'],
                            encode: {
                                tooltip: [3, 2, 4]
                            },
                            datasetIndex: 2
                        },
                        {
                            name: 'category1',
                            type: 'boxplot',
                            datasetIndex: 3
                        }
                    ]
                };

                testHelper.createChart(echarts, 'order', option);
            })

        </script>








        <script>
            require([
                'echarts'
                // 'echarts/chart/scatter',
                // 'echarts/component/legend',
                // 'echarts/component/visualMap',
                // 'echarts/component/dataZoom',
                // 'zrender/vml/vml'
            ], function (echarts) {
                data = [
                    ['Blouse "Blue Viola"', 101.88, 99.75, 23, 17, 32, 18],
                    ['Dress "Daisy"', 155.8, 144.03, 18, 12, 26, 33],
                    ['Trousers "Cutesy Classic"', 203.25, 173.56, 22, 14, 20, 46],
                    ['Dress "Morning Dew"', 256.0, 120.5, 22, 16, 20, 23],
                    ['Turtleneck "Dark Chocolate"', 408.89, 294.75, 18, 22, 23, 19],
                    ['Jumper "Early Spring"', 427.36, 430.24, 23, 22, 28, 34],
                    ['Breeches "Summer Mood"', 356.0, 135.5, 12, 16, 23, 31],
                    ['Dress "Mauve Chamomile"', 406.0, 95.5, 22, 16, 40, 23],
                    ['Dress "Flying Tits"', 527.36, 503.24, 15, 22, 42, 24],
                    ['Dress "Singing Nightingales"', 587.36, 543.24, 25, 12, 28, 37],
                    ['Sundress "Cloudy weather"', 603.36, 407.24, 15, 12, 22, 24],
                    ['Sundress "East motives"', 633.36, 477.24, 32, 10, 39, 19],
                    ['Sweater "Cold morning"', 517.36, 437.24, 21, 17, 29, 48],
                    ['Trousers "Lavender Fields"', 443.36, 387.24, 17, 26, 31, 41],
                    ['Jumper "Coffee with Milk"', 543.36, 307.24, 19, 10, 34, 31],
                    ['Blouse "Blooming Cactus"', 790.36, 277.24, 23, 18, 26, 28],
                    ['Sweater "Fluffy Comfort"', 790.34, 678.34, 18, 12, 28, 34]
                ];

                var encode = {
                    x: 0,
                    y: [1, 2]
                };

                var option = {
                    tooltip: {
                        axisPointer: {
                            type: 'cross'
                        }
                    },
                    dataZoom: [{
                        type: 'slider',
                        start: 50,
                        end: 70
                    }, {
                        type: 'inside',
                        start: 50,
                        end: 70
                    }],
                    xAxis: {},
                    yAxis: {},
                    series: [{
                        type: 'scatter',
                        data: data,
                        encode: {
                            x: 2,
                            y: 1,
                            label: 4
                        },
                        itemStyle: {
                            normal: {
                                color: '#77bef7'
                            }
                        },
                        label: {
                            normal: {
                                show: true,
                                position: 'top',
                                textStyle: {
                                    color: '#333'
                                }
                            }
                        }
                    }]
                };

                testHelper.createChart(echarts, 'dimXY', option);
            });
        </script>






        <script>

            var chart;
            var myChart;
            var option;

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

                var option = {
                    title: {
                        text: 'deafault (filter)'
                    },
                    xAxis: {},
                    yAxis: {},
                    dataZoom: [{
                        type: 'inside',
                        xAxisIndex: 0
                    }, {
                        type: 'slider',
                        xAxisIndex: 0
                    }, {
                        type: 'inside',
                        yAxisIndex: 0
                    }, {
                        type: 'slider',
                        yAxisIndex: 0
                    }],
                    series: [{
                        type: 'custom',
                        renderItem: function (params, api) {
                            var y = api.coord([0, api.value(0)])[1];
                            var x = 100;
                            return {
                                type: 'circle',
                                shape: {
                                    cx: x,
                                    cy: y,
                                    r: 30
                                },
                                style: {
                                    fill: 'blue'
                                }
                            };
                        },
                        encode: {
                            x: -1,
                            y: 0
                        },
                        data: [
                            [122, null],
                            [333, null]
                        ]
                    }, {
                        type: 'scatter',
                        data: [[21, 43], [55, 66]]
                    }]
                };

                chart = myChart = testHelper.create(echarts, 'ignoreX', {
                    option: option,
                    title: [
                        'series not controlled by xAxis but only by yAxis',
                        'x axis can not filter blue circle, but y axis can do'
                    ],
                    info: option.series[0].encode,
                    buttons: [{
                        text: 'filterMode: weakFitler',
                        onclick: function () {
                            option.dataZoom[0].filterMode = option.dataZoom[1].filterMode = 'weakFilter';
                            option.title.text = 'filterMode: weakFilter';
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'filterMode: deafault (filter)',
                        onclick: function () {
                            option.dataZoom[0].filterMode = option.dataZoom[1].filterMode = void 0;
                            option.title.text = 'deafault (filter)'
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'filterMode: empty',
                        onclick: function () {
                            option.dataZoom[0].filterMode = option.dataZoom[1].filterMode = 'empty';
                            option.title.text = 'filterMode: empty';
                            chart.setOption(option, true);
                        }
                    }, {
                        text: 'filterMode: none',
                        onclick: function () {
                            option.dataZoom[0].filterMode = option.dataZoom[1].filterMode = 'none'
                            option.title.text = 'filterMode: none';
                            chart.setOption(option, true);
                        }
                    }]
                });
            });

        </script>






    </body>
</html>