// Initialization

var isNS      = (document.layers);
var isGecko   = (navigator.userAgent.indexOf("Gecko") >= 0);

if (isGecko) isNS = true;

var layerObj  = (isNS) ? 'document' : 'document.all';
var styleObj  = (isNS) ? '' : '.style';
var leftObj   = (isNS) ? '.left' : '.pixelLeft';
var topObj    = (isNS) ? '.top' : '.pixelTop';
var widthObj  = (isNS) ? 'window.innerWidth' : 'document.body.clientWidth';
var heightObj = (isNS) ? 'window.innerHeight' : 'document.body.clientHeight';
var plusPx    = '';

loaded      = 0;

if (isGecko)
{
  styleObj = '.style';
  plusPx = ' + "px"';
  layerObj = 'document.ids';
  //alert("Gecko " + layerObj + " / " + styleObj + " / " + leftObj + " / " + widthObj);
}

springModel = 3;
accelModel  = 2;
velocModel  = 1;
homeCount   = 0;
collected   = 0;
mode        = 0;
framepos    = 0;
springG     = 0.15;
springW     = Math.sqrt(1 - Math.pow(springG, 2));

xPos  = new Array(boxes + 1);
yPos  = new Array(boxes + 1);
destX = new Array(boxes + 1);
destY = new Array(boxes + 1);
velX  = new Array(boxes + 1);
velY  = new Array(boxes + 1);
frict = new Array(boxes + 1);
model = new Array(boxes + 1);
ampX  = new Array(boxes + 1);
ampY  = new Array(boxes + 1);
time  = new Array(boxes + 1);
layerRefs = new Array(boxes + 1);

clearVelocities();
resetFriction();
initializePositions();
setModels(accelModel);

function moveLayer(layerReference, layerNumber)
{
  if (layerReference)
  {
    if ((Math.round(xPos[layerNumber]) != destX[layerNumber]) || (Math.round(yPos[layerNumber]) != destY[layerNumber]))
    {
      if (model[layerNumber] == springModel)
      {
        time[layerNumber] += 0.25;

        xPos[layerNumber] = destX[layerNumber] + ampX[layerNumber] * Math.sin(springW * time[layerNumber]) * Math.exp(-springG * time[layerNumber]);
        yPos[layerNumber] = destY[layerNumber] + ampY[layerNumber] * Math.sin(springW * time[layerNumber]) * Math.exp(-springG * time[layerNumber]);
      }
      else
      {
        diffx = (destX[layerNumber] - xPos[layerNumber]);
        diffy = (destY[layerNumber] - yPos[layerNumber]);

        // Acceleration model
        if (model[layerNumber] == accelModel)
        {
          velX[layerNumber] += diffx * 0.01;
          velY[layerNumber] += diffy * 0.01;

          velX[layerNumber] -= velX[layerNumber] * frict[layerNumber];
          velY[layerNumber] -= velY[layerNumber] * frict[layerNumber];

          diffx = velX[layerNumber];
          diffy = velY[layerNumber];
        }

        // Default velocity model
        else
        {
          if ((diffx > 1) || (diffx < -1))
            diffx = (diffx * 0.10);
          if ((diffy > 1) || (diffy < -1))
            diffy = (diffy * 0.10);

          velX[layerNumber] = diffx;
          velY[layerNumber] = diffy;
        }

        xPos[layerNumber] += diffx;
        yPos[layerNumber] += diffy;
      }

      eval('layerReference' + styleObj + leftObj + ' = Math.round(xPos[layerNumber])' + plusPx + ';');
      eval('layerReference' + styleObj + topObj + ' = Math.round(yPos[layerNumber])' + plusPx + ';');

      return 0;
    }
    else
    {
      // Home, clear velocity and friction
      velX[layerNumber] = 0;
      velY[layerNumber] = 0;
      frict[layerNumber] = 0.1;
      
      return 1;
    }
  }
  else
    return 0;
}

