// ----------------------------------------------------------------------
// DGE_SlideShow constructor and methods
// ----------------------------------------------------------------------
function DGE_SlideShow(name, repeat, delay, autoplay)
{
// setup member variables
this.name = name;
this.repeat = repeat;
this.delay = delay;
this.autoplay = autoplay;
this.slides = new Array();
this.current = -1;
this.clock = null;
this.count = 1;
}
DGE_SlideShow.prototype.playing = function()
{
return this.clock != null;
}
DGE_SlideShow.prototype.play = function()
{
if (this.current < this.slides.length-1 || this.repeat)
{
DGE_revokeClass(this.node,'ss-paused');
DGE_applyClass(this.node,'ss-playing');
clearInterval(this.clock);
this.clock = setInterval(this.name+'.nextSlide()', this.delay);
}
}
DGE_SlideShow.prototype.pause = function()
{
DGE_revokeClass(this.node,'ss-playing');
DGE_applyClass(this.node,'ss-paused');
clearInterval(this.clock);
this.clock = null;
}
DGE_SlideShow.prototype.nextSlide = function()
{
if (this.repeat)
{
if (this.current == this.slides.length-1) this.select(0);
else this.select(this.current+1);
}
else if (this.current < this.slides.length-1)
{
this.select(this.current+1);
if (this.current == this.slides.length-1) this.pause();
}
}
DGE_SlideShow.prototype.prevSlide = function()
{
this.select(this.current-1);
}
DGE_SlideShow.prototype.firstSlide = function()
{
this.select(0);
}
DGE_SlideShow.prototype.lastSlide = function()
{
this.select(this.slides.length-1);
}
DGE_SlideShow.prototype.addSlide = function(slide)
{
this.slides.push(slide);
}
DGE_SlideShow.prototype.menuHandler = function(event)
{
// 'this' is the
element that was clicked
var ss = this.parentNode.parentSlideshow;
switch(this.className)
{
case 'ss-play': ss.play(); break;
case 'ss-pause': ss.pause(); break;
case 'ss-next': ss.nextSlide(); ss.pause(); break;
case 'ss-prev': ss.prevSlide(); ss.pause(); break;
case 'ss-first': ss.firstSlide(); ss.pause(); break;
case 'ss-last': ss.lastSlide(); ss.pause(); break;
}
}
DGE_SlideShow.prototype.attach = function(node)
{
// Finish off grabbing nodes
this.node = node;
this.menu = node.childNodes[0];
this.display = node.childNodes[1];
this.thumbs = node.childNodes[2];
this.imgwrap = this.display.getElementsByTagName('div').item(0);
this.link = this.imgwrap.getElementsByTagName('a').item(0);
this.image = this.link.getElementsByTagName('img').item(0);
this.displayWidth = parseFloat(DGE_getStyle(this.display, 'width'));
this.displayHeight = parseFloat(DGE_getStyle(this.display, 'height'));
this.displayRatio = this.displayWidth/this.displayHeight;
// Hook up play, pause, etc.
var menuUL = this.menu.getElementsByTagName('ul').item(0);
var menuLIs = menuUL.getElementsByTagName('li');
menuUL.parentSlideshow = this;
for (i=0;i this.slides.length) count = this.slides.length;
else this.slides.length = count;
for (s=0;s= 0 && slide < this.slides.length && this.current != slide)
{
this.current = slide;
// First up, get the main image loading, but hide it for now
// until it loads.
DGE_applyClass(this.image, 'loading');
this.slides[slide].loadImage();
// Set the link target
this.link.href = this.slides[slide].href;
// Now sort out the thumnails
var i, end, start;
if (this.slides.length < 5)
{
start = 0;
end = this.slides.length;
}
else
{
start = slide - 2;
if (start < 0) start = 0;
end = start + 5;
if (end > this.slides.length)
{
end = this.slides.length;
start = end - 5;
}
}
// Clear down items outwith range
for (i = 0; i= slide.ratio)
{
var width = parseInt(this.displayHeight*slide.ratio);
this.image.style.height = this.displayHeight+'px';
this.image.style.width = width+'px';
this.imgwrap.style.top = 0;
// this.imgwrap.style.left = parseInt((this.displayWidth-width)/2)+'px';
}
else
{
var height = parseInt(this.displayWidth/slide.ratio);
this.image.style.height = height+'px';
this.image.style.width = this.displayWidth+'px';
this.imgwrap.style.top = parseInt((this.displayHeight-height)/2)+'px';
// this.imgwrap.style.left = 0;
}
this.imgwrap.style.width = this.image.style.width;
this.imgwrap.style.height = this.image.style.height;
DGE_revokeClass(this.image, 'loading');
}
// ----------------------------------------------------------------------
// DGE_Slide constructor and methods
// ----------------------------------------------------------------------
function DGE_Slide(href, imagesrc)
{
// setup variables
this.href = href;
this.imagesrc = imagesrc;
this.image = new Image();
this.image.slide = this;
this.image.onerror = DGE_Slide.prototype.onImageError;
this.image.onabort = DGE_Slide.prototype.onImageAbort;
this.imageLoading = false;
this.imageLoaded = false;
this.imageError = false;
this.imageAborted = false;
}
DGE_Slide.prototype.attach = function(slideshow, liNode, index)
{
this.slideshow = slideshow;
this.node = liNode;
liNode.slideshow = slideshow;
liNode.ss_index = index;
liNode.onclick = this.onclick;
}
DGE_Slide.prototype.onclick = function()
{
// 'this' is the li element
this.slideshow.select(this.ss_index);
this.slideshow.pause();
}
DGE_Slide.prototype.showThumb = function()
{
this.node.className = 'show';
}
DGE_Slide.prototype.hideThumb = function()
{
this.node.className='hide';
this.image.onload = DGE_Slide.prototype.onImagePreload;
}
DGE_Slide.prototype.preloadImage = function()
{
if (!this.imageLoaded)
{
this.image.onload = DGE_Slide.prototype.onImagePreload;
this.startLoading();
}
}
DGE_Slide.prototype.loadImage = function()
{
if (this.imageLoaded)
{
// Already loaded, whang it up now.
this.slideshow.displaySlide(this);
}
else
{
this.image.onload = DGE_Slide.prototype.onImageLoad;
this.startLoading();
}
}
DGE_Slide.prototype.startLoading = function()
{
if (!this.imageLoading)
{
this.imageLoading = true;
this.image.src = this.imagesrc;
DGE_applyClass(this.node.firstChild, 'loading');
}
}
DGE_Slide.prototype.loadingFinished = function()
{
this.imageLoading = false;
DGE_revokeClass(this.node.firstChild, 'loading');
this.ratio = this.image.width/this.image.height;
}
DGE_Slide.prototype.onImagePreload = function()
{
this.slide.loadingFinished();
this.slide.imageLoaded = true;
}
DGE_Slide.prototype.onImageLoad = function()
{
this.slide.loadingFinished();
this.slide.imageLoaded = true;
this.slide.slideshow.displaySlide(this.slide);
}
DGE_Slide.prototype.onImageError = function()
{
this.slide.loadingFinished();
this.slide.imageError = true;
}
DGE_Slide.prototype.onImageAbort = function()
{
this.slide.loadingFinished();
this.slide.imageAborted = true;
}
// ----------------------------------------------------------------------
// cross-browser stuff
// ----------------------------------------------------------------------
function DGE_getStyle(el,styleProp)
{
// Based on code at http://www.quirksmode.org/dom/getstyles.html
if (el.currentStyle)
var y = el.currentStyle[styleProp];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
return y;
}
function DGE_applyClass(el, className)
{
if (el.className.length == 0)
el.className = className;
else if (el.className.indexOf(className) < 0)
el.className += ' ' + className;
}
function DGE_revokeClass(el, className)
{
var result = '';
var remain = el.className;
var pos = remain.indexOf(className);
while (pos >= 0)
{
// todo - this isn't robust enough. It could mangle other
// class names beginning with the supplied class.
result += remain.substr(0, pos);
remain = remain.substr(pos+className.length);
pos = remain.indexOf(className);
}
el.className = result + remain;
}