Google Calendar Time Box Duration

Shows the duration of each event.

// ==UserScript==
// @name           Google Calendar Time Box Duration
// @namespace      https://github.com/Row
// @description    Shows the duration of each event.
// @include        https://www.google.com/calendar*
// @version 0.0.1.20141019134026
// ==/UserScript==

var timer;
document.querySelector('#gridcontainer').addEventListener("DOMSubtreeModified",
    function(e)
    {
        window.clearTimeout(timer);
        timer = window.setTimeout(addDuration,500);
    }, false);

function addDuration()
{
    var timeElements = document.querySelectorAll('dl.cbrd dt');
    for (var i in timeElements) {
        var str = timeElements[i].innerHTML || '';
        str     = str.replace(/^(\d{2}:\d{2}) – (\d{2}:\d{2}) (.*?)$/, callbackTimeISO);
        str     = str.replace(/^(\d+)(\:?\d*?)(p?) – (\d+)(\:?\d*?)(p?) (.*?)$/, callbackTimeGoogleAMPM);
        timeElements[i].innerHTML = str;
        window.clearTimeout(timer);
    }
}

function AMPMto24(hour, isPM)
{
    hour = isPM && hour != '12' ? parseInt(hour) + 12 : hour;
    return pad(!isPM ? parseInt(hour) % 12 : hour, 2);
}

function callbackTimeGoogleAMPM(match, startHour, startMinute, startP, endHour, endMinute, endP, extra)
{
    var start = AMPMto24(startHour, startP == 'p');
    start    += startMinute != '' ? startMinute : ':00';
    var end   = AMPMto24(endHour, endP == 'p');
    end      += endMinute != '' ? endMinute : ':00';
    return startHour + startMinute + startP + ' - ' + endHour + endMinute + endP +
            ' (' + calculateDuration(start, end) + ') ' + extra;
}

function callbackTimeISO(match, start, end, extra)
{
    return start + ' - ' + end + ' (' + calculateDuration(start, end) + ') ' + extra;
}

function getTimeDifference(startDate,endDate)
{
    var totalDifference = endDate.getTime() - startDate.getTime();
    var diff            = new Object();
    diff.days           = Math.floor(totalDifference/1000/60/60/24);
    totalDifference    -= diff.days*1000*60*60*24;
    diff.hours          = Math.floor(totalDifference/1000/60/60);
    totalDifference    -= diff.hours*1000*60*60;
    diff.minutes        = Math.floor(totalDifference/1000/60);
    totalDifference    -= diff.minutes*1000*60;
    diff.seconds        = Math.floor(totalDifference/1000);
    return diff;
}

function pad(number, length)
{
    var str = '' + number;
    while (str.length < length)
        str = '0' + str;
    return str;
}

function calculateDuration(startTime,endTime)
{
    var dateString = "2011-11-11T";
    var s          = new Date(dateString+startTime);
    var e          = new Date(dateString+endTime);
    var diff       = getTimeDifference(s,e);
    return  pad(diff.hours,2) + ":" + pad(diff.minutes,2);
}