function blinkColor(objid, blinkcolor, blinkrate, objtype, blinkcount, currentcount)  {

   if (!currentcount)
      currentcount = 0;

   if (currentcount > (blinkcount * 2))
      return;

   if (currentcount == 0)  {
      var params = "blinkColor(\'" + objid + "\',\'" + blinkcolor + "\'," + blinkrate + ",\'" +objtype + "\'," + blinkcount + "," + (currentcount + 1) + ")"
      setTimeout(params, blinkrate);
      return;
   }
      
   var obj = document.getElementById(objid);
   var objstyle = obj.style;
   switch (objtype)  {
      case 'b':
         var objcolor = objstyle.backgroundColor;
         objstyle.backgroundColor = blinkcolor;
         break;
      case 'f':
         var objcolor = objstyle.color;
         objstyle.color = blinkcolor;
         break;
      case 'r':
         var objcolor = objstyle.borderColor;
         objstyle.borderColor = blinkcolor;
         break;
   }

   var params = "blinkColor(\'" + objid + "\',\'" + objcolor + "\'," + blinkrate + ",\'" +objtype + "\'," + blinkcount + "," + (currentcount + 1) + ")"
   setTimeout(params, blinkrate);

}


function numsign(somevalue)   {

   if (somevalue == 0)
      return 0;
   else
      if (somevalue < 0)
         return -1;
      else
         return 1;

}

function GetFadeMult(currentcolor, destcolor, fadepercent)   {

   var fademult = 1;
   if (currentcolor > destcolor)
   {
      fademult = 1 - fadepercent;
   }
   if (currentcolor < destcolor)
   {
      fademult = 1 + fadepercent;
   }

   return fademult;

}

function GetNextColor(currentcolor, destcolor, fademult)  {

   var nextcolor = currentcolor;
   if (fademult > 1)
      nextcolor = (currentcolor + 1) * fademult; 
   else
      nextcolor = currentcolor * fademult; 

   if (currentcolor > destcolor && nextcolor < destcolor)
   {
      nextcolor = destcolor;
   }
   if (currentcolor < destcolor && nextcolor > destcolor)
   {
      nextcolor = destcolor;
   }

   return parseInt(nextcolor);
}

function GetColorHex(somecolor)  {
   var colorhex = parseInt(somecolor).toString(16); 
   if (colorhex.length == 1)
   {
      colorhex = '0' + colorhex;  
   }

   return colorhex;
}

function FadeToColor(objid, destcolorhex, delay, maxstep, objtype)   {

   var destred = parseInt(destcolorhex.substring(1, 3), 16);
   var destgreen = parseInt(destcolorhex.substring(3, 5), 16);
   var destblue = parseInt(destcolorhex.substring(5, 7), 16);

   var obj = document.getElementById(objid);
   var objstyle = obj.style;
   var objcolor;
   if (objtype == "b")
      objcolor = objstyle.backgroundColor;
   else
      objcolor = objstyle.color;
      
   var currentred = parseInt(objcolor.substring(1, 3), 16);
   var currentgreen = parseInt(objcolor.substring(3, 5), 16);
   var currentblue = parseInt(objcolor.substring(5, 7), 16);

   var reddiff = Math.abs(currentred - destred);
   var greendiff = Math.abs(currentgreen - destgreen);
   var bluediff = Math.abs(currentblue - destblue);
   var maxdiff = Math.max(Math.max(reddiff, greendiff), bluediff);

   var reddir;
   var greendir;
   var bluedir;

   switch (maxdiff)   {
      case reddiff:
         switch (numsign(destred - currentred))  {
            case 0:
               reddir = 0;
               break;
            case -1:
               reddir = maxstep * -1;
               break;
            case 1:
               reddir = maxstep;
               break;
         }
         if (reddir == 0)
            return;

         greendir = ((destgreen - currentgreen) / (destred - currentred)) * reddir;
         bluedir = ((destblue - currentblue) / (destred - currentred)) * reddir;
         break;

      case greendiff:
         switch (numsign(destgreen - currentgreen))  {
            case 0:
               greendir = 0;
               break;
            case -1:
               greendir = maxstep * -1;
               break;
            case 1:
               greendir = maxstep;
               break;
         }
         if (greendir == 0)
            return;

         reddir = ((destred - currentred) / (destgreen - currentgreen)) * greendir;
         bluedir = ((destblue - currentblue) / (destgreen - currentgreen)) * greendir;
         break;

      case bluediff:
         switch (numsign(destblue - currentblue))  {
            case 0:
               bluedir = 0;
               break;
            case -1:
               bluedir = maxstep * -1;
               break;
            case 1:
               bluedir = maxstep;
               break;
         }
         if (bluedir == 0)
            return;

         reddir = ((destred - currentred) / (destblue - currentblue)) * bluedir;
         greendir = ((destgreen - currentgreen) / (destblue - currentblue)) * bluedir;
         break;

   }

   var params = "AdjustColor(\'" + objid + "\'," + reddir + "," + greendir + "," + bluedir + "," + currentred + "," + currentgreen + "," + currentblue + "," + destred + "," + destgreen + "," + destblue + ", \'" + destcolorhex + "\'," + delay + ",\'" + objtype + "\')"
   setTimeout(params, delay);   
      

}

function AdjustColor(objid, reddir, greendir, bluedir, currentred, currentgreen, currentblue, destred, destgreen, destblue, destcolorhex, delay, objtype)   {

   var obj = document.getElementById(objid);
   var objstyle = obj.style;

   var nextred = currentred + reddir;
   var nextgreen = currentgreen + greendir;
   var nextblue = currentblue + bluedir;

   switch (numsign(reddir))  {
      case -1:
         if (nextred < destred)
            nextred = destred;
         break;
      case 1:
         if (nextred > destred)
            nextred = destred;
         break;
   }

   switch (numsign(greendir))  {
      case -1:
         if (nextgreen < destgreen)
            nextgreen = destgreen;
         break;
      case 1:
         if (nextgreen > destgreen)
            nextgreen = destgreen;
         break;
   }

   switch (numsign(bluedir))  {
      case -1:
         if (nextblue < destblue)
            nextblue = destblue;
         break;
      case 1:
         if (nextblue > destblue)
            nextblue = destblue;
         break;
   }

   var colorhex = '#' + GetColorHex(nextred) + GetColorHex(nextgreen) + GetColorHex(nextblue);

   if (objtype == "b")
      objstyle.backgroundColor = colorhex;
   else
      objstyle.color = colorhex;

   if (colorhex.toUpperCase() != destcolorhex.toUpperCase())  {
      var params = "AdjustColor(\'" + objid + "\'," + reddir + "," + greendir + "," + bluedir + "," + nextred + "," + nextgreen + "," + nextblue + "," + destred + "," + destgreen + "," + destblue + ", \'" + destcolorhex + "\'," + delay + ",\'" + objtype + "\')"
      setTimeout(params, delay);   
   }
}
