Skip to content

Instantly share code, notes, and snippets.

@hatsumatsu
Last active August 29, 2015 14:05
Show Gist options
  • Save hatsumatsu/88501947ae35c32b76ff to your computer and use it in GitHub Desktop.
Save hatsumatsu/88501947ae35c32b76ff to your computer and use it in GitHub Desktop.
JS posts module for Port F
// module posts
var posts = ( function() {
var settings = {}
settings.infinityOffset = 300;
settings.request = null;
settings.queryData = {
}
var init = function() {
debuglog( 'site.posts.init()' );
settings.element = $( '.posts' );
updateQueryData( settings.element );
settings.isInfinityLoading = false;
settings.isLoading = false;
bindEventHandlers();
updateBottom();
}
var reInit = function() {
debuglog( 'site.posts.reInit()' );
updateBottom();
}
var bindEventHandlers = function() {
$( document )
.on( 'posts/added', function() {
} )
.on( 'posts/loaded', function() {
afterLoad();
} );
}
var updateQueryData = function( posts ) {
debuglog( 'site.posts.updateQueryData()' );
settings.queryData.page = parseInt( posts.attr( 'data-page' ) );
settings.queryData.pagesTotal = parseInt( posts.attr( 'data-pages-total' ) );
settings.queryData.url = posts.attr( 'data-url' );
debuglog( settings.queryData );
settings.element.attr( 'data-page', settings.queryData.page );
settings.element.attr( 'data-pages-total', settings.queryData.pagesTotal );
settings.element.attr( 'data-url', settings.queryData.url );
}
var updateBottom = function() {
debuglog( 'site.posts.updateBottom()' );
settings.bottom = Math.floor( settings.element.height() + settings.element.offset().top );
}
var checkScroll = function( scrollTop, height ) {
if( scrollTop + height > settings.bottom - settings.infinityOffset ) {
if( isReadyForInfinity() ) {
var nextPage = ( settings.queryData.page == 0 ) ? 2 : settings.queryData.page + 1;
infinityLoad( nextPage );
}
}
}
var load = function( path ) {
debuglog( 'site.posts.load( ' + path + ' )' );
settings.isLoading = true;
if( settings.request ) {
settings.request.abort();
}
$( 'html' )
.addClass( 'loading' );
$( document ).trigger( 'posts/loading' );
unload();
// wait for unload
setTimeout( function() {
settings.request = $.ajax( path, {} )
.success( function( data ) {
var title = $( data ).filter( 'title' ).html();
win.setTitle( title );
var posts = $( data ).find( '.posts' );
updateQueryData( posts );
var items = posts.find( '> *' );
addItems( items );
} )
.error( function( xhr, status ) {
if( status != 'abort' ) {
debuglog( 'error: ' + status );
}
} );
}, globals.transitionDuration );
}
var unload = function() {
debuglog( 'site.posts.unload()' );
$( 'html' )
.redraw()
.addClass( 'unloading' );
$( document ).trigger( 'posts/unloading' );
// wait for unloading
setTimeout( function() {
// scroll to top
win.scrollTo( 0, false );
$( 'html' )
.removeClass( 'unloading' );
settings.element
.empty();
$( document ).trigger( 'posts/unloaded' );
}, globals.transitionDuration );
}
var infinityLoad = function( page ) {
debuglog( 'site.posts.infintyLoad( ' + page + ' )' );
settings.isInfinityLoading = true;
if( settings.request ) {
settings.request.abort();
}
$( 'html' )
.addClass( 'infinity-loading' );
$( document ).trigger( 'posts/infinityLoading' );
var path = settings.queryData.url + 'page/' + page + '/';
settings.request = $.ajax( path, {} )
.success( function( data ) {
var posts = $( data ).find( '.posts' );
updateQueryData( posts );
var items = posts.find( '> *' );
addItems( items );
settings.queryData.page = page;
} )
.error( function( xhr, status ) {
if( status != 'abort' ) {
debuglog( 'error: ' + status );
}
} );
}
var addItems = function( items ) {
debuglog( 'site.posts.addItems()' );
var count = items.length;
var added = 0;
var loaded = 0;
debuglog( count + ' items to add' );
items.each( function() {
var item = $( this );
item
.addClass( 'loading' )
.redraw()
.appendTo( settings.element );
item.imagesLoaded( function() {
item
.removeClass( 'loading' )
.redraw();
loaded++;
if( loaded == count ) {
$( document ).trigger( 'posts/loaded' );
}
} );
picturefill();
added++;
if( added == count ) {
$( document ).trigger( 'posts/added' );
}
} );
}
var afterLoad = function() {
debuglog( 'site.posts.afterLoad()' );
$( 'html' )
.redraw()
.removeClass( 'loading' )
.removeClass( 'infinity-loading' );
reInit();
path.reInit();
// we're done here...
settings.isLoading = false;
settings.isInfinityLoading = false;
}
var isReadyForInfinity = function() {
if( !settings.isInfinityLoading &&
!settings.isLoading &&
settings.queryData.page < settings.queryData.pagesTotal &&
!( settings.queryData.page == 0 && settings.queryData.pagesTotal == 1 ) ) {
return true;
} else {
return false;
}
}
return {
init: function() { init(); },
reInit: function() { reInit(); },
checkScroll: function( scrollTop, height ) { checkScroll( scrollTop, height ); },
infinityLoad: function( page ) { infinityLoad( page ); },
load: function( path ) { load( path ); }
}
} )();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment