JAMLite.widgets.Lightbox=Class.create();JAMLite.widgets.Lightbox.prototype={options:{},DOM:{body:null,overlay:null,lightbox:null,outerImageContainer:null,imageContainer:null,lightboxImage:null,hoverNav:null,prevLink:null,nextLink:null,loading:null,loadingLink:null,loadingImage:null,imageDataContainer:null,imageData:null,imageDetails:null,caption:null,numberDisplay:null,downloadContainer:null,downloadLink:null,downloadText:null,bottomNav:null,bottomNavClose:null,bottomNavCloseImage:null},imageArray:[],activeImage:undefined,downloadURL:/\[{1}download=(.[^\[^\]]*)\]{1}/,grouping:/\[{1}group=(\w*)\]{1}/,initialize:function(options){if(!window["Effect"]){JAMLite.throwException("Scriptaculous effects.js must be included for Lightbox.");return}this.options=Object.extend(this.options,options);this.updateImageList();this.keyboardAction=this.keyboardAction.bindAsEventListener(this);if(this.options.init.resizeSpeed>10){this.options.init.resizeSpeed=10}if(this.options.init.resizeSpeed<1){this.options.init.resizeSpeed=1}this.resizeDuration=this.options.init.animate?((11-this.options.init.resizeSpeed)*0.15):0;this.overlayDuration=this.options.init.animate?0.2:0;this.injectDOMNodes()},injectDOMNodes:function(){var size=(this.options.init.animate?250:1)+"px";var lightboxTemplate=new Template(this.options.template);var templateEval=lightboxTemplate.evaluate(this.options.classNames);this.DOM.body=$(document.body);this.DOM.body.insert(templateEval);this.DOM.overlay=this.DOM.body.down("."+this.options.classNames.overlay).hide().setStyle({backgroundColor:this.options.init.backgroundColor}).observe("click",(function(){this.end()}).bind(this));this.DOM.lightbox=this.DOM.body.down("."+this.options.classNames.lightbox).hide().observe("click",(function(event){if(event.element().className==this.options.classNames.lightbox){this.end()}}).bind(this));this.DOM.outerImageContainer=this.DOM.lightbox.down("."+this.options.classNames.outerImageContainer).setStyle({width:size,height:size});this.DOM.imageContainer=this.DOM.outerImageContainer.down("."+this.options.classNames.imageContainer);this.DOM.lightboxImage=this.DOM.imageContainer.down("."+this.options.classNames.lightboxImage);this.DOM.hoverNav=this.DOM.lightbox.down("."+this.options.classNames.hoverNav);this.DOM.prevLink=this.DOM.hoverNav.down("."+this.options.classNames.prevLink).observe("click",(function(event){event.stop();this.changeImage(this.activeImage-1)}).bindAsEventListener(this));this.DOM.nextLink=this.DOM.hoverNav.down("."+this.options.classNames.nextLink).observe("click",(function(event){event.stop();this.changeImage(this.activeImage+1)}).bindAsEventListener(this));this.DOM.loading=this.DOM.lightbox.down("."+this.options.classNames.loading);this.DOM.loadingLink=this.DOM.loading.down("."+this.options.classNames.loadingLink).observe("click",(function(event){event.stop();this.end()}).bind(this));this.DOM.loadingImage=this.DOM.loadingLink.down("."+this.options.classNames.loadingImage).src=this.options.init.fileLoadingImage;this.DOM.imageDataContainer=this.DOM.lightbox.down("."+this.options.classNames.imageDataContainer);this.DOM.imageData=this.DOM.imageDataContainer.down("."+this.options.classNames.imageData);this.DOM.imageDetails=this.DOM.imageData.down("."+this.options.classNames.imageDetails);this.DOM.caption=this.DOM.imageData.down("."+this.options.classNames.caption);this.DOM.numberDisplay=this.DOM.imageData.down("."+this.options.classNames.numberDisplay);this.DOM.downloadContainer=this.DOM.imageDataContainer.down("."+this.options.classNames.downloadContainer);this.DOM.downloadLink=this.DOM.downloadContainer.down("."+this.options.classNames.downloadLink);this.DOM.downloadText=this.DOM.downloadLink.down("."+this.options.classNames.downloadText);this.DOM.bottomNav=this.DOM.imageDataContainer.down("."+this.options.classNames.bottomNav);this.DOM.bottomNavClose=this.DOM.bottomNav.down("."+this.options.classNames.bottomNavClose).observe("click",(function(event){event.stop();this.end()}).bind(this));this.DOM.bottomNavCloseImage=this.DOM.bottomNavClose.down("."+this.options.classNames.bottomNavCloseImage).src=this.options.init.fileBottomNavCloseImage},updateImageList:function(){this.updateImageList=Prototype.emptyFunction;document.observe("click",(function(event){var target=event.findElement("a[rel^=lightbox]")||event.findElement("area[rel^=lightbox]");if(target){event.stop();this.start(target)}}).bind(this))},start:function(imageLink){$$("select","object","embed").each(function(node){node.style.visibility="hidden"});var arrayPageSize=this.getPageSize();this.DOM.overlay.setStyle({width:arrayPageSize[0]+"px",height:arrayPageSize[1]+"px"});new Effect.Appear(this.DOM.overlay,{duration:this.overlayDuration,from:0,to:this.options.init.overlayOpacity});this.imageArray=[];var imageNum=0;var dLink=imageLink.rel.match(this.downloadURL);var gSet=imageLink.rel.match(this.grouping);if(imageLink.rel=="lightbox"){this.imageArray.push([imageLink.href,imageLink.title])}else{if(dLink&&!gSet){this.imageArray.push([imageLink.href,imageLink.title,dLink[1]])}else{this.imageArray=$$(imageLink.tagName+"[href][rel*="+gSet[0]+"]").collect(function(anchor){return[anchor.href,anchor.title,(anchor.rel.match(this.downloadURL))?anchor.rel.match(this.downloadURL)[1]:null]}.bind(this)).uniq();while(this.imageArray[imageNum][0]!=imageLink.href){imageNum++}}}var arrayPageScroll=document.viewport.getScrollOffsets();var lightboxTop=arrayPageScroll[1]+(document.viewport.getHeight()/10);var lightboxLeft=arrayPageScroll[0];this.DOM.lightbox.setStyle({top:lightboxTop+"px",left:lightboxLeft+"px"}).show();this.changeImage(imageNum)},changeImage:function(imageNum){this.activeImage=imageNum;if(this.options.animate){this.DOM.loading.show()}this.DOM.lightboxImage.hide();this.DOM.hoverNav.hide();this.DOM.prevLink.hide();this.DOM.nextLink.hide();this.DOM.imageDataContainer.setStyle({opacity:0.0001});this.DOM.numberDisplay.hide();var imgPreloader=new Image();imgPreloader.onload=(function(){this.DOM.lightboxImage.src=this.imageArray[this.activeImage][0];this.resizeImageContainer(imgPreloader.width,imgPreloader.height)}).bind(this);imgPreloader.src=this.imageArray[this.activeImage][0];if(this.options.init.download){if(this.imageArray[this.activeImage][2]!=null){this.DOM.downloadContainer.setStyle({display:"block"});this.DOM.downloadLink.href=this.imageArray[this.activeImage][2];this.DOM.downloadText.update("DOWNLOAD")}else{this.DOM.downloadContainer.setStyle({display:"none"})}}},resizeImageContainer:function(imgWidth,imgHeight){var widthCurrent=this.DOM.outerImageContainer.getWidth();var heightCurrent=this.DOM.outerImageContainer.getHeight();var widthNew=(imgWidth+this.options.init.borderSize*2);var heightNew=(imgHeight+this.options.init.borderSize*2);var xScale=(widthNew/widthCurrent)*100;var yScale=(heightNew/heightCurrent)*100;var wDiff=widthCurrent-widthNew;var hDiff=heightCurrent-heightNew;if(hDiff!=0){new Effect.Scale(this.DOM.outerImageContainer,yScale,{scaleX:false,duration:this.resizeDuration,queue:"front"})}if(wDiff!=0){new Effect.Scale(this.DOM.outerImageContainer,xScale,{scaleY:false,duration:this.resizeDuration,delay:this.resizeDuration})}var timeout=0;if((hDiff==0)&&(wDiff==0)){timeout=100;if(Prototype.Browser.IE){timeout=250}}(function(){this.DOM.prevLink.setStyle({height:imgHeight+"px"});this.DOM.nextLink.setStyle({height:imgHeight+"px"});this.DOM.imageDataContainer.setStyle({width:widthNew+"px"});this.showImage()}).bind(this).delay(timeout/1000)},showImage:function(){this.DOM.loading.hide();new Effect.Appear(this.DOM.lightboxImage,{duration:this.resizeDuration,queue:"end",afterFinish:(function(){this.updateDetails()}).bind(this)});this.preloadNeighborImages()},updateDetails:function(){if(this.imageArray[this.activeImage][1]!=""){this.DOM.caption.update(this.imageArray[this.activeImage][1]).show()}if(this.imageArray.length>1){this.DOM.numberDisplay.update(this.options.init.labelImage+" "+(this.activeImage+1)+" "+this.options.init.labelOf+"  "+this.imageArray.length).show()}new Effect.Parallel([new Effect.SlideDown(this.DOM.imageDataContainer,{sync:true,duration:this.resizeDuration,from:0,to:1}),new Effect.Appear(this.DOM.imageDataContainer,{sync:true,duration:this.resizeDuration})],{duration:this.resizeDuration,afterFinish:(function(){var arrayPageSize=this.getPageSize();this.DOM.overlay.setStyle({height:arrayPageSize[1]+"px"});this.updateNav()}).bind(this)})},updateNav:function(){this.DOM.hoverNav.show();if(this.activeImage>0){this.DOM.prevLink.show()}if(this.activeImage<(this.imageArray.length-1)){this.DOM.nextLink.show()}this.enableKeyboardNav()},enableKeyboardNav:function(){document.observe("keydown",this.keyboardAction)},disableKeyboardNav:function(){document.stopObserving("keydown",this.keyboardAction)},keyboardAction:function(event){var keycode=event.keyCode;var escapeKey;if(event.DOM_VK_ESCAPE){escapeKey=event.DOM_VK_ESCAPE}else{escapeKey=27}var key=String.fromCharCode(keycode).toLowerCase();if(key.match(/x|o|c/)||(keycode==escapeKey)){this.end()}else{if((key=="p")||(keycode==37)){if(this.activeImage!=0){this.disableKeyboardNav();this.changeImage(this.activeImage-1)}}else{if((key=="n")||(keycode==39)){if(this.activeImage!=(this.imageArray.length-1)){this.disableKeyboardNav();this.changeImage(this.activeImage+1)}}}}},preloadNeighborImages:function(){var preloadNextImage,preloadPrevImage;if(this.imageArray.length>this.activeImage+1){preloadNextImage=new Image();preloadNextImage.src=this.imageArray[this.activeImage+1][0]}if(this.activeImage>0){preloadPrevImage=new Image();preloadPrevImage.src=this.imageArray[this.activeImage-1][0]}},end:function(){this.disableKeyboardNav();this.DOM.lightbox.hide();new Effect.Fade(this.DOM.overlay,{duration:this.overlayDuration});$$("select","object","embed").each(function(node){node.style.visibility="visible"})},getPageSize:function(){var xScroll,yScroll;if(window.innerHeight&&window.scrollMaxY){xScroll=window.innerWidth+window.scrollMaxX;yScroll=window.innerHeight+window.scrollMaxY}else{if(document.body.scrollHeight>document.body.offsetHeight){xScroll=document.body.scrollWidth;yScroll=document.body.scrollHeight}else{xScroll=document.body.offsetWidth;yScroll=document.body.offsetHeight}}var windowWidth,windowHeight;if(self.innerHeight){if(document.documentElement.clientWidth){windowWidth=document.documentElement.clientWidth}else{windowWidth=self.innerWidth}windowHeight=self.innerHeight}else{if(document.documentElement&&document.documentElement.clientHeight){windowWidth=document.documentElement.clientWidth;windowHeight=document.documentElement.clientHeight}else{if(document.body){windowWidth=document.body.clientWidth;windowHeight=document.body.clientHeight}}}if(yScroll<windowHeight){pageHeight=windowHeight}else{pageHeight=yScroll}if(xScroll<windowWidth){pageWidth=xScroll}else{pageWidth=windowWidth}return[pageWidth,pageHeight]}};
