| Current Path : /home/happyrenas/old/happy-and-pay.fr/assets/plugins/cubeportfolio/js/ |
Linux webd005.cluster105.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 |
| Current File : /home/happyrenas/old/happy-and-pay.fr/assets/plugins/cubeportfolio/js/jquery.cubeportfolio.js |
/*!
* Cube Portfolio - Responsive jQuery Grid Plugin
*
* version: 2.3.2 (26 May, 2015)
* require: jQuery v1.7+
*
* Copyright 2013-2015, Mihai Buricea (http://scriptpie.com/cubeportfolio/live-preview/)
* Licensed under CodeCanyon License (http://codecanyon.net/licenses)
*
*/
(function($, window, document, undefined) {
'use strict';
function CubePortfolio(obj, options, callback) {
/*jshint validthis: true */
var t = this,
initialCls = 'cbp',
children;
if ($.data(obj, 'cubeportfolio')) {
throw new Error('cubeportfolio is already initialized. Destroy it before initialize again!');
}
// attached this instance to obj
$.data(obj, 'cubeportfolio', t);
// extend options
t.options = $.extend({}, $.fn.cubeportfolio.options, options);
// store the state of the animation used for filters
t.isAnimating = true;
// default filter for plugin
t.defaultFilter = t.options.defaultFilter;
// registered events (observator & publisher pattern)
t.registeredEvents = [];
// skip events (observator & publisher pattern)
t.skipEvents = [];
// has wrapper
t.addedWrapp = false;
// register callback function
if ($.isFunction(callback)) {
t._registerEvent('initFinish', callback, true);
}
// js element
t.obj = obj;
// jquery element
t.$obj = $(obj);
// when there are no .cbp-item
children = t.$obj.children();
// if caption is active
if (t.options.caption) {
if (!CubePortfolio.Private.modernBrowser) {
t.options.caption = 'minimal';
}
// .cbp-caption-active is used only for css
// so it will not generate a big css from sass if a caption is set
initialCls += ' cbp-caption-active cbp-caption-' + t.options.caption;
}
t.$obj.addClass(initialCls);
if (children.length === 0 || children.first().hasClass('cbp-item')) {
t.wrapInner(t.obj, 'cbp-wrapper');
t.addedWrapp = true;
}
// jquery wrapper element
t.$ul = t.$obj.children().addClass('cbp-wrapper');
// wrap the $ul in a outside wrapper
t.wrapInner(t.obj, 'cbp-wrapper-outer');
t.wrapper = t.$obj.children('.cbp-wrapper-outer');
t.blocks = t.$ul.children('.cbp-item');
// wrap .cbp-item-wrap div inside .cbp-item
t.wrapInner(t.blocks, 'cbp-item-wrapper');
// store main container width
t.width = t.$obj.outerWidth();
// wait to load all images and then go further
t._load(t.$obj, t._display);
}
$.extend(CubePortfolio.prototype, {
storeData: function(blocks) {
blocks.each(function(index, el) {
var block = $(el);
block.data('cbp', {
wrapper: block.children('.cbp-item-wrapper'),
widthInitial: block.outerWidth(),
heightInitial: block.outerHeight(),
width: null,
height: null,
left: null,
leftNew: null,
top: null,
topNew: null
});
});
},
// http://bit.ly/pure-js-wrap
wrapInner: function(items, classAttr) {
var t = this,
item,
i,
div;
classAttr = classAttr || '';
if (items.length && items.length < 1) {
return; // there are no .cbp-item
} else if (items.length === undefined) {
items = [items];
}
for (i = items.length - 1; i >= 0; i--) {
item = items[i];
div = document.createElement('div');
div.setAttribute('class', classAttr);
while (item.childNodes.length) {
div.appendChild(item.childNodes[0]);
}
item.appendChild(div);
}
},
/**
* Destroy function for all captions
*/
_captionDestroy: function() {
var t = this;
t.$obj.removeClass('cbp-caption-active cbp-caption-' + t.options.caption);
},
/**
* Add resize event when browser width changes
*/
resizeEvent: function() {
var t = this,
timeout, gridWidth;
// resize
$(window).on('resize.cbp', function() {
clearTimeout(timeout);
timeout = setTimeout(function() {
if (window.innerHeight == screen.height) {
// this is fulll screen mode. don't need to trigger a resize
return;
}
if (t.options.gridAdjustment === 'alignCenter') {
t.obj.style.maxWidth = '';
}
gridWidth = t.$obj.outerWidth();
if (t.width !== gridWidth) {
// update the current width
t.width = gridWidth;
t._gridAdjust();
// reposition the blocks
t._layout();
// repositionate the blocks with the best transition available
t.positionateItems();
// resize main container height
t._resizeMainContainer();
if (t.options.layoutMode === 'slider') {
t._updateSlider();
}
t._triggerEvent('resizeGrid');
}
t._triggerEvent('resizeWindow');
}, 80);
});
},
/**
* Wait to load all images
*/
_load: function(obj, callback, args) {
var t = this,
imgs,
imgsLength,
imgsLoaded = 0;
args = args || [];
imgs = obj.find('img:uncached').map(function() {
return this.src;
});
imgsLength = imgs.length;
if (imgsLength === 0) {
callback.apply(t, args);
}
$.each(imgs, function(i, src) {
var img = new Image();
$(img).one('load.cbp error.cbp', function() {
$(this).off('load.cbp error.cbp');
imgsLoaded++;
if (imgsLoaded === imgsLength) {
callback.apply(t, args);
return false;
}
});
img.src = src;
});
},
/**
* Check if filters is present in url
*/
_filterFromUrl: function() {
var t = this,
match = /#cbpf=(.*?)([#|?&]|$)/gi.exec(location.href);
if (match !== null) {
t.defaultFilter = match[1];
}
},
/**
* Show the plugin
*/
_display: function() {
var t = this;
// store to data some values of t.blocks
t.storeData(t.blocks);
if (t.options.layoutMode === 'grid') {
// set default filter if is present in url
t._filterFromUrl();
}
if (t.defaultFilter !== '*') {
t.blocksOn = t.blocks.filter(t.defaultFilter);
t.blocks.not(t.defaultFilter).addClass('cbp-item-off');
} else {
t.blocksOn = t.blocks;
}
// plugins
t._plugins = $.map(CubePortfolio.Plugins, function(pluginName) {
return pluginName(t);
});
t._triggerEvent('initStartRead');
t._triggerEvent('initStartWrite');
t.localColumnWidth = t.options.gapVertical;
if (t.blocks.length) {
t.localColumnWidth += t.blocks.first().data('cbp').widthInitial;
}
t.getColumnsType = ($.isArray(t.options.mediaQueries)) ? '_getColumnsBreakpoints' : '_getColumnsAuto';
t._gridAdjust();
// create mark-up for layout mode
t['_' + t.options.layoutMode + 'Markup']();
// make layout
t._layout();
// positionate the blocks
t.positionateItems();
// resize main container height
t._resizeMainContainer();
t._triggerEvent('initEndRead');
t._triggerEvent('initEndWrite');
// plugin is ready to show and interact
t.$obj.addClass('cbp-ready');
t._registerEvent('delayFrame', t.delayFrame);
// the reason is to skip this event when you want from a plugin
t._triggerEvent('delayFrame');
},
positionateItems: function() {
var t = this,
data;
t.blocksOn.each(function(index, el) {
data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
});
},
delayFrame: function() {
var t = this;
requestAnimationFrame(function() {
t.resizeEvent();
t._triggerEvent('initFinish');
// animating is now false
t.isAnimating = false;
// trigger public event initComplete
t.$obj.trigger('initComplete.cbp');
});
},
_gridAdjust: function() {
var t = this;
// if responsive
if (t.options.gridAdjustment === 'responsive') {
t._responsiveLayout();
} else {
t.blocks.each(function(index, el) {
var data = $(el).data('cbp');
data.width = data.widthInitial;
data.height = data.heightInitial;
});
}
},
/**
* Build the layout
*/
_layout: function() {
var t = this;
t['_' + t.options.layoutMode + 'LayoutReset']();
t['_' + t.options.layoutMode + 'Layout']();
t.$obj.removeClass(function(index, css) {
return (css.match(/\bcbp-cols-\d+/gi) || []).join(' ');
});
t.$obj.addClass('cbp-cols-' + t.cols);
},
// create mark
_sliderMarkup: function() {
var t = this;
t.sliderStopEvents = false;
t.sliderActive = 0;
t._registerEvent('updateSliderPosition', function() {
t.$obj.addClass('cbp-mode-slider');
}, true);
t.nav = $('<div/>', {
'class': 'cbp-nav'
});
t.nav.on('click.cbp', '[data-slider-action]', function(e) {
e.preventDefault();
e.stopImmediatePropagation();
e.stopPropagation();
if (t.sliderStopEvents) {
return;
}
var el = $(this),
action = el.attr('data-slider-action');
if (t['_' + action + 'Slider']) {
t['_' + action + 'Slider'](el);
}
});
if (t.options.showNavigation) {
t.controls = $('<div/>', {
'class': 'cbp-nav-controls'
});
t.navPrev = $('<div/>', {
'class': 'cbp-nav-prev',
'data-slider-action': 'prev'
}).appendTo(t.controls);
t.navNext = $('<div/>', {
'class': 'cbp-nav-next',
'data-slider-action': 'next'
}).appendTo(t.controls);
t.controls.appendTo(t.nav);
}
if (t.options.showPagination) {
t.navPagination = $('<div/>', {
'class': 'cbp-nav-pagination'
}).appendTo(t.nav);
}
if (t.controls || t.navPagination) {
t.nav.appendTo(t.$obj);
}
t._updateSliderPagination();
if (t.options.auto) {
if (t.options.autoPauseOnHover) {
t.mouseIsEntered = false;
t.$obj.on('mouseenter.cbp', function(e) {
t.mouseIsEntered = true;
t._stopSliderAuto();
}).on('mouseleave.cbp', function(e) {
t.mouseIsEntered = false;
t._startSliderAuto();
});
}
t._startSliderAuto();
}
if (t.options.drag && CubePortfolio.Private.modernBrowser) {
t._dragSlider();
}
},
_updateSlider: function() {
var t = this;
t._updateSliderPosition();
t._updateSliderPagination();
},
_updateSliderPagination: function() {
var t = this,
pages,
i;
if (t.options.showPagination) {
// get number of pages
pages = Math.ceil(t.blocksOn.length / t.cols);
t.navPagination.empty();
for (i = pages - 1; i >= 0; i--) {
$('<div/>', {
'class': 'cbp-nav-pagination-item',
'data-slider-action': 'jumpTo'
}).appendTo(t.navPagination);
}
t.navPaginationItems = t.navPagination.children();
}
// enable disable the nav
t._enableDisableNavSlider();
},
_destroySlider: function() {
var t = this;
if (t.options.layoutMode !== 'slider') {
return;
}
t.$obj.off('click.cbp');
t.$obj.removeClass('cbp-mode-slider');
if (t.options.showNavigation) {
t.nav.remove();
}
if (t.navPagination) {
t.navPagination.remove();
}
},
_nextSlider: function(el) {
var t = this;
if (t._isEndSlider()) {
if (t.isRewindNav()) {
t.sliderActive = 0;
} else {
return;
}
} else {
if (t.options.scrollByPage) {
t.sliderActive = Math.min(t.sliderActive + t.cols, t.blocksOn.length - t.cols);
} else {
t.sliderActive += 1;
}
}
t._goToSlider();
},
_prevSlider: function(el) {
var t = this;
if (t._isStartSlider()) {
if (t.isRewindNav()) {
t.sliderActive = t.blocksOn.length - t.cols;
} else {
return;
}
} else {
if (t.options.scrollByPage) {
t.sliderActive = Math.max(0, t.sliderActive - t.cols);
} else {
t.sliderActive -= 1;
}
}
t._goToSlider();
},
_jumpToSlider: function(el) {
var t = this,
index = Math.min(el.index() * t.cols, t.blocksOn.length - t.cols);
if (index === t.sliderActive) {
return;
}
t.sliderActive = index;
t._goToSlider();
},
_jumpDragToSlider: function(pos) {
var t = this,
jumpWidth,
offset,
condition,
index,
dragLeft = (pos > 0) ? true : false;
if (t.options.scrollByPage) {
jumpWidth = t.cols * t.localColumnWidth;
offset = t.cols;
} else {
jumpWidth = t.localColumnWidth;
offset = 1;
}
pos = Math.abs(pos);
index = Math.floor(pos / jumpWidth) * offset;
if (pos % jumpWidth > 20) {
index += offset;
}
if (dragLeft) { // drag to left
t.sliderActive = Math.min(t.sliderActive + index, t.blocksOn.length - t.cols);
} else { // drag to right
t.sliderActive = Math.max(0, t.sliderActive - index);
}
t._goToSlider();
},
_isStartSlider: function() {
return this.sliderActive === 0;
},
_isEndSlider: function() {
var t = this;
return (t.sliderActive + t.cols) > t.blocksOn.length - 1;
},
_goToSlider: function() {
var t = this;
// enable disable the nav
t._enableDisableNavSlider();
t._updateSliderPosition();
},
_startSliderAuto: function() {
var t = this;
if (t.isDrag) {
t._stopSliderAuto();
return;
}
t.timeout = setTimeout(function() {
// go to next slide
t._nextSlider();
// start auto
t._startSliderAuto();
}, t.options.autoTimeout);
},
_stopSliderAuto: function() {
clearTimeout(this.timeout);
},
_enableDisableNavSlider: function() {
var t = this,
page,
method;
if (!t.isRewindNav()) {
method = (t._isStartSlider()) ? 'addClass' : 'removeClass';
t.navPrev[method]('cbp-nav-stop');
method = (t._isEndSlider()) ? 'addClass' : 'removeClass';
t.navNext[method]('cbp-nav-stop');
}
if (t.options.showPagination) {
if (t.options.scrollByPage) {
page = Math.ceil(t.sliderActive / t.cols);
} else {
if (t._isEndSlider()) {
page = t.navPaginationItems.length - 1;
} else {
page = Math.floor(t.sliderActive / t.cols);
}
}
// add class active on pagination's items
t.navPaginationItems.removeClass('cbp-nav-pagination-active')
.eq(page)
.addClass('cbp-nav-pagination-active');
}
},
/**
* If slider loop is enabled don't add classes to `next` and `prev` buttons
*/
isRewindNav: function() {
var t = this;
if (!t.options.showNavigation) {
return true;
}
if (t.blocksOn.length <= t.cols) {
return false;
}
if (t.options.rewindNav) {
return true;
}
return false;
},
sliderItemsLength: function() {
return this.blocksOn.length <= this.cols;
},
/**
* Arrange the items in a slider layout
*/
_sliderLayout: function() {
var t = this;
t.blocksOn.each(function(index, el) {
var data = $(el).data('cbp');
// update the values with the new ones
data.leftNew = Math.round(t.localColumnWidth * index);
data.topNew = 0;
t.colVert.push(data.height + t.options.gapHorizontal);
});
t.sliderColVert = t.colVert.slice(t.sliderActive, t.sliderActive + t.cols);
t.ulWidth = t.localColumnWidth * t.blocksOn.length - t.options.gapVertical;
t.$ul.width(t.ulWidth);
},
_updateSliderPosition: function() {
var t = this,
value = -t.sliderActive * t.localColumnWidth;
t._triggerEvent('updateSliderPosition');
if (CubePortfolio.Private.modernBrowser) {
t.$ul[0].style[CubePortfolio.Private.transform] = 'translate3d(' + value + 'px, 0px, 0)';
} else {
t.$ul[0].style.left = value + 'px';
}
t.sliderColVert = t.colVert.slice(t.sliderActive, t.sliderActive + t.cols);
t._resizeMainContainer();
},
_dragSlider: function() {
var t = this,
$document = $(document),
posInitial,
pos,
target,
ulPosition,
ulMaxWidth,
isAnimating = false,
events = {},
isTouch = false,
touchStartEvent,
isHover = false;
t.isDrag = false;
if (('ontouchstart' in window) ||
(navigator.maxTouchPoints > 0) ||
(navigator.msMaxTouchPoints > 0)) {
events = {
start: 'touchstart.cbp',
move: 'touchmove.cbp',
end: 'touchend.cbp'
};
isTouch = true;
} else {
events = {
start: 'mousedown.cbp',
move: 'mousemove.cbp',
end: 'mouseup.cbp'
};
}
function dragStart(e) {
if (t.sliderItemsLength()) {
return;
}
if (!isTouch) {
e.preventDefault();
} else {
touchStartEvent = e;
}
if (t.options.auto) {
t._stopSliderAuto();
}
if (isAnimating) {
$(target).one('click.cbp', function() {
return false;
});
return;
}
target = $(e.target);
posInitial = pointerEventToXY(e).x;
pos = 0;
ulPosition = -t.sliderActive * t.localColumnWidth;
ulMaxWidth = t.localColumnWidth * (t.blocksOn.length - t.cols);
$document.on(events.move, dragMove);
$document.on(events.end, dragEnd);
t.$obj.addClass('cbp-mode-slider-dragStart');
}
function dragEnd(e) {
t.$obj.removeClass('cbp-mode-slider-dragStart');
// put the state to animate
isAnimating = true;
if (pos !== 0) {
target.one('click.cbp', function() {
return false;
});
t._jumpDragToSlider(pos);
t.$ul.one(CubePortfolio.Private.transitionend, afterDragEnd);
} else {
afterDragEnd.call(t);
}
$document.off(events.move);
$document.off(events.end);
}
function dragMove(e) {
pos = posInitial - pointerEventToXY(e).x;
if (pos > 8 || pos < -8) {
e.preventDefault();
}
t.isDrag = true;
var value = ulPosition - pos;
if (pos < 0 && pos < ulPosition) { // to right
value = (ulPosition - pos) / 5;
} else if (pos > 0 && (ulPosition - pos) < -ulMaxWidth) { // to left
value = -ulMaxWidth + (ulMaxWidth + ulPosition - pos) / 5;
}
if (CubePortfolio.Private.modernBrowser) {
t.$ul[0].style[CubePortfolio.Private.transform] = 'translate3d(' + value + 'px, 0px, 0)';
} else {
t.$ul[0].style.left = value + 'px';
}
}
function afterDragEnd() {
isAnimating = false;
t.isDrag = false;
if (t.options.auto) {
if (t.mouseIsEntered) {
return;
}
t._startSliderAuto();
}
}
function pointerEventToXY(e) {
if (e.originalEvent !== undefined && e.originalEvent.touches !== undefined) {
e = e.originalEvent.touches[0];
}
return {
x: e.pageX,
y: e.pageY
};
}
t.$ul.on(events.start, dragStart);
},
/**
* Reset the slider layout
*/
_sliderLayoutReset: function() {
var t = this;
t.colVert = [];
},
// create mark
_gridMarkup: function() {
},
/**
* Arrange the items in a grid layout
*/
_gridLayout: function() {
var t = this;
t.blocksOn.each(function(index, el) {
var minVert = Math.min.apply(Math, t.colVert),
column = 0,
data = $(el).data('cbp'),
setHeight,
colsLen,
i,
len;
for (i = 0, len = t.colVert.length; i < len; i++) {
if (t.colVert[i] === minVert) {
column = i;
break;
}
}
// update the values with the new ones
data.leftNew = Math.round(t.localColumnWidth * column);
data.topNew = Math.round(minVert);
setHeight = minVert + data.height + t.options.gapHorizontal;
colsLen = t.cols + 1 - len;
for (i = 0; i < colsLen; i++) {
t.colVert[column + i] = setHeight;
}
});
},
/**
* Reset the grid layout
*/
_gridLayoutReset: function() {
var c, t = this;
// @options gridAdjustment = alignCenter
if (t.options.gridAdjustment === 'alignCenter') {
// calculate numbers of columns
t.cols = Math.max(Math.floor((t.width + t.options.gapVertical) / t.localColumnWidth), 1);
t.width = t.cols * t.localColumnWidth - t.options.gapVertical;
t.$obj.css('max-width', t.width);
} else {
// calculate numbers of columns
t.cols = Math.max(Math.floor((t.width + t.options.gapVertical) / t.localColumnWidth), 1);
}
t.colVert = [];
c = t.cols;
while (c--) {
t.colVert.push(0);
}
},
/**
* Make this plugin responsive
*/
_responsiveLayout: function() {
var t = this,
widthWithoutGap,
itemWidth;
if (!t.columnWidthCache) {
t.columnWidthCache = t.localColumnWidth;
} else {
t.localColumnWidth = t.columnWidthCache;
}
// calculate numbers of cols
t.cols = t[t.getColumnsType]();
// calculate the with of items without the gaps between them
widthWithoutGap = t.width - t.options.gapVertical * (t.cols - 1);
// calculate column with based on widthWithoutGap plus the gap
t.localColumnWidth = parseInt(widthWithoutGap / t.cols, 10) + t.options.gapVertical;
itemWidth = (t.localColumnWidth - t.options.gapVertical);
t.blocks.each(function(index, item) {
item.style.width = itemWidth + 'px';
$(item).data('cbp').width = itemWidth;
});
t.blocks.each(function(index, el) {
var item = $(el);
item.data('cbp').height = item.outerHeight();
});
},
/**
* Get numbers of columns when t.options.mediaQueries is not an array
*/
_getColumnsAuto: function() {
var t = this;
return Math.max(Math.round(t.width / t.localColumnWidth), 1);
},
/**
* Get numbers of columns where t.options.mediaQueries is an array
*/
_getColumnsBreakpoints: function() {
var t = this,
gridWidth = t.width - t.options.gapVertical,
cols;
$.each(t.options.mediaQueries, function(index, val) {
if (gridWidth >= val.width) {
cols = val.cols;
return false;
}
});
if (cols === undefined) {
cols = t.options.mediaQueries[t.options.mediaQueries.length - 1].cols;
}
return cols;
},
/**
* Resize main container vertically
*/
_resizeMainContainer: function() {
var t = this,
cols = t.sliderColVert || t.colVert,
height;
// set container height for `overflow: hidden` to be applied
height = Math.max(Math.max.apply(Math, cols) - t.options.gapHorizontal, 0);
if (height === t.height) {
return;
}
t.obj.style.height = height + 'px';
// if _resizeMainContainer is called for the first time skip this event trigger
if (t.height !== undefined) {
if (CubePortfolio.Private.modernBrowser) {
t.$obj.one(CubePortfolio.Private.transitionend, function() {
t.$obj.trigger('pluginResize.cbp');
});
} else {
t.$obj.trigger('pluginResize.cbp');
}
}
t.height = height;
},
_filter: function(filterName) {
var t = this;
// blocks that are visible before applying the filter
t.blocksOnInitial = t.blocksOn;
// blocks visible after applying the filter
t.blocksOn = t.blocks.filter(filterName);
// blocks off after applying the filter
t.blocksOff = t.blocks.not(filterName);
// call layout
t._layout();
// filter call layout
t.filterLayout(filterName);
},
/**
* Default filter layout if nothing overrides
*/
filterLayout: function(filterName) {
var t = this;
t.blocksOff.addClass('cbp-item-off');
t.blocksOn.removeClass('cbp-item-off')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
});
// resize main container height
t._resizeMainContainer();
t.filterFinish();
},
/**
* Trigger when a filter is finished
*/
filterFinish: function() {
var t = this;
t.isAnimating = false;
t.$obj.trigger('filterComplete.cbp');
t._triggerEvent('filterFinish');
},
/**
* Register event
*/
_registerEvent: function(name, callbackFunction, oneTime) {
var t = this;
if (!t.registeredEvents[name]) {
t.registeredEvents[name] = [];
}
t.registeredEvents[name].push({
func: callbackFunction,
oneTime: oneTime || false
});
},
/**
* Trigger event
*/
_triggerEvent: function(name, param) {
var t = this,
i, len;
if (t.skipEvents[name]) {
delete t.skipEvents[name];
return;
}
if (t.registeredEvents[name]) {
for (i = 0, len = t.registeredEvents[name].length; i < len; i++) {
t.registeredEvents[name][i].func.call(t, param);
if (t.registeredEvents[name][i].oneTime) {
t.registeredEvents[name].splice(i, 1);
// function splice change the t.registeredEvents[name] array
// if event is one time you must set the i to the same value
// next time and set the length lower
i--;
len--;
}
}
}
},
/**
* Delay trigger event
*/
_skipNextEvent: function(name) {
var t = this;
t.skipEvents[name] = true;
},
_addItems: function(els, callback) {
var t = this,
items = $(els)
.filter('.cbp-item')
.addClass('cbp-loading-fadeIn')
.css('top', '1000%')
.wrapInner('<div class="cbp-item-wrapper"></div>');
if (!items.length) {
t.isAnimating = false;
if ($.isFunction(callback)) {
callback.call(t);
}
return;
}
t._load(items, function() {
t.$obj.addClass('cbp-addItems');
items.appendTo(t.$ul);
// cache the new items to t.blocks
$.merge(t.blocks, items);
// push to data some values of items
t.storeData(items);
if (t.defaultFilter !== '*') {
t.blocksOn = t.blocks.filter(t.defaultFilter);
t.blocks.not(t.defaultFilter).addClass('cbp-item-off');
} else {
t.blocksOn = t.blocks;
}
items.on(CubePortfolio.Private.animationend, function() {
t.$obj.find('.cbp-loading-fadeIn').removeClass('cbp-loading-fadeIn');
t.$obj.removeClass('cbp-addItems');
});
t._triggerEvent('addItemsToDOM', items);
t._gridAdjust();
t._layout();
t.positionateItems();
// resize main container height
t._resizeMainContainer();
if (t.options.layoutMode === 'slider') {
t._updateSlider();
}
// if show count was actived, call show count function again
if (t.elems) {
CubePortfolio.Public.showCounter.call(t.obj, t.elems);
}
if (CubePortfolio.Private.modernBrowser) {
items.last().one(CubePortfolio.Private.animationend, function() {
t.isAnimating = false;
if ($.isFunction(callback)) {
callback.call(t);
}
});
} else {
t.isAnimating = false;
if ($.isFunction(callback)) {
callback.call(t);
}
}
});
}
});
/**
* jQuery plugin initializer
*/
$.fn.cubeportfolio = function(method, options, callback) {
return this.each(function() {
if (typeof method === 'object' || !method) {
return CubePortfolio.Public.init.call(this, method, callback);
} else if (CubePortfolio.Public[method]) {
return CubePortfolio.Public[method].call(this, options, callback);
}
throw new Error('Method ' + method + ' does not exist on jquery.cubeportfolio.js');
});
};
// Plugin default options
$.fn.cubeportfolio.options = {
/**
* Is used to define the wrapper for filters
* Values: strings that represent the elements in the document (DOM selector).
*/
filters: '',
/**
* Is used to define the wrapper for loadMore
* Values: strings that represent the elements in the document (DOM selector).
*/
loadMore: '',
/**
* How the loadMore functionality should behave. Load on click on the button or
* automatically when you scroll the page
* Values: - click
* - auto
*/
loadMoreAction: 'click',
/**
* Layout Mode for this instance
* Values: 'grid' or 'slider'
*/
layoutMode: 'grid',
/**
* Mouse and touch drag support
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
drag: true,
/**
* Autoplay the slider
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
auto: false,
/**
* Autoplay interval timeout. Time is set in milisecconds
* 1000 milliseconds equals 1 second.
* Option available only for `layoutMode: 'slider'`
* Values: only integers (ex: 1000, 2000, 5000)
*/
autoTimeout: 5000,
/**
* Stops autoplay when user hover the slider
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
autoPauseOnHover: true,
/**
* Show `next` and `prev` buttons for slider
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
showNavigation: true,
/**
* Show pagination for slider
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
showPagination: true,
/**
* Enable slide to first item (last item)
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
rewindNav: true,
/**
* Scroll by page and not by item. This option affect next/prev buttons and drag support
* Option available only for `layoutMode: 'slider'`
* Values: true or false
*/
scrollByPage: false,
/**
* Default filter for plugin
* Option available only for `layoutMode: 'grid'`
* Values: strings that represent the filter name(ex: *, .logo, .web-design, .design)
*/
defaultFilter: '*',
/**
* Enable / disable the deeplinking feature when you click on filters
* Option available only for `layoutMode: 'grid'`
* Values: true or false
*/
filterDeeplinking: false,
/**
* Defines which animation to use for items that will be shown or hidden after a filter has been activated.
* Option available only for `layoutMode: 'grid'`
* The plugin use the best browser features available (css3 transitions and transform, GPU acceleration).
* Values: - fadeOut
* - quicksand
* - bounceLeft
* - bounceTop
* - bounceBottom
* - moveLeft
* - slideLeft
* - fadeOutTop
* - sequentially
* - skew
* - slideDelay
* - rotateSides
* - flipOutDelay
* - flipOut
* - unfold
* - foldLeft
* - scaleDown
* - scaleSides
* - frontRow
* - flipBottom
* - rotateRoom
*/
animationType: 'fadeOut',
/**
* Adjust the layout grid
* Values: - default (no adjustment applied)
* - alignCenter (align the grid on center of the page)
* - responsive (use a fluid grid to resize the grid)
*/
gridAdjustment: 'responsive',
/**
* Define `media queries` for columns layout.
* Format: [{width: a, cols: d}, {width: b, cols: e}, {width: c, cols: f}],
* where a, b, c are the grid width and d, e, f are the columns displayed.
* e.g. [{width: 1100, cols: 4}, {width: 800, cols: 3}, {width: 480, cols: 2}] means
* if (gridWidth >= 1100) => show 4 columns,
* if (gridWidth >= 800 && gridWidth < 1100) => show 3 columns,
* if (gridWidth >= 480 && gridWidth < 800) => show 2 columns,
* if (gridWidth < 480) => show 2 columns
* Keep in mind that a > b > c
* This option is available only when `gridAdjustment: 'responsive'`
* Values: - array of objects of format: [{width: a, cols: d}, {width: b, cols: e}]
* - you can define as many objects as you want
* - if this option is `false` Cube Portfolio will adjust the items
* width automatically (default option for backward compatibility)
*/
mediaQueries: false,
/**
* Horizontal gap between items
* Values: only integers (ex: 1, 5, 10)
*/
gapHorizontal: 10,
/**
* Vertical gap between items
* Values: only integers (ex: 1, 5, 10)
*/
gapVertical: 10,
/**
* Caption - the overlay that is shown when you put the mouse over an item
* NOTE: If you don't want to have captions set this option to an empty string ( caption: '')
* Values: - pushTop
* - pushDown
* - revealBottom
* - revealTop
* - moveRight
* - moveLeft
* - overlayBottomPush
* - overlayBottom
* - overlayBottomReveal
* - overlayBottomAlong
* - overlayRightAlong
* - minimal
* - fadeIn
* - zoom
* - opacity
*/
caption: 'pushTop',
/**
* The plugin will display his content based on the following values.
* Values: - default (the content will be displayed as soon as possible)
* - lazyLoading (the plugin will fully preload the images before displaying the items with a fadeIn effect)
* - fadeInToTop (the plugin will fully preload the images before displaying the items with a fadeIn effect from bottom to top)
* - sequentially (the plugin will fully preload the images before displaying the items with a sequentially effect)
* - bottomToTop (the plugin will fully preload the images before displaying the items with an animation from bottom to top)
*/
displayType: 'lazyLoading',
/**
* Defines the speed of displaying the items (when `displayType == default` this option will have no effect)
* Values: only integers, values in ms (ex: 200, 300, 500)
*/
displayTypeSpeed: 400,
/**
* This is used to define any clickable elements you wish to use to trigger lightbox popup on click.
* Values: strings that represent the elements in the document (DOM selector)
*/
lightboxDelegate: '.cbp-lightbox',
/**
* Enable / disable gallery mode
* Values: true or false
*/
lightboxGallery: true,
/**
* Attribute of the delegate item that contains caption for lightbox
* Values: html atributte
*/
lightboxTitleSrc: 'data-title',
/**
* Markup of the lightbox counter
* Values: html markup
*/
lightboxCounter: '<div class="cbp-popup-lightbox-counter">{{current}} of {{total}}</div>',
/**
* This is used to define any clickable elements you wish to use to trigger singlePage popup on click.
* Values: strings that represent the elements in the document (DOM selector)
*/
singlePageDelegate: '.cbp-singlePage',
/**
* Enable / disable the deeplinking feature for singlePage popup
* Values: true or false
*/
singlePageDeeplinking: true,
/**
* Enable / disable the sticky navigation for singlePage popup
* Values: true or false
*/
singlePageStickyNavigation: true,
/**
* Markup of the singlePage counter
* Values: html markup
*/
singlePageCounter: '<div class="cbp-popup-singlePage-counter">{{current}} of {{total}}</div>',
/**
* Defines which animation to use when singlePage appear
* Values: - left
* - fade
* - right
*/
singlePageAnimation: 'left',
/**
* Use this callback to update singlePage content.
* The callback will trigger after the singlePage popup will open.
* @param url = the href attribute of the item clicked
* @param element = the item clicked
* Values: function
*/
singlePageCallback: function(url, element) {
// to update singlePage content use the following method: this.updateSinglePage(yourContent)
},
/**
* This is used to define any clickable elements you wish to use to trigger singlePage Inline on click.
* Values: strings that represent the elements in the document (DOM selector)
*/
singlePageInlineDelegate: '.cbp-singlePageInline',
/**
* This is used to define the position of singlePage Inline block
* Values: - above ( above current element )
* - below ( below current elemnet)
* - top ( positon top )
* - bottom ( positon bottom )
*/
singlePageInlinePosition: 'top',
/**
* Push the open panel in focus and at close go back to the former stage
* Values: true or false
*/
singlePageInlineInFocus: true,
/**
* Use this callback to update singlePage Inline content.
* The callback will trigger after the singlePage Inline will open.
* @param url = the href attribute of the item clicked
* @param element = the item clicked
* Values: function
*/
singlePageInlineCallback: function(url, element) {
// to update singlePage Inline content use the following method: this.updateSinglePageInline(yourContent)
}
};
CubePortfolio.Plugins = {};
$.fn.cubeportfolio.Constructor = CubePortfolio;
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function Filters(parent) {
var t = this;
t.parent = parent;
t.filters = $(parent.options.filters);
t.wrap = $();
t.registerFilter();
}
Filters.prototype.registerFilter = function() {
var t = this,
parent = t.parent,
filtersCallback;
t.filters.each(function(index, el) {
var filter = $(el),
wrap;
if (filter.hasClass('cbp-l-filters-dropdown')) {
wrap = filter.find('.cbp-l-filters-dropdownWrap');
wrap.on({
'mouseover.cbp': function() {
wrap.addClass('cbp-l-filters-dropdownWrap-open');
},
'mouseleave.cbp': function() {
wrap.removeClass('cbp-l-filters-dropdownWrap-open');
}
});
filtersCallback = function(me) {
wrap.find('.cbp-filter-item').removeClass('cbp-filter-item-active');
wrap.find('.cbp-l-filters-dropdownHeader').text(me.text());
me.addClass('cbp-filter-item-active');
wrap.trigger('mouseleave.cbp');
};
t.wrap.add(wrap);
} else {
filtersCallback = function(me) {
me.addClass('cbp-filter-item-active').siblings().removeClass('cbp-filter-item-active');
};
}
filtersCallback(
filter
.find('.cbp-filter-item')
.filter('[data-filter="' + parent.defaultFilter + '"]')
);
filter.on('click.cbp', '.cbp-filter-item', function() {
var me = $(this);
if (me.hasClass('cbp-filter-item-active')) {
return;
}
// get cubeportfolio data and check if is still animating (reposition) the items.
if (!parent.isAnimating) {
filtersCallback.call(null, me);
}
// filter the items
parent.$obj.cubeportfolio('filter', me.data('filter'));
});
// activate counter for filters
parent.$obj.cubeportfolio('showCounter', filter.find('.cbp-filter-item'), function() {
// read from url and change filter active
var match = /#cbpf=(.*?)([#|?&]|$)/gi.exec(location.href),
item;
if (match !== null) {
item = filter.find('.cbp-filter-item').filter('[data-filter="' + match[1] + '"]');
if (item.length) {
filtersCallback.call(null, item);
}
}
});
});
};
Filters.prototype.destroy = function() {
var t = this;
t.filters.off('.cbp');
if (t.wrap) {
t.wrap.off('.cbp');
}
};
CubePortfolio.Plugins.Filters = function(parent) {
if (parent.options.filters === '') {
return null;
}
return new Filters(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function LoadMore(parent) {
var t = this;
t.parent = parent;
t.loadMore = $(parent.options.loadMore).find('.cbp-l-loadMore-link');
// load click or auto action
if (parent.options.loadMoreAction.length) {
t[parent.options.loadMoreAction]();
}
}
LoadMore.prototype.click = function() {
var t = this,
numberOfClicks = 0;
t.loadMore.on('click.cbp', function(e) {
var item = $(this);
e.preventDefault();
if (item.hasClass('cbp-l-loadMore-stop')) {
return;
}
// set loading status
item.addClass('cbp-l-loadMore-loading');
numberOfClicks++;
// perform ajax request
$.ajax({
url: t.loadMore.attr('href'),
type: 'GET',
dataType: 'HTML'
}).done(function(result) {
var items, itemsNext;
// find current container
items = $(result).filter(function() {
return $(this).is('div' + '.cbp-loadMore-block' + numberOfClicks);
});
t.parent.$obj.cubeportfolio('appendItems', items.html(), function() {
// put the original message back
item.removeClass('cbp-l-loadMore-loading');
// check if we have more works
itemsNext = $(result).filter(function() {
return $(this).is('div' + '.cbp-loadMore-block' + (numberOfClicks + 1));
});
if (itemsNext.length === 0) {
item.addClass('cbp-l-loadMore-stop');
}
});
}).fail(function() {
// error
});
});
};
LoadMore.prototype.auto = function() {
var t = this;
t.parent.$obj.on('initComplete.cbp', function() {
Object.create({
init: function() {
var self = this;
// the job inactive
self.isActive = false;
self.numberOfClicks = 0;
// set loading status
t.loadMore.addClass('cbp-l-loadMore-loading');
// cache window selector
self.window = $(window);
// add events for scroll
self.addEvents();
// trigger method on init
self.getNewItems();
},
addEvents: function() {
var self = this,
timeout;
t.loadMore.on('click.cbp', function(e) {
e.preventDefault();
});
self.window.on('scroll.loadMoreObject', function() {
clearTimeout(timeout);
timeout = setTimeout(function() {
if (!t.parent.isAnimating) {
// get new items on scroll
self.getNewItems();
}
}, 80);
});
// when the filter is completed
t.parent.$obj.on('filterComplete.cbp', function() {
self.getNewItems();
});
},
getNewItems: function() {
var self = this,
topLoadMore, topWindow;
if (self.isActive || t.loadMore.hasClass('cbp-l-loadMore-stop')) {
return;
}
topLoadMore = t.loadMore.offset().top;
topWindow = self.window.scrollTop() + self.window.height();
if (topLoadMore > topWindow) {
return;
}
// this job is now busy
self.isActive = true;
// increment number of clicks
self.numberOfClicks++;
// perform ajax request
$.ajax({
url: t.loadMore.attr('href'),
type: 'GET',
dataType: 'HTML',
cache: true
})
.done(function(result) {
var items, itemsNext;
// find current container
items = $(result).filter(function() {
return $(this).is('div' + '.cbp-loadMore-block' + self.numberOfClicks);
});
t.parent.$obj.cubeportfolio('appendItems', items.html(), function() {
// check if we have more works
itemsNext = $(result).filter(function() {
return $(this).is('div' + '.cbp-loadMore-block' + (self.numberOfClicks + 1));
});
if (itemsNext.length === 0) {
t.loadMore.addClass('cbp-l-loadMore-stop');
// remove events
self.window.off('scroll.loadMoreObject');
t.parent.$obj.off('filterComplete.cbp');
} else {
// make the job inactive
self.isActive = false;
self.window.trigger('scroll.loadMoreObject');
}
});
})
.fail(function() {
// make the job inactive
self.isActive = false;
});
}
}).init();
});
};
LoadMore.prototype.destroy = function() {
var t = this;
t.loadMore.off('.cbp');
$(window).off('scroll.loadMoreObject');
};
CubePortfolio.Plugins.LoadMore = function(parent) {
if (parent.options.loadMore === '') {
return null;
}
return new LoadMore(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
var popup = {
/**
* init function for popup
* @param cubeportfolio = cubeportfolio instance
* @param type = 'lightbox' or 'singlePage'
*/
init: function(cubeportfolio, type) {
var t = this,
currentBlock;
// remember cubeportfolio instance
t.cubeportfolio = cubeportfolio;
// remember if this instance is for lightbox or for singlePage
t.type = type;
// remember if the popup is open or not
t.isOpen = false;
t.options = t.cubeportfolio.options;
if (type === 'lightbox') {
t.cubeportfolio._registerEvent('resizeWindow', function() {
t.resizeImage();
});
}
if (type === 'singlePageInline') {
t.startInline = -1;
t.height = 0;
// create markup, css and add events for SinglePageInline
t._createMarkupSinglePageInline();
t.cubeportfolio._registerEvent('resizeGrid', function() {
if (t.isOpen) {
// @todo must add support for this features in the future
t.close(); // workaround
}
});
return;
}
// create markup, css and add events for lightbox and singlePage
t._createMarkup();
if (type === 'singlePage') {
t.cubeportfolio._registerEvent('resizeWindow', function() {
if (t.options.singlePageStickyNavigation) {
var width = t.wrap[0].clientWidth;
if (width > 0) {
t.navigationWrap.width(width);
// set navigation width='window width' to center the divs
t.navigation.width(width);
}
}
});
if (t.options.singlePageDeeplinking) {
t.url = location.href;
if (t.url.slice(-1) === '#') {
t.url = t.url.slice(0, -1);
}
var links = t.url.split('#cbp=');
var url = links.shift(); // remove first item
$.each(links, function(index, link) {
t.cubeportfolio.blocksOn.each(function(index1, el) {
var singlePage = $(el).find(t.options.singlePageDelegate + '[href="' + link + '"]');
if (singlePage.length) {
currentBlock = singlePage;
return false;
}
});
if (currentBlock) {
return false;
}
});
if (currentBlock) {
t.url = url;
var self = currentBlock,
gallery = self.attr('data-cbp-singlePage'),
blocks = [];
if (gallery) {
blocks = self.closest($('.cbp-item')).find('[data-cbp-singlePage="' + gallery + '"]');
} else {
t.cubeportfolio.blocksOn.each(function(index, el) {
var item = $(el);
if (item.not('.cbp-item-off')) {
item.find(t.options.singlePageDelegate).each(function(index2, el2) {
if (!$(el2).attr('data-cbp-singlePage')) {
blocks.push(el2);
}
});
}
});
}
t.openSinglePage(blocks, currentBlock[0]);
} else if (links.length) { // @todo - hack to load items from loadMore
var fakeLink = document.createElement('a');
fakeLink.setAttribute('href', links[0]);
t.openSinglePage([fakeLink], fakeLink);
}
}
}
},
/**
* Create markup, css and add events
*/
_createMarkup: function() {
var t = this,
animationCls = '';
if (t.type === 'singlePage') {
if (t.options.singlePageAnimation !== 'left') {
animationCls = ' cbp-popup-singlePage-' + t.options.singlePageAnimation;
}
}
// wrap element
t.wrap = $('<div/>', {
'class': 'cbp-popup-wrap cbp-popup-' + t.type + animationCls,
'data-action': (t.type === 'lightbox') ? 'close' : ''
}).on('click.cbp', function(e) {
if (t.stopEvents) {
return;
}
var action = $(e.target).attr('data-action');
if (t[action]) {
t[action]();
e.preventDefault();
}
});
// content element
t.content = $('<div/>', {
'class': 'cbp-popup-content'
}).appendTo(t.wrap);
// append loading div
$('<div/>', {
'class': 'cbp-popup-loadingBox'
}).appendTo(t.wrap);
// add background only for ie8
if (CubePortfolio.Private.browser === 'ie8') {
t.bg = $('<div/>', {
'class': 'cbp-popup-ie8bg',
'data-action': (t.type === 'lightbox') ? 'close' : ''
}).appendTo(t.wrap);
}
// create navigation wrap
t.navigationWrap = $('<div/>', {
'class': 'cbp-popup-navigation-wrap'
}).appendTo(t.wrap);
// create navigation block
t.navigation = $('<div/>', {
'class': 'cbp-popup-navigation'
}).appendTo(t.navigationWrap);
// close
t.closeButton = $('<div/>', {
'class': 'cbp-popup-close',
'title': 'Close (Esc arrow key)',
'data-action': 'close'
}).appendTo(t.navigation);
// next
t.nextButton = $('<div/>', {
'class': 'cbp-popup-next',
'title': 'Next (Right arrow key)',
'data-action': 'next'
}).appendTo(t.navigation);
// prev
t.prevButton = $('<div/>', {
'class': 'cbp-popup-prev',
'title': 'Previous (Left arrow key)',
'data-action': 'prev'
}).appendTo(t.navigation);
if (t.type === 'singlePage') {
if (t.options.singlePageCounter) {
// counter for singlePage
t.counter = $(t.options.singlePageCounter).appendTo(t.navigation);
t.counter.text('');
}
t.content.on('click.cbp', t.options.singlePageDelegate, function(e) {
e.preventDefault();
var i,
len = t.dataArray.length,
href = this.getAttribute('href');
for (i = 0; i < len; i++) {
if (t.dataArray[i].url === href) {
break;
}
}
t.singlePageJumpTo(i - t.current);
});
// if there are some events than overrides the default scroll behaviour don't go to them
t.wrap.on('mousewheel.cbp' + ' DOMMouseScroll.cbp', function(e) {
e.stopImmediatePropagation();
});
}
$(document).on('keydown.cbp', function(e) {
// if is not open => return
if (!t.isOpen) {
return;
}
// if all events are stopped => return
if (t.stopEvents) {
return;
}
if (e.keyCode === 37) { // prev key
t.prev();
} else if (e.keyCode === 39) { // next key
t.next();
} else if (e.keyCode === 27) { //esc key
t.close();
}
});
},
_createMarkupSinglePageInline: function() {
var t = this;
// wrap element
t.wrap = $('<div/>', {
'class': 'cbp-popup-singlePageInline'
}).on('click.cbp', function(e) {
if (t.stopEvents) {
return;
}
var action = $(e.target).attr('data-action');
if (action && t[action]) {
t[action]();
e.preventDefault();
}
});
// content element
t.content = $('<div/>', {
'class': 'cbp-popup-content'
}).appendTo(t.wrap);
// append loading div
// $('<div/>', {
// 'class': 'cbp-popup-loadingBox'
// }).appendTo(t.wrap);
// create navigation block
t.navigation = $('<div/>', {
'class': 'cbp-popup-navigation'
}).appendTo(t.wrap);
// close
t.closeButton = $('<div/>', {
'class': 'cbp-popup-close',
'title': 'Close (Esc arrow key)',
'data-action': 'close'
}).appendTo(t.navigation);
},
destroy: function() {
var t = this,
body = $('body');
// remove off key down
$(document).off('keydown.cbp');
// external lightbox and singlePageInline
body.off('click.cbp', t.options.lightboxDelegate);
body.off('click.cbp', t.options.singlePageDelegate);
t.content.off('click.cbp', t.options.singlePageDelegate);
t.cubeportfolio.$obj.off('click.cbp', t.options.singlePageInlineDelegate);
t.cubeportfolio.$obj.off('click.cbp', t.options.lightboxDelegate);
t.cubeportfolio.$obj.off('click.cbp', t.options.singlePageDelegate);
t.cubeportfolio.$obj.removeClass('cbp-popup-isOpening');
t.cubeportfolio.$obj.find('.cbp-item').removeClass('cbp-singlePageInline-active');
t.wrap.remove();
},
openLightbox: function(blocks, currentBlock) {
var t = this,
i = 0,
currentBlockHref, tempHref = [],
element;
if (t.isOpen) {
return;
}
// remember that the lightbox is open now
t.isOpen = true;
// remember to stop all events after the lightbox has been shown
t.stopEvents = false;
// array with elements
t.dataArray = [];
// reset current
t.current = null;
currentBlockHref = currentBlock.getAttribute('href');
if (currentBlockHref === null) {
throw new Error('HEI! Your clicked element doesn\'t have a href attribute.');
}
$.each(blocks, function(index, item) {
var href = item.getAttribute('href'),
src = href, // default if element is image
type = 'isImage', // default if element is image
videoLink;
if ($.inArray(href, tempHref) === -1) {
if (currentBlockHref === href) {
t.current = i;
} else if (!t.options.lightboxGallery) {
return;
}
if (/youtube/i.test(href)) {
videoLink = href.substring(href.lastIndexOf('v=') + 2);
if (!(/autoplay=/i.test(videoLink))) {
videoLink += '&autoplay=1';
}
videoLink = videoLink.replace(/\?|&/, '?');
// create new href
src = '//www.youtube.com/embed/' + videoLink;
type = 'isYoutube';
} else if (/vimeo/i.test(href)) {
videoLink = href.substring(href.lastIndexOf('/') + 1);
if (!(/autoplay=/i.test(videoLink))) {
videoLink += '&autoplay=1';
}
videoLink = videoLink.replace(/\?|&/, '?');
// create new href
src = '//player.vimeo.com/video/' + videoLink;
type = 'isVimeo';
} else if (/ted\.com/i.test(href)) {
// create new href
src = 'http://embed.ted.com/talks/' + href.substring(href.lastIndexOf('/') + 1) + '.html';
type = 'isTed';
} else if (/soundcloud\.com/i.test(href)) {
// create new href
src = href;
type = 'isSoundCloud';
} else if (/(\.mp4)|(\.ogg)|(\.ogv)|(\.webm)/i.test(href)) {
if (href.indexOf('|') !== -1) {
// create new href
src = href.split('|');
} else {
// create new href
src = href.split('%7C');
}
type = 'isSelfHostedVideo';
} else if (/\.mp3$/i.test(href)) {
src = href;
type = 'isSelfHostedAudio';
}
t.dataArray.push({
src: src,
title: item.getAttribute(t.options.lightboxTitleSrc),
type: type
});
i++;
}
tempHref.push(href);
});
// total numbers of elements
t.counterTotal = t.dataArray.length;
if (t.counterTotal === 1) {
t.nextButton.hide();
t.prevButton.hide();
t.dataActionImg = '';
} else {
t.nextButton.show();
t.prevButton.show();
t.dataActionImg = 'data-action="next"';
}
// append to body
t.wrap.appendTo(document.body);
t.scrollTop = $(window).scrollTop();
t.originalStyle = $('html').attr('style');
$('html').css({
overflow: 'hidden',
paddingRight: window.innerWidth - $(document).width()
});
// show the wrapper (lightbox box)
t.wrap.show();
// get the current element
element = t.dataArray[t.current];
// call function if current element is image or video (iframe)
t[element.type](element);
},
openSinglePage: function(blocks, currentBlock) {
var t = this,
i = 0,
currentBlockHref, tempHref = [];
if (t.isOpen) {
return;
}
// check singlePageInline and close it
if (t.cubeportfolio.singlePageInline && t.cubeportfolio.singlePageInline.isOpen) {
t.cubeportfolio.singlePageInline.close();
}
// remember that the lightbox is open now
t.isOpen = true;
// remember to stop all events after the popup has been showing
t.stopEvents = false;
// array with elements
t.dataArray = [];
// reset current
t.current = null;
currentBlockHref = currentBlock.getAttribute('href');
if (currentBlockHref === null) {
throw new Error('HEI! Your clicked element doesn\'t have a href attribute.');
}
$.each(blocks, function(index, item) {
var href = item.getAttribute('href');
if ($.inArray(href, tempHref) === -1) {
if (currentBlockHref === href) {
t.current = i;
}
t.dataArray.push({
url: href,
element: item
});
i++;
}
tempHref.push(href);
});
// total numbers of elements
t.counterTotal = t.dataArray.length;
if (t.counterTotal === 1) {
t.nextButton.hide();
t.prevButton.hide();
} else {
t.nextButton.show();
t.prevButton.show();
}
// append to body
t.wrap.appendTo(document.body);
t.scrollTop = $(window).scrollTop();
$('html').css({
overflow: 'hidden',
paddingRight: window.innerWidth - $(document).width()
});
// go to top of the page (reset scroll)
t.wrap.scrollTop(0);
// show the wrapper
t.wrap.show();
// finish the open animation
t.finishOpen = 2;
// if transitionend is not fulfilled
t.navigationMobile = $();
t.wrap.one(CubePortfolio.Private.transitionend, function() {
var width;
// make the navigation sticky
if (t.options.singlePageStickyNavigation) {
t.wrap.addClass('cbp-popup-singlePage-sticky');
width = t.wrap[0].clientWidth;
t.navigationWrap.width(width);
if (CubePortfolio.Private.browser === 'android' || CubePortfolio.Private.browser === 'ios') {
// wrap element
t.navigationMobile = $('<div/>', {
'class': 'cbp-popup-singlePage cbp-popup-singlePage-sticky',
'id': t.wrap.attr('id')
}).on('click.cbp', function(e) {
if (t.stopEvents) {
return;
}
var action = $(e.target).attr('data-action');
if (t[action]) {
t[action]();
e.preventDefault();
}
});
t.navigationMobile.appendTo(document.body).append(t.navigationWrap);
}
}
t.finishOpen--;
if (t.finishOpen <= 0) {
t.updateSinglePageIsOpen.call(t);
}
});
if (CubePortfolio.Private.browser === 'ie8' || CubePortfolio.Private.browser === 'ie9') {
// make the navigation sticky
if (t.options.singlePageStickyNavigation) {
var width = t.wrap[0].clientWidth;
t.navigationWrap.width(width);
setTimeout(function() {
t.wrap.addClass('cbp-popup-singlePage-sticky');
}, 1000);
}
t.finishOpen--;
}
t.wrap.addClass('cbp-popup-loading');
// force reflow and then add class
t.wrap.offset();
t.wrap.addClass('cbp-popup-singlePage-open');
// change link
if (t.options.singlePageDeeplinking) {
// ignore old #cbp from href
t.url = t.url.split('#cbp=')[0];
location.href = t.url + '#cbp=' + t.dataArray[t.current].url;
}
// run callback function
if ($.isFunction(t.options.singlePageCallback)) {
t.options.singlePageCallback.call(t, t.dataArray[t.current].url, t.dataArray[t.current].element);
}
},
openSinglePageInline: function(blocks, currentBlock, fromOpen) {
var t = this,
start = 0,
currentBlockHref,
tempCurrent,
cbpitem,
parentElement;
fromOpen = fromOpen || false;
t.fromOpen = fromOpen;
t.storeBlocks = blocks;
t.storeCurrentBlock = currentBlock;
// check singlePageInline and close it
if (t.isOpen) {
tempCurrent = $(currentBlock).closest('.cbp-item').index();
if ((t.dataArray[t.current].url !== currentBlock.getAttribute('href')) || (t.current !== tempCurrent)) {
t.cubeportfolio.singlePageInline.close('open', {
blocks: blocks,
currentBlock: currentBlock,
fromOpen: true
});
} else {
t.close();
}
return;
}
// remember that the lightbox is open now
t.isOpen = true;
// remember to stop all events after the popup has been showing
t.stopEvents = false;
// array with elements
t.dataArray = [];
// reset current
t.current = null;
currentBlockHref = currentBlock.getAttribute('href');
if (currentBlockHref === null) {
throw new Error('HEI! Your clicked element doesn\'t have a href attribute.');
}
cbpitem = $(currentBlock).closest('.cbp-item')[0];
blocks.each(function(index, el) {
if (cbpitem === el) {
t.current = index;
}
});
t.dataArray[t.current] = {
url: currentBlockHref,
element: currentBlock
};
parentElement = $(t.dataArray[t.current].element).parents('.cbp-item').addClass('cbp-singlePageInline-active');
// total numbers of elements
t.counterTotal = blocks.length;
t.wrap.insertBefore(t.cubeportfolio.wrapper);
if (t.options.singlePageInlinePosition === 'top') {
t.startInline = 0;
t.top = 0;
t.firstRow = true;
t.lastRow = false;
} else if (t.options.singlePageInlinePosition === 'bottom') {
t.startInline = t.counterTotal;
t.top = t.cubeportfolio.height;
t.firstRow = false;
t.lastRow = true;
} else if (t.options.singlePageInlinePosition === 'above') {
t.startInline = t.cubeportfolio.cols * Math.floor(t.current / t.cubeportfolio.cols);
t.top = $(blocks[t.current]).data('cbp').top;
if (t.startInline === 0) {
t.firstRow = true;
} else {
t.top -= t.options.gapHorizontal;
t.firstRow = false;
}
t.lastRow = false;
} else { // below
t.top = $(blocks[t.current]).data('cbp').top + $(blocks[t.current]).data('cbp').height;
t.startInline = Math.min(t.cubeportfolio.cols *
(Math.floor(t.current / t.cubeportfolio.cols) + 1),
t.counterTotal);
t.firstRow = false;
t.lastRow = (t.startInline === t.counterTotal) ? true : false;
}
t.wrap[0].style.height = t.wrap.outerHeight(true) + 'px';
// debouncer for inline content
t.deferredInline = $.Deferred();
if (t.options.singlePageInlineInFocus) {
t.scrollTop = $(window).scrollTop();
var goToScroll = t.cubeportfolio.$obj.offset().top + t.top - 100;
if (t.scrollTop !== goToScroll) {
$('html,body').animate({
scrollTop: goToScroll
}, 350)
.promise()
.then(function() {
t._resizeSinglePageInline();
t.deferredInline.resolve();
});
} else {
t._resizeSinglePageInline();
t.deferredInline.resolve();
}
} else {
t._resizeSinglePageInline();
t.deferredInline.resolve();
}
t.cubeportfolio.$obj.addClass('cbp-popup-singlePageInline-open');
t.wrap.css({
top: t.top
});
// register callback function
if ($.isFunction(t.options.singlePageInlineCallback)) {
t.options.singlePageInlineCallback.call(t, t.dataArray[t.current].url, t.dataArray[t.current].element);
}
},
_resizeSinglePageInline: function() {
var t = this;
t.height = (t.firstRow || t.lastRow) ? t.wrap.outerHeight(true) : t.wrap.outerHeight(true) - t.options.gapHorizontal;
t.storeBlocks.each(function(index, el) {
if (index < t.startInline) {
if (CubePortfolio.Private.modernBrowser) {
el.style[CubePortfolio.Private.transform] = '';
} else {
el.style.marginTop = '';
}
} else {
if (CubePortfolio.Private.modernBrowser) {
el.style[CubePortfolio.Private.transform] = 'translate3d(0px, ' + t.height + 'px, 0)';
} else {
el.style.marginTop = t.height + 'px';
}
}
});
t.cubeportfolio.obj.style.height = t.cubeportfolio.height + t.height + 'px';
},
_revertResizeSinglePageInline: function() {
var t = this;
// reset deferred object
t.deferredInline = $.Deferred();
t.storeBlocks.each(function(index, el) {
if (CubePortfolio.Private.modernBrowser) {
el.style[CubePortfolio.Private.transform] = '';
} else {
el.style.marginTop = '';
}
});
t.cubeportfolio.obj.style.height = t.cubeportfolio.height + 'px';
},
appendScriptsToWrap: function(scripts) {
var t = this,
index = 0,
loadScripts = function(item) {
var script = document.createElement('script'),
src = item.src;
script.type = 'text/javascript';
if (script.readyState) { // ie
script.onreadystatechange = function() {
if (script.readyState == 'loaded' || script.readyState == 'complete') {
script.onreadystatechange = null;
index++;
if (scripts[index]) {
loadScripts(scripts[index]);
}
}
};
} else {
script.onload = function() {
index++;
if (scripts[index]) {
loadScripts(scripts[index]);
}
};
}
if (src) {
script.src = src;
} else {
script.text = item.text;
}
t.content[0].appendChild(script);
};
loadScripts(scripts[0]);
},
updateSinglePage: function(html, scripts, isWrap) {
var t = this,
counterMarkup,
animationFinish;
t.content.addClass('cbp-popup-content').removeClass('cbp-popup-content-basic');
if (isWrap === false) {
t.content.removeClass('cbp-popup-content').addClass('cbp-popup-content-basic');
}
// update counter navigation
if (t.counter) {
counterMarkup = $(t._getCounterMarkup(t.options.singlePageCounter, t.current + 1, t.counterTotal));
t.counter.text(counterMarkup.text());
}
t.content.html(html);
if (scripts) {
t.appendScriptsToWrap(scripts);
}
// trigger public event
t.cubeportfolio.$obj.trigger('updateSinglePageStart.cbp');
t.finishOpen--;
if (t.finishOpen <= 0) {
t.updateSinglePageIsOpen.call(t);
}
},
updateSinglePageIsOpen: function() {
var t = this,
selectorSlider;
t.wrap.addClass('cbp-popup-ready');
t.wrap.removeClass('cbp-popup-loading');
// instantiate slider if exists
selectorSlider = t.content.find('.cbp-slider');
if (selectorSlider) {
selectorSlider.find('.cbp-slider-item').addClass('cbp-item');
t.slider = selectorSlider.cubeportfolio({
layoutMode: 'slider',
mediaQueries: [{
width: 1,
cols: 1
}],
gapHorizontal: 0,
gapVertical: 0,
caption: '',
coverRatio: '', // wp version only
});
} else {
t.slider = null;
}
// scroll bug on android and ios
if (CubePortfolio.Private.browser === 'android' || CubePortfolio.Private.browser === 'ios') {
$('html').css({
position: 'fixed'
});
}
// trigger public event
t.cubeportfolio.$obj.trigger('updateSinglePageComplete.cbp');
},
updateSinglePageInline: function(html, scripts) {
var t = this;
t.content.html(html);
if (scripts) {
t.appendScriptsToWrap(scripts);
}
// trigger public event
t.cubeportfolio.$obj.trigger('updateSinglePageInlineStart.cbp');
t.singlePageInlineIsOpen.call(t);
},
singlePageInlineIsOpen: function() {
var t = this;
function finishLoading() {
t.wrap.addClass('cbp-popup-singlePageInline-ready');
t.wrap[0].style.height = '';
t._resizeSinglePageInline();
// trigger public event
t.cubeportfolio.$obj.trigger('updateSinglePageInlineComplete.cbp');
}
// wait to load all images
t.cubeportfolio._load(t.wrap, function() {
// instantiate slider if exists
var selectorSlider = t.content.find('.cbp-slider');
if (selectorSlider.length) {
selectorSlider.find('.cbp-slider-item').addClass('cbp-item');
selectorSlider.one('initComplete.cbp', function() {
t.deferredInline.done(finishLoading);
});
selectorSlider.on('pluginResize.cbp', function() {
t.deferredInline.done(finishLoading);
});
t.slider = selectorSlider.cubeportfolio({
layoutMode: 'slider',
displayType: 'default',
mediaQueries: [{
width: 1,
cols: 1
}],
gapHorizontal: 0,
gapVertical: 0,
caption: '',
coverRatio: '', // wp version only
});
} else {
t.slider = null;
t.deferredInline.done(finishLoading);
}
});
},
isImage: function(el) {
var t = this,
img = new Image();
t.tooggleLoading(true);
if ($('<img src="' + el.src + '">').is('img:uncached')) {
$(img).on('load.cbp' + ' error.cbp', function() {
t.updateImagesMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
t.tooggleLoading(false);
});
img.src = el.src;
} else {
t.updateImagesMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
t.tooggleLoading(false);
}
},
isVimeo: function(el) {
var t = this;
t.updateVideoMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
isYoutube: function(el) {
var t = this;
t.updateVideoMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
isTed: function(el) {
var t = this;
t.updateVideoMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
isSoundCloud: function(el) {
var t = this;
t.updateVideoMarkup(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
isSelfHostedVideo: function(el) {
var t = this;
t.updateSelfHostedVideo(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
isSelfHostedAudio: function(el) {
var t = this;
t.updateSelfHostedAudio(el.src, el.title, t._getCounterMarkup(t.options.lightboxCounter, t.current + 1, t.counterTotal));
},
_getCounterMarkup: function(markup, current, total) {
if (!markup.length) {
return '';
}
var mapObj = {
current: current,
total: total
};
return markup.replace(/\{\{current}}|\{\{total}}/gi, function(matched) {
return mapObj[matched.slice(2, -2)];
});
},
updateSelfHostedVideo: function(src, title, counter) {
var t = this,
i;
t.wrap.addClass('cbp-popup-lightbox-isIframe');
var markup = '<div class="cbp-popup-lightbox-iframe">' +
'<video controls="controls" height="auto" style="width: 100%">';
for (i = 0; i < src.length; i++) {
if (/(\.mp4)/i.test(src[i])) {
markup += '<source src="' + src[i] + '" type="video/mp4">';
} else if (/(\.ogg)|(\.ogv)/i.test(src[i])) {
markup += '<source src="' + src[i] + '" type="video/ogg">';
} else if (/(\.webm)/i.test(src[i])) {
markup += '<source src="' + src[i] + '" type="video/webm">';
}
}
markup += 'Your browser does not support the video tag.' +
'</video>' +
'<div class="cbp-popup-lightbox-bottom">' +
((title) ? '<div class="cbp-popup-lightbox-title">' + title + '</div>' : '') +
counter +
'</div>' +
'</div>';
t.content.html(markup);
t.wrap.addClass('cbp-popup-ready');
t.preloadNearbyImages();
},
updateSelfHostedAudio: function(src, title, counter) {
var t = this,
i;
t.wrap.addClass('cbp-popup-lightbox-isIframe');
var markup = '<div class="cbp-popup-lightbox-iframe">' +
'<audio controls="controls" height="auto" style="width: 100%">' +
'<source src="' + src + '" type="audio/mpeg">' +
'Your browser does not support the audio tag.' +
'</audio>' +
'<div class="cbp-popup-lightbox-bottom">' +
((title) ? '<div class="cbp-popup-lightbox-title">' + title + '</div>' : '') +
counter +
'</div>' +
'</div>';
t.content.html(markup);
t.wrap.addClass('cbp-popup-ready');
t.preloadNearbyImages();
},
updateVideoMarkup: function(src, title, counter) {
var t = this;
t.wrap.addClass('cbp-popup-lightbox-isIframe');
var markup = '<div class="cbp-popup-lightbox-iframe">' +
'<iframe src="' + src + '" frameborder="0" allowfullscreen scrolling="no"></iframe>' +
'<div class="cbp-popup-lightbox-bottom">' +
((title) ? '<div class="cbp-popup-lightbox-title">' + title + '</div>' : '') +
counter +
'</div>' +
'</div>';
t.content.html(markup);
t.wrap.addClass('cbp-popup-ready');
t.preloadNearbyImages();
},
updateImagesMarkup: function(src, title, counter) {
var t = this;
t.wrap.removeClass('cbp-popup-lightbox-isIframe');
var markup = '<div class="cbp-popup-lightbox-figure">' +
'<img src="' + src + '" class="cbp-popup-lightbox-img" ' + t.dataActionImg + ' />' +
'<div class="cbp-popup-lightbox-bottom">' +
((title) ? '<div class="cbp-popup-lightbox-title">' + title + '</div>' : '') +
counter +
'</div>' +
'</div>';
t.content.html(markup);
t.wrap.addClass('cbp-popup-ready');
t.resizeImage();
t.preloadNearbyImages();
},
next: function() {
var t = this;
t[t.type + 'JumpTo'](1);
},
prev: function() {
var t = this;
t[t.type + 'JumpTo'](-1);
},
lightboxJumpTo: function(index) {
var t = this,
el;
t.current = t.getIndex(t.current + index);
// get the current element
el = t.dataArray[t.current];
// call function if current element is image or video (iframe)
t[el.type](el);
},
singlePageJumpTo: function(index) {
var t = this;
t.current = t.getIndex(t.current + index);
// register singlePageCallback function
if ($.isFunction(t.options.singlePageCallback)) {
t.resetWrap();
// go to top of the page (reset scroll)
t.wrap.scrollTop(0);
t.wrap.addClass('cbp-popup-loading');
t.options.singlePageCallback.call(t, t.dataArray[t.current].url, t.dataArray[t.current].element);
if (t.options.singlePageDeeplinking) {
location.href = t.url + '#cbp=' + t.dataArray[t.current].url;
}
}
},
resetWrap: function() {
var t = this;
if (t.type === 'singlePage' && t.options.singlePageDeeplinking) {
location.href = t.url + '#';
}
},
getIndex: function(index) {
var t = this;
// go to interval [0, (+ or -)this.counterTotal.length - 1]
index = index % t.counterTotal;
// if index is less then 0 then go to interval (0, this.counterTotal - 1]
if (index < 0) {
index = t.counterTotal + index;
}
return index;
},
close: function(method, data) {
var t = this;
function finishClose() {
// reset content
t.content.html('');
// hide the wrap
t.wrap.detach();
t.cubeportfolio.$obj.removeClass('cbp-popup-singlePageInline-open cbp-popup-singlePageInline-close');
if (method === 'promise') {
if ($.isFunction(data.callback)) {
data.callback.call(t.cubeportfolio);
}
}
}
function checkFocusInline() {
if (t.options.singlePageInlineInFocus && method !== 'promise') {
$('html,body').animate({
scrollTop: t.scrollTop
}, 350)
.promise()
.then(function() {
finishClose();
});
} else {
finishClose();
}
}
// now the popup is closed
t.isOpen = false;
if (t.type === 'singlePageInline') {
if (method === 'open') {
t.wrap.removeClass('cbp-popup-singlePageInline-ready');
$(t.dataArray[t.current].element).closest('.cbp-item').removeClass('cbp-singlePageInline-active');
t.openSinglePageInline(data.blocks, data.currentBlock, data.fromOpen);
} else {
t.height = 0;
t._revertResizeSinglePageInline();
t.wrap.removeClass('cbp-popup-singlePageInline-ready');
t.cubeportfolio.$obj.addClass('cbp-popup-singlePageInline-close');
t.startInline = -1;
t.cubeportfolio.$obj.find('.cbp-item').removeClass('cbp-singlePageInline-active');
if (CubePortfolio.Private.modernBrowser) {
t.wrap.one(CubePortfolio.Private.transitionend, function() {
checkFocusInline();
});
} else {
checkFocusInline();
}
}
} else if (t.type === 'singlePage') {
t.resetWrap();
t.wrap.removeClass('cbp-popup-ready');
// scroll bug on android and ios
if (CubePortfolio.Private.browser === 'android' || CubePortfolio.Private.browser === 'ios') {
$('html').css({
position: ''
});
t.navigationWrap.appendTo(t.wrap);
t.navigationMobile.remove();
}
$(window).scrollTop(t.scrollTop);
// weird bug on mozilla. fixed with setTimeout
setTimeout(function() {
t.stopScroll = true;
t.navigationWrap.css({
top: t.wrap.scrollTop()
});
t.wrap.removeClass('cbp-popup-singlePage-open cbp-popup-singlePage-sticky');
if (CubePortfolio.Private.browser === 'ie8' || CubePortfolio.Private.browser === 'ie9') {
// reset content
t.content.html('');
// hide the wrap
t.wrap.detach();
$('html').css({
overflow: '',
paddingRight: '',
position: ''
});
t.navigationWrap.removeAttr('style');
}
}, 0);
t.wrap.one(CubePortfolio.Private.transitionend, function() {
// reset content
t.content.html('');
// hide the wrap
t.wrap.detach();
$('html').css({
overflow: '',
paddingRight: '',
position: ''
});
t.navigationWrap.removeAttr('style');
});
} else {
if (t.originalStyle) {
$('html').attr('style', t.originalStyle);
} else {
$('html').css({
overflow: '',
paddingRight: ''
});
}
$(window).scrollTop(t.scrollTop);
// reset content
t.content.html('');
// hide the wrap
t.wrap.detach();
}
},
tooggleLoading: function(state) {
var t = this;
t.stopEvents = state;
t.wrap[(state) ? 'addClass' : 'removeClass']('cbp-popup-loading');
},
resizeImage: function() {
// if lightbox is not open go out
if (!this.isOpen) {
return;
}
var height = $(window).height(),
img = this.content.find('img'),
padding = parseInt(img.css('margin-top'), 10) + parseInt(img.css('margin-bottom'), 10);
img.css('max-height', (height - padding) + 'px');
},
preloadNearbyImages: function() {
var arr = [],
img, t = this,
src;
arr.push(t.getIndex(t.current + 1));
arr.push(t.getIndex(t.current + 2));
arr.push(t.getIndex(t.current + 3));
arr.push(t.getIndex(t.current - 1));
arr.push(t.getIndex(t.current - 2));
arr.push(t.getIndex(t.current - 3));
for (var i = arr.length - 1; i >= 0; i--) {
if (t.dataArray[arr[i]].type === 'isImage') {
src = t.dataArray[arr[i]].src;
img = new Image();
if ($('<img src="' + src + '">').is('img:uncached')) {
img.src = src;
}
}
}
}
};
function PopUp(parent) {
var t = this;
t.parent = parent;
// if lightboxShowCounter is false, put lightboxCounter to ''
if (parent.options.lightboxShowCounter === false) {
parent.options.lightboxCounter = '';
}
// if singlePageShowCounter is false, put singlePageCounter to ''
if (parent.options.singlePageShowCounter === false) {
parent.options.singlePageCounter = '';
}
// @todo - schedule this in future
t.run();
}
var lightboxInit = false,
singlePageInit = false;
PopUp.prototype.run = function() {
var t = this,
p = t.parent,
body = $(document.body);
// default value for lightbox
p.lightbox = null;
// LIGHTBOX
if (p.options.lightboxDelegate && !lightboxInit) {
// init only one time @todo
lightboxInit = true;
p.lightbox = Object.create(popup);
p.lightbox.init(p, 'lightbox');
body.on('click.cbp', p.options.lightboxDelegate, function(e) {
e.preventDefault();
var self = $(this),
gallery = self.attr('data-cbp-lightbox'),
scope = t.detectScope(self),
cbp = scope.data('cubeportfolio'),
blocks = [];
// is inside a cbp
if (cbp) {
cbp.blocksOn.each(function(index, el) {
var item = $(el);
if (item.not('.cbp-item-off')) {
item.find(p.options.lightboxDelegate).each(function(index2, el2) {
if (gallery) {
if ($(el2).attr('data-cbp-lightbox') === gallery) {
blocks.push(el2);
}
} else {
blocks.push(el2);
}
});
}
});
} else {
if (gallery) {
blocks = scope.find(p.options.lightboxDelegate + '[data-cbp-lightbox=' + gallery + ']');
} else {
blocks = scope.find(p.options.lightboxDelegate);
}
}
p.lightbox.openLightbox(blocks, self[0]);
});
}
// default value for singlePage
p.singlePage = null;
// SINGLEPAGE
if (p.options.singlePageDelegate && !singlePageInit) {
// init only one time @todo
singlePageInit = true;
p.singlePage = Object.create(popup);
p.singlePage.init(p, 'singlePage');
body.on('click.cbp', p.options.singlePageDelegate, function(e) {
e.preventDefault();
var self = $(this),
gallery = self.attr('data-cbp-singlePage'),
scope = t.detectScope(self),
cbp = scope.data('cubeportfolio'),
blocks = [];
// is inside a cbp
if (cbp) {
cbp.blocksOn.each(function(index, el) {
var item = $(el);
if (item.not('.cbp-item-off')) {
item.find(p.options.singlePageDelegate).each(function(index2, el2) {
if (gallery) {
if ($(el2).attr('data-cbp-singlePage') === gallery) {
blocks.push(el2);
}
} else {
blocks.push(el2);
}
});
}
});
} else {
if (gallery) {
blocks = scope.find(p.options.singlePageDelegate + '[data-cbp-singlePage=' + gallery + ']');
} else {
blocks = scope.find(p.options.singlePageDelegate);
}
}
p.singlePage.openSinglePage(blocks, self[0]);
});
}
// default value for singlePageInline
p.singlePageInline = null;
// SINGLEPAGEINLINE
if (p.options.singlePageDelegate) {
p.singlePageInline = Object.create(popup);
p.singlePageInline.init(p, 'singlePageInline');
p.$obj.on('click.cbp', p.options.singlePageInlineDelegate, function(e) {
e.preventDefault();
p.singlePageInline.openSinglePageInline(p.blocksOn, this);
});
}
};
PopUp.prototype.detectScope = function(item) {
var singlePageInline,
singlePage,
cbp;
singlePageInline = item.closest('.cbp-popup-singlePageInline');
if (singlePageInline.length) {
cbp = item.closest('.cbp', singlePageInline[0]);
return (cbp.length) ? cbp : singlePageInline;
}
singlePage = item.closest('.cbp-popup-singlePage');
if (singlePage.length) {
cbp = item.closest('.cbp', singlePage[0]);
return (cbp.length) ? cbp : singlePage;
}
cbp = item.closest('.cbp');
return (cbp.length) ? cbp : $(document.body);
};
PopUp.prototype.destroy = function() {
var p = this.parent;
$(document.body).off('click.cbp');
// @todo - remove these from here
lightboxInit = false;
singlePageInit = false;
// destroy lightbox if enabled
if (p.lightbox) {
p.lightbox.destroy();
}
// destroy singlePage if enabled
if (p.singlePage) {
p.singlePage.destroy();
}
// destroy singlePage inline if enabled
if (p.singlePageInline) {
p.singlePageInline.destroy();
}
};
CubePortfolio.Plugins.PopUp = function(parent) {
return new PopUp(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
CubePortfolio.Private = {
/**
* Check if cubeportfolio instance exists on current element
*/
checkInstance: function(method) {
var t = $.data(this, 'cubeportfolio');
if (!t) {
throw new Error('cubeportfolio is not initialized. Initialize it before calling ' + method + ' method!');
}
return t;
},
/**
* Get info about client browser
*/
browserInfo: function() {
var t = CubePortfolio.Private,
appVersion = navigator.appVersion,
transition, animation, perspective;
if (appVersion.indexOf('MSIE 8.') !== -1) { // ie8
t.browser = 'ie8';
} else if (appVersion.indexOf('MSIE 9.') !== -1) { // ie9
t.browser = 'ie9';
} else if (appVersion.indexOf('MSIE 10.') !== -1) { // ie10
t.browser = 'ie10';
} else if (window.ActiveXObject || 'ActiveXObject' in window) { // ie11
t.browser = 'ie11';
} else if ((/android/gi).test(appVersion)) { // android
t.browser = 'android';
} else if ((/iphone|ipad|ipod/gi).test(appVersion)) { // ios
t.browser = 'ios';
} else if ((/chrome/gi).test(appVersion)) {
t.browser = 'chrome';
} else {
t.browser = '';
}
// check if perspective is available
perspective = t.styleSupport('perspective');
// if perspective is not available => no modern browser
if (typeof perspective === undefined) {
return;
}
transition = t.styleSupport('transition');
t.transitionend = {
WebkitTransition: 'webkitTransitionEnd',
transition: 'transitionend'
}[transition];
animation = t.styleSupport('animation');
t.animationend = {
WebkitAnimation: 'webkitAnimationEnd',
animation: 'animationend'
}[animation];
t.animationDuration = {
WebkitAnimation: 'webkitAnimationDuration',
animation: 'animationDuration'
}[animation];
t.animationDelay = {
WebkitAnimation: 'webkitAnimationDelay',
animation: 'animationDelay'
}[animation];
t.transform = t.styleSupport('transform');
if (transition && animation && t.transform) {
t.modernBrowser = true;
}
},
/**
* Feature testing for css3
*/
styleSupport: function(prop) {
var supportedProp,
// capitalize first character of the prop to test vendor prefix
webkitProp = 'Webkit' + prop.charAt(0).toUpperCase() + prop.slice(1),
div = document.createElement('div');
// browser supports standard CSS property name
if (prop in div.style) {
supportedProp = prop;
} else if (webkitProp in div.style) {
supportedProp = webkitProp;
}
// avoid memory leak in IE
div = null;
return supportedProp;
}
};
CubePortfolio.Private.browserInfo();
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
CubePortfolio.Public = {
/*
* Init the plugin
*/
init: function(options, callback) {
new CubePortfolio(this, options, callback);
},
/*
* Destroy the plugin
*/
destroy: function(callback) {
var t = CubePortfolio.Private.checkInstance.call(this, 'destroy');
t._triggerEvent('beforeDestroy');
// remove data
$.removeData(this, 'cubeportfolio');
// remove data from blocks
t.blocks.each(function() {
$.removeData(this, 'cbp-wxh'); // wp only
});
// remove loading class and .cbp on container
t.$obj.removeClass('cbp-ready cbp-addItems' + 'cbp-cols-' + t.cols).removeAttr('style');
// remove class from ul
t.$ul.removeClass('cbp-wrapper');
// remove off resize event
$(window).off('resize.cbp');
t.$obj.off('.cbp');
$(document).off('.cbp');
// reset blocks
t.blocks.removeClass('cbp-item-off').removeAttr('style');
t.blocks.find('.cbp-item-wrapper').children().unwrap();
if (t.options.caption) {
t._captionDestroy();
}
t._destroySlider();
// remove .cbp-wrapper-outer
t.$ul.unwrap();
// remove .cbp-wrapper
if (t.addedWrapp) {
t.blocks.unwrap();
}
$.each(t._plugins, function(i, item) {
if (typeof item.destroy === 'function') {
item.destroy();
}
});
if ($.isFunction(callback)) {
callback.call(t);
}
t._triggerEvent('afterDestroy');
},
/*
* Filter the plugin by filterName
*/
filter: function(filterName, callback) {
var t = CubePortfolio.Private.checkInstance.call(this, 'filter'),
off2onBlocks, on2offBlocks, url;
// register callback function
if ($.isFunction(callback)) {
t._registerEvent('filterFinish', callback, true);
}
if (t.isAnimating || t.defaultFilter === filterName) {
return;
}
t.isAnimating = true;
t.defaultFilter = filterName;
if (t.singlePageInline && t.singlePageInline.isOpen) {
t.singlePageInline.close('promise', {
callback: function() {
t._filter(filterName);
}
});
} else {
t._filter(filterName);
}
if (t.options.filterDeeplinking) {
url = location.href.replace(/#cbpf=(.*?)([#|?&]|$)/gi, '');
location.href = url + '#cbpf=' + filterName;
if (t.singlePage && t.singlePage.url) {
t.singlePage.url = location.href;
}
}
},
/*
* Show counter for filters
*/
showCounter: function(elems, callback) {
var t = CubePortfolio.Private.checkInstance.call(this, 'showCounter');
t.elems = elems;
$.each(elems, function() {
var el = $(this),
filterName = el.data('filter'),
count;
count = t.blocks.filter(filterName).length;
el.find('.cbp-filter-counter').text(count);
});
if ($.isFunction(callback)) {
callback.call(t);
}
},
/*
* ApendItems elements
*/
appendItems: function(items, callback) {
var t = CubePortfolio.Private.checkInstance.call(this, 'appendItems');
if (t.isAnimating) {
return;
}
t.isAnimating = true;
if (t.singlePageInline && t.singlePageInline.isOpen) {
t.singlePageInline.close('promise', {
callback: function() {
t._addItems(items, callback);
}
});
} else {
t._addItems(items, callback);
}
},
};
})(jQuery, window, document);
// Utility
if (typeof Object.create !== 'function') {
Object.create = function(obj) {
function F() {}
F.prototype = obj;
return new F();
};
}
// jquery new filter for images uncached
jQuery.expr[':'].uncached = function(obj) {
// Ensure we are dealing with an `img` element with a valid `src` attribute.
if (!jQuery(obj).is('img[src][src!=""]')) {
return false;
}
// Firefox's `complete` property will always be `true` even if the image has not been downloaded.
// Doing it this way works in Firefox.
var img = new Image();
img.src = obj.src;
// http://stackoverflow.com/questions/1977871/check-if-an-image-is-loaded-no-errors-in-javascript
// During the onload event, IE correctly identifies any images that
// weren�t downloaded as not complete. Others should too. Gecko-based
// browsers act like NS4 in that they report this incorrectly.
if (!img.complete) {
return true;
}
// However, they do have two very useful properties: naturalWidth and
// naturalHeight. These give the true size of the image. If it failed
// to load, either of these should be zero.
if (img.naturalWidth !== undefined && img.naturalWidth === 0) {
return true;
}
// No other way of checking: assume it�s ok.
return false;
};
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik M�ller. fixes from Paul Irish and Tino Zijdel
// MIT license
(function() {
var lastTime = 0;
var vendors = ['moz', 'webkit'];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() {
callback(currTime + timeToCall);
},
timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}());
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function AnimationClassic(parent) {
var t = this;
t.parent = parent;
parent.filterLayout = t.filterLayout;
}
// here this value point to parent grid
AnimationClassic.prototype.filterLayout = function(filterName) {
var t = this;
t.$obj.addClass('cbp-animation-' + t.options.animationType);
// [1] - blocks that are only moving with translate
t.blocksOnInitial
.filter(filterName)
.addClass('cbp-item-on2on')
.each(function(index, el) {
var data = $(el).data('cbp');
el.style[CubePortfolio.Private.transform] = 'translate3d(' + (data.leftNew - data.left) + 'px, ' + (data.topNew - data.top) + 'px, 0)';
});
// [2] - blocks than intialy are on but after applying the filter are off
t.blocksOn2Off = t.blocksOnInitial
.not(filterName)
.addClass('cbp-item-on2off');
// [3] - blocks that are off and it will be on
t.blocksOff2On = t.blocksOn
.filter('.cbp-item-off')
.removeClass('cbp-item-off')
.addClass('cbp-item-off2on')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
});
if (t.blocksOn2Off.length) {
t.blocksOn2Off.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else if (t.blocksOff2On.length) {
t.blocksOff2On.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else {
animationend();
}
// resize main container height
t._resizeMainContainer();
function animationend() {
t.blocks
.removeClass('cbp-item-on2off cbp-item-off2on cbp-item-on2on')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
el.style[CubePortfolio.Private.transform] = '';
});
t.blocksOff.addClass('cbp-item-off');
t.$obj.removeClass('cbp-animation-' + t.options.animationType);
t.filterFinish();
}
};
AnimationClassic.prototype.destroy = function() {
var parent = this.parent;
parent.$obj.removeClass('cbp-animation-' + parent.options.animationType);
};
CubePortfolio.Plugins.AnimationClassic = function(parent) {
if (!CubePortfolio.Private.modernBrowser || $.inArray(parent.options.animationType, ['boxShadow', 'fadeOut', 'flipBottom', 'flipOut', 'quicksand', 'scaleSides', 'skew']) < 0) {
return null;
}
return new AnimationClassic(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function AnimationClone(parent) {
var t = this;
t.parent = parent;
parent.filterLayout = t.filterLayout;
}
// here this value point to parent grid
AnimationClone.prototype.filterLayout = function(filterName) {
var t = this,
ulClone = t.$ul[0].cloneNode(true);
ulClone.setAttribute('class', 'cbp-wrapper-helper');
t.wrapper[0].insertBefore(ulClone, t.$ul[0]);
requestAnimationFrame(function() {
t.$obj.addClass('cbp-animation-' + t.options.animationType);
t.blocksOff.addClass('cbp-item-off');
t.blocksOn.removeClass('cbp-item-off')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
if (t.options.animationType === 'sequentially') {
data.wrapper[0].style[CubePortfolio.Private.animationDelay] = (index * 60) + 'ms';
}
});
if (t.blocksOn.length) {
t.blocksOn.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else if (t.blocksOnInitial.length) {
t.blocksOnInitial.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else {
animationend();
}
// resize main container height
t._resizeMainContainer();
});
function animationend() {
t.wrapper[0].removeChild(ulClone);
if (t.options.animationType === 'sequentially') {
t.blocksOn.each(function(index, el) {
$(el).data('cbp').wrapper[0].style[CubePortfolio.Private.animationDelay] = '';
});
}
t.$obj.removeClass('cbp-animation-' + t.options.animationType);
t.filterFinish();
}
};
AnimationClone.prototype.destroy = function() {
var parent = this.parent;
parent.$obj.removeClass('cbp-animation-' + parent.options.animationType);
};
CubePortfolio.Plugins.AnimationClone = function(parent) {
if (!CubePortfolio.Private.modernBrowser || $.inArray(parent.options.animationType, ['fadeOutTop', 'slideLeft', 'sequentially']) < 0) {
return null;
}
return new AnimationClone(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function AnimationCloneDelay(parent) {
var t = this;
t.parent = parent;
parent.filterLayout = t.filterLayout;
}
// here this value point to parent grid
AnimationCloneDelay.prototype.filterLayout = function(filterName) {
var t = this,
ulClone;
// t.blocksOnInitial.each(function(index, el) {
// $(el).data('cbp').wrapper[0].style[CubePortfolio.Private.animationDelay] = (index * 50) + 'ms';
// });
ulClone = t.$ul[0].cloneNode(true);
ulClone.setAttribute('class', 'cbp-wrapper-helper');
t.wrapper[0].insertBefore(ulClone, t.$ul[0]);
// hack for safari osx because it doesn't want to work if I set animationDelay
// on cbp-item-wrapper before I clone the t.$ul
$(ulClone).find('.cbp-item').not('.cbp-item-off').children('.cbp-item-wrapper').each(function(index, el) {
el.style[CubePortfolio.Private.animationDelay] = (index * 50) + 'ms';
});
requestAnimationFrame(function() {
t.$obj.addClass('cbp-animation-' + t.options.animationType);
t.blocksOff.addClass('cbp-item-off');
t.blocksOn.removeClass('cbp-item-off')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
data.wrapper[0].style[CubePortfolio.Private.animationDelay] = (index * 50) + 'ms';
});
if (t.blocksOn.length) {
t.blocksOn.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else if (t.blocksOnInitial.length) {
t.blocksOnInitial.last().data('cbp').wrapper.one(CubePortfolio.Private.animationend, animationend);
} else {
animationend();
}
// resize main container height
t._resizeMainContainer();
});
function animationend() {
t.wrapper[0].removeChild(ulClone);
t.$obj.removeClass('cbp-animation-' + t.options.animationType);
t.blocks.each(function(index, el) {
$(el).data('cbp').wrapper[0].style[CubePortfolio.Private.animationDelay] = '';
});
t.filterFinish();
}
};
AnimationCloneDelay.prototype.destroy = function() {
var parent = this.parent;
parent.$obj.removeClass('cbp-animation-' + parent.options.animationType);
};
CubePortfolio.Plugins.AnimationCloneDelay = function(parent) {
if (!CubePortfolio.Private.modernBrowser || $.inArray(parent.options.animationType, ['3dflip', 'flipOutDelay', 'foldLeft', 'frontRow', 'rotateRoom', 'rotateSides', 'scaleDown', 'slideDelay', 'unfold']) < 0) {
return null;
}
return new AnimationCloneDelay(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function AnimationWrapper(parent) {
var t = this;
t.parent = parent;
parent.filterLayout = t.filterLayout;
}
// here this value point to parent grid
AnimationWrapper.prototype.filterLayout = function(filterName) {
var t = this,
ulClone = t.$ul[0].cloneNode(true);
ulClone.setAttribute('class', 'cbp-wrapper-helper');
t.wrapper[0].insertBefore(ulClone, t.$ul[0]);
requestAnimationFrame(function() {
t.$obj.addClass('cbp-animation-' + t.options.animationType);
t.blocksOff.addClass('cbp-item-off');
t.blocksOn.removeClass('cbp-item-off')
.each(function(index, el) {
var data = $(el).data('cbp');
data.left = data.leftNew;
data.top = data.topNew;
el.style.left = data.left + 'px';
el.style.top = data.top + 'px';
});
if (t.blocksOn.length) {
t.$ul.one(CubePortfolio.Private.animationend, animationend);
} else if (t.blocksOnInitial.length) {
$(ulClone).one(CubePortfolio.Private.animationend, animationend);
} else {
animationend();
}
// resize main container height
t._resizeMainContainer();
});
function animationend() {
t.wrapper[0].removeChild(ulClone);
t.$obj.removeClass('cbp-animation-' + t.options.animationType);
t.filterFinish();
}
};
AnimationWrapper.prototype.destroy = function() {
var parent = this.parent;
parent.$obj.removeClass('cbp-animation-' + parent.options.animationType);
};
CubePortfolio.Plugins.AnimationWrapper = function(parent) {
if (!CubePortfolio.Private.modernBrowser || $.inArray(parent.options.animationType, ['bounceBottom', 'bounceLeft', 'bounceTop', 'moveLeft']) < 0) {
return null;
}
return new AnimationWrapper(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function CaptionExpand(parent) {
var t = this;
t.parent = parent;
parent._registerEvent('initFinish', function() {
parent.$obj.on('click.cbp', '.cbp-caption-defaultWrap', function(e) {
e.preventDefault();
if (parent.isAnimating) {
return;
}
parent.isAnimating = true;
var defaultWrap = $(this),
activeWrap = defaultWrap.next(),
caption = defaultWrap.parent(),
endStyle = {
position: 'relative',
height: activeWrap.outerHeight(true)
},
startStyle = {
position: 'relative',
height: 0
};
parent.$obj.addClass('cbp-caption-expand-active');
// swap endStyle & startStyle
if (caption.hasClass('cbp-caption-expand-open')) {
var temp = startStyle;
startStyle = endStyle;
endStyle = temp;
caption.removeClass('cbp-caption-expand-open');
}
activeWrap.css(endStyle);
parent._gridAdjust();
// reposition the blocks
parent._layout();
// repositionate the blocks with the best transition available
parent.positionateItems();
// resize main container height
parent._resizeMainContainer();
// set activeWrap to 0 so I can start animation in the next frame
activeWrap.css(startStyle);
// delay animation
requestAnimationFrame(function() {
caption.addClass('cbp-caption-expand-open');
activeWrap.one(CubePortfolio.Private.transitionend, function() {
parent.isAnimating = false;
parent.$obj.removeClass('cbp-caption-expand-active');
if (endStyle.height === 0) {
caption.removeClass('cbp-caption-expand-open');
activeWrap.attr('style', '');
}
});
activeWrap.css(endStyle);
if (parent.options.layoutMode === 'slider') {
parent._updateSlider();
}
parent._triggerEvent('resizeGrid');
});
});
}, true);
}
CaptionExpand.prototype.destroy = function() {
this.parent.$obj.find('.cbp-caption-defaultWrap').off('click.cbp').parent().removeClass('cbp-caption-expand-active');
};
CubePortfolio.Plugins.CaptionExpand = function(parent) {
if (parent.options.caption !== 'expand') {
return null;
}
return new CaptionExpand(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function BottomToTop(parent) {
// skip next event from core
parent._skipNextEvent('delayFrame');
parent._registerEvent('initEndWrite', function() {
parent.blocksOn.each(function(index, item) {
item.style[CubePortfolio.Private.animationDelay] = (index * parent.options.displayTypeSpeed) + 'ms';
});
parent.$obj.addClass('cbp-displayType-bottomToTop');
// get last element
parent.blocksOn.last().one(CubePortfolio.Private.animationend, function() {
parent.$obj.removeClass('cbp-displayType-bottomToTop');
parent.blocksOn.each(function(index, item) {
item.style[CubePortfolio.Private.animationDelay] = '';
});
// trigger event after the animation is finished
parent._triggerEvent('delayFrame');
});
}, true);
}
CubePortfolio.Plugins.BottomToTop = function (parent) {
if (!CubePortfolio.Private.modernBrowser || parent.options.displayType !== 'bottomToTop' || parent.blocks.length === 0) {
return null;
}
return new BottomToTop(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function FadeInToTop(parent) {
// skip next event from core
parent._skipNextEvent('delayFrame');
parent._registerEvent('initEndWrite', function() {
parent.obj.style[CubePortfolio.Private.animationDuration] = parent.options.displayTypeSpeed + 'ms';
parent.$obj.addClass('cbp-displayType-fadeInToTop');
parent.$obj.one(CubePortfolio.Private.animationend, function() {
parent.$obj.removeClass('cbp-displayType-fadeInToTop');
parent.obj.style[CubePortfolio.Private.animationDuration] = '';
// trigger event after the animation is finished
parent._triggerEvent('delayFrame');
});
}, true);
}
CubePortfolio.Plugins.FadeInToTop = function (parent) {
if (!CubePortfolio.Private.modernBrowser || parent.options.displayType !== 'fadeInToTop' || parent.blocks.length === 0) {
return null;
}
return new FadeInToTop(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function LazyLoading(parent) {
// skip next event from core
parent._skipNextEvent('delayFrame');
parent._registerEvent('initEndWrite', function() {
parent.obj.style[CubePortfolio.Private.animationDuration] = parent.options.displayTypeSpeed + 'ms';
parent.$obj.addClass('cbp-displayType-lazyLoading');
parent.$obj.one(CubePortfolio.Private.animationend, function() {
parent.$obj.removeClass('cbp-displayType-lazyLoading');
parent.obj.style[CubePortfolio.Private.animationDuration] = '';
// trigger event after the animation is finished
parent._triggerEvent('delayFrame');
});
}, true);
}
CubePortfolio.Plugins.LazyLoading = function (parent) {
if (!CubePortfolio.Private.modernBrowser || (parent.options.displayType !== 'lazyLoading' && parent.options.displayType !== 'fadeIn') || parent.blocks.length === 0) {
return null;
}
return new LazyLoading(parent);
};
})(jQuery, window, document);
(function($, window, document, undefined) {
'use strict';
var CubePortfolio = $.fn.cubeportfolio.Constructor;
function DisplaySequentially(parent) {
// skip next event from core
parent._skipNextEvent('delayFrame');
parent._registerEvent('initEndWrite', function() {
parent.blocksOn.each(function(index, item) {
item.style[CubePortfolio.Private.animationDelay] = (index * parent.options.displayTypeSpeed) + 'ms';
});
parent.$obj.addClass('cbp-displayType-sequentially');
// get last element
parent.blocksOn.last().one(CubePortfolio.Private.animationend, function() {
parent.$obj.removeClass('cbp-displayType-sequentially');
parent.blocksOn.each(function(index, item) {
item.style[CubePortfolio.Private.animationDelay] = '';
});
// trigger event after the animation is finished
parent._triggerEvent('delayFrame');
});
}, true);
}
CubePortfolio.Plugins.DisplaySequentially = function (parent) {
if (!CubePortfolio.Private.modernBrowser || parent.options.displayType !== 'sequentially' || parent.blocks.length === 0) {
return null;
}
return new DisplaySequentially(parent);
};
})(jQuery, window, document);