
function ssLoadImages(filearray, cb) {
  for (x=0; x<filearray.length; x++) {
    var img = new Image();
    img.index = x;
    if (cb) {
      img.evnt = connect(img, 'onload', this, cb);
    }
    img.src=filearray[x];
  }
}

function ssThumbLoaded(e) {
   img = e.src();
    this.thumbs[img.index]=img;
   disconnect(img.evnt);

   targID = this.thumbPrefix+String(img.index)+this.thumbPostfix;
   connect(img, 'onclick', this, 'showImage');
   if (img.index < (this.galleryStart + this.imgCount)) {
     replaceChildNodes($(targID),img);
//     logDebug("DEBUG: Swapping: ","targID: ",targID, "att id: ", getNodeAttribute(img,'id'));
   }

   this.thumbsLoaded++;
   if (this.thumbsLoaded >= this.thumbarray.length) {
     signal(this, 'thumbsloaded');
   }   
}

function ssImageLoaded(e) {
   this.images[this.imagepos]=e.src();
   this.imagepos ++;
   if (this.imagepos < this.imagearray.length) {
     this.loadImages([this.imagearray[this.imagepos]],'imageLoaded');
   }
//   logDebug("DEBUG: Loaded image:",e.src());
}

function ssUpdateThumbs() {
   for (x=0; x<this.imgCount; x++) { 
      targID = this.thumbPrefix+String(x)+this.thumbPostfix;
      gpos = x+this.galleryStart;
      if (gpos < this.thumbs.length) {
//         logDebug("DEBUG: UpdateThumbs: ","id: ", targID, "old: ",$(targID),"new: ", this.thumbs[gpos],"total: ", this.thumbs.length);
         img = this.thumbs[gpos];
         replaceChildNodes($(targID),img);
      } else {
         replaceChildNodes($(targID),this.thumbs[gpos-this.thumbs.length]);
      }
   }
}

function ssGalleryNext() {
  this.galleryStart += this.advanceCount;

  while (this.galleryStart > this.thumbarray.length) {
    this.galleryStart -= this.thumbarray.length;
  }
  this.updateThumbs();
}

function ssGalleryPrev() {
  this.galleryStart -= this.advanceCount;

  while (this.galleryStart < 0) {
    this.galleryStart += this.thumbarray.length;
  }
  this.updateThumbs();
}

function ssShowImage(e) {
  img=this.images[e.src().index];
  if (!img.src) {
    logDebug("Displaying unloaded image");
    img.src=this.imagearray[e.src().index];
  }
  replaceChildNodes(this.imgtarget, img);
//  updateNodeAttributes(img, {'style':{'display':'table-cell'}});
}

function SlideShow(thumbarray, imagearray) {
  this.loadImages = ssLoadImages;
  this.thumbLoaded = ssThumbLoaded;
  this.imageLoaded = ssImageLoaded;
  this.updateThumbs = ssUpdateThumbs;
  this.next = ssGalleryNext;
  this.prev = ssGalleryPrev;
  this.showImage = ssShowImage;

  this.thumbarray = thumbarray;
  this.imagearray = imagearray;
  this.imagepos = 0;
  this.thumbPrefix=''; // Pre/postfix to be added to index to get img ID for thumbs
  this.thumbPostfix='';
  this.imgCount = 15; // Number of images to display at once.
  this.advanceCount = 15;
  this.rewindCount = 15;
  this.imgtarget = 'imgcopy';

  this.galleryStart = 0;
  this.thumbsLoaded = 0;

  this.thumbs = Array();
  this.images = Array();

  this.cacheImages = function(e) { logDebug("Images: ",imagearray.length); this.loadImages([imagearray[0]],'imageLoaded'); };
  this.tsignal = connect (this, 'thumbsloaded', this, 'cacheImages');
  this.init = function() { this.loadImages(thumbarray, 'thumbLoaded'); };
  this.setImgCount = function(x) { this.imgCount = x; };
  this.setNext = function(x) { this.nextButton = x; connect(x, 'onclick', this, 'next'); };
  this.setPrev = function(x) { this.prevButton = x; connect(x, 'onclick', this, 'prev'); };
}

