/**
 * sfPhotoGallery
 *
 * @version: 1.0
 *
 * Available options:
 *  transition - by default "fade", can also use _none_ or any of the jQuery UI effects if UI is included. !NOTICE - will throw an exception if you try to use an effect without including UI
 *  transitionSpeed - photo transition speed, by default 300 ms
 *  transitionInOptions - options used on the "in" transition if one of the UI effects is used 
 *  transitionOutOptions - options used on the "out" transition if one of the UI effects is used 
 *  goodbarry - boolean flag, by default "true". If turned on and no ".thumb" element is present in the data list, then GB image resize utility will be used
 *  thumbsLocation - top|right|bottom|left - location of thumbs slider in reference to the main image area, by default "left"
 *  descriptionLocation - top|right|bottom|left - location of the description area in reference to the main image area, by default bottom
 *  autorotate - boolean, if true will add an option to start/top autorotation, by default false
 *  autorotateDuration - if "autorotate" option is set to true, it determines how long image is visilbe, by default 3000 ms
 *  thumbsPerPage - number of thumbnails visible at once, by default 8
 *  numbersPerPaginationPage - number of items visible on one page in the pagination list. This option has to be set depending on the layout, as it won't work otherwise
 *  thumbWidth - width of thumbnail to show/generate
 *  thumbHeight - height of thumbnail to show/generate
 */
