var aImages;                           // array of preloaded main images
var aCaptions;                         // array of main image captions
var imgProgOn, imgProgOff, imgProgCur; // progress bar images
var iCurrentIdx = 0;                   // image array offset currently in view
var bLoaded = false;                   // all images loaded?
var bBOF = true;                       // first image is active
var bEOF = false;                      // last image is active

/* Caches all main images, subtitles, and progress bar images */
function preloadImages(count, dir)
{
   // preload progress bar images 
   imgProgOn = new Image();
   imgProgOn.src = '/images/prog_on.gif';
   imgProgOff = new Image();
   imgProgOff.src = '/images/prog_hide.gif';
   imgProgCur = new Image();
   imgProgCur.src = '/images/prog_cur.gif';

   // preload main images
   aImages = new Array(count);
   for (var i=0; i<count; i++) {
      aImages[i] = new Image();
      aImages[i].src = dir + '/' + i + ".jpg";
      setTimeout('checkLoadState(' + i + ')', i * 100); // keeps checking state until loaded
   }

   return;
}

/* Calls for progress bar update if image has loaded or tries to call itself again after timeout */
function checkLoadState(index)
{
   (aImages[index].complete)? setLoadProgress(index) : setTimeout('checkLoadState(' + index + ')', 100);
}

/* Updates load progress bar */
function setLoadProgress(n) 
{
   // start at 1 so position 0 remains highlighted
   for (var i=1; i<=n; i++)
      eval("document.progress" + i + ".src = imgProgOn.src");
      
   // if we've loaded the last item then turn our global loaded flag on and activate nav button
   if (n == (aImages.length - 1))
   {
      bLoaded = true;
      off('btnnext');

      // display first caption
      document.getElementById("maincaption").innerHTML = aCaptions[0];
   }
}

/* Handler for pic thumbnail click */
function displayImage(xIdx)
{
   if (bLoaded)
   {
      document.mainpic.src = aImages[xIdx].src;
      document.getElementById("maincaption").innerHTML = aCaptions[xIdx];
      this.scrollTo(0,140);
      iCurrentIdx = xIdx;
      setCurrProgress();
   }
   UpdateEndStates();
   off('btnprev'); // hack
   off('btnnext'); // hack
   return false;
}

/* Moves progress bar highlighted index */
function setCurrProgress() 
{
   for (var i=0; i<aImages.length; i++)
      eval("document.progress" + i + ".src = imgProgOn.src");
   eval("document.progress" + iCurrentIdx + ".src = imgProgCur.src");
}

/* Watches for end state condition and updates globals & nav buttons as appropriate */
function UpdateEndStates()
{
   // Set these global end state watchers
   bBOF = (iCurrentIdx == 0);
   bEOF = (iCurrentIdx == aImages.length - 1);
   
   if (bBOF) disable('btnprev');
   if (bEOF) disable('btnnext');
}

/* Handler for "Prev" nav button */
function displayImagePrev() 
{
   if (bLoaded && !bBOF) {
      document.mainpic.src = aImages[--iCurrentIdx].src;
      document.getElementById("maincaption").innerHTML = aCaptions[iCurrentIdx];
      setCurrProgress();
   }
   UpdateEndStates();
   off('btnnext'); // hack
   return false;
}

/* Handler for "Next" nav button */
function displayImageNext() 
{
   if (bLoaded && !bEOF) {
      document.mainpic.src = aImages[++iCurrentIdx].src;
      document.getElementById("maincaption").innerHTML = aCaptions[iCurrentIdx];
      setCurrProgress();
   }
   UpdateEndStates();
   off('btnprev'); // hack
   return false;
}

/* Turns nav button light blue (highlighted) */
function on(imgname) 
{
   // all pix must be loaded and we're not violating the appropriate end state
   if (bLoaded && !((imgname == 'btnprev' && bBOF) || (imgname == 'btnnext' && bEOF)))
      eval("document." + imgname + ".src = '/images/pixnav_" + imgname + "_hilite.gif'");
   return true;
}

/* Turns nav button dark blue (not highlighted) */
function off(imgname) 
{
   // all pix must be loaded and we're not violating the appropriate end state
   if (bLoaded && !((imgname == 'btnprev' && bBOF) || (imgname == 'btnnext' && bEOF)))
      eval("document." + imgname + ".src = '/images/pixnav_" + imgname + ".gif'");
   return true;
}

/* Turns nav button grey (disabled) */
function disable(imgname) 
{
   eval("document." + imgname + ".src = '/images/pixnav_" + imgname + "_grey.gif'");
}
