Вот что получилось.
1. Переводим цвет HTML -> RGB -> HSL
2. Получаем: H - цветовой тон (например, красный, зелёный или сине-голубой), S - насыщенность, L - светлота (именно светлота, а не яркость) от 0 до 1.
3. Меняем цвет на нужный
function rgb2hsl(HTMLcolor) {
r = parseInt(HTMLcolor.substring(0,2),16) / 255;
g = parseInt(HTMLcolor.substring(2,4),16) / 255;
b = parseInt(HTMLcolor.substring(4,6),16) / 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0;
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l]; // H - цветовой тон, S - насыщенность, L - светлота
}
function changeColor (HTMLcolor) {
e = rgb2hsl(HTMLcolor);
if ((e[0]<0.55 && e[2]>=0.5) || (e[0]>=0.55 && e[2]>=0.75)) {
fc = '#000000'; // черный
} else {
fc = '#FFFFFF'; // белый
}
// далее меняем цвет, где это необходимо
}
changeColor ('FF0000');
В функции changeColor помимо светлоты еще учитывается параметр цветового тона. Т.к. например "желтый цвет" и "синий" одинаковой светлоты по тону совсем разные (желтый -светлее, синий - темнее).
Спасибо за внимание!