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

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

        <script>
            require([
                'echarts'
            ], function (echarts) {
                const data = [
                    ["2021-03-03T15:30:00.000Z", 48.1],
                    ["2021-03-03T15:45:00.000Z", 47.9],
                    ["2021-03-03T16:00:00.000Z", 47.7],
                    ["2021-03-03T16:15:00.000Z", 47.6],
                    ["2021-03-03T16:30:00.000Z", 47.8],
                    ["2021-03-03T16:45:00.000Z", 48.2],
                    ["2021-03-03T17:00:00.000Z", 48.3],
                    ["2021-03-03T17:45:00.000Z", 48.3],
                    ["2021-03-03T18:00:00.000Z", 48.3],
                    ["2021-03-03T18:15:00.000Z", 48.6],
                    ["2021-03-03T18:30:00.000Z", 48.3],
                    ["2021-03-03T18:45:00.000Z", 48.3],
                    ["2021-03-03T19:00:00.000Z", 48.8],
                    ["2021-03-03T19:15:00.000Z", 48.3],
                    ["2021-03-03T19:30:00.000Z", 48.3],
                    ["2021-03-03T19:45:00.000Z", 48.3],
                    ["2021-03-03T20:00:00.000Z", 48.3],
                    ["2021-03-03T20:15:00.000Z", 48.3],
                    ["2021-03-03T20:30:00.000Z", 48.3],
                    ["2021-03-03T20:45:00.000Z", 48.7],
                    ["2021-03-03T21:00:00.000Z", 46.3],
                    ["2021-03-03T21:15:00.000Z", 42.3],
                    ["2021-03-03T21:30:00.000Z", 44.3],
                    ["2021-03-03T21:45:00.000Z", 48.9],
                    ["2021-03-03T22:00:00.000Z", 48.1],
                    ["2021-03-03T22:15:00.000Z", 48.3],
                    ["2021-03-03T22:30:00.000Z", 49.7],
                    ["2021-03-03T22:45:00.000Z", 49.1],
                    ["2021-03-03T23:00:00.000Z", 48.3],
                    ["2021-03-03T23:15:00.000Z", 46.8],
                    ["2021-03-03T23:30:00.000Z", 48.3],
                    ["2021-03-03T23:45:00.000Z", null],
                    ["2021-03-04T00:00:00.000Z", 48.3],
                    ["2021-03-04T00:15:00.000Z", 51],
                    ["2021-03-04T00:30:00.000Z", 51.5],
                    ["2021-03-04T00:45:00.000Z", 51.9],
                    ["2021-03-04T01:00:00.000Z", 52.4],
                    ["2021-03-04T01:15:00.000Z", 52.7],
                    ["2021-03-04T01:30:00.000Z", 52.9],
                    ["2021-03-04T01:45:00.000Z", 53],
                    ["2021-03-04T02:00:00.000Z", 53.2],
                    ["2021-03-04T02:15:00.000Z", 53.3],
                    ["2021-03-04T05:15:00.000Z", null],
                    ["2021-03-04T02:30:00.000Z", null],
                    ["2021-03-04T02:45:00.000Z", null],
                    ["2021-03-04T03:00:00.000Z", null],
                    ["2021-03-04T03:15:00.000Z", null],
                    ["2021-03-04T03:30:00.000Z", null],
                    ["2021-03-04T03:45:00.000Z", null],
                    ["2021-03-04T04:00:00.000Z", null],
                    ["2021-03-04T04:15:00.000Z", null],
                    ["2021-03-04T04:30:00.000Z", null],
                    ["2021-03-04T04:45:00.000Z", null],
                    ["2021-03-04T05:00:00.000Z", null],
                    ["2021-03-04T05:15:00.000Z", null],
                    ["2021-03-04T05:30:00.000Z", null],
                    ["2021-03-04T05:45:00.000Z", 53.3],
                    ["2021-03-04T06:00:00.000Z", 53.3],
                    ["2021-03-04T06:15:00.000Z", 53.5],
                    ["2021-03-04T06:30:00.000Z", 53.6],
                    ["2021-03-04T06:45:00.000Z", 53.7],
                    ["2021-03-04T07:00:00.000Z", 53.7],
                    ["2021-03-04T07:15:00.000Z", 53.7],
                    ["2021-03-04T07:30:00.000Z", 53.7],
                    ["2021-03-04T07:45:00.000Z", 53.6],
                    ["2021-03-04T08:00:00.000Z", 53.5],
                    ["2021-03-04T08:15:00.000Z", 53.4],
                    ["2021-03-04T08:30:00.000Z", 53.1],
                    ["2021-03-04T08:45:00.000Z", 52.8],
                    ["2021-03-04T09:00:00.000Z", 52.5]
                ];
                const start = new Date('2021-03-04T09:15:00.000Z');
                for (let i = 0; i < 1560; i++) {
                    const date = new Date(start.getTime() + i * 15 * 60 * 1000);
                    const value = 40 + Number((Math.random() * (3 + Math.ceil(i / 100))).toFixed(1));
                    data.push([date.toISOString(), value]);
                }

                const option = {
                    title: { text: "Data" },
                    tooltip: { trigger: "axis", axisPointer: { animation: true } },
                    legend: {
                        data: ["relative humidity"],
                    },
                    dataZoom: [
                        { realtime: true, xAxisIndex: [0, 1], filterMode: "weakFilter", id: 'dz-s' },
                        { type: "inside", realtime: true, xAxisIndex: [0, 1] },
                    ],
                    toolbox: { feature: { saveAsImage: {}, restore: {} } },
                    xAxis: {
                        min: '2021-03-03T15:00:00.000Z',
                        type: "time"
                    },
                    yAxis: [
                        {
                            type: "value",
                            position: "left",
                            name: "%",
                            min: 0,
                            max: 100,
                            _medium: "relative humidity"
                        },
                    ],
                    series: [
                        {
                            name: "relative humidity",
                            type: "line",
                            step: "start",
                            showSymbol: false,
                            yAxisIndex: 0,
                            sampling: "lttb",
                            connectNulls: false,
                            data: data
                        },
                    ],
                };

                var chart = testHelper.create(echarts, 'main0', {
                    title: [
                        'Sampling with lttb, test **connectNulls**',
                        'NaN point should not be filtered, toggle connectNulls value, compare it.',
                    ],
                    option,
                    width: 600,
                    height: 300,
                    buttons: [
                        {
                            text: 'find null series',
                            onclick: function () {
                                chart.dispatchAction({
                                    type: 'dataZoom',
                                    batch: [
                                        {id: 'dz-s', start: 0, end: 10}
                                    ]
                                });
                            }
                        },
                        {
                            text: 'toggle connectNulls value',
                            onclick: function () {
                                const flag = option.series[0].connectNulls;
                                option.series[0].connectNulls = !flag;
                                chart.setOption(option);
                            }
                        },
                        {
                            text: 'switch sampling between lttb and none',
                            onclick: function () {
                                const sampling = option.series[0].sampling;
                                option.series[0].sampling = sampling === 'lttb' ? 'none' : 'lttb';
                                console.log('current setting:', option.series[0].sampling);
                                chart.setOption(option);
                            }
                        }
                    ]
                });
            });
        </script>

        <script>
            require([
                'echarts'
            ], function (echarts) {
                const data = [];
                let operator = 1;
                let value = 50;
                const start = new Date('2021-03-03T15:30:00.000Z');
                for (let i = 0; i < 1950; i++) {
                    if (i % 100 === 0) {
                        operator = Math.random() > 0.5 ? 1 : -1;
                    }
                    const date = new Date(start.getTime() + i * 15 * 60 * 1000);
                    if (i < 639 || i > 943) {
                        value += operator * Number((Math.random() * 2 - 1));
                        value = Math.max(Math.min(100, value), 0);
                        data.push([date.toISOString(), value.toFixed(1)]);
                    }
                    else if (i === 934) {
                        data.push([date.toISOString(), null]);
                    }
                }

                const option = {
                    title: { text: "Data" },
                    tooltip: { trigger: "axis", axisPointer: { animation: true } },
                    legend: {
                        data: ["relative humidity"],
                    },
                    dataZoom: [
                        { realtime: true, xAxisIndex: [0, 1], filterMode: "weakFilter" },
                        { type: "inside", realtime: true, xAxisIndex: [0, 1] },
                    ],
                    toolbox: { feature: { saveAsImage: {}, restore: {} } },
                    xAxis: { type: "time" },
                    yAxis: [
                        {
                            type: "value",
                            position: "left",
                            name: "%",
                            min: 0,
                            max: 100,
                            _medium: "relative humidity"
                        },
                    ],
                    series: [
                        {
                            name: "relative humidity",
                            type: "line",
                            step: "start",
                            showSymbol: false,
                            yAxisIndex: 0,
                            sampling: "lttb",
                            connectNulls: false,
                            data
                        },
                    ]
                };

                var chart1 = testHelper.create(echarts, 'main1', {
                    title: [
                        'Sampling with lttb, test **connectNulls**',
                        'toggle connectNulls value or switch setting, check it.'
                    ],
                    option,
                    width: 600,
                    height: 400,
                    buttons: [
                        {
                            text: 'toggle connectNulls value',
                            onclick: function () {
                                const flag = option.series[0].connectNulls;
                                option.series[0].connectNulls = !flag;
                                chart1.setOption(option);
                            }
                        },
                        {
                            text: 'switch sampling between lttb and none',
                            onclick: function () {
                                const sampling = option.series[0].sampling;
                                option.series[0].sampling = sampling === 'lttb' ? 'none' : 'lttb';
                                console.log('current setting:', option.series[0].sampling);
                                chart1.setOption(option);
                            }
                        }
                    ]
                });
            });
        </script>
    </body>
</html>
