//	Lightbox Slideshow v1.2 (compatible with Prototype 1.6)
//	by Justin Barkhuff - http://www.justinbarkhuff.com/lab/lightbox_slideshow/
//  Updated: 2008-01-11
//	Largely based on Lightbox v2.02
//	by Lokesh Dhakar - http://huddletogether.com/projects/lightbox2/
//	3/31/06
//	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
var Lightbox={
activeImage:null,
badObjects:['select','object','embed'],
container:null,
enableSlideshow:null,
groupName:null,
imageArray:[],
options:null,
overlayDuration:null,
overlayOpacity:null,
playSlides:null,
refTags:['a','area'],
relAttribute:null,
resizeDuration:null,
slideShowTimer:null,
startImage:null,
initialize:function(options){
if(!document.getElementsByTagName){return;}
this.options=$H({
animate:true,
autoPlay:true,
borderSize:10,
containerID:document,
enableSlideshow:true,
googleAnalytics:false,
imageDataLocation:'south',
initImage:'',
loop:false,
overlayDuration:.2,
overlayOpacity:.8,
prefix:'',
relAttribute:'lightbox',
resizeSpeed:7,
showGroupName:false,
slideTime:4,
strings:{
closeLink:'close',
loadingMsg:'loading',
nextLink:'next &raquo;',
prevLink:'&laquo; prev',
startSlideshow:'start slideshow',
stopSlideshow:'stop slideshow',
numDisplayPrefix:'Image',
numDisplaySeparator:'of'
}
}).merge(options);
if(this.options.get('animate')){
this.overlayDuration=Math.max(this.options.get('overlayDuration'),0);
this.options.set('resizeSpeed',Math.max(Math.min(this.options.get('resizeSpeed'),10),1));
this.resizeDuration=(11-this.options.get('resizeSpeed'))*0.15;
}else{
this.overlayDuration=0;
this.resizeDuration=0;
}
this.enableSlideshow=this.options.get('enableSlideshow');
this.overlayOpacity=Math.max(Math.min(this.options.get('overlayOpacity'),1),0);
this.playSlides=this.options.get('autoPlay');
this.container=$(this.options.get('containerID'));
this.relAttribute=this.options.get('relAttribute');
this.updateImageList();
var objBody=this.container!=document?this.container:document.getElementsByTagName('body').item(0);
var objOverlay=document.createElement('div');
objOverlay.setAttribute('id',this.getID('overlay'));
objOverlay.style.display='none';
objBody.appendChild(objOverlay);
Event.observe(objOverlay,'click',this.end.bindAsEventListener(this));
var objLightbox=document.createElement('div');
objLightbox.setAttribute('id',this.getID('lightbox'));
objLightbox.style.display='none';
objBody.appendChild(objLightbox);
var objImageDataContainer=document.createElement('div');
objImageDataContainer.setAttribute('id',this.getID('imageDataContainer'));
objImageDataContainer.className=this.getID('clearfix');
var objImageData=document.createElement('div');
objImageData.setAttribute('id',this.getID('imageData'));
objImageDataContainer.appendChild(objImageData);
var objImageDetails=document.createElement('div');
objImageDetails.setAttribute('id',this.getID('imageDetails'));
objImageData.appendChild(objImageDetails);
var objCaption=document.createElement('span');
objCaption.setAttribute('id',this.getID('caption'));
objImageDetails.appendChild(objCaption);
var objNumberDisplay=document.createElement('span');
objNumberDisplay.setAttribute('id',this.getID('numberDisplay'));
objImageDetails.appendChild(objNumberDisplay);
var objDetailsNav=document.createElement('span');
objDetailsNav.setAttribute('id',this.getID('detailsNav'));
objImageDetails.appendChild(objDetailsNav);
var objPrevLink=document.createElement('a');
objPrevLink.setAttribute('id',this.getID('prevLinkDetails'));
objPrevLink.setAttribute('href','javascript:void(0);');
objPrevLink.innerHTML=this.options.get('strings').prevLink;
objDetailsNav.appendChild(objPrevLink);
Event.observe(objPrevLink,'click',this.showPrev.bindAsEventListener(this));
var objNextLink=document.createElement('a');
objNextLink.setAttribute('id',this.getID('nextLinkDetails'));
objNextLink.setAttribute('href','javascript:void(0);');
objNextLink.innerHTML=this.options.get('strings').nextLink;
objDetailsNav.appendChild(objNextLink);
Event.observe(objNextLink,'click',this.showNext.bindAsEventListener(this));
var objSlideShowControl=document.createElement('a');
objSlideShowControl.setAttribute('id',this.getID('slideShowControl'));
objSlideShowControl.setAttribute('href','javascript:void(0);');
objDetailsNav.appendChild(objSlideShowControl);
Event.observe(objSlideShowControl,'click',this.toggleSlideShow.bindAsEventListener(this));
var objClose=document.createElement('div');
objClose.setAttribute('id',this.getID('close'));
objImageData.appendChild(objClose);
var objCloseLink=document.createElement('a');
objCloseLink.setAttribute('id',this.getID('closeLink'));
objCloseLink.setAttribute('href','javascript:void(0);');
objCloseLink.innerHTML=this.options.get('strings').closeLink;
objClose.appendChild(objCloseLink);
Event.observe(objCloseLink,'click',this.end.bindAsEventListener(this));
if(this.options.get('imageDataLocation')=='north'){
objLightbox.appendChild(objImageDataContainer);
}
var objOuterImageContainer=document.createElement('div');
objOuterImageContainer.setAttribute('id',this.getID('outerImageContainer'));
objLightbox.appendChild(objOuterImageContainer);
var objImageContainer=document.createElement('div');
objImageContainer.setAttribute('id',this.getID('imageContainer'));
objOuterImageContainer.appendChild(objImageContainer);
var objLightboxImage=document.createElement('img');
objLightboxImage.setAttribute('id',this.getID('lightboxImage'));
objImageContainer.appendChild(objLightboxImage);
var objHoverNav=document.createElement('div');
objHoverNav.setAttribute('id',this.getID('hoverNav'));
objImageContainer.appendChild(objHoverNav);
var objPrevLinkImg=document.createElement('a');
objPrevLinkImg.setAttribute('id',this.getID('prevLinkImg'));
objPrevLinkImg.setAttribute('href','javascript:void(0);');
objHoverNav.appendChild(objPrevLinkImg);
Event.observe(objPrevLinkImg,'click',this.showPrev.bindAsEventListener(this));
var objNextLinkImg=document.createElement('a');
objNextLinkImg.setAttribute('id',this.getID('nextLinkImg'));
objNextLinkImg.setAttribute('href','javascript:void(0);');
objHoverNav.appendChild(objNextLinkImg);
Event.observe(objNextLinkImg,'click',this.showNext.bindAsEventListener(this));
var objLoading=document.createElement('div');
objLoading.setAttribute('id',this.getID('loading'));
objImageContainer.appendChild(objLoading);
var objLoadingLink=document.createElement('a');
objLoadingLink.setAttribute('id',this.getID('loadingLink'));
objLoadingLink.setAttribute('href','javascript:void(0);');
objLoadingLink.innerHTML=this.options.get('strings').loadingMsg;
objLoading.appendChild(objLoadingLink);
Event.observe(objLoadingLink,'click',this.end.bindAsEventListener(this));
if(this.options.get('imageDataLocation')!='north'){
objLightbox.appendChild(objImageDataContainer);
}
if(this.options.get('initImage')!=''){
this.start($(this.options.get('initImage')));
}
},
updateImageList:function(){
var el,els,rel;
for(var i=0;i<this.refTags.length;i++){
els=this.container.getElementsByTagName(this.refTags[i]);
for(var j=0;j<els.length;j++){
el=els[j];
rel=String(el.getAttribute('rel'));
if(el.getAttribute('href')&&(rel.toLowerCase().match(this.relAttribute))){
el.onclick=function(){Lightbox.start(this);return false;}
}
}
}
},
start:function(imageLink){
this.hideBadObjects();
var pageSize=this.getPageSize();
$(this.getID('overlay')).setStyle({height:pageSize.pageHeight+'px'});
new Effect.Appear(this.getID('overlay'),{duration:this.overlayDuration,from:0,to:this.overlayOpacity});
this.imageArray=[];
this.groupName=null;
var rel=imageLink.getAttribute('rel');
var imageTitle='';
if(rel==this.relAttribute){
imageTitle=imageLink.getAttribute('title')?imageLink.getAttribute('title'):'';
this.imageArray.push({'link':imageLink.getAttribute('href'),'title':imageTitle});
this.startImage=0;
}else{
var els=this.container.getElementsByTagName(imageLink.tagName);
for(var i=0;i<els.length;i++){
var el=els[i];
if(el.getAttribute('href')&&(el.getAttribute('rel')==rel)){
imageTitle=el.getAttribute('title')?el.getAttribute('title'):'';
this.imageArray.push({'link':el.getAttribute('href'),'title':imageTitle});
if(el==imageLink){
this.startImage=this.imageArray.length-1;
}
}
}
this.groupName=rel.substring(this.relAttribute.length+1,rel.length-1);
}
var pageScroll=this.getPageScroll();
var lightboxTop=pageScroll.y+(pageSize.winHeight/15);
$(this.getID('lightbox')).setStyle({top:lightboxTop+'px'}).show();
this.changeImage(this.startImage);
},
changeImage:function(imageNum){
this.activeImage=imageNum;
this.disableKeyboardNav();
this.pauseSlideShow();
$(this.getID('loading')).show();
$(this.getID('lightboxImage')).hide();
$(this.getID('hoverNav')).hide();
$(this.getID('imageDataContainer')).hide();
$(this.getID('numberDisplay')).hide();
$(this.getID('detailsNav')).hide();
var imgPreloader=new Image();
imgPreloader.onload=function(){
$(Lightbox.getID('lightboxImage')).src=imgPreloader.src;
Lightbox.resizeImageContainer(imgPreloader.width,imgPreloader.height);
}
imgPreloader.src=this.imageArray[this.activeImage].link;
if(this.options.get('googleAnalytics')){
urchinTracker(this.imageArray[this.activeImage].link);
}
},
resizeImageContainer:function(imgWidth,imgHeight){
var cDims=$(this.getID('outerImageContainer')).getDimensions();
var xScale=((imgWidth+(this.options.get('borderSize')*2))/cDims.width)*100;
var yScale=((imgHeight+(this.options.get('borderSize')*2))/cDims.height)*100;
var wDiff=(cDims.width-this.options.get('borderSize')*2)-imgWidth;
var hDiff=(cDims.height-this.options.get('borderSize')*2)-imgHeight;
if(!(hDiff==0)){new Effect.Scale(this.getID('outerImageContainer'),yScale,{scaleX:false,duration:this.resizeDuration,queue:'front'});}
if(!(wDiff==0)){new Effect.Scale(this.getID('outerImageContainer'),xScale,{scaleY:false,delay:this.resizeDuration,duration:this.resizeDuration});}
if((hDiff==0)&&(wDiff==0)){
if(navigator.appVersion.indexOf('MSIE')!=-1){this.pause(250);}else{this.pause(100);}
}
$(this.getID('prevLinkImg')).setStyle({height:imgHeight+'px'});
$(this.getID('nextLinkImg')).setStyle({height:imgHeight+'px'});
$(this.getID('imageDataContainer')).setStyle({width:(imgWidth+(this.options.get('borderSize')*2))+'px'});

this.showImage();
},
showImage:function(){
$(this.getID('loading')).hide();
new Effect.Appear(this.getID('lightboxImage'),{duration:0.5,queue:'end',afterFinish:function(){Lightbox.updateDetails();}});
this.preloadNeighborImages();
},
updateDetails:function(){
$(this.getID('caption')).show();
$(this.getID('caption')).update(this.imageArray[this.activeImage].title);
if(this.imageArray.length>1){
var num_display=this.options.get('strings').numDisplayPrefix+' '+eval(this.activeImage+1)+' '+this.options.get('strings').numDisplaySeparator+' '+this.imageArray.length;
if(this.options.get('showGroupName')&&this.groupName!=''){
num_display+=' '+this.options.get('strings').numDisplaySeparator+' '+this.groupName;
}
$(this.getID('numberDisplay')).update(num_display).show();
if(!this.enableSlideshow){
$(this.getID('slideShowControl')).hide();
}
$(this.getID('detailsNav')).show();
}

new Effect.Parallel(
[new Effect.SlideDown(this.getID('imageDataContainer'),{sync:true}),
new Effect.Appear(this.getID('imageDataContainer'),{sync:true})],
{duration:.65,afterFinish:function(){Lightbox.updateNav();}}
);
},
updateNav:function(){
if(this.imageArray.length>1){
$(this.getID('hoverNav')).show();
if(this.enableSlideshow){
if(this.playSlides){
this.startSlideShow();
}else{
this.stopSlideShow();
}
}
}
this.enableKeyboardNav();
},
startSlideShow:function(){
this.playSlides=true;
this.slideShowTimer=new PeriodicalExecuter(function(pe){Lightbox.showNext();pe.stop();},this.options.get('slideTime'));
$(this.getID('slideShowControl')).update(this.options.get('strings').stopSlideshow);
},
stopSlideShow:function(){
this.playSlides=false;
if(this.slideShowTimer){
this.slideShowTimer.stop();
}
$(this.getID('slideShowControl')).update(this.options.get('strings').startSlideshow);
},
toggleSlideShow:function(){
if(this.playSlides){
this.stopSlideShow();
}else{
this.startSlideShow();
}
},
pauseSlideShow:function(){
if(this.slideShowTimer){
this.slideShowTimer.stop();
}
},
showNext:function(){
if(this.imageArray.length>1){
if(!this.options.get('loop')&&((this.activeImage==this.imageArray.length-1&&this.startImage==0)||(this.activeImage+1==this.startImage))){
return this.end();
}
if(this.activeImage==this.imageArray.length-1){
this.changeImage(0);
}else{
this.changeImage(this.activeImage+1);
}
}
},
showPrev:function(){
if(this.imageArray.length>1){
if(this.activeImage==0){
this.changeImage(this.imageArray.length-1);
}else{
this.changeImage(this.activeImage-1);
}
}
},
showFirst:function(){
if(this.imageArray.length>1){
this.changeImage(0);
}
},
showLast:function(){
if(this.imageArray.length>1){
this.changeImage(this.imageArray.length-1);
}
},
enableKeyboardNav:function(){
document.onkeydown=this.keyboardAction;
},
disableKeyboardNav:function(){
document.onkeydown='';
},
keyboardAction:function(e){
if(e==null){
keycode=event.keyCode;
}else{
keycode=e.which;
}
key=String.fromCharCode(keycode).toLowerCase();

if(key=='x'||key=='o'||key=='c'){
Lightbox.end();
}else if(key=='p'||key=='%'){
Lightbox.showPrev();
}else if(key=='n'||key=='\''){
Lightbox.showNext();
}else if(key=='f'){
Lightbox.showFirst();
}else if(key=='l'){
Lightbox.showLast();
}else if(key=='s'){
if(Lightbox.imageArray.length>0&&Lightbox.options.enableSlideshow){
Lightbox.toggleSlideShow();
}
}
},
preloadNeighborImages:function(){
var nextImageID=this.imageArray.length-1==this.activeImage?0:this.activeImage+1;
nextImage=new Image();
nextImage.src=this.imageArray[nextImageID].link
var prevImageID=this.activeImage==0?this.imageArray.length-1:this.activeImage-1;
prevImage=new Image();
prevImage.src=this.imageArray[prevImageID].link;
},
end:function(){
this.disableKeyboardNav();
this.pauseSlideShow();
$(this.getID('lightbox')).hide();
new Effect.Fade(this.getID('overlay'),{duration:this.overlayDuration});
this.showBadObjects();
},
showBadObjects:function(){
var els;
var tags=Lightbox.badObjects;
for(var i=0;i<tags.length;i++){
els=document.getElementsByTagName(tags[i]);
for(var j=0;j<els.length;j++){
$(els[j]).setStyle({visibility:'visible'});
}
}
},
hideBadObjects:function(){
var els;
var tags=Lightbox.badObjects;
for(var i=0;i<tags.length;i++){
els=document.getElementsByTagName(tags[i]);
for(var j=0;j<els.length;j++){
$(els[j]).setStyle({visibility:'hidden'});
}
}
},
pause:function(numberMillis){
var now=new Date();
var exitTime=now.getTime()+numberMillis;
while(true){
now=new Date();
if(now.getTime()>exitTime)
return;
}
},
getPageScroll:function(){
var x,y;
if(self.pageYOffset){
x=self.pageXOffset;
y=self.pageYOffset;
}else if(document.documentElement&&document.documentElement.scrollTop){
x=document.documentElement.scrollLeft;
y=document.documentElement.scrollTop;
}else if(document.body){
x=document.body.scrollLeft;
y=document.body.scrollTop;
}
return{x:x,y:y};
},
getPageSize:function(){
var scrollX,scrollY,windowX,windowY,pageX,pageY;
if(window.innerHeight&&window.scrollMaxY){
scrollX=document.body.scrollWidth;
scrollY=window.innerHeight+window.scrollMaxY;
}else if(document.body.scrollHeight>document.body.offsetHeight){
scrollX=document.body.scrollWidth;
scrollY=document.body.scrollHeight;
}else{
scrollX=document.body.offsetWidth;
scrollY=document.body.offsetHeight;
}
if(self.innerHeight){
windowX=self.innerWidth;
windowY=self.innerHeight;
}else if(document.documentElement&&document.documentElement.clientHeight){
windowX=document.documentElement.clientWidth;
windowY=document.documentElement.clientHeight;
}else if(document.body){
windowX=document.body.clientWidth;
windowY=document.body.clientHeight;
}
pageY=(scrollY<windowY)?windowY:scrollY;
pageX=(scrollX<windowX)?windowX:scrollX;
return{pageWidth:pageX,pageHeight:pageY,winWidth:windowX,winHeight:windowY};
},
getID:function(id){
return this.options.get('prefix')+id;
}
}
Event.observe(window,'load',function(){Lightbox.initialize();});