/* color shifting code */

/* initial parameters, these can vary. */
var cshiftParameters = 
{ 
  useMozStyle: false,
  ruleSelector: 'rules',
  ruleProperty: 'backgroundColor',
  initialized: false
};

/* elements to perform colorshifting on. */
var cshiftElements = new Object();

function cshiftInitialize()
{
  if(!cshiftParameters.initialized)
  {
    if(document.styleSheets[0].cssRules)
    {
      cshiftParameters.useMozStyle = true;
      cshiftParameters.ruleSelector = 'cssRules';
      cshiftParameters.ruleProperty = 'background-color';
    }
    cshiftParameters.initialized = true;
  }
}

function cshiftSearchForRules(className)
{
  var sheet, rule;
  var x = { stylesheet: -1, rule: -1 };

  for(sheet = 0; sheet < document.styleSheets.length; sheet++)
  {
    for(rule = 0; rule < document.styleSheets[sheet][cshiftParameters.ruleSelector].length; rule++)
    {
      if(document.styleSheets[sheet][cshiftParameters.ruleSelector][rule].selectorText)
      {
        if(document.styleSheets[sheet][cshiftParameters.ruleSelector][rule].selectorText == className)
	{
	  x.stylesheet = sheet;
	  x.rule = rule;
	  return(x);
	}
      }
    }
  }
  return(x);
}

function cshiftSetCSSClassProperty(stylesheet, rule, property, value)
{
  if(cshiftParameters.useMozStyle)
    document.styleSheets[stylesheet][cshiftParameters.ruleSelector][rule].style.setProperty(property, value, '');
  else
    document.styleSheets[stylesheet][cshiftParameters.ruleSelector][rule].style[property] = value;
}

function cshiftInterpolate(x0, n, z, x1)
{
  return(Math.floor((((x1 - x0) * n) / z) + x0));
}

function cshiftExecute(groupname)
{
  var r, g, b, propValue, step, i;

  step = ++cshiftElements[groupname].step;
  for(i = 0; i < cshiftElements[groupname].elements.length; i++)
  {
    r = cshiftInterpolate(cshiftElements[groupname].elements[i].srcColor.r, step,
                          cshiftElements[groupname].steps,
			  cshiftElements[groupname].elements[i].dstColor.r);
    g = cshiftInterpolate(cshiftElements[groupname].elements[i].srcColor.g, step,
                          cshiftElements[groupname].steps,
			  cshiftElements[groupname].elements[i].dstColor.g);
    b = cshiftInterpolate(cshiftElements[groupname].elements[i].srcColor.b, step,
                          cshiftElements[groupname].steps,
			  cshiftElements[groupname].elements[i].dstColor.b);

    if(cshiftParameters.useMozStyle)
      propValue = '#' + r.toString(16) + g.toString(16) + b.toString(16);
    else
      propValue = 'rgb(' + r + ', ' + g + ', ' + b + ')';
    if(cshiftElements[groupname].elements[i].className && 
       cshiftElements[groupname].elements[i].stylesheet >= 0)
      cshiftSetCSSClassProperty(cshiftElements[groupname].elements[i].stylesheet,
                                cshiftElements[groupname].elements[i].rule,
				cshiftParameters.ruleProperty,
				propValue);
    else if(cshiftElements[groupname].elements[i].element)
      cshiftElements[groupname].elements[i].element.style.backgroundColor = propValue;
  }

  if(step == cshiftElements[groupname].steps)
  {
    window.clearInterval(cshiftElements[groupname].intervalId);
    cshiftElements[groupname].intervalId = null;
    cshiftElements[groupname].step = 0;
  }
}

function cshiftAddElement(e)
{
  var i, x;

  cshiftInitialize();
  if(!cshiftElements[e.group])
  {
    cshiftElements[e.group] = new Object();
    cshiftElements[e.group].steps = (e.steps && e.steps > 0 ? e.steps : 20);
    cshiftElements[e.group].interval = (e.interval && e.interval > 0 ? e.interval : 500/cshiftElements[e.group].steps);
    cshiftElements[e.group].elements = new Array();
    cshiftElements[e.group].intervalId = null;
    cshiftElements[e.group].step = 0;
  }

  i = cshiftElements[e.group].elements.length;
  cshiftElements[e.group].elements[i] = new Object();
  if(e.className && e.className != '')
  {
    cshiftElements[e.group].elements[i].className = e.className;
    x = cshiftSearchForRules(e.className);
    if(x.stylesheet >= 0)
    {
      cshiftElements[e.group].elements[i].stylesheet = x.stylesheet;
      cshiftElements[e.group].elements[i].rule = x.rule;
    }
    else
    {
      cshiftElements[e.group].elements[i].stylesheet = -1;
      cshiftElements[e.group].elements[i].rule = -1;
    }
  }
  else if(e.Id && e.Id != '')
    cshiftElements[e.group].elements[i].element = document.getElementById(e.Id);

  cshiftElements[e.group].elements[i].srcColor = e.srcColor;
  cshiftElements[e.group].elements[i].dstColor = e.dstColor;
}

function cshiftFire(groupname)
{
  cshiftInitialize();

  if(!cshiftElements[groupname] || cshiftElements[groupname].elements.length == 0 ||
     cshiftElements[groupname].intervalId)
    return;

  cshiftElements[groupname].step = 0;
  cshiftElements[groupname].intervalId = window.setInterval('cshiftExecute("' + groupname + '");', cshiftElements[groupname].interval);
}
