/** * HSPopup - wrapper of the Fancybox plugin. * * @author Htmlstream * @version 1.0 * @requires fancybox.js (v2.1.5) * */ ;(function($){ 'use strict'; $.HSCore.components.HSPopup = { /** * Base configuration of the wrapper. * * @protected */ _baseConfig: { baseClass: 'u-fancybox-theme', slideClass: 'u-fancybox-slide', speed: 1000, slideSpeedCoefficient: 1, infobar: false, slideShow: false, fullScreen: true, thumbs: false, closeBtn: true, baseTpl : '', onInit: $.noop, beforeMove: $.noop, beforeClose: $.noop }, /** * Initialization of the wrapper. * * @param {String} selector * @param {Object} config (optional) * @public */ init: function(selector, config) { if(!selector) return; var hiddenGallery, $collection = $(selector); if(!$collection.length) return; config = config && $.isPlainObject(config) ? $.extend(true, {}, this._baseConfig, config) : this._baseConfig; config = this._predefineCallbacks( config ); this.$body = $('body'); this.initGallery(selector, config); }, /** * Initialization of a gallery. * * @param {String} selector * @param {Object} config (optional) * @public */ initGallery: function(selector, config) { $('body').on('click.HSPopup', selector, function(e) { var $this = $(this), index = 0, $gallery, predefinedCollection = [], collectionItem; if( $this.data('fancybox-gallery') ) { $gallery = $('[data-fancybox-gallery="' + $this.data('fancybox-gallery') + '"]'); } else if ( $this.data('fancybox-hidden-gallery') ) { $gallery = $('[data-fancybox-hidden-gallery="' + $this.data('fancybox-hidden-gallery') + '"]'); } if( $gallery && $gallery.length ) { index = $gallery.index( $this ); $gallery.each(function(i, el){ var $el = $(el); collectionItem = { src: $el.attr(el.nodeName === "IMG" || el.nodeName === "IFRAME" ? 'src' : 'href'), customOpts: { fancyboxAnimateIn: $el.data('fancybox-animate-in'), fancyboxAnimateOut: $el.data('fancybox-animate-out'), fancyboxSpeed: $el.data('fancybox-speed'), fancyboxSlideSpeed: $el.data('fancybox-slide-speed'), fancyboxBlurBg: $el.data('fancybox-blur-bg'), fancyboxBg: $el.data('fancybox-bg') } }; if( $el.data('fancybox-type') ) { collectionItem.type = $el.data('fancybox-type'); console.log($el); } predefinedCollection.push(collectionItem); }); console.log(predefinedCollection); } else { collectionItem = { src: $this.attr('href'), customOpts: { fancyboxAnimateIn: $this.data('fancybox-animate-in'), fancyboxAnimateOut: $this.data('fancybox-animate-out'), fancyboxSpeed: $this.data('fancybox-speed'), fancyboxSlideSpeed: $this.data('fancybox-slide-speed'), fancyboxBlurBg: $this.data('fancybox-blur-bg'), fancyboxBg: $this.data('fancybox-bg') } }; if( $this.data('fancybox-type') ) { collectionItem.type = $this.data('fancybox-type'); } predefinedCollection = [collectionItem]; } $.fancybox.open( predefinedCollection, predefinedCollection[index].customOpts.fancyboxSpeed ? $.extend(true, {}, config, { speed: predefinedCollection[index].customOpts.fancyboxSpeed }) : config, index ); e.preventDefault(); }); }, /** * Integration of custom options. * * @param {Object} config * @private * @returns {Object} */ _predefineCallbacks: function( config ) { var self = this, onInitCallback = config.onInit, beforeMoveCallback = config.beforeMove, beforeCloseCallback = config.beforeClose; config.onInit = function( instance ) { self._defaultBgColor = instance.$refs.bg.css('background-color'); if(instance.group.length > 1) { instance.$refs.container.find('.fancybox-button--left, .fancybox-button--right').show(); } if( $.isFunction( onInitCallback ) ) onInitCallback.call(this, instance); }; config.beforeMove = function( instance, slide ) { if( self._currentSlide ) { self._closeSlide( self._currentSlide, instance ); } setTimeout( function() { self._openSlide( slide, instance ); }, 0 ); self._currentSlide = slide; beforeMoveCallback.call(this, instance, slide); }; config.beforeClose = function( instance, slide ) { setTimeout( function() { self._closeSlide( slide, instance ); }, 0 ); beforeCloseCallback.call(this, instance, slide); }; return config; }, /** * Closes the specified slide. * * @param {Object} slide * @param {Object} instance * @private */ _closeSlide: function( slide, instance ) { var $image = $(slide.$image), itemData = slide.customOpts ? slide.customOpts : slide.opts.$orig.data(), groupLength = instance.group.length; this._blurBg(false); if( itemData.fancyboxAnimateOut ) { if( $image.hasClass(itemData.fancyboxAnimateIn) ) $image.removeClass( itemData.fancyboxAnimateIn ); $image.addClass(itemData.fancyboxAnimateOut ); } }, /** * Opens the specified slide. * * @param {Object} slide * @param {Object} instance * @private */ _openSlide: function( slide, instance ) { var $image = $(slide.$image), itemData = slide.customOpts ? slide.customOpts : slide.opts.$orig.data(); instance.$refs.bg.css( 'background-color', (itemData.fancyboxBg ? itemData.fancyboxBg : this._defaultBgColor) ); this._blurBg(itemData.fancyboxBlurBg ? true : false); $image.css('animation-duration', (itemData.fancyboxSlideSpeed && itemData.fancyboxSlideSpeed >= slide.opts.speed ? itemData.fancyboxSlideSpeed : slide.opts.speed * Math.abs( slide.opts.slideSpeedCoefficient )) + 'ms'); if( itemData.fancyboxAnimateIn ) { if( $image.hasClass( itemData.fancyboxAnimateOut ) ) $image.removeClass( itemData.fancyboxAnimateOut ); $image.addClass( 'animated ' + itemData.fancyboxAnimateIn ); } }, /** * Makes blur background while slide is opening. * * @param {Boolean} isBlur * @private */ _blurBg: function(isBlur) { var self = this; if( isBlur ) { if( this._blurBgTimeOut ) clearTimeout( this._blurBgTimeOut ); if( !this.blurBgContainer ) { this.blurBgContainer = $('
', { class: 'u-fancybox-blur-bg-container' }); this.$body.append(this.blurBgContainer); } if( this.blurBgContainer.children().length ) return; this.blurBgContainer.append( this.$body.children().not('.fancybox-container') ); } else { if(!this.blurBgContainer || !this.blurBgContainer.children().length) return; this._blurBgTimeOut = setTimeout(function(){ self.$body.append( self.blurBgContainer.children() ); }, 10) } } }; })(jQuery);