//  homepage.js  6/18/2004  tjb  Active Space Media

var rand;
var homeProjects;
var updatesID;
var restartable = false;
var lastPickedSlot;
var cache = {};

function generateRandomNumber (min, max)
{
  return Math.round ((min-0.5)+((max-min)+0.9999)*Math.random());
}

function generateUniqueRandomNumber (existingNums, min, max)
{
  //  Sanity checks

  if ((max-min)+1 < 1) 
  {
/*
    alert ("Impossible to generate a unique number between " +min+ " and " +max);
    return null;
*/
    return min;
  }

  if (existingNums && existingNums.length > 0)
  {
    var haveRoom = true;

    for (var i=min; i<=max; i++)
    {
      for (var j=0; j<existingNums.length; j++) if (existingNums[j] == i) { haveRoom = false;  break; }
      if (haveRoom) break;
      if (i < max) haveRoom = true;
    }
    
    if (!haveRoom)
    {
/*
      alert ("Impossible to generate a number between " +min+ " and " +max+ " not already in the given array");
      return null;
*/
      return generateRandomNumber (min, max);
    }
  }

  var n = 0;

  while (true)
  {
    n = generateRandomNumber (min, max);

    if (existingNums && existingNums.length > 0)
    {
      var unique = true;
      for (var i=0; i<existingNums.length; i++) if (existingNums[i] == n) { unique = false;  break; }
      if (unique == true) break;
    }
    else break;
  }
 
  return n;
}

function generateUniqueRandomNumbers (howmany, min, max)
{
  //  Sanity check

  if ((max-min)+1 < howmany) 
  {
    alert ("Impossible to generate " +howmany+ " unique numbers between " +min+ " and " +max);
    return null;
  }

  var nums = new Array (howmany);

  for (var i=0; i<howmany; i++)
  {
    while (true)
    {
      var n = generateRandomNumber (min, max);

      var unique = true;
      for (var j=0; j<i; j++) if (nums[j] == n) { unique = false;  break; }
      if (unique == false) continue;

      nums[i] = n;
      break;
    }
  }
 
  return nums;
}

function onLoadHandler ()
{
  doImageUpdates();
}

var studios = 
[
  ["hc", "healthcare", "Healthcare"],
  ["io", "industrial-office", "Industrial & Office"],
  ["rec", "recreational", "Recreational"],
  ["id", "interiordesign", "Interior Design"]
];
 
function generateHomeProjectsList ()
{
  homeProjects = new Array();
  var n = 0;

  for (var i=0; i<studios.length; i++)
  {
    var plist = eval ("projectsList['"+studios[i][0]+"']");
    var dir = studios[i][1];

    for (var j=0; j<plist.length; j++)
    {
      var pid = plist[j][0];
      var numImages = plist[j][3];
      if (!pid || numImages < 1) continue;

      var p = {};
      p.studioName = studios[i][2];
      p.projName = plist[j][2];
      p.url = dir+ '/projects/' +pid+ '.html';
      p.numImages = numImages;
      p.imageBase = dir+ '/projects/images/' +pid+ '/' +pid+ '-H';
      p.imagesShown = new Array (numImages+1);
      p.selectedImage = "../transparent.gif";  // default
      homeProjects[n++] = p;
    }
  }

  return homeProjects;
}

function ensureEnoughHomeProjects (nProjects)
{
  //  If not enough home projects, double up on them as need be

  if (homeProjects.length < nProjects)
  {
    var len = homeProjects.length;
    var diff = nProjects - len;
    var next = 0;

    for (var i=len; i<len+diff; i++)
    {
      homeProjects[i] = homeProjects[next++];
      if (next == len) next = 0;
    }
  }
} 

function selectNewHomeProjectImage (project)
{
  var max = project.numImages;

  if (max == 0) return project.selectedImage;  // gets default

  var nums = generateUniqueRandomNumbers (max, 1, max);
  var n = -1;

  for (var i=0; i<nums.length; i++)
  {
    if (project.imagesShown[nums[i]] != true)
    {
      n = nums[i];
      break;
    }
  }

  if (n == -1)
  {
    for (var i=1; i<=max; i++) project.imagesShown[i] = false;
    n = nums[0];
  }

  project.imagesShown[n] = true;
  project.selectedImage = project.imageBase +n+ '.jpg';
  return project.selectedImage;
}

function doImageUpdates (doit)
{
  if (mousedSlot < 0)
  {
    if (doit) updateImage (pickSlot(), generateUniqueRandomNumber (rand, 0, homeProjects.length-1));
    updatesID = setTimeout ("doImageUpdates(true)", generateRandomNumber (7200, 8200));  // was 6500, 7500
  }
}

function pickSlot ()
{
  while (true)
  {
    var n = generateRandomNumber (0, rand.length-1);
    if (n == lastPickedSlot || n == mousedSlot) continue;
    lastPickedSlot = n;
    return n;
  }
}