function bounceLayer()
{
  home = 0;

  for (i = 1; i <= boxes; i++)
  {
    home += moveLayer(layerRefs[i], i);
  }

  if (mode > 0)
  {
    framepos++;
    
    if (mode == 1)
    {
      if (framepos % 10 == 1)
      {
        randomize();
      }
      if (framepos == 100)
      {
        collect();
      }
    }
    else if (mode == 2)
    {
      box = framepos % 90;
      if ((box >= 1) && (box <= 6))
      {
        destX[box] = 250 + (box * 40);
        destY[box] = 398;
      }

      box = (framepos + 45) % 90;
      if ((box >= 1) && (box <= 6))
      {
        destX[box] = 530 - (box * 40);
        destY[box] = 113;
      }

      if (framepos == 180)
      {
        collect();
      }
    }
    else if (mode == 3)
    {
      box = (framepos % 24) / 4 + 1;
      if ((box >= 1) && (box <= 6))
      {
        destX[box] = (framepos / 4 + box) * 20 - 100;
        destY[box] = 56;
      }
      if (framepos == 240)
      {
        collect();
      }
    }
    else if (mode == 4)
    {
      if (framepos == 90)
      {
        setModels(accelModel);
      }

      if ((framepos >= 90) && (framepos <= 140) && (framepos % 10 == 0))
      {
        box = (framepos - 80) / 10;
        setupSpiral(box);
      }
      else if (framepos > 300)
      {
        for (box = 1; box <= 6; box++)
        {
          frict[box] += 0.001;
        }
      }

      if (framepos == 400)
      {
        collect();
      }
    }
    else if ((mode == 5) || (mode == 6))
    {
      if ((framepos >= 70) && (framepos <= 95) && (framepos % 5 == 0))
      {
        box = (framepos - 65) / 5;
        destY[box] = 398;
        if (mode == 6)
        {
          destX[box] = 530 - box * 40;
        }
        setupSpring(box);
      }
      if (framepos == 280)
      {
        collect();
      }
    }
  }
  else
  {
    if (home == 6)
    {
      homeCount += 1;
      if (homeCount == 100)
        collect();
    }

    if (collected == 3)
    {
      scatter();
    }
  }
}

function setModels(modelType)
{
  resetFriction();

  for (i = 1; i <= 6; i++)
  {
    model[i] = modelType;
  }
}

function setupSpring(box)
{
  model[box] = springModel;
  ampX[box]  = xPos[box] - destX[box];
  ampY[box]  = yPos[box] - destY[box];
  time[box]  = 0;
}

function initializePositions()
{
  for (i = 1; i <= 6; i++)
  {
    xPos[i] = 11;
    yPos[i] = 11;
  }
}

function resetFriction()
{
  for (i = 1; i <= 6; i++)
  {
    frict[i] = 0.1;
  }
}

function clearVelocities()
{
  resetFriction();

  for (i = 1; i <= 6; i++)
  {
    velX[i] = 0;
    velY[i] = 0;
  }
}

function setupSpiral(layerNumber)
{
  destX[layerNumber] = 500;
  destY[layerNumber] = 144;

  diffx    = (destX[layerNumber] - xPos[layerNumber]);
  diffy    = (destY[layerNumber] - yPos[layerNumber]);
  theta    = Math.abs(Math.atan2(diffy, diffx));
  radius   = Math.sqrt(Math.pow(diffx, 2) * Math.pow(diffy, 2));
  velocity = 10000 / Math.sqrt(radius);

  velX[layerNumber] = Math.abs(velocity * Math.sin(theta));
  velY[layerNumber] = -Math.abs(velocity * Math.cos(theta));

  if ((diffx < 0) && (diffy < 0))
  {
    velX[layerNumber] *= -1;
  }
  else if ((diffx >= 0) && (diffy < 0))
  {
    velX[layerNumber] *= -1;
    velY[layerNumber] *= -1;
  }
  else if ((diffx >= 0) && (diffy >= 0))
  {
    velY[layerNumber] *= -1;
  }

  frict[layerNumber] = 0.02;
}

function raiseBox(layerNumber)
{
  if (isNS)
  {
    top = 100;
    for (i = 1; i <= 6; i++)
    {
      layerReference = layerRefs[i];
      if (layerReference)
      {
  	  if (layerNumber == i)
          eval('layerReference' + styleObj + '.zIndex = 100;');
  	  else
  	    eval('layerReference' + styleObj + '.zIndex = 0;');
      }
    }
  }
}

function rollover(x, y, raiseLayer)
{
  mode = 0;
  framepos = 0;
  collected = 0;

  setModels(accelModel);
  raiseBox(raiseLayer);

  for (box = 1; box <= 6; box++)
  {
    destX[box] = x;
    destY[box] = y;
  }
  
  homeCount = 0;
}

function rolloff()
{
  raiseBox(getDefaultLayer());

  if (collected == 0)
  {
    mode = 0;
    framepos = 0;
    homeCount = 0;

    randomize();
  }
}

