Changes the Colour of To-Dos based on Dates
// Basecamp - Colour Due Dates in To-Do Lists
// Copyright (c) 2009, Alex Burkhardt
// http://www.alex3d.de
// 10 January 2009
//
// Original script created by Alex Burkhardt
//
// 28 February 2011 - Modified by sonar_m to handle new Bascamp format
// 06 February 2012 - Modified by Markp to give different colour scheme
// 07 February 2012 - Modified by Markp to exclude colours on the "Today" view page, as they are all the same (all green)
// 08 February 2012 - Modified by Markp to exclude colours on "Messages" and "Calendar" pages, where they are not appropriate
// 17 February 2012 - Modified by Markp to exclude colours on "Account" page, where they are not appropriate
// 30 March 2012 - Modified by Markp to put back colours on the "Today" page; in retrospect it seems better that way!
// 19 April 2012 - Modified by Markp to experiment with revised colour scheme to highlight tasks due yesterday in yellow and next week's tasks in light green
// 20 April 2012 - Modified by Markp to tweak the light green and grey colors (future tasks) to make them lighter and less obtrusive
// 14 May 2012 - Modified by Markp to exclude colours on "Files" page, where they are not appropriate
//
// ==UserScript==
// @name Basecamp - Coloured to-dos based on due dates
// @version 1.0.10
// @description Changes the Colour of To-Dos based on Dates
// @namespace https://www.posen.net/
// @include https://*.updatelog.*/*
// @include https://*.clientsection.*/*
// @include https://*.seework.*/*
// @include https://*.grouphub.*/*
// @include https://*.projectpath.*/*
// @include https://*.basecamphq.*/*
// @include http://*.updatelog.*/*
// @include http://*.clientsection.*/*
// @include http://*.seework.*/*
// @include http://*.grouphub.*/*
// @include http://*.projectpath.*/*
// @include http://*.basecamphq.*/*
// @exclude https://*.basecamphq.*/*/posts/*
// @exclude https://*.basecamphq.*/*/posts
// @exclude https://*.basecamphq.*/*/milestones/*
// @exclude https://*.basecamphq.*/account
// @exclude https://*.basecamphq.*/projects/*/files
//
// ==/UserScript==
//
// How to use:
// When you have a to-do with a deadline, just set the date in Basecamp
// The script will then colour-code the to-do-item dates as follows:
// More than 1 week Old - > red
// Within the past 7 days -> orange
// Yesterday -> yellow
// Today -> green
// In the next 7 days -> light green
// In the future by more than 7 days -> grey
var today = new Date();
textnodes = document.evaluate( "//body//text()", document, null,
XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (var u = 0; u < textnodes.snapshotLength; u++) {
node = textnodes.snapshotItem(u);
s = node.data;
var datum = s.match(/\[[\d]{2}\/[\d]{2}\/[\d]{2}\]/g);
var datum = s.match(/[\d]{1,2} [\w]{3} [\d]{4}/);
if(datum) {
var datum1;
var dateDisplayed;
var future;
node.parentNode.setAttribute("style", "color: black;background-color: #d8d8d8"); //Default format is black on grey
for (i=0;i<datum.length;i++) {
datum1 = datum[i].split(' ');
dateDisplayed = new Date();
dateDisplayed.setYear(datum1[2]);
var month = datum1[1];
var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
for(j=0;j<12;j++)
{
if(month == m_names[j])
{
dateDisplayed.setMonth(j);
break;
}
}
dateDisplayed.setDate(datum1[0]);
future = new Date();
future.setYear(today.getFullYear());
future.setMonth(today.getMonth());
future.setDate(today.getDate() +1);
LastWeek = new Date();
LastWeek.setYear(today.getFullYear());
LastWeek.setMonth(today.getMonth());
LastWeek.setDate(today.getDate() -7);
NextWeek = new Date();
NextWeek.setYear(today.getFullYear());
NextWeek.setMonth(today.getMonth());
NextWeek.setDate(today.getDate() +7);
Yesterday = new Date();
Yesterday.setYear(today.getFullYear());
Yesterday.setMonth(today.getMonth());
Yesterday.setDate(today.getDate() -1);
toDostyle = getComputedStyle(node.parentNode, '');
if (toDostyle.textDecoration == "line-through");
else {
if(dateDisplayed.toString().substring(0,15) == today.toString().substring(0,15)) node.parentNode.setAttribute("style", "color: white;background-color: #0EA93A"); //today (in green)
else if(dateDisplayed < today && dateDisplayed >= Yesterday) node.parentNode.setAttribute("style", "color: black;background-color: #FFFF00"); //yesterday (in yellow)
else if(dateDisplayed < Yesterday && dateDisplayed >= LastWeek) node.parentNode.setAttribute("style", "color: white;background-color: #FF8D1C"); //within the past 7 days (in orange)
else if(dateDisplayed < LastWeek) node.parentNode.setAttribute("style", "color: white;background-color: #f00"); //more than a week old (in red)
else if(dateDisplayed > today && dateDisplayed < NextWeek) node.parentNode.setAttribute("style", "color: black;background-color: #BCF5A9"); //Next week (in pale green)
// Orange: #FF8D1C - Grey: #d8d8d8 - Green: #0EA93A - Red: #f00 - Yellow: #FFFF00 - Blue: #0000ff - Pale Green: #BCF5A9
}
}
}
}