var gallery=new Class({initialize:function(element,options){this.setOptions({carouselAutohide:true,showArrows:true,showCarousel:true,showInfopane:true,showPlay:false,embedLinks:true,fadeDuration:500,timed:false,delay:9000,preloader:true,manualData:[],populateFrom:false,populateData:true,destroyAfterPopulate:true,elementSelector:"div.imageElement",titleSelector:"h3",subtitleSelector:"p",linkSelector:"a.open",imageSelector:"img.full",thumbnailSelector:"img.thumbnail",slideInfoZoneOpacity:0.7,slideInfoZoneSlide:true,carouselMinimizedOpacity:0.9,carouselMinimizedHeight:20,carouselMaximizedOpacity:0.9,thumbHeight:75,thumbWidth:100,thumbSpacing:10,thumbOpacity:0.2,textShowCarousel:'Pictures',showCarouselLabel:true,useThumbGenerator:false,thumbGenerator:'resizer.php',useExternalCarousel:false,carouselElement:false,activateCarouselScroller:true,baseClass:'jdGallery',withArrowsClass:'withArrows',useHistoryManager:false,customHistoryKey:false},options);this.fireEvent('onInit');this.currentIter=0;this.lastIter=0;this.maxIter=0;this.galleryElement=element;this.galleryData=this.options.manualData;this.galleryInit=1;this.galleryElements=Array();this.thumbnailElements=Array();this.galleryElement.addClass(this.options.baseClass);this.populateFrom=element;if(this.options.populateFrom)this.populateFrom=this.options.populateFrom;if(this.options.populateData)this.populateData();element.style.display="block";if(this.options.useHistoryManager)this.initHistory();if(this.options.embedLinks){this.currentLink=new Element('a').addClass('open').setProperties({href:'#',title:''}).injectInside(element);if((!this.options.showArrows)&&(!this.options.showCarousel)){this.galleryElement=element}else this.currentLink.setStyle('display','none')};this.constructElements();if((this.galleryData.length>1)&&(this.options.showArrows)){var leftArrow=new Element('a').addClass('left').addEvent('click',this.prevItem.bind(this)).injectInside(element),rightArrow=new Element('a').addClass('right').addEvent('click',this.nextItem.bind(this)).injectInside(element);this.galleryElement.addClass(this.options.withArrowsClass)};this.loadingElement=new Element('div').addClass('loadingElement').injectInside(element);if(this.options.showInfopane)this.initInfoSlideshow();if(this.options.showCarousel)this.initCarousel();this.doSlideShow(1)},populateData:function(){currentArrayPlace=this.galleryData.length;options=this.options;var data=this.galleryData;this.populateFrom.getElements(options.elementSelector).each(function(el){elementDict={image:el.getElement(options.imageSelector).getProperty('src'),number:currentArrayPlace};if((options.showInfopane)|(options.showCarousel)){if(!el.getElement(options.titleSelector)){var temptitle=""}else var temptitle=el.getElement(options.titleSelector).innerHTML;if(!el.getElement(options.subtitleSelector)){var tempsubtitle=""}else var tempsubtitle=el.getElement(options.subtitleSelector).innerHTML;Object.extend(elementDict,{title:temptitle,description:tempsubtitle})};if(options.embedLinks)Object.extend(elementDict,{link:el.getElement(options.linkSelector).href||false,linkTitle:el.getElement(options.linkSelector).title||false});if((!options.useThumbGenerator)&&(options.showCarousel)){Object.extend(elementDict,{thumbnail:el.getElement(options.thumbnailSelector).src})}else if(options.useThumbGenerator)Object.extend(elementDict,{thumbnail:options.thumbGenerator+'?imgfile='+elementDict.image+'&max_width='+options.thumbWidth+'&max_height='+options.thumbHeight});data[currentArrayPlace]=elementDict;currentArrayPlace++;if(this.options.destroyAfterPopulate)el.remove()});this.galleryData=data;this.fireEvent('onPopulated')},constructElements:function(){el=this.galleryElement;this.maxIter=this.galleryData.length;var currentImg;for(i=0;i<this.galleryData.length;i++){var currentImg=new Fx.Style(new Element('div').addClass('slideElement').setStyles({position:'absolute',backgroundImage:"url('"+this.galleryData[i].image+"')",opacity:'0'}).injectInside(el),'opacity',{duration:this.options.fadeDuration});this.galleryElements[parseInt(i)]=currentImg}},destroySlideShow:function(element){var myClassName=element.className,newElement=new Element('div').addClass('myClassName');element.parentNode.replaceChild(newElement,element)},startSlideShow:function(){this.fireEvent('onStart');this.loadingElement.style.display="none";this.lastIter=this.maxIter-1;this.currentIter=0;this.galleryInit=0;this.galleryElements[parseInt(this.currentIter)].set(1);if(this.options.showInfopane)this.showInfoSlideShow.delay(1000,this);this.prepareTimer();if(this.options.embedLinks)this.makeLink(this.currentIter)},nextItem:function(){this.fireEvent('onNextCalled');this.nextIter=this.currentIter+1;if(this.nextIter>=this.maxIter)this.nextIter=0;this.galleryInit=0;this.goTo(this.nextIter)},prevItem:function(){this.fireEvent('onPreviousCalled');this.nextIter=this.currentIter-1;if(this.nextIter<=-1)this.nextIter=this.maxIter-1;this.galleryInit=0;this.goTo(this.nextIter)},goTo:function(num){this.clearTimer();if(this.options.embedLinks)this.clearLink();if(this.options.showInfopane){this.slideInfoZone.clearChain();this.hideInfoSlideShow().chain(this.changeItem.pass(num,this))}else this.changeItem.delay(500,this,num);if(this.options.embedLinks)this.makeLink(num);this.prepareTimer();if(this.options.carouselAutohide)this.fireEvent('onHideCarousel')},changeItem:function(num){this.fireEvent('onStartChanging');this.galleryInit=0;if(this.currentIter!=num){for(i=0;i<this.maxIter;i++)if((i!=this.currentIter))this.galleryElements[i].set(0);if(num>this.currentIter){this.galleryElements[num].custom(1)}else{this.galleryElements[num].set(1);this.galleryElements[this.currentIter].custom(0)};this.currentIter=num};this.doSlideShow.bind(this)();this.fireEvent('onChanged')},clearTimer:function(){if(this.options.timed)$clear(this.timer)},prepareTimer:function(){if(this.options.timed)this.timer=this.nextItem.delay(this.options.delay,this)},doSlideShow:function(position){if(this.galleryInit==1){imgPreloader=new Image();imgPreloader.onload=function(){this.startSlideShow.delay(10,this)}.bind(this);imgPreloader.src=this.galleryData[0].image}else if(this.options.showInfopane)if(this.options.showInfopane){this.showInfoSlideShow.delay((500+this.options.fadeDuration),this)}else if((this.options.showCarousel)&&(this.options.activateCarouselScroller))this.centerCarouselOn(position)},initCarousel:function(){var carouselElement;if(!this.options.useExternalCarousel){var carouselContainerElement=new Element('div').addClass('carouselContainer').injectInside(this.galleryElement);this.carouselContainer=new Fx.Styles(carouselContainerElement,{transition:Fx.Transitions.expoOut});this.carouselContainer.normalHeight=carouselContainerElement.offsetHeight;this.carouselContainer.set({opacity:this.options.carouselMinimizedOpacity,top:(this.options.carouselMinimizedHeight-this.carouselContainer.normalHeight)});this.carouselBtn=new Element('a').addClass('carouselBtn').setProperties({title:this.options.textShowCarousel}).setHTML(this.options.textShowCarousel).injectInside(carouselContainerElement);this.carouselBtn.addEvent('click',function(){this.carouselContainer.clearTimer();this.toggleCarousel()}.bind(this));this.carouselActive=false;if(this.options.showPlay)this.startStopEl=new Element('a').addClass('play').addEvent('click',this.startStop.bind(this)).injectInside(carouselContainerElement);carouselElement=new Element('div').addClass('carousel').injectInside(carouselContainerElement);this.carousel=new Fx.Styles(carouselElement)}else carouselElement=this.options.carouselElement.addClass('jdExtCarousel');this.carouselElement=new Fx.Styles(carouselElement,{transition:Fx.Transitions.expoOut});this.carouselElement.normalHeight=carouselElement.offsetHeight;if(this.options.showCarouselLabel)this.carouselLabel=new Element('p').addClass('label').injectInside(carouselElement);carouselWrapper=new Element('div').addClass('carouselWrapper').injectInside(carouselElement);this.carouselWrapper=new Fx.Styles(carouselWrapper,{transition:Fx.Transitions.expoOut});this.carouselWrapper.normalHeight=carouselWrapper.offsetHeight;this.carouselInner=new Element('div').addClass('carouselInner').injectInside(carouselWrapper);if(this.options.activateCarouselScroller){this.carouselWrapper.scroller=new Scroller(carouselWrapper,{area:100,velocity:0.2});this.carouselWrapper.elementScroller=new Fx.Scroll(carouselWrapper,{duration:400,onStart:this.carouselWrapper.scroller.stop.bind(this.carouselWrapper.scroller),onComplete:this.carouselWrapper.scroller.start.bind(this.carouselWrapper.scroller)})};this.constructThumbnails();this.carouselInner.normalWidth=((this.maxIter*(this.options.thumbWidth+this.options.thumbSpacing+2))+this.options.thumbSpacing)+"px";if(!this.options.useExternalCarousel)this.carouselInner.style.width=this.carouselInner.normalWidth},toggleCarousel:function(){if(this.carouselActive){this.hideCarousel()}else this.showCarousel()},startStop:function(){if(this.options.timed){$clear(this.timer);this.options.timed=false;this.startStopEl.toggleClass('pause')}else{this.startStopEl.toggleClass('pause');this.options.timed=true;this.timer=this.nextItem(this)}},showCarousel:function(){this.fireEvent('onShowCarousel');this.carouselContainer.custom({opacity:this.options.carouselMaximizedOpacity,top:0}).addEvent('onComplete',function(){this.carouselActive=true;this.carouselWrapper.scroller.start()}.bind(this))},hideCarousel:function(){if(this.carouselContainer){this.fireEvent('onHideCarousel');var targetTop=this.options.carouselMinimizedHeight-this.carouselContainer.normalHeight;this.carouselContainer.custom({opacity:this.options.carouselMinimizedOpacity,top:targetTop}).addEvent('onComplete',function(){this.carouselActive=false;this.carouselWrapper.scroller.stop()}.bind(this))}},constructThumbnails:function(){element=this.carouselInner;for(i=0;i<this.galleryData.length;i++){var currentImg=new Fx.Style(new Element('div').addClass("thumbnail").setStyles({backgroundImage:"url('"+this.galleryData[i].thumbnail+"')",backgroundPosition:"center center",backgroundRepeat:'no-repeat',marginLeft:this.options.thumbSpacing+"px",width:this.options.thumbWidth+"px",height:this.options.thumbHeight+"px"}).injectInside(element),"opacity",{duration:200}).set(options.thumbOpacity);currentImg.element.addEvents({mouseover:function(myself){myself.clearTimer();myself.custom(0.99);if(this.options.showCarouselLabel)$(this.carouselLabel).setHTML('<span class="number">'+(myself.relatedImage.number+1)+"/"+this.maxIter+":</span> "+myself.relatedImage.title)}.pass(currentImg,this),mouseout:function(myself){myself.clearTimer();myself.custom(options.thumbOpacity)}.pass(currentImg,this),click:function(myself){this.goTo(myself.relatedImage.number);if(this.options.carouselAutohide)this.hideCarousel()}.pass(currentImg,this)});currentImg.relatedImage=this.galleryData[i];this.thumbnailElements[parseInt(i)]=currentImg}},clearThumbnailsHighlights:function(){for(i=0;i<this.galleryData.length;i++){this.thumbnailElements[i].clearTimer();this.thumbnailElements[i].custom(0.2)}},changeThumbnailsSize:function(width,height){for(i=0;i<this.galleryData.length;i++){this.thumbnailElements[i].clearTimer();this.thumbnailElements[i].element.setStyles({width:width+"px",height:height+"px"})}},centerCarouselOn:function(num){if(!this.carouselWallMode){var carouselElement=this.thumbnailElements[num],position=carouselElement.element.offsetLeft+(carouselElement.element.offsetWidth/2),carouselWidth=this.carouselWrapper.element.offsetWidth,carouselInnerWidth=this.carouselInner.offsetWidth,diffWidth=carouselWidth/2,scrollPos=position-diffWidth;this.carouselWrapper.elementScroller.scrollTo(scrollPos,0)}},initInfoSlideshow:function(){this.slideInfoZone=new Fx.Styles(new Element('div').addClass('slideInfoZone').injectInside($(this.galleryElement))).set({opacity:0});var slideInfoZoneTitle=new Element('h2').injectInside(this.slideInfoZone.element),slideInfoZoneDescription=new Element('p').injectInside(this.slideInfoZone.element);this.slideInfoZone.normalHeight=this.slideInfoZone.element.offsetHeight;this.slideInfoZone.element.setStyle('opacity',0)},changeInfoSlideShow:function(){this.hideInfoSlideShow.delay(10,this);this.showInfoSlideShow.delay(500,this)},showInfoSlideShow:function(){this.fireEvent('onShowInfopane');this.slideInfoZone.clearTimer();element=this.slideInfoZone.element;this.title=this.galleryData[this.currentIter].title;this.description=this.galleryData[this.currentIter].description;if(this.title!='&nbsp;'&&this.title!=''){element.getElement('h2').setHTML(this.galleryData[this.currentIter].title);element.getElement('p').setHTML(this.galleryData[this.currentIter].description);if(this.options.slideInfoZoneSlide){this.slideInfoZone.custom({opacity:[0,this.options.slideInfoZoneOpacity],height:[0,this.slideInfoZone.normalHeight]})}else this.slideInfoZone.custom({opacity:[0,this.options.slideInfoZoneOpacity]})};if(this.options.showCarousel)this.slideInfoZone.chain(this.centerCarouselOn.pass(this.currentIter,this));return this.slideInfoZone},hideInfoSlideShow:function(){this.fireEvent('onHideInfopane');this.slideInfoZone.clearTimer();if(this.options.slideInfoZoneSlide){this.slideInfoZone.custom({opacity:0,height:0})}else this.slideInfoZone.custom({opacity:0});return this.slideInfoZone},makeLink:function(num){this.currentLink.setProperties({href:this.galleryData[num].link,title:this.galleryData[num].linkTitle});if(!((this.options.embedLinks)&&(!this.options.showArrows)&&(!this.options.showCarousel)))this.currentLink.setStyle('display','block')},clearLink:function(){this.currentLink.setProperties({href:'',title:''});if(!((this.options.embedLinks)&&(!this.options.showArrows)&&(!this.options.showCarousel)))this.currentLink.setStyle('display','none')},initHistory:function(){this.fireEvent('onHistoryInit');this.historyKey=this.galleryElement.id+'-picture';if(this.options.customHistoryKey)this.historyKey=this.options.customHistoryKey();this.history=HistoryManager.register(this.historyKey,[1],function(values){if(parseInt(values[0])-1<this.maxIter)this.goTo(parseInt(values[0])-1)}.bind(this),function(values){return[this.historyKey,'(',values[0],')'].join('')}.bind(this),this.historyKey+'\\((\\d+)\\)');this.addEvent('onChanged',function(){this.history.setValue(0,this.currentIter+1)}.bind(this));this.fireEvent('onHistoryInited')}});gallery.implement(new Events());gallery.implement(new Options())