function updateImage (slot, projNum)
{
  var src = selectNewHomeProjectImage (homeProjects[projNum]);

  function imageOnLoad ()
  {
    if (cache[src])
    {
      cache[src].status = "loaded";
      replaceImage (slot, projNum);
    }
  }

  if (cache[src] == null)
  {
    cache[src] = new Image();
    cache[src].status = "loading";
//  cache[src].onload = "imageOnLoad('" +src+ "'," +slot+ "," +projNum+ ")";
    cache[src].onload = imageOnLoad;
    cache[src].src = src;
  }
  else if (cache[src].status == "loaded")
  {
    replaceImage (slot, projNum);
  }
  else cache[src] = null;  // try again next time
}

var img;
var ImageFadeInStep = 3;

function replaceImage (slot, projNum)
{
  var div = document.getElementById ("divimg" + slot);

  if (div && homeProjects[projNum])
  {
    var html = '<a href="' +homeProjects[projNum].url+ '">'; 
    html    += '<img name="img'+slot+'" class="imgFader" width="81" height="99" border="0"';
    html    += ' src="'+homeProjects[projNum].selectedImage+'" onMouseover="homeImageMouseover('+slot+')"></a>';

    div.innerHTML = html;
    rand[slot] = projNum;
    img = eval ("document.images.img" + slot);
    img.step = -ImageFadeInStep;
    fadeInImage ();
    showBriefCaption (rand[slot]);
  }
}

function fadeInImage ()
{
  img.step += ImageFadeInStep;
  if (img.step > 100) img.step = 100;
  
  if (img.filters) img.filters.alpha.opacity = img.step;
  else             img.style.MozOpacity = img.step/101;

  if (img.step == 100) return;
  setTimeout ("fadeInImage()", 28);  // was 35
}  

var nFadeSteps = 22;  // was 16
var rInc = Math.round (Math.abs ((captionColorFadeIn.r - fadedColor.r)/nFadeSteps));
var gInc = Math.round (Math.abs ((captionColorFadeIn.g - fadedColor.g)/nFadeSteps));
var bInc = Math.round (Math.abs ((captionColorFadeIn.b - fadedColor.b)/nFadeSteps));

function rgb2s (rgb) { return "{ r:" +rgb.r+ ", g:" +rgb.g+ ", b:" +rgb.b+ " }"; }

function showBriefCaption (projNum)
{
  setTimeout ("fadeInCaption("+projNum+","+rgb2s(fadedColor)+")", 420);  // was 600
  setTimeout ("fadeOutCaption("+rgb2s(captionColorFadeIn)+")", 4950);  // was 4500
}
 
function fadeInCaption (projNum, rgb)
{
  if (mousedSlot >= 0) return;
  setCaptionColor (fadedColor);
  setCaptionText (projNum);
  fadeCaption (1, rgb);
}

function fadeOutCaption (rgb)
{
  if (mousedSlot >= 0) return;
  setCaptionColor (captionColorFadeIn);
  fadeCaption (-1, rgb);
}

function fadeCaption (direction, rgb)
{
  if (mousedSlot >= 0) return;
  setCaptionColor (rgb);

  if (direction > 0) // fade in
  {
    if ((rgb.r == captionColorFadeIn.r) && (rgb.g == captionColorFadeIn.g) && (rgb.b == captionColorFadeIn.b)) return;

    rgb.r += rInc;
    rgb.g += gInc;
    rgb.b += bInc;

    if (rgb.r > captionColorFadeIn.r) rgb.r = captionColorFadeIn.r;
    if (rgb.g > captionColorFadeIn.g) rgb.g = captionColorFadeIn.g;
    if (rgb.b > captionColorFadeIn.b) rgb.b = captionColorFadeIn.b;
  }
  else  // fade out
  {
    rgb.r -= rInc;
    rgb.g -= gInc;
    rgb.b -= bInc;

    if (rgb.r < fadedColor.r) rgb.r = fadedColor.r;
    if (rgb.g < fadedColor.g) rgb.g = fadedColor.g;
    if (rgb.b < fadedColor.b) rgb.b = fadedColor.b;

    if ((rgb.r == fadedColor.r) && (rgb.g == fadedColor.g) && (rgb.b == fadedColor.b)) 
    {
      setCaptionText (-1);
      return;
    }
  }

  if (mousedSlot >= 0) return;
  setTimeout ("fadeCaption("+direction+","+rgb2s(rgb)+")", 60);
}

function homeImageMouseover (slot)
{
  mousedSlot = slot;
  if (updatesID) { clearTimeout (updatesID);  updatesID = null; }
  restartable = true;
  setCaptionColor (captionColorHilite);
  setCaptionText (rand[slot]);
}

function homeImageMouseout ()
{
  if (mousedSlot >= 0) setCaptionText (-1);
  mousedSlot = -1;
  if (restartable && updatesID == null) { restartable = false;  doImageUpdates(); }
}

function setCaptionText (projNum)
{
  var div = document.getElementById ("caption");

  if (projNum >= 0)
  {
    div.innerHTML = "<span class='caplabel'>project</span>" + 
                    "<span class='capline'>&nbsp;" +homeProjects[projNum].projName+   "</span><br>" +
                    "<span class='caplabel'>&nbsp;studio</span>" + 
                    "<span class='capline'>&nbsp;" +homeProjects[projNum].studioName+ "</span>";
  }
  else div.innerHTML = "";
}
