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


        <h1>time axis default | data zoom | animation auto: zoom in has animation, zoom out no animation</h1>
        <div class="chart" id="time-animation"></div>
        <h1>category axis default | data zoom | animation auto: zoom in has animation, zoom out no animation</h1>
        <div class="chart" id="category-animation"></div>
        <h1>time axis cross | x snap | label show | tooltip show</h1>
        <div class="chart" id="time-cross"></div>
        <h1>axis label too long | x axis label rotate | label should not overflow ec container</h1>
        <div class="chart" id="label-rotate"></div>
        <h1>two value axes | snap | grid.tooltip setting | snap has animation </h1>
        <div class="chart" id="two-value-axes"></div>
        <h1>label style and formatter</h1>
        <div class="chart" id="label-style"></div>
        <h1>dual yAxes | label color auto : the same as axisline</h1>
        <div class="chart" id="dual-yAxes"></div>
        <h1>dual xAxes | label color auto : the same as axisline</h1>
        <div class="chart" id="dual-xAxes"></div>
        <h1>y is category</h1>
        <div class="chart" id="y-is-category"></div>
        <h1>value axis as base | y axis should not trigger tooltip | tooltip.trigger: 'none' so item tooltip will not be triggered</h1>
        <div class="chart" id="value-axis-as-base"></div>
        <h1>polar category</h1>
        <div class="chart" id="polar-category"></div>
        <h1>multiple points with the same axis value | when not snap tooltip should be correct</h1>
        <div class="chart" id="same-value"></div>
        <h1>no tooltip</h1>
        <div class="chart" id="no-tooltip"></div>
        <h1>axisPointer.type: 'none', but label.show: true</h1>
        <div class="chart" id="none"></div>
        <h1>tooltip.axisPointer.label.show: fasle</h1>
        <div class="chart" id="tooltip.axisPointer.label.show: fasle"></div>


        <script>

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

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    },
                    dataZoom: [{
                        type: 'inside'
                    }, {
                        type: 'slider'
                    }]
                };
                var baseTop = 90;
                var height = 250;
                var gap = 30;
                makeTimeGrid(option, {
                    grid: {left: 100, top: baseTop, height: height}
                });
                baseTop += height + gap;

                createChart('time-animation', echarts, option, baseTop + 40);
            })

        </script>











        <script>

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

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'shadow'
                        }
                    },
                    dataZoom: [{
                        type: 'inside',
                        start: 40,
                        end: 60
                    }, {
                        type: 'slider',
                        start: 40,
                        end: 60
                    }]
                };
                var baseTop = 90;
                var height = 250;
                var gap = 30;
                makeCategoryGrid(option, {
                    grid: {left: 100, top: baseTop, height: height},
                    xAxis: {boundaryGap: true}
                }, false, 100, 'bar');
                baseTop += height + gap;

                createChart('category-animation', echarts, option, baseTop + 40);
            })

        </script>






        <script>

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

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {type: 'cross'}
                    }
                };
                var baseTop = 90;
                var height = 250;
                var gap = 50;
                makeTimeGrid(option, {
                    grid: {left: 100, top: baseTop, height: height},
                    yAxis: {
                        axisTick: {
                            inside: true
                        },
                        axisLabel: {
                            inside: true
                        }
                    }
                });
                baseTop += height + gap;

                createChart('time-cross', echarts, option, baseTop + 100);
            })

        </script>








        <script>

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

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {type: 'cross'}
                    }
                };
                var baseTop = 90;
                makeCategoryGrid(option, {
                    grid: {
                        containLabel: true, left: 5, right: 10, top: baseTop, height: 140
                    },
                    xAxis: {
                        axisLabel: {
                            rotate: 30,
                            formatter: function (value) {
                                return echarts.format.truncateText(value, 50);
                            }
                        }
                    }
                }, null, null, null, 'toolonglonglonglonglonglonglong');

                createChart('label-rotate', echarts, option, baseTop + 200);
            })

        </script>









        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'none'
                    }
                };
                var baseTop = 90;
                var height = 250;
                var gap = 50;
                makeValueGrid(option, {
                    grid: {
                        top: baseTop, height: height,
                        tooltip: {
                            trigger: 'axis',
                            axisPointer: {
                                type: 'cross'
                            }
                        }
                    },
                    yAxis: {name: 'tooltip.trigger: "axis"\nso base axis snap and animate by default'}
                }, true);
                baseTop += height + gap;
                makeValueGrid(option, {
                    grid: {
                        top: baseTop, height: height
                    },
                    xAxis: {
                        axisPointer: {
                            show: true,
                            snap: true,
                            triggerTooltip: true
                        }
                    },
                    yAxis: {
                        name: 'both axes snap\nand so animate by default',
                        axisPointer: {
                            show: true,
                            snap: true,
                            triggerTooltip: true
                        }
                    }
                }, true);
                baseTop += height + gap;

                var dom = document.getElementById('two-value-axes');
                if (dom) {
                    dom.style.height = baseTop + 'px';
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>












        <script>

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

                var option = {
                    axisPointer: {
                        label: {
                            backgroundColor: 'blue',
                            borderColor: 'green',
                            borderRadius: 5,
                            borderWidth: 2,
                            shadowBlur: 6,
                            shadowOffsetX: 3,
                            shadowOffsetY: 3,
                            shadowColor: '#000'
                        }
                    }
                };
                var baseTop = 90;
                var height = 150;
                var gap = 50;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    xAxis: {
                        axisPointer: {show: true}
                    },
                    yAxis: {name: 'global style: \nbg: "blue", border: "green", shadow, borderRadius'}
                });
                baseTop += height + gap;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    xAxis: {
                        axisPointer: {
                            show: true,
                            label: {
                                backgroundColor: 'red',
                                borderWidth: 0
                            }
                        }
                    },
                    yAxis: {name: 'xAxis style: \nbg: "red", borderWidth: 0'}
                });
                baseTop += height + gap;
                makeCategoryGrid(option, {
                    grid: {
                        top: baseTop,
                        height: height
                    },
                    xAxis: {
                        position: 'top',
                        axisPointer: {
                            show: true,
                            label: {
                                show: true,
                                formatter: '类别 {value} %'
                            }
                        }
                    },
                    yAxis: {name: 'axisLabel formatter string'}
                });
                baseTop += height + gap;
                makeCategoryGrid(option, {
                    grid: {
                        top: baseTop,
                        height: height
                    },
                    xAxis: {
                        axisPointer: {
                            show: true,
                            label: {
                                show: true,
                                formatter: function(params) {
                                    return 'x: ' + params.value + '\n'
                                        + echarts.util.map(params.seriesData, function (item) {
                                            return item.name + ': ' + item.value;
                                        }).join('\n')
                                }
                            }
                        }
                    },
                    yAxis: {name: 'axisLabel formatter function'}
                });
                baseTop += height + gap + 20;

                var dom = document.getElementById('label-style');
                if (dom) {
                    dom.style.height = baseTop + 'px';
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })
        </script>








        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'cross',
                            label: {
                                formatter: function (params) {
                                    console.log(params);
                                    return 'asdfa';
                                }
                            }
                        }
                    }
                };
                makeCategoryCartesian(option, {
                }, 0, 0);
                makeCategoryCartesian(option, {
                }, 0, 1, 17);
                makeCategoryCartesian(option, {
                    yAxis: {
                        offset: 50
                    }
                }, 0, 2, 117);
                makeCategoryCartesian(option, {
                    yAxis: {
                        position: 'left',
                        offset: 50
                    }
                }, 0, 3, 1117);

                var dom = document.getElementById('dual-yAxes');
                if (dom) {
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>











        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'cross'
                        }
                    }
                };
                makeCategoryCartesian(option, {
                    xAxis: {
                        axisPointer: {
                            type: 'shadow'
                        }
                    }
                }, 0, 0);
                makeCategoryCartesian(option, {
                    xAxis: {
                        axisPointer: {
                            type: 'shadow'
                        }
                    }
                }, 1, 0, 17, 'last');

                var dom = document.getElementById('dual-xAxes');
                if (dom) {
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>












        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis'
                    }
                };
                var baseTop = 90;
                var height = 150;
                var gap = 50;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    xAxis: {
                        axisPointer: {
                            show: true,
                            triggerTooltip: false
                        }
                    }
                }, true);
                baseTop += height + gap;

                var dom = document.getElementById('y-is-category');
                if (dom) {
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>








        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'none'
                    }
                };
                var baseTop = 90;
                var height = 150;
                var gap = 50;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    xAxis: {
                        axisPointer: {
                            show: true
                        }
                    },
                    yAxis: {
                        axisPointer: {
                            show: true,
                            triggerTooltip: false,
                            animation: true
                        }
                    }
                }, true);
                baseTop += height + gap;

                var dom = document.getElementById('value-axis-as-base');
                if (dom) {
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>











        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {type: 'cross'}
                    }
                };
                var baseTop = 90;
                var height = 250;
                var gap = 50;
                makeCategoryPolar(option, {
                    polar: {
                        center: ['25%', baseTop + height / 2],
                        radius: 120
                    }
                }, true);
                makeCategoryPolar(option, {
                    polar: {
                        center: ['75%', baseTop + height / 2],
                        radius: 120
                    },
                    angleAxis: {
                        axisPointer: {
                            type: 'shadow'
                        }
                    }
                }, true);
                baseTop += height + gap;
                makeCategoryPolar(option, {
                    polar: {
                        center: ['25%', baseTop + height / 2],
                        radius: 120
                    }
                });
                makeCategoryPolar(option, {
                    polar: {
                        center: ['75%', baseTop + height / 2],
                        radius: 120
                    },
                    radiusAxis: {
                        axisPointer: {
                            type: 'shadow'
                        }
                    }
                });
                baseTop += height + gap;

                createChart('polar-category', echarts, option, baseTop);
            })

        </script>











        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'cross'
                        }
                    },
                    xAxis: [{
                        nameLocation: 'middle',
                        nameGap: 30,
                        name: 'snap: show display both value'
                    }, {
                        gridIndex: 1,
                        nameLocation: 'middle',
                        nameGap: 30,
                        name: 'not snap: put axis on the middle of the two points, should display only one value.'
                    }, {
                        gridIndex: 2,
                        nameLocation: 'middle',
                        nameGap: 30,
                        name: 'step line not snap: should tooltip correct.',
                        axisPointer: {
                            snap: false
                        }
                    }],
                    yAxis: [{}, {gridIndex: 1}, {gridIndex: 2}],
                    grid: [{
                        top: 10,
                        height: 100
                    }, {
                        top: 200,
                        height: 100
                    }, {
                        top: 400,
                        height: 200
                    }],
                    series: [{
                        type: 'line',
                        data: [[10, 10], [10, 20], [20, 20]]
                    }, {
                        type: 'line',
                        xAxisIndex: 1,
                        yAxisIndex: 1,
                        data: [[10, 10], [30, 10]]
                    }, {
                        xAxisIndex: 2,
                        yAxisIndex: 2,
                        name:'Step Start',
                        type:'line',
                        step: 'start',
                        data: echarts.util.map([120, 132, 101, 134, 90, 230, 210], function (value, index) {
                            return [index * 100, value];
                        })
                    }, {
                        xAxisIndex: 2,
                        yAxisIndex: 2,
                        name:'Step Middle',
                        type:'line',
                        step: 'middle',
                        data: echarts.util.map([220, 282, 201, 234, 290, 430, 410], function (value, index) {
                            return [index * 100, value];
                        })
                    }, {
                        xAxisIndex: 2,
                        yAxisIndex: 2,
                        name:'Step End',
                        type:'line',
                        step: 'end',
                        data: echarts.util.map([450, 432, 401, 454, 590, 530, 510], function (value, index) {
                            return [index * 100, value];
                        })
                    }]
                };

                createChart('same-value', echarts, option, 700);
            })

        </script>











        <script>

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

                var option = {
                };
                var baseTop = 90;
                var height = 150;
                var gap = 50;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    yAxis: {name: 'axisPointer: not show by default'}
                });
                baseTop += height + gap;
                makeCategoryGrid(option, {
                    grid: {top: baseTop, height: height},
                    xAxis: {axisPointer: {show: true}},
                    yAxis: {name: 'axisPointer: show if specified'}
                });
                baseTop += height + gap;

                var dom = document.getElementById('no-tooltip');
                if (dom) {
                    dom.style.height = baseTop + 'px';
                    var chart = echarts.init(dom);
                    chart.setOption(option);
                }
            })

        </script>













        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {type: 'none', label: {show: true}}
                    }
                };
                var baseTop = 90;
                var height = 250;
                var gap = 50;
                makeCategoryPolar(option, {
                    polar: {
                        center: ['25%', baseTop + height / 2],
                        radius: 120
                    }
                }, true);
                makeCategoryGrid(option, {
                    grid: {left: '50%', top: baseTop, height: height},
                    xAxis: {boundaryGap: true}
                }, false, 100, 'bar');
                baseTop += height + gap;

                option.singleAxis = {
                    axisTick: {},
                    axisLabel: {},
                    top: baseTop,
                    height: height,
                    bottom: 10,
                    type: 'time'
                };
                option.series.push({
                    type: 'themeRiver',
                    itemStyle: {
                        emphasis: {
                            shadowBlur: 20,
                            shadowColor: 'rgba(0, 0, 0, 0.8)'
                        }
                    },
                    data: [['2015/11/08',10,'DQ'],['2015/11/09',15,'DQ'],['2015/11/10',35,'DQ'],
                    // ['2015/11/11',38,'DQ'],['2015/11/12',22,'DQ'],['2015/11/13',16,'DQ'],
                    ['2015/11/14',7,'DQ'],['2015/11/15',2,'DQ'],['2015/11/16',17,'DQ'],
                    ['2015/11/17',33,'DQ'],['2015/11/18',40,'DQ'],['2015/11/19',32,'DQ'],
                    ['2015/11/20',26,'DQ'],['2015/11/21',35,'DQ'],['2015/11/22',40,'DQ'],
                    ['2015/11/23',32,'DQ'],['2015/11/24',26,'DQ'],['2015/11/25',22,'DQ'],
                    // ['2015/11/26',16,'DQ'],['2015/11/27',22,'DQ'],['2015/11/28',10,'DQ'],
                    ['2015/11/08',35,'TY'],['2015/11/09',36,'TY'],['2015/11/10',37,'TY'],
                    ['2015/11/11',22,'TY'],['2015/11/12',24,'TY'],['2015/11/13',26,'TY'],
                    ['2015/11/14',34,'TY'],['2015/11/15',21,'TY'],['2015/11/16',18,'TY'],
                    ['2015/11/17',45,'TY'],['2015/11/18',32,'TY'],['2015/11/19',35,'TY'],
                    ['2015/11/20',30,'TY'],['2015/11/21',28,'TY'],['2015/11/22',27,'TY'],
                    ['2015/11/23',26,'TY'],['2015/11/24',15,'TY'],['2015/11/25',30,'TY'],
                    ['2015/11/26',35,'TY'],['2015/11/27',42,'TY'],['2015/11/28',42,'TY'],
                    ['2015/11/08',21,'SS'],['2015/11/09',25,'SS'],['2015/11/10',27,'SS'],
                    ['2015/11/11',23,'SS'],['2015/11/12',24,'SS'],['2015/11/13',21,'SS'],
                    ['2015/11/14',35,'SS'],['2015/11/15',39,'SS'],['2015/11/16',40,'SS'],
                    ['2015/11/17',36,'SS'],['2015/11/18',33,'SS'],['2015/11/19',43,'SS'],
                    ['2015/11/20',40,'SS'],['2015/11/21',34,'SS'],['2015/11/22',28,'SS'],
                    // ['2015/11/23',26,'SS'],['2015/11/24',37,'SS'],['2015/11/25',41,'SS'],
                    // ['2015/11/26',46,'SS'],['2015/11/27',47,'SS'],['2015/11/28',41,'SS'],
                    // ['2015/11/08',10,'QG'],['2015/11/09',15,'QG'],['2015/11/10',35,'QG'],
                    // ['2015/11/11',38,'QG'],['2015/11/12',22,'QG'],['2015/11/13',16,'QG'],
                    ['2015/11/14',7,'QG'],['2015/11/15',2,'QG'],['2015/11/16',17,'QG'],
                    ['2015/11/17',33,'QG'],['2015/11/18',40,'QG'],['2015/11/19',32,'QG'],
                    ['2015/11/20',26,'QG'],['2015/11/21',35,'QG'],['2015/11/22',40,'QG'],
                    ['2015/11/23',32,'QG'],['2015/11/24',26,'QG'],['2015/11/25',22,'QG'],
                    ['2015/11/26',16,'QG'],['2015/11/27',22,'QG'],['2015/11/28',10,'QG'],
                    ['2015/11/08',10,'SY'],['2015/11/09',15,'SY'],['2015/11/10',35,'SY'],
                    ['2015/11/11',38,'SY'],['2015/11/12',22,'SY'],['2015/11/13',16,'SY'],
                    ['2015/11/14',7,'SY'],['2015/11/15',2,'SY'],['2015/11/16',17,'SY'],
                    ['2015/11/17',33,'SY'],['2015/11/18',40,'SY'],['2015/11/19',32,'SY'],
                    ['2015/11/20',26,'SY'],['2015/11/21',35,'SY'],['2015/11/22',4,'SY'],
                    ['2015/11/23',32,'SY'],['2015/11/24',26,'SY'],['2015/11/25',22,'SY'],
                    ['2015/11/26',16,'SY'],['2015/11/27',22,'SY'],['2015/11/28',10,'SY'],
                    ['2015/11/08',10,'DD'],['2015/11/09',15,'DD'],['2015/11/10',35,'DD'],
                    ['2015/11/11',38,'DD'],['2015/11/12',22,'DD'],['2015/11/13',16,'DD'],
                    ['2015/11/14',7,'DD'],['2015/11/15',2,'DD'],['2015/11/16',17,'DD'],
                    ['2015/11/17',33,'DD'],['2015/11/18',4,'DD'],['2015/11/19',32,'DD'],
                    ['2015/11/20',26,'DD'],['2015/11/21',35,'DD'],['2015/11/22',40,'DD'],
                    ['2015/11/23',32,'DD'],['2015/11/24',26,'DD'],['2015/11/25',22,'DD'],
                    ['2015/11/26',16,'DD'],['2015/11/27',22,'DD'],['2015/11/28',10,'DD']]
                });
                baseTop += height + gap;

                createChart('none', echarts, option, baseTop);
            })

        </script>









        <script>
            require(['echarts'], function (echarts) {

                var option = {
                    tooltip: {
                        trigger: 'axis',
                        axisPointer: {
                            type: 'cross',
                            label: {
                                show: false
                            }
                        }
                    },
                    xAxis: {type: 'category'},
                    yAxis: {},
                    series: {
                        type: 'scatter',
                        data: [
                            ['2015/11/08',10,'DQ'],['2015/11/09',15,'DQ'],['2015/11/10',35,'DQ'],
                            ['2015/11/14',7,'DQ'],['2015/11/15',2,'DQ'],['2015/11/16',17,'DQ'],
                            ['2015/11/17',33,'DQ'],['2015/11/18',40,'DQ'],['2015/11/19',32,'DQ'],
                            ['2015/11/20',26,'DQ'],['2015/11/21',35,'DQ'],['2015/11/22',40,'DQ'],
                            ['2015/11/23',32,'DQ'],['2015/11/24',26,'DQ'],['2015/11/25',22,'DQ'],
                            // ['2015/11/26',16,'DQ'],['2015/11/27',22,'DQ'],['2015/11/28',10,'DQ'],
                            ['2015/11/08',35,'TY'],['2015/11/09',36,'TY'],['2015/11/10',37,'TY'],
                            ['2015/11/11',22,'TY'],['2015/11/12',24,'TY'],['2015/11/13',26,'TY'],
                            ['2015/11/14',34,'TY'],['2015/11/15',21,'TY'],['2015/11/16',18,'TY'],
                            ['2015/11/17',45,'TY'],['2015/11/18',32,'TY'],['2015/11/19',35,'TY'],
                            ['2015/11/20',30,'TY'],['2015/11/21',28,'TY'],['2015/11/22',27,'TY']
                        ]
                    }
                };

                createChart('tooltip.axisPointer.label.show: fasle', echarts, option);
            })

        </script>



    </body>
</html>