function renderCommitteeEvolution()

in site/js/projects.js [1062:1143]


function renderCommitteeEvolution() {
    var evo = {}; // 'year-month' -> { established: [], retired: [] }
    // init evo with empty content for the whole period
    var maxYear = new Date().getFullYear();
    for (var year = 1995; year <= maxYear; year++) {
        var maxMonth = (year < maxYear) ? 12 : (new Date().getMonth() + 1);
        for (var month = 1; month <= maxMonth; month++) {
            var key = year + '-' + (month < 10 ? '0':'') + month;
            evo[key] = { 'established': [], 'retired': [] };
        }
    }
    // add current committees
    var c;
    for (c in committees) {
        c = committees[c];
        if (evo[c.established]) {
            evo[c.established]['established'].push(c);
        } else {
            console.log(c.id + ": " + c.established + " is off(?!)");
        }
    }
    // add retired committees
    for (c in retiredCommittees) {
        c = retiredCommittees[c];
        if (evo[c.established] && evo[c.retired]) {
            evo[c.established]['established'].push(c);
            evo[c.retired]['retired'].push(c);

        } else {
            console.log(c.id + ": " + c.established + " or " + c.retired + " is off(?!)");
        }
    }
    // compute data
    var data = [];
    var cur = 0;
    var d;
    for (d in evo) {
        var established = evo[d]['established'];
        var retired = evo[d]['retired'];
        var estDisplay = [];
        for (c in established) {
            c = established[c];
            estDisplay.push(c.name + ((c.id in retiredCommittees) ? ' (retired ' + retiredCommittees[c.id]['retired'] + ')':''));
        }
        var retDisplay = [];
        for (c in retired) {
            c = retired[c];
            retDisplay.push(c.name + ' (established ' + c['established'] + ')');
        }
        cur += established.length - retired.length;
        data.push([d, established.length, htmlListTooltip(d, 'new committee', estDisplay), -1*retired.length, htmlListTooltip(d, 'retired committee', retDisplay), cur]);
    }
    //narr.sort(function(a,b) { return (b[1] - a[1]) });
    var dataTable = new google.visualization.DataTable();
    dataTable.addColumn('string', 'Month');
    dataTable.addColumn('number', "New committees");
    dataTable.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    dataTable.addColumn('number', "Retired committees");
    dataTable.addColumn({type: 'string', role: 'tooltip', 'p': {'html': true}});
    dataTable.addColumn('number', 'Current committees');

    dataTable.addRows(data);

    var options = {
        title: "Committees evolution (also called PMCs or Top Level Projects)",
        isStacked: true,
        height: 320,
        width: 1160,
        seriesType: "bars",
        backgroundColor: 'transparent',
        series: {2: {type: "line", targetAxisIndex: 1}},
        tooltip: {isHtml: true},
        vAxes:[
            {title: 'Change in states', ticks: [-3,0,3,6,9]},
            {title: 'Current number of committees'}
        ]
    };
    var div = document.createElement('div');
    document.getElementById('details').appendChild(div);
    var chart = new google.visualization.ComboChart(div);
    chart.draw(dataTable, options);
}