<!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/esl.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>
        <!-- <script src="ut/lib/canteen.js"></script> -->
        <link rel="stylesheet" href="lib/reset.css" />
    </head>
    <body>
        <style>
        </style>



        <div id="during-case-continue"></div>
        <div id="during-case-get-curr"></div>
        <div id="during-case-partial-change"></div>
        <div id="during-first-frame-correct"></div>
        <div id="during-ensure-once-in-each-frame"></div>
















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

            function renderItem(params, api) {
                return {
                    type: 'circle',
                    shape: {
                        cx: api.value(0),
                        cy: api.value(1),
                        r: 40,
                        transition: 'cx'
                    },
                    style: {
                        fill: 'green',
                    },
                };
            }

            var baseX = 60;
            var baseY = 80

            var option = {
                series: [{
                    id: 'a',
                    type: 'custom',
                    coordinateSystem: 'none',
                    renderItem: renderItem,
                    animationDuration: 3000,
                    animationDurationUpdate: 3000,
                    data: [[baseX, baseY]]
                }]
            };


            var chart = testHelper.create(echarts, 'during-case-continue', {
                title: [
                    'Click "move" several times **before animation finished**',
                    'The cirle should keep move to right **without jump**'
                ],
                height: 200,
                option: option,
                buttons: [{
                    text: 'move',
                    onclick: function () {
                        chart.setOption({
                            series: {
                                id: 'a',
                                data: [[baseX += 60, baseY]]
                            }
                        });
                    }
                }]
            });
        });
        </script>












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

            function renderItem(params, api) {
                var renderNumberStart;
                return {
                    type: 'circle',
                    shape: {
                        cx: api.value(0),
                        cy: api.value(1),
                        r: 40
                    },
                    extra: {
                        renderNumber: ++renderNumber,
                        transition: 'renderNumber'
                    },
                    style: {
                        fill: 'green'
                    },
                    during: function (apiDuring) {
                        var currNum = apiDuring.getExtra('renderNumber');
                        !renderNumberStart && (renderNumberStart = currNum);
                        var opacity = (currNum - renderNumberStart) / (renderNumber - renderNumberStart);
                        isNaN(opacity) && (opacity = 1);
                        apiDuring.setStyle('opacity', opacity);
                    }
                };
            }

            var renderNumber = 1;
            var baseX = 60;
            var baseY = 100;

            var option = {
                series: [{
                    id: 'a',
                    type: 'custom',
                    coordinateSystem: 'none',
                    renderItem: renderItem,
                    animationDuration: 3000,
                    animationDurationUpdate: 1000,
                    data: [[baseX, baseY]]
                }]
            };

            var chart = testHelper.create(echarts, 'during-case-get-curr', {
                title: [
                    'Click next several times **before animation finished**',
                    'Each click, the circle **disappear immediately** and **fade in** at right a bit',
                    'MUST **not blink**'
                ],
                height: 200,
                option: option,
                buttons: [{
                    text: 'next',
                    onclick: function () {
                        chart.setOption({
                            series: {
                                id: 'a',
                                data: [[baseX += 40, baseY]]
                            }
                        });
                    }
                }]
            });
        });
        </script>












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

            var baseX = 100;
            var baseY = 100;

            function renderItem(params, api) {
                var textOpt = {
                    type: 'text',
                    extra: { },
                    transition: [], // disable the default transition of x y.
                    style: { x: 20, y: 20, fontSize: 20, stroke: 'green' },
                    during: function (apiDuring) {
                        var x = apiDuring.getExtra('x');
                        var y = apiDuring.getExtra('y');
                        apiDuring.setStyle('text', makeText(x, y));
                    }
                };
                var movingCircleOpt = {
                    type: 'circle',
                    shape: { cx: 0, cy: 0, r: 10 },
                    extra: { },
                    style: { fill: 'red' },
                    transition: [], // disable the default transition of x y.
                    during: function (apiDuring) {
                        var x = apiDuring.getExtra('x');
                        var y = apiDuring.getExtra('y');
                        apiDuring.setTransform('x', x).setTransform('y', y);
                    }
                };

                var cmd = api.value(0);
                if (cmd === 'init') {
                    textOpt.extra.x = baseX;
                    textOpt.extra.y = baseY;
                    textOpt.extra.transition = ['x', 'y'];
                    textOpt.style.text = makeText(baseX, baseY);
                    movingCircleOpt.x = baseX;
                    movingCircleOpt.y = baseY;
                    movingCircleOpt.extra.x = baseX;
                    movingCircleOpt.extra.y = baseY;
                    movingCircleOpt.extra.transition = ['x', 'y'];
                }
                else if (cmd === 'x') {
                    baseX += 100;
                    textOpt.extra.x = baseX;
                    textOpt.extra.transition = ['x'];
                    // textOpt.style.text = makeText(baseX, baseY);
                    movingCircleOpt.extra.x = baseX;
                    movingCircleOpt.extra.transition = ['x'];
                }
                else if (cmd === 'y') {
                    baseY += 100;
                    textOpt.extra.y = baseY;
                    textOpt.extra.transition = ['y'];
                    // textOpt.style.text = makeText(baseX, baseY);
                    movingCircleOpt.extra.y = baseY;
                    movingCircleOpt.extra.transition = ['y'];
                }

                return {
                    type: 'group',
                    children: [
                        textOpt,
                        movingCircleOpt,
                        {
                            // Standard circle: used to check the result of moving circle.
                            type: 'circle',
                            x: baseX,
                            y: baseY,
                            transition: [], // disable the default transition of x y.
                            shape: {cx: 0, cy: 0, r: 15},
                            style: {fill: '#aaa'},
                            z2: -1
                        }
                    ]
                };
            }

            function makeText(x, y) {
                return ['x: ' + x.toFixed(2), 'y: ' + y.toFixed(2)].join('\n');
            }

            var option = {
                series: [{
                    id: 'a',
                    type: 'custom',
                    coordinateSystem: 'none',
                    renderItem: renderItem,
                    animationDuration: 3000,
                    animationDurationUpdate: 5000,
                    data: [['init']]
                }]
            };


            var chart = testHelper.create(echarts, 'during-case-partial-change', {
                title: [
                    'Partial change props test:',
                    'Click "add x" and "add y" before animation finished.',
                    'The red circle animation should be smooth **without jump**.',
                    'The red circle should be finally **reach at the grey circle**.',
                    'The **text should be correct**.',
                ],
                height: 500,
                option: option,
                buttons: [{
                    text: 'add x 100',
                    onclick: function () {
                        chart.setOption({
                            series: {
                                id: 'a',
                                data: [['x']]
                            }
                        });
                    }
                }, {
                    text: 'add y 100',
                    onclick: function () {
                        chart.setOption({
                            series: {
                                id: 'a',
                                data: [['y']]
                            }
                        });
                    }
                }]
            });
        });
        </script>






        <script>
        require(['echarts'], function (echarts) {
            var resultPrinted = false;

            function renderItem(params, api) {
                return {
                    type: 'text',
                    extra: {
                        renderNumber: renderNumber,
                        transition: 'renderNumber'
                    },
                    style: {
                        x: 100,
                        y: 50,
                        fontSize: 30,
                        enterFrom: {
                            x: 10
                        }
                    },
                    during: function (apiDuring) {
                        var currNum = apiDuring.getExtra('renderNumber');
                        if (resultPrinted || currNum <= 2) {
                            return;
                        }
                        resultPrinted = true;
                        if (currNum === 3) {
                            apiDuring.setStyle('text', 'TEST FAIL');
                            apiDuring.setStyle('fill', 'red');
                        }
                        else {
                            apiDuring.setStyle('text', 'TEST PASS');
                            apiDuring.setStyle('fill', 'green');
                        }
                    }
                };
            }

            var renderNumber = 2;

            var option = {
                series: [{
                    id: 'a',
                    type: 'custom',
                    coordinateSystem: 'none',
                    renderItem: renderItem,
                    animationDuration: 10000,
                    animationDurationUpdate: 10000,
                    data: [[10]]
                }]
            };

            var chart = testHelper.create(echarts, 'during-first-frame-correct', {
                title: [
                    'Test the first during call should not get the target value:',
                    'Should print TEST PASS'
                ],
                option: option,
                height: 200
            });

            chart && setTimeout(function () {
                renderNumber = 3;
                chart.setOption({
                    series: {
                        id: 'a',
                        data: [[10]]
                    }
                });
                // Set option before init finished.
            }, 100);
        });
        </script>








        <script>
        require(['echarts'], function (echarts) {
            var resultPrinted = false;
            var currX = 0;
            var currFontSize = 16;

            function renderItem(params, api) {
                var cmd = api.value(0);

                var opt = {
                    type: 'text',
                    extra: {
                        renderNumber: renderNumber,
                        transition: 'renderNumber'
                    },
                    style: {
                        x: 100,
                        y: 50,
                        fontSize: currFontSize,
                        fill: 'green'
                    }
                };

                if (cmd !== 'noDuring') {
                    opt.during = function (apiDuring) {
                        duringCount++;
                        var currNum = apiDuring.getExtra('renderNumber');
                        apiDuring.setStyle(
                            'text',
                            'during count: ' + duringCount + '\n' + 'rAF count: ' + rAFCount
                        );
                    };
                }
                if (cmd === 'addX') {
                    currX += 50;
                    opt.x = currX;
                    opt.transition = 'x';
                }
                if (cmd === 'addFontSize') {
                    currFontSize += 8;
                    opt.style.fontSize = currFontSize;
                    opt.style.transition = 'fontSize';
                }

                return opt;
            }

            var renderNumber = 2;

            var option = {
                series: [{
                    id: 'a',
                    type: 'custom',
                    coordinateSystem: 'none',
                    renderItem: renderItem,
                    animationDuration: 3000,
                    animationDurationUpdate: 3000,
                    data: [[10]]
                }]
            };

            var chart = testHelper.create(echarts, 'during-ensure-once-in-each-frame', {
                title: [
                    'Test during only called once in each:',
                    'In **init** and after **click the buttons**,',
                    'during count and rAF count',
                    'should **be the same** (may be 1 different)'
                ],
                option: option,
                height: 200,
                button: [{
                    text: 'add x 50',
                    onclick: function () {
                        chart.setOption({ series: { id: 'a', data: [['addX']] } });
                        startCountFrame();
                    }
                }, {
                    text: 'add fontSize 8',
                    onclick: function () {
                        chart.setOption({ series: { id: 'a', data: [['addFontSize']] } });
                        startCountFrame();
                    }
                }]
            });

            var rAFCount = 0;
            var duringCount = 0;
            var rAFId;

            function startCountFrame() {
                stopCountFrame();
                rAFId = requestAnimationFrame(countFrame);

                function countFrame() {
                    rAFCount++;
                    rAFId = requestAnimationFrame(countFrame);
                }
            }

            function stopCountFrame() {
                if (rAFId != null) {
                    cancelAnimationFrame(rAFId);
                    rAFId = null;
                }
            }

            if (chart) {
                chart.on('finished', function () {
                    stopCountFrame();
                });

                startCountFrame();

                setTimeout(function () {
                    renderNumber = 3;
                    chart.setOption({ series: { id: 'a', data: [['init']] } });
                    // Set option before init finished.
                    startCountFrame();
                }, 100);
            }
        });
        </script>






    </body>
</html>

