<html>

<head>
    <title>Timeline | A lot of grouped data</title>

    <script src="../../../docs/js/jquery.min.js"></script>
    <script src="../../../dist/vis.js"></script>
    <link href="../../../dist/vis-timeline-graph2d.min.css" rel="stylesheet" type="text/css" />

    <style type="text/css">
        body {
            color: #4D4D4D;
            font: 10pt arial;
        }
    </style>

</head>

<body>
    <h1>Timeline visible Groups</h1>

    <button onclick="showVisibleGroups()">Show current visible items</button>
    <div>
        <h2>visible groups:</h2>
        <h3 id="visibleGroupsContainer"></h3>
        <h2>(Scroll with the mouse and see the items being focus automatically on the timeline)</h2>
    </div>

    <div id="mytimeline"></div>
    <br>

    <script>
        function showVisibleGroups() {
            var a = timeline.getVisibleGroups();
            document.getElementById("visibleGroupsContainer").innerHTML = ""
            document.getElementById("visibleGroupsContainer").innerHTML += a;
        };

        var now = Date.now()

        var options = {
            stack: true,
            maxHeight: 640,
            horizontalScroll: false,
            verticalScroll: true,
            zoomKey: "ctrlKey",
            start: Date.now() - 1000 * 60 * 60 * 24 * 3, // minus 3 days
            end: Date.now() + 1000 * 60 * 60 * 24 * 21, // plus 1 months aprox.
            orientation: {
                axis: "both",
                item: "top"
            },
        };
        var groups = new vis.DataSet();
        var items = new vis.DataSet();

        var count = 300;

        for (var i = 0; i < count; i++) {
            var start = now + 1000 * 60 * 60 * 24 * (i + Math.floor(Math.random() * 7))
            var end = start + 1000 * 60 * 60 * 24 * (1 + Math.floor(Math.random() * 5))

            groups.add({
                id: i,
                content: 'Task ' + i,
                order: i
            })

            items.add({
                id: i,
                group: i,
                start: start,
                end: end,
                type: 'range',
                content: 'Item ' + i
            });
        }

        // create a Timeline
        var container = document.getElementById('mytimeline');
        timeline = new vis.Timeline(container, null, options);
        timeline.setGroups(groups);
        timeline.setItems(items);

        function debounce(func, wait = 100) {
            let timeout;
            return function (...args) {
                clearTimeout(timeout);
                timeout = setTimeout(() => {
                    func.apply(this, args);
                }, wait);
            };
        }

        let groupFocus = (e) => {
            let vGroups = timeline.getVisibleGroups()
            let vItems = vGroups.reduce((res, groupId) => {
                let group = timeline.itemSet.groups[groupId]
                if (group.items) {
                    res = res.concat(Object.keys(group.items))
                }
                return res
            }, [])
            timeline.focus(vItems)
        }
        this.timeline.on("scroll", debounce(groupFocus, 200))
        // Enabling the next line leads to a continuous since calling focus might scroll vertically even if it shouldn't
        // this.timeline.on("scrollSide", debounce(groupFocus, 200))
    </script>

</body>

</html>