function setOpacity(el, value) {
  el.style.opacity = value / 100;
  el.style.filter = "alpha(opacity=" + value + ")";
}

function fade(el, interval, deltaOpacity /*, init*/) {
  if(!el.fader)
    el.fadeValue = arguments.length > 3
      ? arguments[3]
      : 100;
  else
    el.fader.clear();
  el.fader = new TimeoutChainer({
    context: el,
    callback: setOpacity,
    interval: interval,
    numTimes: el.fadeValue,
    args: [el, {
      valueOf: function() {
        el.fadeValue -= deltaOpacity;
        if(el.fadeValue < 0) el.fadeValue = 0;
        return el.fadeValue;
      }
    }]
  });
  return el.fader;
}

function unfade(el, interval, deltaOpacity /*, init*/) {
  if(!el.fader)
    el.fadeValue = arguments.length > 3
      ? arguments[3]
      : 100;
  else
    el.fader.clear();
  el.fader = new TimeoutChainer({
    context: el,
    callback: setOpacity,
    interval: interval,
    numTimes: 100 - el.fadeValue,
    args: [el, {
      valueOf: function() {
        el.fadeValue += deltaOpacity;
        if(el.fadeValue > 100) el.fadeValue = 100;
        return el.fadeValue;
      }
    }]
  });
  return el.fader;
}