// 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;

}
