<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>SlickGrid Model Benchmark</title>
</head>
<body>
<script src="../lib/jquery-1.7.min.js"></script>
<script src="../slick.core.js"></script>
<script src="../slick.dataview.js"></script>
<script src="../slick.groupitemmetadataprovider.js"></script>

<script>
    function filter(item, args) {
        // simulate a more expensive filer
        var matches = 0;
        if (item.title.indexOf("ask") != -1) matches++;
        for (var j = 0; j < 5; j++)
            matches += Math.random();

        if (item.percentComplete >= args) {
            return true;
        }

        return false;
    }

    var data = [];

    for (var i = 0; i < 300000; i++) {
        var d = (data[i] = {});

        d["id"] = i;
        d["title"] = "Task " + i;
        d["percentComplete"] = i % 100;
        d["duration"] =  Math.round(Math.random() * 14);
    }

    var dv = new Slick.Data.DataView({inlineFilters: true});
    dv.beginUpdate();
    dv.setItems(data);
    dv.setFilter(filter);
    dv.setFilterArgs(0);
    //dv.setPagingOptions({pageSize:25});

    dv.setGrouping([
        {
            getter: "duration",
            formatter: function (g) {
                return "Duration:  " + g.value + "  <span style='color:green'>(" + g.count + " items)</span>";
            },
            aggregators: [
                new Slick.Data.Aggregators.Avg("percentComplete"),
                new Slick.Data.Aggregators.Sum("cost")
            ],
            aggregateCollapsed: true,
            aggregateChildGroups: true
        },
        {
            getter: "effortDriven",
            formatter: function (g) {
                return "Effort-Driven:  " + (g.value ? "True" : "False") + "  <span style='color:green'>(" + g.count + " items)</span>";
            },
            aggregators: [
                new Slick.Data.Aggregators.Avg("percentComplete"),
                new Slick.Data.Aggregators.Sum("cost")
            ],
            aggregateCollapsed: false
        }
    ]);

    dv.endUpdate();


    console.time("total");
    console.time("narrow");

    for (var i = 0; i <= 100; i += 5) {
        dv.setFilterArgs(i);
        dv.setRefreshHints({
            ignoreDiffsBefore:200,
            ignoreDiffsAfter:300,
            isFilterNarrowing:true
        });
        dv.refresh();

        //console.log(dv.getLength());
    }

    console.timeEnd("narrow");

    console.time("expand");

    for (var i = 100; i > 0; i -= 5) {
        dv.setFilterArgs(i);
        dv.setRefreshHints({
            ignoreDiffsBefore:200,
            ignoreDiffsAfter:300,
            isFilterExpanding:true
        });
        dv.refresh();

        //console.log(dv.getLength());
    }

    console.timeEnd("expand");
    console.timeEnd("total");
</script>
</body>
</html>