function nextCriticalCommuteDate() {
    now = new Date();
    dayOfWeek = now.getDay();
    FRIDAY = 5;
    DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;
    friday = now;
    while (friday.getDay() != FRIDAY) {
        friday.setTime(friday.getTime() + DAY_IN_MILLISECONDS);
    }
 
    nextFriday = new Date();
    nextFriday.setTime(friday.getTime());
    while (nextFriday.getMonth() == friday.getMonth()) {
        nextFriday.setTime(nextFriday.getTime() + (7 * DAY_IN_MILLISECONDS));
    }
    lastFridayInMonth = new Date();
    lastFridayInMonth.setTime(nextFriday - (7 * DAY_IN_MILLISECONDS));
 
    switch (lastFridayInMonth.getMonth()) {
        case 0: monthName = 'January'; break;
        case 1: monthName = 'February'; break;
        case 2: monthName = 'March'; break;
        case 3: monthName = 'April'; break;
        case 4: monthName = 'May'; break;
        case 5: monthName = 'June'; break;
        case 6: monthName = 'July'; break;
        case 7: monthName = 'August'; break;
        case 8: monthName = 'September'; break;
        case 9: monthName = 'October'; break;
        case 10: monthName = 'November'; break;
        case 11: monthName = 'December'; break;
    }

    result = 'Next Bike Friday ride - 8.00 am on Friday ' + lastFridayInMonth.getDate() + ' ' + monthName
        + ' ' + lastFridayInMonth.getFullYear();

    if (lastFridayInMonth.getMonth() == 11) {
        result = 'No Critical Commute in December - next one on the last Friday of January';
    }

    return result;
}

