/* jQuery Galleriffic plugin
 * Copyright (c) 2008 Trent Foley (http://trentacular.com) Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php */
(function(f){var m={},s=0;f.galleriffic={version:"2.0.1",normalizeHash:function(h){return h.replace(/^.*#/,"").replace(/\?.*$/,"")},getImage:function(h){if(h){h=f.galleriffic.normalizeHash(h);return m[h]}},gotoImage:function(h){h=f.galleriffic.getImage(h);if(!h)return false;h.gallery.gotoImage(h);return true},removeImageByHash:function(h,j){var n=f.galleriffic.getImage(h);if(!n)return false;var a=n.gallery;if(j&&j!=a)return false;return a.removeImageByIndex(n.index)}};var u={delay:9650,numThumbs:20, preloadAhead:3,enableTopPager:false,enableBottomPager:false,maxPagesToShow:7,imageContainerSel:"",captionContainerSel:"",controlsContainerSel:"",loadingContainerSel:"",renderSSControls:false,renderNavControls:false,playLinkText:"Play",pauseLinkText:"Pause",prevLinkText:"Previous",nextLinkText:"Next",nextPageLinkText:"Next &rsaquo;",prevPageLinkText:"&lsaquo; Prev",enableHistory:false,enableKeyboardNavigation:false,autoStart:true,syncTransitions:true,defaultTransitionDuration:700,onSlideChange:undefined, onTransitionOut:undefined,onTransitionIn:undefined,onPageTransitionOut:undefined,onPageTransitionIn:undefined,onImageAdded:undefined,onImageRemoved:undefined};f.fn.galleriffic=function(h){f.extend(this,{version:f.galleriffic.version,isSlideshowRunning:false,slideshowTimeout:undefined,clickHandler:function(a,b){this.pause();if(!this.enableHistory){var c=f.galleriffic.normalizeHash(f(b).attr("href"));f.galleriffic.gotoImage(c);a.preventDefault()}},appendImage:function(a){this.addImage(a,false,false); return this},insertImage:function(a,b){this.addImage(a,false,true,b);return this},addImage:function(a,b,c,d){var e=typeof a==="string"?f(a):a;a=e.find("a.thumb");var k=a.attr("href"),g=a.attr("title"),o=e.find(".evnDetails").attr("href"),t=e.find(".caption").remove(),l=a.attr("name");s++;if(!l||m[""+l])l=s;if(!c)d=this.data.length;var p={title:g,slideUrl:k,caption:t,hash:l,gallery:this,index:d,fullUrl:o};if(c){this.data.splice(d,0,p);this.updateIndices(d)}else this.data.push(p);var q=this;b||this.updateThumbs(function(){var r= q.find("ul.thumbs");c?r.children(":eq("+d+")").before(e):r.append(e);q.onImageAdded&&q.onImageAdded(p,e)});m[""+l]=p;a.attr("rel","history").attr("href","#"+l).removeAttr("name").click(function(r){q.clickHandler(r,this)});return this},removeImageByIndex:function(a){if(a<0||a>=this.data.length)return false;a=this.data[a];if(!a)return false;this.removeImage(a);return true},removeImageByHash:function(a){return f.galleriffic.removeImageByHash(a,this)},removeImage:function(a){var b=a.index;this.data.splice(b, 1);delete m[""+a.hash];this.updateThumbs(function(){var c=j.find("ul.thumbs").children(":eq("+b+")").remove();j.onImageRemoved&&j.onImageRemoved(a,c)});this.updateIndices(b);return this},updateIndices:function(a){for(i=a;i<this.data.length;i++)this.data[i].index=i;return this},initializeThumbs:function(){this.data=[];var a=this;this.find("ul.thumbs > li").each(function(){a.addImage(f(this),true,false)});return this},isPreloadComplete:false,preloadInit:function(){if(this.preloadAhead==0)return this; this.preloadStartIndex=this.currentImage.index;return this.preloadRecursive(this.preloadStartIndex,this.getNextIndex(this.preloadStartIndex))},preloadRelocate:function(a){this.preloadStartIndex=a;return this},preloadRecursive:function(a,b){if(a!=this.preloadStartIndex)return this.preloadRecursive(this.preloadStartIndex,this.getNextIndex(this.preloadStartIndex));var c=this,d=b-a;if(d<0)d=this.data.length-1-a+b;if(this.preloadAhead>=0&&d>this.preloadAhead){setTimeout(function(){c.preloadRecursive(a, b)},500);return this}var e=this.data[b];if(!e)return this;if(e.image)return this.preloadNext(a,b);d=new Image;d.onload=function(){e.image=this;c.preloadNext(a,b)};d.alt=e.title;d.src=e.slideUrl;return this},preloadNext:function(a,b){var c=this.getNextIndex(b);if(c==a)this.isPreloadComplete=true;else{var d=this;setTimeout(function(){d.preloadRecursive(a,c)},100)}return this},getNextIndex:function(a){a=a+1;if(a>=this.data.length)a=0;return a},getPrevIndex:function(a){a=a-1;if(a<0)a=this.data.length- 1;return a},pause:function(){this.isSlideshowRunning=false;if(this.slideshowTimeout){clearTimeout(this.slideshowTimeout);this.slideshowTimeout=undefined}this.$controlsContainer&&this.$controlsContainer.find("div.ss-controls a").removeClass().addClass("play").attr("title",this.playLinkText).attr("href","#play").html(this.playLinkText);return this},play:function(){if(s==1)return false;this.isSlideshowRunning=true;this.$controlsContainer&&this.$controlsContainer.find("div.ss-controls a").removeClass().addClass("pause").attr("title", this.pauseLinkText).attr("href","#pause").html(this.pauseLinkText);if(!this.slideshowTimeout){var a=this;this.slideshowTimeout=setTimeout(function(){a.ssAdvance()},this.delay)}return this},toggleSlideshow:function(){this.isSlideshowRunning?this.pause():this.play();return this},ssAdvance:function(){this.isSlideshowRunning&&this.next(true);return this},next:function(a,b){this.gotoIndex(this.getNextIndex(this.currentImage.index),a,b);return this},previous:function(a,b){this.gotoIndex(this.getPrevIndex(this.currentImage.index), a,b);return this},nextPage:function(a,b){var c=this.getCurrentPage(),d=this.getNumPages()-1;c<d&&this.gotoIndex(c*this.numThumbs+this.numThumbs,a,b);return this},previousPage:function(a,b){var c=this.getCurrentPage();c>0&&this.gotoIndex(c*this.numThumbs-this.numThumbs,a,b);return this},gotoIndex:function(a,b,c){b||this.pause();if(a<0)a=0;else if(a>=this.data.length)a=this.data.length-1;a=this.data[a];!c&&this.enableHistory?f.historyLoad(String(a.hash)):this.gotoImage(a);return this},gotoImage:function(a){var b= a.index;this.onSlideChange&&this.onSlideChange(this.currentImage.index,b);this.currentImage=a;this.preloadRelocate(b);this.refresh();return this},getDefaultTransitionDuration:function(a){if(a)return this.defaultTransitionDuration;return this.defaultTransitionDuration/2},refresh:function(){var a=this.currentImage;if(!a)return this;var b=a.index;this.$controlsContainer&&this.$controlsContainer.find("div.nav-controls a.prev").attr("href","#"+this.data[this.getPrevIndex(b)].hash).end().find("div.nav-controls a.next").attr("href", "#"+this.data[this.getNextIndex(b)].hash);var c=this.$imageContainer.find("span.current").addClass("previous").removeClass("current"),d=0;if(this.$captionContainer)d=this.$captionContainer.find("div.current").addClass("previous").removeClass("current");var e=this.syncTransitions&&a.image,k=true,g=this;b=function(){k=false;c.remove();d&&d.remove();if(!e)if(a.image&&a.hash==g.data[g.currentImage.index].hash)g.buildImage(a,e);else g.$loadingContainer&&g.$loadingContainer.show()};if(c.length==0)b();else if(this.onTransitionOut)this.onTransitionOut(c, d,e,b);else{c.fadeTo(this.getDefaultTransitionDuration(e),0,b);d&&d.hide()}e&&this.buildImage(a,e);if(!a.image){b=new Image;b.onload=function(){a.image=this;!k&&a.hash==g.data[g.currentImage.index].hash&&g.buildImage(a,e)};b.alt=a.title;b.src=a.slideUrl}this.relocatePreload=true;return this.syncThumbs()},buildImage:function(a,b){var c=this;this.getNextIndex(a.index);var d=this.$imageContainer.append('<span class="image-wrapper current"><a class="advance-link" href="'+a.fullUrl+'" title="'+a.title+ '"></a></span>').find("span.current").css("opacity","0");d.find("a").append(a.image);var e=0;if(this.$captionContainer)e=this.$captionContainer.append('<div class="image-caption current"></div>').find("div.current").hide().append(a.caption);this.$loadingContainer&&this.$loadingContainer.hide();if(this.onTransitionIn)this.onTransitionIn(d,e,b);else{d.fadeTo(this.getDefaultTransitionDuration(b),1);e&&e.show()}if(this.isSlideshowRunning){this.slideshowTimeout&&clearTimeout(this.slideshowTimeout);this.slideshowTimeout= setTimeout(function(){c.ssAdvance()},this.delay)}return this},getCurrentPage:function(){return Math.floor(this.currentImage.index/this.numThumbs)},syncThumbs:function(){this.getCurrentPage()!=this.displayedPage&&this.updateThumbs();var a=this.find("ul.thumbs").children();a.filter(".selected").removeClass("selected");a.eq(this.currentImage.index).addClass("selected");return this},updateThumbs:function(a){var b=this,c=function(){a&&a();b.rebuildThumbs();b.onPageTransitionIn?b.onPageTransitionIn():b.show()}; if(this.onPageTransitionOut)this.onPageTransitionOut(c);else{this.hide();c()}return this},rebuildThumbs:function(){var a=this.data.length>this.numThumbs;if(this.enableTopPager){var b=this.find("div.top");if(b.length==0)b=this.prepend('<div class="top pagination"></div>').find("div.top");else b.empty();a&&this.buildPager(b)}if(this.enableBottomPager){b=this.find("div.bottom");if(b.length==0)b=this.append('<div class="bottom pagination"></div>').find("div.bottom");else b.empty();a&&this.buildPager(b)}a= this.getCurrentPage();var c=a*this.numThumbs,d=c+this.numThumbs-1;if(d>=this.data.length)d=this.data.length-1;b=this.find("ul.thumbs");b.find("li").each(function(e){var k=f(this);e>=c&&e<=d?k.show():k.hide()});this.displayedPage=a;b.removeClass("noscript");return this},getNumPages:function(){return Math.ceil(this.data.length/this.numThumbs)},buildPager:function(a){var b=this,c=this.getNumPages(),d=this.getCurrentPage(),e=d*this.numThumbs,k=this.maxPagesToShow-1,g=d-Math.floor((this.maxPagesToShow- 1)/2)+1;if(g>0){var o=c-g;if(o<k)g-=k-o}if(g<0)g=0;d>0&&a.append('<a rel="history" href="#'+this.data[e-this.numThumbs].hash+'" title="'+this.prevPageLinkText+'">'+this.prevPageLinkText+"</a>");if(g>0){this.buildPageLink(a,0,c);g>1&&a.append('<span class="ellipsis">&hellip;</span>');k--}for(;k>0;){this.buildPageLink(a,g,c);k--;g++}if(g<c){d=c-1;g<d&&a.append('<span class="ellipsis">&hellip;</span>');this.buildPageLink(a,d,c)}c=e+this.numThumbs;c<this.data.length&&a.append('<a rel="history" href="#'+ this.data[c].hash+'" title="'+this.nextPageLinkText+'">'+this.nextPageLinkText+"</a>");a.find("a").click(function(t){b.clickHandler(t,this)});return this},buildPageLink:function(a,b,c){var d=b+1,e=this.getCurrentPage();if(b==e)a.append('<span class="current">'+d+"</span>");else b<c&&a.append('<a rel="history" href="#'+this.data[b*this.numThumbs].hash+'" title="'+d+'">'+d+"</a>");return this}});f.extend(this,u,h);if(this.enableHistory&&!f.historyInit)this.enableHistory=false;if(this.imageContainerSel)this.$imageContainer= f(this.imageContainerSel);if(this.captionContainerSel)this.$captionContainer=f(this.captionContainerSel);if(this.loadingContainerSel)this.$loadingContainer=f(this.loadingContainerSel);this.initializeThumbs();if(this.maxPagesToShow<3)this.maxPagesToShow=3;this.displayedPage=-1;this.currentImage=this.data[0];var j=this;this.$loadingContainer&&this.$loadingContainer.hide();if(this.controlsContainerSel){this.$controlsContainer=f(this.controlsContainerSel).empty();if(this.renderSSControls){this.autoStart? this.$controlsContainer.append('<div class="ss-controls"><a href="#pause" class="pause" title="'+this.pauseLinkText+'">'+this.pauseLinkText+"</a></div>"):this.$controlsContainer.append('<div class="ss-controls"><a href="#play" class="play" title="'+this.playLinkText+'">'+this.playLinkText+"</a></div>");this.$controlsContainer.find("div.ss-controls a").click(function(a){j.toggleSlideshow();a.preventDefault();return false})}this.renderNavControls&&this.$controlsContainer.append('<div class="nav-controls"><a class="prev" rel="history" title="'+ this.prevLinkText+'">'+this.prevLinkText+'</a><a class="next" rel="history" title="'+this.nextLinkText+'">'+this.nextLinkText+"</a></div>").find("div.nav-controls a").click(function(a){j.clickHandler(a,this)})}h=!this.enableHistory||!location.hash;if(this.enableHistory&&location.hash){var n=f.galleriffic.normalizeHash(location.hash);m[n]||(h=true)}h&&this.gotoIndex(0,false,true);this.enableKeyboardNavigation&&f(document).keydown(function(a){switch(a.charCode?a.charCode:a.keyCode?a.keyCode:0){case 32:j.next(); a.preventDefault();break;case 33:j.previousPage();a.preventDefault();break;case 34:j.nextPage();a.preventDefault();break;case 35:j.gotoIndex(j.data.length-1);a.preventDefault();break;case 36:j.gotoIndex(0);a.preventDefault();break;case 37:j.previous();a.preventDefault();break;case 39:j.next();a.preventDefault();break}});this.autoStart&&this.play();setTimeout(function(){j.preloadInit()},1E3);return this}})(jQuery);