var LOAD_IMAGES_TIMEOUT = 250; //milliseconds var LOAD_THUMBNAILS_TIMEOUT = 50; //milliseconds /*************************************************** * State Variables ***************************************************/ var _isPlaying = true; var _numberOfThumbnailSets = 0; var _currentImageIndex = 0; /*************************************************** * Init Gallery Images ***************************************************/ var _firstLoaded = false; function initGalleryImages(images, imageContainer) { _loadNextImage(images, imageContainer); } function _loadNextImage(remainingImages, imageContainer) { if (remainingImages.length == 0) //Nothing left to load, we're done { return; } //Grab the next image and load it var nextImagePath = remainingImages.shift(); var imageLoader = new Image(); imageLoader.onload = function() { _imageLoaded(imageLoader, remainingImages, imageContainer); } imageLoader.src = nextImagePath; } function _imageLoaded(imageLoader, remainingImages, imageContainer) { //Get the image's size var imageWidth = imageLoader.width; var imageHeight = imageLoader.height; //var imageContainer = $(containerName); var containerSize = imageContainer.getSize(); //Build the image's container var imageWrapper = new Element('span', { 'styles': { 'opacity': (_firstLoaded ? 0 : 1) }, 'events': { 'click': function() { nextImage(); return false; } }, 'class': "galleryImageEntry" }); //Build the image - we make it a background image on a div to protect it from being printed or saved var imageObject = new Element("div", { 'styles': { 'position': 'relative', 'top': Math.max(Math.floor((containerSize.y - imageHeight) / 2), 0), //Centered vertically 'background-image': "url(" + imageLoader.src + ")", 'width': imageWidth, 'height': imageHeight }, 'events': { 'contextmenu': function(e) { if (e.stop) e.stop(); } }, 'class': "galleryImage" }); var d = new Date(); var year = d.getFullYear(); //Build a clear gif entry to put in the div var placeholderImage = new Element("img", { 'src': "/images/common/clear.gif", 'styles': { 'width': imageWidth, 'height': imageHeight }, 'alt': "Copyright " + year + " Britton Photography" }); imageObject.appendChild(placeholderImage); imageWrapper.appendChild(imageObject); imageContainer.appendChild(imageWrapper); _firstLoaded = true; setTimeout(function() { _loadNextImage(remainingImages, imageContainer); }, LOAD_IMAGES_TIMEOUT); } /*************************************************** * Play/Pause Bezel ***************************************************/ var _movedSlideshowTimer = null; var _bezelVisible = false; function mouseMovedInSlideshow() { if (!_bezelVisible) { var bezel = $('playPauseBezelWrapperForMSIE'); if (bezel != null) { bezel.setStyle('opacity', 0.6); //bezel.setOpacity(0.6); _bezelVisible = true; } } if (_movedSlideshowTimer) { clearTimeout(_movedSlideshowTimer); } _movedSlideshowTimer = setTimeout(_hidePlayPauseBezel, 5000); } function _hidePlayPauseBezel() { var bezel = $('playPauseBezelWrapperForMSIE'); if (bezel == null) { return; } _movedSlideshowTimer = null; var fxOptions = {duration:1000, transition:Fx.Transitions.linear, wait:false, onComplete: _playPauseBezelHidden, property: 'opacity'}; var fadeOut = new Fx.Tween(bezel, fxOptions); fadeOut.start(0.6, 0.0); _bezelVisible = false; } function _playPauseBezelHidden() { _bezelVisible = false; } function _updatePlayPauseBezel() { var bezel = $('playPauseBezel'); if (bezel == null) { return; } if (_isPlaying) { if (Browser.Engine.trident) { bezel.setStyles( { 'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/images/slideshow/bezel_pause.png", sizingMethod="scale")' }); } else { bezel.setStyles( { 'background-image': "url(/images/slideshow/bezel_pause.png)" }); } } else { if (Browser.Engine.trident) { bezel.setStyles( { 'filter': 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="/images/slideshow/bezel_play.png", sizingMethod="scale")' }); } else { bezel.setStyles( { 'background-image': "url(/images/slideshow/bezel_play.png)" }); } } } /*************************************************** * Init Thumbnail Sets ***************************************************/ var _firstThumbnailSetLoaded = false; function initThumbnailSets(thumbnailSets, thumbnailSetsContainer) { _numberOfThumbnailSets = thumbnailSets.length; _loadNextThumbnailSet(thumbnailSets, thumbnailSetsContainer); } function _loadNextThumbnailSet(remainingThumbnailSets, thumbnailSetsContainer) { if (remainingThumbnailSets.length == 0) //Nothing left to load, we're done { //alert("Sets done"); return; } //Create the thumbnail set container
var thumbnailContainer = new Element('div', { 'styles': { 'left': (_firstThumbnailSetLoaded ? 800 : 0) }, 'class': "thumbnailBar" }); //Create the list var thumbnailList = new Element('ul', { }); thumbnailContainer.appendChild(thumbnailList); thumbnailSetsContainer.appendChild(thumbnailContainer); if (_firstThumbnailSetLoaded) { _updateThumbnailControls(); } _firstThumbnailSetLoaded = true; //Grab the next set and start load it var nextThumbnailSet = remainingThumbnailSets.shift(); _firstThumbnailOfSetLoaded = false; _loadNextThumbnail(remainingThumbnailSets, nextThumbnailSet, thumbnailSetsContainer, thumbnailList); } var _firstThumbnailOfSetLoaded = false; function _loadNextThumbnail(remainingThumbnailSets, remainingThumbnails, thumbnailSetsContainer, thumbnailsContainer) { //alert("load"); if (remainingThumbnails.length == 0) //No more in this set, return out and let it continue to next { //alert("next set"); _loadNextThumbnailSet(remainingThumbnailSets, thumbnailSetsContainer); return; } //Grab the next image and load it var nextImagePath = remainingThumbnails.shift(); var imageLoader = new Image(); imageLoader.onload = function() { _thumbnailImageLoaded(imageLoader, remainingThumbnailSets, remainingThumbnails, thumbnailSetsContainer, thumbnailsContainer); } imageLoader.src = nextImagePath; } function _thumbnailImageLoaded(imageLoader, remainingThumbnailSets, remainingThumbnails, thumbnailSetsContainer, thumbnailsContainer) { //Get the image's size var imageWidth = imageLoader.width; var imageHeight = imageLoader.height; var listElementClasses = []; if (!_firstThumbnailOfSetLoaded) listElementClasses.push("first"); if (remainingThumbnails.length == 0) listElementClasses.push("last"); var listElement = new Element("li", { 'class': listElementClasses }); //Build the image - we make it a background image on a div to protect it from being printed or saved var imageObject = new Element("img", { 'src': imageLoader.src, 'styles': { 'width': imageWidth, 'height': imageHeight } }); listElement.appendChild(imageObject); thumbnailsContainer.appendChild(listElement); _firstThumbnailOfSetLoaded = true; setTimeout(function() { _loadNextThumbnail(remainingThumbnailSets, remainingThumbnails, thumbnailSetsContainer, thumbnailsContainer); }, LOAD_THUMBNAILS_TIMEOUT); } /*************************************************** * Thumbnail Set Switching ***************************************************/ var _currentThumbnailSet = 0; function nextThumbnails() { if (_currentThumbnailSet >= _numberOfThumbnailSets - 1) { return; } _transitionFromThumbnailsToThumbnails(_currentThumbnailSet, _currentThumbnailSet + 1); } function previousThumbnails() { if (_currentThumbnailSet < 1) { return; } _transitionFromThumbnailsToThumbnails(_currentThumbnailSet, _currentThumbnailSet - 1); } function _transitionFromThumbnailsToThumbnails(fromIndex, toIndex) { var thumbnails = $$('div.thumbnailBar'); if (thumbnails == null || thumbnails.length == 0) { return; } var fxOptions = {duration:1000, transition:Fx.Transitions.Back.easeOut, wait:false, onComplete: _thumbnailTransitionComplete, property: 'left'}; var imageFxOut = new Fx.Tween(thumbnails[fromIndex], fxOptions); var imageFxIn = new Fx.Tween(thumbnails[toIndex], fxOptions); imageFxOut.start(0, (fromIndex < toIndex ? -800 : 800)); imageFxIn.start((fromIndex < toIndex ? 800 : -800), 0); _currentThumbnailSet = toIndex; _updateThumbnailControls(); } function _thumbnailTransitionComplete() { } function gotoThumbnailPage(pageIndex) { if (pageIndex < 0 || pageIndex > _numberOfThumbnailSets - 1) { return; } _transitionFromThumbnailsToThumbnails(_currentThumbnailSet, pageIndex); } /*************************************************** * Thumbnail Controls ***************************************************/ function _updateThumbnailControls() { var thumbnails = $$('div.thumbnailBar'); if (thumbnails == null || thumbnails.length == 0) //If no thumbnails being displayed, don't need to update { return; } var leftButtonDisabled = (_currentThumbnailSet < 1); var rightButtonDisabled = (_currentThumbnailSet == (_numberOfThumbnailSets - 1)); //Left Arrow var leftArrowContainer = $$('div.leftArrow')[0]; var leftArrowImage = new Element('img', { 'src': (leftButtonDisabled ? "/images/common/buttons/btn_left_disabled.gif" : "/images/common/buttons/btn_left_default.gif"), 'name': "nav_galleryLeft", 'border': "0", 'alt': "Left Arrow" }); var leftArrowAnchor = new Element('a', { 'href': "#" }); if (!leftButtonDisabled) { leftArrowAnchor.onmouseout = function() { restoreImage('nav_galleryLeft', this); } leftArrowAnchor.onmouseover = function() { hoverImage('nav_galleryLeft', '/images/common/buttons/btn_left_hover.gif', this); } leftArrowAnchor.onclick = function() { previousThumbnails(); return false; } } else { leftArrowAnchor.onclick = function() { return false; } } leftArrowAnchor.appendChild(leftArrowImage); leftArrowContainer.empty(); leftArrowContainer.appendChild(leftArrowAnchor); //Right Arrow var rightArrowContainer = $$('div.rightArrow')[0]; var rightArrowImage = new Element('img', { 'src': (rightButtonDisabled ? "/images/common/buttons/btn_right_disabled.gif" : "/images/common/buttons/btn_right_default.gif"), 'name': "nav_galleryRight", 'border': "0", 'alt': "Right Arrow" }); var rightArrowAnchor = new Element('a', { 'href': "#" }); if (!rightButtonDisabled) { rightArrowAnchor.onmouseout = function() { restoreImage('nav_galleryRight', this); } rightArrowAnchor.onmouseover = function() { hoverImage('nav_galleryRight', '/images/common/buttons/btn_right_hover.gif', this); } rightArrowAnchor.onclick = function() { nextThumbnails(); return false; } } else { rightArrowAnchor.onclick = function() { return false; } } rightArrowAnchor.appendChild(rightArrowImage); rightArrowContainer.empty(); rightArrowContainer.appendChild(rightArrowAnchor); //Thumbnail Pages var pagesContainer = $$('div.pages')[0]; pagesContainer.empty(); var stackLimiter = 0; while (stackLimiter < _numberOfThumbnailSets) { var start = stackLimiter; var end = Math.min(stackLimiter + 10, _numberOfThumbnailSets); (function loop(i) //Hideously ugly hack to get around javascript's total ignorance of scope { if (i >= end) { return; } var pageIconImage = null; if (_currentThumbnailSet == i) { pageIconImage = new Element('img', { 'src': "/images/slideshow/page_current.gif", 'alt': "Current Page Marker", 'border': "0", 'class': "pageIndicator" }); } else { pageIconImage = new Element('img', { 'src': "/images/slideshow/page_other.gif", 'alt': "Other Page Marker", 'border': "0", 'class': "pageIndicator" }); } var pageIndex = i; var pageIconAnchor = new Element('a', { 'href': "#", 'events': { 'click': function() { gotoThumbnailPage(pageIndex); } } }); pageIconAnchor.appendChild(pageIconImage); pagesContainer.appendChild(pageIconAnchor); loop(i + 1); })(start); stackLimiter = end; } _updateThumbnailLight(); } function _updateThumbnailLight() { var thumbnailPages = $$('div.thumbnailBar'); if (thumbnailPages == null || thumbnailPages.length == 0) { return; } var thumbnailsInPage = thumbnailPages[_currentThumbnailSet].getElementsByTagName("li"); var pageFirstIndex = 8 * _currentThumbnailSet; var pageLastIndex = pageFirstIndex + Math.min(8, thumbnailsInPage.length) - 1; if (_currentImageIndex < pageFirstIndex || _currentImageIndex > pageLastIndex) //Not here { _highlightThumbnailIndex(-2); } else { _highlightThumbnailIndex(_currentImageIndex - pageFirstIndex); } } function _highlightThumbnailIndex(index) { var overlay = $('thumbnailBarOverlay'); if (overlay == null) { return; } if (index < 0) { overlay.setStyle('left', -990); return; } var thumbnails = $$('#thumbnailBars li'); var offsetX = thumbnails[index].offsetLeft; //alert("Start: " + offsetX); if (Browser.Engine.trident) { offsetX += thumbnails[index].offsetParent.offsetLeft; //alert("IE Offset: " + offsetX); } offsetX += thumbnails[index].getStyle('padding-left').toInt(); //alert("Padding: " + offsetX); offsetX = -900 + offsetX; //alert("Final: " + offsetX); overlay.setStyle('left', offsetX); } /*************************************************** * Image Switching ***************************************************/ function previousImage() { var images = $$('span.galleryImageEntry'); var outIndex = _currentImageIndex; var inIndex = outIndex - 1; if (_currentImageIndex == 0) { inIndex = images.length - 1; } _transitionFromImageToImage(outIndex, inIndex); } function nextImage() { var images = $$('span.galleryImageEntry'); var outIndex = _currentImageIndex; var inIndex = outIndex + 1; if (_currentImageIndex >= images.length - 1) { inIndex = 0; } _transitionFromImageToImage(outIndex, inIndex); } function _transitionFromImageToImage(fromImage, toImage) { if (fromImage == toImage) return; var images = $$('span.galleryImageEntry'); var fxOptions = {duration:1000, transition:Fx.Transitions.Cubic.easeInOut, wait:false, property: 'opacity'}; var imageFxOut = new Fx.Tween(images[fromImage], fxOptions); var imageFxIn = new Fx.Tween(images[toImage], fxOptions); imageFxOut.start(1, 0); imageFxIn.start(0, 1); _currentImageIndex = toImage; _updateThumbnailLight(); } function gotoImage(event) { pause(); var mouseX = event.clientX; var mouseY = event.clientY; var thumbnailBarLoc = $('thumbnailBars').getPosition(); mouseX -= thumbnailBarLoc.x; mouseY -= thumbnailBarLoc.y; var thumbnails = $$('#thumbnailBars li'); var clickedIndex = -1; for (var i = 0; i < thumbnails.length; i++) { var t = thumbnails[i]; var tSize = t.getSize(); var offsetX = t.offsetLeft; if (Browser.Engine.trident) { offsetX += t.offsetParent.offsetLeft; } offsetX += t.getStyle('padding-left').toInt(); if (mouseX > offsetX && mouseX < offsetX + tSize.x) { clickedIndex = i; break; } } clickedIndex += 8 * _currentThumbnailSet; var images = $$('span.galleryImageEntry'); if (clickedIndex < 0 || clickedIndex > images.length - 1) { return; } _transitionFromImageToImage(_currentImageIndex, clickedIndex); } (window.addEventListener) ? window.addEventListener("keydown", function(event) { return _bodyKeyPressed(event); }, true) : window.attachEvent("onkeydown", function(event) { return _bodyKeyPressed(event); }); function _bodyKeyPressed(event) { if (event.keyCode == 37) //Left { previousImage(); } else if (event.keyCode == 39) //Right { nextImage(); } else if (event.keyCode == 33) //Page up { previousThumbnails(); _stopEvent(event); return false; } else if (event.keyCode == 34) //Page down { nextThumbnails(); _stopEvent(event); return false; } return true; } /*************************************************** * Slideshow ***************************************************/ (window.addEventListener) ? window.addEventListener("load", initAutoplay, false) : window.attachEvent("onload", initAutoplay); function initAutoplay() { _updatePlayPauseBezel(); setInterval(_autoplay, 5000); } function _autoplay() { if (_isPlaying) { nextImage(); } } function play() { _isPlaying = true; _updatePlayPauseBezel(); mouseMovedInSlideshow(); } function pause() { _isPlaying = false; _updatePlayPauseBezel(); mouseMovedInSlideshow(); } function togglePlayPause() { _isPlaying = !_isPlaying; _updatePlayPauseBezel(); mouseMovedInSlideshow(); }