// (c) 2008 Trent Foley
;(function($){var ver='galleriffic-0.6';document.write("<style type='text/css'>.noscript{display:none}</style>");function clickHandler(gallery){gallery.pause();return false;}
$.fn.galleriffic={ver:function(){return ver;},defaults:{delay:3000,numThumbs:20,preloadAhead:40,enableTopPager:true,enableBottomPager:true,imageContainerSel:'',thumbsContainerSel:'',controlsContainerSel:'',titleContainerSel:'',descContainerSel:'',downloadLinkSel:'',renderSSControls:true,renderNavControls:true,playLinkText:'Play',pauseLinkText:'Pause',prevLinkText:'Previous',nextLinkText:'Next',nextPageLinkText:'Next &rsaquo;',prevPageLinkText:'&lsaquo; Prev'},init:function(thumbsContainerSel,settings){this.settings=$.extend({},this.defaults,settings);if(this.interval)
clearInterval(this.interval);this.interval=0;if(this.settings.imageContainerSel)this.$imageContainer=$(this.settings.imageContainerSel);if(this.settings.thumbsContainerSel)this.$thumbsContainer=$(this.settings.thumbsContainerSel);if(this.settings.titleContainerSel)this.$titleContainer=$(this.settings.titleContainerSel);if(this.settings.descContainerSel)this.$descContainer=$(this.settings.descContainerSel);if(this.settings.downloadLinkSel)this.$downloadLink=$(this.settings.downloadLinkSel);if(thumbsContainerSel instanceof Array)
this.data=thumbsContainerSel;else{this.$thumbsContainer=$(thumbsContainerSel);this.buildDataFromThumbs();}
this.currentPage=-1;this.currentIndex=0;this.numPages=Math.ceil(this.data.length/this.settings.numThumbs);var gallery=this;if(this.settings.controlsContainerSel){this.$controlsContainer=$(this.settings.controlsContainerSel).empty();if(this.settings.renderSSControls){var gallery=this;this.$controlsContainer.append('<div class="ss-controls"><span class="play" title="'+this.settings.playLinkText+'">'+this.settings.playLinkText+'</span></div>').find('div.ss-controls span').click(function(){gallery.toggleSlideshow();});}
if(this.settings.renderNavControls){this.$controlsContainer.append('<div class="nav-controls"><a class="prev" rel="history" title="'+this.settings.prevLinkText+'">'+this.settings.prevLinkText+'</a><a class="next" rel="history" title="Next">'+this.settings.nextLinkText+'</a></div>').find('a[@rel="history"]').click(function(){clickHandler(gallery);});}}
this.historyInit(function(h){var hash=location.hash;gallery.goto(hash?hash.replace(/^.*#/,''):0);});var gallery=this;setTimeout(function(){gallery.preloadInit();},1000);return this;},buildDataFromThumbs:function(){this.data=[];var gallery=this;this.$thumbsContainer.find('li').each(function(i){var $a=$(this).find('a');var $img=$a.find('img:first');gallery.data.push({slide:$a.attr('href'),thumb:$img.attr('src'),original:$a.attr('original'),title:$a.attr('title'),description:$a.attr('description')});});return this;},isPreloadComplete:false,preloadInit:function(){if(this.settings.preloadAhead==0)return this;this.preloadStartIndex=this.currentIndex;var nextIndex=this.getNextIndex(this.preloadStartIndex);return this.preloadRecursive(this.preloadStartIndex,nextIndex);},preloadRelocate:function(index){this.preloadStartIndex=index;return this;},preloadRecursive:function(startIndex,currentIndex){if(startIndex!=this.preloadStartIndex){var nextIndex=this.getNextIndex(this.preloadStartIndex);return this.preloadRecursive(this.preloadStartIndex,nextIndex);}
var gallery=this;var preloadCount=currentIndex-startIndex;if(preloadCount<0)
preloadCount=this.data.length-1-startIndex+currentIndex;if(this.settings.preloadAhead>=0&&preloadCount>this.settings.preloadAhead){setTimeout(function(){gallery.preloadRecursive(startIndex,currentIndex);},500);return this;}
var imageData=this.data[currentIndex];if(imageData.$image)
return this.preloadNext(startIndex,currentIndex);var image=new Image();image.onload=function(){imageData.$image=this;gallery.preloadNext(startIndex,currentIndex);};image.alt=imageData.title;image.src=imageData.slide;return this;},preloadNext:function(startIndex,currentIndex){var nextIndex=this.getNextIndex(currentIndex);if(nextIndex==startIndex){this.isPreloadComplete=true;}else{var gallery=this;setTimeout(function(){gallery.preloadRecursive(startIndex,nextIndex);},100);}
return this;},getNextIndex:function(index){var nextIndex=index+1;if(nextIndex>=this.data.length)
nextIndex=0;return nextIndex;},getPrevIndex:function(index){var prevIndex=index-1;if(prevIndex<0)
prevIndex=this.data.length-1;return prevIndex;},pause:function(){if(this.interval)
this.toggleSlideshow();return this;},play:function(){if(!this.interval)
this.toggleSlideshow();return this;},toggleSlideshow:function(){if(this.interval){clearInterval(this.interval);this.interval=0;if(this.$controlsContainer){this.$controlsContainer.find('div.ss-controls span').removeClass().addClass('play').attr('title',this.settings.playLinkText).html(this.settings.playLinkText);}}else{this.ssAdvance();var gallery=this;this.interval=setInterval(function(){gallery.ssAdvance();},this.settings.delay);if(this.$controlsContainer){this.$controlsContainer.find('div.ss-controls span').removeClass().addClass('pause').attr('title',this.settings.pauseLinkText).html(this.settings.pauseLinkText);}}
return this;},ssAdvance:function(){var nextIndex=this.getNextIndex(this.currentIndex);location.href='#'+nextIndex;if($.browser.msie){this.goto(nextIndex);}
return this;},goto:function(i){var index=(+i);if(index<0)index=0;else if(index>=this.data.length)index=this.data.length-1;this.currentIndex=index;this.preloadRelocate(index);return this.refresh();},refresh:function(){if(this.$imageContainer){var imageData=this.data[this.currentIndex];var isFading=1;var gallery=this;this.$imageContainer.fadeOut('fast',function(){isFading=0;if(gallery.$controlsContainer){gallery.$controlsContainer.find('div.nav-controls a.prev').attr('href','#'+gallery.getPrevIndex(gallery.currentIndex)).end().find('div.nav-controls a.next').attr('href','#'+gallery.getNextIndex(gallery.currentIndex));}
if(gallery.$titleContainer){gallery.$titleContainer.empty().html(imageData.title);}
if(gallery.$descContainer){gallery.$descContainer.empty().html(imageData.description);}
if(gallery.$downloadLink){gallery.$downloadLink.attr('href',imageData.original);}
if(imageData.$image){gallery.buildImage(imageData.$image);}});if(this.onFadeOut)this.onFadeOut();if(!imageData.$image){var image=new Image();image.onload=function(){imageData.$image=this;if(!isFading){gallery.buildImage(imageData.$image);}};image.alt=imageData.title;image.src=imageData.slide;}
this.relocatePreload=true;}
return this.syncThumbs();},buildImage:function(image){if(this.$imageContainer){this.$imageContainer.empty();var gallery=this;this.$imageContainer.append('<span class="image-wrapper"><a class="advance-link" rel="history" href="#'+this.getNextIndex(this.currentIndex)+'" title="'+image.alt+'"></a></span>').find('a').append(image).click(function(){clickHandler(gallery);}).end().fadeIn('fast');if(this.onFadeIn)this.onFadeIn();}
return this;},syncThumbs:function(){if(this.$thumbsContainer){var page=Math.floor(this.currentIndex/this.settings.numThumbs);if(page!=this.currentPage){this.currentPage=page;this.updateThumbs();}else{var selectedThumb=this.currentIndex%this.settings.numThumbs;this.$thumbsContainer.find('ul.thumbs li.selected').removeClass('selected').end().find('ul.thumbs li').eq(selectedThumb).addClass('selected');}}
return this;},updateThumbs:function(){if(this.$thumbsContainer){if(this.currentPage<0)
this.currentPage=0;var startIndex=this.currentPage*this.settings.numThumbs;var stopIndex=startIndex+this.settings.numThumbs-1;if(stopIndex>=this.data.length)
stopIndex=this.data.length-1;var needsPagination=this.data.length>this.settings.numThumbs;this.$thumbsContainer.empty();if(needsPagination&&this.settings.enableTopPager){this.$thumbsContainer.append('<div class="top pagination"></div>');this.buildPager(this.$thumbsContainer.find('div.top'));}
var $ulThumbs=this.$thumbsContainer.append('<ul class="thumbs"></ul>').find('ul.thumbs');for(i=startIndex;i<=stopIndex;i++){var selected='';if(i==this.currentIndex)
selected=' class="selected"';var imageData=this.data[i];$ulThumbs.append('<li'+selected+'><a rel="history" href="#'+i+'" title="'+imageData.title+'"><img src="'+imageData.thumb+'" alt="'+imageData.title+'" /></a></li>');}
if(needsPagination&&this.settings.enableBottomPager){this.$thumbsContainer.append('<div class="bottom pagination"></div>');this.buildPager(this.$thumbsContainer.find('div.bottom'));}
var gallery=this;this.$thumbsContainer.find('a[@rel="history"]').click(function(){clickHandler(gallery);});}
return this;},buildPager:function(pager){var startIndex=this.currentPage*this.settings.numThumbs;if(this.currentPage>0){var prevPage=startIndex-this.settings.numThumbs;pager.append('<a rel="history" href="#'+prevPage+'" title="'+this.settings.prevPageLinkText+'">'+this.settings.prevPageLinkText+'</a>');}
for(i=this.currentPage-4;i<=this.currentPage+4;i++){var pageNum=i+1;if(i==this.currentPage)
pager.append('<strong>'+pageNum+'</strong>');else{var imageIndex=i*this.settings.numThumbs;if(i>=0&&i<this.numPages){pager.append('<a rel="history" href="#'+imageIndex+'" title="'+pageNum+'">'+pageNum+'</a>');}}}
var nextPage=startIndex+this.settings.numThumbs;if(nextPage<this.data.length){pager.append('<a rel="history" href="#'+nextPage+'" title="'+this.settings.nextPageLinkText+'">'+this.settings.nextPageLinkText+'</a>');}
return this;},historyCurrentHash:undefined,historyCallback:undefined,historyInit:function(callback){this.historyCallback=callback;var current_hash=location.hash;this.historyCurrentHash=current_hash;if($.browser.msie){if(this.historyCurrentHash==''){this.historyCurrentHash='#';}}else if($.browser.safari){this.historyBackStack=[];this.historyBackStack.length=history.length;this.historyForwardStack=[];this.isFirst=true;}
this.historyCallback(current_hash.replace(/^#/,''));var gallery=this;setInterval(function(){gallery.historyCheck();},100);return this;},historyAddHistory:function(hash){this.historyBackStack.push(hash);this.historyForwardStack.length=0;this.isFirst=true;},historyCheck:function(){if($.browser.safari){if(!this.dontCheck){var historyDelta=history.length-this.historyBackStack.length;if(historyDelta){this.isFirst=false;if(historyDelta<0){for(var i=0;i<Math.abs(historyDelta);i++)this.historyForwardStack.unshift(this.historyBackStack.pop());}else{for(var i=0;i<historyDelta;i++)this.historyBackStack.push(this.historyForwardStack.shift());}
var cachedHash=this.historyBackStack[this.historyBackStack.length-1];if(cachedHash!=undefined){this.historyCurrentHash=location.hash;this.historyCallback(cachedHash);}}else if(this.historyBackStack[this.historyBackStack.length-1]==undefined&&!this.isFirst){if(document.URL.indexOf('#')>=0){this.historyCallback(document.URL.split('#')[1]);}else{var current_hash=location.hash;this.historyCallback('');}
this.isFirst=true;}}}else{var current_hash=location.hash;if(current_hash!=this.historyCurrentHash){this.historyCurrentHash=current_hash;this.historyCallback(current_hash.replace(/^#/,''));}}
return this;}};})(jQuery);
