  function DecodeColor(colstring) {
    colors=colstring.substring(4, colstring.length-1);
    colarray=colors.split(",");
    result=new Array(3);
    result[0]=parseInt(colarray[0]);
    result[1]=parseInt(colarray[1]);
    result[2]=parseInt(colarray[2]);
    return result;
  }
  animations=new Array();
  var intervalvar=0;
  function FadeTo(Obj, tocolor) {
    StartAnimation(Obj, Obj.style.backgroundColor, tocolor, 100);
  }
  function StartAnimation(Obj, fromcolor, tocolor, colspeed) {
   //nach vorhandenem suchen
    found=-1;
    for (i=0; i<animations.length; i++) {
      if (animations[i][0]==Obj) {
        found=i;
        break;
      }
    }
    fromcol=DecodeColor(fromcolor);      
    tocol=DecodeColor(tocolor);
    divcol=new Array(3);
    div=0;
    for (i=0; i<3; i++) {
      divcol[i]=tocol[i]-fromcol[i];
      div+=Math.abs(divcol[i]);
    }
    colspeed=colspeed/(div*7);
    if (found==-1) {
      newanimation=new Array(Obj, fromcol, divcol, colspeed, 0);
      animations.push(newanimation);
      if (intervalvar==0)
        intervalvar=window.setInterval("UpdateAnimations()", 50);
    }
    else {
      animations[found][1]=fromcol;
      animations[found][2]=divcol;
      animations[found][3]=colspeed;
      animations[found][4]=0;
    }
  }
  function UpdateAnimations() {
    var r, g, b;
    var i, e, N;
    e=0;
    i=0;
    N=animations.length;
    for (e=0; e<animations.length; e++) {
      ani=animations[e];
      step=ani[4];
      step+=ani[3];
      if (step>1)
        step=1;
      ani[4]=step;
      from=ani[1];
      div=ani[2];
      r=parseInt(from[0]+step*div[0]);
      g=parseInt(from[1]+step*div[1]);
      b=parseInt(from[2]+step*div[2]);
      ani[0].style.backgroundColor="rgb("+r+","+g+","+b+")";
      if (step==1)
        N--;
      else {
        animations[i]=ani;
        i++;
      }
    }
    while (animations.length>N)
      animations.pop();
    if (animations.length==0) {
      window.clearInterval(intervalvar);
      intervalvar=0;
    } 
  }

function Colorlinks() {
  col_norm = new Array('rgb(96,96,130)', 'rgb(96,96,130)', 'rgb(96,96,130)', 'rgb(96,96,130)');
  col_move = new Array('rgb(50,50,100)', 'rgb(80,0,0)', 'rgb(110,80,40)', 'rgb(0,70,0)');
  col_over = new Array('rgb(70,70,120)', 'rgb(120,20,20)', 'rgb(140,110,70)', 'rgb(30,100,30)');
  var groups = document.getElementsByTagName("table");
  var i, e, box=0;
  for (i=0; i<groups.length; i++)
    if (groups[i].className == "links") {
      groups[i].style.backgroundColor = col_norm[box];
      groups[i].onmouseout  = new Function("FadeTo(this, '" + col_norm[box] + "');");
      groups[i].onmouseover = new Function("FadeTo(this, '" + col_move[box] + "');");
      rowover = new Function("this.style.backgroundColor = '" + col_over[box] + "';");
      rowout  = new Function("this.style.backgroundColor = '';");
      rows = groups[i].getElementsByTagName("tr");
      for (e=0; e<rows.length; e++) {
        rows[e].onmouseover = rowover;
        rows[e].onmouseout  = rowout;
      }
      box++;
    }
}
/* Event Registrar, Simon Willison */
function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function')
    window.onload = func;
  else {
    window.onload = function() { oldonload(); func(); }
  }
}
addLoadEvent(Colorlinks);
