// main function to process the fade request //
function colorFade(id,element,start,end,steps,speed) {
 var startrgb,endrgb,er,eg,eb,step,rint,gint,bint,step;
 var target = document.getElementById(id);
 steps = steps || 20;
 speed = speed || 20;
 clearInterval(target.timer);
 endrgb = colorConv(end);
 er = endrgb[0];
 eg = endrgb[1];
 eb = endrgb[2];
 if(!target.r) {
 startrgb = colorConv(start);
 r = startrgb[0];
 g = startrgb[1];
 b = startrgb[2];
 target.r = r;
 target.g = g;
 target.b = b;
 }
 rint = Math.round(Math.abs(target.r-er)/steps);
 gint = Math.round(Math.abs(target.g-eg)/steps);
 bint = Math.round(Math.abs(target.b-eb)/steps);
 if(rint == 0) { rint = 1 }
 if(gint == 0) { gint = 1 }
 if(bint == 0) { bint = 1 }
 target.step = 1;
 target.timer = setInterval( function() { animateColor(id,element,steps,er,eg,eb,rint,gint,bint) }, speed);
}
// incrementally close the gap between the two colors //
function animateColor(id,element,steps,er,eg,eb,rint,gint,bint) {
 var target = document.getElementById(id);
 var color;
 if(target.step <= steps) {
 var r = target.r;
 var g = target.g;
 var b = target.b;
 if(r >= er) {
 r = r - rint;
 } else {
 r = parseInt(r) + parseInt(rint);
 }
 if(g >= eg) {
 g = g - gint;
 } else {
 g = parseInt(g) + parseInt(gint);
 }
 if(b >= eb) {
 b = b - bint;
 } else {
 b = parseInt(b) + parseInt(bint);
 }
 color = 'rgb(' + r + ',' + g + ',' + b + ')';
 if(element == 'background') {
 target.style.backgroundColor = color;
 } else if(element == 'border') {
 target.style.borderColor = color;
 } else {
 target.style.color = color;
 }
 target.r = r;
 target.g = g;
 target.b = b;
 target.step = target.step + 1;
 } else {
 clearInterval(target.timer);
 color = 'rgb(' + er + ',' + eg + ',' + eb + ')';
 if(element == 'background') {
 target.style.backgroundColor = color;
 } else if(element == 'border') {
 target.style.borderColor = color;
 } else {
 target.style.color = color;
 }
 }
}

// convert the color to rgb from hex //
function colorConv(color) {
 var rgb = [parseInt(color.substring(0,2),16),
 parseInt(color.substring(2,4),16),
 parseInt(color.substring(4,6),16)];
 return rgb;
}