
<!--
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>
    </head>
    <body>
        <style>
            html, body, #main {
                width: 100%;
                height: 100%;
            }
            body {
                margin: 0;
            }
        </style>
        <div id="main"></div>
        <script>

            require([
                'echarts'
                // 'echarts/chart/line',
                // 'echarts/component/title',
                // 'echarts/component/grid',
                // 'echarts/component/axis',
                // 'echarts/component/dataZoom',
                // 'echarts/component/tooltip',
                // 'echarts/component/markPoint',
                // 'echarts/component/markLine'
            ], function (echarts) {

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

                var option = {
                    "title": {
                        "text": "Data shadow when there are EMPTY VALUES."
                    },
                    "tooltip": {
                        "trigger": "axis"
                    },
                    "grid": {
                        "left": "3%",
                        "right": "4%",
                        "bottom": "55%",
                        "containLabel": true
                    },
                    "dataZoom": [
                        {
                            "type": "slider",
                            // "start": 90,
                            // "end":100,
                            "bottom": 20,
                            "height": 200
                        }
                    ],
                    "xAxis": [
                        {
                            "type": "time",
                            "boundaryGap": false,
                            // "min": 1451577600000,
                            // "max": 1476201600000
                        }
                    ],
                    "yAxis": [
                        {
                            "type": "value"
                        }
                    ],
                    "series": [
                        {
                            "type": "line",
                            "connectNulls": false,
                            "areaStyle": {
                                "normal": {
                                    "color": "#E77271"
                                }
                            },
                            "lineStyle": {
                                "normal": {
                                    "color": "#E77271"
                                }
                            },
                            "data": [
                                [
                                    "2016-09-20T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-09-21T16:00:00.000Z",
                                    13
                                ],
                                [
                                    "2016-09-22T16:00:00.000Z",
                                    3
                                ],
                                [
                                    "2016-09-23T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-09-24T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-09-25T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-09-26T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-09-27T16:00:00.000Z",
                                    61
                                ],
                                [
                                    "2016-09-28T16:00:00.000Z",
                                    28
                                ],
                                [
                                    "2016-09-29T16:00:00.000Z",
                                    21
                                ],
                                [
                                    "2016-09-30T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-10-01T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-10-05T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-10-06T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-10-07T16:00:00.000Z",
                                    null
                                ],
                                [
                                    "2016-10-08T16:00:00.000Z",
                                    NaN
                                ],
                                [
                                    "2016-10-09T16:00:00.000Z",
                                    35
                                ],
                                [
                                    "2016-10-10T16:00:00.000Z",
                                    46
                                ],
                                [
                                    "2016-10-11T16:00:00.000Z",
                                    8
                                ],
                                [
                                    "2016-10-12T16:00:00.000Z",
                                    '-'
                                ]
                            ]
                        }
                    ]
                };

                chart.setOption(option);
            })

        </script>
    </body>
</html>