/*
    This file is part of JonDesign's SmoothGallery v2.1beta1.

    JonDesign's SmoothGallery is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.

    JonDesign's SmoothGallery is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with JonDesign's SmoothGallery; if not, write to the Free Software
    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

    Main Developer: Jonathan Schemoul (JonDesign: http://www.jondesign.net/)
    Contributed code by:
    - Christian Ehret (bugfix)
	- Nitrix (bugfix)
	- Valerio from Mad4Milk for his great help with the carousel scrolling and many other things.
	- Archie Cowan for helping me find a bugfix on carousel inner width problem.
	- Tomocchino from #mootools for the preloader class
	Many thanks to:
	- The mootools team for the great mootools lib, and it's help and support throughout the project.
	- Harald Kirschner (digitarald: http://digitarald.de/) for all his great libs. Some used here as plugins.
*/

function isBody(a){return(/^(?:body|html)$/i).test(a.tagName)}Element.implement({getPosition:function(c){if(isBody(this)){return{x:0,y:0}}var b=this,a={x:0,y:0};while(b){a.x+=b.offsetLeft;a.y+=b.offsetTop;b=b.offsetParent}var d=(c)?$(c).getPosition():{x:0,y:0};return{x:a.x-d.x,y:a.y-d.y}}});var gallery={Implements:[Events,Options],options:{showArrows:true,showCarousel:true,showInfopane:true,embedLinks:true,fadeDuration:500,timed:false,delay:9000,startDelay:false,preloader:true,preloaderImage:true,preloaderErrorImage:true,manualData:[],populateFrom:false,populateData:true,destroyAfterPopulate:true,elementSelector:"div.imageElement",titleSelector:"h3",subtitleSelector:"p",linkSelector:"a.open",imageSelector:"img.full",thumbnailSelector:"img.thumbnail",defaultTransition:"fade",slideInfoZoneOpacity:0.7,slideInfoZoneSlide:true,carouselMinimizedOpacity:0.4,carouselMinimizedHeight:20,carouselMaximizedOpacity:0.9,thumbHeight:75,thumbWidth:100,thumbSpacing:10,thumbIdleOpacity:0.2,textShowCarousel:"Pictures",showCarouselLabel:true,thumbCloseCarousel:true,useThumbGenerator:false,thumbGenerator:"resizer.php",useExternalCarousel:false,carouselElement:false,carouselHorizontal:true,activateCarouselScroller:true,carouselPreloader:true,textPreloadingCarousel:"Loading...",baseClass:"jdGallery",withArrowsClass:"withArrows",useHistoryManager:false,customHistoryKey:false,useReMooz:false},initialize:function(c,b){this.setOptions(b);this.fireEvent("onInit");this.currentIter=0;this.lastIter=0;this.maxIter=0;this.previousImg=false;this.galleryElement=c;this.galleryData=this.options.manualData;this.galleryInit=1;this.galleryElements=Array();this.thumbnailElements=Array();this.galleryElement.addClass(this.options.baseClass);if(this.options.useReMooz&&(this.options.defaultTransition=="fade")){this.options.defaultTransition="crossfade"}this.populateFrom=c;if(this.options.populateFrom){this.populateFrom=this.options.populateFrom}if(this.options.populateData){this.populateData()}c.style.display="block";if(this.options.useHistoryManager){this.initHistory()}if((this.options.embedLinks)|(this.options.useReMooz)){this.currentLink=new Element("a").addClass("open").setProperties({href:"#",title:""}).injectInside(c);if((!this.options.showArrows)&&(!this.options.showCarousel)){this.galleryElement=c=this.currentLink}else{this.currentLink.setStyle("display","none")}}this.constructElements();if((this.galleryData.length>1)&&(this.options.showArrows)){var d=new Element("a").addClass("left").addEvent("click",this.prevItem.bind(this)).injectInside(c);var a=new Element("a").addClass("right").addEvent("click",this.nextItem.bind(this)).injectInside(c);this.galleryElement.addClass(this.options.withArrowsClass)}this.loadingElement=new Element("div").addClass("loadingElement").injectInside(c);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 a=$A(this.galleryData);a.extend(this.populateGallery(this.populateFrom,currentArrayPlace));this.galleryData=a;this.fireEvent("onPopulated")},populateGallery:function(a,c){var b=[];options=this.options;currentArrayPlace=c;a.getElements(options.elementSelector).each(function(d){elementDict=$H({image:d.getElement(options.imageSelector).getProperty("src"),number:currentArrayPlace,transition:this.options.defaultTransition});if((options.showInfopane)|(options.showCarousel)){elementDict.extend({title:d.getElement(options.titleSelector).innerHTML,description:d.getElement(options.subtitleSelector).innerHTML})}if((options.embedLinks)|(options.useReMooz)){elementDict.extend({link:d.getElement(options.linkSelector).href||false,linkTitle:d.getElement(options.linkSelector).title||false,linkTarget:d.getElement(options.linkSelector).getProperty("target")||false})}if((!options.useThumbGenerator)&&(options.showCarousel)){elementDict.extend({thumbnail:d.getElement(options.thumbnailSelector).getProperty("src")})}else{if(options.useThumbGenerator){elementDict.extend({thumbnail:options.thumbGenerator+"?imgfile="+elementDict.image+"&max_width="+options.thumbWidth+"&max_height="+options.thumbHeight})}}b.extend([elementDict]);currentArrayPlace++;if(this.options.destroyAfterPopulate){d.dispose()}});return b},constructElements:function(){el=this.galleryElement;this.maxIter=this.galleryData.length;var a;for(i=0;i<this.galleryData.length;i++){var a=new Fx.Morph(new Element("div").addClass("slideElement").setStyles({position:"absolute",left:"0px",right:"0px",margin:"0px",padding:"0px",backgroundPosition:"center center",opacity:"0"}).injectInside(el),{duration:this.options.fadeDuration});if(this.options.preloader){a.source=this.galleryData[i].image;a.loaded=false;a.load=function(b,c){if(!b.loaded){this.galleryData[c].imgloader=new Asset.image(b.source,{onload:function(d,e){d.element.setStyle("backgroundImage","url('"+d.source+"')");d.loaded=true;d.width=this.galleryData[e].imgloader.width;d.height=this.galleryData[e].imgloader.height}.pass([b,c],this)})}}.pass([a,i],this)}else{a.element.setStyle("backgroundImage","url('"+this.galleryData[i].image+"')")}this.galleryElements[parseInt(i)]=a}},destroySlideShow:function(a){var b=a.className;var c=new Element("div").addClass("myClassName");a.parentNode.replaceChild(c,a)},startSlideShow:function(){this.fireEvent("onStart");this.loadingElement.style.display="none";this.lastIter=this.maxIter-1;this.currentIter=0;this.galleryElements[parseInt(this.currentIter)].set({opacity:1});if(this.options.showInfopane){this.showInfoSlideShow.delay(1000,this)}if(this.options.useReMooz){this.makeReMooz.delay(1000,this)}var a=formatString(this.options.textShowCarousel,this.currentIter+1,this.maxIter);if(this.options.showCarousel&&(!this.options.carouselPreloader)&&(!this.options.useExternalCarousel)){this.carouselBtn.set("html",a).setProperty("title",a)}this.prepareTimer();if(this.options.embedLinks){this.makeLink(this.currentIter)}if(this.options.showCarousel){this.setThumbActive(this.thumbnailElements[0])}this.galleryInit=0},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(a){this.clearTimer();if(this.options.preloader){this.galleryElements[a].load();if(a==0){this.galleryElements[this.maxIter-1].load()}else{this.galleryElements[a-1].load()}if(a==(this.maxIter-1)){this.galleryElements[0].load()}else{this.galleryElements[a+1].load()}}if(this.options.embedLinks){this.clearLink()}if(this.options.showInfopane){this.slideInfoZone.clearChain();this.hideInfoSlideShow().chain(this.changeItem.pass(a,this))}else{this.currentChangeDelay=this.changeItem.delay(500,this,a)}if(this.options.embedLinks){this.makeLink(a)}this.prepareTimer();if(this.options.showCarousel){this.setThumbActive(this.thumbnailElements[a])}},changeItem:function(b){this.fireEvent("onStartChanging");this.galleryInit=0;if(this.currentIter!=b){for(i=0;i<this.maxIter;i++){if((i!=this.currentIter)){this.galleryElements[i].set({opacity:0})}}gallery.Transitions[this.galleryData[b].transition].pass([this.galleryElements[this.currentIter],this.galleryElements[b],this.currentIter,b],this)();this.currentIter=b;if(this.options.useReMooz){this.makeReMooz()}}var a=formatString(this.options.textShowCarousel,b+1,this.maxIter);if((this.options.showCarousel)&&(!this.options.useExternalCarousel)){this.carouselBtn.set("html",a).setProperty("title",a)}this.doSlideShow.bind(this)();this.fireEvent("onChanged")},setThumbActive:function(a){a.element.removeEvents("mouseout");a.start({opacity:0.99});if(this.previousImg){if(this.previousImg!=a){this.previousImg.start({opacity:this.options.thumbIdleOpacity});this.previousImg.element.addEvents({mouseout:function(b){b.cancel();b.start({opacity:this.options.thumbIdleOpacity})}.pass(this.previousImg,this)})}}this.previousImg=a},clearTimer:function(){if(this.options.timed){$clear(this.timer)}},prepareTimer:function(){if(this.options.timed){if(!this.options.startDelay){this.timer=this.nextItem.delay(this.options.delay,this)}else{if(this.galleryInit==1){this.timer=this.nextItem.delay(this.options.startDelay,this)}else{this.timer=this.nextItem.delay(this.options.delay,this)}}}},doSlideShow:function(a){if(this.galleryInit==1){imgPreloader=new Image();imgPreloader.onload=function(){this.startSlideShow.delay(10,this)}.bind(this);imgPreloader.src=this.galleryData[0].image;if(this.options.preloader){this.galleryElements[0].load()}}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(a)}}}}},createCarousel:function(){var b;if(!this.options.useExternalCarousel){var a=new Element("div").addClass("carouselContainer").injectInside(this.galleryElement);this.carouselContainer=new Fx.Morph(a,{transition:Fx.Transitions.Expo.easeOut});this.carouselContainer.normalHeight=a.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}).injectInside(a);if(this.options.carouselPreloader){this.carouselBtn.set("html",this.options.textPreloadingCarousel)}else{this.carouselBtn.set("html",this.options.textShowCarousel)}this.carouselBtn.addEvent("click",function(){this.carouselContainer.cancel();this.toggleCarousel()}.bind(this));this.carouselActive=false;b=new Element("div").addClass("carousel").injectInside(a);this.carousel=new Fx.Morph(b)}else{b=$(this.options.carouselElement).addClass("jdExtCarousel")}this.carouselElement=new Fx.Morph(b,{transition:Fx.Transitions.Expo.easeOut});this.carouselElement.normalHeight=b.offsetHeight;if(this.options.showCarouselLabel){this.carouselLabel=new Element("p").addClass("label").injectInside(b)}carouselWrapper=new Element("div").addClass("carouselWrapper").injectInside(b);this.carouselWrapper=new Fx.Morph(carouselWrapper,{transition:Fx.Transitions.Expo.easeOut});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)})}},fillCarousel:function(){this.constructThumbnails();this.carouselInner.normalWidth=((this.maxIter*(this.options.thumbWidth+this.options.thumbSpacing+2))-this.options.thumbSpacing)+"px";if(this.options.carouselHorizontal){this.carouselInner.style.width=this.carouselInner.normalWidth}},initCarousel:function(){this.createCarousel();this.fillCarousel();if(this.options.carouselPreloader){this.preloadThumbnails()}},flushCarousel:function(){this.thumbnailElements.each(function(a){a.element.dispose();a=a.element=null});this.thumbnailElements=[]},toggleCarousel:function(){if(this.carouselActive){this.hideCarousel()}else{this.showCarousel()}},showCarousel:function(){this.fireEvent("onShowCarousel");this.carouselContainer.start({opacity:this.options.carouselMaximizedOpacity,top:0}).chain(function(){this.carouselActive=true;this.carouselWrapper.scroller.start();this.fireEvent("onCarouselShown");this.carouselContainer.options.onComplete=null}.bind(this))},hideCarousel:function(){this.fireEvent("onHideCarousel");var a=this.options.carouselMinimizedHeight-this.carouselContainer.normalHeight;this.carouselContainer.start({opacity:this.options.carouselMinimizedOpacity,top:a}).chain(function(){this.carouselActive=false;this.carouselWrapper.scroller.stop();this.fireEvent("onCarouselHidden");this.carouselContainer.options.onComplete=null}.bind(this))},constructThumbnails:function(){element=this.carouselInner;for(i=0;i<this.galleryData.length;i++){if(i==0){marginLeftThumbSpacing=0;opacityThumb=0.99}else{marginLeftThumbSpacing=this.options.thumbSpacing;opacityThumb=this.options.thumbIdleOpacity}var a=new Fx.Morph(new Element("div").addClass("thumbnail").setStyles({backgroundImage:"url('"+this.galleryData[i].thumbnail+"')",backgroundPosition:"center center",backgroundRepeat:"no-repeat",marginLeft:marginLeftThumbSpacing+"px",width:this.options.thumbWidth+"px",height:this.options.thumbHeight+"px"}).injectInside(element),{duration:200}).start({opacity:opacityThumb});a.element.addEvents({mouseover:function(b){b.cancel();b.start({opacity:0.99});if(this.options.showCarouselLabel){$(this.carouselLabel).set("html",'<span class="number">'+(b.relatedImage.number+1)+"/"+this.maxIter+":</span> "+b.relatedImage.title)}}.pass(a,this),mouseout:function(b){b.cancel();b.start({opacity:this.options.thumbIdleOpacity})}.pass(a,this),click:function(b){this.goTo(b.relatedImage.number);if(this.options.thumbCloseCarousel&&(!this.options.useExternalCarousel)){this.hideCarousel()}}.pass(a,this)});a.relatedImage=this.galleryData[i];this.thumbnailElements[parseInt(i)]=a}},log:function(a){if(console.log){console.log(a)}},preloadThumbnails:function(){var a=[];for(i=0;i<this.galleryData.length;i++){a[parseInt(i)]=this.galleryData[i].thumbnail}this.thumbnailPreloader=new Preloader();if(!this.options.useExternalCarousel){this.thumbnailPreloader.addEvent("onComplete",function(){var b=formatString(this.options.textShowCarousel,this.currentIter+1,this.maxIter);this.carouselBtn.set("html",b).setProperty("title",b)}.bind(this))}this.thumbnailPreloader.load(a)},clearThumbnailsHighlights:function(){for(i=0;i<this.galleryData.length;i++){this.thumbnailElements[i].cancel();this.thumbnailElements[i].start(0.2)}},changeThumbnailsSize:function(b,a){for(i=0;i<this.galleryData.length;i++){this.thumbnailElements[i].cancel();this.thumbnailElements[i].element.setStyles({width:b+"px",height:a+"px"})}},centerCarouselOn:function(d){if(!this.carouselWallMode){var f=this.thumbnailElements[d];var a=f.element.offsetLeft+(f.element.offsetWidth/2);var e=this.carouselWrapper.element.offsetWidth;var b=this.carouselInner.offsetWidth;var c=e/2;var g=a-c;this.carouselWrapper.elementScroller.start(g,0)}},initInfoSlideshow:function(){this.slideInfoZone=new Fx.Morph(new Element("div").addClass("slideInfoZone").injectInside($(this.galleryElement))).set({opacity:0});var b=new Element("h2").injectInside(this.slideInfoZone.element);var a=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.cancel();element=this.slideInfoZone.element;element.getElement("h2").set("html",this.galleryData[this.currentIter].title);element.getElement("p").set("html",this.galleryData[this.currentIter].description);if(this.options.slideInfoZoneSlide){this.slideInfoZone.start({opacity:[0,this.options.slideInfoZoneOpacity],height:[0,this.slideInfoZone.normalHeight]})}else{this.slideInfoZone.start({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.cancel();if(this.options.slideInfoZoneSlide){this.slideInfoZone.start({opacity:0,height:0})}else{this.slideInfoZone.start({opacity:0})}return this.slideInfoZone},makeLink:function(a){this.currentLink.setProperties({href:this.galleryData[a].link,title:this.galleryData[a].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")}},makeReMooz:function(){this.currentLink.setProperties({href:"#"});this.currentLink.setStyles({display:"block"});this.galleryElements[this.currentIter].element.set("title",this.galleryData[this.currentIter].title+" :: "+this.galleryData[this.currentIter].description);this.ReMooz=new ReMooz(this.galleryElements[this.currentIter].element,{link:this.galleryData[this.currentIter].link,shadow:false,dragging:false,addClick:false,resizeOpacity:1});var a=this.galleryElements[this.currentIter];var b=a.element.getCoordinates();delete b.right;delete b.bottom;widthDiff=b.width-a.width;heightDiff=b.height-a.height;b.width=a.width;b.height=a.height;b.left+=Math.ceil(widthDiff/2)+1;b.top+=Math.ceil(heightDiff/2)+1;this.ReMooz.getOriginCoordinates=function(c){return c}.bind(this,b);this.currentLink.onclick=function(){this.ReMooz.open.bind(this.ReMooz)();return false}.bind(this)},flushGallery:function(){this.galleryElements.each(function(a){a.element.dispose();a=a.element=null});this.galleryElements=[]},changeData:function(a){this.galleryData=a;this.clearTimer();this.flushGallery();if(this.options.showCarousel){this.flushCarousel()}this.constructElements();if(this.options.showCarousel){this.fillCarousel()}if(this.options.showInfopane){this.hideInfoSlideShow()}this.galleryInit=1;this.lastIter=0;this.currentIter=0;this.doSlideShow(1)},initHistory:function(){this.fireEvent("onHistoryInit");this.historyKey=this.galleryElement.id+"-picture";if(this.options.customHistoryKey){this.historyKey=this.options.customHistoryKey}this.history=new History.Route({defaults:[1],pattern:this.historyKey+"\\((\\d+)\\)",generate:function(a){return[this.historyKey,"(",a[0],")"].join("")}.bind(this),onMatch:function(a,b){if(parseInt(a[0])-1<this.maxIter){this.goTo(parseInt(a[0])-1)}}.bind(this)});this.addEvent("onChanged",function(){this.history.setValue(0,this.currentIter+1);this.history.defaults=[this.currentIter+1]}.bind(this));this.fireEvent("onHistoryInited")}};gallery=new Class(gallery);gallery.Transitions=new Hash({fade:function(c,d,a,b){c.options.transition=d.options.transition=Fx.Transitions.linear;c.options.duration=d.options.duration=this.options.fadeDuration;if(b>a){d.start({opacity:1})}else{d.set({opacity:1});c.start({opacity:0})}},crossfade:function(c,d,a,b){c.options.transition=d.options.transition=Fx.Transitions.linear;c.options.duration=d.options.duration=this.options.fadeDuration;d.start({opacity:1});c.start({opacity:0})},fadebg:function(c,d,a,b){c.options.transition=d.options.transition=Fx.Transitions.linear;c.options.duration=d.options.duration=this.options.fadeDuration/2;c.start({opacity:0}).chain(d.start.pass([{opacity:1}],d))}});var Preloader=new Class({Implements:[Events,Options],options:{root:"",period:100},initialize:function(a){this.setOptions(a)},load:function(a){this.index=0;this.images=[];this.sources=this.temps=a;this.total=this.sources.length;this.fireEvent("onStart",[this.index,this.total]);this.timer=this.progress.periodical(this.options.period,this);this.sources.each(function(c,b){this.images[b]=new Asset.image(this.options.root+c,{onload:function(){this.index++;if(this.images[b]){this.fireEvent("onLoad",[this.images[b],b,c])}}.bind(this),onerror:function(){this.index++;this.fireEvent("onError",[this.images.splice(b,1),b,c])}.bind(this),onabort:function(){this.index++;this.fireEvent("onError",[this.images.splice(b,1),b,c])}.bind(this)})},this)},progress:function(){this.fireEvent("onProgress",[Math.min(this.index,this.total),this.total]);if(this.index>=this.total){this.complete()}},complete:function(){$clear(this.timer);this.fireEvent("onComplete",[this.images])},cancel:function(){$clear(this.timer)}});function formatString(){var b=arguments.length;var a=arguments[0];for(var c=1;c<b;c++){var e="\\{"+(c-1)+"\\}";var d=new RegExp(e,"g");a=a.replace(d,arguments[c])}return a};