function setDestinationsToHome()
{
  for (box = 1; box <= 6; box++)
  {
    destX[box] = 500;
    destY[box] = 144;
  }
}

function setupLayerReferences()
{
  for (box = 1; box <= boxes; box++)
  {
    layerName = "box" + box;
    layerRefs[box] = null;
    setupLayerReference(layerName, box);
  }
}

function setupLayerReference(layerName, layerNumber)
{
  layerRefs[layerNumber] = getLayerByName(layerName);
}

function getLayerByName(layerName)
{
  if (isGecko)
    return document.getElementById(layerName);
  else
    return eval(layerObj + '[layerName]');
}

function randomize()
{
  setModels(velocModel);

  for (box = 1; box <= 6; box++)
  {
    eval('destX[box] = Math.floor(Math.random() * ' + widthObj + ') - 20;');
    eval('destY[box] = Math.floor(Math.random() * ' + heightObj + ') - 20;');
  }
}

function collect()
{
  mode = 0;
  framepos = 0;
  homeCount = 0;
  collected += 1;
  resetFriction();
  setModels(accelModel);

  raiseBox(getDefaultLayer());

  setDestinationsToHome()
}

function scatter()
{
  collected = 0;
  framepos = 0;
  mode = 0;
  resetFriction();
  setModels(velocModel);

  scatterMode = Math.floor(Math.random() * 10);
  //scatterMode = Math.floor(Math.random() * 500);

  if (scatterMode == 0)
  {
    destX[1] = -60;
    destY[1] = -60;
    destX[2] = -60;
    eval('destY[2] = Math.floor(' + heightObj + ' / 2);');
    destX[3] = -60;
    eval('destY[3] = ' + heightObj + ' + 60;');
    eval('destX[4] = ' + widthObj + ' + 60;');
    destY[4] = -60;
    eval('destX[5] = ' + widthObj + ' + 60;');
    eval('destY[5] = Math.floor(' + heightObj + ' / 2);');
    eval('destX[6] = ' + widthObj + ' + 60;');
    eval('destY[6] = ' + heightObj + ' + 60;');
  }
  else if (scatterMode == 1)
  {
    destX[1] = 290;
    destY[1] = 113;
    destX[2] = 320;
    destY[2] = 113;
    destX[3] = 350;
    destY[3] = 113;
    destX[4] = 380;
    destY[4] = 113;
    destX[5] = 410;
    destY[5] = 113;
    destX[6] = 440;
    destY[6] = 113;
  }
  else if (scatterMode == 2)
  {
    eval('destX[1] = ' + widthObj + ' - 40;');
    destY[1] = 20;
    eval('destX[2] = ' + widthObj + ' - 40;');
    destY[2] = 50;
    eval('destX[3] = ' + widthObj + ' - 40;');
    destY[3] = 80;
    eval('destX[4] = ' + widthObj + ' - 40;');
    destY[4] = 110;
    eval('destX[5] = ' + widthObj + ' - 40;');
    destY[5] = 140;
    eval('destX[6] = ' + widthObj + ' - 40;');
    destY[6] = 170;
  }
  else if (scatterMode == 3)
  {
    destX[1] = 170;
    destY[1] = 113;
    destX[2] = 170;
    destY[2] = 170;
    destX[3] = 170;
    destY[3] = 227;
    destX[4] = 170;
    destY[4] = 284;
    destX[5] = 170;
    destY[5] = 341;
    destX[6] = 170;
    destY[6] = 398;
  }
  else if (scatterMode == 4)
  {
    mode = 1;
  }
  else if (scatterMode == 5)
  {
    mode = 2;
  }
  else if (scatterMode == 6)
  {
    mode = 3;
  }
  else if (scatterMode == 7)
  {
    mode = 4;
    destX[1] = 40;
    destY[1] = 113;
    destX[2] = 40;
    destY[2] = 170;
    destX[3] = 40;
    destY[3] = 227;
    destX[4] = 40;
    destY[4] = 284;
    destX[5] = 40;
    destY[5] = 341;
    destX[6] = 40;
    destY[6] = 398;
  }
  else if (scatterMode >= 8)
  {
    mode = scatterMode - 3;
    destX[1] = 290;
    destY[1] = 113;
    destX[2] = 330;
    destY[2] = 113;
    destX[3] = 370;
    destY[3] = 113;
    destX[4] = 410;
    destY[4] = 113;
    destX[5] = 450;
    destY[5] = 113;
    destX[6] = 490;
    destY[6] = 113;
  }

  homeCount = 0;
}

loaded = 1;

