$(window).load(function(){
// the main container
var $GPContainer = $('#container'),
// the articles (the thumbs)
$articles = $GPContainer.children('div.block'),
// total number of articles
totalArticles = $articles.length,
// the fullview container
$fullview = $('
').prependTo( $('body') ),
// the overlay
$overlay = $('').prependTo( $('body') ),
GridPortfolio = (function() {
// current will be the index of the current article
var animspeed = 500,
animeasing = 'jswing', // try easeOutExpo
current = -1,
// indicates if certain elements can be animated or not at a given time
animrun = false,
init = function() {
initPlugins();
initEventsHandler();
},
// builds each article's carousel
// initiallizes the mansory
initPlugins = function() {
// apply carousel functionality to the thumbs-wrapper in each article
$articles.find('div.thumbs-wrapper').gpCarousel();
// apply mansory to the grid items
$GPContainer.masonry({
itemSelector : '.item',
columnWidth : 5,
isAnimated : true
});
},
// events
initEventsHandler = function() {
// switch to fullview when we click the "View Project" link
$articles.each( function(i) {
$(this).find('a.more_link').bind('click.GridPortfolio', function(e) {
if( animrun ) return false;
animrun = true;
var $article = $(this).closest('div.block');
// update the current value
current = $article.index('.block');
// hide scrollbar
$('body').css( 'overflow', 'hidden' );
// preload the fullview image and then start the animation (showArticle)
var $intro = $article.find('div.intro');
$intro.addClass('intro-loading');
$('
').load(function() {
$intro.removeClass('intro-loading');
showArticle( $article, true );
animrun = false;
}).attr('src', $article.data('bgimage'));
return false;
});
});
// fullview navigation
$('#fullview').find('span.full-nav-next').live('click.GridPortfolio', function(e) {
if( animrun ) return false;
animrun = true;
// circular navigation
if( current === totalArticles - 1 )
current = 0
else
++current;
// update the fullview current articles number
$fullview.find('span.full-nav-current').html( current + 1 );
showFullviewArticle();
});
$('#fullview').find('span.full-nav-prev').live('click.GridPortfolio', function(e) {
if( animrun ) return false;
animrun = true;
// circular navigation
if( current === 0 )
current = totalArticles - 1
else
--current;
// update the fullview current articles number
$fullview.find('span.full-nav-current').html( current + 1 );
showFullviewArticle();
});
// switch to thumbs view
$('#fullview').find('span.full-view-exit').live('click.GridPortfolio', function(e) {
var $article = $articles.eq( current );
hideArticle( $article );
});
// window resize
// center the background image if in fullview
// reinitialise jscrollpane
$(window).bind('resize.GridPortfolio', function(e) {
var $bgimage = $fullview.find('img.bg-img');
if( $bgimage.length )
centerBgImage( $bgimage );
$fullview.find('div.project-descr-full-wrapper').jScrollPane('reinitialise');
});
},
// the clicked article will be cloned;
// the clone will be positioned on top of the cloned article;
// remove every element from the clone except the thumbs wrapper (basically the image);
// enlarge the clone to the window's width & height;
// move the thumbs wrapper to the position where the fullview's thumbs wrapper will be placed;
// at the same time fade in the overlay;
// build the fullview panel with the right data (template)
// remove the clone
// this function will also be used when we close the fullview article. In this case,
// the difference is that we don't animate the values (just set the css values), and the clone is not removed, since we
// will use it for the animation (back to the thumb position)
showArticle = function( $article, anim ) {
// clone the article
var $clone = $article.clone().css({
left : $article.offset().left + 'px',
top : $article.offset().top + 'px',
zIndex : 1001,
margin : '0px',
height : $article.height() + 'px'
}).attr( 'id', 'article-clone' );
// this is the images container which is going to "fly" down
var $thumbsWrapper = $clone.find('div.thumbs-wrapper');
// remove unnecessary elements from the clone
$clone.children().not($thumbsWrapper).remove();
$clone.find('div.thumbs-nav').remove();
// position the clone on top of the article with the right css style
var padding = 20 + 20;
// animate?
$.fn.applyStyle = ( anim ) ? $.fn.animate : $.fn.css;
var clonestyle = {
width : $(window).width() - padding + 'px',
height : $(window).height() - padding + 'px',
left : '0px',
top : $(window).scrollTop() + 'px'
};
$clone.appendTo( $('body') ).stop().applyStyle( clonestyle, $.extend( true, [], { duration : animspeed, easing : animeasing, complete : function() {
// show the panel (it will be hidden behing the clone though, until this one is removed)
$fullview.show()
// use the template "fullviewTmpl" to build the fullview panel with the right data
var articleFullviewData = getArticleFullviewData($article);
articleFullviewData.current = current + 1;
articleFullviewData.total = totalArticles;
var $fullview_content = $('#fullviewTmpl').tmpl( articleFullviewData );
$fullview_content.appendTo( $fullview );
// call the gpCarousel plugin on the fullview thumbs-wrapper
$fullview_content.find('div.thumbs-wrapper').gpCarousel({
start : $article.find('div.thumbs-wrapper').data('currentImage')
});
//jscrollpane
$fullview_content.find('div.project-descr-full-wrapper').jScrollPane('destroy').jScrollPane({
verticalDragMinHeight: 40,
verticalDragMaxHeight: 40
});
// center bg image
centerBgImage( $fullview.find('img.bg-img') );
// fade out overlay
$overlay.stop().css( 'opacity', 0 );
// fade out clone to show the fullview panel. After that remove the clone
$clone.fadeOut( 300, function() { $clone.remove(); } );
}}));
// animate the images container to the position where is going to be on fullview
var thumbsstyle = {
left : $(window).width() - $thumbsWrapper.width() - 25 + 'px', // 25 is the margin left / right of the fullview thumbs-wrapper
top : ($(window).height() / 2) - ($thumbsWrapper.height() / 2) - 22 + 'px' // 10 is the margin top / bottom of the fullview thumbs-wrapper
};
$thumbsWrapper.stop().applyStyle( thumbsstyle, $.extend( true, [], { duration : animspeed, easing : animeasing} ) );
// fade in overlay
( anim ) ? $overlay.show().fadeTo( animspeed, 0.7, animeasing ) : $overlay.show().css( 'opacity', 0.7 );
},
// close the fullview
hideArticle = function( $article ) {
// create the article's clone. the second argument is false to prevent the clone to be removed
showArticle( $article, false );
// hide the overlay for now
$overlay.hide();
// reference to the created clone and its thumbs wrapper
var $clone = $('#article-clone'),
$thumbsWrapper = $clone.find('div.thumbs-wrapper');
// fade in the clone
$clone.hide().fadeIn( 200, function() {
// remove the contents of the fullview container
$fullview.empty();
// animate the clone to the article position and size
$(this).animate({
left : $article.offset().left + 'px',
top : $article.offset().top + 'px',
width : $article.width() + 'px',
height : $article.height() + 'px'
}, animspeed, animeasing, function() {
// remove the clone
$clone.remove();
// show the scrollbar
$('body').css( 'overflow', 'visible' );
});
// animate the clone's thumbs wrapper so it moves to the article's thumbs wrapper position
$thumbsWrapper.animate({
left : '0px',
top : '0px'
}, animspeed, animeasing);
// fade out the overlay
$overlay.show().fadeTo( animspeed, 0, animeasing, function() { $overlay.hide() } );
});
},
// gets the article's necessary info to build the fullview panel
getArticleFullviewData = function( $article ) {
return {
bgimage : '
',
title : $article.find('h2.title').text(),
thumbs : $article.find('div.thumbs').html(),
subline : $article.find('p.subline').text(),
description : $article.find('div.project-descr').html()
}
},
// used when navigating in fullview
// needs to get the next / previous article's info
showFullviewArticle = function() {
var $article = $articles.eq( current ),
articleFullviewData = getArticleFullviewData($article),
$loading = $fullview.find('span.loading-small'),
$fullviewImage = $fullview.find('img.bg-img'),
$fullviewTitle = $fullview.find('h2.title'),
$fullviewSubline = $fullview.find('p.subline'),
$fullviewDescriptionWrapper = $fullview.find('div.project-descr-full-wrapper'),
$fullviewDescription = $fullviewDescriptionWrapper.find('div.project-descr-full-content'),
$fullviewProjectDescrFull = $fullview.find('div.project-descr-full'),
$fullviewThumbsWrapper = $fullviewProjectDescrFull.find('div.thumbs-wrapper'),
$newFullviewThumbsWrapper = $('' + articleFullviewData.thumbs + '
');
// preload the article's background image
$loading.show();
$( articleFullviewData.bgimage ).load(function() {
$loading.hide();
var $bgImage = $(this);
$bgImage.insertBefore( $fullviewImage );
// center the bg image
centerBgImage( $bgImage );
$fullviewImage.remove();
$fullviewTitle.html( articleFullviewData.title );
$fullviewSubline.html( articleFullviewData.subline );
$fullviewDescriptionWrapper.jScrollPane('destroy');
$fullviewDescription.html( articleFullviewData.description );
$fullviewDescriptionWrapper.jScrollPane('destroy').jScrollPane({
verticalDragMinHeight: 40,
verticalDragMaxHeight: 40
});
$fullviewThumbsWrapper.remove();
$fullviewProjectDescrFull.prepend( $newFullviewThumbsWrapper );
$newFullviewThumbsWrapper.gpCarousel();
animrun = false;
}).attr('src', $article.data('bgimage'));
},
// centers the background image
centerBgImage = function( $img ) {
var dim = getImageDim($img);
//set the returned values and show the image
$img.css({
width : dim.width + 'px',
height : dim.height + 'px',
left : dim.left + 'px',
top : dim.top + 'px'
});
},
//get dimentions of the image,
//in order to make it full size and centered
getImageDim = function($i) {
var $img = new Image();
$img.src = $i.attr('src');
var w_w = $(window).width(),
w_h = $(window).height(),
r_w = w_h / w_w,
i_w = $img.width,
i_h = $img.height,
r_i = i_h / i_w,
new_w,new_h,
new_left,new_top;
if(r_w > r_i){
new_h = w_h;
new_w = w_h / r_i;
}
else{
new_h = w_w * r_i;
new_w = w_w;
}
return {
width : new_w,
height : new_h,
left : (w_w - new_w) / 2,
top : (w_h - new_h) / 2
};
};
return {
init : init
};
})()
GridPortfolio.init();
});