/*! * Cube Portfolio - Responsive jQuery Grid Plugin * * version: 3.4.1 (21 November, 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 (jQuery.data(obj, 'cubeportfolio')) { throw new Error('cubeportfolio is already initialized. Destroy it before initialize again!'); } // attached this instance to obj jQuery.data(obj, 'cubeportfolio', t); // extend options t.options = jQuery.extend({}, jQuery.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 = []; // queue for this plugin t.queue = []; // has wrapper t.addedWrapp = false; // register callback function if (jQuery.isFunction(callback)) { t.registerEvent('initFinish', callback, true); } // js element t.obj = obj; // jquery element t.$obj = jQuery(obj); // when there are no .cbp-item children = t.$obj.children(); // if caption is active if (t.options.caption) { if (t.options.caption !== 'expand' && !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'); t.blocksOn = t.blocks; // NAAPO 2020 fix protocols t.blocksOn.each(function(){ jQuery(this).find('a[href*="http://"], a[href*="https://"]').each( function(){ jQuery(this).attr('href', jQuery(this).attr('href').replace('http://','//').replace('https://','//') ); } ); jQuery(this).find('img[src*="http://"], img[src*="https://"]').each( function(){ jQuery(this).attr('src', jQuery(this).attr('src').replace('http://','//').replace('https://','//') ); } ); }); // NAAPO 2020 endof fix protocols // wrap .cbp-item-wrap div inside .cbp-item t.wrapInner(t.blocks, 'cbp-item-wrapper'); // register and initialize plugins t.plugins = jQuery.map(CubePortfolio.plugins, function(pluginName) { return pluginName(t); }); // wait to load all images and then go further t.loadImages(t.$obj, t.display); } jQuery.extend(CubePortfolio.prototype, { storeData: function(blocks, indexStart) { var t = this; indexStart = indexStart || 0; // used by loadMore blocks.each(function(index, el) { var item = jQuery(el), width = item.width(), height = item.height(); // NAAPO 2020 fix protocols item.find('a[href*="http://"], a[href*="https://"]').each( function(){ jQuery(this).attr('href', jQuery(this).attr('href').replace('http://','//').replace('https://','//') ); } ); item.find('img[src*="http://"], img[src*="https://"]').each( function(){ jQuery(this).attr('src', jQuery(this).attr('src').replace('http://','//').replace('https://','//') ); } ); // NAAPO 2020 endof fix protocols item.data('cbp', { index: indexStart + index, // used when I sort the items and I need them to revert that sorting wrapper: item.children('.cbp-item-wrapper'), widthInitial: width, heightInitial: height, width: width, // used by drag & drop wp @todo - maybe I will use widthAndGap height: height, widthAndGap: width + t.options.gapVertical, heightAndGap: height + t.options.gapHorizontal, left: null, leftNew: null, top: null, topNew: null, pack: false, }); }); }, // 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); } }, removeAttrImage: function(img) { img.removeAttribute('width'); img.removeAttribute('height'); img.removeAttribute('style'); }, /** * Wait to load all images */ loadImages: function(elems, callback) { var t = this; // wait a frame (Safari bug) requestAnimationFrame(function() { var src = elems.find('img').map(function(index, el) { // don't wait for images that have a width & height defined if (el.hasAttribute('width') && el.hasAttribute('height')) { el.style.width = el.getAttribute('width') + 'px'; el.style.height = el.getAttribute('height') + 'px'; if (el.hasAttribute('data-cbp-src')) { return null; } if (t.checkSrc(el.src) === null) { t.removeAttrImage(el); } else { jQuery('').on('load.cbp error.cbp', function() { t.removeAttrImage(el); }).attr('src', el.src); // for ie8 } return null; } else { return t.checkSrc(el.src); } }); var srcLength = src.length; if (srcLength === 0) { callback.call(t); return; } jQuery.each(src, function(i, el) { jQuery('').on('load.cbp error.cbp', function() { srcLength--; if (srcLength === 0) { callback.call(t); } }).attr('src', el); // for ie8 }); }); }, checkSrc: function(src) { if (src === '') { return null; } var img = new Image(); img.src = src; if (img.complete && img.naturalWidth !== undefined && img.naturalWidth !== 0) { return null; } return src; }, /** * Show the plugin */ display: function() { var t = this; // store main container width t.width = t.$obj.outerWidth(); // store to data values of t.blocks t.storeData(t.blocks); t.triggerEvent('initStartRead'); t.triggerEvent('initStartWrite'); // make layout t.layoutAndAdjustment(); t.triggerEvent('initEndRead'); t.triggerEvent('initEndWrite'); // plugin is ready to show and interact t.$obj.addClass('cbp-ready'); t.runQueue('delayFrame', t.delayFrame); }, 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'); }); }, /** * Add resize event when browser width changes */ resizeEvent: function() { var t = this, gridWidth; CubePortfolio.private.initResizeEvent({ instance: t, fn: function() { var tt = this; // used by wp fullWidth force option tt.triggerEvent('beforeResizeGrid'); gridWidth = tt.$obj.outerWidth(); if (tt.width !== gridWidth) { if (tt.options.gridAdjustment === 'alignCenter') { tt.wrapper[0].style.maxWidth = ''; } // update the current grid width tt.width = gridWidth; // reposition the blocks with gridAdjustment set to true tt.layoutAndAdjustment(); tt.triggerEvent('resizeGrid'); } tt.triggerEvent('resizeWindow'); } }); }, gridAdjust: function() { var t = this; // if responsive if (t.options.gridAdjustment === 'responsive') { t.responsiveLayout(); } else { // reset the style attribute for all blocks so I can read a new width & height // for the current grid width. This is usefull for the styles defined in css // to create a custom responsive system. // Note: reset height if it was set for addHeightToBlocks t.blocks.removeAttr('style'); t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), bound = el.getBoundingClientRect(), width = t.columnWidthTruncate(bound.right - bound.left), height = Math.round(bound.bottom - bound.top); data.height = height; data.heightAndGap = height + t.options.gapHorizontal; data.width = width; data.widthAndGap = width + t.options.gapVertical; }); t.widthAvailable = t.width + t.options.gapVertical; } // used by slider layoutMode t.triggerEvent('gridAdjust'); }, layoutAndAdjustment: function() { var t = this; t.gridAdjust(); t.layout(); }, /** * Build the layout */ layout: function() { var t = this; t.computeBlocks(t.filterConcat(t.defaultFilter)); if (t.options.layoutMode === 'slider') { t.sliderLayoutReset(); t.sliderLayout(); } else { t.mosaicLayoutReset(); t.mosaicLayout(); } // positionate the blocks t.positionateItems(); // resize main container height t.resizeMainContainer(); }, computeFilter: function(expression) { var t = this; t.computeBlocks(expression); t.mosaicLayoutReset(); t.mosaicLayout(); // filter call layout t.filterLayout(); }, /** * Default filter layout if nothing overrides */ filterLayout: function() { var t = this; t.blocksOff.addClass('cbp-item-off'); t.blocksOn.removeClass('cbp-item-off') .each(function(index, el) { var data = jQuery(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; // if blocks are sorted (the index ascending is broken) revert // this state so the index is ascending again if (t.blocksAreSorted) { t.sortBlocks(t.blocks, 'index'); } t.isAnimating = false; t.$obj.trigger('filterComplete.cbp'); t.triggerEvent('filterFinish'); }, computeBlocks: function(expression) { 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(expression); // blocks off after applying the filter t.blocksOff = t.blocks.not(expression); t.triggerEvent('computeBlocksFinish', expression); }, /** * Make this plugin responsive */ responsiveLayout: function() { var t = this; // calculate numbers of cols t.cols = t[(jQuery.isArray(t.options.mediaQueries) ? 'getColumnsBreakpoints' : 'getColumnsAuto')](); t.columnWidth = t.columnWidthTruncate((t.width + t.options.gapVertical) / t.cols); t.widthAvailable = t.columnWidth * t.cols; if (t.options.layoutMode === 'mosaic') { t.getMosaicWidthReference(); } t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), cols = 1, // grid & slider layoutMode must be 1 width; if (t.options.layoutMode === 'mosaic') { cols = t.getColsMosaic(data.widthInitial); } width = t.columnWidth * cols - t.options.gapVertical; el.style.width = width + 'px'; data.width = width; data.widthAndGap = width + t.options.gapVertical; // reset height if it was set for addHeightToBlocks el.style.height = ''; }); var imgs = []; t.blocks.each(function(index, el) { var block = jQuery(el), width = block.data('cbp').width; jQuery.each(block.find('img').filter('[width][height]'), function(index, el) { var procent = width / parseInt(el.getAttribute('width'), 10); imgs.push({ el: el, width: width, height: Math.floor(parseInt(el.getAttribute('height'), 10) * procent), }); }); }); jQuery.each(imgs, function(index, item) { item.el.width = item.width; item.el.height = item.height; item.el.style.width = item.width + 'px'; item.el.style.height = item.height + 'px'; }); t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), bound = el.getBoundingClientRect(), height = Math.round(bound.bottom - bound.top); data.height = height; data.heightAndGap = height + t.options.gapHorizontal; }); }, getMosaicWidthReference: function() { var t = this, arrWidth = []; t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'); arrWidth.push(data.widthInitial); }); arrWidth.sort(function(a, b) { return a - b; }); if (arrWidth[0]) { t.mosaicWidthReference = arrWidth[0]; } else { t.mosaicWidthReference = t.columnWidth; } }, getColsMosaic: function(widthInitial) { var t = this; if (widthInitial === t.width) { return t.cols; } var ratio = widthInitial / t.mosaicWidthReference; if (ratio % 1 >= 0.79) { ratio = Math.ceil(ratio); } else { ratio = Math.floor(ratio); } return Math.min(Math.max(ratio, 1), t.cols); }, /** * Get numbers of columns when t.options.mediaQueries is not an array */ getColumnsAuto: function() { var t = this; if (t.blocks.length === 0) { return 1; } var columnWidth = t.blocks.first().data('cbp').widthInitial + t.options.gapVertical; return Math.max(Math.round(t.width / columnWidth), 1); }, /** * Get numbers of columns if t.options.mediaQueries is an array */ getColumnsBreakpoints: function() { var t = this, gridWidth = t.width, columns; jQuery.each(t.options.mediaQueries, function(index, val) { if (gridWidth >= val.width) { columns = val.cols; return false; } }); if (columns === undefined) { columns = t.options.mediaQueries[t.options.mediaQueries.length - 1].cols; } return columns; }, /** * Defines how the columns dimension & position (width, left) will be truncated * * If you use `Math.*` there could be some issues with the items on the right side * that can have some pixels hidden(1 or 2, depends on the number of columns) * but this is a known limitation. * * If you don't use the built-in captions effects (overlay at hover over an item) returning * the possibly floated values may be a solution for the pixels hidden on the right side. * * The column width must be an integer because browsers have some visual issues * with transform properties for caption effects. * * The initial behaviour was return Math.floor * */ columnWidthTruncate: function(value) { return Math.floor(value); }, positionateItems: function() { var t = this, data; t.blocksOn.removeClass('cbp-item-off') .each(function(index, el) { data = jQuery(el).data('cbp'); data.left = data.leftNew; data.top = data.topNew; el.style.left = data.left + 'px'; el.style.top = data.top + 'px'; }); t.blocksOff.addClass('cbp-item-off'); // if blocks are sorted (the index ascending is broken) revert // this state so the index is ascending again if (t.blocksAreSorted) { t.sortBlocks(t.blocks, 'index'); } }, /** * Resize main container vertically */ resizeMainContainer: function() { var t = this, height = Math.max(t.freeSpaces.slice(-1)[0].topStart - t.options.gapHorizontal, 0), maxWidth; // set max-width to center the grid if I need to if (t.options.gridAdjustment === 'alignCenter') { maxWidth = 0; t.blocksOn.each(function(index, el) { var data = jQuery(el).data('cbp'), rightEdge = data.left + data.width; if (rightEdge > maxWidth) { maxWidth = rightEdge; } }); t.wrapper[0].style.maxWidth = maxWidth + 'px'; } // set container height for `overflow: hidden` to be applied if (height === t.height) { t.triggerEvent('resizeMainContainer'); 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; t.triggerEvent('resizeMainContainer'); }, filterConcat: function(filter) { return filter.replace(/\|/gi, ''); }, pushQueue: function(name, deferred) { var t = this; t.queue[name] = t.queue[name] || []; t.queue[name].push(deferred); }, runQueue: function(name, fn) { var t = this, queue = t.queue[name] || []; jQuery.when.apply($, queue).then(jQuery.proxy(fn, t)); }, clearQueue: function(name) { var t = this; t.queue[name] = []; }, /** * 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.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--; } } } }, addItems: function(items, callback) { var t = this; // wrap .cbp-item-wrap div inside .cbp-item t.wrapInner(items, 'cbp-item-wrapper'); items.addClass('cbp-item-loading').css({ top: '100%', left: 0 }).appendTo(t.$ul); if (CubePortfolio.private.modernBrowser) { items.last().one(CubePortfolio.private.animationend, function() { t.addItemsFinish(items, callback); }); } else { t.addItemsFinish(items, callback); // @todo - on ie8 & ie9 callback trigger to early } t.loadImages(items, function() { t.$obj.addClass('cbp-addItems'); // push to data values of items t.storeData(items, t.blocks.length); // push the new items to t.blocks jQuery.merge(t.blocks, items); t.triggerEvent('addItemsToDOM', items); t.layoutAndAdjustment(); // if show count was actived, call show count function again if (t.elems) { CubePortfolio.public.showCounter.call(t.obj, t.elems); } }); }, addItemsFinish: function(items, callback) { var t = this; t.isAnimating = false; t.$obj.removeClass('cbp-addItems'); items.removeClass('cbp-item-loading'); if (jQuery.isFunction(callback)) { callback.call(t, items); } } }); /** * jQuery plugin initializer */ jQuery.fn.cubeportfolio = function(method, options, callback) { return this.each(function() { if (typeof method === 'object' || !method) { return CubePortfolio.public.init.call(this, method, options); } 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'); }); }; CubePortfolio.plugins = {}; jQuery.fn.cubeportfolio.constructor = CubePortfolio; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; jQuery.extend(CubePortfolio.prototype, { mosaicLayoutReset: function() { var t = this; // flag to be set after the blocks sorting is done t.blocksAreSorted = false; // when I start layout all blocks must not be positionated t.blocksOn.each(function(index, el) { jQuery(el).data('cbp').pack = false; }); }, mosaicLayout: function() { var t = this, blocksLen = t.blocksOn.length, i, spaceIndexAndBlock = {}, leftEnd; // array of objects where I keep the spaces available in the grid t.freeSpaces = [{ leftStart: 0, leftEnd: t.widthAvailable, topStart: 0, topEnd: Math.pow(2, 18) // @todo - optimize }]; //NAAPO [ hack para saltar as contas nos helpers que sao usados para fazer os scrolling folios. ] if (blocksLen > 0 && jQuery(t.obj).closest('.des_cubeportfolio_widget_helper').length > 0){ return; } for (i = 0; i < blocksLen; i++) { spaceIndexAndBlock = t.getSpaceIndexAndBlock(); // if space or block are null then the sorting must be done if (spaceIndexAndBlock === null) { // sort blocks t.sortBlocksToPreventGaps(); // after the sort is done start the layout again t.mosaicLayout(); return; } t.generateF1F2(spaceIndexAndBlock.spaceIndex, spaceIndexAndBlock.dataBlock); t.generateG1G2G3G4(spaceIndexAndBlock.dataBlock); t.cleanFreeSpaces(); t.addHeightToBlocks(); } // sort the blocks from top to bottom to add properly displayAnimation and animationType if (t.blocksAreSorted) { t.sortBlocks(t.blocksOn, 'topNew'); } }, /** * Chose from freeSpaces the best space available * Find block by verifying if it can fit in bestSpace(top-left space available) * If block don't fit in the first space available & t.options.sortToPreventGaps * is set to true then sort the blocks and start the layout once again * Decide the free rectangle Fi from F to pack the rectangle R into. */ getSpaceIndexAndBlock: function() { var t = this, spaceIndexAndBlock = null; jQuery.each(t.freeSpaces, function(index1, space) { var widthSpace = space.leftEnd - space.leftStart, heightSpace = space.topEnd - space.topStart; t.blocksOn.each(function(index2, block) { var data = jQuery(block).data('cbp'); if (data.pack === true) { return; } if (data.widthAndGap <= widthSpace && data.heightAndGap <= heightSpace) { // now the rectagle can be positioned data.pack = true; spaceIndexAndBlock = { spaceIndex: index1, dataBlock: data }; data.leftNew = space.leftStart; data.topNew = space.topStart; // if the block is founded => return from this loop return false; } }); // if first space don't have a block and sortToPreventGaps is true => return from loop if (!t.blocksAreSorted && t.options.sortToPreventGaps && index1 > 0) { spaceIndexAndBlock = null; return false; } // if space & block is founded => return from loop if (spaceIndexAndBlock !== null) { return false; } }); return spaceIndexAndBlock; }, /** * Use the MAXRECTS split scheme to subdivide Fi(space) into F1 and F2 and * then remove that space from spaces * Insert F1 & F2 in F in place of Fi */ generateF1F2: function(spaceIndex, block) { var t = this, space = t.freeSpaces[spaceIndex]; var F1 = { leftStart: space.leftStart + block.widthAndGap, leftEnd: space.leftEnd, topStart: space.topStart, topEnd: space.topEnd }; var F2 = { leftStart: space.leftStart, leftEnd: space.leftEnd, topStart: space.topStart + block.heightAndGap, topEnd: space.topEnd }; // remove Fi from F t.freeSpaces.splice(spaceIndex, 1); if (F1.leftEnd > F1.leftStart && F1.topEnd > F1.topStart) { t.freeSpaces.splice(spaceIndex, 0, F1); spaceIndex++; } if (F2.leftEnd > F2.leftStart && F2.topEnd > F2.topStart) { t.freeSpaces.splice(spaceIndex, 0, F2); } }, /** * Generate G1, G2, G3, G4 from intersaction of t.freeSpaces with block */ generateG1G2G3G4: function(block) { var t = this; var spaces = []; jQuery.each(t.freeSpaces, function(index, space) { var intersectSpace = t.intersectSpaces(space, block); // if block & space are the same push space in spaces and return if (intersectSpace === null) { spaces.push(space); return; } t.generateG1(space, intersectSpace, spaces); t.generateG2(space, intersectSpace, spaces); t.generateG3(space, intersectSpace, spaces); t.generateG4(space, intersectSpace, spaces); }); t.freeSpaces = spaces; }, /** * Return the intersected rectagle of Fi and block * If the two spaces don't intersect or are the same return null */ intersectSpaces: function(space1, block) { var t = this, space2 = { leftStart: block.leftNew, leftEnd: block.leftNew + block.widthAndGap, topStart: block.topNew, topEnd: block.topNew + block.heightAndGap, }; if (space1.leftStart === space2.leftStart && space1.leftEnd === space2.leftEnd && space1.topStart === space2.topStart && space1.topEnd === space2.topEnd) { return null; } var leftStart = Math.max(space1.leftStart, space2.leftStart), leftEnd = Math.min(space1.leftEnd, space2.leftEnd), topStart = Math.max(space1.topStart, space2.topStart), topEnd = Math.min(space1.topEnd, space2.topEnd); if (leftEnd <= leftStart || topEnd <= topStart) { return null; } return { leftStart: leftStart, leftEnd: leftEnd, topStart: topStart, topEnd: topEnd }; }, /** * The top subdivide space */ generateG1: function(space, intersectSpace, spaces) { if (space.topStart === intersectSpace.topStart) { return; } spaces.push({ leftStart: space.leftStart, leftEnd: space.leftEnd, topStart: space.topStart, topEnd: intersectSpace.topStart }); }, /** * The right subdivide space */ generateG2: function(space, intersectSpace, spaces) { if (space.leftEnd === intersectSpace.leftEnd) { return; } spaces.push({ leftStart: intersectSpace.leftEnd, leftEnd: space.leftEnd, topStart: space.topStart, topEnd: space.topEnd }); }, /** * The bottom subdivide space */ generateG3: function(space, intersectSpace, spaces) { if (space.topEnd === intersectSpace.topEnd) { return; } spaces.push({ leftStart: space.leftStart, leftEnd: space.leftEnd, topStart: intersectSpace.topEnd, topEnd: space.topEnd }); }, /** * The left subdivide space */ generateG4: function(space, intersectSpace, spaces) { if (space.leftStart === intersectSpace.leftStart) { return; } spaces.push({ leftStart: space.leftStart, leftEnd: intersectSpace.leftStart, topStart: space.topStart, topEnd: space.topEnd }); }, /** * For every Fi check if is another Fj so Fj contains Fi * @todo - refactor */ cleanFreeSpaces: function() { var t = this; // sort space from top to bottom and left to right t.freeSpaces.sort(function(space1, space2) { if (space1.topStart > space2.topStart) { return 1; } else if (space1.topStart < space2.topStart) { return -1; } else { if (space1.leftStart > space2.leftStart) { return 1; } else if (space1.leftStart < space2.leftStart) { return -1; } else { return 0; } } }); t.correctSubPixelValues(); t.removeNonMaximalFreeSpaces(); }, /** * If topStart values for spaces are <= 1px then align those spaces */ correctSubPixelValues: function() { var t = this, i, len, diff, space1, space2; for (i = 0, len = t.freeSpaces.length - 1; i < len; i++) { space1 = t.freeSpaces[i]; space2 = t.freeSpaces[i + 1]; if ((space2.topStart - space1.topStart) <= 1) { space2.topStart = space1.topStart; } } }, /** * Remove spaces that are not maximal * If Fi contains Fj then remove Fj from F */ removeNonMaximalFreeSpaces: function() { var t = this; t.uniqueFreeSpaces(); t.freeSpaces = jQuery.map(t.freeSpaces, function(space1, index1) { jQuery.each(t.freeSpaces, function(index2, space2) { // don't compare the same free spaces if (index1 === index2) { return; } if (space2.leftStart <= space1.leftStart && space2.leftEnd >= space1.leftEnd && space2.topStart <= space1.topStart && space2.topEnd >= space1.topEnd) { space1 = null; return false; } }); return space1; }); }, /** * Remove duplicates spaces from freeSpaces */ uniqueFreeSpaces: function() { var t = this, result = []; jQuery.each(t.freeSpaces, function(index1, space1) { jQuery.each(result, function(index2, space2) { if (space2.leftStart === space1.leftStart && space2.leftEnd === space1.leftEnd && space2.topStart === space1.topStart && space2.topEnd === space1.topEnd) { space1 = null; return false; } }); if (space1 !== null) { result.push(space1); } }); t.freeSpaces = result; }, /** * If freeSpaces have only one space and that space overlap the * height of the bottom blocks with 1px cut those blocks */ addHeightToBlocks: function() { var t = this; if (t.freeSpaces.length > 1) { return; } var topStart = typeof t.freeSpaces[0] != "undefined" ? t.freeSpaces[0].topStart : 0; t.blocksOn.each(function(index, block) { var data = jQuery(block).data('cbp'); if (data.pack !== true) { return; } var diff = topStart - data.topNew - data.heightAndGap; if (diff < 0) { block.style.height = (data.height + diff) + 'px'; } }); }, /** * Sort by the longer width first, followed by a comparison of the shorter height */ sortBlocksToPreventGaps: function() { var t = this; t.blocksAreSorted = true; // sort based on timestamp attribute t.blocksOn.sort(function(block1, block2) { var data1 = jQuery(block1).data('cbp'), data2 = jQuery(block2).data('cbp'); // order desc by width if (data1.widthAndGap < data2.widthAndGap) { return 1; } else if (data1.widthAndGap > data2.widthAndGap) { return -1; } else { // order desc by height if (data1.heightAndGap < data2.heightAndGap) { return 1; } else if (data1.heightAndGap > data2.heightAndGap) { return -1; } else { // order asc by index if (data1.index > data2.index) { return 1; } else if (data1.index < data2.index) { return -1; } } } }); // when I start the layout again all blocks must not be positionated // reset height if it was set for addHeightToBlocks t.blocksOn.each(function(index, el) { jQuery(el).data('cbp').pack = false; el.style.height = ''; }); }, /** * Generic sort block function from lower to highest values */ sortBlocks: function(blocks, compare) { var t = this; blocks.sort(function(block1, block2) { var data1 = jQuery(block1).data('cbp'), data2 = jQuery(block2).data('cbp'); // if the items are equally order them from left to right if (data1[compare] > data2[compare]) { return 1; } else if (data1[compare] < data2[compare]) { return -1; } else { if (data1.leftNew > data2.leftNew) { return 1; } else if (data1.leftNew < data2.leftNew) { return -1; } else { return 0; } } }); } }); })(jQuery, window, document); // Plugin default options jQuery.fn.cubeportfolio.options = { /** * Define the wrapper for filters * Values: strings that represent the elements in the document (DOM selector). */ filters: '', /** * 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', /** * Define the search input element * Values: strings that represent the element in the document (DOM selector). */ search: '', /** * Layout Mode for this instance * Values: 'grid', 'mosaic' or 'slider' */ layoutMode: 'grid', /** * Sort the items (bigger to smallest) if there are gaps in grid * Option available only for `layoutMode: 'mosaic'` * Values: true or false */ sortToPreventGaps: false, /** * 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 algorithm 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 * - revealLeft * - moveRight * - overlayBottom * - overlayBottomPush * - 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 without any animation) * - fadeIn (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: 'fadeIn', /** * 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: '
{{current}} of {{total}}
', /** * 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: '
{{current}} of {{total}}
', /** * Defines which animation to use when singlePage appear * Values: - left * - fade * - right */ singlePageAnimation: 'middle', /** * 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', /** * Enable / disable the deeplinking feature for singlePageInline * Values: true or false */ singlePageInlineDeeplinking: false, /** * 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) }, /** * Used by the plugins registered to set local options for the current instance * Values: object */ plugins: {}, /* NAAPO added */ cols : 3 }; (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; CubePortfolio.private = { // array or objects: {instance: instance, fn: fn} resizeEventArray: [], initResizeEvent: function(obj) { var t = CubePortfolio.private; if (t.resizeEventArray.length === 0) { t.resizeEvent(); } t.resizeEventArray.push(obj); }, destroyResizeEvent: function(instance) { var t = CubePortfolio.private; var newResizeEvent = jQuery.map(t.resizeEventArray, function(val, index) { if (val.instance !== instance) { return val; } }); t.resizeEventArray = newResizeEvent; if (t.resizeEventArray.length === 0) { // remove off resize event jQuery(window).off('resize.cbp'); } }, resizeEvent: function() { var t = CubePortfolio.private, timeout; // resize jQuery(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; } jQuery.each(t.resizeEventArray, function(index, val) { val.fn.call(val.instance); }); }, 50); }); }, /** * Check if cubeportfolio instance exists on current element */ checkInstance: function(method) { var t = jQuery.data(this, 'cubeportfolio'); if (!t) { throw new Error('cubeportfolio is not initialized. Initialize it before calling ' + method + ' method!'); } t.triggerEvent('publicMethod'); 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 = jQuery.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 jQuery.removeData(this, 'cubeportfolio'); // remove data from blocks t.blocks.removeData('cbp'); // remove loading class and .cbp on container t.$obj.removeClass('cbp-ready').removeAttr('style'); // remove class from ul t.$ul.removeClass('cbp-wrapper'); // remove resize event CubePortfolio.private.destroyResizeEvent(t); t.$obj.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.$obj.removeClass('cbp-caption-active cbp-caption-' + t.options.caption); } t.destroySlider(); // remove .cbp-wrapper-outer t.$ul.unwrap(); // remove .cbp-wrapper if (t.addedWrapp) { t.blocks.unwrap(); } jQuery.each(t.plugins, function(i, item) { if (typeof item.destroy === 'function') { item.destroy(); } }); if (jQuery.isFunction(callback)) { callback.call(t); } t.triggerEvent('afterDestroy'); }, /* * Filter the plugin by filterName */ filter: function(param, callback) { var t = CubePortfolio.private.checkInstance.call(this, 'filter'), expression; if (t.isAnimating) { return; } t.isAnimating = true; // register callback function if (jQuery.isFunction(callback)) { t.registerEvent('filterFinish', callback, true); } if (jQuery.isFunction(param)) { expression = param.call(t, t.blocks); if(expression === undefined) { throw new Error('When you call cubeportfolio API `filter` method with a param of type function you must return the blocks that will be visible.'); } } else { if (t.options.filterDeeplinking) { var url = location.href.replace(/#cbpf=(.*?)([#\?&]|$)/gi, ''); location.href = url + '#cbpf=' + encodeURIComponent(param); if (t.singlePage && t.singlePage.url) { t.singlePage.url = location.href; } } t.defaultFilter = param; expression = t.filterConcat(t.defaultFilter); } if (t.singlePageInline && t.singlePageInline.isOpen) { t.singlePageInline.close('promise', { callback: function() { t.computeFilter(expression); } }); } else { t.computeFilter(expression); } }, /* * Show counter for filters */ showCounter: function(elems, callback) { var t = CubePortfolio.private.checkInstance.call(this, 'showCounter'); t.elems = elems; jQuery.each(elems, function() { var el = jQuery(this), filterName = el.data('filter'), count; count = t.blocks.filter(filterName).length; el.find('.cbp-filter-counter').text(count); }); if (jQuery.isFunction(callback)) { callback.call(t); } }, /* * ApendItems elements */ appendItems: function(els, callback) { var t = CubePortfolio.private.checkInstance.call(this, 'appendItems'), items = jQuery(els).filter('.cbp-item'); if (t.isAnimating || items.length < 1) { if (jQuery.isFunction(callback)) { callback.call(t, items); } 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); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; // @todo - gandit cum ar trebui sa fac aici ca nu prea ar merge un plugin // pt slider ca as extinde pe CubePortfolio.prototype la fiecare initializare jQuery.extend(CubePortfolio.prototype, { 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--) { jQuery('
', { '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('.cbp'); t.$obj.removeClass('cbp-mode-slider'); if (t.options.showNavigation) { t.nav.off('.cbp'); t.nav.remove(); } if (t.navPagination) { t.navPagination.remove(); } t.$ul.removeAttr('style'); t.$ul.off('.cbp'); jQuery(document).off('.cbp'); // @todo - don't interfer with the lightbox if (t.options.auto) { t.stopSliderAuto(); } }, 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.columnWidth; offset = t.cols; } else { jumpWidth = t.columnWidth; 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 (t.customPagination) { if (t.options.scrollByPage) { page = Math.ceil(t.sliderActive / t.cols); } else { if (t.isEndSlider()) { page = t.customPaginationItems.length - 1; } else { page = Math.floor(t.sliderActive / t.cols); } } // add class active on pagination's items t.customPaginationItems.removeClass(t.customPaginationClass) .eq(page) .addClass(t.customPaginationClass); } }, /** * 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 = jQuery(el).data('cbp'); // update the values with the new ones data.leftNew = t.columnWidth * index; data.topNew = 0; t.sliderFreeSpaces.push({ topStart: data.heightAndGap }); }); t.getFreeSpacesForSlider(); t.$ul.width(t.columnWidth * t.blocksOn.length - t.options.gapVertical); }, getFreeSpacesForSlider: function() { var t = this; t.freeSpaces = t.sliderFreeSpaces.slice(t.sliderActive, t.sliderActive + t.cols); t.freeSpaces.sort(function(space1, space2) { if (space1.topStart > space2.topStart) { return 1; } else if (space1.topStart < space2.topStart) { return -1; } }); }, updateSliderPosition: function() { var t = this, value = -t.sliderActive * t.columnWidth; 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.getFreeSpacesForSlider(); t.resizeMainContainer(); }, dragSlider: function() { var t = this, $document = jQuery(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) { jQuery(target).one('click.cbp', function() { return false; }); return; } target = jQuery(e.target); posInitial = pointerEventToXY(e).x; pos = 0; ulPosition = -t.sliderActive * t.columnWidth; ulMaxWidth = t.columnWidth * (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'); // wait a frame to be sure the .cbp-mode-slider-dragStart is removed from the dom requestAnimationFrame(function () { // 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.freeSpaces = []; t.sliderFreeSpaces = []; }, }); })(jQuery, window, document); if (typeof Object.create !== 'function') { Object.create = function(obj) { function F() {} F.prototype = obj; return new F(); }; } // 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 = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; parent.filterLayout = t.filterLayout; parent.registerEvent('computeBlocksFinish', function(expression) { parent.blocksOn2On = parent.blocksOnInitial.filter(expression); parent.blocksOn2Off = parent.blocksOnInitial.not(expression); }); } // here this value point to parent grid Plugin.prototype.filterLayout = function() { var t = this; t.$obj.addClass('cbp-animation-' + t.options.animationType); // [1] - blocks that are only moving with translate t.blocksOn2On.addClass('cbp-item-on2on') .each(function(index, el) { var data = jQuery(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.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 = jQuery(el).data('cbp'); el.style.left = data.leftNew + 'px'; el.style.top = data.topNew + '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 = jQuery(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(); } }; Plugin.prototype.destroy = function() { var parent = this.parent; parent.$obj.removeClass('cbp-animation-' + parent.options.animationType); }; CubePortfolio.plugins.animationClassic = function(parent) { if (!CubePortfolio.private.modernBrowser || jQuery.inArray(parent.options.animationType, ['boxShadow', 'fadeOut', 'flipBottom', 'flipOut', 'quicksand', 'scaleSides', 'skew']) < 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; parent.filterLayout = t.filterLayout; } // here this value point to parent grid Plugin.prototype.filterLayout = function() { 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 = jQuery(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) { jQuery(el).data('cbp').wrapper[0].style[CubePortfolio.private.animationDelay] = ''; }); } t.$obj.removeClass('cbp-animation-' + t.options.animationType); t.filterFinish(); } }; Plugin.prototype.destroy = function() { var parent = this.parent; parent.$obj.removeClass('cbp-animation-' + parent.options.animationType); }; CubePortfolio.plugins.animationClone = function(parent) { if (!CubePortfolio.private.modernBrowser || jQuery.inArray(parent.options.animationType, ['fadeOutTop', 'slideLeft', 'sequentially']) < 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; parent.filterLayout = t.filterLayout; } // here this value point to parent grid Plugin.prototype.filterLayout = function() { var t = this, ulClone = t.$ul.clone(true, true); ulClone[0].setAttribute('class', 'cbp-wrapper-helper'); t.wrapper[0].insertBefore(ulClone[0], 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 var items = ulClone.find('.cbp-item').not('.cbp-item-off'); t.sortBlocks(items, 'top'); items.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 = jQuery(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'; }); var onLength = t.blocksOn.length, offLength = items.length; if (onLength === 0 && offLength === 0) { animationend(); } else if (onLength < offLength) { items.last().children('.cbp-item-wrapper').one(CubePortfolio.private.animationend, animationend); } else { t.blocksOn.last().data('cbp').wrapper.one(CubePortfolio.private.animationend, animationend); } // resize main container height t.resizeMainContainer(); }); function animationend() { t.wrapper[0].removeChild(ulClone[0]); t.$obj.removeClass('cbp-animation-' + t.options.animationType); t.blocks.each(function(index, el) { jQuery(el).data('cbp').wrapper[0].style[CubePortfolio.private.animationDelay] = ''; }); t.filterFinish(); } }; Plugin.prototype.destroy = function() { var parent = this.parent; parent.$obj.removeClass('cbp-animation-' + parent.options.animationType); }; CubePortfolio.plugins.animationCloneDelay = function(parent) { if (!CubePortfolio.private.modernBrowser || jQuery.inArray(parent.options.animationType, ['3dflip', 'flipOutDelay', 'foldLeft', 'frontRow', 'rotateRoom', 'rotateSides', 'scaleDown', 'slideDelay', 'unfold']) < 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; parent.filterLayout = t.filterLayout; } // here this value point to parent grid Plugin.prototype.filterLayout = function() { 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 = jQuery(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) { jQuery(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(); } }; Plugin.prototype.destroy = function() { var parent = this.parent; parent.$obj.removeClass('cbp-animation-' + parent.options.animationType); }; CubePortfolio.plugins.animationWrapper = function(parent) { if (!CubePortfolio.private.modernBrowser || jQuery.inArray(parent.options.animationType, ['bounceBottom', 'bounceLeft', 'bounceTop', 'moveLeft']) < 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(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 = jQuery(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.$obj.one('pluginResize.cbp', function() { parent.isAnimating = false; parent.$obj.removeClass('cbp-caption-expand-active'); if (endStyle.height === 0) { caption.removeClass('cbp-caption-expand-open'); activeWrap.attr('style', ''); } }); // reposition the blocks parent.layoutAndAdjustment(); // 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.css(endStyle); // used by slider layoutMode parent.triggerEvent('gridAdjust'); parent.triggerEvent('resizeGrid'); }); }); }, true); } Plugin.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 Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var deferred = jQuery.Deferred(); parent.pushQueue('delayFrame', deferred); parent.registerEvent('initEndWrite', function() { parent.blocksOn.each(function(index, el) { el.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, el) { el.style[CubePortfolio.private.animationDelay] = ''; }); // resolve event after the animation is finished deferred.resolve(); }); }, true); } CubePortfolio.plugins.displayBottomToTop = function(parent) { if (!CubePortfolio.private.modernBrowser || parent.options.displayType !== 'bottomToTop' || parent.blocksOn.length === 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var deferred = jQuery.Deferred(); parent.pushQueue('delayFrame', deferred); parent.registerEvent('initEndWrite', function() { parent.obj.style[CubePortfolio.private.animationDuration] = parent.options.displayTypeSpeed + 'ms'; parent.$obj.addClass('cbp-displayType-fadeIn'); parent.$obj.one(CubePortfolio.private.animationend, function() { parent.$obj.removeClass('cbp-displayType-fadeIn'); parent.obj.style[CubePortfolio.private.animationDuration] = ''; // resolve event after the animation is finished deferred.resolve(); }); }, true); } CubePortfolio.plugins.displayFadeIn = function(parent) { if (!CubePortfolio.private.modernBrowser || (parent.options.displayType !== 'lazyLoading' && parent.options.displayType !== 'fadeIn') || parent.blocksOn.length === 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var deferred = jQuery.Deferred(); parent.pushQueue('delayFrame', deferred); 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] = ''; // resolve event after the animation is finished deferred.resolve(); }); }, true); } CubePortfolio.plugins.displayFadeInToTop = function(parent) { if (!CubePortfolio.private.modernBrowser || parent.options.displayType !== 'fadeInToTop' || parent.blocksOn.length === 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var deferred = jQuery.Deferred(); parent.pushQueue('delayFrame', deferred); parent.registerEvent('initEndWrite', function() { parent.blocksOn.each(function(index, el) { el.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, el) { el.style[CubePortfolio.private.animationDelay] = ''; }); // resolve event after the animation is finished deferred.resolve(); }); }, true); } CubePortfolio.plugins.displaySequentially = function(parent) { if (!CubePortfolio.private.modernBrowser || parent.options.displayType !== 'sequentially' || parent.blocksOn.length === 0) { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.filters = jQuery(parent.options.filters); t.filterData = []; // set default filter if it's present in url t.filterFromUrl(); t.registerFilter(); } Plugin.prototype.registerFilter = function() { var t = this, parent = t.parent, filtersCallback, arr = parent.defaultFilter.split('|'); t.wrap = t.filters.find('.cbp-l-filters-dropdownWrap') .on({ 'mouseover.cbp': function() { jQuery(this).addClass('cbp-l-filters-dropdownWrap-open'); }, 'mouseleave.cbp': function() { jQuery(this).removeClass('cbp-l-filters-dropdownWrap-open'); } }); t.filters.each(function(index, el) { var filter = jQuery(el), filterName = '*', items = filter.find('.cbp-filter-item'), dropdown = {}; //NAAPO filter.addClass('container'); if (filter.hasClass('cbp-l-filters-dropdown')) { dropdown.wrap = filter.find('.cbp-l-filters-dropdownWrap'); dropdown.header = filter.find('.cbp-l-filters-dropdownHeader'); dropdown.headerText = dropdown.header.text(); } // activate counter for filters parent.$obj.cubeportfolio('showCounter', items); jQuery.each(arr, function(index, val) { if (items.filter('[data-filter="' + val + '"]').length) { filterName = val; arr.splice(index, 1); return false; } }); jQuery.data(el, 'filterName', filterName); t.filterData.push(el); t.filtersCallback(dropdown, items.filter('[data-filter="' + filterName + '"]')); items.on('click.cbp', function() { var item = jQuery(this); if (item.hasClass('cbp-filter-item-active') || parent.isAnimating) { return; } t.filtersCallback(dropdown, item); jQuery.data(el, 'filterName', item.data('filter')); var name = jQuery.map(t.filterData, function(el, index) { var f = jQuery.data(el, 'filterName'); return (f !== "" && f !== '*') ? f : null; }); if (name.length < 1) { name = ['*']; } var filterJoin = name.join('|'); if (parent.defaultFilter !== filterJoin) { // filter the items parent.$obj.cubeportfolio('filter', filterJoin); } }); }); }; Plugin.prototype.filtersCallback = function(dropdown, item) { if (!jQuery.isEmptyObject(dropdown)) { dropdown.wrap.trigger('mouseleave.cbp'); if (dropdown.headerText) { dropdown.headerText = ''; } else { dropdown.header.html(item.html()); } } item.addClass('cbp-filter-item-active').siblings().removeClass('cbp-filter-item-active'); }; /** * Check if filters are present in url */ Plugin.prototype.filterFromUrl = function() { var match = /#cbpf=(.*?)([#\?&]|$)/gi.exec(location.href); if (match !== null) { this.parent.defaultFilter = decodeURIComponent(match[1]); } }; Plugin.prototype.destroy = function() { var t = this; t.filters.find('.cbp-filter-item').off('.cbp'); t.wrap.off('.cbp'); }; CubePortfolio.plugins.filters = function(parent) { if (parent.options.filters === '') { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var options = {}; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.options = jQuery.extend({}, options, t.parent.options.plugins.inlineSlider); t.runInit(); parent.registerEvent('addItemsToDOM', function() { t.runInit(); }); } function InitSlider(slider) { var t = this; if (slider.hasClass('cbp-slider-inline-ready')) { return; } slider.addClass('cbp-slider-inline-ready'); t.items = slider.find('.cbp-slider-wrapper').children('.cbp-slider-item'); t.active = t.items.filter('.cbp-slider-item--active').index(); t.total = t.items.length - 1; t.updateLeft(); slider.find('.cbp-slider-next').on('click.cbp', function(e) { e.preventDefault(); if (t.active < t.total) { t.active++; t.updateLeft(); } else if (t.active === t.total) { t.active = 0; t.updateLeft(); } }); slider.find('.cbp-slider-prev').on('click.cbp', function(e) { e.preventDefault(); if (t.active > 0) { t.active--; t.updateLeft(); } else if (t.active === 0) { t.active = t.total; t.updateLeft(); } }); }; InitSlider.prototype.updateLeft = function() { var t = this; t.items.removeClass('cbp-slider-item--active'); t.items.eq(t.active).addClass('cbp-slider-item--active'); t.items.each(function(index, el) { el.style.left = (index - t.active) + '00%'; }); }; Plugin.prototype.runInit = function() { var t = this; t.parent.$obj.find('.cbp-slider-inline').not('.cbp-slider-inline-ready').each(function(index, el) { var slider = jQuery(el); var activeImage = slider.find('.cbp-slider-item--active').find('img')[0]; if (activeImage.hasAttribute('data-cbp-src')) { t.parent.$obj.on('lazyLoad.cbp', function(e, image) { if (image.src === activeImage.src) { new InitSlider(slider); } }); } else { new InitSlider(slider); } }); }; Plugin.prototype.destroy = function() { var t = this; t.parent.$obj.find('.cbp-slider-next').off('click.cbp'); t.parent.$obj.find('.cbp-slider-prev').off('click.cbp'); t.parent.$obj.off('lazyLoad.cbp'); t.parent.$obj.find('.cbp-slider-inline').each(function(index, el) { var slider = jQuery(el); slider.removeClass('cbp-slider-inline-ready'); var items = slider.find('.cbp-slider-item'); items.removeClass('cbp-slider-item--active'); items.removeAttr('style'); items.eq(0).addClass('cbp-slider-item--active'); }); }; CubePortfolio.plugins.inlineSlider = function(parent) { return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var options = { loadingClass: 'cbp-lazyload', threshold: 0, // loads images 150px before they're visible }; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.window = jQuery(window); t.parent = parent; t.options = jQuery.extend({}, options, t.parent.options.plugins.lazyLoad); parent.registerEvent('initEndWrite', function() { var timeout; t.triggerImg(); parent.registerEvent('resizeMainContainer', function() { t.triggerImg(); }); // scroll event. @todo - this must be done like the global resize event t.window.on('scroll.cbp', function() { clearTimeout(timeout); timeout = setTimeout(function() { t.triggerImg(); }, 300); }); }, true); } Plugin.prototype.triggerImg = function() { var t = this; var imgs = t.parent.$obj.find('img').filter('[data-cbp-src]'); if (imgs.length === 0) { return; } t.screenHeight = t.window.height(); imgs.each(function(index, el) { var parentNode = jQuery(el.parentNode); if (!t.isElementInScreen(el)) { parentNode.addClass(t.options.loadingClass); return; } var dataSrc = el.getAttribute('data-cbp-src'); if (t.parent.checkSrc(dataSrc) === null) { t.removeLazy(el, dataSrc); parentNode.removeClass(t.options.loadingClass); } else { parentNode.addClass(t.options.loadingClass); jQuery('').on('load.cbp error.cbp', function() { t.removeLazy(el, dataSrc, parentNode); }).attr('src', dataSrc); // for ie8 } }); }; Plugin.prototype.removeLazy = function(el, dataSrc, parentNode) { var t = this; el.src = dataSrc; el.removeAttribute('data-cbp-src'); t.parent.removeAttrImage(el); // trigger public event t.parent.$obj.trigger('lazyLoad.cbp', el); if (parentNode) { if (CubePortfolio.private.modernBrowser) { jQuery(el).one(CubePortfolio.private.transitionend, function() { parentNode.removeClass(t.options.loadingClass); }); } else { parentNode.removeClass(t.options.loadingClass); } } }; Plugin.prototype.isElementInScreen = function(el) { var t = this; var bound = el.getBoundingClientRect(); var bottom = bound.bottom + t.options.threshold; var screenHeight = t.screenHeight + bottom - (bound.top - t.options.threshold); return bottom >= 0 && bottom <= screenHeight; }; Plugin.prototype.destroy = function() { var t = this; t.window.off('scroll.cbp'); }; CubePortfolio.plugins.lazyLoad = function(parent) { return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.loadMore = jQuery(parent.options.loadMore).find('.cbp-l-loadMore-link'); // load click or auto action if (t.loadMore.length) { t[parent.options.loadMoreAction](); } } Plugin.prototype.click = function() { var t = this, numberOfClicks = 0; t.loadMore.on('click.cbp', function(e) { var button = jQuery(this); e.preventDefault(); if (t.parent.isAnimating || button.hasClass('cbp-l-loadMore-stop')) { return; } // set loading status button.addClass('cbp-l-loadMore-loading'); numberOfClicks++; // perform ajax request jQuery.ajax({ url: t.loadMore.attr('href') + '?block=' + numberOfClicks, type: 'GET', dataType: 'HTML' }).done(function(result) { var items = result.replace(/(\r\n|\n|\r)/gm,""); var startBlock = items.indexOf('cbp-loadMore-block' + numberOfClicks); // stop the loadMore because the block doesn't exist if (startBlock === -1) { button.addClass('cbp-l-loadMore-stop'); return; } // set start from where I will substring var start = items.indexOf('>', startBlock) + 1; var endBlock = items.indexOf('cbp-loadMore-block' + (numberOfClicks + 1)); var end; // if endBlock doesn't exist if (endBlock === -1) { end = items.lastIndexOf(' topWindow) { return; } // this job is now busy self.isActive = true; // increment number of clicks self.numberOfClicks++; // perform ajax request jQuery.ajax({ url: t.loadMore.attr('href') + '?block=' + self.numberOfClicks, type: 'GET', dataType: 'HTML', cache: true }) .done(function(result) { var items = result.replace(/(\r\n|\n|\r)/gm,""); var startBlock = items.indexOf('cbp-loadMore-block' + self.numberOfClicks); // stop the loadMore because the block doesn't exist if (startBlock === -1) { t.loadMore.addClass('cbp-l-loadMore-stop'); return; } // set start from where I will substring var start = items.indexOf('>', startBlock) + 1; var endBlock = items.indexOf('cbp-loadMore-block' + (self.numberOfClicks + 1)); var end; // if endBlock doesn't exist if (endBlock === -1) { end = items.lastIndexOf(' 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 jQuery.each(links, function(index, link) { t.cubeportfolio.blocksOn.each(function(index1, el) { var singlePage = jQuery(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(jQuery('.cbp-item')).find('[data-cbp-singlePage="' + gallery + '"]'); } else { t.cubeportfolio.blocksOn.each(function(index, el) { var item = jQuery(el); if (item.not('.cbp-item-off')) { item.find(t.options.singlePageDelegate).each(function(index2, el2) { if (!jQuery(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 = jQuery('
', { '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 = jQuery(e.target).attr('data-action'); if (t[action]) { t[action](); e.preventDefault(); } }); // content element t.content = jQuery('
', { 'class': 'cbp-popup-content' }).appendTo(t.wrap); // append loading div jQuery('
', { 'class': 'cbp-popup-loadingBox' }).appendTo(t.wrap); // add background only for ie8 if (CubePortfolio.private.browser === 'ie8') { t.bg = jQuery('
', { 'class': 'cbp-popup-ie8bg', 'data-action': (t.type === 'lightbox') ? 'close' : '' }).appendTo(t.wrap); } // create navigation wrap t.navigationWrap = jQuery('
', { 'class': 'cbp-popup-navigation-wrap' }).appendTo(t.wrap); // create navigation block t.navigation = jQuery('
', { 'class': 'cbp-popup-navigation' }).appendTo(t.navigationWrap); // close t.closeButton = jQuery('
', { 'class': 'cbp-popup-close', 'title': 'Close (Esc arrow key)', 'data-action': 'close' }).appendTo(t.navigation); // next t.nextButton = jQuery('
', { 'class': 'cbp-popup-next', 'data-action': 'next' }).appendTo(t.navigation); // prev t.prevButton = jQuery('
', { 'class': 'cbp-popup-prev', 'data-action': 'prev' }).appendTo(t.navigation); if (t.type === 'singlePage') { if (t.options.singlePageCounter) { // counter for singlePage t.counter = jQuery(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(); }); } jQuery(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 = jQuery('
', { 'class': 'cbp-popup-singlePageInline' }).on('click.cbp', function(e) { if (t.stopEvents) { return; } var action = jQuery(e.target).attr('data-action'); if (action && t[action]) { t[action](); e.preventDefault(); } }); // content element t.content = jQuery('
', { 'class': 'cbp-popup-content' }).appendTo(t.wrap); // append loading div // jQuery('
', { // 'class': 'cbp-popup-loadingBox' // }).appendTo(t.wrap); // create navigation block t.navigation = jQuery('
', { 'class': 'cbp-popup-navigation' }).appendTo(t.wrap); // close t.closeButton = jQuery('
', { 'class': 'cbp-popup-close', 'title': 'Close (Esc arrow key)', 'data-action': 'close' }).appendTo(t.navigation); }, destroy: function() { var t = this, body = jQuery('body'); // remove off key down jQuery(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.'); } jQuery.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 (jQuery.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\.com/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 (/www\.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 = jQuery(window).scrollTop(); t.originalStyle = jQuery('html').attr('style'); jQuery('html').css({ overflow: 'hidden', paddingRight: window.innerWidth - jQuery(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.'); } jQuery.each(blocks, function(index, item) { var href = item.getAttribute('href'); if (jQuery.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 = jQuery(window).scrollTop(); jQuery('html').css({ overflow: 'hidden', paddingRight: window.innerWidth - jQuery(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 = jQuery(); 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 = jQuery('
', { 'class': 'cbp-popup-singlePage cbp-popup-singlePage-sticky', 'id': t.wrap.attr('id') }).on('click.cbp', function(e) { if (t.stopEvents) { return; } var action = jQuery(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 (jQuery.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; //NAAPO window.lastcube = t; fromOpen = fromOpen || false; t.fromOpen = fromOpen; t.storeBlocks = blocks; t.storeCurrentBlock = currentBlock; jQuery('body').addClass('cbp-animating'); // check singlePageInline and close it if (t.isOpen) { tempCurrent = jQuery(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 = jQuery(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 = jQuery(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.blocksToMove = blocks; t.top = 0; } else if (t.options.singlePageInlinePosition === 'bottom') { t.blocksToMove = jQuery(); t.top = t.cubeportfolio.height; } else if (t.options.singlePageInlinePosition === 'above') { t.top = jQuery(blocks[t.current]).data('cbp').top; t.blocksToMove = jQuery(); blocks.each(function(index, el) { var data = jQuery(el).data('cbp'); if ((data.top + data.height) >= t.top) { t.blocksToMove = t.blocksToMove.add(el); } }); t.top = Math.max(t.top - t.options.gapHorizontal, 0); } else { // below var dataBlock = jQuery(blocks[t.current]).data('cbp'); t.top = dataBlock.top + dataBlock.height; t.blocksToMove = jQuery(); blocks.each(function(index, el) { var data = jQuery(el).data('cbp'); if ((data.top + data.height) > t.top) { t.blocksToMove = t.blocksToMove.add(el); } }); } t.wrap[0].style.height = t.wrap.outerHeight(true) + 'px'; // debouncer for inline content t.deferredInline = jQuery.Deferred(); if (t.options.singlePageInlineInFocus) { t.scrollTop = jQuery(window).scrollTop(); var goToScroll = t.cubeportfolio.$obj.offset().top + t.top - 100; if (t.scrollTop !== goToScroll) { jQuery('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 }); // change link if (t.options.singlePageInlineDeeplinking) { // ignore old #cbpi from href t.url = t.url.split('#cbpi=')[0]; location.href = t.url + '#cbpi=' + t.dataArray[t.current].url; } // register callback function if (jQuery.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.top === 0) || (t.top === t.cubeportfolio.height)) ? t.wrap.outerHeight(true) : t.wrap.outerHeight(true) - t.options.gapHorizontal; t.storeBlocks.each(function(index, el) { if (CubePortfolio.private.modernBrowser) { el.style[CubePortfolio.private.transform] = ''; } else { el.style.marginTop = ''; } }); t.blocksToMove.each(function(index, el) { 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 = jQuery.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) { //(scripts); var t = this, index = 0, loadScripts = function(item) { try{ 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); } catch(err){ console.log(index); console.log(script); console.log(err); } }; 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 = jQuery(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') { jQuery('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.loadImages(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); t.cubeportfolio.loadImages(jQuery('
'), function() { 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 = '
' + '' + '
' + ((title) ? '
' + title + '
' : '') + counter + '
' + '
'; 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 = '
' + '
' + '
' + ((title) ? '
' + title + '
' : '') + counter + '
' + '
'; 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 = '
' + '' + '
' + ((title) ? '
' + title + '
' : '') + counter + '
' + '
'; 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 = '
' + '' + '
' + ((title) ? '
' + title + '
' : '') + counter + '
' + '
'; 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 (jQuery.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 + '#'; } if (t.type === 'singlePageInline' && t.options.singlePageInlineDeeplinking) { location.href = t.url + '#'; } jQuery('body').removeClass('cbp-animating'); }, 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; jQuery('body').addClass('cbp-animating'); 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 (jQuery.isFunction(data.callback)) { data.callback.call(t.cubeportfolio); } } t.resetWrap(); } function checkFocusInline() { if (t.options.singlePageInlineInFocus && method !== 'promise') { jQuery('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'); jQuery(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.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') { jQuery('html').css({ position: '' }); t.navigationWrap.appendTo(t.wrap); t.navigationMobile.remove(); } jQuery(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(); jQuery('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(); jQuery('html').css({ overflow: '', paddingRight: '', position: '' }); t.navigationWrap.removeAttr('style'); }); } else { if (t.originalStyle) { jQuery('html').attr('style', t.originalStyle); } else { jQuery('html').css({ overflow: '', paddingRight: '' }); } jQuery(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 = jQuery(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') { t.cubeportfolio.checkSrc(t.dataArray[arr[i]].src); } } } }; function Plugin(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 parent.registerEvent('initStartRead', function() { t.run(); }, true); } var lightboxInit = false, singlePageInit = false; Plugin.prototype.run = function() { var t = this, p = t.parent, body = jQuery(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 = jQuery(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 = jQuery(el); if (item.not('.cbp-item-off')) { item.find(p.options.lightboxDelegate).each(function(index2, el2) { if (gallery) { if (jQuery(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 = jQuery(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 = jQuery(el); if (item.not('.cbp-item-off')) { item.find(p.options.singlePageDelegate).each(function(index2, el2) { if (gallery) { if (jQuery(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); }); } }; Plugin.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 : jQuery(document.body); }; Plugin.prototype.destroy = function() { var p = this.parent; jQuery(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 Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.searchInput = jQuery(parent.options.search); t.searchInput.each(function(index, el) { var selector = el.getAttribute('data-search'); if (!selector) { selector = '*'; } jQuery.data(el, 'searchData', { value: el.value, el: selector }); }); var timeout = null; t.searchInput.on('keyup.cbp paste.cbp', function(e) { e.preventDefault(); var el = jQuery(this); clearTimeout(timeout); timeout = setTimeout(function() { t.runEvent.call(t, el); }, 300); }); t.searchNothing = t.searchInput.siblings('.cbp-search-nothing').detach(); t.searchNothingHeight = null; t.searchNothingHTML = t.searchNothing.html(); t.searchInput.siblings('.cbp-search-icon').on('click.cbp', function(e) { e.preventDefault(); t.runEvent.call(t, jQuery(this).prev().val('')); }); } Plugin.prototype.runEvent = function(el) { var t = this, value = el.val(), searchData = el.data('searchData'), reg = new RegExp(value, 'i'); if (searchData.value === value || t.parent.isAnimating) { return; } searchData.value = value; if (value.length > 0) { el.attr('value', value); } else { el.removeAttr('value'); } t.parent.$obj.cubeportfolio('filter', function(blocks) { var blocksNew = blocks.filter(function(index, block) { var text = jQuery(block).find(searchData.el).text(); if (text.search(reg) > -1) { return true; } }); if (blocksNew.length === 0 && t.searchNothing.length) { var innerText = t.searchNothingHTML.replace('{{query}}', value); t.searchNothing.html(innerText); t.searchNothing.appendTo(t.parent.$obj); if (t.searchNothingHeight === null) { t.searchNothingHeight = t.searchNothing.outerHeight(true); } t.parent.registerEvent('resizeMainContainer', function() { t.parent.height = t.parent.height + t.searchNothingHeight; t.parent.obj.style.height = t.parent.height + 'px'; }, true); } else { t.searchNothing.detach(); } return blocksNew; }, function() { el.trigger('keyup.cbp'); }); }; Plugin.prototype.destroy = function() { var t = this; t.searchInput.off('.cbp'); t.searchInput.next('.cbp-search-icon').off('.cbp'); t.searchInput.each(function(index, el) { jQuery.removeData(el); }); }; CubePortfolio.plugins.search = function(parent) { if (parent.options.search === '') { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; var options = { /** * Pagination custom selector * Values: strings that represent the elements in the document (DOM selector). */ pagination: '', paginationClass: 'cbp-pagination-active', }; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.options = jQuery.extend({}, options, t.parent.options.plugins.slider); var customPagination = jQuery(t.options.pagination); if (customPagination.length > 0) { t.parent.customPagination = customPagination; t.parent.customPaginationItems = customPagination.children(); t.parent.customPaginationClass = t.options.paginationClass; t.parent.customPaginationItems.on('click.cbp', function(e) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); if (t.parent.sliderStopEvents) { return; } t.parent.jumpToSlider(jQuery(this)); }); } t.parent.registerEvent('gridAdjust', function() { t.sliderMarkup.call(t.parent); t.parent.registerEvent('gridAdjust', function() { t.updateSlider.call(t.parent); }); }, true); } /** * Create mark-up for slider layout */ Plugin.prototype.sliderMarkup = function() { var t = this; t.sliderStopEvents = false; t.sliderActive = 0; t.$obj.one('initComplete.cbp', function() { t.$obj.addClass('cbp-mode-slider'); }); t.nav = jQuery('
', { '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 = jQuery(this), action = el.attr('data-slider-action'); if (t[action + 'Slider']) { t[action + 'Slider'](el); } }); if (t.options.showNavigation) { t.controls = jQuery('
', { 'class': 'cbp-nav-controls' }); t.navPrev = jQuery('
', { 'class': 'cbp-nav-prev', 'data-slider-action': 'prev' }).appendTo(t.controls); t.navNext = jQuery('
', { 'class': 'cbp-nav-next', 'data-slider-action': 'next' }).appendTo(t.controls); t.controls.appendTo(t.nav); } if (t.options.showPagination) { t.navPagination = jQuery('
', { '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(); } }; Plugin.prototype.updateSlider = function() { var t = this; t.updateSliderPosition(); t.updateSliderPagination(); }; Plugin.prototype.destroy = function() { var t = this; if (t.parent.customPaginationItems) { t.parent.customPaginationItems.off('.cbp'); } }; CubePortfolio.plugins.slider = function(parent) { if (parent.options.layoutMode !== 'slider') { return null; } return new Plugin(parent); }; })(jQuery, window, document); (function($, window, document, undefined) { 'use strict'; jQuery.fn.cubeportfolio.constructor.prototype.responsiveLayout = function() { var t = this; // calculate numbers of cols t.cols = t[(jQuery.isArray(t.options.mediaQueries) ? 'getColumnsBreakpoints' : 'getColumnsAuto')](); t.columnWidth = t.columnWidthTruncate((t.width + t.options.gapVertical) / t.cols); t.widthAvailable = t.columnWidth * t.cols; if (t.options.layoutMode === 'mosaic') { t.getMosaicWidthReference(); } if (t.options.coverRatio !== undefined) { t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), cols = 1, // layoutMode === grid || slider width; if (t.options.layoutMode === 'mosaic') { cols = t.getColsMosaic(data.widthInitial); } width = t.columnWidth * cols - t.options.gapVertical; el.style.width = width + 'px'; data.width = width; data.widthAndGap = width + t.options.gapVertical; // reset height if it was set for addHeightToBlocks el.style.height = ''; }); var imgs = []; t.blocks.each(function(index, el) { var block = jQuery(el), width = block.data('cbp').width; jQuery.each(block.find('img').filter('[width][height]'), function(index, el) { var procent = width / parseInt(el.getAttribute('width'), 10); imgs.push({ el: el, width: width, height: Math.floor(parseInt(el.getAttribute('height'), 10) * procent), }); }); }); jQuery.each(imgs, function(index, item) { item.el.width = item.width; item.el.height = item.height; item.el.style.width = item.width + 'px'; item.el.style.height = item.height + 'px'; }); t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), bound = el.getBoundingClientRect(), height = Math.round(bound.bottom - bound.top); data.height = height; data.heightAndGap = height + t.options.gapHorizontal; }); } else { var itemWidth = t.columnWidth - t.options.gapVertical; t.blocks.each(function(index, el) { var data = jQuery(el).data('cbp'), itemHeight = parseInt(data.heightInitial * (itemWidth / data.widthInitial), 10); // set new css for current element el.style.width = itemWidth + 'px'; el.style.height = itemHeight + 'px'; data.width = itemWidth; data.widthAndGap = itemWidth + t.options.gapVertical; data.height = itemHeight; data.heightAndGap = itemHeight + t.options.gapHorizontal; }); } }; })(jQuery, window, document); // ResetCaption (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; jQuery.fn.cubeportfolio.options.coverRatio = undefined; function Plugin(parent) { var t = this; t.parent = parent; parent.registerEvent('initStartWrite', function() { if (parent.options.coverRatio !== undefined) { parent.$obj.addClass('cbp-reset-caption'); var ratioString = parent.options.coverRatio.split(':'), ratioX, ratioY, ratio; if (ratioString.length === 2) { parent.$obj.addClass('cbp-ratio-even'); ratioX = parseInt(ratioString[0], 10); ratioY = parseInt(ratioString[1], 10); ratio = (ratioY / ratioX) * 100 + '%'; } parent.blocks.each(function(index, el) { var item = jQuery(el), localRatio = ratio, attr = item.attr('data-cbp-coverRatio'), caption = item.find('.cbp-caption'); if (attr) { if (attr !== '0:0') { ratioString = attr.split(':'); ratioX = parseInt(ratioString[0], 10); ratioY = parseInt(ratioString[1], 10); localRatio = (ratioY / ratioX) * 100 + '%'; } else { localRatio = ''; } } if (caption.length) { caption[0].style.paddingTop = localRatio; } }); } }); parent.registerEvent('addItemsToDOM', function(items) { if (parent.options.coverRatio !== undefined) { var ratioString = parent.options.coverRatio.split(':'), ratioX, ratioY, ratio; if (ratioString.length === 2) { ratioX = parseInt(ratioString[0], 10); ratioY = parseInt(ratioString[1], 10); ratio = (ratioY / ratioX) * 100 + '%'; } jQuery.each(items, function(index, el) { var localRatio = ratio, item = jQuery(el), attr = item.attr('data-cbp-coverRatio'), caption = item.find('.cbp-caption'); if (attr) { if (attr !== '0:0') { ratioString = attr.split(':'); ratioX = parseInt(ratioString[0], 10); ratioY = parseInt(ratioString[1], 10); localRatio = (ratioY / ratioX) * 100 + '%'; } else { localRatio = ''; } } if (caption.length) { caption[0].style.paddingTop = localRatio; } }); } }); } Plugin.prototype.destroy = function() { this.parent.$obj.removeClass('cbp-reset-caption cbp-ratio-even'); this.parent.$obj.find('.cbp-caption').css('paddingTop', ''); }; CubePortfolio.plugins.resetCaption = function(parent) { return new Plugin(parent); }; })(jQuery, window, document); // CorrectIdFrontend (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.attrId = parent.$obj.attr('id'); if (!t.attrId) { return; } t.id = parseInt(t.attrId.replace('cbpw-grid', ''), 10); parent.$obj.attr('id', ''); parent.wrapper.attr('id', t.attrId); parent.registerEvent('initStartWrite', function(expression) { // add id attr to singlePage block if (parent.singlePage) { parent.singlePage.wrap.attr('id', 'cbpw-singlePage' + t.id); } }); } Plugin.prototype.destroy = function() { var t = this; t.parent.$obj.attr('id', t.attrId); }; CubePortfolio.plugins.correctIdFrontend = function(parent) { // if is frontend run this plugin if (typeof cbpwOptions === 'undefined') { return new Plugin(parent); } }; })(jQuery, window, document); // refresh drag layout (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; /* * refreshGragLayout */ CubePortfolio.public.refreshDragLayout = function(index, newIndex) { var t = CubePortfolio.private.checkInstance.call(this, 'refreshGragLayout'), item = t.blocks.eq(index), newItem = t.blocks.eq(newIndex); if (index > newIndex) { newItem.before(item); } else if (index < newIndex) { newItem.after(item); } else { return; } // update blocks & index t.blocks = t.$ul.children('.cbp-item'); t.blocks.each(function(index, el) { jQuery(el).data('cbp').index = index; }); // make layout t.layout(); }; })(jQuery, window, document); // RemoveActionContainer before destroy (function($, window, document, undefined) { 'use strict'; var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; parent.registerEvent('publicMethod', function() { jQuery.actionCBP.remove(); }); } Plugin.prototype.destroy = function() { var t = this; }; CubePortfolio.plugins.removeActionContainer = function(parent) { // if is frontend run this plugin if (typeof cbpwOptions !== 'undefined') { return new Plugin(parent); } }; })(jQuery, window, document); // LoadMore public (function($, window, document, undefined) { var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent) { var t = this; t.parent = parent; t.loadMore = jQuery(parent.options.loadMore).find('.cbp-l-loadMore-link'); // load click or auto action if (parent.options.loadMoreAction.length) { t[parent.options.loadMoreAction](); } } Plugin.prototype.click = function() { var t = this, numberOfClicks = 0, displayItemsLoadMore = parseInt(t.parent.options.displayItemsLoadMore, 10); t.loadMore.on('click.cbp', function(e) { var item = jQuery(this); e.preventDefault(); if (t.parent.isAnimating || item.hasClass('cbp-l-loadMore-stop')) { return; } item.addClass('cbp-l-loadMore-loading'); var id = t.parent.wrapper.attr('id'); if (!id) { id = t.parent.$obj.attr('id'); } id = id.replace('cbpw-grid', ''); jQuery.ajax({ type: 'post', dataType: 'json', url: ajaxurl, data: { action: 'getLoadMoreItems', offset: displayItemsLoadMore * numberOfClicks, limit: displayItemsLoadMore, id: id } }).done(function(data) { numberOfClicks++; var items = data.items.map(function(item) { return item.items; }).join(''); t.parent.$obj.cubeportfolio('appendItems', items, function() { item.removeClass('cbp-l-loadMore-loading'); if (data.itemsRemain <= 0) { item.addClass('cbp-l-loadMore-stop'); } }); }); }); }; Plugin.prototype.auto = function() { var t = this; t.parent.$obj.on('initComplete.cbp', function() { t.loadMoreObj = 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 = jQuery(window); // add events for scroll self.addEvents(); // trigger method on init self.getNewItems(); return this; }, 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 (t.parent.isAnimating || self.isActive || t.loadMore.hasClass('cbp-l-loadMore-stop')) { return; } topLoadMore = (t.loadMore.length) ? t.loadMore.offset().top : 0; /* NAAPOadicionou se verificacao da existencia do loadmore pq estava a spamar erros no single proj */ topWindow = self.window.scrollTop() + self.window.height(); if (topLoadMore > topWindow) { return; } // this job is now busy self.isActive = true; var displayItemsLoadMore = parseInt(t.parent.options.displayItemsLoadMore, 10); var id = t.parent.wrapper.attr('id'); if (!id) { id = t.parent.$obj.attr('id'); } id = id.replace('cbpw-grid', ''); jQuery.ajax({ type: 'post', dataType: 'json', url: ajaxurl, data: { action: 'getLoadMoreItems', offset: displayItemsLoadMore * self.numberOfClicks, limit: displayItemsLoadMore, id: id } }) .done(function(data) { var items = data.items.map(function(item) { return item.items; }).join(''); t.parent.$obj.cubeportfolio('appendItems', items, function() { // increment number of clicks self.numberOfClicks++; if (data.itemsRemain <= 0) { t.loadMore.addClass('cbp-l-loadMore-stop').removeClass('cbp-l-loadMore-loading'); // 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(); }); }; Plugin.prototype.destroy = function() { var t = this; t.loadMore.off('.cbp'); if (t.loadMoreObj) { t.loadMoreObj.window.off('scroll.loadMoreObject'); } }; CubePortfolio.plugins.loadMore = function(parent) { if (parent.options.loadMore === '') { return null; } return new Plugin(parent); }; })(jQuery, window, document); // FullWidthForce force (function($, window, document, undefined) { var CubePortfolio = jQuery.fn.cubeportfolio.constructor; function Plugin(parent, forceWidthBlock) { var t = this; t.parent = parent; var wrap = parent.$obj.parent(); var forceWidthBlock = wrap.parent(); if (!forceWidthBlock.hasClass('cbpw-fullWidth-force')) { return; } parent.registerEvent('beforeResizeGrid', function() { forceWidthBlock.removeAttr('style'); forceWidthBlock.css({ width: jQuery(document).width(), left: -(wrap[0].getBoundingClientRect().left) }); }); } Plugin.prototype.destroy = function() { var t = this; }; CubePortfolio.plugins.fullWidthForce = function(parent) { return new Plugin(parent); }; })(jQuery, window, document); // init cubeportfolio (function($, window, document, undefined) { 'use strict'; var processResult = function(result, element) { var selector, doc = jQuery(document), html = '', scripts, domStyles, styles = '', i, inlineJS = '', newScripts, script, src, href, selectorsArray, isWrap = true; element = jQuery(element); // if content is wrap if (element.data('cbp-iswrap') === false) { isWrap = false; } // get the selector if (element.data('cbp-selector')) { selector = element.data('cbp-selector'); // remove scripts & css already in the popup var popupWrap = jQuery('.cbp-popup-wrap'); popupWrap.find('script[type="text/javascript"]').remove(); popupWrap.find('link[type="text/css"], style').not('#vc_typicons-css').remove(); result = result.replace('', '
'); result = jQuery('
', { html: result }); // put the scrips in the newScripts array newScripts = []; scripts = result.find('script[type="text/javascript"]').remove(); var textScripts = []; doc.find('script[type="text/javascript"]').each(function(index, el) { el = jQuery(el); if (el.html()) { textScripts.push(el.html()); } }); var skipScriptWithText_one = /window\.devicePixelRatio/gim; var skipScriptWithText_two = /email-protection/; for (i = 0; i < scripts.length; i++) { src = scripts[i].src; if (!src) { if (!skipScriptWithText_one.test(scripts[i].text) && !skipScriptWithText_two.test(scripts[i].text)) { if (jQuery.inArray(scripts[i].text, textScripts) === -1) { scripts[i].text = scripts[i].text.replace('jQuery(window).load(','jQuery(document).ready('); inlineJS = inlineJS + ';\n' + scripts[i].text; } } } else if (doc.find('script[src="' + src + '"]').length === 0 || src.indexOf('ultimate') > -1 || src.indexOf('ult') > -1 || src.indexOf('utl') > -1 || src.indexOf('timecircle') > -1 || src.indexOf('countdown') > -1 || src.indexOf('masonry') > -1 || /* src.indexOf('google') > -1 || */ src.indexOf('modernizr') > -1 || src.indexOf('swatchbook') > -1 || src.indexOf('_box_') > -1 || src.indexOf('dualbtn') > -1 || src.indexOf('_ui') > -1 || src.indexOf('flex') > -1 || src.indexOf('team_front') > -1) { if (src.indexOf('media-') < 0) newScripts.push(scripts[i]); } } inlineJS += ';\n jQuery(document).ready(function(){ naapo_special_tabs(true); });'; var naapo_other_cube_instances = result.find('[id^="cbpw-grid"]'); if (naapo_other_cube_instances.length > 0){ jQuery(naapo_other_cube_instances).each(function(){ window.naapo_related_projects_default_opts = '{"filters":"","loadMore":"","loadMoreAction":"auto","search":"","layoutMode":"slider","sortToPreventGaps":false,"drag":true,"auto":false,"autoTimeout":5000,"autoPauseOnHover":true,"showNavigation":false,"showPagination":false,"rewindNav":true,"scrollByPage":false,"defaultFilter":"*","filterDeeplinking":false,"animationType":"flipOut","gridAdjustment":"responsive","mediaQueries":[{"width":1400,"cols":5},{"width":1170,"cols":4},{"width":1024,"cols":3},{"width":960,"cols":3},{"width":778,"cols":3},{"width":640,"cols":2},{"width":480,"cols":1}],"gapHorizontal":20,"gapVertical":20,"caption":"overlayBottomAlong","displayType":"bottomToTop","displayTypeSpeed":100,"lightboxDelegate":".cbp-lightbox","lightboxGallery":true,"lightboxTitleSrc":"data-title","lightboxCounter":"
{{current}} of {{total}}
","singlePageDelegate":".cbp-singlePage","singlePageDeeplinking":true,"singlePageStickyNavigation":true,"singlePageCounter":"
{{current}} of {{total}}
","singlePageAnimation":"middle","singlePageInlineDelegate":".cbp-singlePageInline","singlePageInlineDeeplinking":false,"singlePageInlinePosition":"below","singlePageInlineInFocus":true,"plugins":{},"coverRatio":"300:267","displayItemsLoadMore":3}'; window.naapo_related_projects_default_opts = JSON.parse(naapo_related_projects_default_opts); if (!jQuery(this).closest('#big_footer').length > 0) inlineJS += ';\n jQuery(document).ready(function(){ jQuery.fn.cubeportfolio.call( jQuery("#'+jQuery(this).attr('id')+'"), window.naapo_related_projects_default_opts) });'; }); } // add inline js in one