
<!--
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>
    </head>
    <body>
        <style>
            #main {
                position: relative;
                text-align: center;
            }
            .title {
                display: block;
                cursor: pointer;
                text-decoration: none;
                clear: both;
                text-align: center;
                margin: 0;
                background: #eef;
                line-height: 22px;
            }
            .block {
                display: inline-block;
                *display: inline;
                *zoom: 1;
                vertical-align: top;
                margin: 30px 0 30px 50px;
            }
            .block .ec {
                width: 800px;
                height: 240px;
            }
            .block .info {
                display: block;
                text-align: left;
                background: #eee;
                border-radius: 3px;
                font-size: 12px;
                line-height: 18px;
                padding: 0 5px;
            }
            .block .info td {
                font-size: 12px;
                border: 1px solid #bbb;
                padding: 1px 3px;
            }
            strong {
                color: red;
                font-weight: bold;
                font-size: 18px;
                padding: 0 3px;
            }
        </style>
        <div id="main"></div>




        <script>

            var echarts;
            var zrUtil;
            var charts = [];
            var els = [];

            require(['echarts'], function (ec) {
                echarts = ec;
                zrUtil = echarts.util;


                renderTitle('Order sensitive in processing: no min/max on y (<strong>Try zooming y slider to check if normal</strong>)');
                makeChart(getOption(
                    makeSpecialTrendData(),
                    {
                        xAxisType: 'value',
                        xStart: 15,
                        xEnd: 80,
                        yScale: true,
                        symbolSize: 5
                    }
                ), 500);


                renderTitle('Order sensitive in processing: min/max set on y (<strong>Try zooming y slider to check if normal</strong>)');
                makeChart(getOption(
                    makeSpecialTrendData(),
                    {
                        xAxisType: 'value',
                        xStart: 15,
                        xEnd: 80,
                        yScale: true,
                        symbolSize: 5,
                        yMin: 500,
                        yMax: 3000
                    }
                ), 500);


                renderTitle('Order sensitive in processing: only max set on y and scale (<strong>Try zooming y slider to check if normal</strong>)');
                makeChart(getOption(
                    makeSpecialTrendData(),
                    {
                        xAxisType: 'value',
                        xStart: 15,
                        xEnd: 80,
                        yScale: true,
                        symbolSize: 5,
                        yMax: 3000
                    }
                ), 500);


                renderTitle('Order sensitive in processing: only max set on y and no scale (<strong>Try zooming y slider to check if normal</strong>)');
                makeChart(getOption(
                    makeSpecialTrendData(),
                    {
                        xAxisType: 'value',
                        xStart: 15,
                        xEnd: 80,
                        yScale: false,
                        symbolSize: 5,
                        yMax: 3000
                    }
                ), 500);
            });



            function makeSpecialTrendData() {
                var data = {data1: []};
                var base = -100;
                for (var i = 0; i < 50; i++) {
                    if (i < 10) {
                        data.data1.push([i * 10, base += 197 + random(3)]);
                    }
                    else if (i < 20) {
                        data.data1.push([i * 10, base -= 17 + random(3)]);
                    }
                    else if (i < 30) {
                        data.data1.push([i * 10, base += 3 + random(3)]);
                    }
                    else if (i < 40) {
                        data.data1.push([i * 10, base -= 5 + random(3)]);
                    }
                    else {
                        data.data1.push([i * 10, base += 157 + random(3)]);
                    }
                }
                return data;
            }


            function renderTitle(label) {
                var containerEl = document.getElementById('main');
                var el = document.createElement('a');
                el.className = 'title';
                var html = label; // label is html
                el.innerHTML = html;
                el.href = '#' + html.replace(/\s/g, '_');
                el.name = html.replace(/\s/g, '_');
                containerEl.appendChild(el);
            }

            function makeChart(opt, height) {
                var heightStyle = height ? ' style="height:' + height + 'px;" ' : '';

                var containerEl = document.getElementById('main');
                var el = document.createElement('div');
                el.className = 'block';
                el.innerHTML = '<div ' + heightStyle + ' class="ec"></div><div class="info"></div>';
                containerEl.appendChild(el);

                var chart = echarts.init(el.firstChild, null, { });
                chart.setOption(opt);

                charts.push(chart);
                els.push(el);

                chart.on('dataZoom', zrUtil.curry(renderProp, chart, el, false));
                renderProp(chart, el, true);
            }

            function renderProp(chart, el, isInit) {
                var resultOpt = chart.getOption();
                var dataZoomOpt = zrUtil.map(resultOpt.dataZoom, function (rawOpt) {
                    return ''
                        + '<tr>'
                        + '<td>name:</td><td>' + encodeHTML(rawOpt.name) + '</td>'
                        + '<td>start:</td><td>' + encodeHTML(rawOpt.start) + '</td>'
                        + '<td>end:</td><td>' + encodeHTML(rawOpt.end) + '</td>'
                        + '<td>startValue:</td><td>' + encodeHTML(rawOpt.startValue) + '</td>'
                        + '<td>endValue:</td><td>' + encodeHTML(rawOpt.endValue) + '</td>'
                        + '</tr>';
                });

                el.lastChild.innerHTML = ''
                    + (isInit ? 'ON_INIT: ' : 'ON_EVENT: ') + '<br>'
                    + '<table><tbody>' + dataZoomOpt.join('') + '</tbody></table>';
            }

            function encodeHTML(source) {
                return source == null
                    ? ''
                    : String(source)
                        .replace(/&/g, '&amp;')
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        .replace(/"/g, '&quot;')
                        .replace(/'/g, '&#39;');
            }

            function random(max) {
                return +(Math.random() * max).toFixed(3);
            };

            function getOption(data, args) {
                args = zrUtil.defaults(
                    args || {},
                    {
                        symbol: null,
                        xStart: 1,
                        xEnd: 5,
                        yStart: 0,
                        yEnd: 100,
                        yFitlerMode: 'empty',
                        symbolSize: 10
                    }
                );

                var option = {
                    animation: false,
                    legend: {
                        data: ['n1', 'n2']
                    },
                    toolbox: {
                        feature: {
                            dataView: {},
                            dataZoom: {show: true},
                            restore: {show: true},
                            saveAsImage: {}
                        }
                    },
                    tooltip: {
                        trigger: 'axis'
                    },
                    xAxis: {
                        type: args.xAxisType,
                        splitLine: {
                            show: true
                        },
                        data: args.xAxisData
                    },
                    yAxis: {
                        scale: args.yScale,
                        type: 'value',
                        min: args.yMin,
                        max: args.yMax,
                        splitLine: {
                            show: true
                        }
                    },
                    dataZoom: [
                        {
                            id: 'xSlider',
                            name: 'xSlider',
                            show: true,
                            handleIcon: 'image://asset/echarts-logo.png',
                            filterMode: args.xFilterMode,
                            xAxisIndex: [0],
                            start: args.xStart,
                            end: args.xEnd
                        },
                        {
                            name: 'ySlider',
                            show: true,
                            handleIcon: 'image://asset/echarts-logo.png',
                            filterMode: args.yFitlerMode,
                            yAxisIndex: [0],
                            start: args.yStart,
                            end: args.yEnd
                        },
                        {
                            name: 'xInside',
                            type: 'inside',
                            filterMode: args.xFilterMode,
                            xAxisIndex: [0],
                            start: args.xStart,
                            end: args.xEnd
                        },
                        {
                            name: 'yInside',
                            type: 'inside',
                            filterMode: args.yFilterMode,
                            yAxisIndex: [0],
                            start: args.yStart,
                            end: args.yEnd
                        }
                    ],
                    series: [
                        {
                            name: 'n1',
                            type: 'line',
                            symbolSize: args.symbolSize,
                            symbol: args.symbol,
                            data: data.data1
                        },
                        {
                            name: 'n2',
                            type: 'line',
                            symbol: args.symbol,
                            symbolSize: args.symbolSize,
                            data: data.data2
                        }
                    ]
                };

                if (!data.data2) {
                    option.series.splice(1, 1);
                }

                return option;
            }


        </script>

    </body>
</html>