/*
 * Richard A. DeVenezia
 * Copyright 2003
 *
 * trails.js
 *
 * Mouse trails by background hightlighting, with fade to white background
 */

  trails =
  { overColor: '#7093DB'
  , outColor:  '#FFFFFF'
  , inTransition : 0  // when this is 1, over and out must wait
  , noTransition : 0  // when this is 1, doTransition must wait
  , transitions : []  // cells in transition
  , timerId : 0
  , transitionSteps : 20        // bigger -> smoother gradient and more calculations
  , transitionStepDuration : 20 // ms, steps * duration = duration of transition
  }

  //---------------------------------------------------------------------------
  trails.removeElement = function (array, index)
  {
    if (array.length == 0) return
    for (var i=index; i<array.length-1 && i>=0;i++) {
      array[i] = array[i+1]
    }
    array.length=array.length-1
  }

  //---------------------------------------------------------------------------
  trails.htmlColorString = function (r,g,b)
  {
    var r = r.toString(16); if (r.length == 1) r = '0'+r;
    var g = g.toString(16); if (g.length == 1) g = '0'+g;
    var b = b.toString(16); if (b.length == 1) b = '0'+b;

    return "#" + r + g + b
  }

  //---------------------------------------------------------------------------
  trails.transition = function (obj)
  {
    this.obj = obj
    this.step = trails.transitionSteps
  }

  //---------------------------------------------------------------------------
  trails.transition.prototype.doStep = function ()
  {
    this.step --;

    var from  = trails.overColor.substr(1)
    var   to  = trails.outColor.substr(1)
    var steps = trails.transitionSteps

    var step  = this.step

    var r0 = parseInt (from.substr(0,2),16)
    var g0 = parseInt (from.substr(2,2),16)
    var b0 = parseInt (from.substr(4,2),16)

    var r1 = parseInt (  to.substr(0,2),16)
    var g1 = parseInt (  to.substr(2,2),16)
    var b1 = parseInt (  to.substr(4,2),16)

    var r = Math.floor (r1 * ((steps-step)/steps) + r0 * (step/steps))
    var g = Math.floor (g1 * ((steps-step)/steps) + g0 * (step/steps))
    var b = Math.floor (b1 * ((steps-step)/steps) + b0 * (step/steps))

    var color = trails.htmlColorString (r,g,b)

    this.obj.style.backgroundColor = color
  }

  //---------------------------------------------------------------------------
  trails.doTransitions = function ()
  {
    while (trails.noTransition) {}

    trails.inTransition = 1

    var L = trails.transitions.length

    for (var i=L-1; i>=0; i--) {
      trails.transitions[i].doStep()
      if (! trails.transitions[i].step) trails.removeElement (trails.transitions, i)
    }

    if (trails.transitions.length)
      trails.timerId = setTimeout ("trails.doTransitions()", trails.transitionStepDuration)
    else
      trails.timerId = 0

    trails.inTransition = 0
  }

  //---------------------------------------------------------------------------
  trails.over = function (O)
  {
    while (trails.inTransition) {}

    trails.noTransition = 1

    var L = trails.transitions.length
    for (var i=L-1; i>=0; i--) {
      if (trails.transitions[i].obj == O) trails.removeElement (trails.transitions, i)
    }

    trails.noTransition = 0

    O.style.backgroundColor = trails.overColor
  }

  //---------------------------------------------------------------------------
  trails.out = function (O)
  {
    while (trails.inTransition) {}

    trails.noTransition = 1

    trails.transitions.push ( new trails.transition (O) )

    trails.noTransition = 0

    if ( !trails.timerId ) trails.timerId = setTimeout ( "trails.doTransitions()", 0)
  }
