// gallery.js

/**********************************************
 * Copyright &copy; Trevor Lawrence 2006-2008 *
 *   http://tandcl.homemail.com.au            *
 **********************************************/

//************** PARAMETERS *****************//

/**********************************************
 * 1a. Image sizes                            *
 * Used in -                                  *
 *   ss_load() called fom chgImg()            *
 *   chgImg() called from slideshow.html      *
 * One element: Only image size (no buttons)  *
 * More than one: Optional image sizes        *
 * First (or only) element is initial size    *
 **********************************************/
var ImgSizes = [];
    ImgSizes.push(800,640,600);

/**********************************************
 * 1b. stretch                                *
 * Used in -                                  *
 *   reSize() called from slideshow.html      *
 * 'yes' will stretch smaller images          *
 *          and reduce larger images          *
 * 'no' (or any other)                        *
 *       will only reduce larger images       *
 **********************************************/
var stretch = 'yes';

/**********************************************
 * 2. copyrt - Copyright notice               *
 * Used in -                                  *
 *   chgImg() called from slideshow.html      *
 *   getPic() called from gallery.html        *
 *   getPic2() called from gallery.html       *
 * Change to blank ('')                       *
 * or change to your own message              *
 **********************************************/
var copyrt = '';

/**********************************************
 * 3. ss_end  - Action at last slide          *
 * Used in -                                  *
 *   chgImg() called from slideshow.html      *
 * 'restart' will restart at Slide 1          *
 * 'prompt'  will prompt for action           *
 * 'stop' (or any other) will stop            *
 **********************************************/
var ss_end = 'prompt';

/**********************************************
 * 4. pic_fs                                  *
 * Used in -                                  *
 *   newWindow() called from gallery.html     *
 *   printpic() called from gallery.html      *
 * 'yes' will use full screen window          *
 * 'no' (or any other)                        *
 *       will size window to picture          *
 **********************************************/
var pic_fs = 'yes';

/************** END PARAMETERS ****************/


/**********************************************
 ***********                         **********
 *          DO NOT ALTER REST OF CODE         *
 ***********                         **********
 **********************************************/

/************** GLOBAL VARIABLES **************/
// 1a. Variables used in SetupGall() chgImg() getSlide()
var ssarray = [], ssarrlen = 0;
if (qsobj(0)) {
  ssarray = qsobj(0).split(",");
  ssarrlen = ssarray.length;
}

// 1b. Arrays used in SetupGall() chgImg() getSlide()
// (Values are set in slideshow.js)
var Picturesx = [];
var Captionsx = [];
for (var i = 0; i < ssarrlen; i++) {
  Picturesx[i] = [];
  Captionsx[i] = [];
}

// 2. Used in SetupGall() chgImg()
var imgdir, tndir;

// 3. Used in chgImg()
var ss_ImgNum = 0;

// 4. Used in reSize()
// Image size
var ImgSize = ImgSizes[0];
// Image dimensions
var ImgDim = [];
    ImgDim.push(ImgSize,ImgSize);

// 5. Used in auto()
var ss_lock = false;
var ss_delay;
var ss_run;

// 6. Used throughout
var gEBI = document.getElementById;

/************** END GLOBAL VARIABLES **********/

/******************************************
 * Called by gallery.html, slideshow.html *
 ******************************************/
// From setPicNames() in slidelist.js
function blankCaptions (colln) {
var capno = Captionsx[colln];
var piclen = Picturesx[colln].length;
for (var i = 1; (i-1) < piclen; i = capno.push('') ){}
} // ---- end blankCaptions() ----

// From SetupGall(), chgImg()
function setDirs(colln) {
  imgdir = 'images/' + ssarray[colln] + '/';
  tndir = imgdir + 'thumbnails/';
} // ---- end setDirs() ----------

/*****************************************
 * Called by gallery.html                *
 *****************************************/