(function(){var sfPhotoGallery=function(el,options){this.dataList=jQuery(el).hide();this.options={};this.options.transition=options.transition||'fade';this.options.transitionSpeed=options.transitionSpeed||300;this.options.transitionInOptions=options.transitionInOptions||{};this.options.transitionOutOptions=options.transitionOutOptions||{};this.options.goodbarry=typeof options.goodbarry==='boolean'?options.goodbarry:true;this.options.thumbsLocation=options.thumbsLocation||'left';this.options.descriptionLocation=options.descriptionLocation||'bottom';this.options.autorotate=typeof options.autorotate==='boolean'?options.autorotate:false;this.options.autorotateDuration=options.autorotateDuration||3000;this.options.thumbsPerPage=options.thumbsPerPage||8;this.options.numbersPerPaginationPage=options.numbersPerPaginationPage||20;this.options.thumbWidth=options.thumbWidth||120;this.options.thumbHeight=options.thumbHeight||80;this.dataItems=this.dataList.find('li').map(function(index,item){item=jQuery(item);return{index:index,media:item.find('.media').html(),thumb:item.find('.thumb').attr('src'),title:item.find('.title').html(),description:item.find('.description').html()};});this.count=this.dataItems.length;};sfPhotoGallery.prototype.build=function(){this.thumbsSlider=this.createThumbsSlider();this.paginationWrapper=this.createPagination();this.mediaWrapper=this.createMediaWrapper();this.descriptionWrapper=this.createDescriptionWrapper();this.show(0);this.dataList.replaceWith(this.buildStructure());this.thumbsContainerWidth=this.thumbsSlider.width();this.$slider.width(this.thumbsContainerWidth*this.thumbPagesCount);this.paginationContainerWidth=Math.floor(this.paginationWrapper.find('.sfmg-pagination-pages').width()-this.paginationWrapper.find('.sfmg-pagination-pages li').width()*2);this.$pagination.width(this.paginationContainerWidth*this.paginationPagesCount);};sfPhotoGallery.prototype.buildStructure=function(){var container=jQuery('<div class="sfmg"/>'),colA=jQuery('<div class="sfmg-wrapper-a"/>'),colB=jQuery('<div class="sfmg-wrapper-b"/>'),t=this.thumbsSlider,m=jQuery('<div class="sfmg-wrapper-c"/>').append(this.mediaWrapper,this.paginationWrapper),d=this.descriptionWrapper;container.append(colA,colB);colA.append(t);colB.append(m,d);var location=this.options.descriptionLocation+'-'+this.options.thumbsLocation;switch(location){case'top-top':case'left-left':colA.append(d,t);colB.append(m);break;case'top-right':case'top-bottom':colA.append(d,m);colB.append(t);break;case'top-left':colA.append(t);colB.append(d,m);break;case'right-right':case'bottom-bottom':colA.append(m);colB.append(d,t);break;case'right-bottom':colA.append(m,t);colB.append(d);break;case'right-top':case'right-left':colA.append(t,m);colB.append(d);break;case'bottom-top':case'bottom-left':colA.append(t);colB.append(m,d);break;case'bottom-right':colA.append(m,d);colB.append(t);break;case'left-top':colA.append(d);colB.append(t,m);break;case'left-right':case'left-bottom':colA.append(d);colB.append(m,t);break;}
if(location.match(/(left|right)/)){colA.addClass('sfmg-col-left');colB.addClass('sfmg-col-right');}
return container;};sfPhotoGallery.prototype.restartAutorotate=function(){var self=this;this.stopAutorotate();var duration=this.options.autorotateDuration+2*this.options.transitionSpeed;this.$autorotate=window.setInterval(function(){var nextItem=self.currentItem+1;if(nextItem===self.count){nextItem=0;}
self.show(nextItem);},duration);};sfPhotoGallery.prototype.stopAutorotate=function(){window.clearInterval(this.$autorotate);};sfPhotoGallery.prototype.createMediaWrapper=function(){var media=jQuery('<div class="sfmg-main"/>');this.$media=jQuery('<div class="sfmg-main-media"/>');media.append(this.$media);return media;};sfPhotoGallery.prototype.createDescriptionWrapper=function(){var description=jQuery('<div class="sfmg-description"/>"');this.$title=jQuery('<h3 class="sfmg-title"/>');this.$description=jQuery('<p class="sfmg-content"/>');description.append(this.$title,this.$description);return description;};sfPhotoGallery.prototype.createThumbsSlider=function(){var self=this;this.thumbPagesCount=Math.ceil(this.count/this.options.thumbsPerPage);this.thumbsContainerWidth=0;this.currentThumbPage=0;var slider=jQuery('<div class="sfmg-thumbs"><ul class="sfmg-thumbs-nav"><li class="sfmg-thumbs-nav-prev"/><li class="sfmg-thumbs-nav-next"/></ul></div>');this.$slider=jQuery('<div class="sfmg-thumbs-wrapper"/>');slider.prepend(this.$slider);var prev=jQuery('<a href="#">Previous</a>').click(function(e){e.preventDefault();self.cycleThumbs(self.currentThumbPage-1);});var next=jQuery('<a href="#">Next</a>').click(function(e){e.preventDefault();self.cycleThumbs(self.currentThumbPage+1);});slider.find('.sfmg-thumbs-nav-prev').append(prev);slider.find('.sfmg-thumbs-nav-next').append(next);var appendItem=function(index,item){var li=self.createThumbnail(item);slider.find('.sfmg-thumbs-wrapper ul:last').append(li);};for(var i=0,start,end;i<this.thumbPagesCount;i++){slider.find('.sfmg-thumbs-wrapper').append('<ul/>');start=i*this.options.thumbsPerPage;end=start+this.options.thumbsPerPage;jQuery.each(this.dataItems.slice(start,end),appendItem);}
if(this.options.autorotate){var ar=jQuery('<p class="sfmg-autorotate"/>'),arTrigger=jQuery('<a href="#">Start</a>').click(function(e){e.preventDefault();if(jQuery(this).hasClass('active')){jQuery(this).removeClass('active').html('Start');self.stopAutorotate();}
else{jQuery(this).addClass('active').html('Stop');self.restartAutorotate();}});ar.append(arTrigger);slider.prepend(ar);}
return slider;};sfPhotoGallery.prototype.createPagination=function(){var self=this;this.paginationPagesCount=Math.ceil((this.count-2)/(this.options.numbersPerPaginationPage-2));this.paginationContainerWidth=0;this.currentPaginationPage=0;var pagination=jQuery('<div class="sfmg-pagination"><ul class="sfmg-pagination-steps"><li class="sfmg-pagination-steps-prev"/><li class="sfmg-pagination-steps-next"/></ul><div class="sfmg-pagination-pages"></div></div>');this.$pagination=jQuery('<ul/>');pagination.find('.sfmg-pagination-pages').append(this.$pagination);var paginationItemClick=function(e){e.preventDefault();self.show(e.data.index);};jQuery.each(this.dataItems,function(index,item){var li=jQuery('<li />');var trigger=jQuery('<a href="#">'+(index+1)+'</a>').bind('click',{"index":index},paginationItemClick);li.append(trigger);pagination.find('.sfmg-pagination-pages ul').append(li);});var prev=jQuery('<a href="#">Prev</a>').click(function(e){e.preventDefault();self.show(self.currentItem-1);});pagination.find('.sfmg-pagination-steps-prev').append(prev);var next=jQuery('<a href="#">Next</a>').click(function(e){e.preventDefault();self.show(self.currentItem+1);});pagination.find('.sfmg-pagination-steps-next').append(next);return pagination;};sfPhotoGallery.prototype.createThumbnail=function(item){var li=jQuery('<li/>'),trigger,thumb,self=this,thumbURL;if(item.thumb){thumbURL=item.thumb;}
else{thumbURL=jQuery(item.media).attr('src');if(this.options.goodbarry){thumbURL='/Utilities/ShowThumbnail.aspx?'+jQuery.param({"USM":1,"W":this.options.thumbWidth,"H":this.options.thumbHeight,"R":1,"Img":thumbURL});}}
trigger=jQuery('<a href="#"/>').bind('click',{index:item.index},function(e){e.preventDefault();self.show(e.data.index);});thumb=jQuery('<img src="'+thumbURL+'" alt="'+item.title+'" width="'+this.options.thumbWidth+'" height="'+this.options.thumbHeight+'" />');trigger.append(thumb);li.append(trigger);return li;};sfPhotoGallery.prototype.show=function(index){if(index===this.currentItem||index<0||index>=this.count){return false;}
if(this.$media.is(':animated')||this.$slider.is(':animated')){return false;}
this.currentItem=index;var item=this.dataItems[index];this.switchItem(item);this.$pagination.find('li').removeClass('active').eq(index).addClass('active');this.$slider.find('li').removeClass('active').eq(index).addClass('active');if(this.options.autorotate&&this.$autorotate){this.restartAutorotate();}
this.cycleThumbs(Math.floor(index/this.options.thumbsPerPage));this.cyclePaging(index);};sfPhotoGallery.prototype.switchItem=function(i){var $ui=(typeof jQuery.fn.effect==='function'),s=this.options.transitionSpeed,t=this.options.transition,media=this.$media,title=this.$title,desc=this.$description;switch(t){case null:media.html(i.media);title.html(i.title);desc.html(i.description);break;case'fade':media.fadeOut(s,function(){media.html(i.media).fadeIn(s);});title.fadeOut(s,function(){title.html(i.title).fadeIn(s);});desc.fadeOut(s,function(){desc.html(i.description).fadeIn(s);});break;default:if($ui===false){throw"Unable to load jQuery UI";}
media.hide(t,s,function(){media.html(i.media).show(t,s);});title.hide(t,s,function(){title.html(i.title).show(t,s);});desc.hide(t,s,function(){desc.html(i.description).show(t,s);});break;}};sfPhotoGallery.prototype.cycleThumbs=function(page){if(page!==this.currentThumbPage){this.$slider.animate({'marginLeft':-1*page*this.thumbsContainerWidth},300);this.currentThumbPage=page;}
var prev=this.thumbsSlider.find('li.sfmg-thumbs-nav-prev'),next=this.thumbsSlider.find('li.sfmg-thumbs-nav-next');if(page===0){prev.hide();}
else{prev.show();}
if(page+1<this.thumbPagesCount){next.show();}
else{next.hide();}
 };sfPhotoGallery.prototype.cyclePaging=function(index){var page=Math.floor((index-1)/(this.options.numbersPerPaginationPage-2));if(page<0){page=0;}
if(page!==this.currentPaginationPage&&page<this.paginationPagesCount){this.$pagination.animate({'marginLeft':-1*page*this.paginationContainerWidth},300);this.currentPaginationPage=page;}
var prev=this.paginationWrapper.find('li.sfmg-pagination-steps-prev'),next=this.paginationWrapper.find('li.sfmg-pagination-steps-next');if(index===0){prev.hide();}
else{prev.show();}
if(index+1<this.count){next.show();}
else{next.hide();}};jQuery.fn.sfPhotoGallery=function(options){options=options||{};return this.each(function(){var pf=new sfPhotoGallery(this,options);pf.build();});};})();