
<!--
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/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.js'
            ], 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'
            ], 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'
            ], 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>