/**
* jquery.app.js
*
* Contain all handlers for jQuery applications.
*/
var APP = APP || {};
( function( $ ) {
var $window = $( window ),
$body = $( 'body' ),
$header = $( '#masthead' ),
$headerWrap = $( '#header-wrap' ),
$portfolio = $( '.portfolio-items' ),
$portfolioAjaxLoader = $( '#portfolio-ajax-loader' ),
$portfolioItems = $( '.portfolio-items' ).find( '.portfolio-item' ),
$portfolioDetails = $( '#portfolio-ajax-wrap' ),
$portfolioDetailsContainer = $( '#portfolio-ajax-container' ),
$blogCarouselContainer = $( '.blog-carousel' ),
$blogMasonryContainer = $( '#posts' ),
$goToTopEl = $( '#go-to-top' );
APP.initialize = {
init: function() {
APP.initialize.bootstrap();
APP.initialize.responsiveClasses();
APP.initialize.topScrollOffset();
APP.initialize.lightbox();
APP.initialize.imageFade();
APP.initialize.goToTop();
},
bootstrap: function() {
$( 'table' ).addClass( 'table table-striped' );
$( 'label input' ).addClass( 'input-form-control' );
$( 'input[type=submit]' ).addClass( 'button button-sm' );
$( 'select' ).addClass( 'btn btn-default dropdown-toggle' );
$( '.entry-content img' ).addClass( 'img-thumbnail img-responsive' );
},
responsiveClasses: function() {
var jRes = jRespond( [
{ label: 'smallest', enter: 0, exit: 479 },
{ label: 'handheld', enter: 480, exit: 767 },
{ label: 'tablet', enter: 768, exit: 991 },
{ label: 'laptop', enter: 992, exit: 1199 },
{ label: 'desktop', enter: 1200, exit: 10000 }
] );
jRes.addFunc( [
{ breakpoint: 'desktop',
enter: function() {
$body.addClass( 'device-lg' );
},
exit: function() {
$body.removeClass( 'device-lg' );
}
},
{ breakpoint: 'laptop',
enter: function() {
$body.addClass( 'device-md' );
},
exit: function() {
$body.removeClass( 'device-md' );
}
},
{ breakpoint: 'tablet',
enter: function() {
$body.addClass( 'device-sm' );
},
exit: function() {
$body.removeClass( 'device-sm' );
}
},
{ breakpoint: 'handheld',
enter: function() {
$body.addClass( 'device-xs' );
},
exit: function() {
$body.removeClass( 'device-xs' );
}
},
{ breakpoint: 'smallest',
enter: function() {
$body.addClass( 'device-xxs' );
},
exit: function() {
$body.removeClass( 'device-xxs' );
}
}
] );
if ( APP.isMobile.any() ) {
$body.addClass( 'device-touch' );
}
},
topScrollOffset: function() {
var adminBarHeight = 0,
topOffsetScroll = 0;
if ( $body.hasClass( 'admin-bar' ) ) {
adminBarHeight = 32;
}
if ( $body.hasClass( 'device-lg' ) || $body.hasClass( 'device-md' ) ) {
if ( $header.hasClass( 'sticky' ) ) {
topOffsetScroll = adminBarHeight + 78;
} else {
topOffsetScroll = adminBarHeight;
}
}
if ( $body.hasClass( 'device-sm' ) || $body.hasClass( 'device-xs' ) ) {
topOffsetScroll = adminBarHeight + 15;
}
return topOffsetScroll;
},
lightbox: function() {
$( '.entry-content a:has(img)' ).each( function() {
var url = $( this ).attr( 'href' );
if ( url.match( /\.(jpeg|jpg|gif|png)$/ ) != null ) {
$( this ).attr( 'data-lightbox', 'image' );
}
} );
var $lightboxImageEl = $( '[data-lightbox="image"]' );
if ( $lightboxImageEl.length > 0 ) {
$lightboxImageEl.magnificPopup( {
type: 'image',
closeOnContentClick: true,
closeBtnInside: false,
tLoading: '',
fixedContentPos: true,
mainClass: 'mfp-fade',
image: {
verticalFit: true
}
} );
}
},
imageFade: function() {
$( '.image-fade' ).hover( function() {
$( this ).animate( {
opacity: 0.8
}, 400 );
}, function() {
$( this ).animate( {
opacity: 1
}, 400 );
} );
},
goToTop: function() {
$goToTopEl.click( function( e ) {
$( 'body, html' ).stop( true ).animate( {
scrollTop: 0
}, 500, 'easeOutQuad' );
e.preventDefault();
} );
},
goToTopScroll: function() {
if ( $body.hasClass( 'device-lg' ) || $body.hasClass( 'device-md' ) || $body.hasClass( 'device-sm' ) ) {
if ( $window.scrollTop() > 450 ) {
$goToTopEl.fadeIn();
} else {
$goToTopEl.fadeOut();
}
}
}
}
APP.header = {
init: function() {
APP.header.stickyMenu();
APP.header.superfish();
APP.header.mobileMenu();
},
stickyMenu: function( headerOffset ) {
if ( $window.scrollTop() > headerOffset ) {
if ( ( $body.hasClass( 'device-lg' ) || $body.hasClass( 'device-md' ) ) && $header.hasClass( 'sticky' ) ) {
$header.addClass( 'sticky-header' );
}
} else {
APP.header.removeStickyness();
}
},
removeStickyness: function() {
if ( $header.hasClass( 'sticky-header' ) ) {
$header.removeClass( 'sticky-header' );
}
},
superfish: function() {
if ( $().superfish ) {
if ( $body.hasClass( 'device-lg' ) || $body.hasClass( 'device-md' ) ) {
$( '.main-navigation ul ul' ).css( 'display', 'block' );
APP.header.menuInvert();
}
$( '.main-navigation > div > ul' ).superfish ( {
popUpSelector: 'ul',
delay: 250,
speed: 350,
animation: { opacity: 'show' },
animationOut: { opacity: 'hide' },
cssArrows: false
} );
}
},
menuInvert: function() {
$( '.main-navigation ul ul' ).each( function( index, element ) {
var $menuChildElement = $( element ),
windowWidth = $window.width(),
menuChildOffset = $menuChildElement.offset(),
menuChildWidth = $menuChildElement.width(),
menuChildLeft = menuChildOffset.left;
if ( windowWidth - ( menuChildWidth + menuChildLeft ) < 0 ) {
$menuChildElement.addClass( 'menu-pos-invert' );
}
} );
},
mobileMenu: function() {
$( '#main-navigation-trigger' ).click( function( e ) {
$( '.main-navigation > div > ul' ).toggleClass( 'show' );
e.preventDefault();
} );
if ( ( $body.hasClass( 'device-xs' ) || $body.hasClass( 'device-xxs' ) || $body.hasClass( 'device-sm' ) ) && ! $body.hasClass( 'device-touch' ) ) {
$( '.main-navigation ul li.menu-item' ).hover( function() {
if ( $( this ).parents( 'li' ).hasClass( 'menu-item-has-children' ) ) {
$( this ).parents( 'li' ).children( 'a' ).addClass( 'menu-hover' );
}
}, function() {
$( this ).children( 'a' ).removeClass( 'menu-hover' );
} );
}
if ( ( $body.hasClass( 'device-xs' ) || $body.hasClass( 'device-xxs' ) || $body.hasClass( 'device-sm' ) ) && $body.hasClass( 'device-touch' ) ) {
$( '.main-navigation > div > ul' ).superfish( 'destroy' ).addClass( 'mobile-menu' );
$( '.main-navigation ul li:has(ul)' ).append( '' );
$( '.main-navigation ul li.menu-item-has-children' ).children( 'a.submenu-trigger' ).click( function( e ) {
$( this ).parent().toggleClass( 'open' );
$( this ).parent().find( 'ul.sub-menu' ).stop( true, true ).toggle();
e.preventDefault();
} );
}
}
}
APP.portfolio = {
init: function() {
APP.portfolio.load();
APP.portfolio.ajaxload();
},
load: function() {
$portfolio.imagesLoaded( function() {
$portfolio.isotope( {
transitionDuration: '.65s'
} );
} );
},
ajaxload: function() {
$( '.portfolio-item a.center-icon, .portfolio-item .portfolio-desc a' ).click( function( e ) {
var portfolioId = $( this ).parents( '.portfolio-item' ).attr( 'id' );
if ( ! $( this ).parents( '.portfolio-item' ).hasClass( 'portfolio-active' ) ) {
APP.portfolio.loadItem( portfolioId );
}
e.preventDefault();
} );
},
loadItem: function( portfolioId ) {
var portfolioNext = APP.portfolio.getNextItem( portfolioId ),
portfolioPrev = APP.portfolio.getPrevItem( portfolioId );
APP.portfolio.closeItem();
$portfolioAjaxLoader.fadeIn();
$portfolioDetailsContainer.load(
$.ajax( {
type: 'POST',
url: app_vars.ajax_url,
data: {
action: 'portfolio_ajax',
portfolio_id: portfolioId,
portfolio_next: portfolioNext,
portfolio_prev: portfolioPrev
},
success: function( html ) {
$( '#portfolio-ajax-container' ).append( html );
APP.portfolio.initializeAjax( portfolioId );
APP.portfolio.openItem();
$portfolioItems.removeClass( 'portfolio-active' );
$( '#' + portfolioId ).addClass( 'portfolio-active' );
}
} )
);
},
getNextItem: function( portfolioId ) {
var portfolioNext = '',
hasNext = $( '#' + portfolioId ).nextAll( ':visible' ).first();
if ( hasNext.length != 0 ) {
portfolioNext = hasNext.attr( 'id' );
}
return portfolioNext;
},
getPrevItem: function( portfolioId ) {
var portfolioPrev = '',
hasPrev = $( '#' + portfolioId ).prevAll( ':visible' ).first();
if ( hasPrev.length != 0 ) {
portfolioPrev = hasPrev.attr( 'id' );
}
return portfolioPrev;
},
closeItem: function() {
if ( $portfolioDetails.find( '#portfolio-ajax-single' ).length != 0 ) {
$portfolioAjaxLoader.fadeIn();
$portfolioDetails.find( '#portfolio-ajax-single' ).fadeOut( '600', function() {
$( this ).remove();
} );
$portfolioDetails.removeClass( 'portfolio-ajax-opened' );
}
},
initializeAjax: function( portfolioId ) {
$( '#next-portfolio, #prev-portfolio' ).click( function( e ) {
var portfolioId = $( this ).attr( 'data-id' );
$portfolioItems.removeClass( 'portfolio-active' );
$( '#' + portfolioId ).addClass( 'portfolio-active' );
APP.portfolio.loadItem( portfolioId );
e.preventDefault();
} );
$portfolioDetailsContainer.on( 'click', '#close-portfolio', function( e ) {
$portfolioDetailsContainer.fadeOut( '600', function() {
$portfolioDetails.find( '#portfolio-ajax-single' ).remove();
} );
$portfolioDetails.removeClass( 'portfolio-ajax-opened' );
$portfolioItems.removeClass( 'portfolio-active' );
e.preventDefault();
} );
},
openItem: function() {
var topOffsetScroll = APP.initialize.topScrollOffset();
$portfolioDetailsContainer.imagesLoaded( function() {
$portfolioDetailsContainer.fadeIn();
} );
$portfolioDetails.addClass( 'portfolio-ajax-opened' );
$portfolioAjaxLoader.fadeOut();
var t = setTimeout( function() {
APP.initialize.lightbox();
$( 'html, body' ).stop( true ).animate( {
'scrollTop': $portfolioDetails.offset().top - topOffsetScroll
}, 900, 'easeOutQuad' );
}, 500 );
},
layout: function() {
$portfolio.isotope( 'layout' );
}
}
APP.blog = {
init: function() {
APP.blog.carousel();
},
carousel: function() {
if ( $blogCarouselContainer.find( '.blog-item' ).length > 0 ) {
$blogCarouselContainer.owlCarousel( {
margin: 1,
loop: true,
nav: true,
navText: ['', ''],
autoplay: false,
autoplayHoverPause: true,
dots: false,
responsive:{
0: { items: 1 },
600: { items: 2 },
1000: { items: 3 },
1200: { items: 4 }
}
} );
} else {
$blogCarouselContainer.show();
}
},
masonry: function() {
$blogMasonryContainer.isotope( {
transitionDuration: '.65s'
} );
},
layout: function() {
$blogMasonryContainer.isotope( 'layout' );
},
infiniteScroll: function() {
$blogMasonryContainer.infinitescroll( {
loading: {
finishedMsg: '',
msgText: '',
speed: 'normal'
},
state: {
isDone: false
},
nextSelector: '#load-more-posts .nav-previous a',
navSelector: '#load-more-posts',
itemSelector: 'article.post'
}, function( newElements ) {
APP.initialize.lightbox();
$blogMasonryContainer.isotope( 'appended', $( newElements ) );
var t = setTimeout( function() {
APP.blog.layout();
}, 1000 );
} );
}
}
APP.isMobile = {
Android: function() {
return navigator.userAgent.match( /Android/i );
},
BlackBerry: function() {
return navigator.userAgent.match( /BlackBerry/i );
},
iOS: function() {
return navigator.userAgent.match( /iPhone|iPad|iPod/i );
},
Opera: function() {
return navigator.userAgent.match( /Opera Mini/i );
},
Windows: function() {
return navigator.userAgent.match( /IEMobile/i );
},
any: function() {
return ( APP.isMobile.Android() || APP.isMobile.BlackBerry() || APP.isMobile.iOS() || APP.isMobile.Opera() || APP.isMobile.Windows() );
}
}
APP.documentOnReady = {
init: function() {
APP.initialize.init();
APP.header.init();
APP.portfolio.init();
APP.blog.init();
APP.documentOnReady.windowscroll();
},
windowscroll: function() {
var headerOffset = 0,
headerWrapOffset = 0;
if ( $header.length > 0 ) {
headerOffset = $header.offset().top;
}
if ( $header.length > 0 ) {
headerWrapOffset = $headerWrap.offset().top;
}
$window.on( 'scroll', function() {
APP.header.stickyMenu( headerWrapOffset );
APP.initialize.goToTopScroll();
} );
}
}
APP.documentOnLoad = {
init: function() {
APP.blog.masonry();
APP.blog.infiniteScroll();
}
}
APP.documentOnResize = {
init: function() {
var t = setTimeout( function() {
APP.portfolio.layout();
APP.blog.layout();
}, 500 );
}
}
$( document ).ready( APP.documentOnReady.init );
$window.load( APP.documentOnLoad.init );
$window.on( 'resize', APP.documentOnResize.init );
} )( jQuery );