function SetupGall() {
  var i;

  // -- Internal function --
  function writeSlide(collection) {
    var collen, windowHtml, i, j, Picture, Caption;

    collen = Picturesx[collection].length;
    windowHtml = '<table>\n';
    for (i = 0; i < collen; i++) {
      j = i + 1;
      Picture = Picturesx[collection][i];
      Caption = j + '. ' + Captionsx[collection][j];
      setDirs(collection);

      if (i % 8 == 0)
        { windowHtml += '<tr>\n'; }

      windowHtml
        += '<td width="14%">\n'
        +  '<a href="javascript:newWindow(\'' + imgdir + Picture + '.jpg\','
        +                                '\'' + Caption + '\');">\n'
        +  '<img id="Thumbs' + j + '" src="' + tndir +  Picture + '_t.jpg"\n'
        +  '     alt="" title="Click to see a larger picture" /><br />\n'
        +  '<span id="Text' + j + '" class="sz13">' +  Caption + '</span></a>\n'
        +  '</td>\n';

      if (i % 8 == 8 || j == collen)
        { windowHtml += '</tr>\n'; }
    }
    windowHtml += '</table><hr />';
    return windowHtml;
  } // -- end writeSlide() --

  if (ssarray == '') {
    document.write('<div id="errmsg">'
                 + 'gallery.html called<br>'
                 + 'with no slideshow name(s)'
                 + '<p>Please consult Webmaster</p>'
                 + '</div>' );
    return;
  }

  for (i = 0; i < ssarrlen; i++) {  	
    document.write(
           '<div align="center">'
      	 + '<a name="#Show' + (i+1) + '">'
         + '<input type="button" '
         +        'value="Slideshow'
         + ((ssarrlen > 1) ? ' ' + (i+1) : '')
         + ': ' + Captionsx[i][0] + '"'
         + 'onclick="SetupSShow(' + i + ');return false;"/>'
         + '</a></div>'
         + writeSlide(i) );
  } // end for
} // ---- end SetupGall() --------

function SetupSShow(collection) {
  if (Picturesx[collection].length == 1){
    alert('Slideshow not loaded'
      + '\nCollection has only one image'
    + '\n\nPlease advise WebMaster');
    return;
  }

  window.open('slideshow.html?ssarray=' + ssarray
                          + '&collection=' + collection
             ,'' , 'resizable=yes');
} // ---- end SetupSShow() -------


/****************************************************
 * Called by slideshow.html                         *
 ****************************************************/
function auto(delay) {
  var T = gEBI("delay");

  if (ss_lock) {	// At stop
    // Unlock delay value
    gEBI('delay').readOnly = false;

    // Unlock slide no value
    gEBI('no').readOnly = false;

    // Show alternative SS Icon
    gEBI('ssicon').src = 'images/display/tiedye2.gif';
    gEBI('ssicon').title = 'Slideshow stopped';
    ss_msg= "";

    ss_lock = false;
    window.clearTimeout(ss_run);
    return;
  }

  // Check value
  if (delay < 3) {
    alert('Value entered: ' + delay
      + '\nPlease enter a delay >= 3');
    T.value = '';
    T.focus();
    return false;
  }

  // Set delay
  ss_delay = delay;

  // Lock delay value
  T.readOnly = true;
  T.blur();

  // Blank and lock Slide Number value
  T = gEBI('no');
  T.value= '';
  T.readOnly = true;
  T.blur();

  // Display message
  ss_msg = "Auto slideshow active";

  // Show SS Icon
  T = gEBI('ssicon');
  T.src = 'images/display/tiedye.gif';
  T.title = 'Slideshow active';

  ss_lock = true;
  chgImg();

} // ---- end auto() -------------

function chgImg(posn) {
  var T = gEBI('ssicon');
  var collection = qsobj(1);
  var upper = Picturesx[collection].length;
  var stop, ss_suffix, caption, image, imageToLoad = new Image();
  var nw_count = 1;

  //----Internal function ---
  function loadchk() {
    var HTML;

    if (!imageToLoad.complete && nw_count ++ < 10)
      { setTimeout(loadchk,1000); }
    else {
      // Hide Loading GIF
      showPage();

      if (nw_count >= 10)
        { alert('Image load failed after ' + (nw_count -1)  + ' tries.' );  }
      else { // complete
        // Display image
        HTML = '<img id="slide" src="' + image + '"'
                 + ' alt="" title="' + caption + '"'
                 + ' onload="reSize()" /><br />';
        if (copyrt)
          { HTML += '<span class="red" >' + copyrt + '</span>'; }
        gEBI('Slidepos').innerHTML = HTML;
      } // end complete
    } // end !(!imageToLoad.complete && nw_count ++ < 10)
  } //---- end loadchk() -----------
  function ss_load () {
    var i, HTML = '';

    // Set Size buttons
    if (ImgSizes.length > 1) {
      for (i = 0; i < ImgSizes.length; i++) {
        HTML += '<input type="button" value="' + ImgSizes[i]
                          + '" onclick="reSize(' + ImgSizes[i] + ')" />';
      } // end for
      gEBI('sizebtns').innerHTML = HTML;
    }
   else
      { gEBI('sizetxt').style.display = "none"; }
  } // ---- end ss_load() ----------

  if (!ss_lock) {	// Slideshow is inactive
    // Hide SS Icon
    T.src = 'images/display/invisible.gif';
    T.title = '';

    if (posn == 'Load')
      { ss_load(); }
    else if (   ((posn == 'First' || posn == 'Prev') && ss_ImgNum == 0)
             || ((posn == 'Last'  || posn == 'Next') && ss_ImgNum == upper - 1)
             ||  (posn == ss_ImgNum))
      { return; }

    ss_ImgNum = (posn == 'Load')  ? 0
              : (posn == 'First') ? 0
              : (posn == 'Last')  ? upper - 1
              : (posn == 'Prev')  ? ss_ImgNum - 1
              : (posn == 'Next')  ? ss_ImgNum + 1
              :  posn;	// Specified number
  } // end (!ss_lock)

  else {// (ss_lock)
    if (posn) { return; }       // Position key clicked

    ss_ImgNum ++;
    if (ss_ImgNum >= upper) {	// Last
      if (ss_end == 'prompt') {
      	stop = confirm('Last slide reached.\n'
             + '----------------------\n\n'
             + 'OK or Enter to Stop.\n'
             + 'Cancel or Escape to Restart.');
      } // end 'prompt'

      if (ss_end == 'restart' || (ss_end == 'prompt' && !stop))
        { ss_ImgNum = 0; }
      else {
        ss_ImgNum = upper - 1;
        auto();
        return;
      }
    } // end (ss_ImgNum >= upper)
  } // end (ss_lock)

  // Display Loading GIF
  showPage('show');

  // Set caption
  if (ssarrlen > 1)
    { ss_suffix = ' ' + (+collection + 1); }
  ss_suffix += ':';
  caption = (ss_ImgNum + 1) + '/' + upper + ' '
          +  Captionsx[collection][ss_ImgNum + 1].replace(/&rsquo;/g,"'");
  gEBI("piccaption").innerHTML =
//        'Slideshow' + ss_suffix + ' '
          Captionsx[collection][0] + '.<br />'
          +  caption;

  // Obtain slide and load it
  setDirs(collection);
  image = imgdir + Picturesx[collection][ss_ImgNum] + '.jpg';
  imageToLoad.src = image;
  setTimeout(loadchk,500);
} // ---- end chgImg() -----------

function reSize(parm) {
  var newImg = false, newsize;
  var T = gEBI('slide');
  var img_height = T.height, img_width = T.width;
  var hgtw = (img_height > img_width) ? true : false ;
  var hltw = (img_height < img_width) ? true : false ;

  // Hide Loading GIF
  showPage();

  // Set type of call
  if (!parm)		// onload trigger
    { newImg = true; }
  else { 		// size button trigger
    newsize = parm;

    // Stop slideshow if running
    if (ss_lock)
      { window.clearTimeout(ss_run); }
  } // end !(!parm)

  // Check for change in image size or dimensions
  if (!(  (newsize && newsize == ImgSize)
        ||(newImg  && ImgDim[0] == img_width && ImgDim[1] == img_height) )) {

    // Size button clicked
    if (newsize)
      { ImgSize = newsize; }

    // Resize
    if (   (Math.max(img_height, img_width) > ImgSize)
        || (Math.max(img_height, img_width) < ImgSize && stretch == 'yes') ) {
      if (hgtw) {
      	img_width = Math.round(img_width*ImgSize/img_height);
        img_height = ImgSize;
      }
      else if (hltw) {
      	img_height = Math.round(img_height*ImgSize/img_width);
        img_width = ImgSize;
      }
      else { img_height = img_width = ImgSize; }
    } // end if - max cf. ImgSize
  } // end if - change in image size or dimensions

  if (T.width != img_width || T.height != img_height) {
    T.width  = ImgDim[0] = img_width;
    T.height = ImgDim[1] = img_height;
  }

  // Retart slideshow if running
  if (ss_lock)
    { ss_run = setTimeout(chgImg, ss_delay * 1000); }
} // ---- end reSize() -----------

function getSlide(slide_no) {
  var collection = qsobj(1);
  var T = gEBI('no');

  if (ss_lock)
    { return; }

  // Blank Slide Number
  T.value = "";

  if ( (slide_no < 1) || (slide_no > Picturesx[collection].length) ) {
    alert('Value entered: ' + slide_no
     + ".\nPlease re-enter number in range 1 to " + Picturesx[collection].length);
    return;
  }

  chgImg(slide_no - 1);
} // ---- end getSlide() ---------

function checkVal(e) {
  var keynum, keychar, numcheck;

  if(window.event) // IE
    { keynum = e.keyCode; }
  else if(e.which) // Netscape/Firefox/Opera
    { keynum = e.which; }

  keychar = String.fromCharCode(keynum);
  numcheck = /[0-9]/g;
  return numcheck.test(keychar);
} // ---- end checkVal() ---------

function printSlide() {
  var tittemp = document.title;
  document.title = '';
  window.print();
  document.title = tittemp ;
} // ---- end printSlide() ---------

/***************************************
 * GENERAL FUNCTIONS                   *
 *  (on external.js)                   *
 * Used in gallery.html slideshow.html *
 *   qsobj                             *
 *   spawnJimcoPopup                   *
 *   showPage                          *
 *   newWindow                         *
 *   getPic                            *
 *   getPic2                           *
 *   printPic                          *
 ***************************************/
