
<!--
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/facePrint.js"></script>
    </head>
    <body>
        <style>
            html, body {
                width: 100%;
            }
            #main0, #main1 {
                width: 100%;
                height: 1000px;
                margin-bottom: 30px;
            }
            #main2, #main3 {
                width: 100%;
                height: 300px;
                margin-bottom: 30px;
            }
            #formatterSwitchButtons {
                margin: 10px;
                padding: 10px;
            }
            #currentFormatter {
                margin: 10px;
                padding: 10px;
                border: 1px solid #aaa;
            }
        </style>

        <div id="formatterSwitchButtons">
        </div>
        <div>
            Current formatter:
            <pre id="currentFormatter"></pre>
        </div>

        <script>
            var _endLabelFormatter;

            // Init formatter switch buttons.
            (function () {

                var formatterConfigs = [
                    {
                        text: 'formatter string {c}',
                        formatter: '$ {c}'
                    },
                    {
                        text: 'formatter string {@[dimIndex]}',
                        formatter: '$ {@[1]}'
                    },
                    {
                        text: 'formatter callback',
                        formatter: function (param) {
                            return '$ ' + param.value;
                        }
                    }
                ];
                var END_LABEL_FORMATTER = '__EC_TEST_line-endLabel.html_FOMRATTER___';

                function setLocalStorage(formatterKey) {
                    window.localStorage.setItem(END_LABEL_FORMATTER, formatterKey);
                }
                function getLocalStorage() {
                    return window.localStorage.getItem(END_LABEL_FORMATTER);
                }

                var currFormatterKey = getLocalStorage();
                var fmtBtnBox = document.getElementById('formatterSwitchButtons');
                for (var i = 0; i < formatterConfigs.length; i++) {
                    var config = formatterConfigs[i];

                    if (_endLabelFormatter == null
                        && (
                            currFormatterKey == null
                            || currFormatterKey === config.text
                        )
                    ) {
                        _endLabelFormatter = config.formatter;
                    }

                    var btn = document.createElement('button');
                    btn.innerHTML = config.text;
                    btn.onclick = (function (cfg) {
                        return function () {
                            setLocalStorage(cfg.text);
                            typeof __VRT_RELOAD__ !== 'undefined' ? __VRT_RELOAD__() : location.reload();
                        };
                    })(config);
                    fmtBtnBox.appendChild(btn);
                }

                if (!_endLabelFormatter) {
                    throw new Error();
                }
                var formatterDisplayBox = document.getElementById('currentFormatter');
                formatterDisplayBox.innerHTML = _endLabelFormatter.toString();
            })();

        </script>


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

        <script>

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

                var xData = [];
                var data = [];
                var value = 200;
                var positive = 1;
                for (var i = 0; i < 12; ++i) {
                    xData.push(i + '');
                    var plus = i === 6 || i === 7
                        ? 0
                        : positive * Math.round(Math.random() * 1000);
                    value = plus + value;
                    data.push(i === 3 ? '-' : value);

                    if (Math.random() > 0.7) {
                        positive = -1 * positive;
                    }
                }

                for (var cid = 0; cid < 2; ++cid) {
                    (function (cid) {
                        var chart = echarts.init(document.getElementById('main' + cid));
                        var option = {
                            title: [{
                                text: 'Line End Label Animation (connectNulls: '
                                    + (cid === 0 ? 'false' : 'true') + ')',
                                subtext: 'Symbol and text should sync with line clipPath\n\naxis not inversed',
                                textAlign: 'center',
                                left: '50%',
                                top: 0
                            }, {
                                subtext: 'X axis inversed',
                                textAlign: 'center',
                                left: '50%',
                                top: '28%'
                            }, {
                                subtext: 'Y axis inversed',
                                textAlign: 'center',
                                left: '50%',
                                top: '48%'
                            }, {
                                subtext: 'X and Y axes inversed',
                                textAlign: 'center',
                                left: '50%',
                                top: '74%'
                            }],
                            xAxis: [{
                                data: xData
                            }, {
                                gridIndex: 1
                            }, {
                                data: xData,
                                inverse: true,
                                gridIndex: 2
                            }, {
                                gridIndex: 3,
                                inverse: true
                            }, {
                                data: xData,
                                gridIndex: 4
                            }, {
                                gridIndex: 5
                            }, {
                                data: xData,
                                inverse: true,
                                gridIndex: 6
                            }, {
                                gridIndex: 7,
                                inverse: true
                            }],
                            yAxis: [{
                            }, {
                                data: xData,
                                gridIndex: 1
                            }, {
                                inverse: false,
                                gridIndex: 2
                            }, {
                                data: xData,
                                gridIndex: 3,
                                inverse: false
                            }, {
                                gridIndex: 4,
                                inverse: true
                            }, {
                                data: xData,
                                gridIndex: 5,
                                inverse: true
                            }, {
                                inverse: true,
                                gridIndex: 6
                            }, {
                                data: xData,
                                gridIndex: 7,
                                inverse: true
                            }],
                            grid: [{
                                left: 80,
                                top: 90,
                                right: '52%',
                                bottom: '74%'
                            }, {
                                left: '52%',
                                top: 90,
                                right: 50,
                                bottom: '74%'
                            }, {
                                left: 80,
                                right: '52%',
                                top: '32%',
                                bottom: '55%'
                            }, {
                                left: '52%',
                                right: 50,
                                top: '32%',
                                bottom: '55%'
                            }, {
                                left: 80,
                                top: '52%',
                                right: '52%',
                                bottom: '30%'
                            }, {
                                left: '52%',
                                top: '52%',
                                right: 50,
                                bottom: '30%'
                            }, {
                                left: 80,
                                right: '52%',
                                top: '78%',
                                bottom: 30
                            }, {
                                left: '52%',
                                right: 50,
                                top: '78%',
                                bottom: 30
                            }],
                            series: (function () {
                                var series = [];
                                for (var i = 0; i < 8; ++i) {
                                    series.push({
                                        type: 'line',
                                        data: data,
                                        connectNulls: cid === 1,
                                        label: {
                                            show: false
                                        },
                                        endLabel: {
                                            show: true,
                                            formatter: _endLabelFormatter,
                                            fontSize: 20,
                                            distance: 10,
                                            color: 'inherit'
                                        },
                                        emphasis: {
                                            endLabel: {
                                                color: 'red'
                                            }
                                        },
                                        xAxisIndex: i,
                                        yAxisIndex: i
                                    });
                                }
                                return series;
                            })(),
                            animationDuration: 10000,
                            animationDurationUpdate: 500
                        };
                        chart.setOption(option);

                        // setTimeout(function () {
                        //     data.push(1000);
                        //     data.push('-');
                        //     data.push('-');

                        //     xData.push('12');
                        //     xData.push('13');
                        //     xData.push('14');

                        //     chart.setOption(option);
                        // }, 12000);
                    })(cid);

                }

            })

        </script>


        <script>

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

                var xData = [];
                var data = [];
                var value = 200;
                var positive = 1;
                for (var i = 0; i < 12; ++i) {
                    xData.push(i + '');
                    var plus = i === 6 || i === 7
                        ? 0
                        : positive * Math.round(Math.random() * 1000);
                    value = plus + value;
                    data.push(i === 3 ? '-' : value);

                    if (Math.random() > 0.7) {
                        positive = -1 * positive;
                    }
                }

                var chart = echarts.init(document.getElementById('main2'));
                var option = {
                    title: [{
                        text: 'distance 50, offset [0, 20], rotate 5\nonhover: offset [0, -20], rotate -5',
                        textAlign: 'center',
                        left: '50%',
                        top: 0
                    }],
                    xAxis: [{
                        data: xData
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        data: data,
                        label: {
                            show: true
                        },
                        endLabel: {
                            show: true,
                            formatter: _endLabelFormatter,
                            fontSize: 14,
                            distance: 50,
                            offset: [0, 20],
                            rotate: 5,
                            color: 'auto'
                        },
                        emphasis: {
                            endLabel: {
                                color: 'red',
                                offset: [0, -20],
                                rotate: -5
                            }
                        }
                    }],
                    animationDuration: 10000,
                    animationDurationUpdate: 500
                };
                chart.setOption(option);

            })

        </script>

        <script>


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

                var chart = echarts.init(document.getElementById('main3'));
                var option = {
                    title: [{
                        text: 'Emphasis on the data at "b" and endLabel should be displayed',
                        textAlign: 'center',
                        left: '50%',
                        top: 0
                    }],
                    xAxis: [{
                        data: ['a', 'b']
                    }],
                    yAxis: [{
                    }],
                    series: [{
                        type: 'line',
                        data: [1, 2],
                        endLabel: {
                            // show: true,
                            formatter: '{a}: {c}'
                        },
                        emphasis: {
                            endLabel: {
                                show: true,
                                color: 'red'
                            }
                        }
                    }],
                    animationDuration: 0
                };
                chart.setOption(option);

            })

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