function addeventhandlers() {
  if (document.getElementsByTagName) {
     var links=document.getElementsByTagName("a");
     for (var i=0;i<links.length;i++) {
        if (links[i].className=="i" || links[i].className=="e" || links[i].className=="m") {
	   if (links[i].id=="") links[i].id="fade"+i; // if no id assign one
           eval("timer_linkfade_"+links[i].id+"=null");
	   try {
              links[i].addEventListener('mouseover', function() { linkfade(true,this.id,this.className) }, false);
	      links[i].addEventListener('mouseout', function() { linkfade(false,this.id,this.className) }, false);
              links[i].addEventListener('focus', function() { linkfade(true,this.id,this.className) }, false);
	      links[i].addEventListener('blur', function() { linkfade(false,this.id,this.className) }, false);
           } catch (exception) {
             // ah sod it, i can't be arsed. sod inernet explorer and it's lack of support for dom methods.
           }
	}
     }
     timer_linkfade_totop=null;
     try {
	document.getElementById("totop").addEventListener('mouseover', function() { linkfade(true,this.id,"i") }, false);
	document.getElementById("totop").addEventListener('mouseout', function() { linkfade(false,this.id,"i") }, false);
     } catch (exception) {
           //links[i].onmouseover=addBehavior
     }
  }
  timersdone=true;
}

function linkfade(s,o,t) {
   if (document.getElementById && timersdone) {
      eval("clearTimeout(timer_linkfade_"+o+")");
      var sc,sf,st;
	  var steps=15;
	  var delay=50;
      switch (t) {
	     case "i":sc=lc_i;fc=lc_i_h;break;
	     case "e":sc=lc_e;fc=lc_e_h;break;
 	     case "m":sc=lc_m;fc=lc_m_h;break;
	  }
      var c=eval("document.getElementById('"+o+"').style.color");

	  if (!c) c=sc;
      if (!s) { tc=sc;sc=fc;fc=tc } // switch start and finish colours
	  var sca=new Array(getrgbcolorvalue(sc,"r"),getrgbcolorvalue(sc,"g"),getrgbcolorvalue(sc,"b"));
  	  var fca=new Array(getrgbcolorvalue(fc,"r"),getrgbcolorvalue(fc,"g"),getrgbcolorvalue(fc,"b"));
      var cca=new Array(getrgbcolorvalue(c,"r"),getrgbcolorvalue(c,"g"),getrgbcolorvalue(c,"b"));

      var dr=fca[0]-sca[0];
      var dg=fca[1]-sca[1];
      var db=fca[2]-sca[2];
      var sr=Math.floor(dr/steps);
      var sg=Math.floor(dg/steps);
      var sb=Math.floor(db/steps);
      var r=cca[0]+sr;
      var g=cca[1]+sg;
      var b=cca[2]+sb;
      if (r<0) r=0;
      if (g<0) g=0;
      if (b<0) b=0;

      if ((fca[0]>sca[0]) && r>fca[0]) r=fca[0];
      if ((fca[1]>sca[1]) && g>fca[1]) g=fca[1];
      if ((fca[2]>sca[2]) && b>fca[2]) b=fca[2];

      if ((fca[0]<sca[0]) && r<fca[0]) r=fca[0];
      if ((fca[1]<sca[1]) && g<fca[1]) g=fca[1];
      if ((fca[2]<sca[2]) && b<fca[2]) b=fca[2];

      eval("document.getElementById('"+o+"').style.color='rgb("+r+","+g+","+b+")'");
      if (fca[0]==r && fca[1]==g && fca[2]==b) {
           // nothing
      } else {
	     eval("timer_linkfade_"+o+"=setTimeout(\"linkfade(\"+s+\",'\"+o+\"','\"+t+\"')\",delay)");
	  }
   }
}

function getrgbcolorvalue(c,v) {
   var rv=999;
   if (c.indexOf("#")!=-1) { // some browsers (opera for one) will report the value in hex even if it was set in rgb
      switch(v) {
         case "r" : rv=parseInt(c.substring(1,3),16);break;
         case "g" : rv=parseInt(c.substring(3,5),16);break;
         case "b" : rv=parseInt(c.substring(5,c.length),16);break;
      }
   } else if (c.indexOf("rgb(")!=-1) {
      var tmp=c.substring(c.indexOf("(")+1,c.indexOf(")"));
      tmp=tmp.split(",");
      for (i=0;i<tmp.length;i++) tmp[i]=parseInt(tmp[i],10); // mozilla returns whitespace in the rgb value so remove with parseInt
      switch (v) {
         case "r" : rv=tmp[0];break;
         case "g" : rv=tmp[1];break;
         case "b" : rv=tmp[2];break;
      }
   }
   return rv;
}

function gethexvalue(n) {
   var nh1;
   var nh2;
   var hex="0123456789ABCDEF";
   nh1=hex.charAt(Math.floor(n/16));
   nh2=hex.charAt(num%16);
   return nh1+nh2;
}

